diff --git a/404.html b/404.html index 9a6532c..c1da1f6 100644 --- a/404.html +++ b/404.html @@ -25,7 +25,7 @@ - + @@ -644,7 +644,7 @@ - + diff --git a/404/page/2.html b/404/page/2.html index 7c2f0fe..32c1dab 100644 --- a/404/page/2.html +++ b/404/page/2.html @@ -25,7 +25,7 @@ - + @@ -649,7 +649,7 @@ - + diff --git a/404/page/3.html b/404/page/3.html index 7c2f0fe..32c1dab 100644 --- a/404/page/3.html +++ b/404/page/3.html @@ -25,7 +25,7 @@ - + @@ -649,7 +649,7 @@ - + diff --git a/404/page/4.html b/404/page/4.html index bf5680e..2bd7bdc 100644 --- a/404/page/4.html +++ b/404/page/4.html @@ -25,7 +25,7 @@ - + @@ -650,7 +650,7 @@ - + diff --git a/404/page/5.html b/404/page/5.html index bf5680e..2bd7bdc 100644 --- a/404/page/5.html +++ b/404/page/5.html @@ -25,7 +25,7 @@ - + @@ -650,7 +650,7 @@ - + diff --git a/404/page/6.html b/404/page/6.html index bf5680e..2bd7bdc 100644 --- a/404/page/6.html +++ b/404/page/6.html @@ -25,7 +25,7 @@ - + @@ -650,7 +650,7 @@ - + diff --git a/docs/about/credits/index.html b/docs/about/credits/index.html index cc3d93b..25f8e14 100644 --- a/docs/about/credits/index.html +++ b/docs/about/credits/index.html @@ -25,7 +25,7 @@ - + @@ -1244,7 +1244,7 @@
Docs
- + diff --git a/docs/about/license/index.html b/docs/about/license/index.html index 0bff610..7bd5b67 100644 --- a/docs/about/license/index.html +++ b/docs/about/license/index.html @@ -25,7 +25,7 @@ - + @@ -1356,7 +1356,7 @@

Documentation + diff --git a/docs/advanced-settings/icons/index.html b/docs/advanced-settings/icons/index.html index f86212c..2f79b12 100644 --- a/docs/advanced-settings/icons/index.html +++ b/docs/advanced-settings/icons/index.html @@ -25,7 +25,7 @@ - + @@ -1244,7 +1244,7 @@
Docs
- + diff --git a/docs/advanced-settings/module-development/index.html b/docs/advanced-settings/module-development/index.html index d08b83c..cd09f04 100644 --- a/docs/advanced-settings/module-development/index.html +++ b/docs/advanced-settings/module-development/index.html @@ -25,7 +25,7 @@ - + @@ -1244,7 +1244,7 @@
Docs
- + diff --git a/docs/advanced-settings/overview/index.html b/docs/advanced-settings/overview/index.html index 37a0d9d..cde098e 100644 --- a/docs/advanced-settings/overview/index.html +++ b/docs/advanced-settings/overview/index.html @@ -25,7 +25,7 @@ - + @@ -1244,7 +1244,7 @@
Docs
- + diff --git a/docs/advanced-settings/partial-development/index.html b/docs/advanced-settings/partial-development/index.html index 4011c04..74cf18b 100644 --- a/docs/advanced-settings/partial-development/index.html +++ b/docs/advanced-settings/partial-development/index.html @@ -25,7 +25,7 @@ - + @@ -1244,7 +1244,7 @@
Docs
- + diff --git a/docs/advanced-settings/scripts/index.html b/docs/advanced-settings/scripts/index.html index d22d8fa..a4d374f 100644 --- a/docs/advanced-settings/scripts/index.html +++ b/docs/advanced-settings/scripts/index.html @@ -25,7 +25,7 @@ - + @@ -1255,7 +1255,7 @@
Docs
- + diff --git a/docs/advanced-settings/styles/index.html b/docs/advanced-settings/styles/index.html index 05b9192..e0628ab 100644 --- a/docs/advanced-settings/styles/index.html +++ b/docs/advanced-settings/styles/index.html @@ -25,7 +25,7 @@ - + @@ -1244,7 +1244,7 @@
Docs
- + diff --git a/docs/configuration/colors/index.html b/docs/configuration/colors/index.html index 63099aa..e23752a 100644 --- a/docs/configuration/colors/index.html +++ b/docs/configuration/colors/index.html @@ -25,7 +25,7 @@ - + @@ -1244,7 +1244,7 @@
Docs
- + diff --git a/docs/configuration/layout/index.html b/docs/configuration/layout/index.html index 5b1b013..eac666c 100644 --- a/docs/configuration/layout/index.html +++ b/docs/configuration/layout/index.html @@ -25,7 +25,7 @@ - + @@ -1244,7 +1244,7 @@
Docs
- + diff --git a/docs/developing/index.html b/docs/developing/index.html index 6fb72d7..97d8610 100644 --- a/docs/developing/index.html +++ b/docs/developing/index.html @@ -25,7 +25,7 @@ - + @@ -1408,7 +1408,7 @@

Class Interface Specifica - + diff --git a/docs/getting-started/command-line/index.html b/docs/getting-started/command-line/index.html index 0682075..9732078 100644 --- a/docs/getting-started/command-line/index.html +++ b/docs/getting-started/command-line/index.html @@ -25,7 +25,7 @@ - + @@ -1243,7 +1243,7 @@

Docs
- + diff --git a/docs/getting-started/compiling/index.html b/docs/getting-started/compiling/index.html index b336e59..c84df9b 100644 --- a/docs/getting-started/compiling/index.html +++ b/docs/getting-started/compiling/index.html @@ -25,7 +25,7 @@ - + @@ -1125,7 +1125,7 @@

Dependencies The following command should install everything you need:

-
conda install -c conda-forge fortran-compiler cxx-compiler c-compiler openblas
+
conda install -c conda-forge fortran-compiler cxx-compiler c-compiler openblas openmpi
@@ -1851,7 +1851,7 @@

Compiling + diff --git a/docs/getting-started/contribute/index.html b/docs/getting-started/contribute/index.html index 2f26315..2bd89cc 100644 --- a/docs/getting-started/contribute/index.html +++ b/docs/getting-started/contribute/index.html @@ -25,7 +25,7 @@ - + @@ -1906,7 +1906,7 @@

License + diff --git a/docs/getting-started/introduction/index.html b/docs/getting-started/introduction/index.html index b3cb618..5b83a42 100644 --- a/docs/getting-started/introduction/index.html +++ b/docs/getting-started/introduction/index.html @@ -25,7 +25,7 @@ - + @@ -1391,7 +1391,7 @@

Running OpenSees + diff --git a/docs/getting-started/modeling/index.html b/docs/getting-started/modeling/index.html index 6abc9a3..2440d55 100644 --- a/docs/getting-started/modeling/index.html +++ b/docs/getting-started/modeling/index.html @@ -25,7 +25,7 @@ - + @@ -1255,7 +1255,7 @@
Docs
- + diff --git a/docs/getting-started/python/index.html b/docs/getting-started/python/index.html index fb33ee1..05c6e67 100644 --- a/docs/getting-started/python/index.html +++ b/docs/getting-started/python/index.html @@ -25,7 +25,7 @@ - + @@ -1243,7 +1243,7 @@
Docs
- + diff --git a/docs/library/frame/index.html b/docs/library/frame/index.html index 5b6d9ea..6944145 100644 --- a/docs/library/frame/index.html +++ b/docs/library/frame/index.html @@ -25,7 +25,7 @@ - + @@ -1243,7 +1243,7 @@
Docs
- + diff --git a/docs/library/index.html b/docs/library/index.html index 9b7f053..60b96c3 100644 --- a/docs/library/index.html +++ b/docs/library/index.html @@ -25,7 +25,7 @@ - + @@ -749,7 +749,7 @@ - + diff --git a/examples/Parallel/ex6.tcl b/examples/Parallel/ex6.tcl new file mode 100644 index 0000000..cc3369e --- /dev/null +++ b/examples/Parallel/ex6.tcl @@ -0,0 +1,26 @@ +set np [getNP] +set pid [getPID] +set count 0 +source model.tcl +source analysis.tcl +set tStart [clock seconds] +set recordsFile [open motionList r] +set lines [split [read $recordFile] \n] +foreach line $line { + if {[expr $count % $np] == $pid} { + doModel + doGravityAnalysis; + loadConst -time 0.0 + set record [lindex $line 0] + set npts [lindex $line 1] + set dt [lindex $line 2] + set accelSeries "Path -filePath $record -dt $dt -factor 386.4" + pattern UniformExcitation 2 1 -accel $accelSeries + set ok [doDynamicAnalysis $npts $dt] + wipe + } +incr count 1 +} +set tFinish [clock seconds] +barrier +puts "Duration Process $pid [expr $tFinish - $tStart]" diff --git a/examples/Parallel/parallel.tcl b/examples/Parallel/parallel.tcl new file mode 100644 index 0000000..6228cb2 --- /dev/null +++ b/examples/Parallel/parallel.tcl @@ -0,0 +1,39 @@ +set pid [getPID] +set np [getNP] + +if {$np != 2} exit + +model BasicBuilder -ndm 2 -ndf 2 +uniaxialMaterial Elastic 1 3000 + +if {$pid == 0} { + node 1 0.0 0.0 + node 4 72.0 96.0 + fix 1 1 1 + element truss 1 1 4 10.0 1 + pattern Plain 1 "Linear" { + load 4 100 -50 + } +} else { + node 2 144.0 0.0 + node 3 168.0 0.0 + node 4 72.0 96.0 + fix 2 1 1 + fix 3 1 1 + element truss 2 2 4 5.0 1 + element truss 3 3 4 5.0 1 +} + +#create the analysis +constraints Transformation +numberer ParallelPlain +system Mumps +test NormDispIncr 1.0e-6 6 2 +algorithm Newton +integrator LoadControl 0.1 +analysis Static +#perform the analysis +analyze 10 +# print to screen node 4 +print node 4 + diff --git a/examples/archstaticsnap/index.html b/examples/archstaticsnap/index.html index 575a2aa..03a3d68 100644 --- a/examples/archstaticsnap/index.html +++ b/examples/archstaticsnap/index.html @@ -25,7 +25,7 @@ - + @@ -1141,7 +1141,7 @@

The Framework + diff --git a/examples/buildingmodes/index.html b/examples/buildingmodes/index.html index cbddc3b..4fbccd9 100644 --- a/examples/buildingmodes/index.html +++ b/examples/buildingmodes/index.html @@ -25,7 +25,7 @@ - + @@ -1172,7 +1172,7 @@ - + diff --git a/examples/cablestayed/index.html b/examples/cablestayed/index.html index 481966d..37ff397 100644 --- a/examples/cablestayed/index.html +++ b/examples/cablestayed/index.html @@ -25,7 +25,7 @@ - + @@ -51,7 +51,7 @@ - + @@ -109,7 +109,7 @@ "about": { "@id": "https://stairlab.github.io/#/schema/organization/1" }, - "dateModified": "2024-09-19T10:02:47CET","breadcrumb": { + "dateModified": "2024-09-25T12:16:10CET","breadcrumb": { "@id": "https://stairlab.github.io/opensees-gallery/examples/cablestayed/#/schema/breadcrumb/1" }, "primaryImageOfPage": { @@ -845,7 +845,7 @@ - + diff --git a/examples/cantilevertransient/index.html b/examples/cantilevertransient/index.html index 07e2e3c..1cff0da 100644 --- a/examples/cantilevertransient/index.html +++ b/examples/cantilevertransient/index.html @@ -25,7 +25,7 @@ - + @@ -1168,7 +1168,7 @@

Shear force-displaceme - + diff --git a/examples/chopra-10.4/index.html b/examples/chopra-10.4/index.html index ac3f6cc..03f8107 100644 --- a/examples/chopra-10.4/index.html +++ b/examples/chopra-10.4/index.html @@ -25,7 +25,7 @@ - + @@ -634,13 +634,13 @@

Instructions on Python Tcl @@ -656,7 +656,7 @@

Instructions on -
+
python EigenAnal_twoStoryShearFrame8.py
@@ -667,7 +667,7 @@

Instructions on -
+
python -m opensees EigenAnal_twoStoryShearFrame8.tcl
@@ -697,13 +697,13 @@

Create the model Python Tcl @@ -719,7 +719,7 @@

Create the model +
import opensees.openseespy as ops
 
@@ -732,7 +732,7 @@ 

Create the model +
model BasicBuilder -ndm 2 -ndf 3
@@ -759,13 +759,13 @@

Create the model Python Tcl @@ -781,7 +781,7 @@

Create the model +
model.node(1, 0.,   0.)
 model.node(2, L ,   0.)
@@ -797,7 +797,7 @@ 

Create the model +
node 1 0. 0. ;
 node 2 $L 0. ;
@@ -826,13 +826,13 @@ 

Create the model Python Tcl @@ -848,7 +848,7 @@

Create the model +
model.fix(1, 1, 1, 1)
 model.fix(2, 1, 1, 1)
@@ -860,7 +860,7 @@

Create the model +
fix 1 1 1 1; 
 fix 2 1 1 1; 
@@ -887,13 +887,13 @@

Create the model Python Tcl @@ -909,7 +909,7 @@

Create the model +
model.mass(3,  m  , 0., 0. ) 
 model.mass(4,  m  , 0., 0. ) 
@@ -923,7 +923,7 @@ 

Create the model +
mass 3 $m 0. 0. ; 
 mass 4 $m 0. 0. ; 
@@ -954,13 +954,13 @@ 

Create the model Python Tcl @@ -976,7 +976,7 @@

Create the model +
model.element("ElasticBeamColumn", 1, 1, 3, Ac, Ec, 2.*Ic, TransfTag)
 model.element("ElasticBeamColumn", 2, 3, 5, Ac, Ec,    Ic, TransfTag)
@@ -992,7 +992,7 @@ 

Create the model +
element elasticBeamColumn 1 1 3 $Ac $Ec [expr 2.*$Ic] $TransfTag; 
 element elasticBeamColumn 2 3 5 $Ac $Ec $Ic $TransfTag; 
@@ -1031,13 +1031,13 @@ 

Define recorders Python Tcl @@ -1053,7 +1053,7 @@

Define recorders +
for k in range(numModes):
     model.recorder("Node", f"eigen {k}", file=f"modes/mode{k}.out", nodeRange=[1, 6], dof=[1, 2, 3])
@@ -1065,7 +1065,7 @@

Define recorders +
foreach k [range $numModes] {
   recorder Node -file [format "modes/mode%i.out" $k] -nodeRange 1 6 -dof 1 2 3 "eigen $k" 
@@ -1465,7 +1465,7 @@ 

Display mode shapes + diff --git a/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialCompression.gif b/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialCompression.gif new file mode 100644 index 0000000..dce4dfa Binary files /dev/null and b/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialCompression.gif differ diff --git a/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialTension.gif b/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialTension.gif new file mode 100644 index 0000000..d9266c7 Binary files /dev/null and b/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialTension.gif differ diff --git a/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output.gif b/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output.gif new file mode 100644 index 0000000..b6abc53 Binary files /dev/null and b/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output.gif differ diff --git a/examples/concretesurface/index.html b/examples/concretesurface/index.html index 14e3d77..7b500fa 100644 --- a/examples/concretesurface/index.html +++ b/examples/concretesurface/index.html @@ -25,7 +25,7 @@ - + @@ -52,8 +52,8 @@ - - + + @@ -63,7 +63,7 @@ - + @@ -110,7 +110,7 @@ "about": { "@id": "https://stairlab.github.io/#/schema/organization/1" }, - "dateModified": "2024-09-19T09:17:28CET","breadcrumb": { + "dateModified": "2024-09-25T12:16:10CET","breadcrumb": { "@id": "https://stairlab.github.io/opensees-gallery/examples/concretesurface/#/schema/breadcrumb/1" }, "primaryImageOfPage": { @@ -158,8 +158,8 @@ { "@type": "ImageObject", "@id": "https://stairlab.github.io/opensees-gallery/examples/concretesurface/#/schema/image/2", - "url": "https://stairlab.github.io/opensees-gallery/opensees-gallery/img/ASDConcrete3D_Ex_Surface_Output-1280x640.png", - "contentUrl": "https://stairlab.github.io/opensees-gallery/opensees-gallery/img/ASDConcrete3D_Ex_Surface_Output-1280x640.png", + "url": "https://stairlab.github.io/opensees-gallery/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-1280x640.png", + "contentUrl": "https://stairlab.github.io/opensees-gallery/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-1280x640.png", "caption": "Concrete" } ] @@ -503,10 +503,10 @@ @@ -533,10 +533,10 @@ @@ -563,10 +563,10 @@ @@ -911,7 +911,7 @@ - + diff --git a/examples/example1/index.html b/examples/example1/index.html index 380fed2..35af2cf 100644 --- a/examples/example1/index.html +++ b/examples/example1/index.html @@ -25,7 +25,7 @@ - + @@ -1415,13 +1415,13 @@

Model Tcl Python(RT) @@ -1437,7 +1437,7 @@

Model -
+
model -ndm 2 -ndf 2
@@ -1448,7 +1448,7 @@

Model -
+
import opensees.openseespy as ops
 
@@ -1485,13 +1485,13 @@ 

Model Tcl Python(RT) @@ -1507,7 +1507,7 @@

Model -
+
# Create nodes & add to domain
 #   tag  X    Y
@@ -1523,7 +1523,7 @@ 

Model -
+
# Create nodes
 #         tag   X     Y
@@ -1551,13 +1551,13 @@ 

Model Tcl Python(RT) @@ -1573,7 +1573,7 @@

Model -
+
# Set the boundary conditions
 #  tag  X  Y
@@ -1588,7 +1588,7 @@ 

Model -
+
# set the boundary conditions
 #    nodeID xRestrnt? yRestrnt?
@@ -1617,13 +1617,13 @@ 

Model Tcl Python(RT) @@ -1639,7 +1639,7 @@

Model -
+
# Create Elastic material prototype
 uniaxialMaterial Elastic 1 3000;
@@ -1651,7 +1651,7 @@

Model -
+
# Create Elastic material prototype
 model.uniaxialMaterial("Elastic", 1, 3000)
@@ -1682,13 +1682,13 @@

Model Tcl Python(RT) @@ -1704,7 +1704,7 @@

Model -
+
element Truss 1 1 4 10.0 1;
 element Truss 2 2 4  5.0 1;
@@ -1717,7 +1717,7 @@ 

Model -
+
#              Type   tag  nodes  Area  material
 model.element("Truss", 1, (1, 4), 10.0,    1   )
@@ -1772,13 +1772,13 @@ 

Loads Tcl Python(RT) @@ -1794,7 +1794,7 @@

Loads -
+
set loads {4 100 -50}
@@ -1805,7 +1805,7 @@

Loads -
+
loads = {4: [100, -50]}
@@ -1829,13 +1829,13 @@

Loads Tcl Python(RT) @@ -1851,7 +1851,7 @@

Loads -
+
pattern Plain 1 "Linear" "load $loads"
@@ -1862,7 +1862,7 @@

Loads -
+
model.pattern("Plain", 1, "Linear", load=loads)
@@ -1886,13 +1886,13 @@

Loads Tcl Python(RT) @@ -1908,7 +1908,7 @@

Loads -
+
pattern Plain 1 "Linear" {
   load 4 100 -50
@@ -1921,7 +1921,7 @@ 

Loads -
+
model.pattern("Plain", 1, "Linear", load={
   4: [100, -50]
@@ -1951,13 +1951,13 @@ 

Analysis Tcl Python(RT) @@ -1973,7 +1973,7 @@

Analysis +
algorithm Linear;
@@ -1984,7 +1984,7 @@

Analysis +
model.algorithm("Linear")
@@ -2010,13 +2010,13 @@

Analysis Tcl Python(RT) @@ -2032,7 +2032,7 @@

Analysis +
integrator LoadControl 1.0;
@@ -2043,7 +2043,7 @@

Analysis +
model.integrator("LoadControl", 1.0)
@@ -2072,13 +2072,13 @@

Analysis Tcl Python(RT) @@ -2094,7 +2094,7 @@

Analysis +
analysis Static;
@@ -2105,7 +2105,7 @@

Analysis +
model.analysis("Static")
@@ -2127,13 +2127,13 @@

Analysis Tcl Python(RT) @@ -2149,7 +2149,7 @@

Analysis +
analyze 1
@@ -2160,7 +2160,7 @@

Analysis +
model.analyze(1)
@@ -2183,13 +2183,13 @@

Analysis Tcl Python(RT) @@ -2205,7 +2205,7 @@

Analysis +
print node 4
 print ele
@@ -2217,7 +2217,7 @@

Analysis +
model.print(node=4)
 model.print("ele")
@@ -2656,7 +2656,7 @@

Analysis + diff --git a/examples/example2/index.html b/examples/example2/index.html index c73ed0b..6330f48 100644 --- a/examples/example2/index.html +++ b/examples/example2/index.html @@ -25,7 +25,7 @@ - + @@ -634,13 +634,13 @@

Modeling Python Tcl @@ -656,7 +656,7 @@

Modeling +
  1. @@ -672,7 +672,7 @@

    Modeling +
    1. @@ -828,13 +828,13 @@

      Modeling Python Tcl @@ -850,7 +850,7 @@

      Modeling +
      model.section("Fiber", 1)
       # Create the concrete core fibers
      @@ -872,7 +872,7 @@ 

      Modeling +
      section Fiber 1 {
       
      @@ -1427,7 +1427,7 @@ 

      Analysis + diff --git a/examples/example3/index.html b/examples/example3/index.html index b8550c9..155b314 100644 --- a/examples/example3/index.html +++ b/examples/example3/index.html @@ -25,7 +25,7 @@ - + @@ -52,7 +52,7 @@ - + @@ -110,7 +110,7 @@ "about": { "@id": "https://stairlab.github.io/#/schema/organization/1" }, - "dateModified": "2024-09-09T12:37:31CET","breadcrumb": { + "dateModified": "2024-09-25T12:16:10CET","breadcrumb": { "@id": "https://stairlab.github.io/opensees-gallery/examples/example3/#/schema/breadcrumb/1" }, "primaryImageOfPage": { @@ -1750,13 +1750,13 @@ Python Tcl @@ -1772,7 +1772,7 @@ -
      +

              <a href="portal.py"><code>portal.py</code></a></p>
      @@ -1785,7 +1785,7 @@
       
       
       
      -
      +

              <a href="portal.tcl"><code>portal.tcl</code></a></p>
      @@ -1849,13 +1849,13 @@ 

      create_portal Python Tcl @@ -1871,7 +1871,7 @@

      create_portal +
      # create ModelBuilder (with two-dimensions and 3 DOF/node)
       model = ops.Model(ndm=2, ndf=3)
      @@ -1895,7 +1895,7 @@ 

      create_portal +
      set width    360
       set height   144
      @@ -1934,13 +1934,13 @@ 

      create_portal Python Tcl @@ -1956,7 +1956,7 @@

      create_portal +
      # Define materials for nonlinear columns
       # ------------------------------------------
      @@ -1980,7 +1980,7 @@ 

      create_portal +
      
       # Define materials for nonlinear columns
      @@ -2019,13 +2019,13 @@ 

      create_portal +
       # Define cross-section for nonlinear columns
        # ------------------------------------------
      @@ -2075,7 +2075,7 @@ 

      create_portal +
      # Define cross-section for nonlinear columns
       # ------------------------------------------
      @@ -2134,13 +2134,13 @@ 

      gravity_analysis +
      # Create the model
       model = create_portal()
      @@ -2171,7 +2171,7 @@ 

      gravity_analysis +
      create_portal;
       gravity_analysis;
      @@ -2195,13 +2195,13 @@

      gravity_analysis Python Tcl @@ -2217,7 +2217,7 @@

      gravity_analysis +
      model.pattern("Plain", 1, "Linear", loads={
       # nodeID  xForce yForce zMoment
      @@ -2232,7 +2232,7 @@ 

      gravity_analysis +
      @@ -3369,13 +3369,13 @@

      transient_analysis Python Tcl @@ -3391,7 +3391,7 @@

      transient_analysis +
      model.loadConst(time=0.0)
      @@ -3402,7 +3402,7 @@

      transient_analysis +
      loadConst -time 0.0
      @@ -6443,7 +6443,7 @@

      transient_analysis + diff --git a/examples/example4/index.html b/examples/example4/index.html index 0edc7bc..16c11a7 100644 --- a/examples/example4/index.html +++ b/examples/example4/index.html @@ -25,7 +25,7 @@ - + @@ -566,13 +566,13 @@

      Example 4.1 Python Tcl @@ -588,7 +588,7 @@

      Example 4.1 +
      1. @@ -604,7 +604,7 @@

        Example 4.1 +
        1. @@ -3831,7 +3831,7 @@

          Example 4.1 + diff --git a/examples/example5/displaced.glb b/examples/example5/displaced.glb index bd80fcb..46c5a76 100644 Binary files a/examples/example5/displaced.glb and b/examples/example5/displaced.glb differ diff --git a/examples/example5/index.html b/examples/example5/index.html index 92ebac5..4989873 100644 --- a/examples/example5/index.html +++ b/examples/example5/index.html @@ -25,7 +25,7 @@ - + @@ -4132,7 +4132,7 @@

          Post-Processing + diff --git a/examples/example5/model.json b/examples/example5/model.json index 8b6fbe6..2f8b899 100644 --- a/examples/example5/model.json +++ b/examples/example5/model.json @@ -129,7 +129,11 @@ "crdTransformations": [ {"name": "2", "type": "LinearFrameTransf3d", "vecInLocXZPlane": [1, 1, 0]}, {"name": "1", "type": "LinearFrameTransf3d", "vecInLocXZPlane": [1, 0, 0]} + ], + "parameters": [ + ] + }, "geometry": { "nodes": [ @@ -154,18 +158,18 @@ {"name": 19, "ndf": 6, "crd": [0, 0, 432], "mass": [1.3427, 1.3427, 0, 0, 0, 12889.9]} ], "elements": [ - {"name": 1, "type": "ForceFrame3d", "nodes": [1, 5], "mass": 0, "mass_flag": 0, "sections": [1, 1, 1, 1], "crdTransformation": 1, "integration": {"type": "Lobatto"}}, - {"name": 2, "type": "ForceFrame3d", "nodes": [2, 6], "mass": 0, "mass_flag": 0, "sections": [1, 1, 1, 1], "crdTransformation": 1, "integration": {"type": "Lobatto"}}, - {"name": 3, "type": "ForceFrame3d", "nodes": [3, 7], "mass": 0, "mass_flag": 0, "sections": [1, 1, 1, 1], "crdTransformation": 1, "integration": {"type": "Lobatto"}}, - {"name": 4, "type": "ForceFrame3d", "nodes": [4, 8], "mass": 0, "mass_flag": 0, "sections": [1, 1, 1, 1], "crdTransformation": 1, "integration": {"type": "Lobatto"}}, - {"name": 5, "type": "ForceFrame3d", "nodes": [5, 10], "mass": 0, "mass_flag": 0, "sections": [1, 1, 1, 1], "crdTransformation": 1, "integration": {"type": "Lobatto"}}, - {"name": 6, "type": "ForceFrame3d", "nodes": [6, 11], "mass": 0, "mass_flag": 0, "sections": [1, 1, 1, 1], "crdTransformation": 1, "integration": {"type": "Lobatto"}}, - {"name": 7, "type": "ForceFrame3d", "nodes": [7, 12], "mass": 0, "mass_flag": 0, "sections": [1, 1, 1, 1], "crdTransformation": 1, "integration": {"type": "Lobatto"}}, - {"name": 8, "type": "ForceFrame3d", "nodes": [8, 13], "mass": 0, "mass_flag": 0, "sections": [1, 1, 1, 1], "crdTransformation": 1, "integration": {"type": "Lobatto"}}, - {"name": 9, "type": "ForceFrame3d", "nodes": [10, 15], "mass": 0, "mass_flag": 0, "sections": [1, 1, 1, 1], "crdTransformation": 1, "integration": {"type": "Lobatto"}}, - {"name": 10, "type": "ForceFrame3d", "nodes": [11, 16], "mass": 0, "mass_flag": 0, "sections": [1, 1, 1, 1], "crdTransformation": 1, "integration": {"type": "Lobatto"}}, - {"name": 11, "type": "ForceFrame3d", "nodes": [12, 17], "mass": 0, "mass_flag": 0, "sections": [1, 1, 1, 1], "crdTransformation": 1, "integration": {"type": "Lobatto"}}, - {"name": 12, "type": "ForceFrame3d", "nodes": [13, 18], "mass": 0, "mass_flag": 0, "sections": [1, 1, 1, 1], "crdTransformation": 1, "integration": {"type": "Lobatto"}}, + {"name": 1, "type": "ForceBeamColumn3d", "nodes": [1, 5], "sections": ["1", "1", "1", "1"], "integration": {"type": "Lobatto"}, "massperlength": 0, "crdTransformation": "1"}, + {"name": 2, "type": "ForceBeamColumn3d", "nodes": [2, 6], "sections": ["1", "1", "1", "1"], "integration": {"type": "Lobatto"}, "massperlength": 0, "crdTransformation": "1"}, + {"name": 3, "type": "ForceBeamColumn3d", "nodes": [3, 7], "sections": ["1", "1", "1", "1"], "integration": {"type": "Lobatto"}, "massperlength": 0, "crdTransformation": "1"}, + {"name": 4, "type": "ForceBeamColumn3d", "nodes": [4, 8], "sections": ["1", "1", "1", "1"], "integration": {"type": "Lobatto"}, "massperlength": 0, "crdTransformation": "1"}, + {"name": 5, "type": "ForceBeamColumn3d", "nodes": [5, 10], "sections": ["1", "1", "1", "1"], "integration": {"type": "Lobatto"}, "massperlength": 0, "crdTransformation": "1"}, + {"name": 6, "type": "ForceBeamColumn3d", "nodes": [6, 11], "sections": ["1", "1", "1", "1"], "integration": {"type": "Lobatto"}, "massperlength": 0, "crdTransformation": "1"}, + {"name": 7, "type": "ForceBeamColumn3d", "nodes": [7, 12], "sections": ["1", "1", "1", "1"], "integration": {"type": "Lobatto"}, "massperlength": 0, "crdTransformation": "1"}, + {"name": 8, "type": "ForceBeamColumn3d", "nodes": [8, 13], "sections": ["1", "1", "1", "1"], "integration": {"type": "Lobatto"}, "massperlength": 0, "crdTransformation": "1"}, + {"name": 9, "type": "ForceBeamColumn3d", "nodes": [10, 15], "sections": ["1", "1", "1", "1"], "integration": {"type": "Lobatto"}, "massperlength": 0, "crdTransformation": "1"}, + {"name": 10, "type": "ForceBeamColumn3d", "nodes": [11, 16], "sections": ["1", "1", "1", "1"], "integration": {"type": "Lobatto"}, "massperlength": 0, "crdTransformation": "1"}, + {"name": 11, "type": "ForceBeamColumn3d", "nodes": [12, 17], "sections": ["1", "1", "1", "1"], "integration": {"type": "Lobatto"}, "massperlength": 0, "crdTransformation": "1"}, + {"name": 12, "type": "ForceBeamColumn3d", "nodes": [13, 18], "sections": ["1", "1", "1", "1"], "integration": {"type": "Lobatto"}, "massperlength": 0, "crdTransformation": "1"}, {"name": 13, "type": "ForceBeamColumn3d", "nodes": [5, 6], "sections": ["2", "2", "2"], "integration": {"type": "Lobatto"}, "massperlength": 0, "crdTransformation": "2"}, {"name": 14, "type": "ForceBeamColumn3d", "nodes": [6, 7], "sections": ["2", "2", "2"], "integration": {"type": "Lobatto"}, "massperlength": 0, "crdTransformation": "2"}, {"name": 15, "type": "ForceBeamColumn3d", "nodes": [7, 8], "sections": ["2", "2", "2"], "integration": {"type": "Lobatto"}, "massperlength": 0, "crdTransformation": "2"}, @@ -178,6 +182,53 @@ {"name": 22, "type": "ForceBeamColumn3d", "nodes": [16, 17], "sections": ["2", "2", "2"], "integration": {"type": "Lobatto"}, "massperlength": 0, "crdTransformation": "2"}, {"name": 23, "type": "ForceBeamColumn3d", "nodes": [17, 18], "sections": ["2", "2", "2"], "integration": {"type": "Lobatto"}, "massperlength": 0, "crdTransformation": "2"}, {"name": 24, "type": "ForceBeamColumn3d", "nodes": [18, 15], "sections": ["2", "2", "2"], "integration": {"type": "Lobatto"}, "massperlength": 0, "crdTransformation": "2"} + ], + "constraints": [ + { "name": "0", "node": 5, "ref_node": 9, "dof": [1, 2, 6], "ref_dof": [1, 2, 6], "matrix": []}, + { "name": "1", "node": 6, "ref_node": 9, "dof": [1, 2, 6], "ref_dof": [1, 2, 6], "matrix": []}, + { "name": "2", "node": 7, "ref_node": 9, "dof": [1, 2, 6], "ref_dof": [1, 2, 6], "matrix": []}, + { "name": "3", "node": 8, "ref_node": 9, "dof": [1, 2, 6], "ref_dof": [1, 2, 6], "matrix": []}, + { "name": "4", "node": 10, "ref_node": 14, "dof": [1, 2, 6], "ref_dof": [1, 2, 6], "matrix": []}, + { "name": "5", "node": 11, "ref_node": 14, "dof": [1, 2, 6], "ref_dof": [1, 2, 6], "matrix": []}, + { "name": "6", "node": 12, "ref_node": 14, "dof": [1, 2, 6], "ref_dof": [1, 2, 6], "matrix": []}, + { "name": "7", "node": 13, "ref_node": 14, "dof": [1, 2, 6], "ref_dof": [1, 2, 6], "matrix": []}, + { "name": "8", "node": 15, "ref_node": 19, "dof": [1, 2, 6], "ref_dof": [1, 2, 6], "matrix": []}, + { "name": "9", "node": 16, "ref_node": 19, "dof": [1, 2, 6], "ref_dof": [1, 2, 6], "matrix": []}, + { "name": "10", "node": 17, "ref_node": 19, "dof": [1, 2, 6], "ref_dof": [1, 2, 6], "matrix": []}, + { "name": "11", "node": 18, "ref_node": 19, "dof": [1, 2, 6], "ref_dof": [1, 2, 6], "matrix": []}, + {"name": 0, "node": 1, "dof": 1, "ref_value": 0}, + {"name": 1, "node": 1, "dof": 2, "ref_value": 0}, + {"name": 2, "node": 1, "dof": 3, "ref_value": 0}, + {"name": 3, "node": 1, "dof": 4, "ref_value": 0}, + {"name": 4, "node": 1, "dof": 5, "ref_value": 0}, + {"name": 5, "node": 1, "dof": 6, "ref_value": 0}, + {"name": 6, "node": 2, "dof": 1, "ref_value": 0}, + {"name": 7, "node": 2, "dof": 2, "ref_value": 0}, + {"name": 8, "node": 2, "dof": 3, "ref_value": 0}, + {"name": 9, "node": 2, "dof": 4, "ref_value": 0}, + {"name": 10, "node": 2, "dof": 5, "ref_value": 0}, + {"name": 11, "node": 2, "dof": 6, "ref_value": 0}, + {"name": 12, "node": 3, "dof": 1, "ref_value": 0}, + {"name": 13, "node": 3, "dof": 2, "ref_value": 0}, + {"name": 14, "node": 3, "dof": 3, "ref_value": 0}, + {"name": 15, "node": 3, "dof": 4, "ref_value": 0}, + {"name": 16, "node": 3, "dof": 5, "ref_value": 0}, + {"name": 17, "node": 3, "dof": 6, "ref_value": 0}, + {"name": 18, "node": 4, "dof": 1, "ref_value": 0}, + {"name": 19, "node": 4, "dof": 2, "ref_value": 0}, + {"name": 20, "node": 4, "dof": 3, "ref_value": 0}, + {"name": 21, "node": 4, "dof": 4, "ref_value": 0}, + {"name": 22, "node": 4, "dof": 5, "ref_value": 0}, + {"name": 23, "node": 4, "dof": 6, "ref_value": 0}, + {"name": 24, "node": 9, "dof": 3, "ref_value": 0}, + {"name": 25, "node": 9, "dof": 4, "ref_value": 0}, + {"name": 26, "node": 9, "dof": 5, "ref_value": 0}, + {"name": 27, "node": 14, "dof": 3, "ref_value": 0}, + {"name": 28, "node": 14, "dof": 4, "ref_value": 0}, + {"name": 29, "node": 14, "dof": 5, "ref_value": 0}, + {"name": 30, "node": 19, "dof": 3, "ref_value": 0}, + {"name": 31, "node": 19, "dof": 4, "ref_value": 0}, + {"name": 32, "node": 19, "dof": 5, "ref_value": 0} ] } } diff --git a/examples/example6/Example6.py b/examples/example6/Example6.py index b7fa36a..b1c093f 100644 --- a/examples/example6/Example6.py +++ b/examples/example6/Example6.py @@ -65,10 +65,8 @@ def create_model(element: str = "quad"): model.fix(bn, 0, 1) # Define gravity loads - # create a Linear time series - model.timeSeries("Linear", 1) - # create a Plain load pattern - model.pattern("Plain", 1, 1, fact=1.0) + # create a Plain load pattern with a linear time series + model.pattern("Plain", 1, "Linear") model.load(l1, 0.0, -1.0, pattern=1) model.load(l2, 0.0, -1.0, pattern=1) diff --git a/examples/example6/index.html b/examples/example6/index.html index a18286a..9b82384 100644 --- a/examples/example6/index.html +++ b/examples/example6/index.html @@ -25,7 +25,7 @@ - + @@ -1935,7 +1935,7 @@ - + diff --git a/examples/example6/model.json b/examples/example6/model.json index 0b444cf..1985949 100644 --- a/examples/example6/model.json +++ b/examples/example6/model.json @@ -5,114 +5,41 @@ ], "nDMaterials": [ - {"name": "1", "type": "ElasticIsotropicMaterial", "E": 1000, "nu": 0.25, "rho": 0.017483} + {"name": "1", "type": "ElasticIsotropicMaterial", "E": 1000, "nu": 0.25, "rho": 0.017483} ], "uniaxialMaterials": [ ], "crdTransformations": [ + ], + "parameters": [ + ] + }, "geometry": { "nodes": [ - {"name": 1, "ndf": 2, "crd": [0, 0]}, - {"name": 2, "ndf": 2, "crd": [4, 0]}, - {"name": 3, "ndf": 2, "crd": [8, 0]}, - {"name": 4, "ndf": 2, "crd": [12, 0]}, - {"name": 5, "ndf": 2, "crd": [16, 0]}, - {"name": 6, "ndf": 2, "crd": [20, 0]}, - {"name": 7, "ndf": 2, "crd": [24, 0]}, - {"name": 8, "ndf": 2, "crd": [28, 0]}, - {"name": 9, "ndf": 2, "crd": [32, 0]}, - {"name": 10, "ndf": 2, "crd": [36, 0]}, - {"name": 11, "ndf": 2, "crd": [40, 0]}, - {"name": 12, "ndf": 2, "crd": [0, 2.5]}, - {"name": 13, "ndf": 2, "crd": [4, 2.5]}, - {"name": 14, "ndf": 2, "crd": [8, 2.5]}, - {"name": 15, "ndf": 2, "crd": [12, 2.5]}, - {"name": 16, "ndf": 2, "crd": [16, 2.5]}, - {"name": 17, "ndf": 2, "crd": [20, 2.5]}, - {"name": 18, "ndf": 2, "crd": [24, 2.5]}, - {"name": 19, "ndf": 2, "crd": [28, 2.5]}, - {"name": 20, "ndf": 2, "crd": [32, 2.5]}, - {"name": 21, "ndf": 2, "crd": [36, 2.5]}, - {"name": 22, "ndf": 2, "crd": [40, 2.5]}, - {"name": 23, "ndf": 2, "crd": [0, 5]}, - {"name": 24, "ndf": 2, "crd": [4, 5]}, - {"name": 25, "ndf": 2, "crd": [8, 5]}, - {"name": 26, "ndf": 2, "crd": [12, 5]}, - {"name": 27, "ndf": 2, "crd": [16, 5]}, - {"name": 28, "ndf": 2, "crd": [20, 5]}, - {"name": 29, "ndf": 2, "crd": [24, 5]}, - {"name": 30, "ndf": 2, "crd": [28, 5]}, - {"name": 31, "ndf": 2, "crd": [32, 5]}, - {"name": 32, "ndf": 2, "crd": [36, 5]}, - {"name": 33, "ndf": 2, "crd": [40, 5]}, - {"name": 34, "ndf": 2, "crd": [0, 7.5]}, - {"name": 35, "ndf": 2, "crd": [4, 7.5]}, - {"name": 36, "ndf": 2, "crd": [8, 7.5]}, - {"name": 37, "ndf": 2, "crd": [12, 7.5]}, - {"name": 38, "ndf": 2, "crd": [16, 7.5]}, - {"name": 39, "ndf": 2, "crd": [20, 7.5]}, - {"name": 40, "ndf": 2, "crd": [24, 7.5]}, - {"name": 41, "ndf": 2, "crd": [28, 7.5]}, - {"name": 42, "ndf": 2, "crd": [32, 7.5]}, - {"name": 43, "ndf": 2, "crd": [36, 7.5]}, - {"name": 44, "ndf": 2, "crd": [40, 7.5]}, - {"name": 45, "ndf": 2, "crd": [0, 10]}, - {"name": 46, "ndf": 2, "crd": [4, 10]}, - {"name": 47, "ndf": 2, "crd": [8, 10]}, - {"name": 48, "ndf": 2, "crd": [12, 10]}, - {"name": 49, "ndf": 2, "crd": [16, 10]}, - {"name": 50, "ndf": 2, "crd": [20, 10]}, - {"name": 51, "ndf": 2, "crd": [24, 10]}, - {"name": 52, "ndf": 2, "crd": [28, 10]}, - {"name": 53, "ndf": 2, "crd": [32, 10]}, - {"name": 54, "ndf": 2, "crd": [36, 10]}, - {"name": 55, "ndf": 2, "crd": [40, 10]} + {"name": 1, "ndf": 2, "crd": [0, 0]}, + {"name": 2, "ndf": 2, "crd": [20, 0]}, + {"name": 3, "ndf": 2, "crd": [40, 0]}, + {"name": 4, "ndf": 2, "crd": [0, 5]}, + {"name": 5, "ndf": 2, "crd": [20, 5]}, + {"name": 6, "ndf": 2, "crd": [40, 5]}, + {"name": 7, "ndf": 2, "crd": [0, 10]}, + {"name": 8, "ndf": 2, "crd": [20, 10]}, + {"name": 9, "ndf": 2, "crd": [40, 10]} ], "elements": [ - {"name": 1, "type": "FourNodeQuad", "nodes": [1, 2, 13, 12], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 2, "type": "FourNodeQuad", "nodes": [2, 3, 14, 13], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 3, "type": "FourNodeQuad", "nodes": [3, 4, 15, 14], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 4, "type": "FourNodeQuad", "nodes": [4, 5, 16, 15], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 5, "type": "FourNodeQuad", "nodes": [5, 6, 17, 16], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 6, "type": "FourNodeQuad", "nodes": [6, 7, 18, 17], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 7, "type": "FourNodeQuad", "nodes": [7, 8, 19, 18], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 8, "type": "FourNodeQuad", "nodes": [8, 9, 20, 19], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 9, "type": "FourNodeQuad", "nodes": [9, 10, 21, 20], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 10, "type": "FourNodeQuad", "nodes": [10, 11, 22, 21], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 11, "type": "FourNodeQuad", "nodes": [12, 13, 24, 23], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 12, "type": "FourNodeQuad", "nodes": [13, 14, 25, 24], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 13, "type": "FourNodeQuad", "nodes": [14, 15, 26, 25], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 14, "type": "FourNodeQuad", "nodes": [15, 16, 27, 26], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 15, "type": "FourNodeQuad", "nodes": [16, 17, 28, 27], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 16, "type": "FourNodeQuad", "nodes": [17, 18, 29, 28], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 17, "type": "FourNodeQuad", "nodes": [18, 19, 30, 29], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 18, "type": "FourNodeQuad", "nodes": [19, 20, 31, 30], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 19, "type": "FourNodeQuad", "nodes": [20, 21, 32, 31], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 20, "type": "FourNodeQuad", "nodes": [21, 22, 33, 32], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 21, "type": "FourNodeQuad", "nodes": [23, 24, 35, 34], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 22, "type": "FourNodeQuad", "nodes": [24, 25, 36, 35], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 23, "type": "FourNodeQuad", "nodes": [25, 26, 37, 36], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 24, "type": "FourNodeQuad", "nodes": [26, 27, 38, 37], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 25, "type": "FourNodeQuad", "nodes": [27, 28, 39, 38], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 26, "type": "FourNodeQuad", "nodes": [28, 29, 40, 39], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 27, "type": "FourNodeQuad", "nodes": [29, 30, 41, 40], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 28, "type": "FourNodeQuad", "nodes": [30, 31, 42, 41], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 29, "type": "FourNodeQuad", "nodes": [31, 32, 43, 42], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 30, "type": "FourNodeQuad", "nodes": [32, 33, 44, 43], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 31, "type": "FourNodeQuad", "nodes": [34, 35, 46, 45], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 32, "type": "FourNodeQuad", "nodes": [35, 36, 47, 46], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 33, "type": "FourNodeQuad", "nodes": [36, 37, 48, 47], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 34, "type": "FourNodeQuad", "nodes": [37, 38, 49, 48], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 35, "type": "FourNodeQuad", "nodes": [38, 39, 50, 49], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 36, "type": "FourNodeQuad", "nodes": [39, 40, 51, 50], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 37, "type": "FourNodeQuad", "nodes": [40, 41, 52, 51], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 38, "type": "FourNodeQuad", "nodes": [41, 42, 53, 52], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 39, "type": "FourNodeQuad", "nodes": [42, 43, 54, 53], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"}, - {"name": 40, "type": "FourNodeQuad", "nodes": [43, 44, 55, 54], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": "1"} + {"name": 1, "type": "FourNodeQuad", "nodes": [1, 2, 5, 4], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": [1, 1, 1, 1] }, + {"name": 2, "type": "FourNodeQuad", "nodes": [2, 3, 6, 5], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": [1, 1, 1, 1] }, + {"name": 3, "type": "FourNodeQuad", "nodes": [4, 5, 8, 7], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": [1, 1, 1, 1] }, + {"name": 4, "type": "FourNodeQuad", "nodes": [5, 6, 9, 8], "thickness": 2, "surfacePressure": 0, "masspervolume": 0, "bodyForces": [0, 0], "material": [1, 1, 1, 1] } + ], + "constraints": [ + {"name": 0, "node": 1, "dof": 1, "ref_value": 0}, + {"name": 1, "node": 1, "dof": 2, "ref_value": 0}, + {"name": 2, "node": 3, "dof": 2, "ref_value": 0} ] } } diff --git a/examples/example6/render.py b/examples/example6/render.py index b7148cd..c5ceb22 100644 --- a/examples/example6/render.py +++ b/examples/example6/render.py @@ -5,7 +5,7 @@ from Example6 import create_model, static_analysis dir = Path(".") - for element in "quad", "SSPquad", "bbarQuad", "enhancedQuad": + for element in "quad",:# "SSPquad", "bbarQuad", "enhancedQuad": model, (l1, l2) = create_model() static_analysis(model) diff --git a/examples/example7/index.html b/examples/example7/index.html index bbb71df..825ea88 100644 --- a/examples/example7/index.html +++ b/examples/example7/index.html @@ -25,7 +25,7 @@ - + @@ -52,7 +52,7 @@ - + @@ -110,7 +110,7 @@ "about": { "@id": "https://stairlab.github.io/#/schema/organization/1" }, - "dateModified": "2024-09-09T12:37:31CET","breadcrumb": { + "dateModified": "2024-09-25T12:16:10CET","breadcrumb": { "@id": "https://stairlab.github.io/opensees-gallery/examples/example7/#/schema/breadcrumb/1" }, "primaryImageOfPage": { @@ -693,13 +693,13 @@

          Modeling Tcl Python(RT) @@ -715,7 +715,7 @@

          Modeling +
          # generate the nodes and elements
           block2D $nx $ny 1 1 $element $eleArgs {
          @@ -735,7 +735,7 @@ 

          Modeling +
          # generate the surface nodes and elements
           surface = model.surface((nx, ny),
          @@ -2182,7 +2182,7 @@ 

          Dynamic Analysis + diff --git a/examples/example8/Example8.py b/examples/example8/Example8.py index 21190c9..209ac08 100644 --- a/examples/example8/Example8.py +++ b/examples/example8/Example8.py @@ -120,9 +120,16 @@ # Start of recorder generation # ---------------------------- -model.recorder("Node", "-file", "Node.out", "-time", "-node", nn, "-dof", 1, "disp") -model.recorder("Element", "-file", "Elem.out", "-time", "-eleRange", 1, 10, "material", "1", "strains") -#recorder("plot", "Node.out", "CenterNodeDisp", 625, 10, 625, 450, "-columns", 1, 2) +model.recorder("Node", "-file", "out/Node.out", "-time", "-node", nn, "-dof", 1, "disp") +model.recorder("Element", "-file", "out/Elem.out", "-time", "-eleRange", 1, 10, "material", "1", "strains") + +# Alternatively, using new syntax +model.recorder("Node", "disp", + file="out/Node2.out", time=True, node=nn, dof=1) + +model.recorder("Element", ("material", 1, "strains"), + file="out/Elem2.out", time=True, eleRange=(1, 10)) + # -------------------------- # End of recorder generation diff --git a/examples/example8/index.html b/examples/example8/index.html index 882158b..aeacc65 100644 --- a/examples/example8/index.html +++ b/examples/example8/index.html @@ -25,7 +25,7 @@ - + @@ -52,7 +52,7 @@ - + @@ -110,7 +110,7 @@ "about": { "@id": "https://stairlab.github.io/#/schema/organization/1" }, - "dateModified": "2024-09-19T09:17:28CET","breadcrumb": { + "dateModified": "2024-09-25T12:16:10CET","breadcrumb": { "@id": "https://stairlab.github.io/opensees-gallery/examples/example8/#/schema/breadcrumb/1" }, "primaryImageOfPage": { @@ -648,13 +648,13 @@ Tcl Python(RT) @@ -670,7 +670,7 @@ -
          +
          # mesh generation
           block3D $nx $ny $nz   1 1  $element  $eleArgs {
          @@ -691,7 +691,7 @@
           
           
           
          -
          +
          model.block3D(nx, ny, nz, 1, 1, Brick, 1, {
                         1: [-1.0, -1.0,  0.0],
          @@ -2044,7 +2044,7 @@
               
           
           
          -
          +
               
           
               
          diff --git a/examples/framebuckling/index.html b/examples/framebuckling/index.html
          index 48a2c99..8afb3a7 100644
          --- a/examples/framebuckling/index.html
          +++ b/examples/framebuckling/index.html
          @@ -25,7 +25,7 @@
           
               
               
          -
          +
               
                   
               
          @@ -53,7 +53,7 @@
           
           
           
          -
          +
               
           
           
          @@ -111,7 +111,7 @@
                 "about": {
                     "@id": "https://stairlab.github.io/#/schema/organization/1"
                   },
          -      "dateModified": "2024-09-19T09:17:28CET","breadcrumb": {
          +      "dateModified": "2024-10-02T19:39:51CET","breadcrumb": {
                   "@id": "https://stairlab.github.io/opensees-gallery/examples/framebuckling/#/schema/breadcrumb/1"
                 },
                 "primaryImageOfPage": {
          @@ -355,8 +355,8 @@
           
               
                   
          -        1 min read •
          -        107 words
          +        2 min read •
          +        286 words
               
           
          @@ -530,7 +530,8 @@ -

          This example is adapted from +

          +This example is adapted from @@ -574,6 +575,168 @@ buckling.tcl for Tcl.

          +

          Theory + +  

          + +

          Buckling Analysis + +  

          +

          Loosely speaking, buckling happens when there are multiple shapes that a structure can deform into that will be in equilibrium with it’s applied loads. This implies that at the point of buckling, there are multiple independent displacement increments + + + + + + u\bm{u} + + + which will be mapped to the same resisting load by the tangent + + + + + + K\bm{K} + + +. In otherwords, The buckling load is the point at which + + + + + + K\bm{K} + + + becomes singular. If we consider + + + + + + K\bm{K} + + + as a function of the load factor + + + + + + λ\bm{\lambda} + + +, this condition can be expressed as the nonlinear root-finding problem: +

          + + + + + + + + + detK(λ)=0 +\operatorname{det}\bm{K}(\lambda) = 0 + + + +

          +For many classical models, the dependence of + + + + + + K\bm{K} + + + on + + + + + + λ\lambda + + + is linear, and in this case the problem is equivalent to a generalized eigenvalue problem which is computationally much more tractable. However, even if + + + + + + K\bm{K} + + + is nonlinear in + + + + + + λ\lambda + + +, one may still investigate the linearized buckling problem, where an eigenvalue problem is obtained by learizing + + + + + + K(λ)\bm{K}(\lambda) + + +: +

          + + + + + + + + + K(λ)K(0)+K(0)λ +\bm{K}(\lambda) \approx \bm{K}(0) + \bm{K}^{\prime}(0) \lambda + + + +

          +where + + + + + + K\bm{K}^{\prime} + + + is the derivative of + + + + + + K\bm{K} + + + with respect to + + + + + + λ\lambda + + +.

          + +

          Timoshenko Column Buckling + +  

          + @@ -945,6 +1108,7 @@ + @@ -961,7 +1125,7 @@ - + diff --git a/examples/frameshear/Case_2.py b/examples/frameshear/Case_2.py index 9dc1c0b..517373f 100644 --- a/examples/frameshear/Case_2.py +++ b/examples/frameshear/Case_2.py @@ -7,6 +7,7 @@ import numpy as np from math import cos,sin,sqrt,pi import opensees.openseespy as ops + # import units (inch-kip-sec) from opensees.units.iks import ft, inch, ksi @@ -17,16 +18,13 @@ def check(model, Mbench, Dbench): Axial = model.getTime() Mbase = model.eleResponse( 1, "forces")[2] Dtip = model.nodeDisp(nn, 1) -# print( " Computed Exact Error") -# print(f" Axial Force (kips) {Axial:8.0f}") -# print(f" Base moment (kip-in) {Mbase:8.0f} {Mbench:8.0f} %8.2f %%" % (100*(Mbench-Mbase)/Mbench), end=" ") -# print(f" Tip displacement (in) {Dtip:8.4f} {Dbench:8.3f} %8.2f %%\n" % (100*(Dbench-Dtip)/Dbench)) + print(f" {Axial:5.0f}", end=" ") print(f" {Mbase:5.0f} {Mbench:8.0f} %8.2f %%" % (100*(Mbench-Mbase)/Mbench), end=" ") print(f" {Dtip:5.4f} {Dbench:8.3f} %8.2f %%" % (100*(Dbench-Dtip)/Dbench)) -def create_column(element, use_shear=False, ndm=2): +def create_column(element, use_shear=False, ndm=3): L = 28*ft # Material E = 29000.0*ksi @@ -88,7 +86,8 @@ def create_column(element, use_shear=False, ndm=2): nodes = (tag, tag+1) # model.element('PrismFrame', i+1, nodes, A, E, I, 1, "-order", 1) - model.element(element, i+1, nodes, 3, 1, 1) +# model.element(element, i+1, nodes, 3, 1, 1) + model.element(element, i+1, nodes, transform=1, section=1) # model.element('ForceBeamColumnCBDI', i+1, node_i, node_j, 3, 1, 1) # model.element('DispBeamColumnNL', i+1, node_i, node_j, 3, 1, 1) # model.element('DispBeamColumn', i+1, node_i, node_j, 3, 1, 1) @@ -100,14 +99,14 @@ def create_column(element, use_shear=False, ndm=2): return model -def analyze(model, Mbench, Dbench, ndm=2): - model.constraints('Transformation') - model.numberer('Plain') - model.system('UmfPack') - model.test('NormDispIncr', 1.0e-6, 30, 0) - model.algorithm('Newton') - model.integrator('LoadControl', 0.1) - model.analysis('Static') +def analyze(model, Mbench, Dbench, ndm=3): + model.constraints("Transformation") + model.numberer("Plain") + model.system("UmfPack") + model.test("NormDispIncr", 1.0e-6, 30, 0) + model.algorithm("Newton") + model.integrator("LoadControl", 0.1) + model.analysis("Static") model.analyze(10) ne = len(model.getNodeTags()) - 1 @@ -136,6 +135,7 @@ def analyze(model, Mbench, Dbench, ndm=2): if __name__ == "__main__": + ndm = 3 for shear in False, True: @@ -147,13 +147,9 @@ def analyze(model, Mbench, Dbench, ndm=2): Mbench = [ 336.0, 469.0, 598.0, 848.0] Dbench = [ 0.901, 1.33 , 1.75 , 2.56 ] - print(f"Force ({shear = })") - analyze(create_column("forceBeamColumn", shear), Mbench, Dbench) - print(f"ForceCBDI ({shear = })") - analyze(create_column("forceBeamColumnCBDI", shear), Mbench, Dbench) - - if shear: - print("Exact") - analyze(create_column("ExactFrame", shear, ndm=3), Mbench, Dbench, ndm=3) - + for element in "ForceFrame", "ExactFrame", "PrismFrame": + if "Exact" in element and (ndm == 2 or not shear): + continue + print(f"{element} ({shear = })") + analyze(create_column(element, shear, ndm=ndm), Mbench, Dbench, ndm=ndm) diff --git a/examples/frameshear/index.html b/examples/frameshear/index.html index 8b46b6a..25ae162 100644 --- a/examples/frameshear/index.html +++ b/examples/frameshear/index.html @@ -25,7 +25,7 @@ - + @@ -846,7 +846,7 @@ - + diff --git a/examples/index.html b/examples/index.html index 2ff925d..e97e5fa 100644 --- a/examples/index.html +++ b/examples/index.html @@ -25,7 +25,7 @@ - + @@ -1268,7 +1268,7 @@ - + diff --git a/examples/index.xml b/examples/index.xml index 95b57a8..c3a1068 100644 --- a/examples/index.xml +++ b/examples/index.xml @@ -139,7 +139,7 @@ https://stairlab.github.io/opensees-gallery/examples/framebuckling/ Mon, 01 Jan 0001 00:00:00 +0000 https://stairlab.github.io/opensees-gallery/examples/framebuckling/ - Corotational frame elements are used to approximate Euler&rsquo;s buckling load, which is given by: Peuler=π2EIL2 P_{\mathrm{euler}} = \frac{\pi^2 EI}{L^2} This example is adapted from https://github.com/denavit/OpenSees-Examples&nbsp; . The files for the problem are buckling.py for Python, and buckling.tcl for Tcl. λ=PL2EI[1−P/(ksGA)]=PL2χEIχ=1−P/(ksGA)P=χλ2EI/L2. \begin{gathered} \lambda=\sqrt{\frac{P L^2}{E I\left[1-P /\left(k_{\mathrm{s}} G A\right)\right]}}=\sqrt{\frac{P L^2}{\chi E I}} \\ \chi=1-P /\left(k_{\mathrm{s}} G A\right) \\ P=\chi \lambda^2 E I / L^2 . \end{gathered} χ=11+λ2EI/(ksGAL2)=11+λ2φ/12P=λ2EI/L21+λ2φ/12. \begin{gathered} \chi=\frac{1}{1+\lambda^2 E I /\left(k_{\mathrm{s}} G A L^2\right)}=\frac{1}{1+\lambda^2 \varphi / 12} \\ P=\frac{\lambda^2 E I / L^2}{1+\lambda^2 \varphi / 12} . + Corotational frame elements are used to approximate Euler&rsquo;s buckling load, which is given by: Peuler=π2EIL2 P_{\mathrm{euler}} = \frac{\pi^2 EI}{L^2} This example is adapted from https://github.com/denavit/OpenSees-Examples&nbsp; . The files for the problem are buckling.py for Python, and buckling.tcl for Tcl. Theory &nbsp; Buckling Analysis &nbsp; Loosely speaking, buckling happens when there are multiple shapes that a structure can deform into that will be in equilibrium with it&rsquo;s applied loads. This implies that at the point of buckling, there are multiple independent displacement increments u\bm{u} which will be mapped to the same resisting load by the tangent K\bm{K} . RotD Spectrum diff --git a/examples/inelasticsdof/index.html b/examples/inelasticsdof/index.html index 7f32aeb..4bd9da9 100644 --- a/examples/inelasticsdof/index.html +++ b/examples/inelasticsdof/index.html @@ -25,7 +25,7 @@ - + @@ -1427,7 +1427,7 @@

          References + diff --git a/examples/mrf_concentrated/index.html b/examples/mrf_concentrated/index.html index 37530c2..7c1bde1 100644 --- a/examples/mrf_concentrated/index.html +++ b/examples/mrf_concentrated/index.html @@ -25,7 +25,7 @@ - + @@ -923,7 +923,7 @@

          References

          - + diff --git a/examples/page/2/index.html b/examples/page/2/index.html index 53dd7c6..48dca50 100644 --- a/examples/page/2/index.html +++ b/examples/page/2/index.html @@ -25,7 +25,7 @@ - + @@ -1250,7 +1250,7 @@ - + diff --git a/examples/page/3/index.html b/examples/page/3/index.html index 0c09d52..dd4364d 100644 --- a/examples/page/3/index.html +++ b/examples/page/3/index.html @@ -25,7 +25,7 @@ - + @@ -448,7 +448,7 @@

          @@ -1217,7 +1217,7 @@ - + diff --git a/examples/page/4/index.html b/examples/page/4/index.html index a0ff1ba..1d4dde8 100644 --- a/examples/page/4/index.html +++ b/examples/page/4/index.html @@ -25,7 +25,7 @@ - + @@ -804,7 +804,7 @@ - + diff --git a/examples/pendulum/index.html b/examples/pendulum/index.html index 40895b5..c8782cf 100644 --- a/examples/pendulum/index.html +++ b/examples/pendulum/index.html @@ -25,7 +25,7 @@ - + @@ -881,7 +881,7 @@ - + diff --git a/examples/sathertower/index.html b/examples/sathertower/index.html index dc5023e..407839f 100644 --- a/examples/sathertower/index.html +++ b/examples/sathertower/index.html @@ -25,7 +25,7 @@ - + @@ -51,7 +51,8 @@ - + + @@ -108,7 +109,7 @@ "about": { "@id": "https://stairlab.github.io/#/schema/organization/1" }, - "breadcrumb": { + "dateModified": "2024-09-25T12:16:10CET","breadcrumb": { "@id": "https://stairlab.github.io/opensees-gallery/examples/sathertower/#/schema/breadcrumb/1" }, "primaryImageOfPage": { @@ -723,7 +724,7 @@ - + diff --git a/examples/sensitivity/Example4_Frame3D/Example4_Frame3D.tcl b/examples/sensitivity/Example4_Frame3D/Example4_Frame3D.tcl new file mode 100644 index 0000000..7161939 --- /dev/null +++ b/examples/sensitivity/Example4_Frame3D/Example4_Frame3D.tcl @@ -0,0 +1,578 @@ +#refer to " Quan Gu, Michele Barbato, and Joel P. Conte. Handling of Constraints in Finite Element Response +# Sensitivity Analysis. ASCE Journal of Engineering Mechanics. 2009." + + +# OpenSees Example 5.1 +# +# Units: kips, in, sec +# 1 kips = 4448.222 N, 1 in= 0.0254 m +# +# change to kN k-kg, kPa, m, sec. +# +# +# +# 15______________________ 16 +# /| /| +# / | / | +# 18/ | / | +# |----------------------/17 | z +# | | | | /|\ / y +# | | | | | / +# | |10________________|___|11 | / +# | /| | /| | / +# | / | | / | | / +# |/ | |/ | |/ +# |13--------------------|12 | |-----------> x +# | | | | +# | | | | +# | |5_________________|___|6 +# | /| | /| +# | / | | / | +# |/ | |/ | +# |8---------------------|7 | +# | | | | +# | | | | +# | | | | +# | |1 | |2 +# | | +# |4 |3 + + + +model BasicBuilder -ndm 3 -ndf 6 +reliability +set h 3.6576; # Story height +set by 6.096; # Bay width in Y-direction +set bx 6.096; # Bay width in X-direction + +# tag X Y Z +node 1 [expr -$bx/2] [expr $by/2] 0 +node 2 [expr $bx/2] [expr $by/2] 0 +node 3 [expr $bx/2] [expr -$by/2] 0 +node 4 [expr -$bx/2] [expr -$by/2] 0 +node 5 [expr -$bx/2] [expr $by/2] $h +node 6 [expr $bx/2] [expr $by/2] $h +node 7 [expr $bx/2] [expr -$by/2] $h +node 8 [expr -$bx/2] [expr -$by/2] $h +node 10 [expr -$bx/2] [expr $by/2] [expr 2*$h] +node 11 [expr $bx/2] [expr $by/2] [expr 2*$h] +node 12 [expr $bx/2] [expr -$by/2] [expr 2*$h] +node 13 [expr -$bx/2] [expr -$by/2] [expr 2*$h] +node 15 [expr -$bx/2] [expr $by/2] [expr 3*$h] +node 16 [expr $bx/2] [expr $by/2] [expr 3*$h] +node 17 [expr $bx/2] [expr -$by/2] [expr 3*$h] +node 18 [expr -$bx/2] [expr -$by/2] [expr 3*$h] + +# ----------------- Master nodes for rigid diaphragm --------- +# tag X Y Z +node 9 0 0 $h +node 14 0 0 [expr 2*$h] +node 19 0 0 [expr 3*$h] + +# ----------------- Set base constraints -------------------- +# tag DX DY DZ RX RY RZ +fix 1 1 1 1 1 1 1 +fix 2 1 1 1 1 1 1 +fix 3 1 1 1 1 1 1 +fix 4 1 1 1 1 1 1 + +# --------------- Define rigid diaphragm multi-point constraints -- + +# normalDir master slaves +rigidDiaphragm 3 9 5 6 7 8 +rigidDiaphragm 3 14 10 11 12 13 +rigidDiaphragm 3 19 15 16 17 18 + +# -------------- Constraints for rigid diaphragm master nodes ------ +# tag DX DY DZ RX RY RZ +fix 9 0 0 1 1 1 0 +fix 14 0 0 1 1 1 0 +fix 19 0 0 1 1 1 0 + +# ------------- Define materials for nonlinear columns ------------ + +#--- --------- Core concrete (confined) ------------------- +# tag f'c epsc0 f'cu epscu +uniaxialMaterial Concrete01 1 -34473.8 -0.005 -24131.66 -0.02 + +# ------------ Cover concrete (unconfined) --------------- +set fc 27579.04 +uniaxialMaterial Concrete01 2 -$fc -0.002 0.0 -0.006 + +# ------------- Reinforcing steel ------------------------ +# tag fy E b +uniaxialMaterial Steel01 3 248200. 2.1e8 0.02 + + +# Column width +set d 0.4572 +source RCsection.tcl +# id h b coverThick coreID coverID steelID nBars area nfCoreY nfCoreZ nfCoverY nfCoverZ +RCsection 1 $d $d 0.04 1 2 3 3 0.00051 8 8 10 10 + +# Concrete elastic stiffness +# set E [expr 57000.0*sqrt($fc*1000)/1000]; American unit +set E 24855585.89304; + +# ---Column torsional stiffness + set GJ 68947600000000; +# ---Linear elastic torsion for the column + uniaxialMaterial Elastic 10 $GJ +# ---Attach torsion to the RC column section +# tag uniTag uniCode secTag +section Aggregator 2 10 T -section 1 +set colSec 2 + +# -------------- Define column elements ----------------------- + +geomTransf Linear 1 1 0 0 + +# Number of column integration points (sections) +set np 4 +# Create the nonlinear column elements +# tag ndI ndJ nPts secID transf +element dispBeamColumnWithSensitivity 1 1 5 $np $colSec 1 +element dispBeamColumnWithSensitivity 2 2 6 $np $colSec 1 +element dispBeamColumnWithSensitivity 3 3 7 $np $colSec 1 +element dispBeamColumnWithSensitivity 4 4 8 $np $colSec 1 +element dispBeamColumnWithSensitivity 5 5 10 $np $colSec 1 +element dispBeamColumnWithSensitivity 6 6 11 $np $colSec 1 +element dispBeamColumnWithSensitivity 7 7 12 $np $colSec 1 +element dispBeamColumnWithSensitivity 8 8 13 $np $colSec 1 +element dispBeamColumnWithSensitivity 9 10 15 $np $colSec 1 +element dispBeamColumnWithSensitivity 10 11 16 $np $colSec 1 +element dispBeamColumnWithSensitivity 11 12 17 $np $colSec 1 +element dispBeamColumnWithSensitivity 12 13 18 $np $colSec 1 + +# ------------ Define beam elements ------------ +# Define material properties for elastic beams +# Using beam depth of 24 and width of 18 +# ---------------------------------------------- +set Abeam 0.278709 + +# "Cracked" second moments of area +set Ibeamzz 0.004315; +set Ibeamyy 0.002427; +# Define elastic section for beams +# tag E A Iz Iy G J +section Elastic 3 $E $Abeam $Ibeamzz $Ibeamyy $GJ 1.0 +set beamSec 3 + +# Geometric transformation for beams +# tag vecxz + +geomTransf Linear 2 1 1 0 + +set np 3 +# ---------- Create the beam elements---------------- +# tag ndI ndJ nPts secID transf +element dispBeamColumnWithSensitivity 13 5 6 $np $beamSec 2 Legendre +element dispBeamColumnWithSensitivity 14 6 7 $np $beamSec 2 Legendre +element dispBeamColumnWithSensitivity 15 7 8 $np $beamSec 2 Legendre +element dispBeamColumnWithSensitivity 16 8 5 $np $beamSec 2 Legendre +element dispBeamColumnWithSensitivity 17 10 11 $np $beamSec 2 Legendre +element dispBeamColumnWithSensitivity 18 11 12 $np $beamSec 2 Legendre +element dispBeamColumnWithSensitivity 19 12 13 $np $beamSec 2 Legendre +element dispBeamColumnWithSensitivity 20 13 10 $np $beamSec 2 Legendre +element dispBeamColumnWithSensitivity 21 15 16 $np $beamSec 2 Legendre +element dispBeamColumnWithSensitivity 22 16 17 $np $beamSec 2 Legendre +element dispBeamColumnWithSensitivity 23 17 18 $np $beamSec 2 Legendre +element dispBeamColumnWithSensitivity 24 18 15 $np $beamSec 2 Legendre + +# --------------- Define gravity loads ---------------- +# Gravity load applied at each corner node +# 10% of column capacity + +set p 74.0 + +# --------------- Mass lumped at master nodes --------- +set g 9.8; # Gravitational constant +set m 30.0; + +# Rotary inertia of floor about master node +set i [expr $m*($bx*$bx+$by*$by)/12.0] +# Set mass at the master nodes +# tag MX MY MZ RX RY RZ +mass 9 $m $m 0 0 0 $i +mass 14 $m $m 0 0 0 $i +mass 19 $m $m 0 0 0 $i +# Define gravity loads +#pattern Plain 1 Constant { +pattern Plain 1 {Series -time {0.0 2.0 100000.0} -values {0.0 1.0 1.0} } { + foreach node {5 6 7 8 10 11 12 13 15 16 17 18} { + load $node 0.0 0.0 -$p 0.0 0.0 0.0 + } +} + +#-------------------------------------------------------------------------------------------------------- +# CORE CONCRETE +# +# ------------------------------ R.V.#1 Core concrete epsco --------------------------------------------- +set h epsco +set gradNumber 1 + +parameter $gradNumber -element 1 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 2 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 3 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 4 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 5 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 6 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 7 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 8 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 9 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 10 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 11 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 12 -section 2 -section -material 1 $h + + +recorder Node -file ddmCore9epsco.out -time -node 9 -dof 1 2 3 4 5 6 "sensitivity 1" +recorder Node -file ddmCore14epsco.out -time -node 14 -dof 1 2 3 4 5 6 "sensitivity 1" +recorder Node -file ddmCore19epsco.out -time -node 19 -dof 1 2 3 4 5 6 "sensitivity 1" + +# ------------------------------ R.V.#2 Core concrete fc---------------------------------------------- +set h fc +set gradNumber 2 + +parameter $gradNumber -element 1 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 2 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 3 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 4 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 5 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 6 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 7 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 8 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 9 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 10 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 11 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 12 -section 2 -section -material 1 $h + + +recorder Node -file ddmCore9fc.out -time -node 9 -dof 1 2 3 4 5 6 "sensitivity 2" +recorder Node -file ddmCore14fc.out -time -node 14 -dof 1 2 3 4 5 6 "sensitivity 2" +recorder Node -file ddmCore19fc.out -time -node 19 -dof 1 2 3 4 5 6 "sensitivity 2" + +# ------------------------------ R.V.#3 Core concrete epscu---------------------------------------------- +set h epscu +set gradNumber 3 + +parameter $gradNumber -element 1 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 2 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 3 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 4 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 5 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 6 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 7 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 8 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 9 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 10 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 11 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 12 -section 2 -section -material 1 $h + +recorder Node -file ddmCore9epscu.out -time -node 9 -dof 1 2 3 4 5 6 "sensitivity 3" +recorder Node -file ddmCore14epscu.out -time -node 14 -dof 1 2 3 4 5 6 "sensitivity 3" +recorder Node -file ddmCore19epscu.out -time -node 19 -dof 1 2 3 4 5 6 "sensitivity 3" + + +# ------------------------------ R.V.#4 Core concrete fcu---------------------------------------------- +set h fcu +set gradNumber 4 + +parameter $gradNumber -element 1 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 2 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 3 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 4 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 5 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 6 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 7 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 8 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 9 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 10 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 11 -section 2 -section -material 1 $h +addToParameter $gradNumber -element 12 -section 2 -section -material 1 $h + +recorder Node -file ddmCore9fcu.out -time -node 9 -dof 1 2 3 4 5 6 "sensitivity 4" +recorder Node -file ddmCore14fcu.out -time -node 14 -dof 1 2 3 4 5 6 "sensitivity 4" +recorder Node -file ddmCore19fcu.out -time -node 19 -dof 1 2 3 4 5 6 "sensitivity 4" + + +#-------------------------------------------------------------------------------------------------------- +# COVER CONCRETE +# +# ------------------------------ R.V.#5 Cover concrete epsco---------------------------------------------- +set h epsco +set gradNumber 5 + +parameter $gradNumber -element 1 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 2 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 3 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 4 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 5 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 6 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 7 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 8 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 9 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 10 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 11 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 12 -section 2 -section -material 2 $h + +recorder Node -file ddmCover9epsco.out -time -node 9 -dof 1 2 3 4 5 6 "sensitivity 5" +recorder Node -file ddmCover14epsco.out -time -node 14 -dof 1 2 3 4 5 6 "sensitivity 5" +recorder Node -file ddmCover19epsco.out -time -node 19 -dof 1 2 3 4 5 6 "sensitivity 5" + +# ------------------------------ R.V.#6 Cover concrete fc---------------------------------------------- +set h fc +set gradNumber 6 + +parameter $gradNumber -element 1 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 2 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 3 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 4 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 5 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 6 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 7 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 8 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 9 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 10 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 11 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 12 -section 2 -section -material 2 $h + +recorder Node -file ddmCover9fc.out -time -node 9 -dof 1 2 3 4 5 6 "sensitivity 6" +recorder Node -file ddmCover14fc.out -time -node 14 -dof 1 2 3 4 5 6 "sensitivity 6" +recorder Node -file ddmCover19fc.out -time -node 19 -dof 1 2 3 4 5 6 "sensitivity 6" + +# ------------------------------ R.V.#7 Cover concrete epscu---------------------------------------------- +set h epscu +set gradNumber 7 + + +parameter $gradNumber -element 1 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 2 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 3 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 4 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 5 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 6 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 7 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 8 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 9 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 10 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 11 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 12 -section 2 -section -material 2 $h + +recorder Node -file ddmCover9epscu.out -time -node 9 -dof 1 2 3 4 5 6 "sensitivity 7" +recorder Node -file ddmCover14epscu.out -time -node 14 -dof 1 2 3 4 5 6 "sensitivity 7" +recorder Node -file ddmCover19epscu.out -time -node 19 -dof 1 2 3 4 5 6 "sensitivity 7" + +# ------------------------------ R.V.#8 Cover concrete fcu---------------------------------------------- +set h fcu +set gradNumber 8 + +parameter $gradNumber -element 1 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 2 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 3 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 4 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 5 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 6 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 7 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 8 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 9 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 10 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 11 -section 2 -section -material 2 $h +addToParameter $gradNumber -element 12 -section 2 -section -material 2 $h + +recorder Node -file ddmCover9fcu.out -time -node 9 -dof 1 2 3 4 5 6 "sensitivity 8" +recorder Node -file ddmCover14fcu.out -time -node 14 -dof 1 2 3 4 5 6 "sensitivity 8" +recorder Node -file ddmCover19fcu.out -time -node 19 -dof 1 2 3 4 5 6 "sensitivity 8" + +#---------------------------------------------------------------------------------------------- +# STEEL SENSITIVITY +# +# ------------------------------ R.V.#9 steel fy ---------------------------------------------- +set h sigmaY +set gradNumber 9 + + +parameter $gradNumber -element 1 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 2 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 3 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 4 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 5 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 6 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 7 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 8 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 9 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 10 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 11 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 12 -section 2 -section -material 3 $h + +recorder Node -file ddmSteel9fy.out -time -node 9 -dof 1 2 3 4 5 6 "sensitivity 9" +recorder Node -file ddmSteel14fy.out -time -node 14 -dof 1 2 3 4 5 6 "sensitivity 9" +recorder Node -file ddmSteel19fy.out -time -node 19 -dof 1 2 3 4 5 6 "sensitivity 9" + +# ------------------------------ R.V.#10 steel E ---------------------------------------------- +set h E +set gradNumber 10 + +parameter $gradNumber -element 1 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 2 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 3 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 4 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 5 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 6 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 7 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 8 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 9 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 10 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 11 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 12 -section 2 -section -material 3 $h + +recorder Node -file ddmSteel9E.out -time -node 9 -dof 1 2 3 4 5 6 "sensitivity 10" +recorder Node -file ddmSteel14E.out -time -node 14 -dof 1 2 3 4 5 6 "sensitivity 10" +recorder Node -file ddmSteel19E.out -time -node 19 -dof 1 2 3 4 5 6 "sensitivity 10" + +# ------------------------------ R.V.#11 steel b ---------------------------------------------- +set h b +set gradNumber 11 + +parameter $gradNumber -element 1 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 2 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 3 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 4 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 5 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 6 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 7 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 8 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 9 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 10 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 11 -section 2 -section -material 3 $h +addToParameter $gradNumber -element 12 -section 2 -section -material 3 $h + +recorder Node -file ddmSteel9b.out -time -node 9 -dof 1 2 3 4 5 6 "sensitivity 11" +recorder Node -file ddmSteel14b.out -time -node 14 -dof 1 2 3 4 5 6 "sensitivity 11" +recorder Node -file ddmSteel19b.out -time -node 19 -dof 1 2 3 4 5 6 "sensitivity 11" + +# ------------------------------ R.V.#12 column GJ ---------------------------------------------- +set h E +set gradNumber 12 + +parameter $gradNumber -element 1 -section 2 $h +addToParameter $gradNumber -element 2 -section 2 $h +addToParameter $gradNumber -element 3 -section 2 $h +addToParameter $gradNumber -element 4 -section 2 $h +addToParameter $gradNumber -element 5 -section 2 $h +addToParameter $gradNumber -element 6 -section 2 $h +addToParameter $gradNumber -element 7 -section 2 $h +addToParameter $gradNumber -element 8 -section 2 $h +addToParameter $gradNumber -element 9 -section 2 $h +addToParameter $gradNumber -element 10 -section 2 $h +addToParameter $gradNumber -element 11 -section 2 $h +addToParameter $gradNumber -element 12 -section 2 $h + + +recorder Node -file ddm9GJ.out -time -node 9 -dof 1 2 3 4 5 6 "sensitivity 12" +recorder Node -file ddm14GJ.out -time -node 14 -dof 1 2 3 4 5 6 "sensitivity 12" +recorder Node -file ddm19GJ.out -time -node 19 -dof 1 2 3 4 5 6 "sensitivity 12" + + +#----------------------------------------------------------------------------------------- +# +# ELASTIC BEAM +# +#----------------------------------------------------------------------------------------- + +# ------------------------------ R.V.#13 Beam E ---------------------------------------------- +set h E +set gradNumber 13 + +parameter $gradNumber -element 13 -section 3 $h +addToParameter $gradNumber -element 14 -section 3 $h +addToParameter $gradNumber -element 15 -section 3 $h +addToParameter $gradNumber -element 16 -section 3 $h +addToParameter $gradNumber -element 17 -section 3 $h +addToParameter $gradNumber -element 18 -section 3 $h +addToParameter $gradNumber -element 19 -section 3 $h +addToParameter $gradNumber -element 20 -section 3 $h +addToParameter $gradNumber -element 21 -section 3 $h +addToParameter $gradNumber -element 22 -section 3 $h +addToParameter $gradNumber -element 23 -section 3 $h +addToParameter $gradNumber -element 24 -section 3 $h + + +recorder Node -file ddm9BeamE.out -time -node 9 -dof 1 2 3 4 5 6 "sensitivity 13" +recorder Node -file ddm14BeamE.out -time -node 14 -dof 1 2 3 4 5 6 "sensitivity 13" +recorder Node -file ddm19BeamE.out -time -node 19 -dof 1 2 3 4 5 6 "sensitivity 13" + + +# ------------------------------ R.V.#14 Beam G ---------------------------------------------- +set h G +set gradNumber 14 + +parameter $gradNumber -element 13 -section 3 $h +addToParameter $gradNumber -element 14 -section 3 $h +addToParameter $gradNumber -element 15 -section 3 $h +addToParameter $gradNumber -element 16 -section 3 $h +addToParameter $gradNumber -element 17 -section 3 $h +addToParameter $gradNumber -element 18 -section 3 $h +addToParameter $gradNumber -element 19 -section 3 $h +addToParameter $gradNumber -element 20 -section 3 $h +addToParameter $gradNumber -element 21 -section 3 $h +addToParameter $gradNumber -element 22 -section 3 $h +addToParameter $gradNumber -element 23 -section 3 $h +addToParameter $gradNumber -element 24 -section 3 $h + +recorder Node -file ddm9BeamG.out -time -node 9 -dof 1 2 3 4 5 6 "sensitivity 14" +recorder Node -file ddm14BeamG.out -time -node 14 -dof 1 2 3 4 5 6 "sensitivity 14" +recorder Node -file ddm19BeamG.out -time -node 19 -dof 1 2 3 4 5 6 "sensitivity 14" + +# ---------------------- Define earthquake excitation ------------ +# Set up the acceleration records for Tabas fault normal and fault parallel +set tabasFN "Path -filePath tabasFN.txt -dt 0.02 -factor $g" +set tabasFP "Path -filePath tabasFP.txt -dt 0.02 -factor $g" + +# tag dir accel series args +pattern UniformExcitation 2 1 -accel $tabasFN +pattern UniformExcitation 3 2 -accel $tabasFP + +recorder Node -file node.out -time -node 9 14 19 -dof 1 2 3 4 5 6 -precision 16 disp + +# ------------------------- add static analysis ------------------------ +constraints Transformation +# tol maxIter printFlag +test EnergyIncr 1.0e-16 20 2 +integrator LoadControl 1 1 1 1 +algorithm Newton +system BandGeneral +numberer RCM + +sensitivityIntegrator -static +sensitivityAlgorithm -computeAtEachStep + +analysis Static + +set startT [clock seconds] +analyze 3 +puts "soil gravity nonlinear analysis completed ..." + +# ------------------------- add analysis ------------------------ +wipeAnalysis + +# tol maxIter printFlag +test EnergyIncr 1.0e-16 20 2 +algorithm Newton +system BandGeneral +constraints Transformation +#integrator Newmark 0.5 0.25 +numberer RCM + +integrator NewmarkWithSensitivity 0.55 0.275625 0. 0. 0. 0. +# (0.55+0.5)^2/4=0.275625 +sensitivityIntegrator -definedAbove +sensitivityAlgorithm -computeAtEachStep + + +analysis Transient + + +analyze 2500 0.01 + +set endT [clock seconds] +puts "Execution time: [expr $endT-$startT] seconds." diff --git a/examples/sensitivity/Example4_Frame3D/Example4_Frame3D_FFD.tcl b/examples/sensitivity/Example4_Frame3D/Example4_Frame3D_FFD.tcl new file mode 100644 index 0000000..fed4e9f --- /dev/null +++ b/examples/sensitivity/Example4_Frame3D/Example4_Frame3D_FFD.tcl @@ -0,0 +1,278 @@ +# refer to " Quan Gu, Michele Barbato, and Joel P. Conte. Handling of Constraints in Finite Element Response +# Sensitivity Analysis. ASCE Journal of Engineering Mechanics. 2009." + + +# OpenSees Example 5.1 +# +# Units: kips, in, sec +# 1 kips = 4448.222 N, 1 in= 0.0254 m +# +# change to kN k-kg, kPa, m, sec. +# +# +# +# 15______________________ 16 +# /| /| +# / | / | +# 18/ | / | +# |----------------------/17 | z +# | | | | /|\ / y +# | | | | | / +# | |10________________|___|11 | / +# | /| | /| | / +# | / | | / | | / +# |/ | |/ | |/ +# |13--------------------|12 | |-----------> x +# | | | | +# | | | | +# | |5_________________|___|6 +# | /| | /| +# | / | | / | +# |/ | |/ | +# |8---------------------|7 | +# | | | | +# | | | | +# | | | | +# | |1 | |2 +# | | +# |4 |3 + + +set jj 1 +foreach ii {0.01 0.001 0.0001 0.00001} { + set perturb [expr $ii+1] + set fileName "node$jj.out" + + + + set jj [expr $jj+1] + + + +wipe + +model BasicBuilder -ndm 3 -ndf 6 + +set h 3.6576; # Story height +set by 6.096; # Bay width in Y-direction +set bx 6.096; # Bay width in X-direction + +# tag X Y Z +node 1 [expr -$bx/2] [expr $by/2] 0 +node 2 [expr $bx/2] [expr $by/2] 0 +node 3 [expr $bx/2] [expr -$by/2] 0 +node 4 [expr -$bx/2] [expr -$by/2] 0 +node 5 [expr -$bx/2] [expr $by/2] $h +node 6 [expr $bx/2] [expr $by/2] $h +node 7 [expr $bx/2] [expr -$by/2] $h +node 8 [expr -$bx/2] [expr -$by/2] $h +node 10 [expr -$bx/2] [expr $by/2] [expr 2*$h] +node 11 [expr $bx/2] [expr $by/2] [expr 2*$h] +node 12 [expr $bx/2] [expr -$by/2] [expr 2*$h] +node 13 [expr -$bx/2] [expr -$by/2] [expr 2*$h] +node 15 [expr -$bx/2] [expr $by/2] [expr 3*$h] +node 16 [expr $bx/2] [expr $by/2] [expr 3*$h] +node 17 [expr $bx/2] [expr -$by/2] [expr 3*$h] +node 18 [expr -$bx/2] [expr -$by/2] [expr 3*$h] + +# ----------------- Master nodes for rigid diaphragm --------- +# tag X Y Z +node 9 0 0 $h +node 14 0 0 [expr 2*$h] +node 19 0 0 [expr 3*$h] + +# ----------------- Set base constraints -------------------- +# tag DX DY DZ RX RY RZ +fix 1 1 1 1 1 1 1 +fix 2 1 1 1 1 1 1 +fix 3 1 1 1 1 1 1 +fix 4 1 1 1 1 1 1 + +# --------------- Define rigid diaphragm multi-point constraints -- + +# normalDir master slaves +rigidDiaphragm 3 9 5 6 7 8 +rigidDiaphragm 3 14 10 11 12 13 +rigidDiaphragm 3 19 15 16 17 18 + +# -------------- Constraints for rigid diaphragm master nodes ------ +# tag DX DY DZ RX RY RZ +fix 9 0 0 1 1 1 0 +fix 14 0 0 1 1 1 0 +fix 19 0 0 1 1 1 0 + +# ------------- Define materials for nonlinear columns ------------ + +#--- --------- Core concrete (confined) ------------------- +# tag f'c epsc0 f'cu epscu +uniaxialMaterial Concrete01 1 -34473.8 [expr -0.005*$perturb] -24131.66 -0.02 + +recorder Node -file $fileName -time -node 9 14 19 -dof 1 2 3 4 5 6 -precision 16 disp + + +# ------------ Cover concrete (unconfined) --------------- +set fc 27579.04 +uniaxialMaterial Concrete01 2 -$fc -0.002 0.0 -0.006 + +# ------------- Reinforcing steel ------------------------ +# tag fy E b +uniaxialMaterial Steel01 3 248200. 2.1e8 0.02 + + +# Column width +set d 0.4572 +source RCsection.tcl +# id h b coverThick coreID coverID steelID nBars area nfCoreY nfCoreZ nfCoverY nfCoverZ +RCsection 1 $d $d 0.04 1 2 3 3 0.00051 8 8 10 10 + +# Concrete elastic stiffness +# set E [expr 57000.0*sqrt($fc*1000)/1000]; American unit +set E 24855585.89304; + +# ---Column torsional stiffness + set GJ 68947600000000; +# ---Linear elastic torsion for the column + uniaxialMaterial Elastic 10 $GJ +# ---Attach torsion to the RC column section +# tag uniTag uniCode secTag +section Aggregator 2 10 T -section 1 +set colSec 2 + +# -------------- Define column elements ----------------------- + +geomTransf Linear 1 1 0 0 + +# Number of column integration points (sections) +set np 4 +# Create the nonlinear column elements +# tag ndI ndJ nPts secID transf +element dispBeamColumnWithSensitivity 1 1 5 $np $colSec 1 Legendre +element dispBeamColumnWithSensitivity 2 2 6 $np $colSec 1 Legendre +element dispBeamColumnWithSensitivity 3 3 7 $np $colSec 1 Legendre +element dispBeamColumnWithSensitivity 4 4 8 $np $colSec 1 Legendre +element dispBeamColumnWithSensitivity 5 5 10 $np $colSec 1 Legendre +element dispBeamColumnWithSensitivity 6 6 11 $np $colSec 1 Legendre +element dispBeamColumnWithSensitivity 7 7 12 $np $colSec 1 Legendre +element dispBeamColumnWithSensitivity 8 8 13 $np $colSec 1 Legendre +element dispBeamColumnWithSensitivity 9 10 15 $np $colSec 1 Legendre +element dispBeamColumnWithSensitivity 10 11 16 $np $colSec 1 Legendre +element dispBeamColumnWithSensitivity 11 12 17 $np $colSec 1 Legendre +element dispBeamColumnWithSensitivity 12 13 18 $np $colSec 1 Legendre + +# ------------ Define beam elements ------------ +# Define material properties for elastic beams +# Using beam depth of 24 and width of 18 +# ---------------------------------------------- +set Abeam 0.278709 + +# "Cracked" second moments of area +set Ibeamzz 0.004315; +set Ibeamyy 0.002427; +# Define elastic section for beams +# tag E A Iz Iy G J +section Elastic 3 $E $Abeam $Ibeamzz $Ibeamyy $GJ 1.0 +set beamSec 3 + +# Geometric transformation for beams +# tag vecxz + +geomTransf Linear 2 1 1 0 + +set np 3 +# ---------- Create the beam elements---------------- +# tag ndI ndJ nPts secID transf +element dispBeamColumnWithSensitivity 13 5 6 $np $beamSec 2 +element dispBeamColumnWithSensitivity 14 6 7 $np $beamSec 2 +element dispBeamColumnWithSensitivity 15 7 8 $np $beamSec 2 +element dispBeamColumnWithSensitivity 16 8 5 $np $beamSec 2 +element dispBeamColumnWithSensitivity 17 10 11 $np $beamSec 2 +element dispBeamColumnWithSensitivity 18 11 12 $np $beamSec 2 +element dispBeamColumnWithSensitivity 19 12 13 $np $beamSec 2 +element dispBeamColumnWithSensitivity 20 13 10 $np $beamSec 2 +element dispBeamColumnWithSensitivity 21 15 16 $np $beamSec 2 +element dispBeamColumnWithSensitivity 22 16 17 $np $beamSec 2 +element dispBeamColumnWithSensitivity 23 17 18 $np $beamSec 2 +element dispBeamColumnWithSensitivity 24 18 15 $np $beamSec 2 + +# --------------- Define gravity loads ---------------- +# Gravity load applied at each corner node +# 10% of column capacity + +set p 74.0 + +# --------------- Mass lumped at master nodes --------- +set g 9.8; # Gravitational constant +set m 30.0; + +# Rotary inertia of floor about master node +set i [expr $m*($bx*$bx+$by*$by)/12.0] +# Set mass at the master nodes +# tag MX MY MZ RX RY RZ +mass 9 $m $m 0 0 0 $i +mass 14 $m $m 0 0 0 $i +mass 19 $m $m 0 0 0 $i +# Define gravity loads +#pattern Plain 1 Constant { +pattern Plain 1 {Series -time {0.0 2.0 100000.0} -values {0.0 1.0 1.0} } { + foreach node {5 6 7 8 10 11 12 13 15 16 17 18} { + load $node 0.0 0.0 -$p 0.0 0.0 0.0 + } +} + +#-------------------------------------------------------------------------------------------------------- +# CORE CONCRETE +# +# ------------------------------ R.V.#1 Core concrete epsco---------------------------------------------- + + +# ---------------------- Define earthquake excitation ------------ +# Set up the acceleration records for Tabas fault normal and fault parallel +set tabasFN "Path -filePath tabasFN.txt -dt 0.02 -factor $g" +set tabasFP "Path -filePath tabasFP.txt -dt 0.02 -factor $g" + +# tag dir accel series args +pattern UniformExcitation 2 1 -accel $tabasFN +pattern UniformExcitation 3 2 -accel $tabasFP + + + +# ------------------------- add static analysis ------------------------ +constraints Transformation +# tol maxIter printFlag +test EnergyIncr 1.0e-16 20 2 +integrator LoadControl 1 1 1 1 +algorithm Newton +system BandGeneral +numberer RCM + + + +analysis Static + +set startT [clock seconds] +analyze 3 +puts "soil gravity nonlinear analysis completed ..." + +# ------------------------- add analysis ------------------------ +wipeAnalysis + +# tol maxIter printFlag +test EnergyIncr 1.0e-16 20 2 +algorithm Newton +system BandGeneral +constraints Transformation +#integrator Newmark 0.5 0.25 +numberer RCM + +integrator Newmark 0.55 0.275625 +# (0.55+0.5)^2/4=0.275625 + + + +analysis Transient + + +analyze 2500 0.01 + +#} +} \ No newline at end of file diff --git a/examples/sensitivity/Example4_Frame3D/Example4_cmp.m b/examples/sensitivity/Example4_Frame3D/Example4_cmp.m new file mode 100644 index 0000000..13c0aff --- /dev/null +++ b/examples/sensitivity/Example4_Frame3D/Example4_cmp.m @@ -0,0 +1,16 @@ +clear all +clc +load node.out +load node1.out +load node2.out +load node3.out +load node4.out + +a= load('ddmCore9epsco.out'); +plot(a(3:end,1)-3,a(3:end,2)) +hold on +plot(node(3:end,1)-3,(node1(3:end,2)-node(3:end,2))/(-0.01*0.005),'--r') +plot(node(3:end,1)-3,(node2(3:end,2)-node(3:end,2))/(-0.001*0.005),'g') +plot(node(3:end,1)-3,(node3(3:end,2)-node(3:end,2))/(-0.0001*0.005),'k') +plot(node(3:end,1)-3,(node4(3:end,2)-node(3:end,2))/(-0.00001*0.005),':') +legend('DDM','0.01','0.001','0.001','0.0001') diff --git a/examples/sensitivity/Example4_Frame3D/cmp.fig b/examples/sensitivity/Example4_Frame3D/cmp.fig new file mode 100644 index 0000000..1464dd4 Binary files /dev/null and b/examples/sensitivity/Example4_Frame3D/cmp.fig differ diff --git a/examples/sensitivity/Example4_Frame3D/proof.m b/examples/sensitivity/Example4_Frame3D/proof.m new file mode 100644 index 0000000..6041224 --- /dev/null +++ b/examples/sensitivity/Example4_Frame3D/proof.m @@ -0,0 +1,28 @@ +a = load ('node.out'); +plot(a(:,1),a(:,2)) +hold on +cd old_opensees +a = load ('node.out'); +plot(a(:,1),a(:,2),'--r') +cd .. +a = load ('ddmCore19epsco.out'); +plot(a(:,1),a(:,2)) +hold on +cd old_opensees +a = load ('ddmCore19epsco.out'); +plot(a(:,1),a(:,2),'--r') +cd .. +a = load ('ddmSteel19fy.out'); +plot(a(:,1),a(:,2),'--r') +plot(a(:,1),a(:,2)) +hold on +cd old_opensees +a = load ('ddmSteel19fy.out'); +plot(a(:,1),a(:,2),'--r') +cd .. +a = load ('ddm9BeamE.out'); +plot(a(:,1),a(:,2)) +hold on +cd old_opensees +a = load ('ddm9BeamE.out'); +plot(a(:,1),a(:,2),'--r') diff --git a/examples/sensitivity/Example4_Frame3D/rcsection.tcl b/examples/sensitivity/Example4_Frame3D/rcsection.tcl new file mode 100644 index 0000000..47e6f90 --- /dev/null +++ b/examples/sensitivity/Example4_Frame3D/rcsection.tcl @@ -0,0 +1,90 @@ +# Define a procedure which generates a rectangular reinforced concrete section +# with one layer of steel evenly distributed around the perimeter and a confined core. +# +# y +# | +# | +# | +# --------------------- +# |\ /| +# | \---------------/ | +# | | | | +# | | | | +# z ---------| | | | h +# | | | | +# | | | | +# | /---------------\ | +# |/ \| +# --------------------- +# b +# +# Formal arguments +# id - tag for the section that is generated by this procedure +# h - overall height of the section (see above) +# b - overall width of the section (see above) +# cover - thickness of the cover patches +# coreID - material tag for the core patch +# coverID - material tag for the cover patches +# steelID - material tag for the reinforcing steel +# numBars - number of reinforcing bars on any given side of the section +# barArea - cross-sectional area of each reinforcing bar +# nfCoreY - number of fibers in the core patch in the y direction +# nfCoreZ - number of fibers in the core patch in the z direction +# nfCoverY - number of fibers in the cover patches with long sides in the y direction +# nfCoverZ - number of fibers in the cover patches with long sides in the z direction +# +# Notes +# The thickness of cover concrete is constant on all sides of the core. +# The number of bars is the same on any given side of the section. +# The reinforcing bars are all the same size. +# The number of fibers in the short direction of the cover patches is set to 1. +# +proc RCsection {id h b cover coreID coverID steelID numBars barArea nfCoreY nfCoreZ nfCoverY nfCoverZ} { + + # The distance from the section z-axis to the edge of the cover concrete + # in the positive y direction + set coverY [expr $h/2.0] + + # The distance from the section y-axis to the edge of the cover concrete + # in the positive z direction + set coverZ [expr $b/2.0] + + # The negative values of the two above + set ncoverY [expr -$coverY] + set ncoverZ [expr -$coverZ] + + # Determine the corresponding values from the respective axes to the + # edge of the core concrete + set coreY [expr $coverY-$cover] + set coreZ [expr $coverZ-$cover] + set ncoreY [expr -$coreY] + set ncoreZ [expr -$coreZ] + + # Define the fiber section + section fiberSec $id { + + # Define the core patch + patch quadr $coreID $nfCoreZ $nfCoreY $ncoreY $coreZ $ncoreY $ncoreZ $coreY $ncoreZ $coreY $coreZ + + # Define the four cover patches + patch quadr $coverID 1 $nfCoverY $ncoverY $coverZ $ncoreY $coreZ $coreY $coreZ $coverY $coverZ + patch quadr $coverID 1 $nfCoverY $ncoreY $ncoreZ $ncoverY $ncoverZ $coverY $ncoverZ $coreY $ncoreZ + patch quadr $coverID $nfCoverZ 1 $ncoverY $coverZ $ncoverY $ncoverZ $ncoreY $ncoreZ $ncoreY $coreZ + patch quadr $coverID $nfCoverZ 1 $coreY $coreZ $coreY $ncoreZ $coverY $ncoverZ $coverY $coverZ + + # Define the steel along constant values of y (in the z direction) + layer straight $steelID $numBars $barArea $ncoreY $coreZ $ncoreY $ncoreZ + layer straight $steelID $numBars $barArea $coreY $coreZ $coreY $ncoreZ + + # Determine the spacing for the remaining bars in the y direction + set spacingY [expr ($coreY-$ncoreY)/($numBars-1)] + + # Avoid double counting bars + set numBars [expr $numBars-2] + + # Define remaining steel in the y direction + layer straight $steelID $numBars $barArea [expr $coreY-$spacingY] $coreZ [expr $ncoreY+$spacingY] $coreZ + layer straight $steelID $numBars $barArea [expr $coreY-$spacingY] $ncoreZ [expr $ncoreY+$spacingY] $ncoreZ + } + +} diff --git a/examples/sensitivity/Example4_Frame3D/tabasfn.txt b/examples/sensitivity/Example4_Frame3D/tabasfn.txt new file mode 100644 index 0000000..33ee0da --- /dev/null +++ b/examples/sensitivity/Example4_Frame3D/tabasfn.txt @@ -0,0 +1,2650 @@ +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 + 0.039111 + 0.020721 + 0.006817 + 0.002312 + 0.001892 + -0.020472 + 0.000274 + 0.010659 + -0.008512 + -0.021337 + -0.002231 + 0.004394 + -0.007486 + -0.014242 + -0.003463 + -0.003988 + -0.005823 + 0.003017 + 0.002218 + 0.006332 + -0.002805 + -0.003581 + -0.004692 + 0.012893 + 0.010481 + 0.012442 + 0.000938 + 0.007371 + 0.000389 + 0.005280 + 0.005902 + 0.002001 + 0.000310 + 0.013582 + -0.009001 + -0.001473 + 0.013379 + -0.010732 + -0.018565 + -0.000781 + 0.002308 + 0.008014 + 0.004017 + 0.002422 + 0.007861 + 0.012894 + 0.009742 + 0.003973 + -0.000090 + -0.004765 + -0.019992 + -0.013673 + 0.002893 + -0.004883 + -0.005742 + 0.010828 + 0.020990 + 0.001961 + -0.024556 + 0.010486 + 0.003709 + -0.015050 + -0.023937 + -0.000803 + -0.007399 + -0.009010 + -0.010597 + 0.016999 + -0.014370 + 0.001925 + 0.002935 + 0.002781 + 0.012646 + -0.003691 + -0.010862 + -0.020614 + -0.005746 + -0.000257 + 0.006813 + 0.012284 + 0.003619 + -0.002576 + 0.006919 + 0.009685 + -0.011437 + 0.004407 + 0.006431 + -0.002540 + -0.004584 + 0.007111 + -0.027356 + -0.005328 + 0.017208 + -0.002041 + -0.010421 + -0.013070 + -0.014828 + 0.011886 + -0.001704 + -0.006635 + -0.007934 + -0.004178 + -0.008478 + -0.010892 + 0.021269 + -0.002046 + -0.018157 + -0.017116 + 0.002706 + -0.010328 + 0.008022 + -0.009211 + 0.008467 + 0.002301 + -0.021840 + -0.016926 + -0.012808 + 0.014505 + 0.003827 + 0.001598 + -0.014121 + -0.005196 + -0.022494 + -0.014024 + -0.017023 + 0.010743 + -0.018687 + -0.019098 + -0.016875 + -0.018694 + -0.025906 + 0.009630 + 0.017747 + 0.004409 + -0.045988 + 0.005305 + 0.035362 + 0.036993 + 0.027709 + -0.031957 + -0.032197 + -0.003922 + 0.048404 + 0.008736 + 0.002682 + 0.000551 + -0.013859 + -0.028045 + -0.002170 + 0.010628 + -0.000532 + 0.012790 + 0.018720 + 0.024333 + -0.000732 + -0.012691 + 0.025118 + -0.000368 + -0.006228 + -0.014420 + -0.017448 + -0.022081 + -0.008285 + -0.014829 + 0.013042 + 0.046602 + 0.000129 + -0.048305 + 0.019722 + 0.024586 + 0.029507 + 0.021071 + -0.002363 + -0.006432 + -0.031529 + 0.011043 + -0.002715 + 0.048045 + 0.019550 + -0.008963 + -0.039589 + -0.005067 + 0.025426 + 0.005635 + 0.037568 + 0.000286 + -0.032120 + -0.023373 + 0.024497 + 0.026294 + 0.003218 + -0.029253 + -0.007752 + -0.024836 + 0.003173 + 0.013209 + -0.017067 + -0.047454 + -0.019143 + -0.017939 + -0.018384 + -0.016813 + -0.007580 + 0.004228 + 0.017299 + -0.006920 + 0.007367 + 0.013121 + -0.014965 + -0.016762 + -0.045267 + -0.065283 + -0.054103 + -0.009394 + -0.000551 + 0.008851 + 0.040112 + 0.050743 + 0.087112 + 0.131376 + 0.175148 + 0.184485 + 0.137951 + 0.168828 + 0.171193 + 0.162946 + 0.144088 + 0.172630 + 0.159368 + 0.193170 + 0.181193 + 0.170958 + 0.160051 + 0.123252 + 0.079707 + 0.031346 + -0.035770 + -0.106983 + -0.174210 + -0.262518 + -0.308869 + -0.356035 + -0.377156 + -0.340408 + -0.290530 + -0.269154 + -0.301427 + -0.327961 + -0.306972 + -0.213486 + -0.178461 + -0.128512 + -0.116891 + -0.131488 + -0.105545 + -0.098141 + 0.116738 + 0.235494 + 0.352059 + 0.381804 + 0.398746 + 0.359103 + 0.290765 + 0.303445 + 0.291865 + 0.270041 + 0.249113 + 0.204689 + 0.124281 + 0.062925 + 0.001256 + -0.009588 + -0.033015 + -0.069855 + -0.120775 + -0.145464 + -0.108797 + -0.099440 + -0.057510 + -0.082255 + -0.108471 + -0.047699 + -0.143690 + -0.152844 + -0.058545 + -0.041427 + -0.082619 + -0.109939 + -0.162722 + -0.088272 + -0.077163 + -0.004275 + -0.072146 + -0.077170 + -0.024670 + -0.022274 + -0.057350 + -0.061498 + -0.136412 + -0.159755 + 0.001269 + 0.050966 + 0.124414 + -0.009992 + 0.033509 + 0.055611 + 0.118899 + 0.065525 + 0.034804 + 0.018414 + 0.031917 + 0.020637 + 0.015784 + 0.016988 + 0.004484 + 0.058926 + 0.076806 + 0.091805 + 0.039337 + -0.007086 + -0.058168 + 0.080381 + 0.138685 + 0.175229 + 0.066153 + 0.063879 + 0.047523 + -0.049654 + -0.141631 + -0.118277 + -0.104485 + -0.144241 + -0.078062 + -0.041576 + -0.013556 + -0.062370 + -0.069794 + -0.006067 + 0.015449 + 0.029916 + -0.030825 + -0.074863 + -0.045976 + -0.029148 + 0.024686 + 0.016225 + 0.130663 + 0.033721 + 0.010156 + -0.000269 + 0.033689 + 0.023991 + 0.036737 + 0.012362 + 0.078101 + 0.019290 + 0.035865 + 0.028203 + -0.033680 + -0.017473 + 0.034976 + -0.015772 + 0.013333 + -0.029899 + -0.106595 + -0.122834 + -0.098904 + -0.102915 + -0.085196 + -0.017766 + -0.143772 + -0.192732 + -0.161295 + -0.194261 + -0.203996 + -0.085089 + -0.087265 + 0.049109 + 0.108226 + 0.147686 + 0.086512 + 0.054144 + 0.021871 + 0.074146 + 0.124434 + 0.138716 + 0.082203 + 0.059261 + 0.119684 + -0.057682 + 0.011914 + -0.049529 + 0.047935 + 0.030086 + 0.037435 + 0.009401 + 0.035895 + 0.103619 + 0.081027 + -0.003784 + 0.010732 + 0.134934 + 0.170714 + 0.218461 + 0.132355 + 0.125923 + 0.196534 + 0.202273 + 0.080404 + -0.009682 + 0.076922 + 0.174128 + 0.248909 + 0.164353 + 0.149358 + 0.073200 + -0.087525 + -0.246565 + -0.331427 + -0.228430 + -0.353078 + -0.214964 + -0.145688 + -0.097593 + -0.117931 + -0.104832 + -0.195087 + -0.025149 + -0.344995 + 0.011434 + -0.152467 + -0.232762 + -0.140907 + -0.066843 + -0.235627 + -0.040808 + -0.066023 + 0.016797 + 0.095335 + 0.042359 + 0.060959 + 0.135311 + 0.079080 + 0.193517 + 0.130336 + 0.343609 + 0.307105 + 0.269694 + 0.150316 + 0.192253 + 0.232844 + 0.120510 + 0.174811 + 0.194546 + 0.222548 + 0.158084 + 0.089629 + 0.195321 + 0.050068 + -0.041530 + -0.046276 + 0.021655 + 0.026765 + -0.053180 + 0.035809 + -0.093820 + -0.047171 + -0.211570 + -0.071622 + -0.143639 + -0.176922 + -0.175484 + -0.187645 + 0.136432 + 0.040712 + -0.019858 + -0.298624 + -0.358033 + 0.070526 + 0.293619 + 0.324271 + -0.012114 + -0.302701 + -0.070126 + 0.146340 + 0.236697 + 0.263558 + 0.388675 + 0.431651 + 0.290571 + -0.025261 + -0.027860 + 0.169001 + 0.114506 + 0.342263 + 0.018696 + -0.486728 + -0.686116 + -0.308114 + 0.171580 + 0.687299 + 0.614842 + 0.292528 + 0.110836 + -0.038717 + -0.316167 + -0.657554 + -0.224699 + 0.102049 + 0.310306 + 0.418277 + 0.329592 + 0.188665 + -0.272314 + -0.622497 + -0.733486 + -0.452283 + -0.257625 + -0.107462 + -0.040398 + -0.160785 + -0.370581 + -0.011156 + 0.405291 + 0.708644 + 0.899949 + 0.717319 + 0.651040 + 0.539276 + 0.272712 + 0.338196 + 0.090428 + -0.351967 + -0.520245 + -0.281916 + -0.101170 + -0.182997 + -0.053701 + -0.057899 + 0.187472 + -0.292110 + -0.725403 + -0.689939 + -0.860632 + -0.086669 + -0.295138 + -0.463812 + -0.219154 + -0.087829 + -0.128247 + -0.196300 + -0.047051 + 0.108909 + -0.143394 + -0.564720 + -0.491407 + -0.384597 + -0.481988 + -0.603629 + -0.703578 + -0.255321 + 0.186636 + 0.119450 + -0.119511 + -0.453323 + -0.359939 + -0.265352 + -0.341855 + -0.098647 + -0.162956 + -0.047323 + 0.296412 + 0.381784 + 0.304689 + 0.469011 + 0.572192 + 0.547085 + 0.410306 + -0.069303 + -0.177350 + -0.355607 + -0.461366 + -0.364077 + -0.373038 + -0.248838 + 0.297747 + 0.529541 + 0.362243 + 0.576218 + 0.072625 + -0.221539 + -0.629368 + -0.480530 + -0.453078 + -0.551213 + 0.314669 + 0.262650 + 0.684699 + 0.615973 + 0.225291 + 0.196086 + 0.196300 + 0.171417 + 0.079473 + 0.024300 + -0.010350 + 0.094190 + 0.250489 + 0.373384 + 0.386198 + 0.324781 + 0.154985 + 0.155291 + 0.314557 + 0.365678 + 0.343558 + 0.347278 + 0.215392 + 0.059267 + 0.071254 + -0.220805 + -0.526463 + -0.607401 + -0.721172 + -0.155515 + 0.067855 + 0.103282 + 0.022142 + -0.168359 + -0.235637 + -0.370163 + -0.442681 + -0.275933 + -0.014457 + 0.179154 + 0.373333 + 0.446748 + 0.302905 + 0.099960 + 0.012074 + -0.064419 + 0.101679 + 0.183129 + 0.080445 + 0.094123 + 0.153670 + 0.375678 + 0.419327 + 0.414414 + 0.388481 + 0.307920 + 0.079518 + -0.118970 + -0.375617 + -0.452813 + -0.464424 + -0.224618 + 0.014815 + 0.286116 + 0.304760 + -0.032498 + -0.061406 + -0.117309 + -0.246646 + -0.438298 + -0.374760 + -0.306626 + -0.312905 + 0.536820 + 0.420928 + 0.043107 + -0.250183 + -0.211284 + -0.297329 + -0.250143 + -0.263578 + 0.170979 + 0.254822 + 0.229653 + 0.070925 + -0.274108 + -0.258665 + -0.243140 + -0.036982 + 0.355056 + 0.502803 + 0.417136 + 0.460183 + 0.366575 + 0.440948 + 0.241957 + -0.056683 + -0.176432 + 0.250826 + 0.270336 + 0.342905 + -0.033065 + -0.139195 + -0.236106 + -0.250316 + -0.263007 + 0.249429 + 0.349572 + 0.203456 + 0.184016 + 0.270561 + 0.121651 + 0.012831 + -0.044773 + 0.041304 + 0.022759 + -0.151753 + -0.238359 + -0.266881 + -0.181233 + -0.028691 + 0.241182 + 0.457757 + 0.464444 + 0.383812 + 0.185953 + -0.037870 + -0.005496 + -0.007702 + -0.016794 + -0.014989 + -0.137910 + -0.173904 + -0.013565 + -0.058820 + -0.122304 + -0.156962 + 0.118471 + 0.170449 + 0.212518 + 0.026426 + -0.127696 + 0.069343 + 0.062972 + -0.057452 + -0.081203 + 0.075774 + -0.123823 + -0.170520 + -0.182446 + -0.207380 + -0.326626 + -0.378909 + -0.259633 + -0.199643 + -0.177635 + 0.046249 + 0.263965 + 0.335545 + 0.170357 + -0.046388 + -0.091240 + -0.284699 + 0.051725 + 0.186045 + 0.199969 + 0.204363 + 0.140133 + 0.042888 + -0.035489 + 0.045687 + 0.086109 + 0.113211 + 0.014484 + -0.091660 + -0.150866 + -0.148022 + -0.138675 + 0.010038 + -0.103496 + -0.027223 + 0.040504 + 0.076689 + 0.137961 + 0.141713 + 0.060287 + 0.046938 + -0.108889 + -0.201825 + -0.265719 + -0.147625 + 0.083380 + 0.151590 + 0.017248 + -0.127482 + -0.034280 + 0.034753 + 0.056994 + 0.109694 + 0.214679 + 0.167808 + 0.159745 + 0.144220 + 0.153914 + -0.016831 + -0.072092 + -0.164924 + -0.326942 + -0.323925 + -0.305963 + -0.257319 + 0.011764 + -0.118502 + -0.127931 + -0.053211 + -0.000312 + -0.046993 + 0.031694 + 0.014554 + -0.065269 + -0.103761 + 0.030740 + -0.077150 + -0.052548 + -0.121600 + -0.177870 + -0.234302 + -0.133894 + -0.074785 + -0.008849 + 0.026518 + -0.156850 + -0.028616 + -0.089800 + -0.113374 + -0.008923 + 0.073095 + 0.135872 + 0.275433 + 0.207421 + 0.115912 + 0.048869 + -0.011062 + -0.067521 + -0.105158 + -0.147452 + -0.136402 + -0.052078 + -0.091636 + -0.082039 + -0.140754 + -0.091379 + -0.137615 + -0.172294 + -0.178695 + -0.092015 + -0.212854 + -0.159755 + -0.127401 + -0.108522 + -0.102732 + -0.126483 + -0.013507 + -0.107034 + -0.021830 + 0.052623 + 0.007739 + 0.120632 + 0.167951 + 0.151193 + 0.094503 + 0.057493 + 0.008607 + 0.167829 + 0.048567 + -0.008000 + -0.057520 + -0.091712 + 0.001849 + 0.075225 + 0.095505 + 0.023301 + 0.093350 + 0.056537 + -0.073781 + -0.087846 + -0.160071 + -0.060078 + -0.162742 + -0.237859 + -0.052433 + 0.123272 + 0.086267 + 0.001306 + 0.099465 + 0.137645 + 0.145413 + 0.009793 + -0.069209 + -0.105423 + -0.154995 + -0.313731 + -0.162222 + -0.076973 + 0.071954 + 0.032032 + -0.042135 + -0.028910 + 0.087582 + 0.120938 + -0.028147 + -0.028933 + 0.004432 + 0.018129 + 0.066913 + -0.041016 + -0.043837 + 0.073368 + 0.021167 + -0.020541 + -0.026007 + -0.036207 + -0.041485 + -0.163476 + -0.199256 + -0.197503 + 0.000949 + -0.004702 + 0.102640 + 0.179195 + 0.148756 + 0.122793 + 0.174261 + 0.215892 + 0.249796 + 0.238991 + 0.255790 + 0.257268 + 0.301753 + 0.204190 + 0.117339 + 0.144740 + 0.137034 + 0.048327 + 0.009834 + 0.066676 + 0.051545 + 0.048091 + 0.139021 + 0.174506 + 0.196595 + 0.193751 + 0.155331 + 0.099533 + 0.101005 + 0.029224 + -0.022792 + -0.026859 + -0.107482 + -0.174781 + -0.146728 + -0.118145 + -0.153986 + -0.123364 + -0.095519 + -0.195036 + -0.101399 + -0.001341 + -0.028356 + -0.100220 + 0.026416 + 0.088151 + 0.139704 + 0.046994 + -0.012887 + 0.037821 + 0.102905 + 0.024750 + -0.105433 + 0.030431 + 0.166259 + 0.055111 + 0.149796 + 0.215250 + 0.211672 + 0.022427 + -0.012013 + -0.084470 + -0.140673 + -0.159623 + -0.019948 + 0.076608 + -0.011520 + -0.064773 + 0.058118 + 0.076436 + -0.103282 + -0.030075 + 0.051211 + 0.103639 + 0.093844 + 0.102375 + -0.005688 + -0.039282 + -0.041654 + -0.139694 + -0.008398 + 0.128471 + 0.134363 + 0.163252 + 0.306575 + 0.173782 + 0.062073 + 0.121478 + 0.196616 + 0.135617 + 0.154444 + 0.100439 + 0.100762 + 0.108287 + -0.147829 + -0.444709 + -0.312722 + -0.067844 + -0.036847 + 0.038976 + 0.112864 + 0.030768 + -0.040841 + 0.070096 + -0.001604 + -0.042061 + -0.043938 + 0.028760 + -0.076998 + -0.038099 + -0.026200 + -0.141641 + -0.188349 + -0.171203 + -0.193445 + -0.187706 + -0.003683 + 0.097273 + -0.037849 + -0.137125 + -0.052203 + -0.109888 + -0.061603 + 0.037013 + 0.005244 + -0.050064 + -0.099376 + 0.009685 + 0.118186 + 0.019043 + -0.181855 + -0.139725 + -0.106616 + -0.131600 + -0.033925 + 0.005724 + 0.049634 + 0.093493 + -0.044086 + 0.032248 + 0.100323 + 0.034285 + 0.094192 + 0.131060 + 0.192345 + 0.092695 + -0.007182 + -0.093154 + -0.195984 + -0.108940 + -0.035211 + -0.074757 + -0.005350 + 0.009954 + 0.003767 + -0.156137 + -0.096466 + -0.069236 + -0.137574 + -0.171947 + -0.120336 + -0.083747 + 0.067023 + 0.132661 + 0.202477 + 0.120510 + 0.038166 + 0.036456 + -0.004555 + -0.145525 + -0.170744 + 0.231784 + 0.103823 + 0.070947 + 0.129419 + 0.081346 + -0.015992 + -0.108960 + -0.126809 + 0.022523 + -0.019546 + 0.032718 + 0.069983 + 0.093789 + 0.106636 + 0.126351 + -0.066627 + 0.000855 + -0.055747 + -0.025293 + 0.003253 + 0.037803 + -0.011941 + 0.079239 + 0.094864 + 0.046721 + -0.007778 + 0.008788 + 0.012192 + 0.056187 + 0.043639 + 0.022121 + -0.022078 + -0.055146 + -0.080204 + -0.031382 + -0.137146 + -0.136922 + -0.045613 + -0.003512 + -0.160112 + -0.168155 + -0.118869 + -0.100147 + -0.047876 + -0.056582 + -0.062314 + 0.035437 + 0.044417 + 0.009800 + 0.029060 + 0.076498 + 0.028382 + 0.014331 + -0.003815 + -0.015768 + -0.028636 + -0.228308 + -0.199001 + -0.159195 + 0.017567 + 0.027208 + 0.017652 + 0.015601 + -0.071535 + -0.034677 + -0.007412 + -0.006814 + 0.007892 + -0.051703 + -0.089217 + -0.017477 + 0.013241 + 0.067027 + 0.063484 + 0.053517 + 0.095979 + 0.076126 + 0.102100 + 0.118349 + 0.139969 + 0.061419 + -0.006392 + -0.038583 + -0.050510 + -0.123802 + -0.175657 + -0.163710 + -0.093617 + -0.026756 + 0.033264 + 0.016495 + -0.061578 + -0.105382 + -0.106014 + -0.156962 + -0.074127 + -0.019011 + 0.025310 + 0.059139 + 0.072899 + 0.043657 + 0.012735 + 0.105821 + 0.127717 + 0.104506 + 0.149032 + 0.114546 + 0.079988 + 0.050977 + 0.125566 + 0.126167 + 0.068820 + 0.051598 + 0.109980 + 0.140683 + 0.059135 + 0.027211 + 0.130968 + 0.117533 + 0.066747 + 0.015517 + 0.054552 + 0.065141 + 0.075331 + 0.075767 + 0.093639 + 0.065254 + 0.038686 + 0.021096 + 0.041526 + 0.024736 + -0.036221 + -0.046501 + -0.050667 + -0.104557 + -0.151081 + -0.157197 + -0.107370 + -0.049686 + -0.015254 + -0.082043 + -0.111213 + -0.089565 + -0.175821 + -0.215403 + -0.158654 + -0.077969 + 0.006333 + 0.027590 + -0.050024 + -0.033497 + -0.029232 + 0.009327 + 0.041751 + 0.044078 + 0.026563 + -0.015772 + -0.065108 + -0.058823 + -0.073383 + -0.060529 + 0.002483 + 0.047838 + 0.082355 + 0.023294 + 0.023373 + 0.022022 + 0.047772 + 0.069283 + 0.076305 + 0.092171 + 0.113262 + 0.084327 + 0.062458 + 0.044058 + 0.042100 + -0.002024 + -0.023433 + -0.038196 + 0.032061 + 0.072326 + 0.075138 + 0.070932 + 0.010660 + 0.011550 + 0.067429 + 0.043163 + 0.025057 + 0.012651 + 0.068298 + 0.021713 + 0.056326 + 0.078205 + 0.090960 + 0.066288 + 0.031508 + 0.036686 + 0.098039 + 0.108522 + 0.052919 + 0.009211 + -0.083293 + -0.146330 + -0.175800 + -0.118665 + -0.079890 + -0.015298 + 0.010402 + 0.003892 + -0.047460 + -0.048444 + -0.051018 + -0.074998 + -0.042911 + -0.020900 + 0.002023 + -0.011619 + -0.044440 + -0.087844 + -0.114383 + -0.147808 + -0.157523 + -0.086423 + -0.087354 + -0.015556 + 0.002777 + 0.003832 + 0.058001 + 0.086440 + 0.087914 + 0.094621 + 0.097970 + 0.072089 + 0.021785 + -0.026924 + -0.061580 + -0.002855 + 0.011323 + 0.023597 + 0.102824 + 0.068591 + 0.032187 + 0.010773 + -0.010019 + -0.033713 + -0.058495 + -0.103435 + -0.023164 + -0.066960 + -0.036417 + 0.025857 + 0.097967 + 0.078336 + 0.105872 + 0.080774 + 0.071465 + 0.059013 + 0.015968 + 0.008507 + 0.013383 + -0.014224 + -0.038498 + -0.055303 + -0.044678 + -0.031882 + 0.004722 + 0.044262 + 0.107350 + 0.073371 + 0.024613 + -0.011191 + -0.021784 + 0.004518 + 0.032109 + 0.041800 + 0.055599 + 0.058451 + 0.064470 + 0.042377 + 0.007327 + -0.056415 + -0.100759 + -0.103833 + -0.078770 + -0.054549 + -0.042257 + -0.023528 + 0.045260 + 0.015570 + -0.034793 + -0.104434 + -0.075873 + -0.036231 + 0.022990 + 0.063875 + 0.071784 + 0.057751 + -0.005763 + -0.016399 + -0.037505 + -0.036064 + -0.010712 + 0.003824 + -0.016895 + -0.025722 + 0.020346 + -0.010860 + -0.041421 + -0.057419 + -0.046075 + -0.069735 + -0.032924 + 0.015204 + -0.025597 + -0.036577 + -0.016726 + -0.019367 + -0.005584 + 0.034379 + 0.013785 + 0.017863 + 0.013388 + 0.018508 + 0.023944 + 0.006583 + 0.036916 + 0.057120 + 0.009286 + 0.018727 + 0.030051 + 0.031405 + 0.077003 + 0.116636 + 0.129307 + 0.041883 + -0.024390 + -0.070608 + -0.039562 + -0.022862 + -0.012159 + 0.020378 + 0.042545 + 0.016975 + 0.041701 + 0.048351 + 0.021586 + -0.033032 + -0.067891 + -0.045158 + -0.065126 + -0.065761 + -0.041995 + -0.057669 + -0.013881 + 0.034626 + 0.051676 + 0.047854 + 0.020923 + -0.031261 + -0.048945 + -0.031894 + -0.016202 + 0.035530 + 0.067798 + 0.073697 + -0.002635 + -0.056733 + -0.052856 + -0.042477 + -0.026482 + -0.067647 + -0.088886 + -0.055807 + -0.085047 + -0.067691 + -0.051331 + -0.031052 + 0.001525 + -0.015068 + -0.017227 + -0.008572 + -0.038635 + -0.084576 + -0.083978 + -0.060216 + -0.020946 + 0.008487 + 0.050624 + 0.009337 + -0.029518 + -0.005324 + -0.023650 + -0.044716 + -0.076365 + -0.007662 + 0.020962 + -0.016203 + 0.033554 + 0.081834 + 0.062144 + -0.006565 + -0.003044 + -0.002181 + 0.000537 + -0.020345 + 0.004426 + 0.008349 + -0.007883 + -0.020649 + 0.016610 + 0.023743 + 0.029158 + 0.043104 + 0.054267 + 0.018186 + 0.052276 + 0.025302 + 0.011330 + 0.004116 + -0.005690 + -0.033423 + 0.000726 + 0.031348 + 0.016494 + -0.012296 + -0.040665 + -0.078706 + -0.114251 + -0.072708 + -0.028077 + 0.029728 + 0.035439 + 0.038540 + 0.025610 + 0.023472 + 0.023619 + -0.002980 + -0.017647 + -0.017479 + 0.002616 + -0.011630 + -0.023490 + 0.009113 + 0.056680 + 0.029826 + 0.032576 + 0.019506 + 0.047173 + 0.027879 + 0.024119 + 0.040262 + 0.045312 + 0.030519 + 0.005363 + 0.022626 + 0.040653 + 0.055696 + 0.029920 + 0.005213 + 0.039814 + 0.048768 + 0.054648 + 0.093056 + 0.113782 + 0.117462 + 0.106809 + 0.106096 + 0.072497 + 0.040964 + 0.033844 + 0.063696 + 0.055259 + 0.020357 + 0.019474 + 0.037919 + 0.011778 + 0.014968 + -0.009536 + -0.040511 + -0.066357 + -0.082215 + -0.058779 + -0.076754 + -0.087859 + -0.058986 + -0.054362 + -0.062783 + -0.055639 + -0.032851 + -0.007216 + -0.013790 + -0.018162 + 0.037853 + 0.056589 + 0.083281 + 0.037675 + 0.039318 + 0.076871 + 0.077091 + 0.035913 + -0.004916 + -0.016541 + 0.034521 + -0.001723 + -0.026197 + 0.036124 + -0.003540 + -0.035501 + -0.068181 + -0.009512 + 0.015161 + -0.006683 + -0.020459 + -0.010394 + 0.007961 + -0.041321 + -0.058203 + -0.016811 + -0.011825 + -0.033569 + -0.043904 + -0.052306 + -0.050786 + -0.019385 + 0.011343 + 0.026826 + 0.044612 + 0.015993 + -0.013740 + -0.035098 + -0.045822 + -0.063248 + -0.083806 + -0.086300 + -0.051752 + -0.018104 + 0.025759 + -0.003672 + 0.021238 + -0.002926 + -0.018366 + -0.012524 + -0.016962 + -0.018017 + -0.028374 + -0.023320 + 0.008641 + 0.002835 + 0.017326 + 0.045757 + 0.058078 + 0.069290 + 0.079137 + 0.066770 + 0.033965 + 0.005042 + -0.013636 + -0.032129 + -0.020919 + -0.028114 + -0.010556 + -0.033478 + -0.053445 + -0.030688 + -0.005873 + -0.001461 + -0.038793 + -0.043549 + -0.001628 + 0.010707 + -0.010483 + -0.029006 + -0.008773 + -0.002854 + -0.022934 + 0.017917 + 0.056833 + -0.005002 + -0.054931 + -0.025757 + -0.049508 + -0.053409 + -0.014346 + 0.003953 + -0.013992 + -0.040462 + 0.004558 + -0.020467 + -0.046136 + -0.019781 + -0.000217 + -0.029716 + -0.014020 + -0.000848 + -0.021326 + -0.048483 + -0.011217 + 0.020051 + -0.002140 + 0.003464 + 0.013518 + 0.012771 + 0.008650 + 0.014326 + -0.002157 + -0.034508 + -0.053350 + -0.007765 + -0.031727 + -0.046620 + 0.003020 + -0.010608 + -0.032567 + 0.001895 + 0.050644 + 0.066931 + 0.035718 + 0.015223 + -0.005863 + -0.012839 + 0.019259 + 0.022932 + 0.033044 + 0.035408 + 0.015813 + 0.017231 + 0.017197 + -0.015773 + -0.050730 + 0.005802 + 0.019937 + -0.004291 + -0.031915 + 0.011627 + -0.001227 + -0.017841 + 0.014968 + 0.018124 + 0.006740 + 0.003971 + 0.005701 + 0.000827 + -0.001675 + 0.005911 + 0.008491 + 0.005916 + 0.046723 + 0.060181 + 0.028510 + -0.045521 + 0.028623 + 0.043863 + 0.053627 + 0.053582 + 0.063193 + 0.056608 + 0.045666 + 0.041114 + 0.039787 + 0.027554 + 0.017338 + 0.010575 + -0.001874 + 0.024137 + 0.033880 + 0.019212 + -0.007682 + -0.013231 + 0.016068 + 0.036486 + 0.053945 + 0.074255 + 0.053282 + 0.019357 + -0.013485 + -0.041673 + -0.042003 + -0.017598 + -0.001804 + 0.033224 + 0.030990 + 0.024654 + 0.008032 + 0.005284 + -0.004522 + -0.014404 + -0.030457 + -0.041029 + -0.027388 + -0.028574 + -0.014360 + -0.018947 + -0.040265 + -0.039012 + -0.037664 + -0.036119 + -0.039295 + -0.014821 + 0.000400 + 0.016283 + 0.026870 + 0.030739 + -0.004081 + -0.021497 + -0.040909 + -0.003094 + 0.008426 + -0.026028 + -0.028854 + -0.017707 + -0.013376 + -0.038896 + -0.047269 + 0.009861 + 0.017204 + -0.007023 + -0.018081 + -0.025305 + -0.029060 + -0.019809 + 0.021673 + 0.002065 + 0.014695 + -0.009179 + -0.027981 + -0.029349 + 0.014256 + -0.004569 + -0.032391 + -0.008585 + 0.000069 + 0.008017 + -0.003328 + -0.000803 + 0.015121 + 0.025406 + 0.029369 + 0.029820 + 0.024485 + 0.003407 + -0.002535 + 0.006645 + -0.005169 + -0.004042 + 0.015451 + -0.014648 + -0.012364 + 0.005655 + 0.005139 + -0.002250 + -0.012358 + 0.001279 + -0.007537 + -0.022348 + -0.020320 + -0.032514 + -0.023199 + -0.025240 + 0.001344 + 0.024710 + 0.026138 + 0.003277 + -0.049568 + -0.007155 + 0.013404 + 0.015721 + 0.017310 + 0.015004 + 0.011124 + -0.032345 + -0.039494 + -0.004257 + -0.001527 + -0.008562 + -0.007340 + 0.016033 + -0.004483 + -0.015831 + 0.020728 + 0.033897 + 0.024377 + 0.011754 + -0.002276 + -0.001541 + -0.003329 + 0.012053 + 0.021037 + 0.032600 + 0.029040 + 0.000149 + -0.004889 + 0.029737 + 0.034541 + 0.020600 + 0.027440 + 0.045158 + 0.042948 + 0.041220 + 0.016327 + 0.000843 + -0.006819 + -0.015308 + -0.011183 + 0.013178 + 0.016423 + 0.010663 + -0.008568 + -0.023109 + -0.035154 + -0.007333 + 0.010948 + -0.016741 + 0.002593 + -0.048971 + -0.007592 + -0.016932 + -0.030298 + -0.004516 + 0.002444 + -0.026769 + -0.003351 + 0.016580 + -0.005003 + -0.018390 + 0.018258 + 0.033507 + -0.012383 + -0.037435 + 0.011324 + 0.042822 + -0.003473 + -0.006638 + 0.037917 + -0.001134 + -0.053002 + -0.016469 + 0.001934 + 0.003404 + 0.012726 + -0.034890 + -0.003327 + -0.012316 + -0.010547 + -0.028311 + -0.024947 + -0.014793 + -0.026375 + -0.025951 + -0.008495 + -0.009711 + -0.016891 + -0.020024 + -0.014000 + 0.003707 + 0.008204 + 0.021693 + 0.029959 + 0.031965 + 0.031204 + 0.007836 + -0.012545 + 0.011817 + 0.018210 + 0.019269 + 0.014105 + 0.007920 + -0.004285 + -0.007251 + 0.017852 + 0.036418 + 0.038445 + 0.010783 + 0.029331 + 0.013653 + -0.003411 + -0.004344 + 0.034119 + 0.026496 + 0.006795 + -0.010330 + 0.004801 + -0.015056 + -0.022177 + -0.018344 + -0.007532 + -0.023291 + -0.036994 + -0.042691 + -0.013535 + -0.001607 + -0.002099 + 0.017726 + -0.003494 + -0.024001 + -0.025075 + 0.032456 + 0.019593 + 0.005334 + -0.014649 + -0.017440 + -0.010048 + 0.009559 + 0.013135 + 0.003326 + -0.012928 + -0.012424 + 0.010494 + -0.000991 + -0.002290 + -0.006390 + -0.012203 + -0.014695 + 0.002510 + 0.003787 + 0.007629 + 0.011978 + -0.001940 + 0.006148 + 0.001617 + -0.010439 + -0.013936 + -0.023310 + -0.023948 + -0.041009 + -0.044430 + -0.015719 + -0.005748 + 0.016099 + 0.019723 + 0.007874 + -0.004504 + -0.004704 + -0.002538 + -0.002873 + 0.011458 + 0.015873 + 0.015601 + 0.004002 + 0.006556 + -0.008968 + -0.033339 + -0.033555 + -0.001389 + -0.007583 + 0.007572 + 0.021203 + 0.015558 + 0.010131 + 0.015363 + 0.010693 + -0.014784 + 0.006038 + 0.007560 + 0.010386 + 0.000989 + 0.023175 + 0.020634 + -0.005950 + -0.024650 + -0.006283 + -0.000728 + -0.013198 + 0.017200 + 0.030000 + 0.005432 + 0.021594 + 0.007746 + 0.005397 + -0.000306 + 0.001190 + -0.001995 + -0.005928 + 0.008771 + 0.007633 + 0.013494 + 0.015188 + -0.007707 + -0.014474 + -0.018525 + -0.022463 + -0.023776 + -0.002822 + 0.002941 + 0.006718 + -0.008374 + -0.021307 + -0.008355 + -0.007557 + 0.000955 + 0.003993 + -0.004973 + -0.007514 + -0.004669 + -0.014972 + 0.005769 + 0.011165 + 0.013439 + 0.014550 + 0.014571 + 0.025823 + 0.030748 + 0.037011 + 0.035561 + 0.028966 + 0.035151 + 0.015112 + 0.013688 + 0.003594 + -0.008339 + 0.008065 + 0.016167 + 0.024650 + 0.013074 + -0.003182 + -0.007472 + -0.011081 + -0.012804 + 0.004544 + 0.014298 + 0.026118 + 0.017833 + 0.015528 + 0.005821 + -0.004178 + 0.003714 + 0.005094 + 0.006883 + -0.011456 + -0.023802 + -0.005925 + 0.013976 + 0.016089 + 0.000349 + 0.000849 + 0.010331 + -0.025152 + -0.043318 + -0.023111 + 0.015391 + 0.027211 + 0.027167 + 0.033771 + 0.022399 + -0.001898 + -0.033469 + 0.009702 + 0.014720 + -0.012940 + -0.003861 + -0.006972 + -0.025154 + -0.017941 + 0.004852 + 0.011182 + 0.010746 + -0.009773 + -0.011058 + -0.055860 + -0.012263 + 0.008305 + -0.006055 + -0.020268 + -0.034747 + -0.011668 + -0.012598 + -0.002544 + 0.006929 + 0.015832 + -0.004422 + -0.014268 + -0.002783 + -0.003988 + -0.020113 + -0.028392 + -0.027427 + -0.029002 + -0.031352 + 0.006536 + 0.011253 + -0.013932 + -0.024177 + -0.010565 + -0.015344 + -0.025328 + -0.022087 + -0.002761 + -0.007706 + -0.023494 + -0.009083 + 0.000648 + -0.015915 + -0.015028 + 0.014420 + -0.002896 + -0.004518 + -0.005220 + -0.010227 + -0.015331 + -0.019491 + -0.016548 + -0.002976 + -0.000329 + 0.002365 + 0.013643 + 0.012321 + -0.004895 + 0.008985 + -0.010293 + 0.012271 + 0.014856 + 0.014425 + -0.001056 + 0.012359 + 0.015461 + -0.000115 + -0.000583 + 0.010194 + 0.021167 + 0.021998 + -0.000965 + -0.005496 + 0.013065 + -0.001187 + -0.010613 + -0.009597 + -0.013731 + -0.016173 + 0.001072 + 0.011193 + 0.013220 + 0.015022 + 0.019877 + 0.022815 + 0.024710 + 0.027330 + 0.024871 + 0.004238 + 0.011525 + 0.009721 + -0.003439 + 0.001993 + 0.020768 + 0.009924 + 0.005519 + -0.009100 + -0.003941 + -0.002184 + 0.001502 + 0.003833 + 0.024361 + -0.005073 + -0.007026 + -0.008372 + 0.019068 + 0.002294 + -0.013437 + 0.002412 + 0.014840 + -0.005842 + -0.026597 + 0.021013 + 0.006743 + 0.005830 + 0.016269 + 0.017200 + 0.000671 + 0.002241 + 0.008651 + 0.008302 + 0.007320 + 0.024359 + 0.021381 + 0.008765 + -0.012801 + -0.021726 + -0.027662 + -0.005940 + -0.005213 + 0.014234 + -0.012244 + -0.021324 + -0.027314 + 0.010217 + 0.013427 + 0.014320 + 0.032383 + 0.008849 + -0.015149 + -0.025162 + -0.028475 + 0.019320 + 0.000902 + -0.003669 + -0.005742 + -0.011587 + -0.012646 + -0.008809 + 0.004350 + 0.002190 + 0.006747 + 0.005214 + -0.008487 + -0.012935 + -0.020476 + -0.022210 + 0.010781 + -0.014477 + -0.018637 + -0.011285 + -0.011127 + -0.015421 + 0.010350 + 0.008767 + -0.000776 + -0.007482 + -0.008466 + -0.011842 + -0.003054 + 0.004872 + 0.006075 + 0.004227 + 0.012495 + -0.021083 + 0.003934 + -0.013273 + -0.012876 + -0.019609 + -0.022627 + -0.024238 + 0.008892 + -0.000260 + -0.003429 + -0.012494 + -0.022408 + 0.034893 + 0.054328 + 0.032463 + -0.018276 + -0.082522 + -0.102579 + -0.090115 + -0.074962 + 0.079671 + 0.129276 + 0.172895 + 0.095551 + -0.017975 + -0.089738 + -0.214689 + -0.050396 + 0.070164 + 0.126585 + -0.007385 + -0.074940 + -0.092749 + -0.043188 + 0.048227 + 0.066080 + 0.079114 + -0.021329 + -0.084028 + 0.000893 + 0.054131 + -0.018416 + -0.042860 + 0.054142 + 0.085919 + 0.008869 + -0.052214 + -0.033681 + -0.045217 + 0.047063 + 0.090137 + 0.041938 + -0.014060 + -0.048531 + 0.007518 + 0.060107 + 0.062648 + 0.030882 + 0.002372 + -0.019043 + 0.006582 + 0.007377 + 0.034511 + 0.049556 + 0.038559 + 0.014408 + -0.018148 + -0.033255 + 0.032834 + 0.044217 + 0.030917 + 0.028418 + 0.028761 + 0.020162 + -0.012076 + -0.015109 + 0.032537 + 0.038522 + 0.021144 + 0.018208 + 0.012173 + -0.006160 + -0.005491 + 0.012748 + -0.045319 + -0.007934 + -0.004991 + 0.019863 + 0.017161 + -0.004201 + -0.010621 + 0.003114 + 0.003188 + 0.007643 + 0.011875 + -0.005524 + 0.005585 + 0.003023 + -0.022600 + -0.023392 + -0.014510 + -0.014338 + -0.024029 + -0.020453 + -0.005695 + 0.000037 + -0.016632 + 0.002545 + 0.003467 + 0.001339 + -0.016318 + -0.015353 + -0.001139 + -0.001934 + -0.016754 + -0.024151 + -0.025583 + -0.018039 + -0.020020 + -0.018399 + -0.015317 + 0.004600 + 0.002959 + -0.014402 + -0.014648 + -0.016131 + -0.018241 + -0.006837 + -0.010438 + -0.034463 + -0.030231 + -0.028613 + 0.002609 + 0.006281 + 0.007750 + -0.007204 + -0.015136 + -0.017705 + -0.015166 + -0.006850 + -0.002943 + -0.003614 + -0.012378 + -0.016256 + -0.020370 + -0.017174 + -0.015021 + -0.004130 + 0.003587 + 0.006845 + 0.010967 + 0.011091 + 0.008649 + 0.009789 + 0.011678 + 0.028127 + -0.003550 + 0.012170 + -0.044054 + -0.008804 + 0.009883 + 0.021507 + 0.010752 + 0.002207 + 0.016082 + 0.007191 + 0.001818 + 0.000923 + 0.003907 + 0.004450 + 0.007865 + 0.026414 + 0.036310 + 0.024653 + 0.015856 + 0.004974 + 0.002848 + 0.001790 + -0.005688 + -0.014812 + 0.002122 + 0.011755 + -0.004132 + -0.009295 + 0.005431 + 0.004970 diff --git a/examples/sensitivity/Example4_Frame3D/tabasfp.txt b/examples/sensitivity/Example4_Frame3D/tabasfp.txt new file mode 100644 index 0000000..915c976 --- /dev/null +++ b/examples/sensitivity/Example4_Frame3D/tabasfp.txt @@ -0,0 +1,2650 @@ +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 +0 + 0.001671 + 0.004522 + 0.007273 + 0.011084 + 0.013535 + 0.016016 + 0.014438 + 0.019753 + 0.008629 + 0.010548 + 0.011991 + 0.010081 + 0.012900 + 0.020563 + 0.016712 + 0.010919 + 0.003187 + 0.019663 + 0.007816 + 0.014018 + 0.007996 + 0.006578 + 0.017033 + 0.007410 + 0.008102 + 0.013939 + 0.018259 + 0.015160 + 0.009510 + 0.001469 + 0.007303 + 0.009051 + 0.006846 + 0.003066 + 0.009247 + 0.025833 + 0.013510 + -0.007108 + 0.002841 + -0.015910 + -0.018369 + -0.016946 + -0.014352 + -0.008729 + -0.015405 + -0.016683 + -0.015249 + -0.029263 + -0.018248 + 0.001474 + 0.023929 + -0.004851 + -0.015266 + -0.002194 + 0.005957 + -0.011881 + -0.021527 + -0.009363 + -0.010277 + -0.011081 + -0.006405 + -0.000185 + 0.005941 + 0.000375 + -0.012417 + -0.008105 + -0.004110 + -0.007908 + -0.007619 + -0.013753 + -0.013399 + -0.013165 + -0.018215 + -0.008074 + 0.003284 + -0.008523 + -0.022037 + -0.010744 + -0.006341 + -0.006694 + -0.010840 + -0.009212 + -0.007478 + -0.024473 + -0.007068 + 0.003593 + 0.006774 + -0.013482 + -0.020006 + -0.007800 + 0.016844 + -0.010525 + 0.004232 + 0.008898 + 0.008792 + -0.003050 + -0.005118 + -0.000476 + -0.009489 + -0.018497 + -0.018314 + 0.004210 + -0.006401 + -0.007796 + 0.006303 + -0.003280 + -0.016206 + 0.002455 + 0.005920 + -0.000870 + -0.009097 + -0.013297 + 0.005953 + -0.010902 + -0.023379 + 0.004616 + 0.025286 + -0.005692 + -0.021219 + -0.014017 + -0.037771 + 0.012924 + -0.044862 + -0.004671 + -0.007999 + -0.032191 + -0.005535 + 0.000692 + 0.022443 + 0.033759 + 0.015607 + -0.022483 + -0.041573 + -0.036766 + 0.043033 + 0.054914 + 0.050652 + 0.008440 + -0.032084 + -0.061386 + -0.023469 + 0.025478 + 0.013804 + -0.001009 + -0.011630 + -0.015191 + 0.031202 + 0.066511 + 0.038445 + 0.012506 + -0.018593 + -0.029207 + -0.009944 + 0.012591 + 0.029479 + -0.004823 + -0.040817 + -0.048766 + -0.026361 + 0.000745 + 0.030377 + 0.029180 + -0.005571 + -0.052875 + -0.023735 + -0.019306 + 0.021259 + 0.016345 + -0.019153 + -0.008293 + -0.009197 + -0.023571 + -0.022456 + 0.001760 + 0.022253 + 0.004124 + 0.006432 + 0.003371 + -0.012086 + -0.033825 + 0.024010 + 0.039734 + 0.018225 + 0.008738 + -0.025190 + -0.030007 + -0.036351 + 0.003730 + 0.001486 + -0.012355 + -0.008556 + -0.030035 + -0.025191 + -0.021753 + -0.031311 + -0.036491 + 0.000020 + 0.016666 + -0.047900 + -0.050880 + -0.054273 + -0.059097 + -0.028626 + -0.000652 + -0.015970 + -0.012202 + -0.032565 + -0.021840 + -0.002164 + -0.017590 + -0.026874 + -0.034356 + -0.055595 + -0.091584 + -0.060195 + -0.028222 + 0.028597 + 0.032848 + 0.026248 + 0.050041 + 0.095084 + 0.124292 + 0.154740 + 0.142610 + 0.136860 + 0.103048 + 0.056002 + 0.078356 + 0.150499 + 0.188542 + 0.170724 + 0.146758 + 0.121244 + 0.105994 + 0.128991 + 0.140948 + 0.158287 + 0.095135 + 0.050052 + -0.038726 + -0.029035 + -0.043255 + -0.080349 + -0.107757 + -0.080010 + -0.123996 + -0.164506 + -0.172008 + -0.091092 + -0.073175 + -0.073158 + -0.116228 + -0.131906 + -0.092414 + -0.067247 + 0.036539 + 0.008105 + -0.009039 + -0.011831 + 0.095148 + 0.152854 + 0.181193 + 0.197808 + 0.131784 + 0.041584 + -0.048716 + -0.096579 + -0.070459 + -0.049796 + -0.035327 + -0.049017 + -0.085378 + -0.053982 + -0.097466 + -0.144546 + -0.227737 + -0.231417 + -0.196656 + -0.116412 + -0.109735 + -0.072594 + -0.076719 + -0.085865 + -0.110082 + -0.166167 + -0.122589 + 0.031033 + 0.041454 + 0.075845 + 0.160856 + 0.154679 + 0.099107 + 0.109745 + 0.108736 + 0.216962 + 0.222946 + 0.173374 + 0.175036 + 0.120224 + 0.069377 + -0.016731 + -0.031381 + 0.029775 + -0.003595 + -0.077404 + -0.141142 + -0.160408 + -0.082474 + -0.033581 + -0.017736 + 0.015907 + 0.043157 + -0.046832 + -0.049284 + -0.006682 + -0.010143 + -0.034994 + -0.068916 + -0.075814 + -0.051448 + -0.101153 + -0.062814 + -0.011065 + 0.036418 + 0.057548 + 0.068029 + 0.023274 + -0.006277 + -0.002597 + 0.023444 + 0.032290 + 0.060258 + 0.089022 + 0.054490 + 0.021967 + 0.062810 + 0.042321 + 0.040161 + -0.062676 + -0.145413 + -0.150326 + -0.148603 + -0.099930 + -0.038857 + -0.012471 + 0.033570 + 0.005787 + -0.030203 + -0.073667 + -0.105770 + -0.137594 + -0.056004 + 0.014332 + 0.101139 + 0.053757 + 0.097930 + -0.023046 + -0.092421 + -0.141162 + -0.064784 + -0.037737 + -0.052567 + -0.120795 + -0.095146 + -0.081760 + -0.033871 + 0.009872 + -0.009292 + 0.061976 + -0.022407 + -0.087318 + -0.009005 + 0.014009 + 0.022989 + 0.127594 + 0.107054 + 0.119185 + 0.086458 + -0.026355 + 0.001154 + 0.016037 + -0.035421 + 0.068516 + 0.134577 + 0.198033 + 0.195250 + 0.211427 + 0.129174 + 0.185790 + 0.236442 + 0.101650 + 0.113394 + 0.135423 + 0.093852 + 0.052904 + 0.201539 + 0.261764 + 0.172783 + 0.036551 + -0.047894 + 0.045721 + 0.039020 + -0.014376 + 0.075701 + -0.156116 + -0.292467 + -0.398756 + -0.416014 + -0.081131 + 0.081956 + -0.067285 + -0.105392 + -0.092034 + -0.155209 + -0.005898 + 0.113833 + 0.240418 + 0.340612 + 0.211774 + -0.079661 + 0.131305 + 0.181223 + 0.127829 + -0.032832 + 0.018562 + -0.075353 + 0.089114 + -0.023907 + 0.165963 + 0.132069 + 0.080122 + 0.149450 + 0.094853 + 0.140438 + 0.134638 + 0.215260 + 0.076782 + -0.200866 + -0.101358 + -0.107686 + -0.118359 + 0.026394 + 0.232671 + -0.041724 + -0.160938 + -0.118736 + -0.128043 + 0.055809 + 0.008013 + -0.024766 + 0.025858 + -0.284230 + -0.376575 + -0.301274 + -0.382936 + 0.029650 + 0.219592 + 0.089082 + 0.183456 + 0.114822 + 0.158502 + 0.139021 + 0.211478 + 0.161876 + 0.242161 + 0.095805 + -0.017721 + 0.009385 + -0.021353 + 0.083618 + 0.228603 + 0.286402 + 0.250714 + 0.066054 + 0.144975 + -0.057146 + 0.133792 + 0.326524 + 0.220714 + 0.088229 + 0.205617 + 0.110510 + 0.013020 + -0.104618 + -0.107859 + -0.177982 + -0.221162 + -0.221305 + -0.291682 + -0.339246 + -0.391682 + -0.305087 + -0.156779 + -0.137319 + -0.046915 + 0.230928 + 0.161335 + 0.013390 + -0.339032 + -0.148400 + 0.226881 + 0.367696 + 0.514536 + 0.634353 + 0.560224 + 0.292192 + -0.383089 + 0.059441 + 0.377023 + 0.266850 + 0.140071 + 0.074058 + 0.565229 + 0.040661 + -0.236769 + -0.156656 + -0.500826 + -0.491142 + -0.582599 + -0.547696 + -0.636320 + -0.404404 + -0.393140 + -0.386300 + -0.260989 + -0.026221 + -0.029654 + 0.162355 + 0.430744 + 0.562294 + 0.627278 + 0.740744 + 0.004270 + -0.025541 + -0.315637 + -0.608094 + -0.552793 + -0.245576 + 0.058228 + 0.776881 + 0.655872 + 0.146004 + 0.018596 + -0.431723 + -0.744903 + -0.588267 + -0.453496 + -0.330479 + -0.481376 + -0.209990 + 0.088591 + 0.977238 + 0.720520 + 0.543863 + -0.047010 + -0.611672 + -0.627747 + -0.448930 + -0.329297 + -0.151193 + -0.135423 + -0.192497 + -0.466239 + -0.444760 + -0.429602 + -0.074621 + 0.150010 + 0.230336 + 0.050695 + -0.108950 + 0.062802 + 0.079678 + -0.075761 + -0.211101 + -0.259052 + -0.247951 + -0.240530 + -0.122508 + 0.022552 + -0.100953 + -0.074525 + -0.005355 + -0.007122 + -0.047423 + 0.219062 + 0.195138 + -0.069991 + -0.120285 + -0.100138 + -0.147176 + -0.229348 + -0.156391 + -0.230071 + -0.185066 + -0.213863 + -0.181560 + 0.093189 + 0.043430 + 0.089634 + 0.114302 + -0.217584 + -0.321081 + -0.293741 + -0.286993 + -0.240245 + -0.054948 + -0.079867 + 0.068549 + 0.141702 + 0.226310 + 0.361284 + 0.436106 + 0.423466 + 0.274934 + 0.121417 + 0.028723 + -0.080620 + -0.049276 + 0.179083 + 0.264128 + 0.288716 + 0.527870 + 0.321213 + 0.215617 + -0.184924 + -0.447961 + -0.408654 + -0.211468 + -0.051510 + -0.084815 + -0.147217 + -0.167992 + -0.307971 + -0.264006 + -0.113568 + 0.376830 + 0.293598 + 0.090892 + -0.228175 + -0.321784 + -0.403191 + -0.373058 + -0.188063 + 0.147574 + 0.457992 + 0.302987 + 0.223741 + 0.157125 + -0.005502 + -0.102813 + 0.217727 + 0.332283 + 0.300173 + 0.360061 + 0.248124 + 0.221050 + 0.127258 + 0.115413 + 0.023048 + 0.038004 + 0.052344 + 0.497380 + 0.281509 + 0.181131 + 0.030867 + -0.089559 + -0.109725 + -0.129867 + -0.356850 + -0.165607 + -0.099823 + -0.065422 + -0.080039 + -0.380092 + -0.477268 + -0.570357 + -0.271274 + 0.058786 + 0.304709 + 0.331957 + 0.200153 + 0.268287 + 0.201264 + 0.253476 + 0.609337 + 0.487625 + 0.248603 + 0.173700 + 0.228196 + 0.211458 + 0.100759 + 0.151753 + 0.327920 + 0.323976 + 0.359256 + 0.189409 + 0.118716 + 0.079885 + 0.044634 + 0.002061 + -0.009561 + 0.215311 + 0.227594 + 0.322732 + 0.365872 + 0.236351 + 0.033814 + 0.204995 + 0.282283 + 0.200897 + 0.145505 + 0.130856 + 0.087276 + 0.013347 + -0.215708 + -0.100733 + 0.133405 + 0.081861 + 0.099125 + 0.011295 + -0.024224 + 0.111845 + 0.015523 + -0.090517 + -0.163823 + -0.242610 + -0.329786 + -0.282803 + 0.036987 + 0.278705 + 0.154241 + 0.025075 + -0.093804 + -0.112345 + 0.006704 + 0.119246 + 0.096656 + -0.010092 + -0.197737 + -0.319103 + -0.211060 + -0.086653 + -0.035758 + 0.119541 + 0.176218 + 0.113792 + -0.142997 + -0.251468 + -0.288624 + -0.210112 + 0.047522 + 0.175362 + 0.256096 + 0.160347 + 0.029308 + -0.040629 + -0.197023 + -0.072307 + -0.006531 + 0.061304 + 0.112966 + -0.034045 + -0.159409 + -0.225036 + -0.175291 + -0.144485 + -0.108491 + -0.062768 + -0.069778 + -0.065250 + 0.019199 + 0.038400 + -0.040283 + -0.056521 + -0.026649 + -0.135821 + -0.237920 + -0.328033 + -0.254343 + -0.302151 + -0.320887 + -0.361244 + -0.361315 + -0.305861 + -0.231876 + -0.110928 + -0.075632 + 0.002411 + 0.168675 + 0.121825 + -0.095958 + -0.115505 + 0.105505 + 0.167625 + 0.028116 + -0.016437 + -0.031912 + 0.083085 + 0.017425 + -0.004895 + 0.142579 + 0.195138 + 0.070673 + -0.042170 + -0.088768 + 0.079397 + 0.031821 + 0.090515 + 0.139072 + 0.067097 + -0.025824 + -0.089072 + 0.034706 + 0.085808 + 0.076895 + 0.112192 + -0.013438 + 0.024221 + 0.032762 + -0.025937 + -0.101217 + -0.033620 + 0.018167 + -0.065576 + -0.145464 + -0.139195 + -0.043340 + -0.170601 + -0.205189 + -0.175341 + -0.080872 + -0.016871 + -0.019286 + -0.027039 + 0.009341 + 0.053220 + -0.028849 + -0.092704 + -0.010356 + 0.172732 + 0.145291 + 0.206177 + 0.004527 + 0.014951 + -0.081697 + -0.122875 + -0.135647 + 0.022477 + 0.033024 + 0.037965 + 0.087205 + -0.003100 + -0.045562 + -0.058323 + -0.066900 + -0.093239 + 0.075671 + 0.154730 + 0.168206 + 0.085890 + 0.020382 + -0.032689 + 0.020423 + -0.010084 + 0.041032 + 0.103456 + 0.136952 + 0.155464 + 0.135291 + 0.050884 + 0.020821 + -0.032228 + -0.045710 + -0.074247 + -0.056011 + -0.105647 + -0.148818 + -0.093472 + -0.024058 + 0.087838 + 0.046355 + 0.001952 + -0.088477 + -0.108695 + -0.155678 + -0.243180 + -0.118746 + 0.013581 + 0.040788 + -0.054031 + -0.010322 + -0.003454 + -0.005045 + 0.033663 + -0.098254 + -0.023800 + -0.011385 + -0.001293 + 0.007077 + 0.015031 + 0.040592 + 0.060264 + -0.002762 + -0.060412 + -0.092697 + -0.140387 + -0.145933 + 0.003687 + 0.072355 + -0.160102 + -0.090687 + -0.095706 + -0.139307 + -0.216330 + -0.206606 + 0.056784 + 0.098643 + 0.101128 + 0.107176 + 0.105933 + 0.124200 + 0.005914 + 0.180520 + 0.166371 + 0.200306 + 0.296983 + 0.186320 + 0.165484 + 0.120948 + 0.105311 + 0.152579 + 0.117523 + 0.197584 + 0.219409 + 0.183690 + 0.036777 + -0.040092 + 0.113476 + 0.122762 + 0.109837 + -0.013032 + -0.152161 + -0.154343 + -0.076802 + -0.055512 + 0.015805 + 0.111998 + 0.139450 + 0.074872 + -0.010484 + -0.081692 + -0.148440 + -0.141509 + 0.082894 + 0.051586 + 0.001348 + 0.047033 + 0.010457 + -0.150591 + -0.082676 + -0.004328 + -0.062673 + -0.098606 + -0.045656 + 0.168022 + 0.256045 + 0.186279 + 0.100077 + 0.113140 + 0.205810 + -0.144210 + -0.065787 + 0.051547 + -0.057971 + -0.143333 + 0.023294 + 0.186891 + 0.253384 + 0.246075 + 0.042126 + 0.112752 + -0.016627 + -0.126922 + -0.173282 + -0.088841 + -0.028708 + -0.046869 + 0.038734 + 0.091009 + 0.077204 + -0.060063 + 0.040129 + -0.023738 + 0.020861 + -0.068437 + -0.182926 + -0.152752 + -0.104954 + -0.147859 + -0.092818 + -0.083797 + -0.083718 + 0.040397 + 0.195107 + 0.252345 + 0.148532 + 0.086358 + -0.055294 + -0.080268 + -0.131845 + -0.088355 + -0.052403 + -0.019317 + 0.030833 + -0.009139 + -0.050882 + -0.158114 + -0.074718 + -0.060606 + 0.044351 + -0.049957 + 0.041421 + 0.063576 + -0.229358 + -0.424261 + -0.278960 + -0.127013 + -0.045608 + -0.069776 + 0.019087 + 0.016434 + -0.090792 + -0.122987 + -0.206534 + -0.086061 + -0.111101 + -0.048375 + 0.040378 + -0.026287 + -0.023788 + 0.000590 + 0.032429 + -0.071155 + -0.151906 + -0.084517 + -0.020081 + -0.050878 + 0.072556 + 0.109918 + 0.146279 + 0.061180 + 0.017317 + -0.117870 + -0.076396 + 0.045817 + 0.019749 + 0.022578 + -0.039758 + -0.065084 + 0.066443 + 0.085794 + 0.084827 + 0.068456 + 0.023156 + -0.000016 + -0.001345 + 0.026014 + 0.018594 + -0.001672 + 0.060489 + 0.004197 + 0.049855 + 0.061197 + 0.135443 + 0.127849 + 0.087393 + 0.114108 + 0.102977 + 0.058097 + 0.026736 + -0.023401 + -0.129704 + -0.125494 + -0.112232 + -0.082903 + 0.032270 + 0.074387 + 0.107523 + 0.117268 + -0.013244 + -0.052363 + -0.147655 + -0.101420 + -0.000319 + -0.110194 + -0.071136 + -0.047668 + -0.048196 + -0.057233 + 0.005178 + 0.024671 + 0.035410 + -0.125678 + -0.083602 + -0.067441 + -0.127390 + -0.090832 + -0.042157 + -0.071514 + -0.097965 + -0.136126 + -0.148451 + -0.115189 + 0.064017 + 0.183038 + 0.199490 + 0.142069 + 0.049242 + -0.006581 + -0.038716 + 0.061770 + 0.133884 + 0.200204 + 0.233017 + 0.242243 + 0.178654 + 0.121998 + 0.091015 + 0.034941 + -0.021170 + -0.035743 + 0.129083 + 0.102691 + 0.166188 + 0.197136 + 0.211356 + 0.111651 + 0.103231 + 0.067156 + -0.004189 + -0.092903 + -0.155668 + -0.101295 + -0.052353 + -0.101156 + -0.078340 + -0.071189 + -0.114006 + -0.147554 + -0.142334 + -0.147880 + -0.057608 + 0.011770 + 0.138909 + 0.058463 + 0.022009 + 0.044717 + 0.090943 + 0.119918 + 0.110408 + 0.093071 + 0.055172 + -0.044699 + -0.053646 + 0.048116 + 0.133252 + 0.180204 + 0.202661 + 0.192599 + 0.127034 + 0.066248 + 0.076682 + 0.093231 + 0.059069 + 0.040045 + 0.001024 + -0.034445 + -0.067838 + -0.005320 + -0.068808 + -0.089442 + 0.080330 + 0.104149 + 0.037928 + -0.027257 + -0.023024 + -0.028406 + -0.035396 + 0.028730 + 0.095855 + 0.034094 + -0.049049 + -0.057882 + -0.013115 + -0.006688 + 0.009761 + 0.041678 + 0.056706 + 0.024760 + -0.052930 + -0.081503 + -0.022745 + -0.007378 + 0.021100 + -0.011031 + 0.033940 + 0.027478 + 0.051888 + 0.105882 + 0.102630 + -0.016393 + -0.040979 + -0.101627 + -0.114801 + -0.096153 + -0.058851 + 0.023242 + 0.069034 + 0.049997 + 0.030402 + 0.005477 + -0.002131 + -0.066420 + -0.087952 + -0.124067 + -0.134842 + -0.139990 + -0.160693 + -0.127564 + -0.080148 + -0.016860 + 0.039135 + 0.073989 + 0.038554 + -0.027380 + -0.073523 + -0.121315 + -0.145698 + -0.131539 + -0.119399 + -0.096817 + -0.047926 + -0.097222 + -0.124597 + -0.077682 + -0.069418 + -0.062411 + -0.049012 + -0.026850 + -0.053854 + -0.092147 + -0.108644 + -0.030891 + -0.027264 + -0.021707 + -0.024477 + -0.013602 + -0.017679 + -0.024181 + -0.005081 + 0.038782 + 0.065851 + 0.064744 + 0.019254 + -0.023451 + -0.026279 + -0.035436 + -0.036530 + -0.020310 + -0.023356 + -0.029091 + -0.053035 + 0.025936 + 0.035712 + 0.021057 + 0.032854 + 0.051045 + 0.021927 + 0.011555 + 0.004387 + -0.008427 + -0.012031 + -0.014364 + -0.011383 + -0.005331 + -0.029262 + -0.049529 + -0.078098 + -0.049742 + -0.057344 + -0.071743 + -0.068528 + -0.014276 + 0.035240 + -0.010399 + -0.018029 + -0.037154 + -0.048092 + -0.043927 + -0.017595 + 0.047790 + 0.032527 + 0.029544 + 0.008612 + 0.010538 + -0.015222 + 0.016153 + 0.023493 + 0.052833 + 0.078812 + 0.079707 + 0.096597 + 0.078411 + 0.047822 + -0.007041 + -0.015188 + 0.064580 + 0.045239 + 0.042574 + 0.080158 + 0.072413 + -0.018268 + -0.022240 + 0.028528 + 0.048862 + 0.069618 + 0.096364 + 0.109613 + 0.038977 + 0.035617 + 0.051076 + 0.001096 + -0.035231 + -0.017014 + -0.001503 + -0.012427 + 0.078269 + 0.130693 + 0.057253 + -0.012569 + -0.041771 + -0.073326 + -0.038794 + -0.018568 + 0.047927 + 0.086580 + 0.071583 + 0.046357 + 0.005217 + 0.017055 + 0.024863 + 0.044126 + 0.076128 + 0.093385 + 0.033957 + -0.022931 + -0.064077 + 0.027459 + 0.039008 + 0.048294 + 0.079931 + 0.117615 + 0.107238 + 0.086767 + 0.091105 + 0.090687 + 0.054442 + 0.005729 + -0.030669 + -0.011791 + 0.009252 + 0.001473 + -0.005233 + 0.025378 + 0.044978 + 0.019944 + 0.021709 + 0.019031 + -0.003703 + -0.022839 + -0.067406 + -0.097749 + -0.061143 + 0.061775 + 0.073300 + 0.071186 + 0.030665 + 0.016608 + -0.011458 + -0.030070 + -0.059807 + -0.059621 + -0.047537 + -0.068518 + -0.051865 + -0.013333 + 0.013369 + 0.026695 + 0.003737 + 0.034210 + 0.049922 + -0.024354 + -0.051771 + -0.090449 + -0.073825 + -0.031109 + -0.013865 + -0.002763 + -0.013673 + -0.107931 + -0.105036 + -0.070970 + -0.045834 + 0.004519 + 0.033415 + 0.059861 + 0.045717 + 0.012878 + -0.032070 + -0.029960 + -0.008119 + 0.028298 + 0.029688 + 0.019633 + 0.052189 + 0.055599 + 0.004714 + -0.058043 + -0.041596 + -0.048435 + -0.073543 + -0.092935 + -0.041296 + -0.045300 + -0.038228 + -0.022879 + 0.004296 + 0.020220 + -0.025962 + -0.056562 + -0.110387 + -0.101920 + -0.097770 + -0.062292 + -0.018834 + -0.000609 + -0.003143 + -0.006594 + -0.026792 + -0.051638 + -0.071529 + -0.069205 + -0.073893 + -0.076593 + -0.002944 + 0.016607 + 0.042836 + 0.012890 + 0.029137 + 0.034020 + 0.031924 + 0.049864 + 0.058867 + 0.044041 + 0.009799 + -0.010659 + -0.033560 + -0.056730 + -0.062943 + -0.071503 + -0.067697 + -0.068007 + -0.024945 + -0.006136 + -0.039433 + -0.027445 + -0.018861 + -0.024965 + -0.047374 + -0.060170 + -0.050415 + -0.011894 + -0.032171 + -0.010930 + 0.010068 + 0.005568 + -0.018902 + -0.028020 + 0.025128 + 0.042897 + 0.054746 + -0.025805 + 0.010370 + 0.041934 + 0.057051 + 0.056867 + 0.091836 + 0.117686 + 0.129776 + 0.063928 + 0.078116 + 0.070967 + 0.027323 + -0.019498 + -0.057730 + -0.068678 + -0.000855 + 0.017729 + 0.024948 + 0.028100 + 0.009162 + -0.015623 + -0.035836 + -0.033962 + -0.014410 + 0.002566 + 0.006219 + -0.004147 + -0.021479 + -0.039125 + -0.029510 + 0.003657 + 0.031376 + 0.052296 + 0.060261 + 0.067999 + 0.074386 + 0.074637 + 0.065995 + 0.058502 + 0.063385 + 0.045679 + 0.063019 + 0.066369 + 0.058322 + 0.014802 + -0.012223 + 0.012527 + 0.012262 + -0.013930 + 0.009619 + 0.051245 + 0.031330 + 0.026443 + 0.026712 + 0.001118 + -0.025054 + -0.033692 + -0.039007 + -0.043937 + -0.052431 + -0.033870 + 0.002527 + 0.025777 + 0.006287 + -0.006423 + 0.011706 + -0.017707 + -0.008479 + 0.011421 + 0.021428 + 0.008242 + -0.021997 + -0.059487 + -0.053483 + -0.033391 + -0.011419 + 0.023938 + 0.045488 + 0.060957 + 0.071137 + 0.060969 + 0.059031 + 0.051829 + 0.022798 + -0.014233 + 0.008232 + 0.025201 + -0.000236 + -0.018214 + 0.002572 + 0.007912 + -0.024993 + -0.049067 + -0.028938 + -0.043830 + -0.055759 + -0.004624 + 0.009068 + 0.000204 + 0.000337 + 0.034084 + 0.017142 + -0.005021 + -0.015091 + 0.003720 + 0.009805 + 0.027950 + 0.048746 + 0.041754 + 0.026490 + -0.008870 + -0.016895 + 0.011724 + 0.051212 + 0.094960 + 0.067796 + 0.028948 + 0.033244 + 0.013734 + -0.006695 + -0.022728 + -0.012850 + 0.005201 + 0.019646 + 0.032825 + 0.000721 + -0.012329 + -0.023583 + -0.056863 + -0.097907 + -0.071058 + -0.025116 + -0.005639 + -0.018154 + -0.021465 + -0.036176 + -0.012326 + 0.008670 + 0.029183 + 0.027490 + 0.002580 + -0.049756 + -0.082459 + -0.041896 + -0.023718 + -0.019709 + 0.004366 + 0.011529 + -0.012496 + -0.068378 + -0.077030 + -0.080429 + -0.048613 + -0.011097 + 0.024949 + 0.006314 + -0.011639 + -0.007516 + -0.028274 + -0.036961 + 0.027270 + 0.026687 + -0.008531 + -0.037271 + -0.051311 + -0.019074 + -0.019059 + -0.009563 + -0.008292 + 0.010715 + -0.014950 + -0.027102 + -0.040124 + -0.051474 + -0.057400 + -0.024173 + -0.002839 + 0.014441 + 0.030666 + 0.011970 + -0.023045 + -0.016523 + -0.025875 + -0.015845 + 0.001834 + 0.031232 + 0.004112 + -0.008678 + 0.017949 + -0.010916 + -0.040695 + -0.070018 + -0.063815 + -0.035490 + -0.006535 + 0.001953 + -0.015103 + -0.001534 + -0.016564 + -0.022798 + 0.008868 + 0.020770 + 0.006302 + -0.002275 + 0.028034 + 0.045523 + 0.032853 + 0.022277 + -0.003537 + -0.011907 + -0.018211 + -0.012056 + 0.012757 + 0.021924 + 0.019287 + 0.012782 + 0.024057 + 0.014299 + 0.007020 + 0.014319 + -0.006533 + -0.033107 + -0.019100 + 0.014945 + 0.026188 + 0.013430 + 0.027072 + 0.034480 + 0.039174 + 0.042098 + 0.036639 + 0.037216 + 0.024891 + 0.015062 + -0.005298 + 0.021383 + 0.012725 + 0.012975 + -0.002778 + 0.002100 + -0.001045 + 0.014271 + 0.001860 + -0.002279 + 0.033631 + 0.049045 + 0.043377 + 0.012466 + 0.004966 + 0.029331 + 0.030967 + 0.020910 + 0.031723 + 0.037098 + 0.022144 + -0.001197 + -0.030393 + 0.000654 + 0.016402 + 0.031448 + 0.035403 + 0.030917 + 0.012999 + 0.011545 + 0.022146 + 0.057620 + 0.074137 + 0.056909 + 0.038481 + 0.021774 + 0.015319 + 0.010635 + 0.021110 + 0.033014 + 0.052889 + 0.043223 + 0.039407 + 0.049772 + 0.027069 + 0.006617 + -0.017702 + -0.025311 + -0.029527 + -0.028705 + -0.030105 + 0.006737 + 0.009796 + -0.006529 + -0.027727 + -0.056402 + -0.074268 + -0.051455 + -0.023436 + 0.000714 + 0.002129 + 0.002695 + 0.001976 + -0.016840 + -0.033067 + -0.070279 + -0.039120 + -0.035396 + -0.032985 + -0.020826 + 0.007815 + 0.007785 + -0.015687 + -0.027654 + -0.020635 + -0.014494 + -0.013487 + -0.012117 + -0.018871 + -0.025054 + -0.059112 + -0.065092 + -0.046402 + -0.025739 + -0.007062 + 0.009823 + 0.015630 + -0.010919 + -0.008840 + -0.014282 + -0.016499 + -0.023588 + -0.024409 + -0.034174 + -0.040534 + -0.015177 + -0.010524 + -0.019925 + -0.023479 + -0.009342 + 0.009171 + 0.009914 + -0.007416 + -0.000497 + 0.002662 + -0.016134 + -0.027809 + -0.044083 + -0.002185 + 0.024126 + 0.029176 + 0.024803 + 0.010018 + 0.025085 + 0.011908 + 0.007061 + 0.016810 + 0.028887 + 0.005154 + -0.029676 + -0.022405 + 0.016017 + 0.031295 + 0.013792 + 0.003244 + 0.023589 + 0.030617 + -0.018929 + -0.012536 + 0.005867 + -0.000822 + -0.002575 + 0.000218 + 0.002575 + -0.011927 + -0.029025 + -0.033779 + -0.057379 + -0.069285 + -0.028876 + -0.003653 + 0.004257 + 0.000976 + -0.020426 + -0.038960 + 0.009403 + 0.030515 + 0.036672 + -0.001023 + 0.001517 + 0.014085 + 0.025217 + 0.039491 + 0.046702 + 0.039047 + 0.017437 + 0.009151 + 0.021301 + 0.018099 + -0.000959 + 0.014338 + -0.001517 + 0.001866 + -0.009361 + -0.014526 + -0.016698 + -0.015034 + 0.005192 + 0.026241 + 0.048679 + 0.053911 + 0.010404 + -0.024985 + -0.042894 + -0.000239 + 0.009020 + -0.010728 + -0.014183 + -0.004425 + -0.027622 + -0.001604 + 0.017730 + 0.045689 + 0.032706 + 0.017590 + 0.005106 + 0.008339 + 0.010610 + 0.004269 + 0.024049 + 0.046112 + 0.029935 + 0.025070 + 0.014322 + -0.003372 + -0.032153 + 0.004587 + 0.018675 + 0.022215 + 0.045189 + 0.034591 + 0.003999 + -0.021322 + -0.027592 + -0.025721 + -0.014679 + 0.018907 + 0.028217 + -0.000285 + -0.011683 + -0.010067 + -0.011761 + -0.013912 + -0.005285 + 0.000246 + -0.003623 + -0.010050 + -0.023853 + -0.030112 + -0.020722 + 0.001629 + 0.011092 + -0.008277 + -0.015936 + -0.017704 + -0.017339 + -0.011338 + -0.009896 + -0.003427 + -0.000416 + -0.000608 + -0.016666 + -0.030615 + -0.034818 + -0.036274 + -0.012367 + -0.004351 + -0.002312 + 0.007542 + 0.003917 + 0.008103 + 0.016656 + 0.021288 + 0.015687 + 0.014567 + 0.012129 + 0.004310 + -0.002689 + 0.011609 + 0.024895 + 0.046994 + 0.044576 + 0.023637 + 0.012180 + -0.004775 + -0.020835 + -0.025387 + -0.025604 + -0.013780 + 0.009103 + 0.017482 + 0.019471 + 0.004786 + 0.007859 + -0.006653 + -0.022212 + -0.029998 + -0.032078 + -0.021538 + -0.009579 + -0.004176 + -0.007679 + -0.010514 + -0.017703 + -0.006213 + 0.004385 + -0.005754 + -0.027319 + -0.045899 + -0.033008 + -0.030678 + -0.018062 + 0.000300 + 0.021879 + -0.005110 + -0.021531 + -0.028452 + 0.006811 + 0.016848 + 0.020170 + 0.027484 + 0.019648 + -0.020521 + -0.032520 + 0.006010 + 0.018989 + 0.031909 + 0.036923 + 0.037044 + 0.016065 + 0.001587 + -0.003254 + -0.012735 + -0.014554 + 0.026647 + 0.046076 + 0.039300 + 0.025557 + 0.011976 + -0.003186 + -0.034138 + -0.037741 + -0.004893 + 0.016787 + 0.036865 + 0.043054 + 0.016567 + -0.011535 + 0.000143 + 0.003443 + 0.014456 + 0.024394 + 0.025840 + 0.012839 + 0.008819 + 0.004588 + -0.014659 + -0.022051 + 0.015654 + 0.035562 + 0.039862 + 0.032766 + 0.011698 + 0.002958 + -0.007205 + -0.006433 + -0.000345 + 0.005571 + 0.006830 + -0.000268 + -0.006818 + 0.000244 + 0.001748 + -0.004840 + -0.008749 + -0.012099 + -0.003831 + -0.001990 + -0.004670 + 0.006951 + 0.012264 + 0.017541 + 0.021559 + 0.018607 + 0.018583 + 0.016428 + 0.003891 + -0.013385 + -0.025563 + -0.002497 + -0.012739 + -0.023301 + -0.005715 + 0.001003 + 0.005537 + 0.007768 + 0.009157 + 0.002125 + -0.008641 + -0.019752 + -0.024220 + -0.027855 + -0.022995 + 0.004020 + 0.009082 + 0.007593 + -0.007557 + -0.012598 + -0.004955 + 0.004495 + 0.015421 + 0.006976 + 0.000011 + -0.001035 + -0.011576 + -0.019091 + 0.003178 + 0.026236 + 0.027809 + -0.001959 + -0.031242 + -0.008610 + -0.004659 + 0.003004 + 0.008060 + 0.011105 + 0.006408 + -0.012499 + -0.016770 + -0.018238 + -0.002937 + 0.000850 + -0.000024 + 0.001175 + -0.003691 + -0.021983 + -0.033207 + -0.039516 + -0.011308 + 0.022928 + 0.016481 + 0.006902 + -0.027804 + -0.022082 + -0.003986 + -0.015867 + -0.003068 + -0.015161 + -0.026267 + -0.017042 + -0.015973 + -0.014353 + -0.008961 + -0.008675 + 0.003080 + -0.015039 + -0.013089 + -0.009028 + -0.005209 + -0.000808 + -0.020200 + -0.042883 + -0.019864 + 0.000002 + -0.000604 + 0.006268 + 0.008997 + -0.006474 + -0.014968 + -0.016339 + 0.002180 + 0.013962 + 0.014734 + 0.014461 + 0.013534 + 0.001914 + -0.018844 + 0.002124 + -0.001923 + 0.004182 + -0.002330 + 0.016513 + -0.009262 + -0.010022 + -0.005089 + -0.006346 + -0.008600 + -0.004711 + 0.015028 + 0.014143 + 0.019972 + 0.021786 + 0.025637 + 0.010979 + -0.004067 + -0.015329 + -0.020837 + 0.001820 + 0.002980 + 0.007221 + 0.014062 + 0.000960 + 0.004703 + 0.000074 + 0.002579 + -0.002359 + -0.015508 + -0.016363 + 0.003026 + 0.008099 + 0.018111 + 0.036286 + 0.017096 + 0.013243 + 0.004392 + 0.004048 + 0.005410 + 0.007950 + 0.004319 + 0.000934 + -0.004171 + 0.009043 + -0.000059 + -0.002782 + 0.005252 + 0.004138 + -0.007119 + -0.011002 + -0.003897 + 0.000077 + 0.004828 + 0.014963 + 0.004723 + 0.005093 + -0.000776 + -0.015406 + -0.017723 + -0.003341 + 0.006271 + 0.019455 + 0.017120 + 0.019702 + 0.006120 + 0.000392 + 0.013150 + 0.022947 + 0.020991 + 0.018713 + 0.013809 + 0.007620 + 0.005694 + 0.005414 + 0.003945 + -0.000243 + -0.003270 + 0.001857 + 0.007104 + 0.020350 + 0.009448 + 0.012841 + 0.010930 + 0.011801 + 0.007957 + -0.004729 + 0.000342 + -0.008051 + -0.012369 + -0.017575 + -0.008823 + 0.014186 + 0.000879 + 0.015545 + 0.021944 + 0.016502 + -0.004527 + -0.018267 + -0.012826 + -0.017803 + -0.000879 + -0.000782 + 0.003853 + -0.010723 + -0.021333 + -0.026829 + -0.030869 + -0.018505 + -0.014406 + -0.020681 + -0.023844 + -0.025203 + -0.025639 + -0.006068 + 0.000046 + 0.012978 + 0.013281 + -0.003623 + -0.016738 + -0.027819 + -0.009173 + -0.012520 + 0.004796 + 0.010256 + -0.015717 + -0.017791 + -0.015436 + 0.002909 + 0.003157 + -0.011563 + -0.008630 + -0.016606 + -0.014350 + -0.009812 + -0.004228 + -0.010311 + 0.000155 + -0.006066 + -0.005767 + -0.011920 + -0.023792 + -0.019560 + -0.013037 + -0.008454 + 0.000601 + 0.009168 + 0.014438 + 0.016679 + 0.006134 + 0.006649 + 0.019997 + 0.036979 + 0.051802 + 0.057598 + 0.073557 + 0.079304 + -0.007617 + -0.253700 + -0.227472 + -0.038593 + 0.178461 + 0.380754 + 0.295321 + 0.152824 + 0.011310 + -0.157961 + -0.210163 + -0.178909 + -0.083337 + 0.107146 + 0.091626 + -0.047607 + -0.040767 + -0.000573 + -0.027470 + -0.078302 + -0.012472 + 0.000142 + 0.045791 + -0.035360 + -0.090747 + -0.066103 + 0.011240 + 0.038457 + 0.011690 + -0.001390 + -0.014439 + -0.078368 + -0.012700 + 0.044385 + 0.046626 + 0.004862 + -0.029704 + -0.039754 + 0.003466 + 0.037312 + 0.060581 + 0.062937 + 0.048391 + 0.025410 + -0.018719 + -0.042828 + 0.036020 + 0.043997 + 0.026233 + 0.000329 + -0.011372 + -0.004280 + 0.027320 + 0.027030 + 0.010696 + 0.021439 + 0.022586 + 0.011996 + -0.006360 + 0.000759 + 0.001009 + -0.020754 + -0.012033 + 0.005915 + 0.007380 + -0.002750 + -0.008473 + 0.007038 + 0.006215 + 0.012668 + -0.006018 + 0.018616 + 0.026965 + 0.004570 + -0.002558 + -0.015886 + -0.026918 + -0.030320 + -0.016572 + 0.002488 + 0.017461 + 0.016979 + 0.005064 + -0.015838 + -0.028505 + -0.034197 + -0.036383 + -0.015701 + 0.007752 + -0.008683 + -0.021219 + -0.008690 + 0.005827 + 0.006241 + -0.001034 + 0.002159 + 0.011428 + 0.012241 + 0.007006 + 0.009595 + 0.010954 + 0.014743 + 0.016501 + 0.007750 + 0.015932 + 0.015917 + 0.011089 + 0.001637 + -0.005130 + 0.005066 + 0.014850 + 0.016341 + 0.014153 + -0.002331 + -0.015574 + 0.008865 + 0.021176 + 0.014154 + 0.002870 + -0.016420 + -0.026353 + -0.024651 + -0.019633 + -0.004455 + 0.003719 + 0.003715 + -0.003079 + -0.024140 + -0.024777 + -0.035452 + -0.020124 + -0.009379 + -0.007408 + -0.008664 + -0.017878 + -0.010817 + -0.010279 + -0.018790 + -0.013355 + -0.004909 + -0.007926 + 0.000234 + -0.003219 + 0.011061 + 0.000371 + -0.013918 + -0.019748 + 0.002883 + 0.021151 + 0.021049 + 0.009824 + -0.002997 + -0.000342 + 0.000935 + -0.007588 + 0.004095 + 0.016539 + 0.021558 + 0.010823 + 0.004117 + -0.000626 + -0.009097 + -0.019071 + -0.001885 + 0.009530 + 0.006409 + 0.004594 + 0.009555 + 0.010401 + 0.008759 + 0.013174 diff --git a/examples/sensitivity/index.html b/examples/sensitivity/index.html index 42d6d33..a2c5af2 100644 --- a/examples/sensitivity/index.html +++ b/examples/sensitivity/index.html @@ -25,7 +25,7 @@ - + @@ -51,7 +51,7 @@ - + @@ -109,7 +109,7 @@ "about": { "@id": "https://stairlab.github.io/#/schema/organization/1" }, - "dateModified": "2024-09-23T15:35:45CET","breadcrumb": { + "dateModified": "2024-09-25T12:16:10CET","breadcrumb": { "@id": "https://stairlab.github.io/opensees-gallery/examples/sensitivity/#/schema/breadcrumb/1" }, "primaryImageOfPage": { @@ -924,7 +924,7 @@ - + diff --git a/examples/shallowdome/index.html b/examples/shallowdome/index.html index c968fbc..476728d 100644 --- a/examples/shallowdome/index.html +++ b/examples/shallowdome/index.html @@ -25,7 +25,7 @@ - + @@ -996,7 +996,7 @@

          Closure + diff --git a/examples/shellframe/index.html b/examples/shellframe/index.html index 196f2bf..dc31c7f 100644 --- a/examples/shellframe/index.html +++ b/examples/shellframe/index.html @@ -25,7 +25,7 @@ - + @@ -725,7 +725,7 @@ - + diff --git a/examples/shellframe/render.glb b/examples/shellframe/render.glb new file mode 100644 index 0000000..12b0211 Binary files /dev/null and b/examples/shellframe/render.glb differ diff --git a/examples/shellframe/render.py b/examples/shellframe/render.py new file mode 100644 index 0000000..d045c9c --- /dev/null +++ b/examples/shellframe/render.py @@ -0,0 +1,146 @@ +import os +import json +from pathlib import Path + +import numpy as np +import pandas as pd +import sees + + + +import model3D +#import model3D_Oregon as model3D + + +def render_model(model, file_name): + + temp_file = f"{file_name}.json" + model.printModel("-JSON", "-file", temp_file) + + # Read in the JSON that OpenSees created + with open(temp_file, "r") as f: + model_dict = json.load(f) + + os.remove(temp_file) + + # Create the rendering + artist = sees.render(model_dict, + vertical=3, + canvas="plotly") #"gltf") + + # Finally, save the rendering to the requested file +# artist.save(file_name) + sees.serve(artist) + + +def render_mode(model, mode_number, mode_scale, file_name): + + # Define a function that tells the renderer the displacement + # at a given node. This will be invoked for each node + def displ_func(tag): + return [float(mode_scale)*ui for ui in model.nodeEigenvector(tag, mode_number)] + + + temp_file = f"{file_name}.json" + model.printModel("-JSON", "-file", temp_file) + + # Read in the JSON that OpenSees created + with open(temp_file, "r") as f: + model_dict = json.load(f) + + os.remove(temp_file) + + # Create the rendering + artist = sees.render(model_dict, displ_func, + vertical=3, + canvas="gltf") + + # Finally, save the rendering to the requested file + if file_name is not None: + artist.save(file_name) + else: + sees.serve(artist) + + +# List of RSN numbers and scaling factors +rsn_numbers = [15, 20, 31, 68, 289, 740, 827, 864, 1083, 4013, 4844] +# rsn_numbers = [289] +peer_scaling = [3.4404, 1.7763, 5.3947, 2.6261, 2.4678, 4.7919, 2.7061, 1.4524, 3.2421, 4.0212, 3.4858] +# peer_scaling = [2.4678] +# List of slab points +# slab_points = ['Midpoint', 'Near column', 'Near beam'] +slab_points = ['Slab 1 Column fnsc 10'] +# Iterate over each slab point + +n_modes = 20 +plot_mode_shapes = True +m_nsc = 20 +f_nsc = 10 + + +spacing = 1 +num_bay_x = 4 +num_bay_y = 4 +length_x = 8 +length_y = 6 +length_z = 4 +num_story = 3 +story_levels = [1,2,3] + +x = 8; y = 0 +target_coords = [[x,y, length_z*3]] #[[x,y,3],[x,y,6],[x,y,9]] + + +n = 1 + +for num_story in 6,: + if num_story ==6: + story_levels = story_levels + [4, 5, 6] + target_coords[0][2] *= 2 + + for slab_point in slab_points: + # Iterate over multiple story levels + for story_level, target_coord in zip(story_levels, target_coords): + results = [] + counter = 0 + + # Render just the model +# render_model(model, None) + for RSN_num, scale_factor in zip(rsn_numbers, peer_scaling): + + model = model3D.create_model(spacing, + num_bay_x, num_bay_y, num_story, target_coord, + length_x, length_y, length_z, + m_nsc, f_nsc, counter, slab_point) + + + print(f"\t{model.eigen(n_modes)}") + + for m in reversed(range(1,n_modes)): + glb_file = Path("./renderings")/f"model-s{num_story}-m{m:02}.glb" + + + scale = 10_000.0 if m < 3 else 1000.0 + if False: + # Pick an appropriate scaling factor for the current mode. + # These were selected empirically. + scales = { + 3: 5000, + 4: 1000, + 5: 1000, + 6: 1000, + 7: 1000, # torsion + 8: 500*(num_stories/3), # vertical + 9: 500*(num_stories/3), # vertical + } + scale = scales.get(m, 10_000) + + # Render the `m`th mode with a scale of `scale` + render_mode(model, mode_number=m, mode_scale=scale, file_name=glb_file) + print(glb_file) + + n += 1 + break + + break + diff --git a/examples/shellframe/render.sh b/examples/shellframe/render.sh new file mode 100644 index 0000000..1d42f6a --- /dev/null +++ b/examples/shellframe/render.sh @@ -0,0 +1,3 @@ +#!/usr/bin/bash + +python -m sees $1 --extrude-outline square --show frame.surface --canvas gltf --vert 3 -o $2 diff --git a/examples/shelltwist/index.html b/examples/shelltwist/index.html index 540f877..2058972 100644 --- a/examples/shelltwist/index.html +++ b/examples/shelltwist/index.html @@ -25,7 +25,7 @@ - + @@ -775,7 +775,7 @@ - + diff --git a/examples/shelltwist/twist-beam.tcl b/examples/shelltwist/twist-beam.tcl index b6c729e..5e81a13 100644 --- a/examples/shelltwist/twist-beam.tcl +++ b/examples/shelltwist/twist-beam.tcl @@ -103,8 +103,8 @@ proc create_model {} { fix 2 1 1 1 1 1 1 fix 3 1 1 1 1 1 1 - recorder Node -file disp.txt -time -nodeRange 37 39 -dof 1 disp - recorder Node -file disp2.txt -time -nodeRange 37 39 -dof 2 disp; + recorder Node -file disp.out -time -nodeRange 37 39 -dof 1 disp + recorder Node -file disp2.out -time -nodeRange 37 39 -dof 2 disp; pattern Plain 1 Linear { load 38 1 0 0 0 0 0 diff --git a/examples/soliddam/index.html b/examples/soliddam/index.html index d26798f..815abfe 100644 --- a/examples/soliddam/index.html +++ b/examples/soliddam/index.html @@ -25,7 +25,7 @@ - + @@ -720,7 +720,7 @@ - + diff --git a/examples/spectrum/index.html b/examples/spectrum/index.html index a90d39e..fb731b8 100644 --- a/examples/spectrum/index.html +++ b/examples/spectrum/index.html @@ -25,7 +25,7 @@ - + @@ -58,7 +58,7 @@ The source code for this problem is adapte..."> - + @@ -118,7 +118,7 @@ "about": { "@id": "https://stairlab.github.io/#/schema/organization/1" }, - "dateModified": "2024-09-19T09:17:28CET","breadcrumb": { + "dateModified": "2024-09-25T12:16:10CET","breadcrumb": { "@id": "https://stairlab.github.io/opensees-gallery/examples/spectrum/#/schema/breadcrumb/1" }, "primaryImageOfPage": { @@ -908,7 +908,7 @@ - + diff --git a/examples/viscousdamper/index.html b/examples/viscousdamper/index.html index 61ec43f..66a3b90 100644 --- a/examples/viscousdamper/index.html +++ b/examples/viscousdamper/index.html @@ -25,7 +25,7 @@ - + @@ -1108,7 +1108,7 @@

          Simula - + diff --git a/examples/wrench/index.html b/examples/wrench/index.html index d9807da..915632d 100644 --- a/examples/wrench/index.html +++ b/examples/wrench/index.html @@ -25,7 +25,7 @@ - + @@ -1138,7 +1138,7 @@

          References + diff --git a/examples/wrench/render.py b/examples/wrench/render.py index ab8d790..8ab0f53 100644 --- a/examples/wrench/render.py +++ b/examples/wrench/render.py @@ -1,5 +1,5 @@ import sees -from wrench import create_wrench +from model import create_wrench model = create_wrench() #model.eigen(1) diff --git a/img/sign-light.png b/img/sign-light.png new file mode 100644 index 0000000..7ce4e05 Binary files /dev/null and b/img/sign-light.png differ diff --git a/index.html b/index.html index 0509181..bd513f5 100644 --- a/index.html +++ b/index.html @@ -25,7 +25,7 @@ - + @@ -937,12 +937,12 @@

          Interactive

          Fast

          @@ -959,12 +959,12 @@

          Interactive

          Fast
          @@ -1064,6 +1064,106 @@

          Fast

            +
          +
          +
          +
          +
          +
          +
          + + + + + + + + + + + + + + + + + + + + +
          + + +Interoperable +
          + + + + + + + + + + +
          + + +Interoperable +
          +
          +
          +

          Interoperable

          +

          Thanks to a rich open-source ecosystem, tools are available for interfacing OpenSees +with a wide variety of industry-standard tools.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + Ecosystem +   + +
          @@ -1223,12 +1323,12 @@

          Interactive

          Fast
          @@ -1245,12 +1345,12 @@

          Interactive

          Fast
          @@ -1350,6 +1450,105 @@

          Fast

            +

          +
          +
          +

          +
          +
          +
          + + + + + + + + + + + + + + + + + + + +
          + + +Interoperable +
          + + + + + + + + + + +
          + + +Interoperable +
          +
          +
          +

          Interoperable

          +

          Thanks to a rich open-source ecosystem, tools are available for interfacing OpenSees +with a wide variety of industry-standard tools.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + Ecosystem +   + +
          @@ -2124,7 +2323,7 @@

          Fast

          - + diff --git a/index.xml b/index.xml index 6ba3c24..ed3df03 100644 --- a/index.xml +++ b/index.xml @@ -272,7 +272,7 @@ https://stairlab.github.io/opensees-gallery/examples/framebuckling/ Mon, 01 Jan 0001 00:00:00 +0000 https://stairlab.github.io/opensees-gallery/examples/framebuckling/ - Corotational frame elements are used to approximate Euler&rsquo;s buckling load, which is given by: Peuler=π2EIL2 P_{\mathrm{euler}} = \frac{\pi^2 EI}{L^2} This example is adapted from https://github.com/denavit/OpenSees-Examples&nbsp; . The files for the problem are buckling.py for Python, and buckling.tcl for Tcl. λ=PL2EI[1−P/(ksGA)]=PL2χEIχ=1−P/(ksGA)P=χλ2EI/L2. \begin{gathered} \lambda=\sqrt{\frac{P L^2}{E I\left[1-P /\left(k_{\mathrm{s}} G A\right)\right]}}=\sqrt{\frac{P L^2}{\chi E I}} \\ \chi=1-P /\left(k_{\mathrm{s}} G A\right) \\ P=\chi \lambda^2 E I / L^2 . \end{gathered} χ=11+λ2EI/(ksGAL2)=11+λ2φ/12P=λ2EI/L21+λ2φ/12. \begin{gathered} \chi=\frac{1}{1+\lambda^2 E I /\left(k_{\mathrm{s}} G A L^2\right)}=\frac{1}{1+\lambda^2 \varphi / 12} \\ P=\frac{\lambda^2 E I / L^2}{1+\lambda^2 \varphi / 12} . + Corotational frame elements are used to approximate Euler&rsquo;s buckling load, which is given by: Peuler=π2EIL2 P_{\mathrm{euler}} = \frac{\pi^2 EI}{L^2} This example is adapted from https://github.com/denavit/OpenSees-Examples&nbsp; . The files for the problem are buckling.py for Python, and buckling.tcl for Tcl. Theory &nbsp; Buckling Analysis &nbsp; Loosely speaking, buckling happens when there are multiple shapes that a structure can deform into that will be in equilibrium with it&rsquo;s applied loads. This implies that at the point of buckling, there are multiple independent displacement increments u\bm{u} which will be mapped to the same resisting load by the tangent K\bm{K} . Python diff --git a/js/main.bundle.en.js b/js/main.bundle.en.js index 53621b8..0160753 100644 --- a/js/main.bundle.en.js +++ b/js/main.bundle.en.js @@ -6520,19 +6520,6 @@ function initIndex() { { id: 2, tag: "en", - href: "/opensees-gallery/examples/cable-stayed/", - title: "Cable Stayed", - description: "", - - - content: "" - }) - .add( - - - { - id: 3, - tag: "en", href: "/opensees-gallery/examples/cablestayed/", title: "Cable Stayed", description: "Model of a cable-stayed bridge imported from CSiBridge", @@ -6544,7 +6531,7 @@ function initIndex() { { - id: 4, + id: 3, tag: "en", href: "/opensees-gallery/docs/configuration/colors/", title: "Colors", @@ -6557,7 +6544,7 @@ function initIndex() { { - id: 5, + id: 4, tag: "en", href: "/opensees-gallery/examples/frameshear/", title: "Columns with Nonlinear Geometry and Shear", @@ -6570,7 +6557,7 @@ function initIndex() { { - id: 6, + id: 5, tag: "en", href: "/opensees-gallery/docs/getting-started/command-line/", title: "Command line", @@ -6583,7 +6570,7 @@ function initIndex() { { - id: 7, + id: 6, tag: "en", href: "/opensees-gallery/docs/getting-started/compiling/", title: "Compiling", @@ -6596,7 +6583,7 @@ function initIndex() { { - id: 8, + id: 7, tag: "en", href: "/opensees-gallery/examples/concretesurface/", title: "Concrete", @@ -6609,20 +6596,20 @@ function initIndex() { { - id: 9, + id: 8, tag: "en", href: "/opensees-gallery/examples/example8/", title: "Continuum Cantilever", description: "Dynamic analysis of a cantilever beam, modeled with 8-node brick elements.", - content: "In this example a simple problem in solid dynamics is considered. The structure is a cantilever beam modelled with three dimensional solid elements.\nExample8.tcl Example8.py For three dimensional analysis, a typical solid element is defined as a volume in three dimensional space. Each node of the analysis has three displacement degrees of freedom. Thus the model is defined with ndm = 3 and ndf = 3.\nFor this model, a mesh is generated using the \u0026ldquo;block3D\u0026rdquo; command. The number of nodes in the local x-direction of the block is nx, the number of nodes in the local y-direction of the block is ny and the number of nodes in the local z-direction of the block is nz. The block3D generation nodes 1,2,3,4,5,6,7,8 are prescribed to define the three dimensional domain of the beam, which is of size 2×2×102 \\times 2 \\times 10 .\nTwo possible brick elements can be used for the analysis. These may be created using the terms StdBrick or BbarBrick. An elastic isotropic material is used.\nFor initial gravity load analysis, a single load pattern with a linear time series and a single nodal loads is used.\nBoundary conditions are applied using the fixZ command. In this case, all the nodes whose zz -coordiate is 0.00.0 have the boundary condition 1,1,1, fully fixed.\nA solution algorithm of type Newton is used for the problem. The solution algorithm uses a ConvergenceTest which tests convergence on the norm of the energy increment vector. Five static load steps are performed.\nSubsequent to the static analysis, the wipeAnalysis and remove loadPatern commands are used to remove the nodal loads and create a new analysis. The nodal displacements have not changed. However, with the external loads removed the structure is no longer in static equilibrium.\nThe integrator for the dynamic analysis if of type GeneralizedMidpoint with α=0.5\\alpha = 0.5 . This choice is uconditionally stable and energy conserving for linear problems. Additionally, this integrator conserves linear and angular momentum for both linear and non-linear problems. The dynamic analysis is performed using 100100 time increments with a time step Δt=2.0\\Delta t = 2.0 .\nThe deformed shape at the end of the analysis is rendered below:\nThe results consist of the file cantilever.out, which contains a line for every time step. Each line contains the time and the horizontal displacement at the upper right corner the beam. This is plotted in the figure below:\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?\u003e" + content: "In this example a simple problem in solid dynamics is considered. The structure is a cantilever beam modelled with three dimensional solid elements.\nExample8.tcl Example8.py For three dimensional analysis, a typical solid element is defined as a volume in three dimensional space. Each node of the analysis has three displacement degrees of freedom. Thus the model is defined with ndm = 3 and ndf = 3.\nFor this model, a mesh is generated using the block3D command. The number of nodes in the local xx -direction of the block is nx, the number of nodes in the local yy -direction of the block is ny and the number of nodes in the local zz -direction of the block is nz. The block3D generation nodes 1,2,3,4,5,6,7,8 are prescribed to define the three dimensional domain of the beam, which is of size 2×2×102 \\times 2 \\times 10 .\nTcl Python(RT) # mesh generation block3D $nx $ny $nz 1 1 $element $eleArgs 1 -1 -1 0 2 1 -1 0 3 1 1 0 4 -1 1 0 5 -1 -1 10 6 1 -1 10 7 1 1 10 8 -1 1 10 model.block3D(nx, ny, nz, 1, 1, Brick, 1, 1: [-1.0, -1.0, 0.0], 2: [ 1.0, -1.0, 0.0], 3: [ 1.0, 1.0, 0.0], 4: [-1.0, 1.0, 0.0], 5: [-1.0, -1.0, 10.0], 6: [ 1.0, -1.0, 10.0], 7: [ 1.0, 1.0, 10.0], 8: [-1.0, 1.0, 10.0]) Two possible brick elements can be used for the analysis. These may be created using the terms StdBrick or BbarBrick. An elastic isotropic material is used.\nFor initial gravity load analysis, a single load pattern with a linear time series and a single nodal loads is used.\nBoundary conditions are applied using the fixZ command. In this case, all the nodes whose zz -coordiate is 0.00.0 have the boundary condition 1,1,1, fully fixed.\nA solution algorithm of type Newton is used for the problem. The solution algorithm uses a ConvergenceTest which tests convergence on the norm of the energy increment vector. Five static load steps are performed.\nSubsequent to the static analysis, the wipeAnalysis and remove loadPatern commands are used to remove the nodal loads and create a new analysis. The nodal displacements have not changed. However, with the external loads removed the structure is no longer in static equilibrium.\nThe integrator for the dynamic analysis if of type GeneralizedMidpoint with α=0.5\\alpha = 0.5 . This choice is uconditionally stable and energy conserving for linear problems. Additionally, this integrator conserves linear and angular momentum for both linear and non-linear problems. The dynamic analysis is performed using 100100 time increments with a time step Δt=2.0\\Delta t = 2.0 .\nThe deformed shape at the end of the analysis is rendered below:\nThe results consist of the file cantilever.out, which contains a line for every time step. Each line contains the time and the horizontal displacement at the upper right corner the beam. This is plotted in the figure below:\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?\u003e" }) .add( { - id: 10, + id: 9, tag: "en", href: "/opensees-gallery/docs/getting-started/contribute/", title: "Contribute", @@ -6635,7 +6622,7 @@ function initIndex() { { - id: 11, + id: 10, tag: "en", href: "/opensees-gallery/docs/about/credits/", title: "Credits", @@ -6648,7 +6635,7 @@ function initIndex() { { - id: 12, + id: 11, tag: "en", href: "/opensees-gallery/examples/soliddam/", title: "Dam", @@ -6661,7 +6648,7 @@ function initIndex() { { - id: 13, + id: 12, tag: "en", href: "/opensees-gallery/docs/developing/", title: "Developing", @@ -6674,7 +6661,7 @@ function initIndex() { { - id: 14, + id: 13, tag: "en", href: "/opensees-gallery/examples/mrf_concentrated/", title: "Dynamic Analysis of 2-Story Moment Frame", @@ -6687,20 +6674,20 @@ function initIndex() { { - id: 15, + id: 14, tag: "en", href: "/opensees-gallery/examples/example7/", title: "Dynamic Shell Analysis", description: "Transient analysis of a shell model.", - content: "In this example a simple problem in shell dynamics is considered. The structure is a curved hoop shell structure that looks like the roof of a Safeway.\nExample7.tcl Example7.py Renderings are created from the script render.py, which uses the sees\u0026nbsp; Python package.\nModeling \u0026nbsp; For shell analysis, a typical shell element is defined as a surface in three dimensional space. Each node of a shell analysis has six degrees of freedom, three displacements and three rotations. Thus the model is defined with ndm=3ndm = 3 and ndf=6ndf = 6 .\nFor this model, a mesh is generated using the block2D command. The number of nodes in the local x-direction of the block is nx and the number of nodes in the local y-direction of the block is ny. The block2D generates nodes with tags 1,2,3,4, 5,7,9 such that the structure is curved in space.\nThe shell element is constructed using the ShellMITC4 formulation. An elastic membrane-plate material section model, appropriate for shell analysis, is constructed using the section command and the \u0026quot;ElasticMembranePlateSection\u0026quot; formulation. In this case, the elastic modulus E=3.0e3E = 3.0e3 , Poisson\u0026rsquo;s ratio ν=0.25\\nu = 0.25 , the thickness h=1.175h = 1.175 and the mass density per unit volume ρ=1.27\\rho = 1.27 Boundary conditions are applied using the fixZ command. In this case, all the nodes whose zz -coordiate is 0.00.0 have the boundary condition 1,1,1, 0,1,1: all degrees-of-freedom are fixed except rotation about the x-axis, which is free. The same boundary conditions are applied where the zz -coordinate is 40.040.0 .\nA solution algorithm of type Newton is used for the problem. The solution algorithm uses a ConvergenceTest which tests convergence on the norm of the energy increment vector. Five static load steps are performed.\nFor initial gravity load analysis, a single load pattern with a linear time series and three vertical nodal loads are used. A scaled rendering of the deformed shape under gravity loading is shown below:\nDynamic Analysis \u0026nbsp; After the static analysis, the wipeAnalysis and remove loadPatern commands are used to remove the nodal loads and create a new analysis. The nodal displacements have not changed. However, with the external loads removed the structure is no longer in static equilibrium.\nThe integrator for the dynamic analysis if of type GeneralizedMidpoint with α=0.5\\alpha = 0.5 . This choice is uconditionally stable and energy conserving for linear problems. Additionally, this integrator conserves linear and angular momentum for both linear and non-linear problems. The dynamic analysis is performed using 250250 time increments with a time step Δt=0.50\\Delta t = 0.50 .\nThe results consist of the file Node.out, which contains a line for every time step. Each line contains the time and the vertical displacement at the upper center of the hoop structure. The time history is shown in the figure below.\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?\u003e" + content: "In this example a simple problem in shell dynamics is considered. The structure is a curved hoop shell structure that looks like the roof of a Safeway.\nExample7.tcl Example7.py Renderings are created from the script render.py, which uses the sees\u0026nbsp; Python package.\nModeling \u0026nbsp; For shell analysis, a typical shell element is defined as a surface in three dimensional space. Each node of a shell analysis has six degrees of freedom, three displacements and three rotations. Thus the model is defined with ndm=3ndm = 3 and ndf=6ndf = 6 .\nFor this model, a mesh is generated using the block2D command. The number of nodes in the local x-direction of the block is nx and the number of nodes in the local y-direction of the block is ny. The block2D generates nodes with tags 1,2,3,4, 5,7,9 such that the structure is curved in space.\nTcl Python(RT) # generate the nodes and elements block2D $nx $ny 1 1 $element $eleArgs 1 -20 0 0 2 -20 0 40 3 20 0 40 4 20 0 0 5 -10 10 20 7 10 10 20 9 0 10 20 # generate the surface nodes and elements surface = model.surface((nx, ny), element=\u0026#34;ShellMITC4\u0026#34;, args=(1,), points= 1: [-20.0, 0.0, 0.0], 2: [-20.0, 0.0, 40.0], 3: [ 20.0, 0.0, 40.0], 4: [ 20.0, 0.0, 0.0], 5: [-10.0, 10.0, 20.0], 7: [ 10.0, 10.0, 20.0], 9: [ 0.0, 10.0, 20.0] ) The shell element is constructed using the ShellMITC4 formulation. An elastic membrane-plate material section model, appropriate for shell analysis, is constructed using the section command and the \u0026quot;ElasticMembranePlateSection\u0026quot; formulation. In this case, the elastic modulus E=3.0e3E = 3.0e3 , Poisson\u0026rsquo;s ratio ν=0.25\\nu = 0.25 , the thickness h=1.175h = 1.175 and the mass density per unit volume ρ=1.27\\rho = 1.27 Boundary conditions are applied using the fixZ command. In this case, all the nodes whose zz -coordiate is 0.00.0 have the boundary condition 1,1,1, 0,1,1: all degrees-of-freedom are fixed except rotation about the x-axis, which is free. The same boundary conditions are applied where the zz -coordinate is 40.040.0 .\nA solution algorithm of type Newton is used for the problem. The solution algorithm uses a ConvergenceTest which tests convergence on the norm of the energy increment vector. Five static load steps are performed.\nFor initial gravity load analysis, a single load pattern with a linear time series and three vertical nodal loads are used. A scaled rendering of the deformed shape under gravity loading is shown below:\nDynamic Analysis \u0026nbsp; After the static analysis, the wipeAnalysis and remove loadPatern commands are used to remove the nodal loads and create a new analysis. The nodal displacements have not changed. However, with the external loads removed the structure is no longer in static equilibrium.\nThe integrator for the dynamic analysis if of type GeneralizedMidpoint with α=0.5\\alpha = 0.5 . This choice is uconditionally stable and energy conserving for linear problems. Additionally, this integrator conserves linear and angular momentum for both linear and non-linear problems. The dynamic analysis is performed using 250250 time increments with a time step Δt=0.50\\Delta t = 0.50 .\nThe results consist of the file Node.out, which contains a line for every time step. Each line contains the time and the vertical displacement at the upper center of the hoop structure. The time history is shown in the figure below.\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?\u003e" }) .add( { - id: 16, + id: 15, tag: "en", href: "/opensees-gallery/examples/example1/", title: "Example 1: Linear Truss", @@ -6713,7 +6700,7 @@ function initIndex() { { - id: 17, + id: 16, tag: "en", href: "/opensees-gallery/examples/example4/", title: "Example 4: Multibay Two Story Frame", @@ -6726,7 +6713,7 @@ function initIndex() { { - id: 18, + id: 17, tag: "en", href: "/opensees-gallery/docs/library/frame/", title: "Frame", @@ -6739,7 +6726,7 @@ function initIndex() { { - id: 19, + id: 18, tag: "en", href: "/opensees-gallery/examples/example5/", title: "Frame with Diaphragms", @@ -6752,7 +6739,7 @@ function initIndex() { { - id: 20, + id: 19, tag: "en", href: "/opensees-gallery/examples/viscousdamper/", title: "Frame with Viscous Dampers", @@ -6765,7 +6752,7 @@ function initIndex() { { - id: 21, + id: 20, tag: "en", href: "/opensees-gallery/docs/advanced-settings/icons/", title: "Icons", @@ -6778,7 +6765,7 @@ function initIndex() { { - id: 22, + id: 21, tag: "en", href: "/opensees-gallery/examples/cantilevertransient/", title: "Inelastic Cantilever", @@ -6791,20 +6778,20 @@ function initIndex() { { - id: 23, + id: 22, tag: "en", href: "/opensees-gallery/examples/example3/", title: "Inelastic Plane Frame", description: "Nonlinear analysis of a concrete portal frame.", - content: "\u003c?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?\u003e This set of examples investigates the nonlinear analysis of a reinforced concrete frame. The nonlinear beam column element with a fiber discretization of the cross section is used in the model. The files for this example are: Python Tcl \u0026lt;a href=\u0026quot;portal.py\u0026quot;\u0026gt;\u0026lt;code\u0026gt;portal.py\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; \u0026lt;a href=\u0026quot;portal.tcl\u0026quot;\u0026gt;\u0026lt;code\u0026gt;portal.tcl\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/li\u0026gt; These files define the following functions:\nFunction Description create_portal Creates a model of a portal frame gravity_analysis Performs a gravity analysis on a model pushover_analysis Performs a pushover analysis on a model transient_analysis Performs a transient analysis on a model create_portal \u0026nbsp; The function create_portal creates a model representing the portal frame in the figure above. The model consists of four nodes, two nonlinear beam-column elements modeling the columns and an elastic beam element to model the girder. For the column elements a section, identical to the section used in Example 2, is created using steel and concrete fibers.\nBegin with nodes and boundary conditions Python Tcl # create ModelBuilder (with two-dimensions and 3 DOF/node) model = ops.Model(ndm=2, ndf=3) # Create nodes # ------------ # create nodes \u0026amp; add to Domain - command: node nodeId xCrd yCrd model.node(1, 0.0, 0.0) model.node(2, width, 0.0) model.node(3, 0.0, height) model.node(4, width, height) # set the boundary conditions - command: fix nodeID uxRestrnt? uyRestrnt? rzRestrnt? model.fix(1, 1, 1, 1) model.fix(2, 1, 1, 1) set width 360 set height 144 model basic -ndm 2 -ndf 3 # Create nodes # tag X Y node 1 0.0 0.0 node 2 $width 0.0 node 3 0.0 $height node 4 $width $height # Fix supports at base of columns # tag DX DY RZ fix 1 1 1 1 fix 2 1 1 1 Next define the materials\nPython Tcl # Define materials for nonlinear columns # ------------------------------------------ # CONCRETE tag f\u0026#39;c ec0 f\u0026#39;cu ecu # Core concrete (confined) model.uniaxialMaterial(\u0026#34;Concrete01\u0026#34;, 1, -6.0, -0.004, -5.0, -0.014) # Cover concrete (unconfined) model.uniaxialMaterial(\u0026#34;Concrete01\u0026#34;, 2, -5.0, -0.002, -0.0, -0.006) # STEEL # Reinforcing steel fy = 60.0; # Yield stress E = 30000.0; # Young\u0026#39;s modulus # tag fy E b model.uniaxialMaterial(\u0026#34;Steel01\u0026#34;, 3, fy, E, 0.01) # Define materials for nonlinear columns # ------------------------------------------ # CONCRETE tag f\u0026#39;c ec0 f\u0026#39;cu ecu # Core concrete (confined) uniaxialMaterial Concrete01 1 -6.0 -0.004 -5.0 -0.014 # Cover concrete (unconfined) uniaxialMaterial Concrete01 2 -5.0 -0.002 0.0 -0.006 # STEEL # Reinforcing steel set fy 60.0; # Yield stress set E 30000.0; # Young\u0026#39;s modulus # tag fy E0 b uniaxialMaterial Steel01 3 $fy $E 0.01 Define a cross section for the columns Python Tcl # Define cross-section for nonlinear columns # ------------------------------------------ # set some parameters colWidth = 15.0 colDepth = 24.0 cover = 1.5 As = 0.6 # area of no. 7 bars # some variables derived from the parameters y1 = colDepth/2.0 z1 = colWidth/2.0 model.section(\u0026#34;Fiber\u0026#34;, 1) # Add the concrete core fibers model.patch(\u0026#34;rect\u0026#34;, 1, 10, 1, cover-y1, cover-z1, y1-cover, z1-cover, section=1) # Add the concrete cover fibers (top, bottom, left, right) model.patch(\u0026#34;rect\u0026#34;, 2, 10, 1, -y1, z1-cover, y1, z1, section=1) model.patch(\u0026#34;rect\u0026#34;, 2, 10, 1, -y1, -z1, y1, cover-z1, section=1) model.patch(\u0026#34;rect\u0026#34;, 2, 2, 1, -y1, cover-z1, cover-y1, z1-cover, section=1) model.patch(\u0026#34;rect\u0026#34;, 2, 2, 1, y1-cover, cover-z1, y1, z1-cover, section=1) # Add the reinforcing fibers (left, middle, right, section=1) model.layer(\u0026#34;straight\u0026#34;, 3, 3, As, y1-cover, z1-cover, y1-cover, cover-z1, section=1) model.layer(\u0026#34;straight\u0026#34;, 3, 2, As, 0.0, z1-cover, 0.0, cover-z1, section=1) model.layer(\u0026#34;straight\u0026#34;, 3, 3, As, cover-y1, z1-cover, cover-y1, cover-z1, section=1) # Define cross-section for nonlinear columns # ------------------------------------------ # set some parameters set colWidth 15 set colDepth 24 set cover 1.5 set As 0.60; # area of no. 7 bars # some variables derived from the parameters set y1 [expr $colDepth/2.0] set z1 [expr $colWidth/2.0] section Fiber 1 # Add the concrete core fibers patch rect 1 10 1 [expr $cover-$y1] [expr $cover-$z1] [expr $y1-$cover] [expr $z1-$cover] # Add the concrete cover fibers (top, bottom, left, right) patch rect 2 10 1 [expr -$y1] [expr $z1-$cover] $y1 $z1 patch rect 2 10 1 [expr -$y1] [expr -$z1] $y1 [expr $cover-$z1] patch rect 2 2 1 [expr -$y1] [expr $cover-$z1] [expr $cover-$y1] [expr $z1-$cover] patch rect 2 2 1 [expr $y1-$cover] [expr $cover-$z1] $y1 [expr $z1-$cover] # Add the reinforcing fibers (left, middle, right) layer straight 3 3 $As [expr $y1-$cover] [expr $z1-$cover] [expr $y1-$cover] [expr $cover-$z1] layer straight 3 2 $As 0.0 [expr $z1-$cover] 0.0 [expr $cover-$z1] layer straight 3 3 $As [expr $cover-$y1] [expr $z1-$cover] [expr $cover-$y1] [expr $cover-$z1] gravity_analysis \u0026nbsp; We now implement a function called gravity_analysis which takes the instance of Model returned by create_portal, and proceeds to impose gravity loads and perform a static analysis. Its use will look like:\nPython Tcl # Create the model model = create_portal() # perform analysis under gravity loads status = gravity_analysis(model) create_portal; gravity_analysis; A single load pattern with a linear time series is created with two vertical nodal loads acting at nodes 3 and 4:\nPython Tcl model.pattern(\u0026#34;Plain\u0026#34;, 1, \u0026#34;Linear\u0026#34;, loads= # nodeID xForce yForce zMoment 3: [ 0.0, -P, 0.0], 4: [ 0.0, -P, 0.0] ) The model contains material non-linearities, so a solution algorithm of type Newton is used. The solution algorithm uses a ConvergenceTest which tests convergence of the equilibrium solution with the norm of the displacement increment vector. For this nonlinear problem, the gravity loads are applied incrementally until the full load is applied. To achieve this, a LoadControl integrator which advances the solution with an increment of 0.1 at each load step is used. The equations are formed using a banded storage scheme, so the System is BandGeneral. The equations are numbered using an RCM (reverse Cuthill-McKee) numberer. The constraints are enforced with a Plain constraint handler.\nOnce all the components of an analysis are defined, the Analysis object itself is created. For this problem a Static Analysis object is used. To achieve the full gravity load, 10 load steps are performed.\nAt end of analysis, the state at nodes 3 and 4 is output. The state of element 1 is also output.\nFor the two nodes, displacements and loads are given. For the beam-column elements, the element end forces in the local system are provided.\nThe nodeGravity.out file contains ten lines, each line containing 7 entries. The first entry is time in the domain at end of the load step. The next 3 entries are the displacements at node 3, and the final 3 entries the displacements at node 4.\npushover_analysis \u0026nbsp; In this example the nonlinear reinforced concrete portal frame which has undergone the gravity load analysis of Example 3.1 is now subjected to a pushover analysis.\nAfter performing the gravity load analysis on the model, the time in the domain is reset to 0.0 and the current value of all loads acting are held constant. A new load pattern with a linear time series and horizontal loads acting at nodes 3 and 4 is then added to the model.\nThe static analysis used to perform the gravity load analysis is modified to take a new DisplacementControl integrator. At each new step in the analysis the integrator will determine the load increment necessary to increment the horizontal displacement at node 3 by 0.1 in. 60 analysis steps are performed in this new analysis.\nFor this analysis the nodal displacements at nodes 3 and 4 will be stored in the file nodePushover.out for post-processing. In addition, the end forces in the local coordinate system for elements 1 and 2 will be stored in the file elePushover.out. At the end of the analysis, the state of node 3 is printed to the screen.\nIn addition to what is displayed on the screen, the file node32.out and ele32.out have been created by the script. Each line of node32.out contains the time, DX, DY and RZ for node 3 and DX, DY and RZ for node 4 at the end of an iteration. Each line of eleForce.out contains the time, and the element end forces in the local coordinate system. A plot of the load-displacement relationship at node 3 is shown in the figure below.\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?\u003e transient_analysis \u0026nbsp; The concrete frame which has undergone the gravity load analysis of Example 3.1 is now subjected to a uniform earthquake excitation.\nAfter performing the gravity load analysis, the time in the domain is reset to 0.0 and the time series for all active loads is set to constant. This prevents the gravity load from being scaled with each step of the dynamic analysis.\nPython Tcl model.loadConst(time=0.0) loadConst -time 0.0 Mass terms are added to nodes 3 and 4. A new uniform excitation load pattern is created. The excitation acts in the horizontal direction and reads the acceleration record and time interval from the file ARL360.g3. The file ARL360.g3 is created from the PEER Strong Motion Database ( http://peer.berkeley.edu/smcat/\u0026nbsp; ) record ARL360.at2 using the Tcl procedure ReadSMDFile contained in the file ReadSMDFile.tcl.\nThe static analysis object and its components are first deleted so that a new transient analysis object can be created.\nA new solution Algorithm of type Newton is then created. The solution algorithm uses a ConvergenceTest which tests convergence on the norm of the displacement increment vector. The integrator for this analysis will be of type Newmark with a γ=0.25\\gamma = 0.25 and β=0.5\\beta = 0.5 .\nThe integrator will add some stiffness proportional damping to the system, the damping term will be based on the last committed stifness of the elements, i.e. C=acKcommitC = a_c K_\\textcommit with ac=0.000625a_c = 0.000625 .\nThe equations are formed using a banded storage scheme, so the System is BandGeneral. The equations are numbered using an RCM (reverse Cuthill-McKee) numberer. The constraints are enforced with a Plain constraint handler.\nOnce all the components of an analysis are defined, the Analysis object itself is created. For this problem a Transient Analysis object is used. 2000 time steps are performed with a time step of 0.01.\nIn addition to the transient analysis, two eigenvalue analysis are performed on the model. The first is performed after the gravity analysis and the second after the transient analysis.\nFor this analysis the nodal displacenments at Nodes 3 and 4 will be stored in the file nodeTransient.out for post-processing. In addition the section forces and deformations for the section at the base of column 1 will also be stored in two seperate files. The results of the eigenvalue analysis will be displayed on the screen.\nGravity load analysis completed eigen values at start of transient: 2.695422e+02 1.750711e+04 Transient analysis completed SUCCESSFULLY eigen values at start of transient: 1.578616e+02 1.658481e+04 Node: 3 Coordinates : 0 144 commitDisps: -0.0464287 -0.0246641 0.000196066 Velocities : -0.733071 1.86329e-05 0.00467983 commitAccels: -9.13525 0.277302 38.2972 unbalanced Load: -3.9475 -180 0 Mass : 0.465839 0 0 0 0.465839 0 0 0 0 Eigenvectors: -1.03587 -0.0482103 -0.00179081 0.00612275 0.00663473 3.21404e-05 The two eigenvalues for the eigenvalue analysis are printed to the screen. The state of node 3 at the end of the analysis is also printed. The information contains the last committed displacements, velocities and accelerations at the node, the unbalanced nodal forces and the nodal masses. In addition, the eigenvector components of the eigenvector pertaining to the node 3 is also displayed.\nIn addition to the contents displayed on the screen, three files have been created. Each line of nodeTransient.out contains the domain time, and DX, DY and RZ for node 3. Plotting the first and second columns of this file the lateral displacement versus time for node 3 can be obtained as shown in the figure below. Each line of the files ele1secForce.out and ele1secDef.out contain the domain time and the forces and deformations for section 1 (the base section) of element 1. These can be used to generate the moment-curvature time history of the base section of column 1 as shown below.\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?\u003e \u003c?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?\u003e" + content: "\u003c?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?\u003e This set of examples investigates the nonlinear analysis of a reinforced concrete frame. The nonlinear beam column element with a fiber discretization of the cross section is used in the model. The files for this example are: Python Tcl \u0026lt;a href=\u0026quot;portal.py\u0026quot;\u0026gt;\u0026lt;code\u0026gt;portal.py\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/p\u0026gt; \u0026lt;a href=\u0026quot;portal.tcl\u0026quot;\u0026gt;\u0026lt;code\u0026gt;portal.tcl\u0026lt;/code\u0026gt;\u0026lt;/a\u0026gt;\u0026lt;/p\u0026gt; These files define the following functions:\nFunction Description create_portal Creates a model of a portal frame gravity_analysis Performs a gravity analysis on a model pushover_analysis Performs a pushover analysis on a model transient_analysis Performs a transient analysis on a model create_portal \u0026nbsp; The function create_portal creates a model representing the portal frame in the figure above. The model consists of four nodes, two nonlinear beam-column elements modeling the columns and an elastic beam element to model the girder. For the column elements a section, identical to the section used in Example 2, is created using steel and concrete fibers.\nBegin with nodes and boundary conditions Python Tcl # create ModelBuilder (with two-dimensions and 3 DOF/node) model = ops.Model(ndm=2, ndf=3) # Create nodes # ------------ # create nodes \u0026amp; add to Domain - command: node nodeId xCrd yCrd model.node(1, 0.0, 0.0) model.node(2, width, 0.0) model.node(3, 0.0, height) model.node(4, width, height) # set the boundary conditions - command: fix nodeID uxRestrnt? uyRestrnt? rzRestrnt? model.fix(1, 1, 1, 1) model.fix(2, 1, 1, 1) set width 360 set height 144 model basic -ndm 2 -ndf 3 # Create nodes # tag X Y node 1 0.0 0.0 node 2 $width 0.0 node 3 0.0 $height node 4 $width $height # Fix supports at base of columns # tag DX DY RZ fix 1 1 1 1 fix 2 1 1 1 Next define the materials\nPython Tcl # Define materials for nonlinear columns # ------------------------------------------ # CONCRETE tag f\u0026#39;c ec0 f\u0026#39;cu ecu # Core concrete (confined) model.uniaxialMaterial(\u0026#34;Concrete01\u0026#34;, 1, -6.0, -0.004, -5.0, -0.014) # Cover concrete (unconfined) model.uniaxialMaterial(\u0026#34;Concrete01\u0026#34;, 2, -5.0, -0.002, -0.0, -0.006) # STEEL # Reinforcing steel fy = 60.0; # Yield stress E = 30000.0; # Young\u0026#39;s modulus # tag fy E b model.uniaxialMaterial(\u0026#34;Steel01\u0026#34;, 3, fy, E, 0.01) # Define materials for nonlinear columns # ------------------------------------------ # CONCRETE tag f\u0026#39;c ec0 f\u0026#39;cu ecu # Core concrete (confined) uniaxialMaterial Concrete01 1 -6.0 -0.004 -5.0 -0.014 # Cover concrete (unconfined) uniaxialMaterial Concrete01 2 -5.0 -0.002 0.0 -0.006 # STEEL # Reinforcing steel set fy 60.0; # Yield stress set E 30000.0; # Young\u0026#39;s modulus # tag fy E0 b uniaxialMaterial Steel01 3 $fy $E 0.01 Define a cross section for the columns Python Tcl # Define cross-section for nonlinear columns # ------------------------------------------ # set some parameters colWidth = 15.0 colDepth = 24.0 cover = 1.5 As = 0.6 # area of no. 7 bars # some variables derived from the parameters y1 = colDepth/2.0 z1 = colWidth/2.0 model.section(\u0026#34;Fiber\u0026#34;, 1) # Add the concrete core fibers model.patch(\u0026#34;rect\u0026#34;, 1, 10, 1, cover-y1, cover-z1, y1-cover, z1-cover, section=1) # Add the concrete cover fibers (top, bottom, left, right) model.patch(\u0026#34;rect\u0026#34;, 2, 10, 1, -y1, z1-cover, y1, z1, section=1) model.patch(\u0026#34;rect\u0026#34;, 2, 10, 1, -y1, -z1, y1, cover-z1, section=1) model.patch(\u0026#34;rect\u0026#34;, 2, 2, 1, -y1, cover-z1, cover-y1, z1-cover, section=1) model.patch(\u0026#34;rect\u0026#34;, 2, 2, 1, y1-cover, cover-z1, y1, z1-cover, section=1) # Add the reinforcing fibers (left, middle, right, section=1) model.layer(\u0026#34;straight\u0026#34;, 3, 3, As, y1-cover, z1-cover, y1-cover, cover-z1, section=1) model.layer(\u0026#34;straight\u0026#34;, 3, 2, As, 0.0, z1-cover, 0.0, cover-z1, section=1) model.layer(\u0026#34;straight\u0026#34;, 3, 3, As, cover-y1, z1-cover, cover-y1, cover-z1, section=1) # Define cross-section for nonlinear columns # ------------------------------------------ # set some parameters set colWidth 15 set colDepth 24 set cover 1.5 set As 0.60; # area of no. 7 bars # some variables derived from the parameters set y1 [expr $colDepth/2.0] set z1 [expr $colWidth/2.0] section Fiber 1 # Add the concrete core fibers patch rect 1 10 1 [expr $cover-$y1] [expr $cover-$z1] [expr $y1-$cover] [expr $z1-$cover] # Add the concrete cover fibers (top, bottom, left, right) patch rect 2 10 1 [expr -$y1] [expr $z1-$cover] $y1 $z1 patch rect 2 10 1 [expr -$y1] [expr -$z1] $y1 [expr $cover-$z1] patch rect 2 2 1 [expr -$y1] [expr $cover-$z1] [expr $cover-$y1] [expr $z1-$cover] patch rect 2 2 1 [expr $y1-$cover] [expr $cover-$z1] $y1 [expr $z1-$cover] # Add the reinforcing fibers (left, middle, right) layer straight 3 3 $As [expr $y1-$cover] [expr $z1-$cover] [expr $y1-$cover] [expr $cover-$z1] layer straight 3 2 $As 0.0 [expr $z1-$cover] 0.0 [expr $cover-$z1] layer straight 3 3 $As [expr $cover-$y1] [expr $z1-$cover] [expr $cover-$y1] [expr $cover-$z1] gravity_analysis \u0026nbsp; We now implement a function called gravity_analysis which takes the instance of Model returned by create_portal, and proceeds to impose gravity loads and perform a static analysis. Its use will look like:\nPython Tcl # Create the model model = create_portal() # perform analysis under gravity loads status = gravity_analysis(model) create_portal; gravity_analysis; A single load pattern with a linear time series is created with two vertical nodal loads acting at nodes 3 and 4:\nPython Tcl model.pattern(\u0026#34;Plain\u0026#34;, 1, \u0026#34;Linear\u0026#34;, loads= # nodeID xForce yForce zMoment 3: [ 0.0, -P, 0.0], 4: [ 0.0, -P, 0.0] ) The model contains material non-linearities, so a solution algorithm of type Newton is used. The solution algorithm uses a ConvergenceTest which tests convergence of the equilibrium solution with the norm of the displacement increment vector. For this nonlinear problem, the gravity loads are applied incrementally until the full load is applied. To achieve this, a LoadControl integrator which advances the solution with an increment of 0.1 at each load step is used. The equations are formed using a banded storage scheme, so the System is BandGeneral. The equations are numbered using an RCM (reverse Cuthill-McKee) numberer. The constraints are enforced with a Plain constraint handler.\nOnce all the components of an analysis are defined, the Analysis object itself is created. For this problem a Static Analysis object is used. To achieve the full gravity load, 10 load steps are performed.\nAt end of analysis, the state at nodes 3 and 4 is output. The state of element 1 is also output.\nFor the two nodes, displacements and loads are given. For the beam-column elements, the element end forces in the local system are provided.\nThe nodeGravity.out file contains ten lines, each line containing 7 entries. The first entry is time in the domain at end of the load step. The next 3 entries are the displacements at node 3, and the final 3 entries the displacements at node 4.\npushover_analysis \u0026nbsp; In this example the nonlinear reinforced concrete portal frame which has undergone the gravity load analysis of Example 3.1 is now subjected to a pushover analysis.\nAfter performing the gravity load analysis on the model, the time in the domain is reset to 0.0 and the current value of all loads acting are held constant. A new load pattern with a linear time series and horizontal loads acting at nodes 3 and 4 is then added to the model.\nThe static analysis used to perform the gravity load analysis is modified to take a new DisplacementControl integrator. At each new step in the analysis the integrator will determine the load increment necessary to increment the horizontal displacement at node 3 by 0.1 in. 60 analysis steps are performed in this new analysis.\nFor this analysis the nodal displacements at nodes 3 and 4 will be stored in the file nodePushover.out for post-processing. In addition, the end forces in the local coordinate system for elements 1 and 2 will be stored in the file elePushover.out. At the end of the analysis, the state of node 3 is printed to the screen.\nIn addition to what is displayed on the screen, the file node32.out and ele32.out have been created by the script. Each line of node32.out contains the time, DX, DY and RZ for node 3 and DX, DY and RZ for node 4 at the end of an iteration. Each line of eleForce.out contains the time, and the element end forces in the local coordinate system. A plot of the load-displacement relationship at node 3 is shown in the figure below.\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?\u003e transient_analysis \u0026nbsp; The concrete frame which has undergone the gravity load analysis of Example 3.1 is now subjected to a uniform earthquake excitation.\nAfter performing the gravity load analysis, the time in the domain is reset to 0.0 and the time series for all active loads is set to constant. This prevents the gravity load from being scaled with each step of the dynamic analysis.\nPython Tcl model.loadConst(time=0.0) loadConst -time 0.0 Mass terms are added to nodes 3 and 4. A new uniform excitation load pattern is created. The excitation acts in the horizontal direction and reads the acceleration record and time interval from the file ARL360.g3. The file ARL360.g3 is created from the PEER Strong Motion Database ( http://peer.berkeley.edu/smcat/\u0026nbsp; ) record ARL360.at2 using the Tcl procedure ReadSMDFile contained in the file ReadSMDFile.tcl.\nThe static analysis object and its components are first deleted so that a new transient analysis object can be created.\nA new solution Algorithm of type Newton is then created. The solution algorithm uses a ConvergenceTest which tests convergence on the norm of the displacement increment vector. The integrator for this analysis will be of type Newmark with a γ=0.25\\gamma = 0.25 and β=0.5\\beta = 0.5 .\nThe integrator will add some stiffness proportional damping to the system, the damping term will be based on the last committed stifness of the elements, i.e. C=acKcommitC = a_c K_\\textcommit with ac=0.000625a_c = 0.000625 .\nThe equations are formed using a banded storage scheme, so the System is BandGeneral. The equations are numbered using an RCM (reverse Cuthill-McKee) numberer. The constraints are enforced with a Plain constraint handler.\nOnce all the components of an analysis are defined, the Analysis object itself is created. For this problem a Transient Analysis object is used. 2000 time steps are performed with a time step of 0.01.\nIn addition to the transient analysis, two eigenvalue analysis are performed on the model. The first is performed after the gravity analysis and the second after the transient analysis.\nFor this analysis the nodal displacenments at Nodes 3 and 4 will be stored in the file nodeTransient.out for post-processing. In addition the section forces and deformations for the section at the base of column 1 will also be stored in two seperate files. The results of the eigenvalue analysis will be displayed on the screen.\nGravity load analysis completed eigen values at start of transient: 2.695422e+02 1.750711e+04 Transient analysis completed SUCCESSFULLY eigen values at start of transient: 1.578616e+02 1.658481e+04 Node: 3 Coordinates : 0 144 commitDisps: -0.0464287 -0.0246641 0.000196066 Velocities : -0.733071 1.86329e-05 0.00467983 commitAccels: -9.13525 0.277302 38.2972 unbalanced Load: -3.9475 -180 0 Mass : 0.465839 0 0 0 0.465839 0 0 0 0 Eigenvectors: -1.03587 -0.0482103 -0.00179081 0.00612275 0.00663473 3.21404e-05 The two eigenvalues for the eigenvalue analysis are printed to the screen. The state of node 3 at the end of the analysis is also printed. The information contains the last committed displacements, velocities and accelerations at the node, the unbalanced nodal forces and the nodal masses. In addition, the eigenvector components of the eigenvector pertaining to the node 3 is also displayed.\nIn addition to the contents displayed on the screen, three files have been created. Each line of nodeTransient.out contains the domain time, and DX, DY and RZ for node 3. Plotting the first and second columns of this file the lateral displacement versus time for node 3 can be obtained as shown in the figure below. Each line of the files ele1secForce.out and ele1secDef.out contain the domain time and the forces and deformations for section 1 (the base section) of element 1. These can be used to generate the moment-curvature time history of the base section of column 1 as shown below.\n\u003c?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?\u003e \u003c?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?\u003e" }) .add( { - id: 24, + id: 23, tag: "en", href: "/opensees-gallery/examples/inelasticsdof/", title: "Inelastic SDOF", @@ -6817,7 +6804,7 @@ function initIndex() { { - id: 25, + id: 24, tag: "en", href: "/opensees-gallery/docs/getting-started/introduction/", title: "Introduction", @@ -6830,7 +6817,7 @@ function initIndex() { { - id: 26, + id: 25, tag: "en", href: "/opensees-gallery/docs/configuration/layout/", title: "Layout", @@ -6843,7 +6830,7 @@ function initIndex() { { - id: 27, + id: 26, tag: "en", href: "/opensees-gallery/docs/about/license/", title: "License", @@ -6856,7 +6843,7 @@ function initIndex() { { - id: 28, + id: 27, tag: "en", href: "/opensees-gallery/examples/chopra-10.4/", title: "Matrix Eigenvalue Analysis", @@ -6869,7 +6856,7 @@ function initIndex() { { - id: 29, + id: 28, tag: "en", href: "/opensees-gallery/docs/getting-started/modeling/", title: "Modeling", @@ -6882,7 +6869,7 @@ function initIndex() { { - id: 30, + id: 29, tag: "en", href: "/opensees-gallery/docs/advanced-settings/module-development/", title: "Module development", @@ -6895,7 +6882,7 @@ function initIndex() { { - id: 31, + id: 30, tag: "en", href: "/opensees-gallery/examples/example2/", title: "Moment-Curvature Analysis", @@ -6908,7 +6895,7 @@ function initIndex() { { - id: 32, + id: 31, tag: "en", href: "/opensees-gallery/examples/framebuckling/", title: "Nonlinear Geometry", @@ -6921,7 +6908,7 @@ function initIndex() { { - id: 33, + id: 32, tag: "en", href: "/opensees-gallery/docs/advanced-settings/overview/", title: "Overview", @@ -6934,7 +6921,7 @@ function initIndex() { { - id: 34, + id: 33, tag: "en", href: "/opensees-gallery/docs/advanced-settings/partial-development/", title: "Partial development", @@ -6947,20 +6934,7 @@ function initIndex() { { - id: 35, - tag: "en", - href: "/opensees-gallery/examples/steelframe2d/", - title: "Plane Steel Frame", - description: "This example is adapted from https://openseespydoc.readthedocs.io/en/latest/src/ThreeStorySteel.html\u0026nbsp; The source file for the example is SteelFrame2D.py.\n", - - - content: "This example is adapted from https://openseespydoc.readthedocs.io/en/latest/src/ThreeStorySteel.html\u0026nbsp; The source file for the example is SteelFrame2D.py." - }) - .add( - - - { - id: 36, + id: 34, tag: "en", href: "/opensees-gallery/docs/getting-started/python/", title: "Python", @@ -6973,7 +6947,7 @@ function initIndex() { { - id: 37, + id: 35, tag: "en", href: "/opensees-gallery/releases/", title: "Releases", @@ -6986,7 +6960,7 @@ function initIndex() { { - id: 38, + id: 36, tag: "en", href: "/opensees-gallery/examples/spectrum/", title: "RotD Spectrum", @@ -6999,7 +6973,7 @@ function initIndex() { { - id: 39, + id: 37, tag: "en", href: "/opensees-gallery/examples/sathertower/", title: "Sather Tower", @@ -7012,7 +6986,7 @@ function initIndex() { { - id: 40, + id: 38, tag: "en", href: "/opensees-gallery/docs/advanced-settings/scripts/", title: "Scripts", @@ -7025,20 +6999,20 @@ function initIndex() { { - id: 41, + id: 39, tag: "en", href: "/opensees-gallery/examples/sensitivity/", title: "Sensitivity", - description: "", + description: "Basic sensitivity analysis is performed", - content: "" + content: "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 import opensees.openseespy as ops # Input [N, m, kg, sec] L = 5.0 # Total length of cantilever F = 300000.0 # Lateral point load P = 0.0 # Axial force w = 10000.0 # Distributed load E = 200e9 # Modulus of elasticity G = E*0.6 hw = 0.355 # Web height bf = 0.365 # Flange width tf = 0.018 # Flange thickness tw = 0.011 # Web thickness nf = 3 # Number of fibers in the flange nw = 8 # Number of fibres in the web nel = 1 # Area and moment of inertia A = tw * (hw - 2 * tf) + 2 * bf * tf I = tw * (hw - 2 * tf) ** 3 / 12.0 + 2 * bf * tf * (0.5 * (hw - tf)) ** 2 Ay = A*1e5 Az = A*1e5 Iz = I Iy = I J = 2*I model = ops.Model(ndm=3, ndf=6) model.node(1, 0, 0, 0) model.node(2, L, 0, 0) model.fix(1, 1, 1, 1, 1, 1, 1) model.section(\u0026#34;FrameElastic\u0026#34;, 1, E=E, A=A, Ay=Ay, Az=Az, Iz=Iz, Iy=Iy, J=J, G=G) model.geomTransf(\u0026#34;Linear\u0026#34;, 1, (0, 0, 1)) model.element(\u0026#34;CubicFrame\u0026#34;, 1, (1, 2), section=1, transform=1) model.parameter(1, \u0026#34;element\u0026#34;, 1, \u0026#34;E\u0026#34;) model.parameter(2, \u0026#34;element\u0026#34;, 1, \u0026#34;A\u0026#34;) model.parameter(3, \u0026#34;element\u0026#34;, 1, \u0026#34;Iz\u0026#34;) model.parameter(4, \u0026#34;node\u0026#34;, nel+1, \u0026#34;coord\u0026#34;, 1) model.pattern(\u0026#34;Plain\u0026#34;, 1, \u0026#34;Linear\u0026#34;) model.load(2, (0.0, 1.0, 0.0, 0.0, 0.0, 0.0), pattern=1) model.constraints(\u0026#34;Plain\u0026#34;) model.system(\u0026#34;ProfileSPD\u0026#34;) if True: Pmax = F Nsteps = 1 dP = Pmax / Nsteps model.integrator(\u0026#34;LoadControl\u0026#34;, dP) model.analysis(\u0026#34;Static\u0026#34;) model.sensitivityAlgorithm(\u0026#34;-computeAtEachStep\u0026#34;) for i in range(Nsteps): print(model.analyze(1)) print(model.nodeDisp(2, 2), model.getLoadFactor(1)) for param in model.getParamTags(): print(\u0026#34;\\t\u0026#34;, param, model.sensNodeDisp(2, 2, param)) if False: model.wipeAnalysis() Umax = 2.2 Nsteps = 100 Uincr = Umax/Nsteps model.integrator(\u0026#34;DisplacementControl\u0026#34;,2,2,Uincr) model.analysis(\u0026#34;Static\u0026#34;) model.sensitivityAlgorithm(\u0026#34;-computeAtEachStep\u0026#34;) for i in range(Nsteps): model.analyze(1) print(model.nodeDisp(2,1), model.getLoadFactor(1)) for param in model.getParamTags(): print(param, model.sensLambda(1, param)) # print(param, model.sensNodeDisp(2, 1, param)) print(\u0026#34;u\u0026#34;, F*L**3/(3*E*I)) print(\u0026#34;L\u0026#34;, F*L**2/(E*I)) print(\u0026#34;F\u0026#34;, L**3/(3*E*I))" }) .add( { - id: 42, + id: 40, tag: "en", href: "/opensees-gallery/examples/shallowdome/", title: "Shallow Dome", @@ -7051,7 +7025,7 @@ function initIndex() { { - id: 43, + id: 41, tag: "en", href: "/opensees-gallery/examples/shellframe/", title: "Shell Diaphragms", @@ -7064,7 +7038,7 @@ function initIndex() { { - id: 44, + id: 42, tag: "en", href: "/opensees-gallery/examples/pendulum/", title: "Simple Pendulum", @@ -7077,7 +7051,7 @@ function initIndex() { { - id: 45, + id: 43, tag: "en", href: "/opensees-gallery/examples/example6/", title: "Simply Supported Solid Beam", @@ -7090,7 +7064,7 @@ function initIndex() { { - id: 46, + id: 44, tag: "en", href: "/opensees-gallery/docs/advanced-settings/styles/", title: "Styles", @@ -7103,7 +7077,7 @@ function initIndex() { { - id: 47, + id: 45, tag: "en", href: "/opensees-gallery/examples/shelltwist/", title: "Twisted Cantilever", @@ -7116,7 +7090,7 @@ function initIndex() { { - id: 48, + id: 46, tag: "en", href: "/opensees-gallery/examples/wrench/", title: "Wrench", diff --git a/js/main.bundle.en.min.1b34b20c6122591d340f6619f3565d8ba7651cc2ac3a5b996a6443cf64f784e2.js b/js/main.bundle.en.min.1b34b20c6122591d340f6619f3565d8ba7651cc2ac3a5b996a6443cf64f784e2.js new file mode 100644 index 0000000..45cb684 --- /dev/null +++ b/js/main.bundle.en.min.1b34b20c6122591d340f6619f3565d8ba7651cc2ac3a5b996a6443cf64f784e2.js @@ -0,0 +1,290 @@ +/*! + * Bootstrap v5.3.3 (https://getbootstrap.com/) + * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */const alert=document.getElementById("page-alert"),closeBtn=document.getElementById("page-alert-btn-close");if(alert!==null&&closeBtn!==null){const version=alert.getAttribute("data-page-alert-version")||"unknown",hideAlert=sessionStorage.getItem(`page-alert-${version}`)!==null;hideAlert&&alert.classList.add("d-none"),closeBtn.addEventListener("click",()=>{sessionStorage.setItem(`page-alert-${version}`,"seen"),alert.classList.add("d-none")})}function reveal(){const reveals=document.querySelectorAll(".reveal");for(let i=0;i{document.querySelectorAll("pre > code").forEach(codeBlock=>{const button=document.createElement("button");button.className="clipboard-button",button.setAttribute("data-toast-target","toast-copied-code-message"),button.setAttribute("aria-label","copy to clipboard"),button.type="button",button.innerHTML=svgCopy,button.addEventListener("click",()=>{const text=codeBlock.innerText.split(` +`).filter(Boolean).join(` +`);clipboard.writeText(text).then(()=>{button.blur(),button.innerHTML=svgCheck,setTimeout(()=>button.innerHTML=svgCopy,2e3)},error=>button.innerHTML="Error")});const pre=codeBlock.parentNode;pre.parentNode.insertBefore(button,pre)})};navigator&&navigator.clipboard&&addCopyButtons(navigator.clipboard),document.querySelectorAll("[data-clipboard]").forEach(trigger=>{const text=trigger.getAttribute("data-clipboard");trigger.addEventListener("click",()=>{navigator.clipboard.writeText(text)})});const url=new URL(window.location.href),menu=url.searchParams.get("menu"),child=url.searchParams.get("child"),menuItems=document.querySelectorAll('[data-nav="main"]');if(menu!==null){menuItems.forEach(element=>{element.classList.remove("active")});const targetMainItems=document.querySelectorAll(`[data-nav-main="${menu}"]:not([data-nav-child])`);targetMainItems.forEach(element=>{element.classList.add("active")});const targetChildItems=document.querySelectorAll(`[data-nav-main="${menu}"][data-nav-child="${child}"]`);targetChildItems.forEach(element=>{element.classList.add("active")})}(function(global,factory){typeof exports=="object"&&typeof module!="undefined"?module.exports=factory():typeof define=="function"&&define.amd?define(factory):(global=typeof globalThis!="undefined"?globalThis:global||self,global.bootstrap=factory())})(this,function(){"use strict";const elementMap=new Map,Data={set(element,key,instance){elementMap.has(element)||elementMap.set(element,new Map);const instanceMap=elementMap.get(element);if(!instanceMap.has(key)&&instanceMap.size!==0){console.error(`Bootstrap doesn't allow more than one instance per element. Bound instance: ${Array.from(instanceMap.keys())[0]}.`);return}instanceMap.set(key,instance)},get(element,key){return elementMap.has(element)?elementMap.get(element).get(key)||null:null},remove(element,key){if(!elementMap.has(element))return;const instanceMap=elementMap.get(element);instanceMap.delete(key),instanceMap.size===0&&elementMap.delete(element)}},MAX_UID=1e6,MILLISECONDS_MULTIPLIER=1e3,TRANSITION_END="transitionend",parseSelector=selector=>(selector&&window.CSS&&window.CSS.escape&&(selector=selector.replace(/#([^\s"#']+)/g,(match,id)=>`#${CSS.escape(id)}`)),selector),toType=object=>object==null?`${object}`:Object.prototype.toString.call(object).match(/\s([a-z]+)/i)[1].toLowerCase(),getUID=prefix=>{do prefix+=Math.floor(Math.random()*MAX_UID);while(document.getElementById(prefix))return prefix},getTransitionDurationFromElement=element=>{if(!element)return 0;let{transitionDuration,transitionDelay}=window.getComputedStyle(element);const floatTransitionDuration=Number.parseFloat(transitionDuration),floatTransitionDelay=Number.parseFloat(transitionDelay);return!floatTransitionDuration&&!floatTransitionDelay?0:(transitionDuration=transitionDuration.split(",")[0],transitionDelay=transitionDelay.split(",")[0],(Number.parseFloat(transitionDuration)+Number.parseFloat(transitionDelay))*MILLISECONDS_MULTIPLIER)},triggerTransitionEnd=element=>{element.dispatchEvent(new Event(TRANSITION_END))},isElement$1=object=>!!object&&typeof object=="object"&&(typeof object.jquery!="undefined"&&(object=object[0]),typeof object.nodeType!="undefined"),getElement=object=>isElement$1(object)?object.jquery?object[0]:object:typeof object=="string"&&object.length>0?document.querySelector(parseSelector(object)):null,isVisible=element=>{if(!isElement$1(element)||element.getClientRects().length===0)return!1;const elementIsVisible=getComputedStyle(element).getPropertyValue("visibility")==="visible",closedDetails=element.closest("details:not([open])");if(!closedDetails)return elementIsVisible;if(closedDetails!==element){const summary=element.closest("summary");if(summary&&summary.parentNode!==closedDetails)return!1;if(summary===null)return!1}return elementIsVisible},isDisabled=element=>!element||element.nodeType!==Node.ELEMENT_NODE||!!element.classList.contains("disabled")||(typeof element.disabled!="undefined"?element.disabled:element.hasAttribute("disabled")&&element.getAttribute("disabled")!=="false"),findShadowRoot=element=>{if(!document.documentElement.attachShadow)return null;if(typeof element.getRootNode=="function"){const root=element.getRootNode();return root instanceof ShadowRoot?root:null}return element instanceof ShadowRoot?element:element.parentNode?findShadowRoot(element.parentNode):null},noop=()=>{},reflow=element=>{element.offsetHeight},getjQuery=()=>window.jQuery&&!document.body.hasAttribute("data-bs-no-jquery")?window.jQuery:null,DOMContentLoadedCallbacks=[],onDOMContentLoaded=callback=>{document.readyState==="loading"?(DOMContentLoadedCallbacks.length||document.addEventListener("DOMContentLoaded",()=>{for(const callback of DOMContentLoadedCallbacks)callback()}),DOMContentLoadedCallbacks.push(callback)):callback()},isRTL=()=>document.documentElement.dir==="rtl",defineJQueryPlugin=plugin=>{onDOMContentLoaded(()=>{const $=getjQuery();if($){const name=plugin.NAME,JQUERY_NO_CONFLICT=$.fn[name];$.fn[name]=plugin.jQueryInterface,$.fn[name].Constructor=plugin,$.fn[name].noConflict=()=>($.fn[name]=JQUERY_NO_CONFLICT,plugin.jQueryInterface)}})},execute=(possibleCallback,args=[],defaultValue=possibleCallback)=>typeof possibleCallback=="function"?possibleCallback(...args):defaultValue,executeAfterTransition=(callback,transitionElement,waitForTransition=!0)=>{if(!waitForTransition){execute(callback);return}const durationPadding=5,emulatedDuration=getTransitionDurationFromElement(transitionElement)+durationPadding;let called=!1;const handler=({target})=>{if(target!==transitionElement)return;called=!0,transitionElement.removeEventListener(TRANSITION_END,handler),execute(callback)};transitionElement.addEventListener(TRANSITION_END,handler),setTimeout(()=>{called||triggerTransitionEnd(transitionElement)},emulatedDuration)},getNextActiveElement=(list,activeElement,shouldGetNext,isCycleAllowed)=>{const listLength=list.length;let index=list.indexOf(activeElement);return index===-1?!shouldGetNext&&isCycleAllowed?list[listLength-1]:list[0]:(index+=shouldGetNext?1:-1,isCycleAllowed&&(index=(index+listLength)%listLength),list[Math.max(0,Math.min(index,listLength-1))])},namespaceRegex=/[^.]*(?=\..*)\.|.*/,stripNameRegex=/\..*/,stripUidRegex=/::\d+$/,eventRegistry={};let uidEvent=1;const customEvents={mouseenter:"mouseover",mouseleave:"mouseout"},nativeEvents=new Set(["click","dblclick","mouseup","mousedown","contextmenu","mousewheel","DOMMouseScroll","mouseover","mouseout","mousemove","selectstart","selectend","keydown","keypress","keyup","orientationchange","touchstart","touchmove","touchend","touchcancel","pointerdown","pointermove","pointerup","pointerleave","pointercancel","gesturestart","gesturechange","gestureend","focus","blur","change","reset","select","submit","focusin","focusout","load","unload","beforeunload","resize","move","DOMContentLoaded","readystatechange","error","abort","scroll"]);function makeEventUid(element,uid){return uid&&`${uid}::${uidEvent++}`||element.uidEvent||uidEvent++}function getElementEvents(element){const uid=makeEventUid(element);return element.uidEvent=uid,eventRegistry[uid]=eventRegistry[uid]||{},eventRegistry[uid]}function bootstrapHandler(element,fn){return function handler(event){return hydrateObj(event,{delegateTarget:element}),handler.oneOff&&EventHandler.off(element,event.type,fn),fn.apply(element,[event])}}function bootstrapDelegationHandler(element,selector,fn){return function handler(event){const domElements=element.querySelectorAll(selector);for(let{target}=event;target&&target!==this;target=target.parentNode)for(const domElement of domElements){if(domElement!==target)continue;return hydrateObj(event,{delegateTarget:target}),handler.oneOff&&EventHandler.off(element,event.type,selector,fn),fn.apply(target,[event])}}}function findHandler(events,callable,delegationSelector=null){return Object.values(events).find(event=>event.callable===callable&&event.delegationSelector===delegationSelector)}function normalizeParameters(originalTypeEvent,handler,delegationFunction){const isDelegated=typeof handler=="string",callable=isDelegated?delegationFunction:handler||delegationFunction;let typeEvent=getTypeEvent(originalTypeEvent);return nativeEvents.has(typeEvent)||(typeEvent=originalTypeEvent),[isDelegated,callable,typeEvent]}function addHandler(element,originalTypeEvent,handler,delegationFunction,oneOff){if(typeof originalTypeEvent!="string"||!element)return;let[isDelegated,callable,typeEvent]=normalizeParameters(originalTypeEvent,handler,delegationFunction);if(originalTypeEvent in customEvents){const wrapFunction=fn=>function(event){if(!event.relatedTarget||event.relatedTarget!==event.delegateTarget&&!event.delegateTarget.contains(event.relatedTarget))return fn.call(this,event)};callable=wrapFunction(callable)}const events=getElementEvents(element),handlers=events[typeEvent]||(events[typeEvent]={}),previousFunction=findHandler(handlers,callable,isDelegated?handler:null);if(previousFunction){previousFunction.oneOff=previousFunction.oneOff&&oneOff;return}const uid=makeEventUid(callable,originalTypeEvent.replace(namespaceRegex,"")),fn=isDelegated?bootstrapDelegationHandler(element,handler,callable):bootstrapHandler(element,callable);fn.delegationSelector=isDelegated?handler:null,fn.callable=callable,fn.oneOff=oneOff,fn.uidEvent=uid,handlers[uid]=fn,element.addEventListener(typeEvent,fn,isDelegated)}function removeHandler(element,events,typeEvent,handler,delegationSelector){const fn=findHandler(events[typeEvent],handler,delegationSelector);if(!fn)return;element.removeEventListener(typeEvent,fn,Boolean(delegationSelector)),delete events[typeEvent][fn.uidEvent]}function removeNamespacedHandlers(element,events,typeEvent,namespace){const storeElementEvent=events[typeEvent]||{};for(const[handlerKey,event]of Object.entries(storeElementEvent))handlerKey.includes(namespace)&&removeHandler(element,events,typeEvent,event.callable,event.delegationSelector)}function getTypeEvent(event){return event=event.replace(stripNameRegex,""),customEvents[event]||event}const EventHandler={on(element,event,handler,delegationFunction){addHandler(element,event,handler,delegationFunction,!1)},one(element,event,handler,delegationFunction){addHandler(element,event,handler,delegationFunction,!0)},off(element,originalTypeEvent,handler,delegationFunction){if(typeof originalTypeEvent!="string"||!element)return;const[isDelegated,callable,typeEvent]=normalizeParameters(originalTypeEvent,handler,delegationFunction),inNamespace=typeEvent!==originalTypeEvent,events=getElementEvents(element),storeElementEvent=events[typeEvent]||{},isNamespace=originalTypeEvent.startsWith(".");if(typeof callable!="undefined"){if(!Object.keys(storeElementEvent).length)return;removeHandler(element,events,typeEvent,callable,isDelegated?handler:null);return}if(isNamespace)for(const elementEvent of Object.keys(events))removeNamespacedHandlers(element,events,elementEvent,originalTypeEvent.slice(1));for(const[keyHandlers,event]of Object.entries(storeElementEvent)){const handlerKey=keyHandlers.replace(stripUidRegex,"");(!inNamespace||originalTypeEvent.includes(handlerKey))&&removeHandler(element,events,typeEvent,event.callable,event.delegationSelector)}},trigger(element,event,args){if(typeof event!="string"||!element)return null;const $=getjQuery(),typeEvent=getTypeEvent(event),inNamespace=event!==typeEvent;let jQueryEvent=null,bubbles=!0,nativeDispatch=!0,defaultPrevented=!1;inNamespace&&$&&(jQueryEvent=$.Event(event,args),$(element).trigger(jQueryEvent),bubbles=!jQueryEvent.isPropagationStopped(),nativeDispatch=!jQueryEvent.isImmediatePropagationStopped(),defaultPrevented=jQueryEvent.isDefaultPrevented());const evt=hydrateObj(new Event(event,{bubbles,cancelable:!0}),args);return defaultPrevented&&evt.preventDefault(),nativeDispatch&&element.dispatchEvent(evt),evt.defaultPrevented&&jQueryEvent&&jQueryEvent.preventDefault(),evt}};function hydrateObj(obj,meta={}){for(const[key,value]of Object.entries(meta))try{obj[key]=value}catch{Object.defineProperty(obj,key,{configurable:!0,get(){return value}})}return obj}function normalizeData(value){if(value==="true")return!0;if(value==="false")return!1;if(value===Number(value).toString())return Number(value);if(value===""||value==="null")return null;if(typeof value!="string")return value;try{return JSON.parse(decodeURIComponent(value))}catch{return value}}function normalizeDataKey(key){return key.replace(/[A-Z]/g,chr=>`-${chr.toLowerCase()}`)}const Manipulator={setDataAttribute(element,key,value){element.setAttribute(`data-bs-${normalizeDataKey(key)}`,value)},removeDataAttribute(element,key){element.removeAttribute(`data-bs-${normalizeDataKey(key)}`)},getDataAttributes(element){if(!element)return{};const attributes={},bsKeys=Object.keys(element.dataset).filter(key=>key.startsWith("bs")&&!key.startsWith("bsConfig"));for(const key of bsKeys){let pureKey=key.replace(/^bs/,"");pureKey=pureKey.charAt(0).toLowerCase()+pureKey.slice(1,pureKey.length),attributes[pureKey]=normalizeData(element.dataset[key])}return attributes},getDataAttribute(element,key){return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`))}};class Config{static get Default(){return{}}static get DefaultType(){return{}}static get NAME(){throw new Error('You have to implement the static method "NAME", for each component!')}_getConfig(config){return config=this._mergeConfigObj(config),config=this._configAfterMerge(config),this._typeCheckConfig(config),config}_configAfterMerge(config){return config}_mergeConfigObj(config,element){const jsonConfig=isElement$1(element)?Manipulator.getDataAttribute(element,"config"):{};return{...this.constructor.Default,...typeof jsonConfig=="object"?jsonConfig:{},...isElement$1(element)?Manipulator.getDataAttributes(element):{},...typeof config=="object"?config:{}}}_typeCheckConfig(config,configTypes=this.constructor.DefaultType){for(const[property,expectedTypes]of Object.entries(configTypes)){const value=config[property],valueType=isElement$1(value)?"element":toType(value);if(!new RegExp(expectedTypes).test(valueType))throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option "${property}" provided type "${valueType}" but expected type "${expectedTypes}".`)}}}const VERSION="5.3.3";class BaseComponent extends Config{constructor(element,config){if(super(),element=getElement(element),!element)return;this._element=element,this._config=this._getConfig(config),Data.set(this._element,this.constructor.DATA_KEY,this)}dispose(){Data.remove(this._element,this.constructor.DATA_KEY),EventHandler.off(this._element,this.constructor.EVENT_KEY);for(const propertyName of Object.getOwnPropertyNames(this))this[propertyName]=null}_queueCallback(callback,element,isAnimated=!0){executeAfterTransition(callback,element,isAnimated)}_getConfig(config){return config=this._mergeConfigObj(config,this._element),config=this._configAfterMerge(config),this._typeCheckConfig(config),config}static getInstance(element){return Data.get(getElement(element),this.DATA_KEY)}static getOrCreateInstance(element,config={}){return this.getInstance(element)||new this(element,typeof config=="object"?config:null)}static get VERSION(){return VERSION}static get DATA_KEY(){return`bs.${this.NAME}`}static get EVENT_KEY(){return`.${this.DATA_KEY}`}static eventName(name){return`${name}${this.EVENT_KEY}`}}const getSelector=element=>{let selector=element.getAttribute("data-bs-target");if(!selector||selector==="#"){let hrefAttribute=element.getAttribute("href");if(!hrefAttribute||!hrefAttribute.includes("#")&&!hrefAttribute.startsWith("."))return null;hrefAttribute.includes("#")&&!hrefAttribute.startsWith("#")&&(hrefAttribute=`#${hrefAttribute.split("#")[1]}`),selector=hrefAttribute&&hrefAttribute!=="#"?hrefAttribute.trim():null}return selector?selector.split(",").map(sel=>parseSelector(sel)).join(","):null},SelectorEngine={find(selector,element=document.documentElement){return[].concat(...Element.prototype.querySelectorAll.call(element,selector))},findOne(selector,element=document.documentElement){return Element.prototype.querySelector.call(element,selector)},children(element,selector){return[].concat(...element.children).filter(child=>child.matches(selector))},parents(element,selector){const parents=[];let ancestor=element.parentNode.closest(selector);for(;ancestor;)parents.push(ancestor),ancestor=ancestor.parentNode.closest(selector);return parents},prev(element,selector){let previous=element.previousElementSibling;for(;previous;){if(previous.matches(selector))return[previous];previous=previous.previousElementSibling}return[]},next(element,selector){let next=element.nextElementSibling;for(;next;){if(next.matches(selector))return[next];next=next.nextElementSibling}return[]},focusableChildren(element){const focusables=["a","button","input","textarea","select","details","[tabindex]",'[contenteditable="true"]'].map(selector=>`${selector}:not([tabindex^="-"])`).join(",");return this.find(focusables,element).filter(el=>!isDisabled(el)&&isVisible(el))},getSelectorFromElement(element){const selector=getSelector(element);return selector?SelectorEngine.findOne(selector)?selector:null:null},getElementFromSelector(element){const selector=getSelector(element);return selector?SelectorEngine.findOne(selector):null},getMultipleElementsFromSelector(element){const selector=getSelector(element);return selector?SelectorEngine.find(selector):[]}},enableDismissTrigger=(component,method="hide")=>{const clickEvent=`click.dismiss${component.EVENT_KEY}`,name=component.NAME;EventHandler.on(document,clickEvent,`[data-bs-dismiss="${name}"]`,function(event){if(["A","AREA"].includes(this.tagName)&&event.preventDefault(),isDisabled(this))return;const target=SelectorEngine.getElementFromSelector(this)||this.closest(`.${name}`),instance=component.getOrCreateInstance(target);instance[method]()})},NAME$f="alert",DATA_KEY$a="bs.alert",EVENT_KEY$b=`.${DATA_KEY$a}`,EVENT_CLOSE=`close${EVENT_KEY$b}`,EVENT_CLOSED=`closed${EVENT_KEY$b}`,CLASS_NAME_FADE$5="fade",CLASS_NAME_SHOW$8="show";class Alert extends BaseComponent{static get NAME(){return NAME$f}close(){const closeEvent=EventHandler.trigger(this._element,EVENT_CLOSE);if(closeEvent.defaultPrevented)return;this._element.classList.remove(CLASS_NAME_SHOW$8);const isAnimated=this._element.classList.contains(CLASS_NAME_FADE$5);this._queueCallback(()=>this._destroyElement(),this._element,isAnimated)}_destroyElement(){this._element.remove(),EventHandler.trigger(this._element,EVENT_CLOSED),this.dispose()}static jQueryInterface(config){return this.each(function(){const data=Alert.getOrCreateInstance(this);if(typeof config!="string")return;if(data[config]===void 0||config.startsWith("_")||config==="constructor")throw new TypeError(`No method named "${config}"`);data[config](this)})}}enableDismissTrigger(Alert,"close"),defineJQueryPlugin(Alert);const NAME$e="button",DATA_KEY$9="bs.button",EVENT_KEY$a=`.${DATA_KEY$9}`,DATA_API_KEY$6=".data-api",CLASS_NAME_ACTIVE$3="active",SELECTOR_DATA_TOGGLE$5='[data-bs-toggle="button"]',EVENT_CLICK_DATA_API$6=`click${EVENT_KEY$a}${DATA_API_KEY$6}`;class Button extends BaseComponent{static get NAME(){return NAME$e}toggle(){this._element.setAttribute("aria-pressed",this._element.classList.toggle(CLASS_NAME_ACTIVE$3))}static jQueryInterface(config){return this.each(function(){const data=Button.getOrCreateInstance(this);config==="toggle"&&data[config]()})}}EventHandler.on(document,EVENT_CLICK_DATA_API$6,SELECTOR_DATA_TOGGLE$5,event=>{event.preventDefault();const button=event.target.closest(SELECTOR_DATA_TOGGLE$5),data=Button.getOrCreateInstance(button);data.toggle()}),defineJQueryPlugin(Button);const NAME$d="swipe",EVENT_KEY$9=".bs.swipe",EVENT_TOUCHSTART=`touchstart${EVENT_KEY$9}`,EVENT_TOUCHMOVE=`touchmove${EVENT_KEY$9}`,EVENT_TOUCHEND=`touchend${EVENT_KEY$9}`,EVENT_POINTERDOWN=`pointerdown${EVENT_KEY$9}`,EVENT_POINTERUP=`pointerup${EVENT_KEY$9}`,POINTER_TYPE_TOUCH="touch",POINTER_TYPE_PEN="pen",CLASS_NAME_POINTER_EVENT="pointer-event",SWIPE_THRESHOLD=40,Default$c={endCallback:null,leftCallback:null,rightCallback:null},DefaultType$c={endCallback:"(function|null)",leftCallback:"(function|null)",rightCallback:"(function|null)"};class Swipe extends Config{constructor(element,config){if(super(),this._element=element,!element||!Swipe.isSupported())return;this._config=this._getConfig(config),this._deltaX=0,this._supportPointerEvents=Boolean(window.PointerEvent),this._initEvents()}static get Default(){return Default$c}static get DefaultType(){return DefaultType$c}static get NAME(){return NAME$d}dispose(){EventHandler.off(this._element,EVENT_KEY$9)}_start(event){if(!this._supportPointerEvents){this._deltaX=event.touches[0].clientX;return}this._eventIsPointerPenTouch(event)&&(this._deltaX=event.clientX)}_end(event){this._eventIsPointerPenTouch(event)&&(this._deltaX=event.clientX-this._deltaX),this._handleSwipe(),execute(this._config.endCallback)}_move(event){this._deltaX=event.touches&&event.touches.length>1?0:event.touches[0].clientX-this._deltaX}_handleSwipe(){const absDeltaX=Math.abs(this._deltaX);if(absDeltaX<=SWIPE_THRESHOLD)return;const direction=absDeltaX/this._deltaX;if(this._deltaX=0,!direction)return;execute(direction>0?this._config.rightCallback:this._config.leftCallback)}_initEvents(){this._supportPointerEvents?(EventHandler.on(this._element,EVENT_POINTERDOWN,event=>this._start(event)),EventHandler.on(this._element,EVENT_POINTERUP,event=>this._end(event)),this._element.classList.add(CLASS_NAME_POINTER_EVENT)):(EventHandler.on(this._element,EVENT_TOUCHSTART,event=>this._start(event)),EventHandler.on(this._element,EVENT_TOUCHMOVE,event=>this._move(event)),EventHandler.on(this._element,EVENT_TOUCHEND,event=>this._end(event)))}_eventIsPointerPenTouch(event){return this._supportPointerEvents&&(event.pointerType===POINTER_TYPE_PEN||event.pointerType===POINTER_TYPE_TOUCH)}static isSupported(){return"ontouchstart"in document.documentElement||navigator.maxTouchPoints>0}}const NAME$c="carousel",DATA_KEY$8="bs.carousel",EVENT_KEY$8=`.${DATA_KEY$8}`,DATA_API_KEY$5=".data-api",ARROW_LEFT_KEY$1="ArrowLeft",ARROW_RIGHT_KEY$1="ArrowRight",TOUCHEVENT_COMPAT_WAIT=500,ORDER_NEXT="next",ORDER_PREV="prev",DIRECTION_LEFT="left",DIRECTION_RIGHT="right",EVENT_SLIDE=`slide${EVENT_KEY$8}`,EVENT_SLID=`slid${EVENT_KEY$8}`,EVENT_KEYDOWN$1=`keydown${EVENT_KEY$8}`,EVENT_MOUSEENTER$1=`mouseenter${EVENT_KEY$8}`,EVENT_MOUSELEAVE$1=`mouseleave${EVENT_KEY$8}`,EVENT_DRAG_START=`dragstart${EVENT_KEY$8}`,EVENT_LOAD_DATA_API$3=`load${EVENT_KEY$8}${DATA_API_KEY$5}`,EVENT_CLICK_DATA_API$5=`click${EVENT_KEY$8}${DATA_API_KEY$5}`,CLASS_NAME_CAROUSEL="carousel",CLASS_NAME_ACTIVE$2="active",CLASS_NAME_SLIDE="slide",CLASS_NAME_END="carousel-item-end",CLASS_NAME_START="carousel-item-start",CLASS_NAME_NEXT="carousel-item-next",CLASS_NAME_PREV="carousel-item-prev",SELECTOR_ACTIVE=".active",SELECTOR_ITEM=".carousel-item",SELECTOR_ACTIVE_ITEM=SELECTOR_ACTIVE+SELECTOR_ITEM,SELECTOR_ITEM_IMG=".carousel-item img",SELECTOR_INDICATORS=".carousel-indicators",SELECTOR_DATA_SLIDE="[data-bs-slide], [data-bs-slide-to]",SELECTOR_DATA_RIDE='[data-bs-ride="carousel"]',KEY_TO_DIRECTION={[ARROW_LEFT_KEY$1]:DIRECTION_RIGHT,[ARROW_RIGHT_KEY$1]:DIRECTION_LEFT},Default$b={interval:5e3,keyboard:!0,pause:"hover",ride:!1,touch:!0,wrap:!0},DefaultType$b={interval:"(number|boolean)",keyboard:"boolean",pause:"(string|boolean)",ride:"(boolean|string)",touch:"boolean",wrap:"boolean"};class Carousel extends BaseComponent{constructor(element,config){super(element,config),this._interval=null,this._activeElement=null,this._isSliding=!1,this.touchTimeout=null,this._swipeHelper=null,this._indicatorsElement=SelectorEngine.findOne(SELECTOR_INDICATORS,this._element),this._addEventListeners(),this._config.ride===CLASS_NAME_CAROUSEL&&this.cycle()}static get Default(){return Default$b}static get DefaultType(){return DefaultType$b}static get NAME(){return NAME$c}next(){this._slide(ORDER_NEXT)}nextWhenVisible(){!document.hidden&&isVisible(this._element)&&this.next()}prev(){this._slide(ORDER_PREV)}pause(){this._isSliding&&triggerTransitionEnd(this._element),this._clearInterval()}cycle(){this._clearInterval(),this._updateInterval(),this._interval=setInterval(()=>this.nextWhenVisible(),this._config.interval)}_maybeEnableCycle(){if(!this._config.ride)return;if(this._isSliding){EventHandler.one(this._element,EVENT_SLID,()=>this.cycle());return}this.cycle()}to(index){const items=this._getItems();if(index>items.length-1||index<0)return;if(this._isSliding){EventHandler.one(this._element,EVENT_SLID,()=>this.to(index));return}const activeIndex=this._getItemIndex(this._getActive());if(activeIndex===index)return;const order=index>activeIndex?ORDER_NEXT:ORDER_PREV;this._slide(order,items[index])}dispose(){this._swipeHelper&&this._swipeHelper.dispose(),super.dispose()}_configAfterMerge(config){return config.defaultInterval=config.interval,config}_addEventListeners(){this._config.keyboard&&EventHandler.on(this._element,EVENT_KEYDOWN$1,event=>this._keydown(event)),this._config.pause==="hover"&&(EventHandler.on(this._element,EVENT_MOUSEENTER$1,()=>this.pause()),EventHandler.on(this._element,EVENT_MOUSELEAVE$1,()=>this._maybeEnableCycle())),this._config.touch&&Swipe.isSupported()&&this._addTouchEventListeners()}_addTouchEventListeners(){for(const img of SelectorEngine.find(SELECTOR_ITEM_IMG,this._element))EventHandler.on(img,EVENT_DRAG_START,event=>event.preventDefault());const endCallBack=()=>{if(this._config.pause!=="hover")return;this.pause(),this.touchTimeout&&clearTimeout(this.touchTimeout),this.touchTimeout=setTimeout(()=>this._maybeEnableCycle(),TOUCHEVENT_COMPAT_WAIT+this._config.interval)},swipeConfig={leftCallback:()=>this._slide(this._directionToOrder(DIRECTION_LEFT)),rightCallback:()=>this._slide(this._directionToOrder(DIRECTION_RIGHT)),endCallback:endCallBack};this._swipeHelper=new Swipe(this._element,swipeConfig)}_keydown(event){if(/input|textarea/i.test(event.target.tagName))return;const direction=KEY_TO_DIRECTION[event.key];direction&&(event.preventDefault(),this._slide(this._directionToOrder(direction)))}_getItemIndex(element){return this._getItems().indexOf(element)}_setActiveIndicatorElement(index){if(!this._indicatorsElement)return;const activeIndicator=SelectorEngine.findOne(SELECTOR_ACTIVE,this._indicatorsElement);activeIndicator.classList.remove(CLASS_NAME_ACTIVE$2),activeIndicator.removeAttribute("aria-current");const newActiveIndicator=SelectorEngine.findOne(`[data-bs-slide-to="${index}"]`,this._indicatorsElement);newActiveIndicator&&(newActiveIndicator.classList.add(CLASS_NAME_ACTIVE$2),newActiveIndicator.setAttribute("aria-current","true"))}_updateInterval(){const element=this._activeElement||this._getActive();if(!element)return;const elementInterval=Number.parseInt(element.getAttribute("data-bs-interval"),10);this._config.interval=elementInterval||this._config.defaultInterval}_slide(order,element=null){if(this._isSliding)return;const activeElement=this._getActive(),isNext=order===ORDER_NEXT,nextElement=element||getNextActiveElement(this._getItems(),activeElement,isNext,this._config.wrap);if(nextElement===activeElement)return;const nextElementIndex=this._getItemIndex(nextElement),triggerEvent=eventName=>EventHandler.trigger(this._element,eventName,{relatedTarget:nextElement,direction:this._orderToDirection(order),from:this._getItemIndex(activeElement),to:nextElementIndex}),slideEvent=triggerEvent(EVENT_SLIDE);if(slideEvent.defaultPrevented)return;if(!activeElement||!nextElement)return;const isCycling=Boolean(this._interval);this.pause(),this._isSliding=!0,this._setActiveIndicatorElement(nextElementIndex),this._activeElement=nextElement;const directionalClassName=isNext?CLASS_NAME_START:CLASS_NAME_END,orderClassName=isNext?CLASS_NAME_NEXT:CLASS_NAME_PREV;nextElement.classList.add(orderClassName),reflow(nextElement),activeElement.classList.add(directionalClassName),nextElement.classList.add(directionalClassName);const completeCallBack=()=>{nextElement.classList.remove(directionalClassName,orderClassName),nextElement.classList.add(CLASS_NAME_ACTIVE$2),activeElement.classList.remove(CLASS_NAME_ACTIVE$2,orderClassName,directionalClassName),this._isSliding=!1,triggerEvent(EVENT_SLID)};this._queueCallback(completeCallBack,activeElement,this._isAnimated()),isCycling&&this.cycle()}_isAnimated(){return this._element.classList.contains(CLASS_NAME_SLIDE)}_getActive(){return SelectorEngine.findOne(SELECTOR_ACTIVE_ITEM,this._element)}_getItems(){return SelectorEngine.find(SELECTOR_ITEM,this._element)}_clearInterval(){this._interval&&(clearInterval(this._interval),this._interval=null)}_directionToOrder(direction){return isRTL()?direction===DIRECTION_LEFT?ORDER_PREV:ORDER_NEXT:direction===DIRECTION_LEFT?ORDER_NEXT:ORDER_PREV}_orderToDirection(order){return isRTL()?order===ORDER_PREV?DIRECTION_LEFT:DIRECTION_RIGHT:order===ORDER_PREV?DIRECTION_RIGHT:DIRECTION_LEFT}static jQueryInterface(config){return this.each(function(){const data=Carousel.getOrCreateInstance(this,config);if(typeof config=="number"){data.to(config);return}if(typeof config=="string"){if(data[config]===void 0||config.startsWith("_")||config==="constructor")throw new TypeError(`No method named "${config}"`);data[config]()}})}}EventHandler.on(document,EVENT_CLICK_DATA_API$5,SELECTOR_DATA_SLIDE,function(event){const target=SelectorEngine.getElementFromSelector(this);if(!target||!target.classList.contains(CLASS_NAME_CAROUSEL))return;event.preventDefault();const carousel=Carousel.getOrCreateInstance(target),slideIndex=this.getAttribute("data-bs-slide-to");if(slideIndex){carousel.to(slideIndex),carousel._maybeEnableCycle();return}if(Manipulator.getDataAttribute(this,"slide")==="next"){carousel.next(),carousel._maybeEnableCycle();return}carousel.prev(),carousel._maybeEnableCycle()}),EventHandler.on(window,EVENT_LOAD_DATA_API$3,()=>{const carousels=SelectorEngine.find(SELECTOR_DATA_RIDE);for(const carousel of carousels)Carousel.getOrCreateInstance(carousel)}),defineJQueryPlugin(Carousel);const NAME$b="collapse",DATA_KEY$7="bs.collapse",EVENT_KEY$7=`.${DATA_KEY$7}`,DATA_API_KEY$4=".data-api",EVENT_SHOW$6=`show${EVENT_KEY$7}`,EVENT_SHOWN$6=`shown${EVENT_KEY$7}`,EVENT_HIDE$6=`hide${EVENT_KEY$7}`,EVENT_HIDDEN$6=`hidden${EVENT_KEY$7}`,EVENT_CLICK_DATA_API$4=`click${EVENT_KEY$7}${DATA_API_KEY$4}`,CLASS_NAME_SHOW$7="show",CLASS_NAME_COLLAPSE="collapse",CLASS_NAME_COLLAPSING="collapsing",CLASS_NAME_COLLAPSED="collapsed",CLASS_NAME_DEEPER_CHILDREN=`:scope .${CLASS_NAME_COLLAPSE} .${CLASS_NAME_COLLAPSE}`,CLASS_NAME_HORIZONTAL="collapse-horizontal",WIDTH="width",HEIGHT="height",SELECTOR_ACTIVES=".collapse.show, .collapse.collapsing",SELECTOR_DATA_TOGGLE$4='[data-bs-toggle="collapse"]',Default$a={parent:null,toggle:!0},DefaultType$a={parent:"(null|element)",toggle:"boolean"};class Collapse extends BaseComponent{constructor(element,config){super(element,config),this._isTransitioning=!1,this._triggerArray=[];const toggleList=SelectorEngine.find(SELECTOR_DATA_TOGGLE$4);for(const elem of toggleList){const selector=SelectorEngine.getSelectorFromElement(elem),filterElement=SelectorEngine.find(selector).filter(foundElement=>foundElement===this._element);selector!==null&&filterElement.length&&this._triggerArray.push(elem)}this._initializeChildren(),this._config.parent||this._addAriaAndCollapsedClass(this._triggerArray,this._isShown()),this._config.toggle&&this.toggle()}static get Default(){return Default$a}static get DefaultType(){return DefaultType$a}static get NAME(){return NAME$b}toggle(){this._isShown()?this.hide():this.show()}show(){if(this._isTransitioning||this._isShown())return;let activeChildren=[];if(this._config.parent&&(activeChildren=this._getFirstLevelChildren(SELECTOR_ACTIVES).filter(element=>element!==this._element).map(element=>Collapse.getOrCreateInstance(element,{toggle:!1}))),activeChildren.length&&activeChildren[0]._isTransitioning)return;const startEvent=EventHandler.trigger(this._element,EVENT_SHOW$6);if(startEvent.defaultPrevented)return;for(const activeInstance of activeChildren)activeInstance.hide();const dimension=this._getDimension();this._element.classList.remove(CLASS_NAME_COLLAPSE),this._element.classList.add(CLASS_NAME_COLLAPSING),this._element.style[dimension]=0,this._addAriaAndCollapsedClass(this._triggerArray,!0),this._isTransitioning=!0;const complete=()=>{this._isTransitioning=!1,this._element.classList.remove(CLASS_NAME_COLLAPSING),this._element.classList.add(CLASS_NAME_COLLAPSE,CLASS_NAME_SHOW$7),this._element.style[dimension]="",EventHandler.trigger(this._element,EVENT_SHOWN$6)},capitalizedDimension=dimension[0].toUpperCase()+dimension.slice(1),scrollSize=`scroll${capitalizedDimension}`;this._queueCallback(complete,this._element,!0),this._element.style[dimension]=`${this._element[scrollSize]}px`}hide(){if(this._isTransitioning||!this._isShown())return;const startEvent=EventHandler.trigger(this._element,EVENT_HIDE$6);if(startEvent.defaultPrevented)return;const dimension=this._getDimension();this._element.style[dimension]=`${this._element.getBoundingClientRect()[dimension]}px`,reflow(this._element),this._element.classList.add(CLASS_NAME_COLLAPSING),this._element.classList.remove(CLASS_NAME_COLLAPSE,CLASS_NAME_SHOW$7);for(const trigger of this._triggerArray){const element=SelectorEngine.getElementFromSelector(trigger);element&&!this._isShown(element)&&this._addAriaAndCollapsedClass([trigger],!1)}this._isTransitioning=!0;const complete=()=>{this._isTransitioning=!1,this._element.classList.remove(CLASS_NAME_COLLAPSING),this._element.classList.add(CLASS_NAME_COLLAPSE),EventHandler.trigger(this._element,EVENT_HIDDEN$6)};this._element.style[dimension]="",this._queueCallback(complete,this._element,!0)}_isShown(element=this._element){return element.classList.contains(CLASS_NAME_SHOW$7)}_configAfterMerge(config){return config.toggle=Boolean(config.toggle),config.parent=getElement(config.parent),config}_getDimension(){return this._element.classList.contains(CLASS_NAME_HORIZONTAL)?WIDTH:HEIGHT}_initializeChildren(){if(!this._config.parent)return;const children=this._getFirstLevelChildren(SELECTOR_DATA_TOGGLE$4);for(const element of children){const selected=SelectorEngine.getElementFromSelector(element);selected&&this._addAriaAndCollapsedClass([element],this._isShown(selected))}}_getFirstLevelChildren(selector){const children=SelectorEngine.find(CLASS_NAME_DEEPER_CHILDREN,this._config.parent);return SelectorEngine.find(selector,this._config.parent).filter(element=>!children.includes(element))}_addAriaAndCollapsedClass(triggerArray,isOpen){if(!triggerArray.length)return;for(const element of triggerArray)element.classList.toggle(CLASS_NAME_COLLAPSED,!isOpen),element.setAttribute("aria-expanded",isOpen)}static jQueryInterface(config){const _config={};return typeof config=="string"&&/show|hide/.test(config)&&(_config.toggle=!1),this.each(function(){const data=Collapse.getOrCreateInstance(this,_config);if(typeof config=="string"){if(typeof data[config]=="undefined")throw new TypeError(`No method named "${config}"`);data[config]()}})}}EventHandler.on(document,EVENT_CLICK_DATA_API$4,SELECTOR_DATA_TOGGLE$4,function(event){(event.target.tagName==="A"||event.delegateTarget&&event.delegateTarget.tagName==="A")&&event.preventDefault();for(const element of SelectorEngine.getMultipleElementsFromSelector(this))Collapse.getOrCreateInstance(element,{toggle:!1}).toggle()}),defineJQueryPlugin(Collapse);var top="top",bottom="bottom",right="right",left="left",auto="auto",basePlacements=[top,bottom,right,left],start="start",end="end",clippingParents="clippingParents",viewport="viewport",popper="popper",reference="reference",variationPlacements=basePlacements.reduce(function(acc,placement){return acc.concat([placement+"-"+start,placement+"-"+end])},[]),placements=[].concat(basePlacements,[auto]).reduce(function(acc,placement){return acc.concat([placement,placement+"-"+start,placement+"-"+end])},[]),beforeRead="beforeRead",read="read",afterRead="afterRead",beforeMain="beforeMain",main="main",afterMain="afterMain",beforeWrite="beforeWrite",write="write",afterWrite="afterWrite",modifierPhases=[beforeRead,read,afterRead,beforeMain,main,afterMain,beforeWrite,write,afterWrite];function getNodeName(element){return element?(element.nodeName||"").toLowerCase():null}function getWindow(node){if(node==null)return window;if(node.toString()!=="[object Window]"){var ownerDocument=node.ownerDocument;return ownerDocument?ownerDocument.defaultView||window:window}return node}function isElement(node){var OwnElement=getWindow(node).Element;return node instanceof OwnElement||node instanceof Element}function isHTMLElement(node){var OwnElement=getWindow(node).HTMLElement;return node instanceof OwnElement||node instanceof HTMLElement}function isShadowRoot(node){if(typeof ShadowRoot=="undefined")return!1;var OwnElement=getWindow(node).ShadowRoot;return node instanceof OwnElement||node instanceof ShadowRoot}function applyStyles(_ref){var state=_ref.state;Object.keys(state.elements).forEach(function(name){var style=state.styles[name]||{},attributes=state.attributes[name]||{},element=state.elements[name];if(!isHTMLElement(element)||!getNodeName(element))return;Object.assign(element.style,style),Object.keys(attributes).forEach(function(name){var value=attributes[name];value===!1?element.removeAttribute(name):element.setAttribute(name,value===!0?"":value)})})}function effect$2(_ref2){var state=_ref2.state,initialStyles={popper:{position:state.options.strategy,left:"0",top:"0",margin:"0"},arrow:{position:"absolute"},reference:{}};return Object.assign(state.elements.popper.style,initialStyles.popper),state.styles=initialStyles,state.elements.arrow&&Object.assign(state.elements.arrow.style,initialStyles.arrow),function(){Object.keys(state.elements).forEach(function(name){var element=state.elements[name],attributes=state.attributes[name]||{},styleProperties=Object.keys(state.styles.hasOwnProperty(name)?state.styles[name]:initialStyles[name]),style=styleProperties.reduce(function(style,property){return style[property]="",style},{});if(!isHTMLElement(element)||!getNodeName(element))return;Object.assign(element.style,style),Object.keys(attributes).forEach(function(attribute){element.removeAttribute(attribute)})})}}const applyStyles$1={name:"applyStyles",enabled:!0,phase:"write",fn:applyStyles,effect:effect$2,requires:["computeStyles"]};function getBasePlacement(placement){return placement.split("-")[0]}var max=Math.max,min=Math.min,round=Math.round;function getUAString(){var uaData=navigator.userAgentData;return uaData!=null&&uaData.brands&&Array.isArray(uaData.brands)?uaData.brands.map(function(item){return item.brand+"/"+item.version}).join(" "):navigator.userAgent}function isLayoutViewport(){return!/^((?!chrome|android).)*safari/i.test(getUAString())}function getBoundingClientRect(element,includeScale,isFixedStrategy){includeScale===void 0&&(includeScale=!1),isFixedStrategy===void 0&&(isFixedStrategy=!1);var clientRect=element.getBoundingClientRect(),scaleX=1,scaleY=1;includeScale&&isHTMLElement(element)&&(scaleX=element.offsetWidth>0?round(clientRect.width)/element.offsetWidth||1:1,scaleY=element.offsetHeight>0?round(clientRect.height)/element.offsetHeight||1:1);var _ref=isElement(element)?getWindow(element):window,visualViewport=_ref.visualViewport,addVisualOffsets=!isLayoutViewport()&&isFixedStrategy,x=(clientRect.left+(addVisualOffsets&&visualViewport?visualViewport.offsetLeft:0))/scaleX,y=(clientRect.top+(addVisualOffsets&&visualViewport?visualViewport.offsetTop:0))/scaleY,width=clientRect.width/scaleX,height=clientRect.height/scaleY;return{width,height,top:y,right:x+width,bottom:y+height,left:x,x,y}}function getLayoutRect(element){var clientRect=getBoundingClientRect(element),width=element.offsetWidth,height=element.offsetHeight;return Math.abs(clientRect.width-width)<=1&&(width=clientRect.width),Math.abs(clientRect.height-height)<=1&&(height=clientRect.height),{x:element.offsetLeft,y:element.offsetTop,width,height}}function contains(parent,child){var rootNode=child.getRootNode&&child.getRootNode();if(parent.contains(child))return!0;if(rootNode&&isShadowRoot(rootNode)){var next=child;do{if(next&&parent.isSameNode(next))return!0;next=next.parentNode||next.host}while(next)}return!1}function getComputedStyle$1(element){return getWindow(element).getComputedStyle(element)}function isTableElement(element){return["table","td","th"].indexOf(getNodeName(element))>=0}function getDocumentElement(element){return((isElement(element)?element.ownerDocument:element.document)||window.document).documentElement}function getParentNode(element){return getNodeName(element)==="html"?element:element.assignedSlot||element.parentNode||(isShadowRoot(element)?element.host:null)||getDocumentElement(element)}function getTrueOffsetParent(element){return!isHTMLElement(element)||getComputedStyle$1(element).position==="fixed"?null:element.offsetParent}function getContainingBlock(element){var isFirefox=/firefox/i.test(getUAString()),isIE=/Trident/i.test(getUAString());if(isIE&&isHTMLElement(element)){var elementCss=getComputedStyle$1(element);if(elementCss.position==="fixed")return null}var css,currentNode=getParentNode(element);for(isShadowRoot(currentNode)&&(currentNode=currentNode.host);isHTMLElement(currentNode)&&["html","body"].indexOf(getNodeName(currentNode))<0;){if(css=getComputedStyle$1(currentNode),css.transform!=="none"||css.perspective!=="none"||css.contain==="paint"||["transform","perspective"].indexOf(css.willChange)!==-1||isFirefox&&css.willChange==="filter"||isFirefox&&css.filter&&css.filter!=="none")return currentNode;currentNode=currentNode.parentNode}return null}function getOffsetParent(element){for(var window=getWindow(element),offsetParent=getTrueOffsetParent(element);offsetParent&&isTableElement(offsetParent)&&getComputedStyle$1(offsetParent).position==="static";)offsetParent=getTrueOffsetParent(offsetParent);return offsetParent&&(getNodeName(offsetParent)==="html"||getNodeName(offsetParent)==="body"&&getComputedStyle$1(offsetParent).position==="static")?window:offsetParent||getContainingBlock(element)||window}function getMainAxisFromPlacement(placement){return["top","bottom"].indexOf(placement)>=0?"x":"y"}function within(min$1,value,max$1){return max(min$1,min(value,max$1))}function withinMaxClamp(min,value,max){var v=within(min,value,max);return v>max?max:v}function getFreshSideObject(){return{top:0,right:0,bottom:0,left:0}}function mergePaddingObject(paddingObject){return Object.assign({},getFreshSideObject(),paddingObject)}function expandToHashMap(value,keys){return keys.reduce(function(hashMap,key){return hashMap[key]=value,hashMap},{})}var toPaddingObject=function(padding,state){return padding=typeof padding=="function"?padding(Object.assign({},state.rects,{placement:state.placement})):padding,mergePaddingObject(typeof padding!="number"?padding:expandToHashMap(padding,basePlacements))};function arrow(_ref){var _state$modifiersData$,state=_ref.state,name=_ref.name,options=_ref.options,arrowElement=state.elements.arrow,popperOffsets=state.modifiersData.popperOffsets,basePlacement=getBasePlacement(state.placement),axis=getMainAxisFromPlacement(basePlacement),isVertical=[left,right].indexOf(basePlacement)>=0,len=isVertical?"height":"width";if(!arrowElement||!popperOffsets)return;var paddingObject=toPaddingObject(options.padding,state),arrowRect=getLayoutRect(arrowElement),minProp=axis==="y"?top:left,maxProp=axis==="y"?bottom:right,endDiff=state.rects.reference[len]+state.rects.reference[axis]-popperOffsets[axis]-state.rects.popper[len],startDiff=popperOffsets[axis]-state.rects.reference[axis],arrowOffsetParent=getOffsetParent(arrowElement),clientSize=arrowOffsetParent?axis==="y"?arrowOffsetParent.clientHeight||0:arrowOffsetParent.clientWidth||0:0,centerToReference=endDiff/2-startDiff/2,min=paddingObject[minProp],max=clientSize-arrowRect[len]-paddingObject[maxProp],center=clientSize/2-arrowRect[len]/2+centerToReference,offset=within(min,center,max),axisProp=axis;state.modifiersData[name]=(_state$modifiersData$={},_state$modifiersData$[axisProp]=offset,_state$modifiersData$.centerOffset=offset-center,_state$modifiersData$)}function effect$1(_ref2){var state=_ref2.state,options=_ref2.options,_options$element=options.element,arrowElement=_options$element===void 0?"[data-popper-arrow]":_options$element;if(arrowElement==null)return;if(typeof arrowElement=="string"&&(arrowElement=state.elements.popper.querySelector(arrowElement),!arrowElement))return;if(!contains(state.elements.popper,arrowElement))return;state.elements.arrow=arrowElement}const arrow$1={name:"arrow",enabled:!0,phase:"main",fn:arrow,effect:effect$1,requires:["popperOffsets"],requiresIfExists:["preventOverflow"]};function getVariation(placement){return placement.split("-")[1]}var unsetSides={top:"auto",right:"auto",bottom:"auto",left:"auto"};function roundOffsetsByDPR(_ref,win){var x=_ref.x,y=_ref.y,dpr=win.devicePixelRatio||1;return{x:round(x*dpr)/dpr||0,y:round(y*dpr)/dpr||0}}function mapToStyles(_ref2){var _Object$assign2,_Object$assign,popper=_ref2.popper,popperRect=_ref2.popperRect,placement=_ref2.placement,variation=_ref2.variation,offsets=_ref2.offsets,position=_ref2.position,gpuAcceleration=_ref2.gpuAcceleration,adaptive=_ref2.adaptive,roundOffsets=_ref2.roundOffsets,isFixed=_ref2.isFixed,_offsets$x=offsets.x,x=_offsets$x===void 0?0:_offsets$x,_offsets$y=offsets.y,y=_offsets$y===void 0?0:_offsets$y,_ref3=typeof roundOffsets=="function"?roundOffsets({x,y}):{x,y},x=_ref3.x,y=_ref3.y,hasX=offsets.hasOwnProperty("x"),hasY=offsets.hasOwnProperty("y"),sideX=left,sideY=top,win=window;if(adaptive){var offsetParent=getOffsetParent(popper),heightProp="clientHeight",widthProp="clientWidth";if(offsetParent===getWindow(popper)&&(offsetParent=getDocumentElement(popper),getComputedStyle$1(offsetParent).position!=="static"&&position==="absolute"&&(heightProp="scrollHeight",widthProp="scrollWidth")),offsetParent=offsetParent,placement===top||(placement===left||placement===right)&&variation===end){sideY=bottom;var offsetY=isFixed&&offsetParent===win&&win.visualViewport?win.visualViewport.height:offsetParent[heightProp];y-=offsetY-popperRect.height,y*=gpuAcceleration?1:-1}if(placement===left||(placement===top||placement===bottom)&&variation===end){sideX=right;var offsetX=isFixed&&offsetParent===win&&win.visualViewport?win.visualViewport.width:offsetParent[widthProp];x-=offsetX-popperRect.width,x*=gpuAcceleration?1:-1}}var commonStyles=Object.assign({position},adaptive&&unsetSides),_ref4=roundOffsets===!0?roundOffsetsByDPR({x,y},getWindow(popper)):{x,y},x=_ref4.x,y=_ref4.y;return gpuAcceleration?Object.assign({},commonStyles,(_Object$assign={},_Object$assign[sideY]=hasY?"0":"",_Object$assign[sideX]=hasX?"0":"",_Object$assign.transform=(win.devicePixelRatio||1)<=1?"translate("+x+"px, "+y+"px)":"translate3d("+x+"px, "+y+"px, 0)",_Object$assign)):Object.assign({},commonStyles,(_Object$assign2={},_Object$assign2[sideY]=hasY?y+"px":"",_Object$assign2[sideX]=hasX?x+"px":"",_Object$assign2.transform="",_Object$assign2))}function computeStyles(_ref5){var state=_ref5.state,options=_ref5.options,_options$gpuAccelerat=options.gpuAcceleration,gpuAcceleration=_options$gpuAccelerat===void 0||_options$gpuAccelerat,_options$adaptive=options.adaptive,adaptive=_options$adaptive===void 0||_options$adaptive,_options$roundOffsets=options.roundOffsets,roundOffsets=_options$roundOffsets===void 0||_options$roundOffsets,commonStyles={placement:getBasePlacement(state.placement),variation:getVariation(state.placement),popper:state.elements.popper,popperRect:state.rects.popper,gpuAcceleration,isFixed:state.options.strategy==="fixed"};state.modifiersData.popperOffsets!=null&&(state.styles.popper=Object.assign({},state.styles.popper,mapToStyles(Object.assign({},commonStyles,{offsets:state.modifiersData.popperOffsets,position:state.options.strategy,adaptive,roundOffsets})))),state.modifiersData.arrow!=null&&(state.styles.arrow=Object.assign({},state.styles.arrow,mapToStyles(Object.assign({},commonStyles,{offsets:state.modifiersData.arrow,position:"absolute",adaptive:!1,roundOffsets})))),state.attributes.popper=Object.assign({},state.attributes.popper,{"data-popper-placement":state.placement})}const computeStyles$1={name:"computeStyles",enabled:!0,phase:"beforeWrite",fn:computeStyles,data:{}};var passive={passive:!0};function effect(_ref){var state=_ref.state,instance=_ref.instance,options=_ref.options,_options$scroll=options.scroll,scroll=_options$scroll===void 0||_options$scroll,_options$resize=options.resize,resize=_options$resize===void 0||_options$resize,window=getWindow(state.elements.popper),scrollParents=[].concat(state.scrollParents.reference,state.scrollParents.popper);return scroll&&scrollParents.forEach(function(scrollParent){scrollParent.addEventListener("scroll",instance.update,passive)}),resize&&window.addEventListener("resize",instance.update,passive),function(){scroll&&scrollParents.forEach(function(scrollParent){scrollParent.removeEventListener("scroll",instance.update,passive)}),resize&&window.removeEventListener("resize",instance.update,passive)}}const eventListeners={name:"eventListeners",enabled:!0,phase:"write",fn:function(){},effect,data:{}};var hash$1={left:"right",right:"left",bottom:"top",top:"bottom"};function getOppositePlacement(placement){return placement.replace(/left|right|bottom|top/g,function(matched){return hash$1[matched]})}var hash={start:"end",end:"start"};function getOppositeVariationPlacement(placement){return placement.replace(/start|end/g,function(matched){return hash[matched]})}function getWindowScroll(node){var win=getWindow(node),scrollLeft=win.pageXOffset,scrollTop=win.pageYOffset;return{scrollLeft,scrollTop}}function getWindowScrollBarX(element){return getBoundingClientRect(getDocumentElement(element)).left+getWindowScroll(element).scrollLeft}function getViewportRect(element,strategy){var win=getWindow(element),html=getDocumentElement(element),visualViewport=win.visualViewport,width=html.clientWidth,height=html.clientHeight,x=0,y=0;if(visualViewport){width=visualViewport.width,height=visualViewport.height;var layoutViewport=isLayoutViewport();(layoutViewport||!layoutViewport&&strategy==="fixed")&&(x=visualViewport.offsetLeft,y=visualViewport.offsetTop)}return{width,height,x:x+getWindowScrollBarX(element),y}}function getDocumentRect(element){var _element$ownerDocumen,html=getDocumentElement(element),winScroll=getWindowScroll(element),body=(_element$ownerDocumen=element.ownerDocument)==null?void 0:_element$ownerDocumen.body,width=max(html.scrollWidth,html.clientWidth,body?body.scrollWidth:0,body?body.clientWidth:0),height=max(html.scrollHeight,html.clientHeight,body?body.scrollHeight:0,body?body.clientHeight:0),x=-winScroll.scrollLeft+getWindowScrollBarX(element),y=-winScroll.scrollTop;return getComputedStyle$1(body||html).direction==="rtl"&&(x+=max(html.clientWidth,body?body.clientWidth:0)-width),{width,height,x,y}}function isScrollParent(element){var _getComputedStyle=getComputedStyle$1(element),overflow=_getComputedStyle.overflow,overflowX=_getComputedStyle.overflowX,overflowY=_getComputedStyle.overflowY;return/auto|scroll|overlay|hidden/.test(overflow+overflowY+overflowX)}function getScrollParent(node){return["html","body","#document"].indexOf(getNodeName(node))>=0?node.ownerDocument.body:isHTMLElement(node)&&isScrollParent(node)?node:getScrollParent(getParentNode(node))}function listScrollParents(element,list){list===void 0&&(list=[]);var _element$ownerDocumen,scrollParent=getScrollParent(element),isBody=scrollParent===((_element$ownerDocumen=element.ownerDocument)==null?void 0:_element$ownerDocumen.body),win=getWindow(scrollParent),target=isBody?[win].concat(win.visualViewport||[],isScrollParent(scrollParent)?scrollParent:[]):scrollParent,updatedList=list.concat(target);return isBody?updatedList:updatedList.concat(listScrollParents(getParentNode(target)))}function rectToClientRect(rect){return Object.assign({},rect,{left:rect.x,top:rect.y,right:rect.x+rect.width,bottom:rect.y+rect.height})}function getInnerBoundingClientRect(element,strategy){var rect=getBoundingClientRect(element,!1,strategy==="fixed");return rect.top=rect.top+element.clientTop,rect.left=rect.left+element.clientLeft,rect.bottom=rect.top+element.clientHeight,rect.right=rect.left+element.clientWidth,rect.width=element.clientWidth,rect.height=element.clientHeight,rect.x=rect.left,rect.y=rect.top,rect}function getClientRectFromMixedType(element,clippingParent,strategy){return clippingParent===viewport?rectToClientRect(getViewportRect(element,strategy)):isElement(clippingParent)?getInnerBoundingClientRect(clippingParent,strategy):rectToClientRect(getDocumentRect(getDocumentElement(element)))}function getClippingParents(element){var clippingParents=listScrollParents(getParentNode(element)),canEscapeClipping=["absolute","fixed"].indexOf(getComputedStyle$1(element).position)>=0,clipperElement=canEscapeClipping&&isHTMLElement(element)?getOffsetParent(element):element;return isElement(clipperElement)?clippingParents.filter(function(clippingParent){return isElement(clippingParent)&&contains(clippingParent,clipperElement)&&getNodeName(clippingParent)!=="body"}):[]}function getClippingRect(element,boundary,rootBoundary,strategy){var mainClippingParents=boundary==="clippingParents"?getClippingParents(element):[].concat(boundary),clippingParents=[].concat(mainClippingParents,[rootBoundary]),firstClippingParent=clippingParents[0],clippingRect=clippingParents.reduce(function(accRect,clippingParent){var rect=getClientRectFromMixedType(element,clippingParent,strategy);return accRect.top=max(rect.top,accRect.top),accRect.right=min(rect.right,accRect.right),accRect.bottom=min(rect.bottom,accRect.bottom),accRect.left=max(rect.left,accRect.left),accRect},getClientRectFromMixedType(element,firstClippingParent,strategy));return clippingRect.width=clippingRect.right-clippingRect.left,clippingRect.height=clippingRect.bottom-clippingRect.top,clippingRect.x=clippingRect.left,clippingRect.y=clippingRect.top,clippingRect}function computeOffsets(_ref){var offsets,len,reference=_ref.reference,element=_ref.element,placement=_ref.placement,basePlacement=placement?getBasePlacement(placement):null,variation=placement?getVariation(placement):null,commonX=reference.x+reference.width/2-element.width/2,commonY=reference.y+reference.height/2-element.height/2;switch(basePlacement){case top:offsets={x:commonX,y:reference.y-element.height};break;case bottom:offsets={x:commonX,y:reference.y+reference.height};break;case right:offsets={x:reference.x+reference.width,y:commonY};break;case left:offsets={x:reference.x-element.width,y:commonY};break;default:offsets={x:reference.x,y:reference.y}}var mainAxis=basePlacement?getMainAxisFromPlacement(basePlacement):null;if(mainAxis!=null)switch(len=mainAxis==="y"?"height":"width",variation){case start:offsets[mainAxis]=offsets[mainAxis]-(reference[len]/2-element[len]/2);break;case end:offsets[mainAxis]=offsets[mainAxis]+(reference[len]/2-element[len]/2);break}return offsets}function detectOverflow(state,options){options===void 0&&(options={});var _options=options,_options$placement=_options.placement,placement=_options$placement===void 0?state.placement:_options$placement,_options$strategy=_options.strategy,strategy=_options$strategy===void 0?state.strategy:_options$strategy,_options$boundary=_options.boundary,boundary=_options$boundary===void 0?clippingParents:_options$boundary,_options$rootBoundary=_options.rootBoundary,rootBoundary=_options$rootBoundary===void 0?viewport:_options$rootBoundary,_options$elementConte=_options.elementContext,elementContext=_options$elementConte===void 0?popper:_options$elementConte,_options$altBoundary=_options.altBoundary,altBoundary=_options$altBoundary!==void 0&&_options$altBoundary,_options$padding=_options.padding,padding=_options$padding===void 0?0:_options$padding,paddingObject=mergePaddingObject(typeof padding!="number"?padding:expandToHashMap(padding,basePlacements)),altContext=elementContext===popper?reference:popper,popperRect=state.rects.popper,element=state.elements[altBoundary?altContext:elementContext],clippingClientRect=getClippingRect(isElement(element)?element:element.contextElement||getDocumentElement(state.elements.popper),boundary,rootBoundary,strategy),referenceClientRect=getBoundingClientRect(state.elements.reference),popperOffsets=computeOffsets({reference:referenceClientRect,element:popperRect,strategy:"absolute",placement}),popperClientRect=rectToClientRect(Object.assign({},popperRect,popperOffsets)),elementClientRect=elementContext===popper?popperClientRect:referenceClientRect,overflowOffsets={top:clippingClientRect.top-elementClientRect.top+paddingObject.top,bottom:elementClientRect.bottom-clippingClientRect.bottom+paddingObject.bottom,left:clippingClientRect.left-elementClientRect.left+paddingObject.left,right:elementClientRect.right-clippingClientRect.right+paddingObject.right},offsetData=state.modifiersData.offset;if(elementContext===popper&&offsetData){var offset=offsetData[placement];Object.keys(overflowOffsets).forEach(function(key){var multiply=[right,bottom].indexOf(key)>=0?1:-1,axis=[top,bottom].indexOf(key)>=0?"y":"x";overflowOffsets[key]+=offset[axis]*multiply})}return overflowOffsets}function computeAutoPlacement(state,options){options===void 0&&(options={});var _options=options,placement=_options.placement,boundary=_options.boundary,rootBoundary=_options.rootBoundary,padding=_options.padding,flipVariations=_options.flipVariations,_options$allowedAutoP=_options.allowedAutoPlacements,allowedAutoPlacements=_options$allowedAutoP===void 0?placements:_options$allowedAutoP,variation=getVariation(placement),placements$1=variation?flipVariations?variationPlacements:variationPlacements.filter(function(placement){return getVariation(placement)===variation}):basePlacements,allowedPlacements=placements$1.filter(function(placement){return allowedAutoPlacements.indexOf(placement)>=0});allowedPlacements.length===0&&(allowedPlacements=placements$1);var overflows=allowedPlacements.reduce(function(acc,placement){return acc[placement]=detectOverflow(state,{placement,boundary,rootBoundary,padding})[getBasePlacement(placement)],acc},{});return Object.keys(overflows).sort(function(a,b){return overflows[a]-overflows[b]})}function getExpandedFallbackPlacements(placement){if(getBasePlacement(placement)===auto)return[];var oppositePlacement=getOppositePlacement(placement);return[getOppositeVariationPlacement(placement),oppositePlacement,getOppositeVariationPlacement(oppositePlacement)]}function flip(_ref){var state=_ref.state,options=_ref.options,name=_ref.name;if(state.modifiersData[name]._skip)return;for(var _options$mainAxis=options.mainAxis,checkMainAxis=_options$mainAxis===void 0||_options$mainAxis,_options$altAxis=options.altAxis,checkAltAxis=_options$altAxis===void 0||_options$altAxis,specifiedFallbackPlacements=options.fallbackPlacements,padding=options.padding,boundary=options.boundary,rootBoundary=options.rootBoundary,altBoundary=options.altBoundary,_options$flipVariatio=options.flipVariations,flipVariations=_options$flipVariatio===void 0||_options$flipVariatio,allowedAutoPlacements=options.allowedAutoPlacements,preferredPlacement=state.options.placement,basePlacement=getBasePlacement(preferredPlacement),isBasePlacement=basePlacement===preferredPlacement,fallbackPlacements=specifiedFallbackPlacements||(isBasePlacement||!flipVariations?[getOppositePlacement(preferredPlacement)]:getExpandedFallbackPlacements(preferredPlacement)),placements=[preferredPlacement].concat(fallbackPlacements).reduce(function(acc,placement){return acc.concat(getBasePlacement(placement)===auto?computeAutoPlacement(state,{placement,boundary,rootBoundary,padding,flipVariations,allowedAutoPlacements}):placement)},[]),referenceRect=state.rects.reference,popperRect=state.rects.popper,checksMap=new Map,makeFallbackChecks=!0,firstFittingPlacement=placements[0],i=0;i=0,len=isVertical?"width":"height",overflow=detectOverflow(state,{placement,boundary,rootBoundary,altBoundary,padding}),mainVariationSide=isVertical?isStartVariation?right:left:isStartVariation?bottom:top;referenceRect[len]>popperRect[len]&&(mainVariationSide=getOppositePlacement(mainVariationSide));var altVariationSide=getOppositePlacement(mainVariationSide),checks=[];if(checkMainAxis&&checks.push(overflow[_basePlacement]<=0),checkAltAxis&&checks.push(overflow[mainVariationSide]<=0,overflow[altVariationSide]<=0),checks.every(function(check){return check})){firstFittingPlacement=placement,makeFallbackChecks=!1;break}checksMap.set(placement,checks)}if(makeFallbackChecks)for(var numberOfChecks=flipVariations?3:1,_loop=function(_i){var fittingPlacement=placements.find(function(placement){var checks=checksMap.get(placement);if(checks)return checks.slice(0,_i).every(function(check){return check})});if(fittingPlacement)return firstFittingPlacement=fittingPlacement,"break"},_i=numberOfChecks;_i>0;_i--){var _ret=_loop(_i);if(_ret==="break")break}state.placement!==firstFittingPlacement&&(state.modifiersData[name]._skip=!0,state.placement=firstFittingPlacement,state.reset=!0)}const flip$1={name:"flip",enabled:!0,phase:"main",fn:flip,requiresIfExists:["offset"],data:{_skip:!1}};function getSideOffsets(overflow,rect,preventedOffsets){return preventedOffsets===void 0&&(preventedOffsets={x:0,y:0}),{top:overflow.top-rect.height-preventedOffsets.y,right:overflow.right-rect.width+preventedOffsets.x,bottom:overflow.bottom-rect.height+preventedOffsets.y,left:overflow.left-rect.width-preventedOffsets.x}}function isAnySideFullyClipped(overflow){return[top,right,bottom,left].some(function(side){return overflow[side]>=0})}function hide(_ref){var state=_ref.state,name=_ref.name,referenceRect=state.rects.reference,popperRect=state.rects.popper,preventedOffsets=state.modifiersData.preventOverflow,referenceOverflow=detectOverflow(state,{elementContext:"reference"}),popperAltOverflow=detectOverflow(state,{altBoundary:!0}),referenceClippingOffsets=getSideOffsets(referenceOverflow,referenceRect),popperEscapeOffsets=getSideOffsets(popperAltOverflow,popperRect,preventedOffsets),isReferenceHidden=isAnySideFullyClipped(referenceClippingOffsets),hasPopperEscaped=isAnySideFullyClipped(popperEscapeOffsets);state.modifiersData[name]={referenceClippingOffsets,popperEscapeOffsets,isReferenceHidden,hasPopperEscaped},state.attributes.popper=Object.assign({},state.attributes.popper,{"data-popper-reference-hidden":isReferenceHidden,"data-popper-escaped":hasPopperEscaped})}const hide$1={name:"hide",enabled:!0,phase:"main",requiresIfExists:["preventOverflow"],fn:hide};function distanceAndSkiddingToXY(placement,rects,offset){var basePlacement=getBasePlacement(placement),invertDistance=[left,top].indexOf(basePlacement)>=0?-1:1,_ref=typeof offset=="function"?offset(Object.assign({},rects,{placement})):offset,skidding=_ref[0],distance=_ref[1],skidding=skidding||0,distance=(distance||0)*invertDistance;return[left,right].indexOf(basePlacement)>=0?{x:distance,y:skidding}:{x:skidding,y:distance}}function offset(_ref2){var state=_ref2.state,options=_ref2.options,name=_ref2.name,_options$offset=options.offset,offset=_options$offset===void 0?[0,0]:_options$offset,data=placements.reduce(function(acc,placement){return acc[placement]=distanceAndSkiddingToXY(placement,state.rects,offset),acc},{}),_data$state$placement=data[state.placement],x=_data$state$placement.x,y=_data$state$placement.y;state.modifiersData.popperOffsets!=null&&(state.modifiersData.popperOffsets.x+=x,state.modifiersData.popperOffsets.y+=y),state.modifiersData[name]=data}const offset$1={name:"offset",enabled:!0,phase:"main",requires:["popperOffsets"],fn:offset};function popperOffsets(_ref){var state=_ref.state,name=_ref.name;state.modifiersData[name]=computeOffsets({reference:state.rects.reference,element:state.rects.popper,strategy:"absolute",placement:state.placement})}const popperOffsets$1={name:"popperOffsets",enabled:!0,phase:"read",fn:popperOffsets,data:{}};function getAltAxis(axis){return axis==="x"?"y":"x"}function preventOverflow(_ref){var _offsetModifierState$,_offsetModifierState$2,state=_ref.state,options=_ref.options,name=_ref.name,_options$mainAxis=options.mainAxis,checkMainAxis=_options$mainAxis===void 0||_options$mainAxis,_options$altAxis=options.altAxis,checkAltAxis=_options$altAxis!==void 0&&_options$altAxis,boundary=options.boundary,rootBoundary=options.rootBoundary,altBoundary=options.altBoundary,padding=options.padding,_options$tether=options.tether,tether=_options$tether===void 0||_options$tether,_options$tetherOffset=options.tetherOffset,tetherOffset=_options$tetherOffset===void 0?0:_options$tetherOffset,overflow=detectOverflow(state,{boundary,rootBoundary,padding,altBoundary}),basePlacement=getBasePlacement(state.placement),variation=getVariation(state.placement),isBasePlacement=!variation,mainAxis=getMainAxisFromPlacement(basePlacement),altAxis=getAltAxis(mainAxis),popperOffsets=state.modifiersData.popperOffsets,referenceRect=state.rects.reference,popperRect=state.rects.popper,tetherOffsetValue=typeof tetherOffset=="function"?tetherOffset(Object.assign({},state.rects,{placement:state.placement})):tetherOffset,normalizedTetherOffsetValue=typeof tetherOffsetValue=="number"?{mainAxis:tetherOffsetValue,altAxis:tetherOffsetValue}:Object.assign({mainAxis:0,altAxis:0},tetherOffsetValue),offsetModifierState=state.modifiersData.offset?state.modifiersData.offset[state.placement]:null,data={x:0,y:0};if(!popperOffsets)return;if(checkMainAxis){var mainSide=mainAxis==="y"?top:left,altSide=mainAxis==="y"?bottom:right,len=mainAxis==="y"?"height":"width",offset=popperOffsets[mainAxis],min$1=offset+overflow[mainSide],max$1=offset-overflow[altSide],additive=tether?-popperRect[len]/2:0,minLen=variation===start?referenceRect[len]:popperRect[len],maxLen=variation===start?-popperRect[len]:-referenceRect[len],arrowElement=state.elements.arrow,arrowRect=tether&&arrowElement?getLayoutRect(arrowElement):{width:0,height:0},arrowPaddingObject=state.modifiersData["arrow#persistent"]?state.modifiersData["arrow#persistent"].padding:getFreshSideObject(),arrowPaddingMin=arrowPaddingObject[mainSide],arrowPaddingMax=arrowPaddingObject[altSide],arrowLen=within(0,referenceRect[len],arrowRect[len]),minOffset=isBasePlacement?referenceRect[len]/2-additive-arrowLen-arrowPaddingMin-normalizedTetherOffsetValue.mainAxis:minLen-arrowLen-arrowPaddingMin-normalizedTetherOffsetValue.mainAxis,maxOffset=isBasePlacement?-referenceRect[len]/2+additive+arrowLen+arrowPaddingMax+normalizedTetherOffsetValue.mainAxis:maxLen+arrowLen+arrowPaddingMax+normalizedTetherOffsetValue.mainAxis,arrowOffsetParent=state.elements.arrow&&getOffsetParent(state.elements.arrow),clientOffset=arrowOffsetParent?mainAxis==="y"?arrowOffsetParent.clientTop||0:arrowOffsetParent.clientLeft||0:0,offsetModifierValue=(_offsetModifierState$=offsetModifierState?.[mainAxis])!=null?_offsetModifierState$:0,tetherMin=offset+minOffset-offsetModifierValue-clientOffset,tetherMax=offset+maxOffset-offsetModifierValue,preventedOffset=within(tether?min(min$1,tetherMin):min$1,offset,tether?max(max$1,tetherMax):max$1);popperOffsets[mainAxis]=preventedOffset,data[mainAxis]=preventedOffset-offset}if(checkAltAxis){var _mainSide=mainAxis==="x"?top:left,_altSide=mainAxis==="x"?bottom:right,_offset=popperOffsets[altAxis],_len=altAxis==="y"?"height":"width",_min=_offset+overflow[_mainSide],_max=_offset-overflow[_altSide],isOriginSide=[top,left].indexOf(basePlacement)!==-1,_offsetModifierValue=(_offsetModifierState$2=offsetModifierState?.[altAxis])!=null?_offsetModifierState$2:0,_tetherMin=isOriginSide?_min:_offset-referenceRect[_len]-popperRect[_len]-_offsetModifierValue+normalizedTetherOffsetValue.altAxis,_tetherMax=isOriginSide?_offset+referenceRect[_len]+popperRect[_len]-_offsetModifierValue-normalizedTetherOffsetValue.altAxis:_max,_preventedOffset=tether&&isOriginSide?withinMaxClamp(_tetherMin,_offset,_tetherMax):within(tether?_tetherMin:_min,_offset,tether?_tetherMax:_max);popperOffsets[altAxis]=_preventedOffset,data[altAxis]=_preventedOffset-_offset}state.modifiersData[name]=data}const preventOverflow$1={name:"preventOverflow",enabled:!0,phase:"main",fn:preventOverflow,requiresIfExists:["offset"]};function getHTMLElementScroll(element){return{scrollLeft:element.scrollLeft,scrollTop:element.scrollTop}}function getNodeScroll(node){return node===getWindow(node)||!isHTMLElement(node)?getWindowScroll(node):getHTMLElementScroll(node)}function isElementScaled(element){var rect=element.getBoundingClientRect(),scaleX=round(rect.width)/element.offsetWidth||1,scaleY=round(rect.height)/element.offsetHeight||1;return scaleX!==1||scaleY!==1}function getCompositeRect(elementOrVirtualElement,offsetParent,isFixed){isFixed===void 0&&(isFixed=!1);var isOffsetParentAnElement=isHTMLElement(offsetParent),offsetParentIsScaled=isHTMLElement(offsetParent)&&isElementScaled(offsetParent),documentElement=getDocumentElement(offsetParent),rect=getBoundingClientRect(elementOrVirtualElement,offsetParentIsScaled,isFixed),scroll={scrollLeft:0,scrollTop:0},offsets={x:0,y:0};return(isOffsetParentAnElement||!isOffsetParentAnElement&&!isFixed)&&((getNodeName(offsetParent)!=="body"||isScrollParent(documentElement))&&(scroll=getNodeScroll(offsetParent)),isHTMLElement(offsetParent)?(offsets=getBoundingClientRect(offsetParent,!0),offsets.x+=offsetParent.clientLeft,offsets.y+=offsetParent.clientTop):documentElement&&(offsets.x=getWindowScrollBarX(documentElement))),{x:rect.left+scroll.scrollLeft-offsets.x,y:rect.top+scroll.scrollTop-offsets.y,width:rect.width,height:rect.height}}function order(modifiers){var map=new Map,visited=new Set,result=[];modifiers.forEach(function(modifier){map.set(modifier.name,modifier)});function sort(modifier){visited.add(modifier.name);var requires=[].concat(modifier.requires||[],modifier.requiresIfExists||[]);requires.forEach(function(dep){if(!visited.has(dep)){var depModifier=map.get(dep);depModifier&&sort(depModifier)}}),result.push(modifier)}return modifiers.forEach(function(modifier){visited.has(modifier.name)||sort(modifier)}),result}function orderModifiers(modifiers){var orderedModifiers=order(modifiers);return modifierPhases.reduce(function(acc,phase){return acc.concat(orderedModifiers.filter(function(modifier){return modifier.phase===phase}))},[])}function debounce(fn){var pending;return function(){return pending||(pending=new Promise(function(resolve){Promise.resolve().then(function(){pending=void 0,resolve(fn())})})),pending}}function mergeByName(modifiers){var merged=modifiers.reduce(function(merged,current){var existing=merged[current.name];return merged[current.name]=existing?Object.assign({},existing,current,{options:Object.assign({},existing.options,current.options),data:Object.assign({},existing.data,current.data)}):current,merged},{});return Object.keys(merged).map(function(key){return merged[key]})}var DEFAULT_OPTIONS={placement:"bottom",modifiers:[],strategy:"absolute"};function areValidElements(){for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++)args[_key]=arguments[_key];return!args.some(function(element){return!element||typeof element.getBoundingClientRect!="function"})}function popperGenerator(generatorOptions){generatorOptions===void 0&&(generatorOptions={});var _generatorOptions=generatorOptions,_generatorOptions$def=_generatorOptions.defaultModifiers,defaultModifiers=_generatorOptions$def===void 0?[]:_generatorOptions$def,_generatorOptions$def2=_generatorOptions.defaultOptions,defaultOptions=_generatorOptions$def2===void 0?DEFAULT_OPTIONS:_generatorOptions$def2;return function(reference,popper,options){options===void 0&&(options=defaultOptions);var state={placement:"bottom",orderedModifiers:[],options:Object.assign({},DEFAULT_OPTIONS,defaultOptions),modifiersData:{},elements:{reference,popper},attributes:{},styles:{}},effectCleanupFns=[],isDestroyed=!1,instance={state,setOptions:function(setOptionsAction){var options=typeof setOptionsAction=="function"?setOptionsAction(state.options):setOptionsAction;cleanupModifierEffects(),state.options=Object.assign({},defaultOptions,state.options,options),state.scrollParents={reference:isElement(reference)?listScrollParents(reference):reference.contextElement?listScrollParents(reference.contextElement):[],popper:listScrollParents(popper)};var orderedModifiers=orderModifiers(mergeByName([].concat(defaultModifiers,state.options.modifiers)));return state.orderedModifiers=orderedModifiers.filter(function(m){return m.enabled}),runModifierEffects(),instance.update()},forceUpdate:function(){if(isDestroyed)return;var _state$elements=state.elements,reference=_state$elements.reference,popper=_state$elements.popper;if(!areValidElements(reference,popper))return;state.rects={reference:getCompositeRect(reference,getOffsetParent(popper),state.options.strategy==="fixed"),popper:getLayoutRect(popper)},state.reset=!1,state.placement=state.options.placement,state.orderedModifiers.forEach(function(modifier){return state.modifiersData[modifier.name]=Object.assign({},modifier.data)});for(var index=0;indexNumber.parseInt(value,10)):typeof offset=="function"?popperData=>offset(popperData,this._element):offset}_getPopperConfig(){const defaultBsPopperConfig={placement:this._getPlacement(),modifiers:[{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"offset",options:{offset:this._getOffset()}}]};return(this._inNavbar||this._config.display==="static")&&(Manipulator.setDataAttribute(this._menu,"popper","static"),defaultBsPopperConfig.modifiers=[{name:"applyStyles",enabled:!1}]),{...defaultBsPopperConfig,...execute(this._config.popperConfig,[defaultBsPopperConfig])}}_selectMenuItem({key,target}){const items=SelectorEngine.find(SELECTOR_VISIBLE_ITEMS,this._menu).filter(element=>isVisible(element));if(!items.length)return;getNextActiveElement(items,target,key===ARROW_DOWN_KEY$1,!items.includes(target)).focus()}static jQueryInterface(config){return this.each(function(){const data=Dropdown.getOrCreateInstance(this,config);if(typeof config!="string")return;if(typeof data[config]=="undefined")throw new TypeError(`No method named "${config}"`);data[config]()})}static clearMenus(event){if(event.button===RIGHT_MOUSE_BUTTON||event.type==="keyup"&&event.key!==TAB_KEY$1)return;const openToggles=SelectorEngine.find(SELECTOR_DATA_TOGGLE_SHOWN);for(const toggle of openToggles){const context=Dropdown.getInstance(toggle);if(!context||context._config.autoClose===!1)continue;const composedPath=event.composedPath(),isMenuTarget=composedPath.includes(context._menu);if(composedPath.includes(context._element)||context._config.autoClose==="inside"&&!isMenuTarget||context._config.autoClose==="outside"&&isMenuTarget)continue;if(context._menu.contains(event.target)&&(event.type==="keyup"&&event.key===TAB_KEY$1||/input|select|option|textarea|form/i.test(event.target.tagName)))continue;const relatedTarget={relatedTarget:context._element};event.type==="click"&&(relatedTarget.clickEvent=event),context._completeHide(relatedTarget)}}static dataApiKeydownHandler(event){const isInput=/input|textarea/i.test(event.target.tagName),isEscapeEvent=event.key===ESCAPE_KEY$2,isUpOrDownEvent=[ARROW_UP_KEY$1,ARROW_DOWN_KEY$1].includes(event.key);if(!isUpOrDownEvent&&!isEscapeEvent)return;if(isInput&&!isEscapeEvent)return;event.preventDefault();const getToggleButton=this.matches(SELECTOR_DATA_TOGGLE$3)?this:SelectorEngine.prev(this,SELECTOR_DATA_TOGGLE$3)[0]||SelectorEngine.next(this,SELECTOR_DATA_TOGGLE$3)[0]||SelectorEngine.findOne(SELECTOR_DATA_TOGGLE$3,event.delegateTarget.parentNode),instance=Dropdown.getOrCreateInstance(getToggleButton);if(isUpOrDownEvent){event.stopPropagation(),instance.show(),instance._selectMenuItem(event);return}instance._isShown()&&(event.stopPropagation(),instance.hide(),getToggleButton.focus())}}EventHandler.on(document,EVENT_KEYDOWN_DATA_API,SELECTOR_DATA_TOGGLE$3,Dropdown.dataApiKeydownHandler),EventHandler.on(document,EVENT_KEYDOWN_DATA_API,SELECTOR_MENU,Dropdown.dataApiKeydownHandler),EventHandler.on(document,EVENT_CLICK_DATA_API$3,Dropdown.clearMenus),EventHandler.on(document,EVENT_KEYUP_DATA_API,Dropdown.clearMenus),EventHandler.on(document,EVENT_CLICK_DATA_API$3,SELECTOR_DATA_TOGGLE$3,function(event){event.preventDefault(),Dropdown.getOrCreateInstance(this).toggle()}),defineJQueryPlugin(Dropdown);const NAME$9="backdrop",CLASS_NAME_FADE$4="fade",CLASS_NAME_SHOW$5="show",EVENT_MOUSEDOWN=`mousedown.bs.${NAME$9}`,Default$8={className:"modal-backdrop",clickCallback:null,isAnimated:!1,isVisible:!0,rootElement:"body"},DefaultType$8={className:"string",clickCallback:"(function|null)",isAnimated:"boolean",isVisible:"boolean",rootElement:"(element|string)"};class Backdrop extends Config{constructor(config){super(),this._config=this._getConfig(config),this._isAppended=!1,this._element=null}static get Default(){return Default$8}static get DefaultType(){return DefaultType$8}static get NAME(){return NAME$9}show(callback){if(!this._config.isVisible){execute(callback);return}this._append();const element=this._getElement();this._config.isAnimated&&reflow(element),element.classList.add(CLASS_NAME_SHOW$5),this._emulateAnimation(()=>{execute(callback)})}hide(callback){if(!this._config.isVisible){execute(callback);return}this._getElement().classList.remove(CLASS_NAME_SHOW$5),this._emulateAnimation(()=>{this.dispose(),execute(callback)})}dispose(){if(!this._isAppended)return;EventHandler.off(this._element,EVENT_MOUSEDOWN),this._element.remove(),this._isAppended=!1}_getElement(){if(!this._element){const backdrop=document.createElement("div");backdrop.className=this._config.className,this._config.isAnimated&&backdrop.classList.add(CLASS_NAME_FADE$4),this._element=backdrop}return this._element}_configAfterMerge(config){return config.rootElement=getElement(config.rootElement),config}_append(){if(this._isAppended)return;const element=this._getElement();this._config.rootElement.append(element),EventHandler.on(element,EVENT_MOUSEDOWN,()=>{execute(this._config.clickCallback)}),this._isAppended=!0}_emulateAnimation(callback){executeAfterTransition(callback,this._getElement(),this._config.isAnimated)}}const NAME$8="focustrap",DATA_KEY$5="bs.focustrap",EVENT_KEY$5=`.${DATA_KEY$5}`,EVENT_FOCUSIN$2=`focusin${EVENT_KEY$5}`,EVENT_KEYDOWN_TAB=`keydown.tab${EVENT_KEY$5}`,TAB_KEY="Tab",TAB_NAV_FORWARD="forward",TAB_NAV_BACKWARD="backward",Default$7={autofocus:!0,trapElement:null},DefaultType$7={autofocus:"boolean",trapElement:"element"};class FocusTrap extends Config{constructor(config){super(),this._config=this._getConfig(config),this._isActive=!1,this._lastTabNavDirection=null}static get Default(){return Default$7}static get DefaultType(){return DefaultType$7}static get NAME(){return NAME$8}activate(){if(this._isActive)return;this._config.autofocus&&this._config.trapElement.focus(),EventHandler.off(document,EVENT_KEY$5),EventHandler.on(document,EVENT_FOCUSIN$2,event=>this._handleFocusin(event)),EventHandler.on(document,EVENT_KEYDOWN_TAB,event=>this._handleKeydown(event)),this._isActive=!0}deactivate(){if(!this._isActive)return;this._isActive=!1,EventHandler.off(document,EVENT_KEY$5)}_handleFocusin(event){const{trapElement}=this._config;if(event.target===document||event.target===trapElement||trapElement.contains(event.target))return;const elements=SelectorEngine.focusableChildren(trapElement);elements.length===0?trapElement.focus():this._lastTabNavDirection===TAB_NAV_BACKWARD?elements[elements.length-1].focus():elements[0].focus()}_handleKeydown(event){if(event.key!==TAB_KEY)return;this._lastTabNavDirection=event.shiftKey?TAB_NAV_BACKWARD:TAB_NAV_FORWARD}}const SELECTOR_FIXED_CONTENT=".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",SELECTOR_STICKY_CONTENT=".sticky-top",PROPERTY_PADDING="padding-right",PROPERTY_MARGIN="margin-right";class ScrollBarHelper{constructor(){this._element=document.body}getWidth(){const documentWidth=document.documentElement.clientWidth;return Math.abs(window.innerWidth-documentWidth)}hide(){const width=this.getWidth();this._disableOverFlow(),this._setElementAttributes(this._element,PROPERTY_PADDING,calculatedValue=>calculatedValue+width),this._setElementAttributes(SELECTOR_FIXED_CONTENT,PROPERTY_PADDING,calculatedValue=>calculatedValue+width),this._setElementAttributes(SELECTOR_STICKY_CONTENT,PROPERTY_MARGIN,calculatedValue=>calculatedValue-width)}reset(){this._resetElementAttributes(this._element,"overflow"),this._resetElementAttributes(this._element,PROPERTY_PADDING),this._resetElementAttributes(SELECTOR_FIXED_CONTENT,PROPERTY_PADDING),this._resetElementAttributes(SELECTOR_STICKY_CONTENT,PROPERTY_MARGIN)}isOverflowing(){return this.getWidth()>0}_disableOverFlow(){this._saveInitialAttribute(this._element,"overflow"),this._element.style.overflow="hidden"}_setElementAttributes(selector,styleProperty,callback){const scrollbarWidth=this.getWidth(),manipulationCallBack=element=>{if(element!==this._element&&window.innerWidth>element.clientWidth+scrollbarWidth)return;this._saveInitialAttribute(element,styleProperty);const calculatedValue=window.getComputedStyle(element).getPropertyValue(styleProperty);element.style.setProperty(styleProperty,`${callback(Number.parseFloat(calculatedValue))}px`)};this._applyManipulationCallback(selector,manipulationCallBack)}_saveInitialAttribute(element,styleProperty){const actualValue=element.style.getPropertyValue(styleProperty);actualValue&&Manipulator.setDataAttribute(element,styleProperty,actualValue)}_resetElementAttributes(selector,styleProperty){const manipulationCallBack=element=>{const value=Manipulator.getDataAttribute(element,styleProperty);if(value===null){element.style.removeProperty(styleProperty);return}Manipulator.removeDataAttribute(element,styleProperty),element.style.setProperty(styleProperty,value)};this._applyManipulationCallback(selector,manipulationCallBack)}_applyManipulationCallback(selector,callBack){if(isElement$1(selector)){callBack(selector);return}for(const sel of SelectorEngine.find(selector,this._element))callBack(sel)}}const NAME$7="modal",DATA_KEY$4="bs.modal",EVENT_KEY$4=`.${DATA_KEY$4}`,DATA_API_KEY$2=".data-api",ESCAPE_KEY$1="Escape",EVENT_HIDE$4=`hide${EVENT_KEY$4}`,EVENT_HIDE_PREVENTED$1=`hidePrevented${EVENT_KEY$4}`,EVENT_HIDDEN$4=`hidden${EVENT_KEY$4}`,EVENT_SHOW$4=`show${EVENT_KEY$4}`,EVENT_SHOWN$4=`shown${EVENT_KEY$4}`,EVENT_RESIZE$1=`resize${EVENT_KEY$4}`,EVENT_CLICK_DISMISS=`click.dismiss${EVENT_KEY$4}`,EVENT_MOUSEDOWN_DISMISS=`mousedown.dismiss${EVENT_KEY$4}`,EVENT_KEYDOWN_DISMISS$1=`keydown.dismiss${EVENT_KEY$4}`,EVENT_CLICK_DATA_API$2=`click${EVENT_KEY$4}${DATA_API_KEY$2}`,CLASS_NAME_OPEN="modal-open",CLASS_NAME_FADE$3="fade",CLASS_NAME_SHOW$4="show",CLASS_NAME_STATIC="modal-static",OPEN_SELECTOR$1=".modal.show",SELECTOR_DIALOG=".modal-dialog",SELECTOR_MODAL_BODY=".modal-body",SELECTOR_DATA_TOGGLE$2='[data-bs-toggle="modal"]',Default$6={backdrop:!0,focus:!0,keyboard:!0},DefaultType$6={backdrop:"(boolean|string)",focus:"boolean",keyboard:"boolean"};class Modal extends BaseComponent{constructor(element,config){super(element,config),this._dialog=SelectorEngine.findOne(SELECTOR_DIALOG,this._element),this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._isShown=!1,this._isTransitioning=!1,this._scrollBar=new ScrollBarHelper,this._addEventListeners()}static get Default(){return Default$6}static get DefaultType(){return DefaultType$6}static get NAME(){return NAME$7}toggle(relatedTarget){return this._isShown?this.hide():this.show(relatedTarget)}show(relatedTarget){if(this._isShown||this._isTransitioning)return;const showEvent=EventHandler.trigger(this._element,EVENT_SHOW$4,{relatedTarget});if(showEvent.defaultPrevented)return;this._isShown=!0,this._isTransitioning=!0,this._scrollBar.hide(),document.body.classList.add(CLASS_NAME_OPEN),this._adjustDialog(),this._backdrop.show(()=>this._showElement(relatedTarget))}hide(){if(!this._isShown||this._isTransitioning)return;const hideEvent=EventHandler.trigger(this._element,EVENT_HIDE$4);if(hideEvent.defaultPrevented)return;this._isShown=!1,this._isTransitioning=!0,this._focustrap.deactivate(),this._element.classList.remove(CLASS_NAME_SHOW$4),this._queueCallback(()=>this._hideModal(),this._element,this._isAnimated())}dispose(){EventHandler.off(window,EVENT_KEY$4),EventHandler.off(this._dialog,EVENT_KEY$4),this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}handleUpdate(){this._adjustDialog()}_initializeBackDrop(){return new Backdrop({isVisible:Boolean(this._config.backdrop),isAnimated:this._isAnimated()})}_initializeFocusTrap(){return new FocusTrap({trapElement:this._element})}_showElement(relatedTarget){document.body.contains(this._element)||document.body.append(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.scrollTop=0;const modalBody=SelectorEngine.findOne(SELECTOR_MODAL_BODY,this._dialog);modalBody&&(modalBody.scrollTop=0),reflow(this._element),this._element.classList.add(CLASS_NAME_SHOW$4);const transitionComplete=()=>{this._config.focus&&this._focustrap.activate(),this._isTransitioning=!1,EventHandler.trigger(this._element,EVENT_SHOWN$4,{relatedTarget})};this._queueCallback(transitionComplete,this._dialog,this._isAnimated())}_addEventListeners(){EventHandler.on(this._element,EVENT_KEYDOWN_DISMISS$1,event=>{if(event.key!==ESCAPE_KEY$1)return;if(this._config.keyboard){this.hide();return}this._triggerBackdropTransition()}),EventHandler.on(window,EVENT_RESIZE$1,()=>{this._isShown&&!this._isTransitioning&&this._adjustDialog()}),EventHandler.on(this._element,EVENT_MOUSEDOWN_DISMISS,event=>{EventHandler.one(this._element,EVENT_CLICK_DISMISS,event2=>{if(this._element!==event.target||this._element!==event2.target)return;if(this._config.backdrop==="static"){this._triggerBackdropTransition();return}this._config.backdrop&&this.hide()})})}_hideModal(){this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._isTransitioning=!1,this._backdrop.hide(()=>{document.body.classList.remove(CLASS_NAME_OPEN),this._resetAdjustments(),this._scrollBar.reset(),EventHandler.trigger(this._element,EVENT_HIDDEN$4)})}_isAnimated(){return this._element.classList.contains(CLASS_NAME_FADE$3)}_triggerBackdropTransition(){const hideEvent=EventHandler.trigger(this._element,EVENT_HIDE_PREVENTED$1);if(hideEvent.defaultPrevented)return;const isModalOverflowing=this._element.scrollHeight>document.documentElement.clientHeight,initialOverflowY=this._element.style.overflowY;if(initialOverflowY==="hidden"||this._element.classList.contains(CLASS_NAME_STATIC))return;isModalOverflowing||(this._element.style.overflowY="hidden"),this._element.classList.add(CLASS_NAME_STATIC),this._queueCallback(()=>{this._element.classList.remove(CLASS_NAME_STATIC),this._queueCallback(()=>{this._element.style.overflowY=initialOverflowY},this._dialog)},this._dialog),this._element.focus()}_adjustDialog(){const isModalOverflowing=this._element.scrollHeight>document.documentElement.clientHeight,scrollbarWidth=this._scrollBar.getWidth(),isBodyOverflowing=scrollbarWidth>0;if(isBodyOverflowing&&!isModalOverflowing){const property=isRTL()?"paddingLeft":"paddingRight";this._element.style[property]=`${scrollbarWidth}px`}if(!isBodyOverflowing&&isModalOverflowing){const property=isRTL()?"paddingRight":"paddingLeft";this._element.style[property]=`${scrollbarWidth}px`}}_resetAdjustments(){this._element.style.paddingLeft="",this._element.style.paddingRight=""}static jQueryInterface(config,relatedTarget){return this.each(function(){const data=Modal.getOrCreateInstance(this,config);if(typeof config!="string")return;if(typeof data[config]=="undefined")throw new TypeError(`No method named "${config}"`);data[config](relatedTarget)})}}EventHandler.on(document,EVENT_CLICK_DATA_API$2,SELECTOR_DATA_TOGGLE$2,function(event){const target=SelectorEngine.getElementFromSelector(this);["A","AREA"].includes(this.tagName)&&event.preventDefault(),EventHandler.one(target,EVENT_SHOW$4,showEvent=>{if(showEvent.defaultPrevented)return;EventHandler.one(target,EVENT_HIDDEN$4,()=>{isVisible(this)&&this.focus()})});const alreadyOpen=SelectorEngine.findOne(OPEN_SELECTOR$1);alreadyOpen&&Modal.getInstance(alreadyOpen).hide();const data=Modal.getOrCreateInstance(target);data.toggle(this)}),enableDismissTrigger(Modal),defineJQueryPlugin(Modal);const NAME$6="offcanvas",DATA_KEY$3="bs.offcanvas",EVENT_KEY$3=`.${DATA_KEY$3}`,DATA_API_KEY$1=".data-api",EVENT_LOAD_DATA_API$2=`load${EVENT_KEY$3}${DATA_API_KEY$1}`,ESCAPE_KEY="Escape",CLASS_NAME_SHOW$3="show",CLASS_NAME_SHOWING$1="showing",CLASS_NAME_HIDING="hiding",CLASS_NAME_BACKDROP="offcanvas-backdrop",OPEN_SELECTOR=".offcanvas.show",EVENT_SHOW$3=`show${EVENT_KEY$3}`,EVENT_SHOWN$3=`shown${EVENT_KEY$3}`,EVENT_HIDE$3=`hide${EVENT_KEY$3}`,EVENT_HIDE_PREVENTED=`hidePrevented${EVENT_KEY$3}`,EVENT_HIDDEN$3=`hidden${EVENT_KEY$3}`,EVENT_RESIZE=`resize${EVENT_KEY$3}`,EVENT_CLICK_DATA_API$1=`click${EVENT_KEY$3}${DATA_API_KEY$1}`,EVENT_KEYDOWN_DISMISS=`keydown.dismiss${EVENT_KEY$3}`,SELECTOR_DATA_TOGGLE$1='[data-bs-toggle="offcanvas"]',Default$5={backdrop:!0,keyboard:!0,scroll:!1},DefaultType$5={backdrop:"(boolean|string)",keyboard:"boolean",scroll:"boolean"};class Offcanvas extends BaseComponent{constructor(element,config){super(element,config),this._isShown=!1,this._backdrop=this._initializeBackDrop(),this._focustrap=this._initializeFocusTrap(),this._addEventListeners()}static get Default(){return Default$5}static get DefaultType(){return DefaultType$5}static get NAME(){return NAME$6}toggle(relatedTarget){return this._isShown?this.hide():this.show(relatedTarget)}show(relatedTarget){if(this._isShown)return;const showEvent=EventHandler.trigger(this._element,EVENT_SHOW$3,{relatedTarget});if(showEvent.defaultPrevented)return;this._isShown=!0,this._backdrop.show(),this._config.scroll||(new ScrollBarHelper).hide(),this._element.setAttribute("aria-modal",!0),this._element.setAttribute("role","dialog"),this._element.classList.add(CLASS_NAME_SHOWING$1);const completeCallBack=()=>{(!this._config.scroll||this._config.backdrop)&&this._focustrap.activate(),this._element.classList.add(CLASS_NAME_SHOW$3),this._element.classList.remove(CLASS_NAME_SHOWING$1),EventHandler.trigger(this._element,EVENT_SHOWN$3,{relatedTarget})};this._queueCallback(completeCallBack,this._element,!0)}hide(){if(!this._isShown)return;const hideEvent=EventHandler.trigger(this._element,EVENT_HIDE$3);if(hideEvent.defaultPrevented)return;this._focustrap.deactivate(),this._element.blur(),this._isShown=!1,this._element.classList.add(CLASS_NAME_HIDING),this._backdrop.hide();const completeCallback=()=>{this._element.classList.remove(CLASS_NAME_SHOW$3,CLASS_NAME_HIDING),this._element.removeAttribute("aria-modal"),this._element.removeAttribute("role"),this._config.scroll||(new ScrollBarHelper).reset(),EventHandler.trigger(this._element,EVENT_HIDDEN$3)};this._queueCallback(completeCallback,this._element,!0)}dispose(){this._backdrop.dispose(),this._focustrap.deactivate(),super.dispose()}_initializeBackDrop(){const clickCallback=()=>{if(this._config.backdrop==="static"){EventHandler.trigger(this._element,EVENT_HIDE_PREVENTED);return}this.hide()},isVisible=Boolean(this._config.backdrop);return new Backdrop({className:CLASS_NAME_BACKDROP,isVisible,isAnimated:!0,rootElement:this._element.parentNode,clickCallback:isVisible?clickCallback:null})}_initializeFocusTrap(){return new FocusTrap({trapElement:this._element})}_addEventListeners(){EventHandler.on(this._element,EVENT_KEYDOWN_DISMISS,event=>{if(event.key!==ESCAPE_KEY)return;if(this._config.keyboard){this.hide();return}EventHandler.trigger(this._element,EVENT_HIDE_PREVENTED)})}static jQueryInterface(config){return this.each(function(){const data=Offcanvas.getOrCreateInstance(this,config);if(typeof config!="string")return;if(data[config]===void 0||config.startsWith("_")||config==="constructor")throw new TypeError(`No method named "${config}"`);data[config](this)})}}EventHandler.on(document,EVENT_CLICK_DATA_API$1,SELECTOR_DATA_TOGGLE$1,function(event){const target=SelectorEngine.getElementFromSelector(this);if(["A","AREA"].includes(this.tagName)&&event.preventDefault(),isDisabled(this))return;EventHandler.one(target,EVENT_HIDDEN$3,()=>{isVisible(this)&&this.focus()});const alreadyOpen=SelectorEngine.findOne(OPEN_SELECTOR);alreadyOpen&&alreadyOpen!==target&&Offcanvas.getInstance(alreadyOpen).hide();const data=Offcanvas.getOrCreateInstance(target);data.toggle(this)}),EventHandler.on(window,EVENT_LOAD_DATA_API$2,()=>{for(const selector of SelectorEngine.find(OPEN_SELECTOR))Offcanvas.getOrCreateInstance(selector).show()}),EventHandler.on(window,EVENT_RESIZE,()=>{for(const element of SelectorEngine.find("[aria-modal][class*=show][class*=offcanvas-]"))getComputedStyle(element).position!=="fixed"&&Offcanvas.getOrCreateInstance(element).hide()}),enableDismissTrigger(Offcanvas),defineJQueryPlugin(Offcanvas);const ARIA_ATTRIBUTE_PATTERN=/^aria-[\w-]*$/i,DefaultAllowlist={"*":["class","dir","id","lang","role",ARIA_ATTRIBUTE_PATTERN],a:["target","href","title","rel"],area:[],b:[],br:[],col:[],code:[],dd:[],div:[],dl:[],dt:[],em:[],hr:[],h1:[],h2:[],h3:[],h4:[],h5:[],h6:[],i:[],img:["src","srcset","alt","title","width","height"],li:[],ol:[],p:[],pre:[],s:[],small:[],span:[],sub:[],sup:[],strong:[],u:[],ul:[]},uriAttributes=new Set(["background","cite","href","itemtype","longdesc","poster","src","xlink:href"]),SAFE_URL_PATTERN=/^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:/?#]*(?:[/?#]|$))/i,allowedAttribute=(attribute,allowedAttributeList)=>{const attributeName=attribute.nodeName.toLowerCase();return allowedAttributeList.includes(attributeName)?!uriAttributes.has(attributeName)||Boolean(SAFE_URL_PATTERN.test(attribute.nodeValue)):allowedAttributeList.filter(attributeRegex=>attributeRegex instanceof RegExp).some(regex=>regex.test(attributeName))};function sanitizeHtml(unsafeHtml,allowList,sanitizeFunction){if(!unsafeHtml.length)return unsafeHtml;if(sanitizeFunction&&typeof sanitizeFunction=="function")return sanitizeFunction(unsafeHtml);const domParser=new window.DOMParser,createdDocument=domParser.parseFromString(unsafeHtml,"text/html"),elements=[].concat(...createdDocument.body.querySelectorAll("*"));for(const element of elements){const elementName=element.nodeName.toLowerCase();if(!Object.keys(allowList).includes(elementName)){element.remove();continue}const attributeList=[].concat(...element.attributes),allowedAttributes=[].concat(allowList["*"]||[],allowList[elementName]||[]);for(const attribute of attributeList)allowedAttribute(attribute,allowedAttributes)||element.removeAttribute(attribute.nodeName)}return createdDocument.body.innerHTML}const NAME$5="TemplateFactory",Default$4={allowList:DefaultAllowlist,content:{},extraClass:"",html:!1,sanitize:!0,sanitizeFn:null,template:"
          "},DefaultType$4={allowList:"object",content:"object",extraClass:"(string|function)",html:"boolean",sanitize:"boolean",sanitizeFn:"(null|function)",template:"string"},DefaultContentType={entry:"(string|element|function|null)",selector:"(string|element)"};class TemplateFactory extends Config{constructor(config){super(),this._config=this._getConfig(config)}static get Default(){return Default$4}static get DefaultType(){return DefaultType$4}static get NAME(){return NAME$5}getContent(){return Object.values(this._config.content).map(config=>this._resolvePossibleFunction(config)).filter(Boolean)}hasContent(){return this.getContent().length>0}changeContent(content){return this._checkContent(content),this._config.content={...this._config.content,...content},this}toHtml(){const templateWrapper=document.createElement("div");templateWrapper.innerHTML=this._maybeSanitize(this._config.template);for(const[selector,text]of Object.entries(this._config.content))this._setContent(templateWrapper,text,selector);const template=templateWrapper.children[0],extraClass=this._resolvePossibleFunction(this._config.extraClass);return extraClass&&template.classList.add(...extraClass.split(" ")),template}_typeCheckConfig(config){super._typeCheckConfig(config),this._checkContent(config.content)}_checkContent(arg){for(const[selector,content]of Object.entries(arg))super._typeCheckConfig({selector,entry:content},DefaultContentType)}_setContent(template,content,selector){const templateElement=SelectorEngine.findOne(selector,template);if(!templateElement)return;if(content=this._resolvePossibleFunction(content),!content){templateElement.remove();return}if(isElement$1(content)){this._putElementInTemplate(getElement(content),templateElement);return}if(this._config.html){templateElement.innerHTML=this._maybeSanitize(content);return}templateElement.textContent=content}_maybeSanitize(arg){return this._config.sanitize?sanitizeHtml(arg,this._config.allowList,this._config.sanitizeFn):arg}_resolvePossibleFunction(arg){return execute(arg,[this])}_putElementInTemplate(element,templateElement){if(this._config.html){templateElement.innerHTML="",templateElement.append(element);return}templateElement.textContent=element.textContent}}const NAME$4="tooltip",DISALLOWED_ATTRIBUTES=new Set(["sanitize","allowList","sanitizeFn"]),CLASS_NAME_FADE$2="fade",CLASS_NAME_MODAL="modal",CLASS_NAME_SHOW$2="show",SELECTOR_TOOLTIP_INNER=".tooltip-inner",SELECTOR_MODAL=`.${CLASS_NAME_MODAL}`,EVENT_MODAL_HIDE="hide.bs.modal",TRIGGER_HOVER="hover",TRIGGER_FOCUS="focus",TRIGGER_CLICK="click",TRIGGER_MANUAL="manual",EVENT_HIDE$2="hide",EVENT_HIDDEN$2="hidden",EVENT_SHOW$2="show",EVENT_SHOWN$2="shown",EVENT_INSERTED="inserted",EVENT_CLICK$1="click",EVENT_FOCUSIN$1="focusin",EVENT_FOCUSOUT$1="focusout",EVENT_MOUSEENTER="mouseenter",EVENT_MOUSELEAVE="mouseleave",AttachmentMap={AUTO:"auto",TOP:"top",RIGHT:isRTL()?"left":"right",BOTTOM:"bottom",LEFT:isRTL()?"right":"left"},Default$3={allowList:DefaultAllowlist,animation:!0,boundary:"clippingParents",container:!1,customClass:"",delay:0,fallbackPlacements:["top","right","bottom","left"],html:!1,offset:[0,6],placement:"top",popperConfig:null,sanitize:!0,sanitizeFn:null,selector:!1,template:'',title:"",trigger:"hover focus"},DefaultType$3={allowList:"object",animation:"boolean",boundary:"(string|element)",container:"(string|element|boolean)",customClass:"(string|function)",delay:"(number|object)",fallbackPlacements:"array",html:"boolean",offset:"(array|string|function)",placement:"(string|function)",popperConfig:"(null|object|function)",sanitize:"boolean",sanitizeFn:"(null|function)",selector:"(string|boolean)",template:"string",title:"(string|element|function)",trigger:"string"};class Tooltip extends BaseComponent{constructor(element,config){if(typeof Popper=="undefined")throw new TypeError("Bootstrap's tooltips require Popper (https://popper.js.org)");super(element,config),this._isEnabled=!0,this._timeout=0,this._isHovered=null,this._activeTrigger={},this._popper=null,this._templateFactory=null,this._newContent=null,this.tip=null,this._setListeners(),this._config.selector||this._fixTitle()}static get Default(){return Default$3}static get DefaultType(){return DefaultType$3}static get NAME(){return NAME$4}enable(){this._isEnabled=!0}disable(){this._isEnabled=!1}toggleEnabled(){this._isEnabled=!this._isEnabled}toggle(){if(!this._isEnabled)return;if(this._activeTrigger.click=!this._activeTrigger.click,this._isShown()){this._leave();return}this._enter()}dispose(){clearTimeout(this._timeout),EventHandler.off(this._element.closest(SELECTOR_MODAL),EVENT_MODAL_HIDE,this._hideModalHandler),this._element.getAttribute("data-bs-original-title")&&this._element.setAttribute("title",this._element.getAttribute("data-bs-original-title")),this._disposePopper(),super.dispose()}show(){if(this._element.style.display==="none")throw new Error("Please use show on visible elements");if(!this._isWithContent()||!this._isEnabled)return;const showEvent=EventHandler.trigger(this._element,this.constructor.eventName(EVENT_SHOW$2)),shadowRoot=findShadowRoot(this._element),isInTheDom=(shadowRoot||this._element.ownerDocument.documentElement).contains(this._element);if(showEvent.defaultPrevented||!isInTheDom)return;this._disposePopper();const tip=this._getTipElement();this._element.setAttribute("aria-describedby",tip.getAttribute("id"));const{container}=this._config;if(this._element.ownerDocument.documentElement.contains(this.tip)||(container.append(tip),EventHandler.trigger(this._element,this.constructor.eventName(EVENT_INSERTED))),this._popper=this._createPopper(tip),tip.classList.add(CLASS_NAME_SHOW$2),"ontouchstart"in document.documentElement)for(const element of[].concat(...document.body.children))EventHandler.on(element,"mouseover",noop);const complete=()=>{EventHandler.trigger(this._element,this.constructor.eventName(EVENT_SHOWN$2)),this._isHovered===!1&&this._leave(),this._isHovered=!1};this._queueCallback(complete,this.tip,this._isAnimated())}hide(){if(!this._isShown())return;const hideEvent=EventHandler.trigger(this._element,this.constructor.eventName(EVENT_HIDE$2));if(hideEvent.defaultPrevented)return;const tip=this._getTipElement();if(tip.classList.remove(CLASS_NAME_SHOW$2),"ontouchstart"in document.documentElement)for(const element of[].concat(...document.body.children))EventHandler.off(element,"mouseover",noop);this._activeTrigger[TRIGGER_CLICK]=!1,this._activeTrigger[TRIGGER_FOCUS]=!1,this._activeTrigger[TRIGGER_HOVER]=!1,this._isHovered=null;const complete=()=>{if(this._isWithActiveTrigger())return;this._isHovered||this._disposePopper(),this._element.removeAttribute("aria-describedby"),EventHandler.trigger(this._element,this.constructor.eventName(EVENT_HIDDEN$2))};this._queueCallback(complete,this.tip,this._isAnimated())}update(){this._popper&&this._popper.update()}_isWithContent(){return Boolean(this._getTitle())}_getTipElement(){return this.tip||(this.tip=this._createTipElement(this._newContent||this._getContentForTemplate())),this.tip}_createTipElement(content){const tip=this._getTemplateFactory(content).toHtml();if(!tip)return null;tip.classList.remove(CLASS_NAME_FADE$2,CLASS_NAME_SHOW$2),tip.classList.add(`bs-${this.constructor.NAME}-auto`);const tipId=getUID(this.constructor.NAME).toString();return tip.setAttribute("id",tipId),this._isAnimated()&&tip.classList.add(CLASS_NAME_FADE$2),tip}setContent(content){this._newContent=content,this._isShown()&&(this._disposePopper(),this.show())}_getTemplateFactory(content){return this._templateFactory?this._templateFactory.changeContent(content):this._templateFactory=new TemplateFactory({...this._config,content,extraClass:this._resolvePossibleFunction(this._config.customClass)}),this._templateFactory}_getContentForTemplate(){return{[SELECTOR_TOOLTIP_INNER]:this._getTitle()}}_getTitle(){return this._resolvePossibleFunction(this._config.title)||this._element.getAttribute("data-bs-original-title")}_initializeOnDelegatedTarget(event){return this.constructor.getOrCreateInstance(event.delegateTarget,this._getDelegateConfig())}_isAnimated(){return this._config.animation||this.tip&&this.tip.classList.contains(CLASS_NAME_FADE$2)}_isShown(){return this.tip&&this.tip.classList.contains(CLASS_NAME_SHOW$2)}_createPopper(tip){const placement=execute(this._config.placement,[this,tip,this._element]),attachment=AttachmentMap[placement.toUpperCase()];return createPopper(this._element,tip,this._getPopperConfig(attachment))}_getOffset(){const{offset}=this._config;return typeof offset=="string"?offset.split(",").map(value=>Number.parseInt(value,10)):typeof offset=="function"?popperData=>offset(popperData,this._element):offset}_resolvePossibleFunction(arg){return execute(arg,[this._element])}_getPopperConfig(attachment){const defaultBsPopperConfig={placement:attachment,modifiers:[{name:"flip",options:{fallbackPlacements:this._config.fallbackPlacements}},{name:"offset",options:{offset:this._getOffset()}},{name:"preventOverflow",options:{boundary:this._config.boundary}},{name:"arrow",options:{element:`.${this.constructor.NAME}-arrow`}},{name:"preSetPlacement",enabled:!0,phase:"beforeMain",fn:data=>{this._getTipElement().setAttribute("data-popper-placement",data.state.placement)}}]};return{...defaultBsPopperConfig,...execute(this._config.popperConfig,[defaultBsPopperConfig])}}_setListeners(){const triggers=this._config.trigger.split(" ");for(const trigger of triggers)if(trigger==="click")EventHandler.on(this._element,this.constructor.eventName(EVENT_CLICK$1),this._config.selector,event=>{const context=this._initializeOnDelegatedTarget(event);context.toggle()});else if(trigger!==TRIGGER_MANUAL){const eventIn=trigger===TRIGGER_HOVER?this.constructor.eventName(EVENT_MOUSEENTER):this.constructor.eventName(EVENT_FOCUSIN$1),eventOut=trigger===TRIGGER_HOVER?this.constructor.eventName(EVENT_MOUSELEAVE):this.constructor.eventName(EVENT_FOCUSOUT$1);EventHandler.on(this._element,eventIn,this._config.selector,event=>{const context=this._initializeOnDelegatedTarget(event);context._activeTrigger[event.type==="focusin"?TRIGGER_FOCUS:TRIGGER_HOVER]=!0,context._enter()}),EventHandler.on(this._element,eventOut,this._config.selector,event=>{const context=this._initializeOnDelegatedTarget(event);context._activeTrigger[event.type==="focusout"?TRIGGER_FOCUS:TRIGGER_HOVER]=context._element.contains(event.relatedTarget),context._leave()})}this._hideModalHandler=()=>{this._element&&this.hide()},EventHandler.on(this._element.closest(SELECTOR_MODAL),EVENT_MODAL_HIDE,this._hideModalHandler)}_fixTitle(){const title=this._element.getAttribute("title");if(!title)return;!this._element.getAttribute("aria-label")&&!this._element.textContent.trim()&&this._element.setAttribute("aria-label",title),this._element.setAttribute("data-bs-original-title",title),this._element.removeAttribute("title")}_enter(){if(this._isShown()||this._isHovered){this._isHovered=!0;return}this._isHovered=!0,this._setTimeout(()=>{this._isHovered&&this.show()},this._config.delay.show)}_leave(){if(this._isWithActiveTrigger())return;this._isHovered=!1,this._setTimeout(()=>{this._isHovered||this.hide()},this._config.delay.hide)}_setTimeout(handler,timeout){clearTimeout(this._timeout),this._timeout=setTimeout(handler,timeout)}_isWithActiveTrigger(){return Object.values(this._activeTrigger).includes(!0)}_getConfig(config){const dataAttributes=Manipulator.getDataAttributes(this._element);for(const dataAttribute of Object.keys(dataAttributes))DISALLOWED_ATTRIBUTES.has(dataAttribute)&&delete dataAttributes[dataAttribute];return config={...dataAttributes,...typeof config=="object"&&config?config:{}},config=this._mergeConfigObj(config),config=this._configAfterMerge(config),this._typeCheckConfig(config),config}_configAfterMerge(config){return config.container=config.container===!1?document.body:getElement(config.container),typeof config.delay=="number"&&(config.delay={show:config.delay,hide:config.delay}),typeof config.title=="number"&&(config.title=config.title.toString()),typeof config.content=="number"&&(config.content=config.content.toString()),config}_getDelegateConfig(){const config={};for(const[key,value]of Object.entries(this._config))this.constructor.Default[key]!==value&&(config[key]=value);return config.selector=!1,config.trigger="manual",config}_disposePopper(){this._popper&&(this._popper.destroy(),this._popper=null),this.tip&&(this.tip.remove(),this.tip=null)}static jQueryInterface(config){return this.each(function(){const data=Tooltip.getOrCreateInstance(this,config);if(typeof config!="string")return;if(typeof data[config]=="undefined")throw new TypeError(`No method named "${config}"`);data[config]()})}}defineJQueryPlugin(Tooltip);const NAME$3="popover",SELECTOR_TITLE=".popover-header",SELECTOR_CONTENT=".popover-body",Default$2={...Tooltip.Default,content:"",offset:[0,8],placement:"right",template:'',trigger:"click"},DefaultType$2={...Tooltip.DefaultType,content:"(null|string|element|function)"};class Popover extends Tooltip{static get Default(){return Default$2}static get DefaultType(){return DefaultType$2}static get NAME(){return NAME$3}_isWithContent(){return this._getTitle()||this._getContent()}_getContentForTemplate(){return{[SELECTOR_TITLE]:this._getTitle(),[SELECTOR_CONTENT]:this._getContent()}}_getContent(){return this._resolvePossibleFunction(this._config.content)}static jQueryInterface(config){return this.each(function(){const data=Popover.getOrCreateInstance(this,config);if(typeof config!="string")return;if(typeof data[config]=="undefined")throw new TypeError(`No method named "${config}"`);data[config]()})}}defineJQueryPlugin(Popover);const NAME$2="scrollspy",DATA_KEY$2="bs.scrollspy",EVENT_KEY$2=`.${DATA_KEY$2}`,DATA_API_KEY=".data-api",EVENT_ACTIVATE=`activate${EVENT_KEY$2}`,EVENT_CLICK=`click${EVENT_KEY$2}`,EVENT_LOAD_DATA_API$1=`load${EVENT_KEY$2}${DATA_API_KEY}`,CLASS_NAME_DROPDOWN_ITEM="dropdown-item",CLASS_NAME_ACTIVE$1="active",SELECTOR_DATA_SPY='[data-bs-spy="scroll"]',SELECTOR_TARGET_LINKS="[href]",SELECTOR_NAV_LIST_GROUP=".nav, .list-group",SELECTOR_NAV_LINKS=".nav-link",SELECTOR_NAV_ITEMS=".nav-item",SELECTOR_LIST_ITEMS=".list-group-item",SELECTOR_LINK_ITEMS=`${SELECTOR_NAV_LINKS}, ${SELECTOR_NAV_ITEMS} > ${SELECTOR_NAV_LINKS}, ${SELECTOR_LIST_ITEMS}`,SELECTOR_DROPDOWN=".dropdown",SELECTOR_DROPDOWN_TOGGLE$1=".dropdown-toggle",Default$1={offset:null,rootMargin:"0px 0px -25%",smoothScroll:!1,target:null,threshold:[.1,.5,1]},DefaultType$1={offset:"(number|null)",rootMargin:"string",smoothScroll:"boolean",target:"element",threshold:"array"};class ScrollSpy extends BaseComponent{constructor(element,config){super(element,config),this._targetLinks=new Map,this._observableSections=new Map,this._rootElement=getComputedStyle(this._element).overflowY==="visible"?null:this._element,this._activeTarget=null,this._observer=null,this._previousScrollData={visibleEntryTop:0,parentScrollTop:0},this.refresh()}static get Default(){return Default$1}static get DefaultType(){return DefaultType$1}static get NAME(){return NAME$2}refresh(){this._initializeTargetsAndObservables(),this._maybeEnableSmoothScroll(),this._observer?this._observer.disconnect():this._observer=this._getNewObserver();for(const section of this._observableSections.values())this._observer.observe(section)}dispose(){this._observer.disconnect(),super.dispose()}_configAfterMerge(config){return config.target=getElement(config.target)||document.body,config.rootMargin=config.offset?`${config.offset}px 0px -30%`:config.rootMargin,typeof config.threshold=="string"&&(config.threshold=config.threshold.split(",").map(value=>Number.parseFloat(value))),config}_maybeEnableSmoothScroll(){if(!this._config.smoothScroll)return;EventHandler.off(this._config.target,EVENT_CLICK),EventHandler.on(this._config.target,EVENT_CLICK,SELECTOR_TARGET_LINKS,event=>{const observableSection=this._observableSections.get(event.target.hash);if(observableSection){event.preventDefault();const root=this._rootElement||window,height=observableSection.offsetTop-this._element.offsetTop;if(root.scrollTo){root.scrollTo({top:height,behavior:"smooth"});return}root.scrollTop=height}})}_getNewObserver(){const options={root:this._rootElement,threshold:this._config.threshold,rootMargin:this._config.rootMargin};return new IntersectionObserver(entries=>this._observerCallback(entries),options)}_observerCallback(entries){const targetElement=entry=>this._targetLinks.get(`#${entry.target.id}`),activate=entry=>{this._previousScrollData.visibleEntryTop=entry.target.offsetTop,this._process(targetElement(entry))},parentScrollTop=(this._rootElement||document.documentElement).scrollTop,userScrollsDown=parentScrollTop>=this._previousScrollData.parentScrollTop;this._previousScrollData.parentScrollTop=parentScrollTop;for(const entry of entries){if(!entry.isIntersecting){this._activeTarget=null,this._clearActiveClass(targetElement(entry));continue}const entryIsLowerThanPrevious=entry.target.offsetTop>=this._previousScrollData.visibleEntryTop;if(userScrollsDown&&entryIsLowerThanPrevious){if(activate(entry),!parentScrollTop)return;continue}!userScrollsDown&&!entryIsLowerThanPrevious&&activate(entry)}}_initializeTargetsAndObservables(){this._targetLinks=new Map,this._observableSections=new Map;const targetLinks=SelectorEngine.find(SELECTOR_TARGET_LINKS,this._config.target);for(const anchor of targetLinks){if(!anchor.hash||isDisabled(anchor))continue;const observableSection=SelectorEngine.findOne(decodeURI(anchor.hash),this._element);isVisible(observableSection)&&(this._targetLinks.set(decodeURI(anchor.hash),anchor),this._observableSections.set(anchor.hash,observableSection))}}_process(target){if(this._activeTarget===target)return;this._clearActiveClass(this._config.target),this._activeTarget=target,target.classList.add(CLASS_NAME_ACTIVE$1),this._activateParents(target),EventHandler.trigger(this._element,EVENT_ACTIVATE,{relatedTarget:target})}_activateParents(target){if(target.classList.contains(CLASS_NAME_DROPDOWN_ITEM)){SelectorEngine.findOne(SELECTOR_DROPDOWN_TOGGLE$1,target.closest(SELECTOR_DROPDOWN)).classList.add(CLASS_NAME_ACTIVE$1);return}for(const listGroup of SelectorEngine.parents(target,SELECTOR_NAV_LIST_GROUP))for(const item of SelectorEngine.prev(listGroup,SELECTOR_LINK_ITEMS))item.classList.add(CLASS_NAME_ACTIVE$1)}_clearActiveClass(parent){parent.classList.remove(CLASS_NAME_ACTIVE$1);const activeNodes=SelectorEngine.find(`${SELECTOR_TARGET_LINKS}.${CLASS_NAME_ACTIVE$1}`,parent);for(const node of activeNodes)node.classList.remove(CLASS_NAME_ACTIVE$1)}static jQueryInterface(config){return this.each(function(){const data=ScrollSpy.getOrCreateInstance(this,config);if(typeof config!="string")return;if(data[config]===void 0||config.startsWith("_")||config==="constructor")throw new TypeError(`No method named "${config}"`);data[config]()})}}EventHandler.on(window,EVENT_LOAD_DATA_API$1,()=>{for(const spy of SelectorEngine.find(SELECTOR_DATA_SPY))ScrollSpy.getOrCreateInstance(spy)}),defineJQueryPlugin(ScrollSpy);const NAME$1="tab",DATA_KEY$1="bs.tab",EVENT_KEY$1=`.${DATA_KEY$1}`,EVENT_HIDE$1=`hide${EVENT_KEY$1}`,EVENT_HIDDEN$1=`hidden${EVENT_KEY$1}`,EVENT_SHOW$1=`show${EVENT_KEY$1}`,EVENT_SHOWN$1=`shown${EVENT_KEY$1}`,EVENT_CLICK_DATA_API=`click${EVENT_KEY$1}`,EVENT_KEYDOWN=`keydown${EVENT_KEY$1}`,EVENT_LOAD_DATA_API=`load${EVENT_KEY$1}`,ARROW_LEFT_KEY="ArrowLeft",ARROW_RIGHT_KEY="ArrowRight",ARROW_UP_KEY="ArrowUp",ARROW_DOWN_KEY="ArrowDown",HOME_KEY="Home",END_KEY="End",CLASS_NAME_ACTIVE="active",CLASS_NAME_FADE$1="fade",CLASS_NAME_SHOW$1="show",CLASS_DROPDOWN="dropdown",SELECTOR_DROPDOWN_TOGGLE=".dropdown-toggle",SELECTOR_DROPDOWN_MENU=".dropdown-menu",NOT_SELECTOR_DROPDOWN_TOGGLE=`:not(${SELECTOR_DROPDOWN_TOGGLE})`,SELECTOR_TAB_PANEL='.list-group, .nav, [role="tablist"]',SELECTOR_OUTER=".nav-item, .list-group-item",SELECTOR_INNER=`.nav-link${NOT_SELECTOR_DROPDOWN_TOGGLE}, .list-group-item${NOT_SELECTOR_DROPDOWN_TOGGLE}, [role="tab"]${NOT_SELECTOR_DROPDOWN_TOGGLE}`,SELECTOR_DATA_TOGGLE='[data-bs-toggle="tab"], [data-bs-toggle="pill"], [data-bs-toggle="list"]',SELECTOR_INNER_ELEM=`${SELECTOR_INNER}, ${SELECTOR_DATA_TOGGLE}`,SELECTOR_DATA_TOGGLE_ACTIVE=`.${CLASS_NAME_ACTIVE}[data-bs-toggle="tab"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="pill"], .${CLASS_NAME_ACTIVE}[data-bs-toggle="list"]`;class Tab extends BaseComponent{constructor(element){if(super(element),this._parent=this._element.closest(SELECTOR_TAB_PANEL),!this._parent)return;this._setInitialAttributes(this._parent,this._getChildren()),EventHandler.on(this._element,EVENT_KEYDOWN,event=>this._keydown(event))}static get NAME(){return NAME$1}show(){const innerElem=this._element;if(this._elemIsActive(innerElem))return;const active=this._getActiveElem(),hideEvent=active?EventHandler.trigger(active,EVENT_HIDE$1,{relatedTarget:innerElem}):null,showEvent=EventHandler.trigger(innerElem,EVENT_SHOW$1,{relatedTarget:active});if(showEvent.defaultPrevented||hideEvent&&hideEvent.defaultPrevented)return;this._deactivate(active,innerElem),this._activate(innerElem,active)}_activate(element,relatedElem){if(!element)return;element.classList.add(CLASS_NAME_ACTIVE),this._activate(SelectorEngine.getElementFromSelector(element));const complete=()=>{if(element.getAttribute("role")!=="tab"){element.classList.add(CLASS_NAME_SHOW$1);return}element.removeAttribute("tabindex"),element.setAttribute("aria-selected",!0),this._toggleDropDown(element,!0),EventHandler.trigger(element,EVENT_SHOWN$1,{relatedTarget:relatedElem})};this._queueCallback(complete,element,element.classList.contains(CLASS_NAME_FADE$1))}_deactivate(element,relatedElem){if(!element)return;element.classList.remove(CLASS_NAME_ACTIVE),element.blur(),this._deactivate(SelectorEngine.getElementFromSelector(element));const complete=()=>{if(element.getAttribute("role")!=="tab"){element.classList.remove(CLASS_NAME_SHOW$1);return}element.setAttribute("aria-selected",!1),element.setAttribute("tabindex","-1"),this._toggleDropDown(element,!1),EventHandler.trigger(element,EVENT_HIDDEN$1,{relatedTarget:relatedElem})};this._queueCallback(complete,element,element.classList.contains(CLASS_NAME_FADE$1))}_keydown(event){if(![ARROW_LEFT_KEY,ARROW_RIGHT_KEY,ARROW_UP_KEY,ARROW_DOWN_KEY,HOME_KEY,END_KEY].includes(event.key))return;event.stopPropagation(),event.preventDefault();const children=this._getChildren().filter(element=>!isDisabled(element));let nextActiveElement;if([HOME_KEY,END_KEY].includes(event.key))nextActiveElement=children[event.key===HOME_KEY?0:children.length-1];else{const isNext=[ARROW_RIGHT_KEY,ARROW_DOWN_KEY].includes(event.key);nextActiveElement=getNextActiveElement(children,event.target,isNext,!0)}nextActiveElement&&(nextActiveElement.focus({preventScroll:!0}),Tab.getOrCreateInstance(nextActiveElement).show())}_getChildren(){return SelectorEngine.find(SELECTOR_INNER_ELEM,this._parent)}_getActiveElem(){return this._getChildren().find(child=>this._elemIsActive(child))||null}_setInitialAttributes(parent,children){this._setAttributeIfNotExists(parent,"role","tablist");for(const child of children)this._setInitialAttributesOnChild(child)}_setInitialAttributesOnChild(child){child=this._getInnerElement(child);const isActive=this._elemIsActive(child),outerElem=this._getOuterElement(child);child.setAttribute("aria-selected",isActive),outerElem!==child&&this._setAttributeIfNotExists(outerElem,"role","presentation"),isActive||child.setAttribute("tabindex","-1"),this._setAttributeIfNotExists(child,"role","tab"),this._setInitialAttributesOnTargetPanel(child)}_setInitialAttributesOnTargetPanel(child){const target=SelectorEngine.getElementFromSelector(child);if(!target)return;this._setAttributeIfNotExists(target,"role","tabpanel"),child.id&&this._setAttributeIfNotExists(target,"aria-labelledby",`${child.id}`)}_toggleDropDown(element,open){const outerElem=this._getOuterElement(element);if(!outerElem.classList.contains(CLASS_DROPDOWN))return;const toggle=(selector,className)=>{const element=SelectorEngine.findOne(selector,outerElem);element&&element.classList.toggle(className,open)};toggle(SELECTOR_DROPDOWN_TOGGLE,CLASS_NAME_ACTIVE),toggle(SELECTOR_DROPDOWN_MENU,CLASS_NAME_SHOW$1),outerElem.setAttribute("aria-expanded",open)}_setAttributeIfNotExists(element,attribute,value){element.hasAttribute(attribute)||element.setAttribute(attribute,value)}_elemIsActive(elem){return elem.classList.contains(CLASS_NAME_ACTIVE)}_getInnerElement(elem){return elem.matches(SELECTOR_INNER_ELEM)?elem:SelectorEngine.findOne(SELECTOR_INNER_ELEM,elem)}_getOuterElement(elem){return elem.closest(SELECTOR_OUTER)||elem}static jQueryInterface(config){return this.each(function(){const data=Tab.getOrCreateInstance(this);if(typeof config!="string")return;if(data[config]===void 0||config.startsWith("_")||config==="constructor")throw new TypeError(`No method named "${config}"`);data[config]()})}}EventHandler.on(document,EVENT_CLICK_DATA_API,SELECTOR_DATA_TOGGLE,function(event){if(["A","AREA"].includes(this.tagName)&&event.preventDefault(),isDisabled(this))return;Tab.getOrCreateInstance(this).show()}),EventHandler.on(window,EVENT_LOAD_DATA_API,()=>{for(const element of SelectorEngine.find(SELECTOR_DATA_TOGGLE_ACTIVE))Tab.getOrCreateInstance(element)}),defineJQueryPlugin(Tab);const NAME="toast",DATA_KEY="bs.toast",EVENT_KEY=`.${DATA_KEY}`,EVENT_MOUSEOVER=`mouseover${EVENT_KEY}`,EVENT_MOUSEOUT=`mouseout${EVENT_KEY}`,EVENT_FOCUSIN=`focusin${EVENT_KEY}`,EVENT_FOCUSOUT=`focusout${EVENT_KEY}`,EVENT_HIDE=`hide${EVENT_KEY}`,EVENT_HIDDEN=`hidden${EVENT_KEY}`,EVENT_SHOW=`show${EVENT_KEY}`,EVENT_SHOWN=`shown${EVENT_KEY}`,CLASS_NAME_FADE="fade",CLASS_NAME_HIDE="hide",CLASS_NAME_SHOW="show",CLASS_NAME_SHOWING="showing",DefaultType={animation:"boolean",autohide:"boolean",delay:"number"},Default={animation:!0,autohide:!0,delay:5e3};class Toast extends BaseComponent{constructor(element,config){super(element,config),this._timeout=null,this._hasMouseInteraction=!1,this._hasKeyboardInteraction=!1,this._setListeners()}static get Default(){return Default}static get DefaultType(){return DefaultType}static get NAME(){return NAME}show(){const showEvent=EventHandler.trigger(this._element,EVENT_SHOW);if(showEvent.defaultPrevented)return;this._clearTimeout(),this._config.animation&&this._element.classList.add(CLASS_NAME_FADE);const complete=()=>{this._element.classList.remove(CLASS_NAME_SHOWING),EventHandler.trigger(this._element,EVENT_SHOWN),this._maybeScheduleHide()};this._element.classList.remove(CLASS_NAME_HIDE),reflow(this._element),this._element.classList.add(CLASS_NAME_SHOW,CLASS_NAME_SHOWING),this._queueCallback(complete,this._element,this._config.animation)}hide(){if(!this.isShown())return;const hideEvent=EventHandler.trigger(this._element,EVENT_HIDE);if(hideEvent.defaultPrevented)return;const complete=()=>{this._element.classList.add(CLASS_NAME_HIDE),this._element.classList.remove(CLASS_NAME_SHOWING,CLASS_NAME_SHOW),EventHandler.trigger(this._element,EVENT_HIDDEN)};this._element.classList.add(CLASS_NAME_SHOWING),this._queueCallback(complete,this._element,this._config.animation)}dispose(){this._clearTimeout(),this.isShown()&&this._element.classList.remove(CLASS_NAME_SHOW),super.dispose()}isShown(){return this._element.classList.contains(CLASS_NAME_SHOW)}_maybeScheduleHide(){if(!this._config.autohide)return;if(this._hasMouseInteraction||this._hasKeyboardInteraction)return;this._timeout=setTimeout(()=>{this.hide()},this._config.delay)}_onInteraction(event,isInteracting){switch(event.type){case"mouseover":case"mouseout":{this._hasMouseInteraction=isInteracting;break}case"focusin":case"focusout":{this._hasKeyboardInteraction=isInteracting;break}}if(isInteracting){this._clearTimeout();return}const nextElement=event.relatedTarget;if(this._element===nextElement||this._element.contains(nextElement))return;this._maybeScheduleHide()}_setListeners(){EventHandler.on(this._element,EVENT_MOUSEOVER,event=>this._onInteraction(event,!0)),EventHandler.on(this._element,EVENT_MOUSEOUT,event=>this._onInteraction(event,!1)),EventHandler.on(this._element,EVENT_FOCUSIN,event=>this._onInteraction(event,!0)),EventHandler.on(this._element,EVENT_FOCUSOUT,event=>this._onInteraction(event,!1))}_clearTimeout(){clearTimeout(this._timeout),this._timeout=null}static jQueryInterface(config){return this.each(function(){const data=Toast.getOrCreateInstance(this,config);if(typeof config=="string"){if(typeof data[config]=="undefined")throw new TypeError(`No method named "${config}"`);data[config](this)}})}}enableDismissTrigger(Toast),defineJQueryPlugin(Toast);const index_umd={Alert,Button,Carousel,Collapse,Dropdown,Modal,Offcanvas,Popover,ScrollSpy,Tab,Toast,Tooltip};return index_umd}),function _f(self){"use strict";try{module&&(self=module)}catch{}self._factory=_f;function u(a){return"undefined"==typeof a||a}function v(a){const b=Array(a);for(let c=0;c=this.B&&(w||!n[l])){var e,g,k,f=M(q,d,r),h="";switch(this.G){case"full":if(2f;g--)g-f>=this.B&&(k=M(q,d,r,e,f),h=l.substring(f,g),N(this,n,h,k,a,c));break}case"reverse":if(1=this.B&&N(this,n,h,M(q,d,r,e,g),a,c);h=""}case"forward":if(1=this.B&&N(this,n,h,f,a,c);break}default:if(this.C&&(f=Math.min(f/this.C(b,l,r)|0,q-1)),N(this,n,l,f,a,c),w&&1=this.B&&!e[l]){e[l]=1;const p=this.l&&l>f;N(this,m,p?f:l,M(h+(d/2>h?0:1),d,r,g-1,k-1),a,c,p?l:f)}}}}this.m||(this.register[a]=1)}}return this};function M(a,b,c,d,e){return c&&1=this.B&&!c[q])if(this.s||f||this.map[q])k[w++]=q,c[q]=1;else return d;a=k,e=a.length}if(!e)return d;b||(b=100),g=this.depth&&1=d))))break;if(n){if(f)return sa(k,d,0);b[b.length]=k;return}}return!c&&k}function sa(a,b,c){return a=1===a.length?a[0]:[].concat.apply([],a),c||a.length>b?a.slice(c,c+b):a}function ta(a,b,c,d){return c?(d=d&&b>c,a=(a=a[d?b:c])&&a[d?c:b]):a=a[b],a}t.contain=function(a){return!!this.register[a]},t.update=function(a,b){return this.remove(a).add(a,b)},t.remove=function(a,b){const c=this.register[a];if(c){if(this.m)for(let d=0,e;d{f=m}));let g,k;switch(e||(e=0)){case 0:if(g="reg",this.m){k=x();for(let m in this.register)k[m]=1}else k=this.register;break;case 1:g="cfg",k={doc:0,opt:this.s?1:0};break;case 2:g="map",k=this.map;break;case 3:g="ctx",k=this.h;break;default:"undefined"==typeof c&&f&&f();return}return qa(a,b||this,c,g,d,e,k,f),h},t.import=function(a,b){if(b)switch(C(b)&&(b=JSON.parse(b)),a){case"cfg":this.s=!!b.opt;break;case"reg":this.m=!1,this.register=b;break;case"map":this.map=b;break;case"ctx":this.h=b}},ka(L.prototype);function ua(a){a=a.data;var d,b=self._index;const c=a.args;switch(d=a.task,d){case"init":d=a.options||{},a=a.factory,b=d.encode,d.cache=!1,b&&0===b.indexOf("function")&&(d.encode=Function("return "+b)()),a?(Function("return "+a)()(self),self._index=new self.FlexSearch.Index(d),delete self.FlexSearch):self._index=new L(d);break;default:a=a.id,b=b[d].apply(b,c),postMessage("search"===d?{id:a,msg:b}:{id:a})}}let va=0;function P(a){if(!(this instanceof P))return new P(a);var b;a?E(b=a.encode)&&(a.encode=b.toString()):a={},(b=(self||window)._factory)&&(b=b.toString());const c="undefined"==typeof window&&self.exports,d=this;this.o=wa(b,c,a.worker),this.h=x(),this.o&&(c?this.o.on("message",function(e){d.h[e.id](e.msg),delete d.h[e.id]}):this.o.onmessage=function(e){e=e.data,d.h[e.id](e.msg),delete d.h[e.id]},this.o.postMessage({task:"init",factory:b,options:a}))}Q("add"),Q("append"),Q("search"),Q("update"),Q("remove");function Q(a){P.prototype[a]=P.prototype[a+"Async"]=function(){const b=this,c=[].slice.call(arguments);var d=c[c.length-1];let e;return E(d)&&(e=d,c.splice(c.length-1,1)),d=new Promise(function(f){setTimeout(function(){b.h[++va]=f,b.o.postMessage({task:a,id:va,args:c})})}),e?(d.then(e),this):d}}function wa(a,b,c){let d;try{d=b?new(require("worker_threads").Worker)(__dirname+"/node/node.js"):a?new Worker(URL.createObjectURL(new Blob(["onmessage="+ua.toString()],{type:"text/javascript"}))):new Worker(C(c)?c:"worker/worker.js",{type:"module"})}catch{}return d}function S(a){if(!(this instanceof S))return new S(a);var c,b=a.document||a.doc||a;this.K=[],this.h=[],this.A=[],this.register=x(),this.key=(c=b.key||b.id)&&T(c,this.A)||"id",this.m=u(a.fastupdate),this.C=(c=b.store)&&!0!==c&&[],this.store=c&&x(),this.I=(c=b.tag)&&T(c,this.A),this.l=c&&x(),this.cache=(c=a.cache)&&new K(c),a.cache=!1,this.o=a.worker,this.async=!1,c=x();let d=b.index||b.field||b;C(d)&&(d=[d]);for(let e=0,f,h;eb||c)&&(e=e.slice(c,c+b)),d&&(e=ya.call(this,e)),{tag:a,result:e}}function ya(a){const b=Array(a.length);for(let c=0,d;c{f=g})),e||(e=0),d||(d=0),d [!NOTE] > The default configuration provides basic security headers. Please review the [server configuration](/opensees-gallery/docs/getting-started/modeling/) for more details about the Content Security Policy. The cache settings are explained in more detail in the Netlify blog  . netlify.toml [build] publish = "exampleSite/public" command = "npm run build:example" [build.environment] DART_SASS_VERSION = "1.77.5" HUGO_VERSION = "0.131.0" HUGO_ENV = "production" HUGO_ENABLEGITINFO = "true" NODE_VERSION = "20.16.0" NPM_VERSION = "10.8.1" ... The same file also configures several optional plugins. netlify.toml [[plugins]] package = "@gethinode/netlify-plugin-dartsass" [[plugins]] package = "netlify-plugin-hugo-cache-resources" [plugins.inputs] # Redirected in exampleSite/config/_default/hugo.toml # srcdir = "" # [[plugins]] # package = "@netlify/plugin-lighthouse" # [plugins.inputs] # output_path = "reports/lighthouse.html" ... ### Configure your site Sign up for Netlify and configure your site in seven steps. Step 1. Sign up for Netlify Step 2. Sign in with your Git provider Step 3. Authenticate your sign in (2FA) Step 4. Add a new site Step 5. Connect to your Git provider Step 6. Import an existing project Step 7. Configure the build settings Previous Next Step 1. Sign up for Netlify Go to netlify.com  and click on the button Sign up. Select your preferred signup method next. This will likely be a hosted Git provider, although you also have the option to sign up with an email address. The next steps use GitHub, but other Git providers will follow a similar process. Step 2. Sign in with your Git provider Enter the credentials for your Git provider and click the button to sign in. Step 3. Authenticate your sign in (2FA) Assuming you have enabled two-factor authentication with your Git provider, authenticate the sign in next. This example uses the GitHub Mobile app. Step 4. Add a new site Click on the button Add new site to set up a new site with Netlify. Step 5. Connect to your Git provider Connect to your Git provider to import your existing Hinode repository. Step 6. Import an existing project Pick a repository from your Git provider. Ensure Netlify has access to the correct repository. Step 7. Configure the build settings Review the basic build settings. Netlify will use the settings provided in the preparations. Click on the button Deploy site to start the build and deployment process. Your site is now ready to be used. Click on the domain settings of your site within the \`Site overview\` page to provide a domain alias and to edit the site name as needed. The same section also allows the configuration of a custom domain. Be sure to review your [server configuration](/opensees-gallery/docs/getting-started/modeling/) if you encounter any rendering issues, such as broken links or garbled stylesheets. -->`}).add({id:7,tag:"en",href:"/opensees-gallery/examples/concretesurface/",title:"Concrete",description:"An investigation of 3D concrete material models",content:`This example is adapted from the OpenSees documentation for the ASDConcrete material. The analysis is implemented in the Python scripts: +ASDConcrete3D_Ex_CyclicUniaxialCompression.py ASDConcrete3D_Ex_Surface.py ASDConcrete3D_MakeLaws.py`}).add({id:8,tag:"en",href:"/opensees-gallery/examples/example8/",title:"Continuum Cantilever",description:"Dynamic analysis of a cantilever beam, modeled with 8-node brick elements.",content:`In this example a simple problem in solid dynamics is considered. The structure is a cantilever beam modelled with three dimensional solid elements. +Example8.tcl Example8.py For three dimensional analysis, a typical solid element is defined as a volume in three dimensional space. Each node of the analysis has three displacement degrees of freedom. Thus the model is defined with ndm = 3 and ndf = 3. +For this model, a mesh is generated using the block3D command. The number of nodes in the local xx -direction of the block is nx, the number of nodes in the local yy -direction of the block is ny and the number of nodes in the local zz -direction of the block is nz. The block3D generation nodes 1,2,3,4,5,6,7,8 are prescribed to define the three dimensional domain of the beam, which is of size 2×2×102 \\times 2 \\times 10 . +Tcl Python(RT) # mesh generation block3D $nx $ny $nz 1 1 $element $eleArgs 1 -1 -1 0 2 1 -1 0 3 1 1 0 4 -1 1 0 5 -1 -1 10 6 1 -1 10 7 1 1 10 8 -1 1 10 model.block3D(nx, ny, nz, 1, 1, Brick, 1, 1: [-1.0, -1.0, 0.0], 2: [ 1.0, -1.0, 0.0], 3: [ 1.0, 1.0, 0.0], 4: [-1.0, 1.0, 0.0], 5: [-1.0, -1.0, 10.0], 6: [ 1.0, -1.0, 10.0], 7: [ 1.0, 1.0, 10.0], 8: [-1.0, 1.0, 10.0]) Two possible brick elements can be used for the analysis. These may be created using the terms StdBrick or BbarBrick. An elastic isotropic material is used. +For initial gravity load analysis, a single load pattern with a linear time series and a single nodal loads is used. +Boundary conditions are applied using the fixZ command. In this case, all the nodes whose zz -coordiate is 0.00.0 have the boundary condition 1,1,1, fully fixed. +A solution algorithm of type Newton is used for the problem. The solution algorithm uses a ConvergenceTest which tests convergence on the norm of the energy increment vector. Five static load steps are performed. +Subsequent to the static analysis, the wipeAnalysis and remove loadPatern commands are used to remove the nodal loads and create a new analysis. The nodal displacements have not changed. However, with the external loads removed the structure is no longer in static equilibrium. +The integrator for the dynamic analysis if of type GeneralizedMidpoint with α=0.5\\alpha = 0.5 . This choice is uconditionally stable and energy conserving for linear problems. Additionally, this integrator conserves linear and angular momentum for both linear and non-linear problems. The dynamic analysis is performed using 100100 time increments with a time step Δt=2.0\\Delta t = 2.0 . +The deformed shape at the end of the analysis is rendered below: +The results consist of the file cantilever.out, which contains a line for every time step. Each line contains the time and the horizontal displacement at the upper right corner the beam. This is plotted in the figure below: +`}).add({id:9,tag:"en",href:"/opensees-gallery/docs/getting-started/contribute/",title:"Contribute",description:"Contribute to the open-source development of OpenSees.",content:`OpenSees is fully open source and welcomes any contribution. To streamline the contribution process, please take a moment to review the guidelines outlined in this article. +Using the issue tracker   The issue tracker  on GitHub is the preferred channel for bug reports, feature requests and submitting pull requests. +Asking for help   Use the GitHub Discussions  to ask for help from the OpenSees community  . The discussion forum also includes other topics, such as ideas  and showcases  . We strive for a safe, welcoming, and productive community. The community guidelines  provide more context about the expectations, moderation policy, and terms of service. +Bug reports   A bug is a demonstrable problem that is caused by the code in the repository. This may also include issues with the documentation or configuration files. Before filing a bug report, please consider the following guidelines: +Use the GitHub issue search  — check if the issue has already been reported. Check if the issue has been fixed — try to reproduce it using the latest main in the repository  . Isolate the problem — ideally create a reduced test case. Use the provided template in the issue tracker  to capture the context, evidence and steps on how to reproduce the issue. Feature requests   Feature requests are welcome. Please use the provided template in the issue tracker  to capture the idea and context. +Pull requests     Important By submitting a patch, you agree to allow the project owners to license your work under the terms of the BSD license  (if it includes code changes) and under the terms of the Creative Commons ( CC BY-NC 4.0)  license (if it includes documentation changes). +Please adhere to the coding guidelines used throughout the project (indentation, accurate comments, etc.) and any other requirements (such as test coverage). +Adhering to the following process is the best way to get your work included in the project: +Fork the project, clone your fork, and configure the remotes: +git clone https://github.com/<your-username>/OpenSeesRT.git cd OpenSeesRT git remote add upstream https://github.com/claudioperez/OpenSeesRT If you cloned a while ago, get the latest changes from upstream: +git checkout main git pull upstream main Create a new topic branch (off the main project development branch) to contain your feature, change, or fix: +git checkout -b <topic-branch-name> Commit your changes in logical chunks. Please adhere to these git commit message guidelines  . Use Git’s interactive rebase  feature to tidy up your commits before making them public. +Locally merge (or rebase) the upstream development branch into your topic branch: +git pull [--rebase] upstream main Push your topic branch up to your fork: +git push origin <topic-branch-name> Open a Pull Request  with a clear title and description against the main branch. +Coding guidelines   In general, run clang-format <your-file.cpp> before committing to ensure your changes follow our coding standards. +License   By contributing your code, you agree to license your contribution under the BSD license  . By contributing to the documentation, you agree to license your contribution under the Creative Commons ( CC BY-NC 4.0  ) license.`}).add({id:10,tag:"en",href:"/opensees-gallery/docs/about/credits/",title:"Credits",description:"OpenSees is fully open source and uses several open-source frameworks and libraries.",content:""}).add({id:11,tag:"en",href:"/opensees-gallery/examples/soliddam/",title:"Dam",description:"",content:""}).add({id:12,tag:"en",href:"/opensees-gallery/docs/developing/",title:"Developing",description:"Details about the internals of OpenSees.",content:`Class Interface Specification   Classes may be categorized as follows: +Domain: These classes describe the finite element model and store the results of an analysis on the model. The classes include Domain, Element, Node, Load, SP_Constraint, MP_Constraint, and their subclasses. +Analysis: These classes perform the analysis of the finite element model. The classes include the Analysis, ConstraintHandler, DOF_Numberer, SolutionAlgorithm, Integrator, FE_Element, DOF_Group and AnalysisModel classes, and their subclasses. +Computational Classes: These classes allow for composing efficient computational strategies that take advantage of prolem features such as sparsity, symmetry, and parallelism. More specifically these include: +System of Equation These include the abstract SystemOfEquation and Solver classes, and subclasses of these classes. These classes are provided for the solving of large scale systems of linear and eigenvalue equations. +Graph These are classes used to provide information about nodal and elemental connectivity and sparsity of systems of equations. The classes include Graph, Vertex, GraphNumberer, GraphPartitioner, and their subclasses. There is no Edge class provided at present. In current design each Vertex stores in an ID the tag of all it’s adjacent Vertices. For graph numbering and partitioning this has proved sufficient. +Parallel Classes These facilitate the development of parallel object-oriented finite element programs, classes are provided for parallel programming. The classes in the framework support the aggregate programming model. The classes include Actor, Shadow, Message, MachineBroker, FEM_ObjectBroker, Channel, and their subclasses. +Runtime Classes: These include the ModelNamespace and G3_Runtime classes. An analyst will interact with a ModelBuilder object, to create the Element, Node, Load and Constraint objects that define the model. +Other/Utility Classes +Matrix Classes: These include the classes Matrix, Vector and ID (integer array). These classes are used in the framework for passing information between objects in a safe manner, and for small scale numerical calculations in element formulation. +Data Storage These are classes used to store data. There are two abstract classes TaggedObjectStorage and FE_Datastore. Objects of type TaggedObjectStorage are used as containers to store and provide access to the TaggedObjects in memory during program execution. FE_Datastore objects are used to store/retrieve information from databases, containers which can permanently hold program data. +Visualization Classes These are classes used to generate images of the model for the analyst. These classes include Renderer, ColorMap, and their subclasses. +This design allows for contributions in the fields of: +Element and material modeling. +Solution algorithms, integration procedures and constraint handling techniques. +Model generation. +Numerical analysis for solution of linear and eigenvalue problems. +Graph theory for numbering and partitioning graphs. +Data structures for container classes and database. +Graphics. +Message passing systems and load balancing in parallel environments. +Frank McKenna and Gregory L. Fenves December 20, 1999`}).add({id:13,tag:"en",href:"/opensees-gallery/examples/mrf_concentrated/",title:"Dynamic Analysis of 2-Story Moment Frame",description:"This example demonstrates how to perform a dynamic analysis in OpenSees using a 2-story, 1-bay steel moment resisting frame. The structure is subjected to the Canoga Park record from the 1994 Northridge earthquake. The nonlinear behavior is represented using the concentrated plasticity concept with rotational springs. The rotational behavior of the plastic regions follows a bilinear hysteretic response based on the Modified Ibarra Krawinkler Deterioration Model (Ibarra et al. 2005, Lignos and Krawinkler 2009, 2010).",content:`This example demonstrates how to perform a dynamic analysis in OpenSees using a 2-story, 1-bay steel moment resisting frame. The structure is subjected to the Canoga Park record from the 1994 Northridge earthquake. The nonlinear behavior is represented using the concentrated plasticity concept with rotational springs. The rotational behavior of the plastic regions follows a bilinear hysteretic response based on the Modified Ibarra Krawinkler Deterioration Model (Ibarra et al. 2005, Lignos and Krawinkler 2009, 2010). For this example, all modes of cyclic deterioration are neglected. A leaning column carrying gravity loads is linked to the frame to simulate P-Delta effects. +The files needed to analyze this structure in OpenSees are included here: +The main file: MRF_2Story_Concentrated.tcl (last update: 10 Oct 2013) Supporting procedure files +RotSpring2DModIKModel.tcl - creates a bilinear rotational spring that follows the Modified Ibarra Krawinkler Deterioration Model (used in the concentrated model) RotLeaningCol.tcl - creates a low-stiffness rotational spring used in a leaning column The acceleration history for the Canoga Park record +NR94cnp.tcl - contains acceleration history in units of g All files are available in a compressed format here: dynamic_example_10Oct2013.zip (last update: 10 Oct 2013) +The rest of this example describes the model and shows the analysis results. +Model Description Figure 1. Schematic representation of concentrated plasticity OpenSees model with element number labels and [node number] labels. Note: The springs are zeroLength elements, but their sizes are greatly exaggerated in this figure for clarity. The 2-story, 1-bay steel moment resisting frame is modeled with elastic beam-column elements connected by ZeroLength elements which serve as rotational springs to represent the structure’s nonlinear behavior. The springs follow a bilinear hysteretic response based on the Modified Ibarra Krawinkler Deterioration Model. A leaning column with gravity loads is linked to the frame by truss elements to simulate P-Delta effects. An idealized schematic of the model is presented in Figure 1. +To simplify this model, panel zone contributions are neglected, plastic hinges form at the beam-column joints, and centerline dimensions are used. For an example that explicitly models the panel zone shear distortions and includes reduced beam sections (RBS), see Pushover and Dynamic Analyses of 2-Story Moment Frame with Panel Zones and RBS. +For a detailed description of this model, see Pushover Analysis of 2-Story Moment Frame. The units of the model are kips, inches, and seconds. +Damping and the Rayleigh Command This model uses Rayleigh damping which formulates the damping matrix as a linear combination of the mass matrix and stiffness matrix: c = a0m + a1k, where a0 is the mass proportional damping coefficient and a1 is the stiffness proportional damping coefficient. A damping ratio of 2%, which is a typical value for steel buildings, is assigned to the first two modes of the structure. The rayleigh command allows the user to specify whether the initial, current, or last committed stiffness matrix is used in the damping matrix formulation. In this example, only the initial stiffness matrix is used, which is accomplished by assigning values of 0.0 to the other stiffness matrix coefficients. +To properly model the structure, stiffness proportional damping is applied only to the frame elements and not to the highly rigid truss elements that link the frame and leaning column, nor to the leaning column itself. OpenSees does not apply stiffness proportional damping to zeroLength elements. In order to apply damping to only certain elements, the rayleigh command is used in combination with the region command. As noted in the region command documentation, the region cannot be defined by BOTH elements and nodes. Because mass proportional damping assigns damping to nodes with mass, OpenSees will ignore any mass proportional damping that is assigned using the rayleigh command in combination with the region command for a region of elements. Therefore, if using the region command to assign damping, the mass proportional damping and stiffness proportional damping must be assigned in separate steps. +Modifications to the Stiffness Proportional Damping Coefficient As described in the “Stiffness Modifications to Elastic Frame Elements” section of Pushover Analysis of 2-Story Moment Frame, the stiffness of the elastic frame elements has been modified. As explained in Ibarra and Krawinkler (2005) and Zareian and Medina (2010), the stiffness proportional damping coefficient that is used with these elements must also be modified. As the stiffness of the elastic elements was made “(n+1)/n” times greater than the stiffness of the actual frame member, the stiffness proportional damping coefficient of these elements must also be made “(n+1)/n” times greater than the traditional stiffness proportional damping coefficient. +Dynamic Analysis Recorders The recorders used in this example include: +The drift recorder to track the story and roof drift histories The node recorder to track the floor displacement and base shear reaction histories The element recorder to track the element forces in the first story columns as well as the moment and rotation histories of the springs in the concentrated plasticity model For the element recorder, the region command was used to assign all column springs to one group and all beam springs to a separate group. +It is important to note that the recorders only record information for analyze commands that are called after the recorder commands are called. In this example, the recorders are placed after the gravity analysis so that the steps of the gravity analysis do not appear in the output files. +Analysis The structure is analyzed under gravity loads before the dynamic analysis is conducted. The gravity loads are applied using a load-controlled static analysis with 10 steps. So that the gravity loads remain on the structure for all subsequent analyses, the loadConst command is used after the gravity analysis is completed. This command is also used to reset the time to zero so that the dynamic analysis starts from time zero. +For the dynamic analysis, the structure is subjected to the Canoga Park record from the 1994 Northridge earthquake. To apply the ground motion to the structure, the uniform excitation pattern is used. The name of the file containing the acceleration record, timestep of the ground motion, scale factor applied to the ground motion, and the direction in which the motion is to be applied must all be specified as part of the uniform excitation pattern command. +To execute the dynamic analysis, the analyze command is used with the specified number of analysis steps and the timestep of the analysis. The timestep used in the analysis should be less than or equal to the timestep of the input ground motion. +Results Figure 2. Floor Displacement History The floor displacement histories from the dynamic analysis are shown in Figure 2. The top graph shows the ground acceleration history while the middle and bottom graphs show the displacement time histories of the 3rd floor (roof) and 2nd floor, respectively. +References Ibarra, L. F., and Krawinkler, H. (2005). “Global collapse of frame structures under seismic excitations,” Technical Report 152, The John A. Blume Earthquake Engineering Research Center, Department of Civil Engineering, Stanford University, Stanford, CA. [electronic version: https://blume.stanford.edu/tech_reports] Ibarra, L. F., Medina, R. A., and Krawinkler, H. (2005). “Hysteretic models that incorporate strength and stiffness deterioration,” Earthquake Engineering and Structural Dynamics, Vol. 34, 12, pp. 1489-1511. Lignos, D. G., and Krawinkler, H. (2009). “Sidesway Collapse of Deteriorating Structural Systems under Seismic Excitations,” Technical Report 172, The John A. Blume Earthquake Engineering Research Center, Department of Civil Engineering, Stanford University, Stanford, CA. Lignos, D. G., and Krawinkler, H. (2011). “Deterioration Modeling of Steel Beams and Columns in Support to Collapse Prediction of Steel Moment Frames,” ASCE, Journal of Structural Engineering, Vol. 137 (11), 1291-1302. Zareian, F. and Medina, R. A. (2010). “A practical method for proper modeling of structural damping in inelastic plane structural systems,” Computers & Structures, Vol. 88, 1-2, pp. 45-53. Example posted by: Laura Eads, Stanford University; Modified: Filipe Ribeiro, Andre Barbosa (09/03/2013)`}).add({id:14,tag:"en",href:"/opensees-gallery/examples/example7/",title:"Dynamic Shell Analysis",description:"Transient analysis of a shell model.",content:`In this example a simple problem in shell dynamics is considered. The structure is a curved hoop shell structure that looks like the roof of a Safeway. +Example7.tcl Example7.py Renderings are created from the script render.py, which uses the sees  Python package. +Modeling   For shell analysis, a typical shell element is defined as a surface in three dimensional space. Each node of a shell analysis has six degrees of freedom, three displacements and three rotations. Thus the model is defined with ndm=3ndm = 3 and ndf=6ndf = 6 . +For this model, a mesh is generated using the block2D command. The number of nodes in the local x-direction of the block is nx and the number of nodes in the local y-direction of the block is ny. The block2D generates nodes with tags 1,2,3,4, 5,7,9 such that the structure is curved in space. +Tcl Python(RT) # generate the nodes and elements block2D $nx $ny 1 1 $element $eleArgs 1 -20 0 0 2 -20 0 40 3 20 0 40 4 20 0 0 5 -10 10 20 7 10 10 20 9 0 10 20 # generate the surface nodes and elements surface = model.surface((nx, ny), element="ShellMITC4", args=(1,), points= 1: [-20.0, 0.0, 0.0], 2: [-20.0, 0.0, 40.0], 3: [ 20.0, 0.0, 40.0], 4: [ 20.0, 0.0, 0.0], 5: [-10.0, 10.0, 20.0], 7: [ 10.0, 10.0, 20.0], 9: [ 0.0, 10.0, 20.0] ) The shell element is constructed using the ShellMITC4 formulation. An elastic membrane-plate material section model, appropriate for shell analysis, is constructed using the section command and the "ElasticMembranePlateSection" formulation. In this case, the elastic modulus E=3.0e3E = 3.0e3 , Poisson’s ratio ν=0.25\\nu = 0.25 , the thickness h=1.175h = 1.175 and the mass density per unit volume ρ=1.27\\rho = 1.27 Boundary conditions are applied using the fixZ command. In this case, all the nodes whose zz -coordiate is 0.00.0 have the boundary condition 1,1,1, 0,1,1: all degrees-of-freedom are fixed except rotation about the x-axis, which is free. The same boundary conditions are applied where the zz -coordinate is 40.040.0 . +A solution algorithm of type Newton is used for the problem. The solution algorithm uses a ConvergenceTest which tests convergence on the norm of the energy increment vector. Five static load steps are performed. +For initial gravity load analysis, a single load pattern with a linear time series and three vertical nodal loads are used. A scaled rendering of the deformed shape under gravity loading is shown below: +Dynamic Analysis   After the static analysis, the wipeAnalysis and remove loadPatern commands are used to remove the nodal loads and create a new analysis. The nodal displacements have not changed. However, with the external loads removed the structure is no longer in static equilibrium. +The integrator for the dynamic analysis if of type GeneralizedMidpoint with α=0.5\\alpha = 0.5 . This choice is uconditionally stable and energy conserving for linear problems. Additionally, this integrator conserves linear and angular momentum for both linear and non-linear problems. The dynamic analysis is performed using 250250 time increments with a time step Δt=0.50\\Delta t = 0.50 . +The results consist of the file Node.out, which contains a line for every time step. Each line contains the time and the vertical displacement at the upper center of the hoop structure. The time history is shown in the figure below. +`}).add({id:15,tag:"en",href:"/opensees-gallery/examples/example1/",title:"Example 1: Linear Truss",description:"A finite element model of a simple truss is created, and static analysis is performed.",content:` This example is of a linear-elastic three bar truss, as shown in the figure above, subject to static loads. The purpose of this example is to develop the basic requirements for performing finite element analysis with OpenSees. This includes the definition of nodes, materials, elements, loads and constraints. +Scripts for this example can be downloaded for either Python or Tcl: +Example1.py Example1.tcl Model   We begin the simulation by creating a Model, which will manage the nodes, elements, loading and state. This is done through either Python or Tcl as follows: +Tcl Python(RT) model -ndm 2 -ndf 2 import opensees.openseespy as ops model = ops.Model(ndm=2, ndf=2) where we’ve specified 2 for the spatial dimension ndm, and 2 for the number of degrees of freedom ndf. +Next we define the four nodes of the structural model by specifying a tag which identifies the node, and coordinates in the x−yx-y plane. In general, the node constructor must be passed ndm coordinates. +Tcl Python(RT) # Create nodes & add to domain # tag X Y node 1 0.0 0.0; node 2 144.0 0.0; node 3 168.0 0.0; node 4 72.0 96.0; # Create nodes # tag X Y model.node(1, 0.0, 0.0) model.node(2, 144.0, 0.0) model.node(3, 168.0, 0.0) model.node(4, 72.0, 96.0) The restraints at the nodes with reactions (ie, nodes 1, 2, and 3) are then defined. +Tcl Python(RT) # Set the boundary conditions # tag X Y fix 1 1 1; fix 2 1 1; fix 3 1 1; # set the boundary conditions # nodeID xRestrnt? yRestrnt? model.fix(1, 1, 1) model.fix(2, 1, 1) model.fix(3, 1, 1) Since the truss elements have the same elastic material, a single Elastic material object is created. The first argument assigns the tag 1 to the material, and the second specifies a Young’s modulus of 3000. +Tcl Python(RT) # Create Elastic material prototype uniaxialMaterial Elastic 1 3000; # Create Elastic material prototype model.uniaxialMaterial("Elastic", 1, 3000) Finally, define the elements. The syntax for creating the truss element requires the following arguments: +the element name, in this case always "Truss", the element tag, in this case 1 through 3, the nodes that the element is connected to, the cross-sectional area, in this case 10.0 for element 1 and 5.0 for elements 2 and 3. the tag of the material assigned to the element, in this case always 1 Tcl Python(RT) element Truss 1 1 4 10.0 1; element Truss 2 2 4 5.0 1; element Truss 3 3 4 5.0 1; # Type tag nodes Area material model.element("Truss", 1, (1, 4), 10.0, 1 ) model.element("Truss", 2, (2, 4), 5.0, 1 ) model.element("Truss", 3, (3, 4), 5.0, 1 ) Loads   The final step before we can configure and run the analysis is to define some loading. In this case we have two point loads at the apex of the truss (node 4). In OpenSees, loads are assigned to load patterns, which define how loads are scaled with each load step. In Python, the simplest way to represent a nodal load is by a dictionary with node numbers as keys, and corresponding load vector as values. For the problem at hand, we want to apply a load to node 4 with 100 units in the xx direction, and -50 units in the yy direction; the corresponding definition is: Tcl Python(RT) set loads 4 100 -50 loads = 4: [100, -50] We then add a "Plain" load pattern to the model with these loads, and use the "Linear" option to specify that it should be increased linearly with each new load step. Tcl Python(RT) pattern Plain 1 "Linear" "load $loads" model.pattern("Plain", 1, "Linear", load=loads) Note that it is common to define the load data structure inside the call to the pattern function. This looks like: +Tcl Python(RT) pattern Plain 1 "Linear" load 4 100 -50 model.pattern("Plain", 1, "Linear", load= 4: [100, -50] ) Analysis   Next we configure that analysis procedure. The model is linear, so we use a solution Algorithm of type Linear. +Tcl Python(RT) algorithm Linear; model.algorithm("Linear") Even though the solution is linear, we have to select a procedure for applying the load, which is called an Integrator. For this problem, a LoadControl integrator is selected, which advances the solution by incrementing the applied loads by a factor of 1.0 each time the analyze command is called. +Tcl Python(RT) integrator LoadControl 1.0; model.integrator("LoadControl", 1.0) The equations are formed using a banded system, so the System is BandSPD (banded, symmetric positive definite). This is a good choice for most moderate size models. The equations have to be numbered, so typically an RCM numberer object is used (for Reverse Cuthill-McKee). The constraints are most easily represented with a Plain constraint handler. +Once all the components of an analysis are defined, the Analysis itself is defined. For this problem a Static analysis is used. +Tcl Python(RT) analysis Static; model.analysis("Static") Finally, one analysis step is performed by invoking analyze: Tcl Python(RT) analyze 1 model.analyze(1) When the analysis is complete the state of node 4 and all three elements may be printed to the screen: +Tcl Python(RT) print node 4 print ele model.print(node=4) model.print("ele") Node: 4 Coordinates : 72 96 commitDisps: 0.530093 -0.177894 unbalanced Load: 100 -50 Element: 1 type: Truss iNode: 1 jNode: 4 Area: 10 Total Mass: 0 strain: 0.00146451 axial load: 43.9352 unbalanced load: -26.3611 -35.1482 26.3611 35.1482 Material: Elastic tag: 1 E: 3000 eta: 0 Element: 2 type: Truss iNode: 2 jNode: 4 Area: 5 Total Mass: 0 strain: -0.00383642 axial load: -57.5463 unbalanced load: -34.5278 46.0371 34.5278 -46.0371 Material: Elastic tag: 1 E: 3000 eta: 0 Element: 3 type: Truss iNode: 3 jNode: 4 Area: 5 Total Mass: 0 strain: -0.00368743 axial load: -55.3114 unbalanced load: -39.1111 39.1111 39.1111 -39.1111 Material: Elastic tag: 1 E: 3000 eta: 0For the node, displacements and loads are given. For the truss elements, the axial strain and force are provided along with the resisting forces in the global coordinate system. +The file example.out, specified in the recorder command, provides the nodal displacements for the xx and yy directions of node 4. The file consists of a single line: +1.0 0.530093 -0.177894 The 1.01.0 corresponds to the load factor (pseudo time) in the model at which point the recorder was invoked. The 0.5300930.530093 and −0.177894-0.177894 correspond to the response at node 4 for the 1 and 2 degree-of-freedom. Note that if more analysis steps had been performed, the line would contain a line for every analysis step that completed successfully.`}).add({id:16,tag:"en",href:"/opensees-gallery/examples/example4/",title:"Example 4: Multibay Two Story Frame",description:"A multi-bay reinforced concrete frame is investigated.",content:`Example 4.1   This example is of a reinforced concrete multibay two story frame, as shown in Figure 1, subject to gravity loads. The files for this example are: Python Tcl <a href="Example4.py"><code>Example4.py</code></a></li> <a href="Example4.tcl"><code>Example4.tcl</code></a></li> A model of the frame shown in Figure 1 is created. The number of objects in the model is dependent on the parameter numBay. The (numBay + 1)*3 nodes are created, one column line at a time, with the node at the base of the columns fixed in all directions. Three materials are constructed, one for the concrete core, one for the concrete cover and one for the reinforcement steel. Three fiber discretized sections are then built, one for the exterior columns, one for the interior columns and one for the girders. Each of the members in the frame is modelled using nonlinear beam-column elements with 4 (nP) integration points and a linear geometric transformation object. + For gravity loads, a single load pattern with a linear time series and two vertical nodal loads acting at the first and second floor nodes of each column line is used. The load at the lower level is twice that of the upper level and the load on the interior columns is twice that of the exterior columns. +For the lateral load analysis, a second load pattern with a linear time series is introduced after the gravity load analysis. Associated with this load pattern are two nodal loads acting on nodes 2 and 3, with the load level at node 3 twice that acting at node 2. +The integrator for the analysis will be LoadControl with a load step increment of 0.1. The constraints are enforced with a Plain constraint handler. +Once the components of the analysis have been defined, the analysis object is then created. For this problem a Static analysis is used and 10 steps are performed to load the model with the desired gravity load. +After the gravity load analysis has been performed, the gravity loads are set to constant and the time in the domain is reset to 0.0. A new LoadControl integrator is now added. The new LoadControl integrator has an initial load step of 1.0, but this can vary between 0.02 and 2.0 depending on the number of iterations required to achieve convergence at each load step. 100 steps are then performed. +The output consists of the file Node41.out containing a line for each step of the lateral load analysis. Each line contains the load factor, the lateral displacements at nodes 2 and 3. A plot of the load-displacement curve for the frame is given in Figure 2. +`}).add({id:17,tag:"en",href:"/opensees-gallery/docs/library/frame/",title:"Frame",description:"Frame elements.",content:""}).add({id:18,tag:"en",href:"/opensees-gallery/examples/example5/",title:"Frame with Diaphragms",description:"A three-dimensional reinforced concrete rigid frame, is subjected to bi-directional earthquake ground motion.",content:`A three-dimensional reinforced concrete rigid frame, is subjected to bi-directional earthquake ground motion. +Example5.tcl RCsection.tcl Or for Python: +Example5.py render.py In both cases, the following ground motion records are required: +tabasFN.txt tabasFP.txt Modeling   A model of the rigid frame shown in the figure below is created. The model consists of three stories and one bay in each direction. Rigid diaphragm multi-point constraints are used to enforce the rigid in-plane stiffness assumption for the floors. Gravity loads are applied to the structure and the 1978 Tabas acceleration records are the uniform earthquake excitations. +Nonlinear beam column elements are used for all members in the structure. The beam sections are elastic while the column sections are discretized by fibers of concrete and steel. Elastic beam column elements may have been used for the beam members; but, it is useful to see that section models other than fiber sections may be used in the nonlinear beam column element. + Analysis   A solution Algorithm of type Newton is used for the nonlinear problem. The solution algorithm uses a ConvergenceTest which tests convergence on the norm of the energy increment vector. The integrator for this analysis will be of type Newmark with a γ\\gamma of 0.25 and a β\\beta of 0.5. Due to the presence of the multi-point constraints, a Transformation constraint handler is used. +Once all the components of an analysis are defined, the Analysis itself is defined. For this problem a Transient analysis is used. 2000 steps are performed with a time step of 0.01. +Post-Processing   The nodal displacements at nodes 9, 14, and 19 (the retained nodes for the rigid diaphragms) will be stored in the file node51.out for post-processing. +The results consist of the file node.out, which contains a line for every time step. Each line contains the time and the horizontal and vertical displacements at the diaphragm retained nodes (9, 14 and 19) i.e. time Dx9 Dy9 Dx14 Dy14 Dx19 Dy19. The horizontal displacement time history of the first floor diaphragm node 9 is shown in the figure below. Notice the increase in period after about 10 seconds of earthquake excitation, when the large pulse in the ground motion propogates through the structure. The displacement profile over the three stories shows a soft-story mechanism has formed in the first floor columns. The numerical solution converges even though the drift is ≈20%\\approx 20 \\% . The inclusion of P−ΔP-\\Delta effects shows structural collapse under such large drifts. +`}).add({id:19,tag:"en",href:"/opensees-gallery/examples/viscousdamper/",title:"Frame with Viscous Dampers",description:"This example demonstrates how to use the viscous damper material within a simple single story shear frame.",content:`This example demonstrates how to use the viscous damper material within a simple single story shear frame. +The files needed to analyze this structure in OpenSees are included here: +The main file: Supporting files +TakY.th - uses the JR Takatori record from the Kobe 1995 earthquake (available in the zip file below) All files are available in a compressed format here: Viscous_Damper_Example.zip +The rest of this example describes the model and shows the analysis results. +Model Description   Figure 1. Schematic representation of a viscous damper installed in the single story moment resisting frame. The viscous damper is modeled with a Two Node Link Element. This element follows a Viscous damper hysteretic response. An idealized schematic of the model is presented in Figure 1. +The units of the model are mm, kN, and seconds. +Basic Geometry   The single bay single story frame shown in Figure 1 has 5000mm bay width and 3000mm story height (centerline). The period of the system is 0.7sec. Columns and beams of the frame are modeled with elastic beam-column elements. +Damper Links   A Two Node Link Element is used to link the two nodes that define the geometry of the viscous damper. +Constraints   the Nodes at the base of the frame are fixed. The beam (element 3 in Figure 1) is considered to be rigid. +Viscous Damper Material   To model the viscous damper the ViscousDamper is used. The input parameters that are selected for the damper example are as follows: Axial Stiffness K = 25 kN/mm, Damping Coefficient Cd=20.74 kN(s/mm)<sup>0.35</sup> and exponent a=0.35. +Loading   The single story frame with viscous damper is subjected to the 50% JR Takatori record from the Kobe 1995 earthquake in Japan. +Recorders   The recorders used in this example include: +The Element recorder to track the damper axial force and axial displacement. The Node recorder to track the Frame displacement history at its roof. Analysis   A uniform excitation option is selected with application of ground acceleration history as the imposed motion. The Newmark integration scheme is selected for integration of the equations of motion with a time step dt = 0.001sec. Two percent mass proportional damping is used. +Results   Simulation Results for the 50% JR Takatori Record   Figure 2. Displacement history at the roof of the single story MRF The force - displacement relationship from the viscous damper are shown in Figure 3. A comparison with results from a SAP2000 model is also shown in Figure 3. Results are nearly identical between the two models. Figure 3. Force - displacement relationship of the viscous damper and comparison with identical model in SAP2000 Example posted by: Sarven Akcelyan  and Prof. Dimitrios G. Lignos  (McGill University)`}).add({id:20,tag:"en",href:"/opensees-gallery/docs/advanced-settings/icons/",title:"Icons",description:"Configure secure access to icons from Bootstrap and Font Awesome.",content:""}).add({id:21,tag:"en",href:"/opensees-gallery/examples/cantilevertransient/",title:"Inelastic Cantilever",description:"A plane cantilever column is shaken by an earthquake. Material nonlinearity is accounted for using the force formulation and fiber-discretized cross sections",content:`In order to execute this notebook, go to the menu bar and click Run/Run all cells. You can also run individual cells by selecting the cell (a blue bar will appear to the left of the active cell, then pressing Shift+Enter. +NOTE Before running this notebook, you must install the external dependencies. To to this, uncomment the following cell by removing the leading # character, execute the cell, then put the # character back to prevent it from running again, thereby “commenting it out”. Once everything is installed you may re-run the commented-out cell to hide the text generated by the installation. +# !pip install -Ur requirements.txt# Linear algebra library import numpy as np # Plotting library import matplotlib.pyplot as plt # The next two lines set reasonable plot style defaults import scienceplots plt.style.use('science')## Configure units # Units are based on inch-kip-seconds import opensees.units.iks as units pi = units.pi; ft = units.ft; ksi = units.ksi; inch = units.inch;## Distributed Inelasticity 2d Beam-Column Element # fiber sectionSet up basic model geometry +# import the openseespy interface which contains the "Model" class import opensees.openseespy as ops# generate Model data structure model = ops.Model(ndm=2, ndf=3) # Length of cantilever column L = 8*ft; # specify node coordinates model.node(1, 0, 0 ); # first node model.node(2, 0, L ); # second node # boundary conditions model.fix(1, 1, 1, 1 ) ## specify mass model.mass(2, 2.0, 1e-8, 1e-8)## Element name: 2d nonlinear frame element with distributed inelasticity # Create material and add to Model mat_tag = 1 # identifier that will be assigned to the new material E = 29000*ksi fy = 60*ksi Hkin = 0 Hiso = 0 model.uniaxialMaterial("Steel01", mat_tag, fy, E, 0.01) # model.uniaxialMaterial("ElasticPP", mat_tag, E, fy/E) # model.uniaxialMaterial("UniaxialJ2Plasticity", mat_tag, E, fy, Hkin, Hiso) Create a section   import opensees.section # Load cross section geometry and add to Model sec_tag = 1 # identifier that will be assigned to the new section SecData = SecData["nft"] = 4 # no of layers in flange SecData["nwl"] = 8 # no of layers in web SecData["IntTyp"] = "Midpoint"; SecData["FlgOpt"] = True section = opensees.section.from_aisc("Fiber", "W24x131", # "W14x426", sec_tag, tag=mat_tag, mesh=SecData, ndm=2, units=units)import sees.section sees.section.render(section);Output: +<Figure size 350x262.5 with 1 Axes>Printing the fiber section will display the effective cross-sectional properties which result from quadrature over the cross section fibers: +print(section)Output: +SectionGeometry area: 38.42890000000003 ixc: 4013.509824163335 iyc: 343.8869259102087 Create an element   cmd = opensees.tcl.dumps(section, skip_int_refs=True) model.eval(cmd) # Create element integration scheme nIP = 4 int_tag = 1 model.beamIntegration("Lobatto", int_tag, sec_tag, nIP) # Create element geometric transformation model.geomTransf("Linear", 1) # Finally, create the element # CONN Geom Int model.element("ForceBeamColumn", 1, (1, 2), 1, int_tag) Analysis   Eigenvalue Analysis   # State = Initialize_State (Model,ElemData) # State = Structure('stif',Model,ElemData,State) # Initialize the analysis state for transient analysis model.analysis("Transient") # Form stiffness and mass matrices Kf = model.getTangent(k=1.0) # free DOF stiffness matrix Kf for initial State Mf = model.getTangent(m=1.0) # free DOF mass matrix Ml print("Kf:", Kf, sep="\\n") print("Mf:", Mf, sep="\\n")Output: +Kf: [[ 1.57505061e+03 0.00000000e+00 7.56024291e+04] [ 0.00000000e+00 1.16087302e+04 -1.21265960e-12] [ 7.56024291e+04 -1.21265960e-12 4.83855547e+06]] Mf: [[2.e+00 0.e+00 0.e+00] [0.e+00 1.e-08 0.e+00] [0.e+00 0.e+00 1.e-08]]Solve dynamic eigenvalue problem with scipy function eig +import scipy.linalg omega,Ueig = scipy.linalg.eig(Kf,Mf) # echo eigenmode periods print(' The three lowest eigenmode periods are') T = 2*pi/np.sqrt(omega) print(T)Output: +The three lowest eigenmode periods are [4.47793313e-01+0.j 2.85641961e-07+0.j 5.83159707e-06+0.j]In general the eigen function should be used, which takes advantage of sparsity in the system +for w in model.eigen(2): print(2*pi/np.sqrt(w))Output: +0.44779331340120765 5.8315970735940395e-06 Configure ground motion   # Apply damping in the first mode zeta = 0.02 model.modalDamping(zeta) # alphaM, betaK = 0.01, 0.01 # model.rayleigh(alphaM, betaK, 0, 0) # State = Add_Damping2State('Modal',Model,State,zeta)# Deltat = 0.02 # AccHst = np.loadtxt("tabasFN.txt") import quakeio Event = quakeio.read("TAK000.AT2") AccHst = Event.data Deltat = Event["time_step"]load_tag = 1 model.timeSeries('Path', load_tag, dt=Deltat, factor=1.0, values=units.gravity*AccHst) model.pattern('UniformExcitation', 1, 1, accel=load_tag) Configure integration method   ## initialize data for solution strategy # gam bet model.integrator("Newmark", 1/2, 1/4, form="d") Perform integration   nt = len(AccHst) Uplt = np.zeros(nt) Vplt = np.zeros(nt) Aplt = np.zeros(nt) Pplt = np.zeros(nt) # Defo = zeros(np,1) # Forc = zeros(np,1) for k in range(nt): if model.analyze(1, Deltat) != 0: print("Analysis failed") break # extract values for plotting from response history Uplt[k] = model.nodeDisp (2, 1) Vplt[k] = model.nodeVel (2, 1) Aplt[k] = model.nodeAccel(2, 1) # Pplt[k] = Post[k].Pr[Pdof,:]; # Defo(k) = Post(k).Elem1.v; # Forc(k) = Post(k).Elem1.q; Post-processing   Displacement History   t = np.arange(nt)*Deltat; Xp = t Yp = (Uplt/L)*100 FigHndl, AxHndl = plt.subplots() AxHndl.set_xlabel('Time (sec)') AxHndl.set_ylabel('Drift in X (\\\\%)') AxHndl.plot(Xp,Yp,'b') FigHndl.savefig("drift.png")Output: +<Figure size 350x262.5 with 1 Axes> Shear force-displacement history   Xp = (Uplt/L)*100 Yp = Pplt FigHndl, AxHndl = plt.subplots() AxHndl.set_xlabel('Lateral Drift (\\#)') AxHndl.set_ylabel('Lateral Force $P$') AxHndl.plot(Xp, Yp, 'b') plt.show()Output: +<Figure size 350x262.5 with 1 Axes>`}).add({id:22,tag:"en",href:"/opensees-gallery/examples/example3/",title:"Inelastic Plane Frame",description:"Nonlinear analysis of a concrete portal frame.",content:` This set of examples investigates the nonlinear analysis of a reinforced concrete frame. The nonlinear beam column element with a fiber discretization of the cross section is used in the model. The files for this example are: Python Tcl <a href="portal.py"><code>portal.py</code></a></p> <a href="portal.tcl"><code>portal.tcl</code></a></p> These files define the following functions: +Function Description create_portal Creates a model of a portal frame gravity_analysis Performs a gravity analysis on a model pushover_analysis Performs a pushover analysis on a model transient_analysis Performs a transient analysis on a model create_portal   The function create_portal creates a model representing the portal frame in the figure above. The model consists of four nodes, two nonlinear beam-column elements modeling the columns and an elastic beam element to model the girder. For the column elements a section, identical to the section used in Example 2, is created using steel and concrete fibers. +Begin with nodes and boundary conditions Python Tcl # create ModelBuilder (with two-dimensions and 3 DOF/node) model = ops.Model(ndm=2, ndf=3) # Create nodes # ------------ # create nodes & add to Domain - command: node nodeId xCrd yCrd model.node(1, 0.0, 0.0) model.node(2, width, 0.0) model.node(3, 0.0, height) model.node(4, width, height) # set the boundary conditions - command: fix nodeID uxRestrnt? uyRestrnt? rzRestrnt? model.fix(1, 1, 1, 1) model.fix(2, 1, 1, 1) set width 360 set height 144 model basic -ndm 2 -ndf 3 # Create nodes # tag X Y node 1 0.0 0.0 node 2 $width 0.0 node 3 0.0 $height node 4 $width $height # Fix supports at base of columns # tag DX DY RZ fix 1 1 1 1 fix 2 1 1 1 Next define the materials +Python Tcl # Define materials for nonlinear columns # ------------------------------------------ # CONCRETE tag f'c ec0 f'cu ecu # Core concrete (confined) model.uniaxialMaterial("Concrete01", 1, -6.0, -0.004, -5.0, -0.014) # Cover concrete (unconfined) model.uniaxialMaterial("Concrete01", 2, -5.0, -0.002, -0.0, -0.006) # STEEL # Reinforcing steel fy = 60.0; # Yield stress E = 30000.0; # Young's modulus # tag fy E b model.uniaxialMaterial("Steel01", 3, fy, E, 0.01) # Define materials for nonlinear columns # ------------------------------------------ # CONCRETE tag f'c ec0 f'cu ecu # Core concrete (confined) uniaxialMaterial Concrete01 1 -6.0 -0.004 -5.0 -0.014 # Cover concrete (unconfined) uniaxialMaterial Concrete01 2 -5.0 -0.002 0.0 -0.006 # STEEL # Reinforcing steel set fy 60.0; # Yield stress set E 30000.0; # Young's modulus # tag fy E0 b uniaxialMaterial Steel01 3 $fy $E 0.01 Define a cross section for the columns Python Tcl # Define cross-section for nonlinear columns # ------------------------------------------ # set some parameters colWidth = 15.0 colDepth = 24.0 cover = 1.5 As = 0.6 # area of no. 7 bars # some variables derived from the parameters y1 = colDepth/2.0 z1 = colWidth/2.0 model.section("Fiber", 1) # Add the concrete core fibers model.patch("rect", 1, 10, 1, cover-y1, cover-z1, y1-cover, z1-cover, section=1) # Add the concrete cover fibers (top, bottom, left, right) model.patch("rect", 2, 10, 1, -y1, z1-cover, y1, z1, section=1) model.patch("rect", 2, 10, 1, -y1, -z1, y1, cover-z1, section=1) model.patch("rect", 2, 2, 1, -y1, cover-z1, cover-y1, z1-cover, section=1) model.patch("rect", 2, 2, 1, y1-cover, cover-z1, y1, z1-cover, section=1) # Add the reinforcing fibers (left, middle, right, section=1) model.layer("straight", 3, 3, As, y1-cover, z1-cover, y1-cover, cover-z1, section=1) model.layer("straight", 3, 2, As, 0.0, z1-cover, 0.0, cover-z1, section=1) model.layer("straight", 3, 3, As, cover-y1, z1-cover, cover-y1, cover-z1, section=1) # Define cross-section for nonlinear columns # ------------------------------------------ # set some parameters set colWidth 15 set colDepth 24 set cover 1.5 set As 0.60; # area of no. 7 bars # some variables derived from the parameters set y1 [expr $colDepth/2.0] set z1 [expr $colWidth/2.0] section Fiber 1 # Add the concrete core fibers patch rect 1 10 1 [expr $cover-$y1] [expr $cover-$z1] [expr $y1-$cover] [expr $z1-$cover] # Add the concrete cover fibers (top, bottom, left, right) patch rect 2 10 1 [expr -$y1] [expr $z1-$cover] $y1 $z1 patch rect 2 10 1 [expr -$y1] [expr -$z1] $y1 [expr $cover-$z1] patch rect 2 2 1 [expr -$y1] [expr $cover-$z1] [expr $cover-$y1] [expr $z1-$cover] patch rect 2 2 1 [expr $y1-$cover] [expr $cover-$z1] $y1 [expr $z1-$cover] # Add the reinforcing fibers (left, middle, right) layer straight 3 3 $As [expr $y1-$cover] [expr $z1-$cover] [expr $y1-$cover] [expr $cover-$z1] layer straight 3 2 $As 0.0 [expr $z1-$cover] 0.0 [expr $cover-$z1] layer straight 3 3 $As [expr $cover-$y1] [expr $z1-$cover] [expr $cover-$y1] [expr $cover-$z1] gravity_analysis   We now implement a function called gravity_analysis which takes the instance of Model returned by create_portal, and proceeds to impose gravity loads and perform a static analysis. Its use will look like: +Python Tcl # Create the model model = create_portal() # perform analysis under gravity loads status = gravity_analysis(model) create_portal; gravity_analysis; A single load pattern with a linear time series is created with two vertical nodal loads acting at nodes 3 and 4: +Python Tcl model.pattern("Plain", 1, "Linear", loads= # nodeID xForce yForce zMoment 3: [ 0.0, -P, 0.0], 4: [ 0.0, -P, 0.0] ) The model contains material non-linearities, so a solution algorithm of type Newton is used. The solution algorithm uses a ConvergenceTest which tests convergence of the equilibrium solution with the norm of the displacement increment vector. For this nonlinear problem, the gravity loads are applied incrementally until the full load is applied. To achieve this, a LoadControl integrator which advances the solution with an increment of 0.1 at each load step is used. The equations are formed using a banded storage scheme, so the System is BandGeneral. The equations are numbered using an RCM (reverse Cuthill-McKee) numberer. The constraints are enforced with a Plain constraint handler. +Once all the components of an analysis are defined, the Analysis object itself is created. For this problem a Static Analysis object is used. To achieve the full gravity load, 10 load steps are performed. +At end of analysis, the state at nodes 3 and 4 is output. The state of element 1 is also output. +For the two nodes, displacements and loads are given. For the beam-column elements, the element end forces in the local system are provided. +The nodeGravity.out file contains ten lines, each line containing 7 entries. The first entry is time in the domain at end of the load step. The next 3 entries are the displacements at node 3, and the final 3 entries the displacements at node 4. +pushover_analysis   In this example the nonlinear reinforced concrete portal frame which has undergone the gravity load analysis of Example 3.1 is now subjected to a pushover analysis. +After performing the gravity load analysis on the model, the time in the domain is reset to 0.0 and the current value of all loads acting are held constant. A new load pattern with a linear time series and horizontal loads acting at nodes 3 and 4 is then added to the model. +The static analysis used to perform the gravity load analysis is modified to take a new DisplacementControl integrator. At each new step in the analysis the integrator will determine the load increment necessary to increment the horizontal displacement at node 3 by 0.1 in. 60 analysis steps are performed in this new analysis. +For this analysis the nodal displacements at nodes 3 and 4 will be stored in the file nodePushover.out for post-processing. In addition, the end forces in the local coordinate system for elements 1 and 2 will be stored in the file elePushover.out. At the end of the analysis, the state of node 3 is printed to the screen. +In addition to what is displayed on the screen, the file node32.out and ele32.out have been created by the script. Each line of node32.out contains the time, DX, DY and RZ for node 3 and DX, DY and RZ for node 4 at the end of an iteration. Each line of eleForce.out contains the time, and the element end forces in the local coordinate system. A plot of the load-displacement relationship at node 3 is shown in the figure below. + transient_analysis   The concrete frame which has undergone the gravity load analysis of Example 3.1 is now subjected to a uniform earthquake excitation. +After performing the gravity load analysis, the time in the domain is reset to 0.0 and the time series for all active loads is set to constant. This prevents the gravity load from being scaled with each step of the dynamic analysis. +Python Tcl model.loadConst(time=0.0) loadConst -time 0.0 Mass terms are added to nodes 3 and 4. A new uniform excitation load pattern is created. The excitation acts in the horizontal direction and reads the acceleration record and time interval from the file ARL360.g3. The file ARL360.g3 is created from the PEER Strong Motion Database ( http://peer.berkeley.edu/smcat/  ) record ARL360.at2 using the Tcl procedure ReadSMDFile contained in the file ReadSMDFile.tcl. +The static analysis object and its components are first deleted so that a new transient analysis object can be created. +A new solution Algorithm of type Newton is then created. The solution algorithm uses a ConvergenceTest which tests convergence on the norm of the displacement increment vector. The integrator for this analysis will be of type Newmark with a γ=0.25\\gamma = 0.25 and β=0.5\\beta = 0.5 . +The integrator will add some stiffness proportional damping to the system, the damping term will be based on the last committed stifness of the elements, i.e. C=acKcommitC = a_c K_\\textcommit with ac=0.000625a_c = 0.000625 . +The equations are formed using a banded storage scheme, so the System is BandGeneral. The equations are numbered using an RCM (reverse Cuthill-McKee) numberer. The constraints are enforced with a Plain constraint handler. +Once all the components of an analysis are defined, the Analysis object itself is created. For this problem a Transient Analysis object is used. 2000 time steps are performed with a time step of 0.01. +In addition to the transient analysis, two eigenvalue analysis are performed on the model. The first is performed after the gravity analysis and the second after the transient analysis. +For this analysis the nodal displacenments at Nodes 3 and 4 will be stored in the file nodeTransient.out for post-processing. In addition the section forces and deformations for the section at the base of column 1 will also be stored in two seperate files. The results of the eigenvalue analysis will be displayed on the screen. +Gravity load analysis completed eigen values at start of transient: 2.695422e+02 1.750711e+04 Transient analysis completed SUCCESSFULLY eigen values at start of transient: 1.578616e+02 1.658481e+04 Node: 3 Coordinates : 0 144 commitDisps: -0.0464287 -0.0246641 0.000196066 Velocities : -0.733071 1.86329e-05 0.00467983 commitAccels: -9.13525 0.277302 38.2972 unbalanced Load: -3.9475 -180 0 Mass : 0.465839 0 0 0 0.465839 0 0 0 0 Eigenvectors: -1.03587 -0.0482103 -0.00179081 0.00612275 0.00663473 3.21404e-05 The two eigenvalues for the eigenvalue analysis are printed to the screen. The state of node 3 at the end of the analysis is also printed. The information contains the last committed displacements, velocities and accelerations at the node, the unbalanced nodal forces and the nodal masses. In addition, the eigenvector components of the eigenvector pertaining to the node 3 is also displayed. +In addition to the contents displayed on the screen, three files have been created. Each line of nodeTransient.out contains the domain time, and DX, DY and RZ for node 3. Plotting the first and second columns of this file the lateral displacement versus time for node 3 can be obtained as shown in the figure below. Each line of the files ele1secForce.out and ele1secDef.out contain the domain time and the forces and deformations for section 1 (the base section) of element 1. These can be used to generate the moment-curvature time history of the base section of column 1 as shown below. + `}).add({id:23,tag:"en",href:"/opensees-gallery/examples/inelasticsdof/",title:"Inelastic SDOF",description:"Integration of an inelastic single-degree-of-freedom (SDOF) system.",content:`March 2020, By Amir Hossein Namadchi +This is an OpenSeesPy simulation of a simple SDOF system with elastoplastic behavior mentioned in Dynamics of Structures book by Ray W. Clough and J. Penzien. This example has been solved in the book, so the result obtained here can be compared with the reference. +This notebook is adapted from https://github.com/AmirHosseinNamadchi/OpenSeesPy-Examples/blob/master/Elastoplastic%20SDOF%20system.ipynb  import numpy as np import opensees.openseespy as ops import matplotlib.pyplot as plt## Units inch = 1 # inches kips = 1 # KiloPounds sec = 1 # Seconds lb = kips*(sec**2)/inch # mass unit (derived)Model specifications are defined as follows: +m = 0.1*lb # Mass k = 5.0*(kips/inch) # Stiffness c = 0.2*(kips*sec/inch) # Damping dy_p = 1.2*inch # Plastic state displacment alpha_m = c/m # Rayleigh damping ratio # Variation of p(t) in tabular form load_history = np.array([[0, 0], [0.1, 5], [0.2, 8], [0.3, 7], [0.4, 5], [0.5, 3], [0.6, 2], [0.7, 1], [0.8, 0]]) # Dynamic Analysis Parameters dt = 0.01 time = 1.0 Analysis   Let’s wrap the whole part in a function so that different material behavior could be passed to the function: +def do_analysis(dt, time, material_params): model = ops.Model(ndm=1, ndf=1) time_domain = np.arange(0, time, dt) # Nodes model.node(1,0.0,0.0) model.node(2,0.0,0.0) model.uniaxialMaterial(*material_params) model.element('ZeroLength', 1, *[1,2], mat=1, dir=1) model.mass(2, m) model.rayleigh(alpha_m, 0.0, 0.0, 0.0) model.fix(1,1) model.timeSeries('Path', 1, values=load_history[:,1], time=load_history[:,0]) model.pattern('Plain', 1, 1) model.load(2, 1) # Analysis model.constraints('Plain') model.numberer('Plain') model.system('ProfileSPD') model.test('NormUnbalance', 0.0000001, 100) model.algorithm('ModifiedNewton') model.integrator('Newmark', 0.5, 0.25) model.analysis('Transient') time_lst =[0] # list to hold time stations for plotting response = [0] # response params of node 2 for i in range(len(time_domain)): model.analyze(1, dt) time_lst.append(model.getTime()) response.append(model.nodeDisp(2,1)) return 'time_list':np.array(time_lst), 'd': np.array(response)For comparison (similar to the book), elastic analysis is also inculded: +epp = do_analysis(dt, time, ['ElasticPP', 1, k, dy_p]) # Elastic-Perfectly Plastic els = do_analysis(dt, time, ['Elastic', 1, k]) # Elastic Visualization   plt.figure(figsize=(7,5)) plt.plot(epp['time_list'], epp['d'], color = '#fe4a49', linewidth=1.75, label = 'Nonlinear (EPP)') plt.plot(els['time_list'], els['d'], color = '#2ab7ca', linewidth=1.75, label = 'Linear (Elastic)') plt.ylabel('Displacement (inch)', 'fontstyle':'italic','size':14) plt.xlabel('Time (sec)', 'fontstyle':'italic','size':14) plt.xlim([0.0, time]) plt.legend() plt.grid() plt.yticks(fontsize = 14) plt.xticks(fontsize = 14);Output: +<Figure size 700x500 with 1 Axes> Closure   Results obtained here with OpenSees perfectly agree with the ones in the book. +References   Clough, R.W. and Penzien, J., 2003. Dynamics of structures. Berkeley. CA: Computers and Structures, Inc. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 import sdof import numpy as np import opensees.openseespy as op FREE = 0 FIXED = 1 X, Y, RZ = 1, 2, 3 def plastic_sdof(material, motion, dt, xi=0.05, r_post=0.0): """ Run seismic analysis of a nonlinear SDOF :param mass: mass :param k: spring stiffness :param f_yield: yield strength :param motion: list, acceleration values :param dt: float, time step of acceleration values :param xi: damping ratio :param r_post: post-yield stiffness :return: """ mass, k, f_yield = material op.wipe() # 2 dimensions, 3 dof per node op.model('basic', '-ndm', 2, '-ndf', 3) # Establish nodes bot_node = 1 top_node = 2 op.node(bot_node, 0., 0.) op.node(top_node, 0., 0.) # Fix bottom node op.fix(top_node, FREE, FIXED, FIXED) op.fix(bot_node, FIXED, FIXED, FIXED) # Set out-of-plane DOFs to be slaved op.equalDOF(1, 2, *[2, 3]) # nodal mass (weight / g): op.mass(top_node, mass, 0., 0.) # Define material bilinear_mat_tag = 1 mat_type = "Steel01" mat_props = [f_yield, k, r_post] op.uniaxialMaterial(mat_type, bilinear_mat_tag, *mat_props) # Assign zero length element beam_tag = 1 op.element('zeroLength', beam_tag, bot_node, top_node, "-mat", bilinear_mat_tag, "-dir", 1, '-doRayleigh', 1) # Define the dynamic analysis load_tag_dynamic = 1 pattern_tag_dynamic = 1 values = list(-1 * motion) # should be negative # op.timeSeries('Path', load_tag_dynamic, dt=dt, values=values) op.timeSeries('Path', load_tag_dynamic, "-dt", dt, "-values", *values) # op.pattern('UniformExcitation', pattern_tag_dynamic, X, accel=load_tag_dynamic) op.pattern('UniformExcitation', pattern_tag_dynamic, X, "-accel", load_tag_dynamic) # set damping based on first eigen mode eig = op.eigen('-fullGenLapack', 1) try: angular_freq = eig**0.5 except: angular_freq = eig[0]**0.5 alpha_m = 0.0 beta_k = 2 * xi / angular_freq beta_k_comm = 0.0 beta_k_init = 0.0 op.rayleigh(alpha_m, beta_k, beta_k_init, beta_k_comm) # Run the dynamic analysis # op.wipeAnalysis() op.algorithm('Newton') # op.system('SparseGeneral') op.numberer('RCM') op.constraints('Transformation') op.integrator('Newmark', 0.5, 0.25) op.analysis('Transient') tol = 1.0e-10 iterations = 10 op.test('EnergyIncr', tol, iterations, 0, 2) analysis_time = (len(values) - 1) * dt analysis_dt = 0.001 outputs = "time": [], "rel_disp": [], "rel_accel": [], "rel_vel": [], "force": [] while op.getTime() < analysis_time: curr_time = op.getTime() if op.analyze(1, analysis_dt) != 0: print(f"Failed at time op.getTime()") break outputs["time"].append(curr_time) outputs["rel_disp"].append(op.nodeDisp(top_node, 1)) outputs["rel_vel"].append(op.nodeVel(top_node, 1)) outputs["rel_accel"].append(op.nodeAccel(top_node, 1)) op.reactions() outputs["force"].append(-op.nodeReaction(bot_node, 1)) # Negative since diff node op.wipe() for item in outputs: outputs[item] = np.array(outputs[item]) return outputs def main(): """ Create a plot of an elastic analysis, nonlinear analysis and closed form elastic :return: """ import eqsig import matplotlib.pyplot as plt record_filename = 'test_motion_dt0p01.txt' dt = 0.01 rec = np.loadtxt(record_filename) acc_signal = eqsig.AccSignal(rec, dt) period = 1.0 xi = 0.05 mass = 1.0 f_yield = 1.5 # Reduce this to make it nonlinear r_post = 0.0 periods = np.array([period]) k = 4 * np.pi ** 2 * mass / period ** 2 outputs = plastic_sdof((mass, k, f_yield), rec, dt, xi=xi, r_post=r_post) outputs_elastic = plastic_sdof((mass, k, f_yield * 100), rec, dt, xi=xi, r_post=r_post) ux_opensees = outputs["rel_disp"] ux_opensees_elastic = outputs_elastic["rel_disp"] print(outputs) bf, sps = plt.subplots(nrows=2) sps[0].plot(outputs["time"], ux_opensees, label="OpenSees fy=%.3gN" % f_yield, ls="-") sps[0].plot(outputs["time"], ux_opensees_elastic, label="OpenSees fy=%.3gN" % (f_yield * 100), ls="--") time = acc_signal.time acc_opensees_elastic = np.interp(time, outputs_elastic["time"], outputs_elastic["rel_accel"]) - rec resp_u, resp_v, resp_a = sdof.integrate(rec, dt, k, 2*xi*mass*np.sqrt(k/mass), mass, fy=f_yield) sps[0].plot(acc_signal.time, resp_u, label="sdof") sps[1].plot(acc_signal.time, resp_a, label="sdof") # resp_u, resp_v, resp_a = duhamels.response_series(motion=rec, dt=dt, periods=periods, xi=xi) # sps[0].plot(acc_signal.time, resp_u[0], label="Eqsig") # sps[1].plot(acc_signal.time, resp_a[0], label="Eqsig") # Elastic solution # print("diff", sum(acc_opensees_elastic - resp_a[0])) sps[1].plot(time, acc_opensees_elastic, label="Opensees fy=%.2gN" % (f_yield * 100), ls="--") sps[0].legend() sps[1].legend() plt.show() if __name__ == '__main__': main()`}).add({id:24,tag:"en",href:"/opensees-gallery/docs/getting-started/introduction/",title:"Introduction",description:"Get started with OpenSees.",content:`opensees is a Python package that provides an intuitive API for nonlinear finite element analysis, implemented in C++ through the OpenSees framework. OpenSees features state-of-the-art finite element formulations and solution algorithms, including mixed formulations for beams and solids, over 200 material models, and an extensive collection of continuation algorithms to solve highly nonlinear problems. +Installation   In order to install opensees just run the command: +python -m pip install opensees Running OpenSees   The opensees package can be used in three ways: +Python Module The opensees.openseespy Python module implements the API that has been developed by Oregon State. Command line interface An interactive Tcl interpreter can be started by invoking the module as follows from the command line: +python -m opensees --help Interactive Interpreter An interactive Tcl interpreter can be started by invoking the module as follows from the command line: +python -m opensees`}).add({id:25,tag:"en",href:"/opensees-gallery/docs/configuration/layout/",title:"Layout",description:"Hinode uses a grid-based, responsive design for the home page, single pages and list pages.",content:""}).add({id:26,tag:"en",href:"/opensees-gallery/docs/about/license/",title:"License",description:"OpenSeesRT's open-source license for the codebase and documentation.",content:`Codebase   The codebase of OpenSeesRT is open source under the conditions of the MIT license  and is copyright © 2024 by Mark Dumay. In short, the MIT license allows you to use the OpenSeesRT codebase for both personal and commercial use, as long as you include the original license and copyright notice. Licensed works, modifications, and larger works may be distributed under different terms and without source code. No liability or warranty is given. +Documentation   The documentation of OpenSeesRT is licensed under the Creative Commons ( CC BY-NC 4.0  ) license. This includes all files within the repository’s /content and /exampleSite/content folders and their children, as well as the “README” in the repository root. The license allows you to share and adapt the materials, as long as you give appropriate credit and do not use the materials for commercial purposes. No warranties are given. p`}).add({id:27,tag:"en",href:"/opensees-gallery/examples/chopra-10.4/",title:"Matrix Eigenvalue Analysis",description:"This example demonstrates how to perform eigenvalue analysis and plot mode shapes. ",content:`This example is adapted from the OpenSees Wiki page Eigen analysis of a two-storey shear frame  . +This example demonstrates how to perform eigenvalue analysis and plot mode shapes. +An idealized two-storey shear frame (Example 10.4 from “Dynamic of Structures” book by Professor Anil K. Chopra) is used for this purpose. In this idealization beams are rigid in flexure, axial deformation of beams and columns are neglected, and the effect of axial force on the stiffness of the columns is neglected. Geometry and material characteristics of the frame structure are shown in Figure 1. Node and element numbering is given in Figure 2. +ShearFrame5.png Instructions on how to run this example   To execute this ananlysis in OpenSees the user has to download this files: +EigenAnal_twoStoryShearFrame.tcl Place EigenAnal_twoStoryShearFrame.tcl in the same folder with the OpenSees.exe. By double clicking on OpenSees.exe the OpenSees interpreter will pop out. To run the analysis the user should type: +Python Tcl python EigenAnal_twoStoryShearFrame8.py python -m opensees EigenAnal_twoStoryShearFrame8.tcl and hit enter. To create output files (stored in directory “data”) the user has to exit OpenSees interpreter by typing “exit”. +Create the model   Spatial dimension of the model and number of degrees-of-freedom (DOF) at nodes are defined using model command. In this example we have 2D model with 3 DOFs at each node. This is defined in the following way: +Python Tcl import opensees.openseespy as ops model = ops.Model(ndm=2, ndf=3) model BasicBuilder -ndm 2 -ndf 3 Note: geometry, mass, and material characteristics are assigned to variables that correspond to the ones shown in Figure 1 (e.g., the height of the column is set to be 144 in. and assigned to variable h; the value of the height can be accessed by $h). +Nodes of the structure (Figure 2) are defined using the node command: +Python Tcl model.node(1, 0., 0.) model.node(2, L , 0.) model.node(3, 0., h ) model.node(4, L , h ) model.node(5, 0., 2*h ) model.node(6, L , 2*h ) node 1 0. 0. ; node 2 $L 0. ; node 3 0. $h ; node 4 $L $h ; node 5 0. [expr 2*$h]; node 6 $L [expr 2*$h]; The boundary conditions are defined next using single-point constraint command fix. In this example nodes 1 and 2 are fully fixed at all three DOFs: +Python Tcl model.fix(1, 1, 1, 1) model.fix(2, 1, 1, 1) fix 1 1 1 1; fix 2 1 1 1; Masses are assigned at nodes 3, 4, 5, and 6 using mass command. Since the considered shear frame system has only two degrees of freedom (displacements in x at the 1st and the 2nd storey), the masses have to be assigned in x direction only. +Python Tcl model.mass(3, m , 0., 0. ) model.mass(4, m , 0., 0. ) model.mass(5, m/2., 0., 0. ) model.mass(6, m/2., 0., 0. ) mass 3 $m 0. 0. ; mass 4 $m 0. 0. ; mass 5 [expr $m/2.] 0. 0. ; mass 6 [expr $m/2.] 0. 0. ; The geometric transformation with id tag 1 is defined to be linear. +set TransfTag 1; geomTransf Linear $TransfTag ; The beams and columns of the frame are defined to be elastic using elasticBeamColumn element. In order to make beams infinitely rigid moment of inertia for beams (Ib) is set to very high value (10e+12). +Python Tcl model.element("ElasticBeamColumn", 1, 1, 3, Ac, Ec, 2.*Ic, TransfTag) model.element("ElasticBeamColumn", 2, 3, 5, Ac, Ec, Ic, TransfTag) model.element("ElasticBeamColumn", 3, 2, 4, Ac, Ec, 2.*Ic, TransfTag) model.element("ElasticBeamColumn", 4, 4, 6, Ac, Ec, Ic, TransfTag) model.element("ElasticBeamColumn", 5, 3, 4, Ab, E, Ib, TransfTag) model.element("ElasticBeamColumn", 6, 5, 6, Ab, E, Ib, TransfTag) element elasticBeamColumn 1 1 3 $Ac $Ec [expr 2.*$Ic] $TransfTag; element elasticBeamColumn 2 3 5 $Ac $Ec $Ic $TransfTag; element elasticBeamColumn 3 2 4 $Ac $Ec [expr 2.*$Ic] $TransfTag; element elasticBeamColumn 4 4 6 $Ac $Ec $Ic $TransfTag; element elasticBeamColumn 5 3 4 $Ab $E $Ib $TransfTag; element elasticBeamColumn 6 5 6 $Ab $E $Ib $TransfTag; To comply with the assumptions of the shear frame (no vertical displacemnts and rotations at nodes) end nodes of the beams are constrained to each other in the 2nd DOF (vertical displacement) and the 3rd DOF (rotation). EqualDOF command is used to imply these constraints. +equalDOF 3 4 2 3; equalDOF 5 6 2 3; Define recorders   For the specified number of eigenvalues (numModes) (for this example it is 2) the eigenvectors are recorded at all nodes in all DOFs using node recorder command. +Python Tcl for k in range(numModes): model.recorder("Node", f"eigen k", file=f"modes/modek.out", nodeRange=[1, 6], dof=[1, 2, 3]) foreach k [range $numModes] recorder Node -file [format "modes/mode%i.out" $k] -nodeRange 1 6 -dof 1 2 3 "eigen $k" Perform eigenvalue analysis and store periods into a file   The eigenvalues are calculated using eigen commnad and stored in lambda variable. +set lambda [eigen $numModes];The periods and frequencies of the structure are calculated next. +set omega set f set T set pi 3.141593 foreach lam $lambda lappend omega [expr sqrt($lam)]; lappend f [expr sqrt($lam)/(2*$pi)]; lappend T [expr (2*$pi)/sqrt($lam)]; The periods are stored in a Periods.txt file inside of directory modes/. +set period "modes/Periods.txt" set Periods [open $period "w"] foreach t $T puts $Periods " $t" close $Periods Record the eigenvectors   For eigenvectors to be recorded record command has to be issued following the eigen command. +record Display mode shapes   TODO +Example Provided by: Vesna Terzic, UC Berkeley`}).add({id:28,tag:"en",href:"/opensees-gallery/docs/getting-started/modeling/",title:"Modeling",description:`To run multiple models simultaneously, use openseespy.Model(...) (capital M) instead of the regular openseespy.model(...) (lowercase m) function, and invoke all subsequent modeling functions (e.g. node(...), element(...), fix(...), etc) as methods on the object returned from Model() instead of the openseespy submodule directly. For example, instead of: +import opensees.openseespy as ops ops.model("basic", "-ndm", 2, "-ndf", 3) ops.node(1, 2.0, 3.0)do +import opensees.openseespy as ops model = ops.Model(ndm=2, ndf=3) model.node(1, 2.0, 3.`,content:`To run multiple models simultaneously, use openseespy.Model(...) (capital M) instead of the regular openseespy.model(...) (lowercase m) function, and invoke all subsequent modeling functions (e.g. node(...), element(...), fix(...), etc) as methods on the object returned from Model() instead of the openseespy submodule directly. For example, instead of: +import opensees.openseespy as ops ops.model("basic", "-ndm", 2, "-ndf", 3) ops.node(1, 2.0, 3.0)do +import opensees.openseespy as ops model = ops.Model(ndm=2, ndf=3) model.node(1, 2.0, 3.0)`}).add({id:29,tag:"en",href:"/opensees-gallery/docs/advanced-settings/module-development/",title:"Module development",description:"Develop your own Hugo modules compatible with Hinode.",content:""}).add({id:30,tag:"en",href:"/opensees-gallery/examples/example2/",title:"Moment-Curvature Analysis",description:"A reinforced concrete cross-section is modeled using a fiber section, and a moment-curvature analysis is performed.",content:`This example performs a moment-curvature analysis of a reinforced concrete section which is represented by a fiber discretization. Because we are only interested in the response quantities of the cross section, a zero-length element is used to wrap the cross section. +Modeling   The figure below shows the fiber discretization for the section. The files for this example are: Python Tcl <a href="Example2.py"><code>Example2.py</code></a></li> <a href="Example2.tcl"><code>Example2.tcl</code></a></li> <a href="MomentCurvature.tcl"><code>MomentCurvature.tcl</code></a></li> The model consists of two nodes and a ZeroLengthSection element. A depiction of the element geometry is shown in figure zerolength. The drawing on the left of figure zerolength shows an edge view of the element where the local zz -axis, as seen on the right side of the figure and in figure rcsection0, is coming out of the page. Node 1 is completely restrained, while the applied loads act on node 2. A compressive axial load, PP , of 180180 kips is applied to the section during the moment-curvature analysis. +A fiber section is created by grouping various patches and layers: +Note in Python you must pass the section tag when calling patch and layer +Python Tcl model.section("Fiber", 1) # Create the concrete core fibers model.patch("rect", 1, 10, 1, cover-y1, cover-z1, y1-cover, z1-cover, section=1) # Create the concrete cover fibers (top, bottom, left, right, section=1) model.patch("rect", 2, 10, 1, -y1, z1-cover, y1, z1, section=1) model.patch("rect", 2, 10, 1, -y1, -z1, y1, cover-z1, section=1) model.patch("rect", 2, 2, 1, -y1, cover-z1, cover-y1, z1-cover, section=1) model.patch("rect", 2, 2, 1, y1-cover, cover-z1, y1, z1-cover, section=1) # Create the reinforcing fibers (left, middle, right, section=1) model.layer("straight", 3, 3, As, y1-cover, z1-cover, y1-cover, cover-z1, section=1) model.layer("straight", 3, 2, As, 0.0, z1-cover, 0.0, cover-z1, section=1) model.layer("straight", 3, 3, As, cover-y1, z1-cover, cover-y1, cover-z1, section=1) section Fiber 1 # Create the concrete core fibers patch rect 1 10 1 [expr $cover-$y1] [expr $cover-$z1] [expr $y1-$cover] [expr $z1-$cover] # Create the concrete cover fibers (top, bottom, left, right) patch rect 2 10 1 [expr -$y1] [expr $z1-$cover] $y1 $z1 patch rect 2 10 1 [expr -$y1] [expr -$z1] $y1 [expr $cover-$z1] patch rect 2 2 1 [expr -$y1] [expr $cover-$z1] [expr $cover-$y1] [expr $z1-$cover] patch rect 2 2 1 [expr $y1-$cover] [expr $cover-$z1] $y1 [expr $z1-$cover] # Create the reinforcing fibers (left, middle, right) layer straight 3 3 $As [expr $y1-$cover] [expr $z1-$cover] [expr $y1-$cover] [expr $cover-$z1] layer straight 3 2 $As 0.0 [expr $z1-$cover] 0.0 [expr $cover-$z1] layer straight 3 3 $As [expr $cover-$y1] [expr $z1-$cover] [expr $cover-$y1] [expr $cover-$z1] For the zero length element, a section discretized by concrete and steel is created to represent the resultant behavior. UniaxialMaterial objects are created to define the fiber stress-strain relationships: confined concrete in the column core, unconfined concrete in the column cover, and reinforcing steel. +The dimensions of the fiber section are shown in figure rcsection0. The section depth is 24 inches, the width is 15 inches, and there are 1.5 inches of cover around the entire section. Strong axis bending is about the section zz -axis. In fact, the section zz -axis is the strong axis of bending for all fiber sections in planar problems. The section is separated into confined and unconfined concrete regions, for which separate fiber discretizations will be generated. Reinforcing steel bars will be placed around the boundary of the confined and unconfined regions. The fiber discretization for the section is shown in figure rcsection4. +Analysis   The section analysis is performed by the procedure moment_curvature defined in the file MomentCurvature.tcl for Tcl, and Example2.1.py for Python. The arguments to the procedure are the tag secTag of the section to be analyzed, the axial load axialLoad applied to the section, the maximum curvature maxK, and the number numIncr of displacement increments to reach the maximum curvature. +The output for the moment-curvature analysis will be the section forces and deformations, stored in the file section1.out. In addition, an estimate of the section yield curvature is printed to the screen. +In the moment_curvature procedure, the nodes are defined to be at the same geometric location and the ZeroLengthSection element is used. A single load step is performed for the axial load, then the integrator is changed to DisplacementControl to impose nodal displacements, which map directly to section deformations. A reference moment of 1.0 is defined in a Linear time series. For this reference moment, the DisplacementControl integrator will determine the load factor needed to apply the imposed displacement. A node recorder is defined to track the moment-curvature results. The load factor is the moment, and the nodal rotation is in fact the curvature of the element with zero thickness. +The expected output is: +Estimated yield curvature: 0.000126984126984 The file section1.out contains for each committed state a line with the load factor and the rotation at node 3. This can be used to plot the moment-curvature relationship as shown in figure momcurv.`}).add({id:31,tag:"en",href:"/opensees-gallery/examples/framebuckling/",title:"Nonlinear Geometry",description:`Corotational frame elements are used to approximate Euler’s buckling load, which is given by: Peuler=π2EIL2 P_{\\mathrm{euler}} = \\frac{\\pi^2 EI}{L^2} This example is adapted from https://github.com/denavit/OpenSees-Examples  . The files for the problem are buckling.py for Python, and buckling.tcl for Tcl. +Theory   Buckling Analysis   Loosely speaking, buckling happens when there are multiple shapes that a structure can deform into that will be in equilibrium with it’s applied loads. This implies that at the point of buckling, there are multiple independent displacement increments u\\bm{u} which will be mapped to the same resisting load by the tangent K\\bm{K} .`,content:`Corotational frame elements are used to approximate Euler’s buckling load, which is given by: Peuler=π2EIL2 P_\\mathrmeuler = \\frac\\pi^2 EIL^2 This example is adapted from https://github.com/denavit/OpenSees-Examples  . The files for the problem are buckling.py for Python, and buckling.tcl for Tcl. +Theory   Buckling Analysis   Loosely speaking, buckling happens when there are multiple shapes that a structure can deform into that will be in equilibrium with it’s applied loads. This implies that at the point of buckling, there are multiple independent displacement increments u\\bmu which will be mapped to the same resisting load by the tangent K\\bmK . In otherwords, The buckling load is the point at which K\\bmK becomes singular. If we consider K\\bmK as a function of the load factor λ\\bm\\lambda , this condition can be expressed as the nonlinear root-finding problem: det⁡K(λ)=0 \\operatornamedet\\bmK(\\lambda) = 0 For many classical models, the dependence of K\\bmK on λ\\lambda is linear, and in this case the problem is equivalent to a generalized eigenvalue problem which is computationally much more tractable. However, even if K\\bmK is nonlinear in λ\\lambda , one may still investigate the linearized buckling problem, where an eigenvalue problem is obtained by learizing K(λ)\\bmK(\\lambda) : K(λ)≈K(0)+K′(0)λ \\bmK(\\lambda) \\approx \\bmK(0) + \\bmK^\\prime(0) \\lambda where K′\\bmK^\\prime is the derivative of K\\bmK with respect to λ\\lambda . +Timoshenko Column Buckling   λ=PL2EI[1−P/(ksGA)]=PL2χEIχ=1−P/(ksGA)P=χλ2EI/L2. \\begingathered \\lambda=\\sqrt\\fracP L^2E I\\left[1-P /\\left(k_\\mathrms G A\\right)\\right]=\\sqrt\\fracP L^2\\chi E I \\\\ \\chi=1-P /\\left(k_\\mathrms G A\\right) \\\\ P=\\chi \\lambda^2 E I / L^2 . \\endgathered χ=11+λ2EI/(ksGAL2)=11+λ2φ/12P=λ2EI/L21+λ2φ/12. \\begingathered \\chi=\\frac11+\\lambda^2 E I /\\left(k_\\mathrms G A L^2\\right)=\\frac11+\\lambda^2 \\varphi / 12 \\\\ P=\\frac\\lambda^2 E I / L^21+\\lambda^2 \\varphi / 12 . \\endgathered tan⁡λcr =χλcr =λcr 1+λcr 2φ/12 \\tan \\lambda_\\text cr =\\chi \\lambda_\\text cr =\\frac\\lambda_\\text cr 1+\\lambda_\\text cr 2 \\varphi / 12`}).add({id:32,tag:"en",href:"/opensees-gallery/docs/advanced-settings/overview/",title:"Overview",description:"Configure and customize Hinode to your liking using modules, npm, and mounted folders.",content:""}).add({id:33,tag:"en",href:"/opensees-gallery/docs/advanced-settings/partial-development/",title:"Partial development",description:"Develop custom partials and shortcodes following Hinode's coding conventions.",content:""}).add({id:34,tag:"en",href:"/opensees-gallery/docs/getting-started/python/",title:"Python",description:"",content:""}).add({id:35,tag:"en",href:"/opensees-gallery/releases/",title:"Releases",description:"A chronological overview of key releases since the initial launch of Hinode.",content:`The timeline below captures the significant changes since the initial release of Hinode in April, 2022. Visit GitHub for a full overview of all Hinode releases  , including features, bug fixes, and dependency upgrades. +Render hooks v0.26.0 August 15, 2024 +This release includes support for markdown links and markdown images. Hinode will invoke the relevant partials, so they will have the same behavior and styling as their counterparts. This release also includes support for server-side math rendering as introduced by Hugo v0.132.0  . +Script bundle localization v0.25.0 August 2, 2024 +Hinode includes search support out of the box. To limit the bundle size, the search index now includes entries for the current translation only. To enable localization, the module configuration includes a new parameter localize. By default, the FlexSearch module sets localization to true. +Initial launch v0.1 April 13, 2022 +Inspired by Blist and Doks, this release introduces Hinode - a modern blog and documentation theme for Hugo. By taking advantage of npm, the used dependencies are easily tracked and updated. Powered by Bootstrap, the generated website is responsive and brings many common UI elements. Hinode wraps many of these elements in a shortcode to simplify their usage. +Render hooks v0.26.0 August 15, 2024 +This release includes support for markdown links and markdown images. Hinode will invoke the relevant partials, so they will have the same behavior and styling as their counterparts. This release also includes support for server-side math rendering as introduced by Hugo v0.132.0  . +Script bundle localization v0.25.0 August 2, 2024 +Hinode includes search support out of the box. To limit the bundle size, the search index now includes entries for the current translation only. To enable localization, the module configuration includes a new parameter localize. By default, the FlexSearch module sets localization to true. +Initial launch v0.1 April 13, 2022 +Inspired by Blist and Doks, this release introduces Hinode - a modern blog and documentation theme for Hugo. By taking advantage of npm, the used dependencies are easily tracked and updated. Powered by Bootstrap, the generated website is responsive and brings many common UI elements. Hinode wraps many of these elements in a shortcode to simplify their usage.`}).add({id:36,tag:"en",href:"/opensees-gallery/examples/spectrum/",title:"RotD Spectrum",description:`This code computes the RotD50 Sa and RotD100 Sa Spectra of bi-directional ground motion records. +spectra.py +The source code for this problem is adapted from the example by Jawad Fayaz at https://openseespydoc.readthedocs.io/en/latest/src/exampleRotDSpectra.html  .`,content:`This code computes the RotD50 Sa and RotD100 Sa Spectra of bi-directional ground motion records. +spectra.py +The source code for this problem is adapted from the example by Jawad Fayaz at https://openseespydoc.readthedocs.io/en/latest/src/exampleRotDSpectra.html  .`}).add({id:37,tag:"en",href:"/opensees-gallery/examples/sathertower/",title:"Sather Tower",description:"",content:""}).add({id:38,tag:"en",href:"/opensees-gallery/docs/advanced-settings/scripts/",title:"Scripts",description:"Automatically bundle local and external JavaScript files into a single file.",content:"Hinode bundles local JavaScript files and JavaScript files defined in a core module into a single file. By utilizing Hugo modules, external JavaScript files are automatically ingested and kept up to date."}).add({id:39,tag:"en",href:"/opensees-gallery/examples/sensitivity/",title:"Sensitivity",description:"Basic sensitivity analysis is performed",content:"1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 import opensees.openseespy as ops # Input [N, m, kg, sec] L = 5.0 # Total length of cantilever F = 300000.0 # Lateral point load P = 0.0 # Axial force w = 10000.0 # Distributed load E = 200e9 # Modulus of elasticity G = E*0.6 hw = 0.355 # Web height bf = 0.365 # Flange width tf = 0.018 # Flange thickness tw = 0.011 # Web thickness nf = 3 # Number of fibers in the flange nw = 8 # Number of fibres in the web nel = 1 # Area and moment of inertia A = tw * (hw - 2 * tf) + 2 * bf * tf I = tw * (hw - 2 * tf) ** 3 / 12.0 + 2 * bf * tf * (0.5 * (hw - tf)) ** 2 Ay = A*1e5 Az = A*1e5 Iz = I Iy = I J = 2*I model = ops.Model(ndm=3, ndf=6) model.node(1, 0, 0, 0) model.node(2, L, 0, 0) model.fix(1, 1, 1, 1, 1, 1, 1) model.section("FrameElastic", 1, E=E, A=A, Ay=Ay, Az=Az, Iz=Iz, Iy=Iy, J=J, G=G) model.geomTransf("Linear", 1, (0, 0, 1)) model.element("CubicFrame", 1, (1, 2), section=1, transform=1) model.parameter(1, "element", 1, "E") model.parameter(2, "element", 1, "A") model.parameter(3, "element", 1, "Iz") model.parameter(4, "node", nel+1, "coord", 1) model.pattern("Plain", 1, "Linear") model.load(2, (0.0, 1.0, 0.0, 0.0, 0.0, 0.0), pattern=1) model.constraints("Plain") model.system("ProfileSPD") if True: Pmax = F Nsteps = 1 dP = Pmax / Nsteps model.integrator("LoadControl", dP) model.analysis("Static") model.sensitivityAlgorithm("-computeAtEachStep") for i in range(Nsteps): print(model.analyze(1)) print(model.nodeDisp(2, 2), model.getLoadFactor(1)) for param in model.getParamTags(): print("\\t", param, model.sensNodeDisp(2, 2, param)) if False: model.wipeAnalysis() Umax = 2.2 Nsteps = 100 Uincr = Umax/Nsteps model.integrator("DisplacementControl",2,2,Uincr) model.analysis("Static") model.sensitivityAlgorithm("-computeAtEachStep") for i in range(Nsteps): model.analyze(1) print(model.nodeDisp(2,1), model.getLoadFactor(1)) for param in model.getParamTags(): print(param, model.sensLambda(1, param)) # print(param, model.sensNodeDisp(2, 1, param)) print("u", F*L**3/(3*E*I)) print("L", F*L**2/(E*I)) print("F", L**3/(3*E*I))"}).add({id:40,tag:"en",href:"/opensees-gallery/examples/shallowdome/",title:"Shallow Dome",description:"Double-Layer Shallow Dome   March 2020, Amir Hossein Namadchi   This is an OpenSeesPy simulation of one of the numerical examples in our previously published paper  . The Core was purely written in Mathematica. This is my attempt to perform the analysis again via Opensees Core, to see if I can get the similar results. In the paper, we used Total Lagrangian framework to model the structure. Unfortunately, OpenSees does not include this framework, so, alternatively, I will use Corotational truss element.",content:`Double-Layer Shallow Dome   March 2020, Amir Hossein Namadchi   This is an OpenSeesPy simulation of one of the numerical examples in our previously published paper  . The Core was purely written in Mathematica. This is my attempt to perform the analysis again via Opensees Core, to see if I can get the similar results. In the paper, we used Total Lagrangian framework to model the structure. Unfortunately, OpenSees does not include this framework, so, alternatively, I will use Corotational truss element. +import numpy as np import opensees.openseespy as ops import matplotlib.pyplot as plt import sees # %matplotlib notebook # %matplotlib widgetBelow, the base units are defined as python variables: +## Units m = 1 # Meters KN = 1 # KiloNewtons s = 1 # Seconds Model Defintion   The coordinates information for each node are stored node_coords. Each row represent a node with the corresponding coordinates. Elements configuration are also described in connectivity, each row representing an element with its node IDs. Elements cross-sectional areas are stored in area_list. This appraoch, offers a more pythonic and flexible code when building the model. Since this is a relatively large model, some data will be read from external .txt files to keep the code cleaner. +# Node Coordinates Matrix (size : nn x 3) node_coords = np.loadtxt('assets/nodes.txt', dtype = np.float64) * m # Element Connectivity Matrix (size: nel x 2) connectivity = np.loadtxt('assets/connectivity.txt', dtype = np.int64).tolist() # Loaded Nodes loaded_nodes = np.loadtxt('assets/loaded_nodes.txt', dtype = np.int64).tolist() # Get Number of total Nodes nn = len(node_coords) # Get Number of total Elements nel = len(connectivity) # Cross-sectional area list (size: nel) area_list = np.ones(nel)*(0.001)*(m**2) # Modulus of Elasticity list (size: nel) E_list = np.ones(nel)*(2.0*10**8)*(KN/m**2) # Mass Density rho = 7.850*((KN*s**2)/(m**4)) #Boundary Conditions (size: fixed_nodes x 4) B_C = np.column_stack((np.arange(1,31), np.ones((30,3), dtype = np.int64)) ).tolist() Model Construction   I use list comprehension to add nodes,elements and other objects to the domain. +model = ops.Model(ndm=3, ndf=3) # Adding nodes to the model object using list comprehensions [model.node(n+1,*node_coords[n]) for n in range(nn)]; # Applying BC [model.fix(B_C[n][0],*B_C[n][1:]) for n in range(len(B_C))]; # Set Material model.uniaxialMaterial('Elastic',1, E_list[0]) # Adding Elements [model.element('corotTruss', e+1, *connectivity[e], area_list[e], 1,'-rho', rho*area_list[e], '-cMass', 1) for e in range(nel)]; Draw model   The model can now be drawn using the sees Python package: +sees.render(model)Output: +<Figure size 640x480 with 1 Axes><sees.SkeletalRenderer at 0x7fb589684a90> Eigenvalue Analysis   Let’s get the first 6 periods of the structure to see if they coincide with the ones in paper. +eigenvalues = model.eigen(6) T_list = 2*np.pi/np.sqrt(eigenvalues) print('The first 6 period of the structure are as follows:\\n', T_list)Output: +The first 6 period of the structure are as follows: [0.07189215 0.06809579 0.06809578 0.04648394 0.04648388 0.03117022] Dynamic Analysis   Great accordance is obtained in eigenvalue analysis. Now, let’s do wipeAnalysis() and perform dynamic analysis. The Newmark time integration algorithm with γ=0.5\\gamma=0.5 and β=0.25\\beta=0.25 (Constant Average Acceleration Algorithm) is used. Harmonic loads are applied vertically on the loaded_nodes nodes. +model.wipeAnalysis() # define load function P = lambda t: 250*np.sin(250*t) # Dynamic Analysis Parameters dt = 0.00025 time = 0.2 time_domain = np.arange(0,time,dt) # Adding loads to the domain beautifully model.timeSeries('Path', 1, dt=dt, values=np.vectorize(P)(time_domain), time=time_domain) model.pattern('Plain', 1, 1) for n in loaded_nodes: model.load(n, *[0,0,-1]) # Analysis model.constraints('Plain') model.numberer('Plain') model.system('ProfileSPD') model.test('NormUnbalance', 0.0000001, 100) model.algorithm('ModifiedNewton') model.integrator('Newmark', 0.5, 0.25) model.analysis('Transient')time_lst =[] # list to hold time stations for plotting d_apex_list = [] # list to hold vertical displacments of the apex for i in range(len(time_domain)): is_done = model.analyze(1, dt) if is_done != 0: print('Failed to Converge!') break time_lst.append(model.getTime()) d_apex_list.append(model.nodeDisp(362,3)) Visualization   Below, the time history of the vertical displacement of the apex is plotted. +plt.figure(figsize=(12,4)) plt.plot(time_lst, np.array(d_apex_list), color = '#d62d20', linewidth=1.75) plt.ylabel('Vertical Displacement (m)', 'fontstyle':'italic','size':14) plt.xlabel('Time (sec)', 'fontstyle':'italic','size':14) plt.xlim([0.0, time]) plt.grid() plt.yticks(fontsize = 14) plt.xticks(fontsize = 14);Output: +<Figure size 1200x400 with 1 Axes> Closure   Very good agreements with the paper are obtained. +Namadchi, Amir Hossein, Farhang Fattahi, and Javad Alamatian. "Semiexplicit Unconditionally Stable Time Integration for Dynamic Analysis Based on Composite Scheme." Journal of Engineering Mechanics 143, no. 10 (2017): 04017119.`}).add({id:41,tag:"en",href:"/opensees-gallery/examples/shellframe/",title:"Shell Diaphragms",description:"",content:""}).add({id:42,tag:"en",href:"/opensees-gallery/examples/pendulum/",title:"Simple Pendulum",description:"This example investigates a simple pendulum using the corotational truss element.",content:`This example investigates a simple pendulum using the corotational truss element. +1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 # # Adapted from https://portwooddigital.com/2022/08/14/parametric-oscillator/ # # Claudio Perez # import opensees.openseespy as ops def create_pendulum(m, k, L, W): # Create a model with 2 dimensions (ndm) # and 2 degrees of freedom per node (ndf) model = ops.Model(ndm=2, ndf=2) # Create a node for the pivot point and fix it model.node(1, 0, L); model.fix(1, 1, 1) # Create a free node with the mass model.node(2, 0, 0); model.mass(2, m, m) # Create a corotational truss between nodes 1 and 2 model.uniaxialMaterial('Elastic', 1, k*L) model.element('CorotTruss', 1, 1, 2, 1.0, 1) # Initial displacements model.setNodeDisp(2, 1, 0.05*L, '-commit') model.setNodeDisp(2, 2, -W/k-(W/k+L)/3, '-commit') # Pendulum weight model.timeSeries('Constant', 1) model.pattern('Plain', 1, 1) model.load(2, 0, -W) return model def analyze_pendulum(model): model.algorithm('Newton') model.integrator('Newmark',0.5,0.25) model.analysis('Transient') Tmax = 12*sec dt = 0.01*sec Nsteps = int(Tmax/dt) u = [] for i in range(Nsteps): model.analyze(1, dt) u.append(model.nodeDisp(2)) return u if __name__ == "__main__": from opensees.units.ips import inch, sec, gravity as g # Length of pendulum L = 10*inch # Pendulum mass m = 1.0 # Frequency of pendulum omega = (g/L)**0.5 # Frequency of oscillator w = 2*omega # Stiffness of spring k = m*w**2 model = create_pendulum(m, k, L, m*g) u = analyze_pendulum(model) print(u)`}).add({id:43,tag:"en",href:"/opensees-gallery/examples/example6/",title:"Simply Supported Solid Beam",description:`In this example a simply supported beam is modelled with two dimensional solid elements. The example is implemented in both Tcl and Python: +Example6.tcl Example6.py Each node of the analysis has two displacement degrees of freedom. Thus the model is defined with ndm = 2 and ndf = 2. +A mesh is generated using the block2D command. The number of nodes in the local xx -direction of the block is nxnx and the number of nodes in the local yy -direction of the block is nyny .`,content:`In this example a simply supported beam is modelled with two dimensional solid elements. The example is implemented in both Tcl and Python: +Example6.tcl Example6.py Each node of the analysis has two displacement degrees of freedom. Thus the model is defined with ndm = 2 and ndf = 2. +A mesh is generated using the block2D command. The number of nodes in the local xx -direction of the block is nxnx and the number of nodes in the local yy -direction of the block is nyny . The block2D generation nodes 1,2,3,4 are prescribed to define the two dimensional domain of the beam, which is of size 40×1040\\times10 . +Three different quadrilateral elements can be used for the analysis. These may be created using the names "BbarQuad", "EnhancedQuad" or "Quad". This is a plane strain problem. An elastic isotropic material is used. +For initial gravity load analysis, a single load pattern with a linear time series and two vertical nodal loads are used. +A solution algorithm of type Newton is used for the problem. The solution algorithm uses a ConvergenceTest which tests convergence on the norm of the energy increment vector. Ten static load steps are performed. +Following the static analysis, the wipeAnalysis and remove loadPatern commands are used to remove the nodal loads and create a new analysis. The nodal displacements have not changed. However, with the external loads removed the structure is no longer in static equilibrium. +The integrator for the dynamic analysis if of type GeneralizedMidpoint with α=0.5\\alpha = 0.5 . This choice is uconditionally stable and energy conserving for linear problems. Additionally, this integrator conserves linear and angular momentum for both linear and non-linear problems. The dynamic analysis is performed using 100100 time increments with a time step Δt=0.50\\Delta t = 0.50 . +The results consist of the file Node.out, which contains a line for every time step. Each line contains the time and the vertical displacement at the bottom center of the beam. The time history is shown in Figure 1. +`}).add({id:44,tag:"en",href:"/opensees-gallery/docs/advanced-settings/styles/",title:"Styles",description:"Use extensible Sass files to generate the stylesheets for your website.",content:""}).add({id:45,tag:"en",href:"/opensees-gallery/examples/shelltwist/",title:"Twisted Cantilever",description:"",content:""}).add({id:46,tag:"en",href:"/opensees-gallery/examples/wrench/",title:"Wrench",description:"Static analysis of a wrench",content:`This problem is adapted from Logan (2012), Problem 7–28. +Script: model.py +1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 # ===----------------------------------------------------------------------===// # # OpenSees - Open System for Earthquake Engineering Simulation # Structural Artificial Intelligence Laboratory # stairlab.berkeley.edu # # ===----------------------------------------------------------------------===// # # Static analysis of a wrench in the plane. # # The mesh is created from 7 blocks: # ______ # / / # / / # / / # / / # / / # / / # / / # / / # / 7 / # /_____/ ____ # / \\ # / 6 \\ 70 # /_____________\\ ____ # | \\ / | # | \\ 3 / | 20 # | 4 \\_______/ 2 | _________ # |___/ \\___| ____ 20 # \\5 | | 1/ 70 # \\_| |_/ __ # . o ____ __ 10 # ^ # # # # Chrystal Chern and Claudio Perez # import sees import opensees.openseespy as ops import numpy as np angwrench = np.arctan(1/5) # Quadrilateral blocks that comprise the wrench: blocks = 1: 1: [ 0, 0], 2: [ 20, 10], 3: [ 40, 160-70-40], 4: [ 0, 160-70-40], 6: [ 35, 30], # 6: [ 25, 30], 2: 1: [ 0, 160-70-40], 2: [ 40, 160-70-40], # 6: [ 45, 160-70-20], 3: [ 40, 160-70 ], 4: [ -20, 160-70-20], 3: 1: [ -20, 160-70-20], 2: [ 40, 160-70 ], 3: [-115, 160-70 ], 4: [ -60, 70], 4: 1: [ -60, 70], 2: [-115, 90], 3: [-115, 50], 4: [ -75, 50], 5: 1: [ -75, 50], 2: [-115, 50], 3: [ -95, 10], 4: [ -75, 0], 6: 1: [ 40, 90], 5: [ 33, 112], 2: [ 0, 160], 3: [-50*np.cos(angwrench), 160 + 50*np.sin(angwrench)], 4: [-115, 160-70 ], 7: 1: [ 0, 160], 2: [250*np.sin(angwrench), 160+250*np.cos(angwrench)], 3: [250*np.sin(angwrench)-50*np.cos(angwrench), 160+250*np.cos(angwrench)], 4: [-50*np.cos(angwrench), 160+ 50*np.sin(angwrench)] # Subdivisions to create within each block: divs = 1: (3,3), 2: (3,3), 3: (3,4), 4: (3,3), 5: (3,3), 6: (4,4), 7: (6,4) def create_quads(): model = ops.Model(ndm=2, ndf=2) model.nDMaterial("ElasticIsotropic", 1, 200e3, 0.25) for num,block in blocks.items(): model.surface(divs[num], element="quad", args=(1, "PlaneStrain", 1), points = block) return model def create_tris(): model = ops.Model(ndm=2, ndf=2) model.nDMaterial("ElasticIsotropic", 1, 200e3, 0.25) elem = 1 for num,block in blocks.items(): # Because no element argument is passed, only nodes are created. # Next we will go back over the newly created cells and manually # create triangles. mesh = model.surface(divs[num], points = block) # For each new 4-node cell, create two triangles for cell in mesh.cells: nodes = mesh.cells[cell] model.element("tri31", elem, (nodes[0], nodes[1], nodes[2]), 10, "PlaneStrain", 1) model.element("tri31", elem+1, (nodes[0], nodes[2], nodes[3]), 10, "PlaneStrain", 1) elem += 2 return model def create_boundary(model): # Load magnitude P = 700 # Fix the first node, which is at (0.0, 0.0) model.fix(1, 1, 1) # Create a load pattern model.pattern("Plain", 1, "Linear") for node in model.getNodeTags(): coord = model.nodeCoord(node) # Fix corner of block 4 if np.linalg.norm(np.array(coord) - blocks[4][4]) < 1e-12: model.fix(node, 1,1) # Add load to the corner of block 7 elif np.linalg.norm(np.array(coord) - blocks[7][3]) < 1e-12: model.load(node, (P, 0), pattern=1) #model = create_quads() model = create_tris() create_boundary(model) model.analysis("Static") model.integrator("LoadControl", 1) model.analyze(1) # Render the deformed shape sees.serve(sees.render(model, lambda i: [500*u for u in model.nodeDisp(i)], canvas="gltf")) References   Logan, D.L. (2012) A First Course in the Finite Element Method. 5th ed. Stamford, CT: Cengage Learning.`}),search.addEventListener("input",showResults,!0)}function hideSuggestions(e){var isClickInsideElement=suggestions.contains(e.target);isClickInsideElement||(suggestions.classList.add("d-none"),background!==null&&background.style.setProperty("--image-opacity","0.1"))}function inputFocus(e){e.ctrlKey&&e.key==="/"&&(e.preventDefault(),search.focus()),e.key==="Escape"&&(search.blur(),suggestions.classList.add("d-none"))}function suggestionFocus(e){const suggestionsHidden=suggestions.classList.contains("d-none");if(suggestionsHidden)return;const focusableSuggestions=[...suggestions.querySelectorAll("a")];if(focusableSuggestions.length===0)return;const index=focusableSuggestions.indexOf(document.activeElement);if(e.key==="ArrowUp"){e.preventDefault();const nextIndex=index>0?index-1:0;focusableSuggestions[nextIndex].focus()}else if(e.key==="ArrowDown"){e.preventDefault();const nextIndex=index+1r.result)){if(flatResults.has(result.doc.href))continue;flatResults.set(result.doc.href,result.doc)}if(suggestions.innerHTML="",suggestions.classList.remove("d-none"),flatResults.size===0&&searchQuery){const msg=suggestions.dataset.noResults,noResultsMessage=document.createElement("div");noResultsMessage.innerHTML=`${msg} "${searchQuery}"`,noResultsMessage.classList.add("suggestion__no-results"),suggestions.appendChild(noResultsMessage);return}for(const[href,doc]of flatResults){const entry=document.createElement("div");suggestions.appendChild(entry);const a=document.createElement("a");a.href=href,entry.appendChild(a);const title=document.createElement("span");title.classList.add("text-start"),title.textContent=doc.title,title.classList.add("suggestion__title"),a.appendChild(title);const description=document.createElement("span");if(description.textContent=doc.description,description.classList.add("suggestion__description"),a.appendChild(description),suggestions.appendChild(entry),suggestions.childElementCount==maxResult)break}}search!==null&&suggestions!==null&&(document.addEventListener("keydown",inputFocus),document.addEventListener("keydown",suggestionFocus),document.addEventListener("click",hideSuggestions),initIndex());const searchModal=document.getElementById("search-modal");searchModal!==null&&searchModal.addEventListener("shown.bs.modal",function(){const searchInput=document.getElementById("search-input-modal");searchInput!==null&&searchInput.focus({focusVisible:!0})}),document.querySelectorAll(".dynamic-svg").forEach(placeholder=>{placeholder.onload=function(){const container=placeholder.parentElement,doc=placeholder.contentDocument,attr=placeholder.getAttribute("data-class"),style=placeholder.getAttribute("data-style");if(container!==null&&doc!==null){const svg=doc.querySelector("svg");svg!==null&&(svg.setAttribute("class","svg-inline--fa "+(attr||"")),svg.setAttribute("fill","currentcolor"),svg.setAttribute("aria-hidden","true"),svg.setAttribute("role","img"),style!==null&&style!==""&&svg.setAttribute("style",style),svg.removeAttribute("height"),svg.removeAttribute("width"),container.innerHTML="",container.appendChild(svg))}}});const fixed=!0,navbar=document.querySelector(".navbar"),togglers=document.querySelectorAll(".main-nav-toggler"),modeSelectors=document.querySelectorAll(".switch-mode-collapsed"),colorsBG=["body","secondary","tertiary"];function updateNavbar(){if(window.scrollY>75){navbar.classList.add("nav-active");const storedTheme=localStorage.getItem("theme");navbar.setAttribute("data-bs-theme",storedTheme)}else{navbar.classList.remove("nav-active");const defaultTheme=navbar.getAttribute("data-bs-overlay");defaultTheme&&navbar.setAttribute("data-bs-theme",defaultTheme)}}if(navbar!==null&&window.performance.getEntriesByType&&window.performance.getEntriesByType("navigation")[0].type==="reload"&&fixed&&updateNavbar(),navbar!==null&&togglers!==null){const html=document.querySelector("html"),config={attributes:!0,attributeFilter:["data-bs-theme"]},Observer=new MutationObserver(mutationrecords=>{fixed&&updateNavbar()});Observer.observe(html,config);const color=navbar.getAttribute("data-navbar-color")||"body",bg=colorsBG.includes(color)?`var(--bs-${color}-bg)`:`var(--bs-navbar-color-${color})`;navbar.style.setProperty("--bs-navbar-expanded-color",bg),window.onscroll=()=>{fixed&&updateNavbar()};for(let i=0;i{navbar.classList.toggle("navbar-expanded")};for(let i=0;i{for(let j=0;jnew bootstrap.Popover(popoverTriggerEl)),container=document.getElementById("toast-container");container!==null&&document.querySelectorAll("[data-toast-target]").forEach(trigger=>{const target=document.getElementById(trigger.getAttribute("data-toast-target"));if(target!==null){container.appendChild(target);const toast=bootstrap.Toast.getOrCreateInstance(target);toast!==null&&trigger.addEventListener("click",()=>{toast.show()})}});const tooltipTriggerList=document.querySelectorAll('[data-bs-toggle="tooltip"]'),tooltipList=[...tooltipTriggerList].map(tooltipTriggerEl=>new bootstrap.Tooltip(tooltipTriggerEl));document.querySelectorAll("[data-video-padding]").forEach(element=>{element.style.paddingBottom=element.getAttribute("data-video-padding")}) \ No newline at end of file diff --git a/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialCompression-1200x937.webp b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialCompression-1200x937.webp new file mode 100644 index 0000000..f9c13c3 Binary files /dev/null and b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialCompression-1200x937.webp differ diff --git a/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialCompression-1400x1093.webp b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialCompression-1400x1093.webp new file mode 100644 index 0000000..f9c13c3 Binary files /dev/null and b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialCompression-1400x1093.webp differ diff --git a/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialCompression-2800x2186.png b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialCompression-2800x2186.png new file mode 100644 index 0000000..3176f90 Binary files /dev/null and b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialCompression-2800x2186.png differ diff --git a/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialCompression-2800x2186.webp b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialCompression-2800x2186.webp new file mode 100644 index 0000000..f9c13c3 Binary files /dev/null and b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialCompression-2800x2186.webp differ diff --git a/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialCompression-576x450.webp b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialCompression-576x450.webp new file mode 100644 index 0000000..4eef72b Binary files /dev/null and b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialCompression-576x450.webp differ diff --git a/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialCompression-768x600.webp b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialCompression-768x600.webp new file mode 100644 index 0000000..f9c13c3 Binary files /dev/null and b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialCompression-768x600.webp differ diff --git a/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialCompression-992x774.webp b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialCompression-992x774.webp new file mode 100644 index 0000000..f9c13c3 Binary files /dev/null and b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialCompression-992x774.webp differ diff --git a/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialTension-1200x937.webp b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialTension-1200x937.webp new file mode 100644 index 0000000..efc1bbf Binary files /dev/null and b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialTension-1200x937.webp differ diff --git a/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialTension-1400x1093.webp b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialTension-1400x1093.webp new file mode 100644 index 0000000..efc1bbf Binary files /dev/null and b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialTension-1400x1093.webp differ diff --git a/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialTension-2800x2186.png b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialTension-2800x2186.png new file mode 100644 index 0000000..45dcce4 Binary files /dev/null and b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialTension-2800x2186.png differ diff --git a/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialTension-2800x2186.webp b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialTension-2800x2186.webp new file mode 100644 index 0000000..efc1bbf Binary files /dev/null and b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialTension-2800x2186.webp differ diff --git a/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialTension-576x450.webp b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialTension-576x450.webp new file mode 100644 index 0000000..996417f Binary files /dev/null and b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialTension-576x450.webp differ diff --git a/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialTension-768x600.webp b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialTension-768x600.webp new file mode 100644 index 0000000..efc1bbf Binary files /dev/null and b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialTension-768x600.webp differ diff --git a/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialTension-992x774.webp b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialTension-992x774.webp new file mode 100644 index 0000000..efc1bbf Binary files /dev/null and b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_CyclicUniaxialTension-992x774.webp differ diff --git a/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-1200x1111.webp b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-1200x1111.webp new file mode 100644 index 0000000..f0372e6 Binary files /dev/null and b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-1200x1111.webp differ diff --git a/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-1280x640.png b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-1280x640.png new file mode 100644 index 0000000..432fc5d Binary files /dev/null and b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-1280x640.png differ diff --git a/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-1400x1296.webp b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-1400x1296.webp new file mode 100644 index 0000000..f0372e6 Binary files /dev/null and b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-1400x1296.webp differ diff --git a/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-2800x2591.png b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-2800x2591.png new file mode 100644 index 0000000..60b2841 Binary files /dev/null and b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-2800x2591.png differ diff --git a/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-2800x2591.webp b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-2800x2591.webp new file mode 100644 index 0000000..f0372e6 Binary files /dev/null and b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-2800x2591.webp differ diff --git a/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-576x533.webp b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-576x533.webp new file mode 100644 index 0000000..f0372e6 Binary files /dev/null and b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-576x533.webp differ diff --git a/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-768x711.webp b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-768x711.webp new file mode 100644 index 0000000..f0372e6 Binary files /dev/null and b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-768x711.webp differ diff --git a/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-992x918.webp b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-992x918.webp new file mode 100644 index 0000000..f0372e6 Binary files /dev/null and b/opensees-gallery/examples/concretesurface/img/ASDConcrete3D_Ex_Surface_Output-992x918.webp differ diff --git a/opensees-gallery/img/sign-light-1200x1096.webp b/opensees-gallery/img/sign-light-1200x1096.webp new file mode 100644 index 0000000..2fd3f19 Binary files /dev/null and b/opensees-gallery/img/sign-light-1200x1096.webp differ diff --git a/opensees-gallery/img/sign-light-1400x1279.webp b/opensees-gallery/img/sign-light-1400x1279.webp new file mode 100644 index 0000000..475a124 Binary files /dev/null and b/opensees-gallery/img/sign-light-1400x1279.webp differ diff --git a/opensees-gallery/img/sign-light-2800x2558.png b/opensees-gallery/img/sign-light-2800x2558.png new file mode 100644 index 0000000..dbee5cd Binary files /dev/null and b/opensees-gallery/img/sign-light-2800x2558.png differ diff --git a/opensees-gallery/img/sign-light-2800x2558.webp b/opensees-gallery/img/sign-light-2800x2558.webp new file mode 100644 index 0000000..ca7221e Binary files /dev/null and b/opensees-gallery/img/sign-light-2800x2558.webp differ diff --git a/opensees-gallery/img/sign-light-576x526.webp b/opensees-gallery/img/sign-light-576x526.webp new file mode 100644 index 0000000..6edc654 Binary files /dev/null and b/opensees-gallery/img/sign-light-576x526.webp differ diff --git a/opensees-gallery/img/sign-light-768x702.webp b/opensees-gallery/img/sign-light-768x702.webp new file mode 100644 index 0000000..9f1ae22 Binary files /dev/null and b/opensees-gallery/img/sign-light-768x702.webp differ diff --git a/opensees-gallery/img/sign-light-992x906.webp b/opensees-gallery/img/sign-light-992x906.webp new file mode 100644 index 0000000..a2d5817 Binary files /dev/null and b/opensees-gallery/img/sign-light-992x906.webp differ diff --git a/releases/index.html b/releases/index.html index b80c887..cf6338a 100644 --- a/releases/index.html +++ b/releases/index.html @@ -25,7 +25,7 @@ - + @@ -971,7 +971,7 @@ - + diff --git a/sitemap.xml b/sitemap.xml index ff6778a..736144d 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -6,13 +6,13 @@ 2024-09-19T09:17:28-07:00 https://stairlab.github.io/opensees-gallery/examples/example3/ - 2024-09-09T12:37:31-07:00 + 2024-09-25T12:16:10-07:00 https://stairlab.github.io/opensees-gallery/examples/example7/ - 2024-09-09T12:37:31-07:00 + 2024-09-25T12:16:10-07:00 https://stairlab.github.io/opensees-gallery/examples/example8/ - 2024-09-19T09:17:28-07:00 + 2024-09-25T12:16:10-07:00 https://stairlab.github.io/opensees-gallery/examples/example2/ 2024-09-09T12:37:31-07:00 @@ -75,7 +75,7 @@ 2024-09-19T09:17:28-07:00 https://stairlab.github.io/opensees-gallery/examples/cablestayed/ - 2024-09-19T10:02:47-07:00 + 2024-09-25T12:16:10-07:00 https://stairlab.github.io/opensees-gallery/examples/frameshear/ 2024-09-19T09:17:28-07:00 @@ -87,10 +87,10 @@ 2024-09-13T13:22:57-07:00 https://stairlab.github.io/opensees-gallery/tags/concrete/ - 2024-09-19T09:17:28-07:00 + 2024-09-25T12:16:10-07:00 https://stairlab.github.io/opensees-gallery/examples/concretesurface/ - 2024-09-19T09:17:28-07:00 + 2024-09-25T12:16:10-07:00 https://stairlab.github.io/opensees-gallery/examples/soliddam/ 2024-09-19T09:17:28-07:00 @@ -99,13 +99,13 @@ 2024-09-13T09:48:08-07:00 https://stairlab.github.io/opensees-gallery/tags/dynamic/ - 2024-09-19T09:17:28-07:00 + 2024-09-25T12:16:10-07:00 https://stairlab.github.io/opensees-gallery/examples/mrf_concentrated/ 2024-09-19T09:17:28-07:00 https://stairlab.github.io/opensees-gallery/tags/dynamics/ - 2024-09-19T09:17:28-07:00 + 2024-09-25T12:16:10-07:00 https://stairlab.github.io/opensees-gallery/tags/eigen/ 2024-09-19T09:17:28-07:00 @@ -120,7 +120,7 @@ 2024-09-19T09:17:28-07:00 https://stairlab.github.io/opensees-gallery/tags/frame/ - 2024-09-19T09:17:28-07:00 + 2024-10-02T19:39:51-07:00 https://stairlab.github.io/opensees-gallery/docs/library/frame/ 2024-09-13T13:22:57-07:00 @@ -147,7 +147,7 @@ 2024-09-09T14:30:36-07:00 https://stairlab.github.io/opensees-gallery/examples/framebuckling/ - 2024-09-19T09:17:28-07:00 + 2024-10-02T19:39:51-07:00 https://stairlab.github.io/opensees-gallery/tags/notebook/ 2024-09-19T09:17:28-07:00 @@ -156,27 +156,28 @@ 2024-09-19T09:17:28-07:00 https://stairlab.github.io/opensees-gallery/tags/python/ - 2024-09-19T10:02:47-07:00 + 2024-10-02T19:39:51-07:00 https://stairlab.github.io/opensees-gallery/docs/getting-started/python/ 2024-09-13T09:48:08-07:00 https://stairlab.github.io/opensees-gallery/examples/spectrum/ - 2024-09-19T09:17:28-07:00 + 2024-09-25T12:16:10-07:00 https://stairlab.github.io/opensees-gallery/examples/sathertower/ + 2024-09-25T12:16:10-07:00 https://stairlab.github.io/opensees-gallery/tags/sdof/ 2024-09-19T09:17:28-07:00 https://stairlab.github.io/opensees-gallery/examples/sensitivity/ - 2024-09-23T15:35:45-07:00 + 2024-09-25T12:16:10-07:00 https://stairlab.github.io/opensees-gallery/examples/shallowdome/ 2024-09-19T09:17:28-07:00 https://stairlab.github.io/opensees-gallery/tags/shell/ - 2024-09-19T09:17:28-07:00 + 2024-09-25T12:16:10-07:00 https://stairlab.github.io/opensees-gallery/examples/shellframe/ 2024-09-19T09:17:28-07:00 @@ -188,16 +189,16 @@ 2024-09-09T12:37:31-07:00 https://stairlab.github.io/opensees-gallery/tags/solid/ - 2024-09-19T09:17:28-07:00 + 2024-09-25T12:16:10-07:00 https://stairlab.github.io/opensees-gallery/tags/static/ 2024-09-19T09:17:28-07:00 https://stairlab.github.io/opensees-gallery/tags/ - 2024-09-19T10:02:47-07:00 + 2024-10-02T19:39:51-07:00 https://stairlab.github.io/opensees-gallery/tags/tcl/ - 2024-09-19T10:02:47-07:00 + 2024-10-02T19:39:51-07:00 https://stairlab.github.io/opensees-gallery/tags/truss/ 2024-09-19T09:17:28-07:00 diff --git a/tags/2d/index.html b/tags/2d/index.html index 84cfcdc..88d6b05 100644 --- a/tags/2d/index.html +++ b/tags/2d/index.html @@ -25,7 +25,7 @@ - + @@ -665,7 +665,7 @@ - + diff --git a/tags/3d/index.html b/tags/3d/index.html index 6e9fb6f..6a6e419 100644 --- a/tags/3d/index.html +++ b/tags/3d/index.html @@ -25,7 +25,7 @@ - + @@ -665,7 +665,7 @@ - + diff --git a/tags/component/index.html b/tags/component/index.html index 63b6f7b..e061fc5 100644 --- a/tags/component/index.html +++ b/tags/component/index.html @@ -25,7 +25,7 @@ - + @@ -666,7 +666,7 @@ - + diff --git a/tags/concrete/index.html b/tags/concrete/index.html index 002f243..f3416bd 100644 --- a/tags/concrete/index.html +++ b/tags/concrete/index.html @@ -25,7 +25,7 @@ - + @@ -109,7 +109,7 @@ "about": { "@id": "https://stairlab.github.io/#/schema/organization/1" }, - "dateModified": "2024-09-19T09:17:28CET","breadcrumb": { + "dateModified": "2024-09-25T12:16:10CET","breadcrumb": { "@id": "https://stairlab.github.io/opensees-gallery/tags/concrete/#/schema/breadcrumb/1" }, "primaryImageOfPage": { @@ -693,7 +693,7 @@ - + diff --git a/tags/dynamic/index.html b/tags/dynamic/index.html index 64acd43..257c4b3 100644 --- a/tags/dynamic/index.html +++ b/tags/dynamic/index.html @@ -25,7 +25,7 @@ - + @@ -109,7 +109,7 @@ "about": { "@id": "https://stairlab.github.io/#/schema/organization/1" }, - "dateModified": "2024-09-19T09:17:28CET","breadcrumb": { + "dateModified": "2024-09-25T12:16:10CET","breadcrumb": { "@id": "https://stairlab.github.io/opensees-gallery/tags/dynamic/#/schema/breadcrumb/1" }, "primaryImageOfPage": { @@ -707,7 +707,7 @@ - + diff --git a/tags/dynamics/index.html b/tags/dynamics/index.html index a65b173..d72d681 100644 --- a/tags/dynamics/index.html +++ b/tags/dynamics/index.html @@ -25,7 +25,7 @@ - + @@ -109,7 +109,7 @@ "about": { "@id": "https://stairlab.github.io/#/schema/organization/1" }, - "dateModified": "2024-09-19T09:17:28CET","breadcrumb": { + "dateModified": "2024-09-25T12:16:10CET","breadcrumb": { "@id": "https://stairlab.github.io/opensees-gallery/tags/dynamics/#/schema/breadcrumb/1" }, "primaryImageOfPage": { @@ -665,7 +665,7 @@ - + diff --git a/tags/eigen/index.html b/tags/eigen/index.html index bc1aa99..1b3404a 100644 --- a/tags/eigen/index.html +++ b/tags/eigen/index.html @@ -25,7 +25,7 @@ - + @@ -665,7 +665,7 @@ - + diff --git a/tags/fiber/index.html b/tags/fiber/index.html index 68fb473..a7a9faf 100644 --- a/tags/fiber/index.html +++ b/tags/fiber/index.html @@ -25,7 +25,7 @@ - + @@ -679,7 +679,7 @@ - + diff --git a/tags/frame/index.html b/tags/frame/index.html index d845751..c501aa0 100644 --- a/tags/frame/index.html +++ b/tags/frame/index.html @@ -25,7 +25,7 @@ - + @@ -109,7 +109,7 @@ "about": { "@id": "https://stairlab.github.io/#/schema/organization/1" }, - "dateModified": "2024-09-19T09:17:28CET","breadcrumb": { + "dateModified": "2024-10-02T19:39:51CET","breadcrumb": { "@id": "https://stairlab.github.io/opensees-gallery/tags/frame/#/schema/breadcrumb/1" }, "primaryImageOfPage": { @@ -735,7 +735,7 @@ - + diff --git a/tags/frame/index.xml b/tags/frame/index.xml index c2b5302..c53f443 100644 --- a/tags/frame/index.xml +++ b/tags/frame/index.xml @@ -48,7 +48,7 @@ https://stairlab.github.io/opensees-gallery/examples/framebuckling/ Mon, 01 Jan 0001 00:00:00 +0000 https://stairlab.github.io/opensees-gallery/examples/framebuckling/ - Corotational frame elements are used to approximate Euler&rsquo;s buckling load, which is given by: Peuler=π2EIL2 P_{\mathrm{euler}} = \frac{\pi^2 EI}{L^2} This example is adapted from https://github.com/denavit/OpenSees-Examples&nbsp; . The files for the problem are buckling.py for Python, and buckling.tcl for Tcl. λ=PL2EI[1−P/(ksGA)]=PL2χEIχ=1−P/(ksGA)P=χλ2EI/L2. \begin{gathered} \lambda=\sqrt{\frac{P L^2}{E I\left[1-P /\left(k_{\mathrm{s}} G A\right)\right]}}=\sqrt{\frac{P L^2}{\chi E I}} \\ \chi=1-P /\left(k_{\mathrm{s}} G A\right) \\ P=\chi \lambda^2 E I / L^2 . \end{gathered} χ=11+λ2EI/(ksGAL2)=11+λ2φ/12P=λ2EI/L21+λ2φ/12. \begin{gathered} \chi=\frac{1}{1+\lambda^2 E I /\left(k_{\mathrm{s}} G A L^2\right)}=\frac{1}{1+\lambda^2 \varphi / 12} \\ P=\frac{\lambda^2 E I / L^2}{1+\lambda^2 \varphi / 12} . + Corotational frame elements are used to approximate Euler&rsquo;s buckling load, which is given by: Peuler=π2EIL2 P_{\mathrm{euler}} = \frac{\pi^2 EI}{L^2} This example is adapted from https://github.com/denavit/OpenSees-Examples&nbsp; . The files for the problem are buckling.py for Python, and buckling.tcl for Tcl. Theory &nbsp; Buckling Analysis &nbsp; Loosely speaking, buckling happens when there are multiple shapes that a structure can deform into that will be in equilibrium with it&rsquo;s applied loads. This implies that at the point of buckling, there are multiple independent displacement increments u\bm{u} which will be mapped to the same resisting load by the tangent K\bm{K} .
          diff --git a/tags/index.html b/tags/index.html index 984beea..c5e53f8 100644 --- a/tags/index.html +++ b/tags/index.html @@ -25,7 +25,7 @@ - + @@ -109,7 +109,7 @@ "about": { "@id": "https://stairlab.github.io/#/schema/organization/1" }, - "dateModified": "2024-09-19T10:02:47CET","breadcrumb": { + "dateModified": "2024-10-02T19:39:51CET","breadcrumb": { "@id": "https://stairlab.github.io/opensees-gallery/tags/#/schema/breadcrumb/1" }, "primaryImageOfPage": { @@ -801,7 +801,7 @@ - + diff --git a/tags/notebook/index.html b/tags/notebook/index.html index 01171c7..c9cbf09 100644 --- a/tags/notebook/index.html +++ b/tags/notebook/index.html @@ -25,7 +25,7 @@ - + @@ -679,7 +679,7 @@ - + diff --git a/tags/plane/index.html b/tags/plane/index.html index e7dda93..e302a99 100644 --- a/tags/plane/index.html +++ b/tags/plane/index.html @@ -25,7 +25,7 @@ - + @@ -679,7 +679,7 @@ - + diff --git a/tags/python/index.html b/tags/python/index.html index 3cc5da3..b5993d0 100644 --- a/tags/python/index.html +++ b/tags/python/index.html @@ -25,7 +25,7 @@ - + @@ -109,7 +109,7 @@ "about": { "@id": "https://stairlab.github.io/#/schema/organization/1" }, - "dateModified": "2024-09-19T10:02:47CET","breadcrumb": { + "dateModified": "2024-10-02T19:39:51CET","breadcrumb": { "@id": "https://stairlab.github.io/opensees-gallery/tags/python/#/schema/breadcrumb/1" }, "primaryImageOfPage": { @@ -891,7 +891,7 @@ - + diff --git a/tags/python/index.xml b/tags/python/index.xml index 3ed4291..b360e17 100644 --- a/tags/python/index.xml +++ b/tags/python/index.xml @@ -111,7 +111,7 @@ https://stairlab.github.io/opensees-gallery/examples/framebuckling/ Mon, 01 Jan 0001 00:00:00 +0000 https://stairlab.github.io/opensees-gallery/examples/framebuckling/ - Corotational frame elements are used to approximate Euler&rsquo;s buckling load, which is given by: Peuler=π2EIL2 P_{\mathrm{euler}} = \frac{\pi^2 EI}{L^2} This example is adapted from https://github.com/denavit/OpenSees-Examples&nbsp; . The files for the problem are buckling.py for Python, and buckling.tcl for Tcl. λ=PL2EI[1−P/(ksGA)]=PL2χEIχ=1−P/(ksGA)P=χλ2EI/L2. \begin{gathered} \lambda=\sqrt{\frac{P L^2}{E I\left[1-P /\left(k_{\mathrm{s}} G A\right)\right]}}=\sqrt{\frac{P L^2}{\chi E I}} \\ \chi=1-P /\left(k_{\mathrm{s}} G A\right) \\ P=\chi \lambda^2 E I / L^2 . \end{gathered} χ=11+λ2EI/(ksGAL2)=11+λ2φ/12P=λ2EI/L21+λ2φ/12. \begin{gathered} \chi=\frac{1}{1+\lambda^2 E I /\left(k_{\mathrm{s}} G A L^2\right)}=\frac{1}{1+\lambda^2 \varphi / 12} \\ P=\frac{\lambda^2 E I / L^2}{1+\lambda^2 \varphi / 12} . + Corotational frame elements are used to approximate Euler&rsquo;s buckling load, which is given by: Peuler=π2EIL2 P_{\mathrm{euler}} = \frac{\pi^2 EI}{L^2} This example is adapted from https://github.com/denavit/OpenSees-Examples&nbsp; . The files for the problem are buckling.py for Python, and buckling.tcl for Tcl. Theory &nbsp; Buckling Analysis &nbsp; Loosely speaking, buckling happens when there are multiple shapes that a structure can deform into that will be in equilibrium with it&rsquo;s applied loads. This implies that at the point of buckling, there are multiple independent displacement increments u\bm{u} which will be mapped to the same resisting load by the tangent K\bm{K} . RotD Spectrum diff --git a/tags/python/page/2/index.html b/tags/python/page/2/index.html index 51edcec..72dc565 100644 --- a/tags/python/page/2/index.html +++ b/tags/python/page/2/index.html @@ -25,7 +25,7 @@ - + @@ -109,7 +109,7 @@ "about": { "@id": "https://stairlab.github.io/#/schema/organization/1" }, - "dateModified": "2024-09-19T10:02:47CET","breadcrumb": { + "dateModified": "2024-10-02T19:39:51CET","breadcrumb": { "@id": "https://stairlab.github.io/opensees-gallery/tags/python/#/schema/breadcrumb/1" }, "primaryImageOfPage": { @@ -893,7 +893,7 @@ - + diff --git a/tags/sdof/index.html b/tags/sdof/index.html index 849b8a6..942a318 100644 --- a/tags/sdof/index.html +++ b/tags/sdof/index.html @@ -25,7 +25,7 @@ - + @@ -665,7 +665,7 @@ - + diff --git a/tags/shell/index.html b/tags/shell/index.html index 3f281d5..0e291e6 100644 --- a/tags/shell/index.html +++ b/tags/shell/index.html @@ -25,7 +25,7 @@ - + @@ -109,7 +109,7 @@ "about": { "@id": "https://stairlab.github.io/#/schema/organization/1" }, - "dateModified": "2024-09-19T09:17:28CET","breadcrumb": { + "dateModified": "2024-09-25T12:16:10CET","breadcrumb": { "@id": "https://stairlab.github.io/opensees-gallery/tags/shell/#/schema/breadcrumb/1" }, "primaryImageOfPage": { @@ -679,7 +679,7 @@ - + diff --git a/tags/solid/index.html b/tags/solid/index.html index bd09466..9b70ca6 100644 --- a/tags/solid/index.html +++ b/tags/solid/index.html @@ -25,7 +25,7 @@ - + @@ -109,7 +109,7 @@ "about": { "@id": "https://stairlab.github.io/#/schema/organization/1" }, - "dateModified": "2024-09-19T09:17:28CET","breadcrumb": { + "dateModified": "2024-09-25T12:16:10CET","breadcrumb": { "@id": "https://stairlab.github.io/opensees-gallery/tags/solid/#/schema/breadcrumb/1" }, "primaryImageOfPage": { @@ -665,7 +665,7 @@ - + diff --git a/tags/static/index.html b/tags/static/index.html index a7174b0..5856ae7 100644 --- a/tags/static/index.html +++ b/tags/static/index.html @@ -25,7 +25,7 @@ - + @@ -679,7 +679,7 @@ - + diff --git a/tags/tcl/index.html b/tags/tcl/index.html index a153855..a02481c 100644 --- a/tags/tcl/index.html +++ b/tags/tcl/index.html @@ -25,7 +25,7 @@ - + @@ -109,7 +109,7 @@ "about": { "@id": "https://stairlab.github.io/#/schema/organization/1" }, - "dateModified": "2024-09-19T10:02:47CET","breadcrumb": { + "dateModified": "2024-10-02T19:39:51CET","breadcrumb": { "@id": "https://stairlab.github.io/opensees-gallery/tags/tcl/#/schema/breadcrumb/1" }, "primaryImageOfPage": { @@ -821,7 +821,7 @@ - + diff --git a/tags/tcl/index.xml b/tags/tcl/index.xml index a240b50..fe1500d 100644 --- a/tags/tcl/index.xml +++ b/tags/tcl/index.xml @@ -83,7 +83,7 @@ https://stairlab.github.io/opensees-gallery/examples/framebuckling/ Mon, 01 Jan 0001 00:00:00 +0000 https://stairlab.github.io/opensees-gallery/examples/framebuckling/ - Corotational frame elements are used to approximate Euler&rsquo;s buckling load, which is given by: Peuler=π2EIL2 P_{\mathrm{euler}} = \frac{\pi^2 EI}{L^2} This example is adapted from https://github.com/denavit/OpenSees-Examples&nbsp; . The files for the problem are buckling.py for Python, and buckling.tcl for Tcl. λ=PL2EI[1−P/(ksGA)]=PL2χEIχ=1−P/(ksGA)P=χλ2EI/L2. \begin{gathered} \lambda=\sqrt{\frac{P L^2}{E I\left[1-P /\left(k_{\mathrm{s}} G A\right)\right]}}=\sqrt{\frac{P L^2}{\chi E I}} \\ \chi=1-P /\left(k_{\mathrm{s}} G A\right) \\ P=\chi \lambda^2 E I / L^2 . \end{gathered} χ=11+λ2EI/(ksGAL2)=11+λ2φ/12P=λ2EI/L21+λ2φ/12. \begin{gathered} \chi=\frac{1}{1+\lambda^2 E I /\left(k_{\mathrm{s}} G A L^2\right)}=\frac{1}{1+\lambda^2 \varphi / 12} \\ P=\frac{\lambda^2 E I / L^2}{1+\lambda^2 \varphi / 12} . + Corotational frame elements are used to approximate Euler&rsquo;s buckling load, which is given by: Peuler=π2EIL2 P_{\mathrm{euler}} = \frac{\pi^2 EI}{L^2} This example is adapted from https://github.com/denavit/OpenSees-Examples&nbsp; . The files for the problem are buckling.py for Python, and buckling.tcl for Tcl. Theory &nbsp; Buckling Analysis &nbsp; Loosely speaking, buckling happens when there are multiple shapes that a structure can deform into that will be in equilibrium with it&rsquo;s applied loads. This implies that at the point of buckling, there are multiple independent displacement increments u\bm{u} which will be mapped to the same resisting load by the tangent K\bm{K} . Simply Supported Solid Beam diff --git a/tags/tcl/page/2/index.html b/tags/tcl/page/2/index.html index 4ef6482..70aa1a1 100644 --- a/tags/tcl/page/2/index.html +++ b/tags/tcl/page/2/index.html @@ -25,7 +25,7 @@ - + @@ -109,7 +109,7 @@ "about": { "@id": "https://stairlab.github.io/#/schema/organization/1" }, - "dateModified": "2024-09-19T10:02:47CET","breadcrumb": { + "dateModified": "2024-10-02T19:39:51CET","breadcrumb": { "@id": "https://stairlab.github.io/opensees-gallery/tags/tcl/#/schema/breadcrumb/1" }, "primaryImageOfPage": { @@ -823,7 +823,7 @@ - + diff --git a/tags/truss/index.html b/tags/truss/index.html index dacfc93..f993008 100644 --- a/tags/truss/index.html +++ b/tags/truss/index.html @@ -25,7 +25,7 @@ - + @@ -665,7 +665,7 @@ - +

      gravity_analysis Python Tcl @@ -2156,7 +2156,7 @@

      create_portal Python Tcl @@ -2041,7 +2041,7 @@