diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 0000000..a117f53 --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: fb3e807afe73c5401ff3479c11045143 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.doctrees/case_0.doctree b/.doctrees/case_0.doctree new file mode 100644 index 0000000..05abcf8 Binary files /dev/null and b/.doctrees/case_0.doctree differ diff --git a/.doctrees/case_1.doctree b/.doctrees/case_1.doctree new file mode 100644 index 0000000..c8156df Binary files /dev/null and b/.doctrees/case_1.doctree differ diff --git a/.doctrees/case_2.doctree b/.doctrees/case_2.doctree new file mode 100644 index 0000000..a5a98a4 Binary files /dev/null and b/.doctrees/case_2.doctree differ diff --git a/.doctrees/case_3.doctree b/.doctrees/case_3.doctree new file mode 100644 index 0000000..a65ce06 Binary files /dev/null and b/.doctrees/case_3.doctree differ diff --git a/.doctrees/case_4.doctree b/.doctrees/case_4.doctree new file mode 100644 index 0000000..3b819aa Binary files /dev/null and b/.doctrees/case_4.doctree differ diff --git a/.doctrees/case_5.doctree b/.doctrees/case_5.doctree new file mode 100644 index 0000000..20bbc87 Binary files /dev/null and b/.doctrees/case_5.doctree differ diff --git a/.doctrees/case_6.doctree b/.doctrees/case_6.doctree new file mode 100644 index 0000000..b23b872 Binary files /dev/null and b/.doctrees/case_6.doctree differ diff --git a/.doctrees/case_7.doctree b/.doctrees/case_7.doctree new file mode 100644 index 0000000..b82237f Binary files /dev/null and b/.doctrees/case_7.doctree differ diff --git a/.doctrees/environment.pickle b/.doctrees/environment.pickle new file mode 100644 index 0000000..a415ccf Binary files /dev/null and b/.doctrees/environment.pickle differ diff --git a/.doctrees/index.doctree b/.doctrees/index.doctree new file mode 100644 index 0000000..279f77c Binary files /dev/null and b/.doctrees/index.doctree differ diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/_images/case0-1.png b/_images/case0-1.png new file mode 100644 index 0000000..314105d Binary files /dev/null and b/_images/case0-1.png differ diff --git a/_images/case1.png b/_images/case1.png new file mode 100644 index 0000000..bd8b225 Binary files /dev/null and b/_images/case1.png differ diff --git a/_images/case2_CESG599_TF_image1.png b/_images/case2_CESG599_TF_image1.png new file mode 100644 index 0000000..da7a0d1 Binary files /dev/null and b/_images/case2_CESG599_TF_image1.png differ diff --git a/_images/case2_Combined_RV_1.png b/_images/case2_Combined_RV_1.png new file mode 100644 index 0000000..9b678e7 Binary files /dev/null and b/_images/case2_Combined_RV_1.png differ diff --git a/_images/case2_EDPTab_Workflow_TF.png b/_images/case2_EDPTab_Workflow_TF.png new file mode 100644 index 0000000..1ed24d7 Binary files /dev/null and b/_images/case2_EDPTab_Workflow_TF.png differ diff --git a/_images/case2_Full_Results_TF.png b/_images/case2_Full_Results_TF.png new file mode 100644 index 0000000..f573303 Binary files /dev/null and b/_images/case2_Full_Results_TF.png differ diff --git a/_images/case2_Gaussian_Mixture_RatioV_histogram.png b/_images/case2_Gaussian_Mixture_RatioV_histogram.png new file mode 100644 index 0000000..4beaab7 Binary files /dev/null and b/_images/case2_Gaussian_Mixture_RatioV_histogram.png differ diff --git a/_images/case2_Input_Motion_TF.png b/_images/case2_Input_Motion_TF.png new file mode 100644 index 0000000..012c8fe Binary files /dev/null and b/_images/case2_Input_Motion_TF.png differ diff --git a/_images/case2_Normalized_RatioA_histogram.png b/_images/case2_Normalized_RatioA_histogram.png new file mode 100644 index 0000000..14eaca3 Binary files /dev/null and b/_images/case2_Normalized_RatioA_histogram.png differ diff --git a/_images/case2_Normalized_RatioV_histogram.png b/_images/case2_Normalized_RatioV_histogram.png new file mode 100644 index 0000000..8ca3e76 Binary files /dev/null and b/_images/case2_Normalized_RatioV_histogram.png differ diff --git a/_images/case2_RVTab_Workflow_TF.png b/_images/case2_RVTab_Workflow_TF.png new file mode 100644 index 0000000..51c5c04 Binary files /dev/null and b/_images/case2_RVTab_Workflow_TF.png differ diff --git a/_images/case2_Resonance_Building_Example_TF.png b/_images/case2_Resonance_Building_Example_TF.png new file mode 100644 index 0000000..79b536a Binary files /dev/null and b/_images/case2_Resonance_Building_Example_TF.png differ diff --git a/_images/case2_Results_Workflow_TF.png b/_images/case2_Results_Workflow_TF.png new file mode 100644 index 0000000..7ddaf69 Binary files /dev/null and b/_images/case2_Results_Workflow_TF.png differ diff --git a/_images/case2_SimTab_TF.png b/_images/case2_SimTab_TF.png new file mode 100644 index 0000000..59c6962 Binary files /dev/null and b/_images/case2_SimTab_TF.png differ diff --git a/_images/case2_SpectralAcc_Results_TF.png b/_images/case2_SpectralAcc_Results_TF.png new file mode 100644 index 0000000..91cb8ec Binary files /dev/null and b/_images/case2_SpectralAcc_Results_TF.png differ diff --git a/_images/case2_TF_Equation.png b/_images/case2_TF_Equation.png new file mode 100644 index 0000000..736fbd4 Binary files /dev/null and b/_images/case2_TF_Equation.png differ diff --git a/_images/case2_TF_Nat_Freqs.png b/_images/case2_TF_Nat_Freqs.png new file mode 100644 index 0000000..039e839 Binary files /dev/null and b/_images/case2_TF_Nat_Freqs.png differ diff --git a/_images/case2_TF_Rock_to_Soil1.png b/_images/case2_TF_Rock_to_Soil1.png new file mode 100644 index 0000000..928919b Binary files /dev/null and b/_images/case2_TF_Rock_to_Soil1.png differ diff --git a/_images/case2_UQTab_Workflow_TF.png b/_images/case2_UQTab_Workflow_TF.png new file mode 100644 index 0000000..2a9e03b Binary files /dev/null and b/_images/case2_UQTab_Workflow_TF.png differ diff --git a/_images/case7_DA10_E7.png b/_images/case7_DA10_E7.png new file mode 100644 index 0000000..750a8a6 Binary files /dev/null and b/_images/case7_DA10_E7.png differ diff --git a/_images/case7_DA11_E8.png b/_images/case7_DA11_E8.png new file mode 100644 index 0000000..8813c4d Binary files /dev/null and b/_images/case7_DA11_E8.png differ diff --git a/_images/case7_DA12_E9.png b/_images/case7_DA12_E9.png new file mode 100644 index 0000000..4c51e00 Binary files /dev/null and b/_images/case7_DA12_E9.png differ diff --git a/_images/case7_DA13_E10.png b/_images/case7_DA13_E10.png new file mode 100644 index 0000000..32933e6 Binary files /dev/null and b/_images/case7_DA13_E10.png differ diff --git a/_images/case7_DA14_Results.png b/_images/case7_DA14_Results.png new file mode 100644 index 0000000..2bb3aa0 Binary files /dev/null and b/_images/case7_DA14_Results.png differ diff --git a/_images/case7_DA1_saffirScale.png b/_images/case7_DA1_saffirScale.png new file mode 100644 index 0000000..41be36f Binary files /dev/null and b/_images/case7_DA1_saffirScale.png differ diff --git a/_images/case7_DA2_raster.png b/_images/case7_DA2_raster.png new file mode 100644 index 0000000..f5e5fd4 Binary files /dev/null and b/_images/case7_DA2_raster.png differ diff --git a/_images/case7_DA3_footprints.png b/_images/case7_DA3_footprints.png new file mode 100644 index 0000000..6002f6c Binary files /dev/null and b/_images/case7_DA3_footprints.png differ diff --git a/_images/case7_DA4_E1.png b/_images/case7_DA4_E1.png new file mode 100644 index 0000000..a3952cb Binary files /dev/null and b/_images/case7_DA4_E1.png differ diff --git a/_images/case7_DA5_E2.png b/_images/case7_DA5_E2.png new file mode 100644 index 0000000..54c0828 Binary files /dev/null and b/_images/case7_DA5_E2.png differ diff --git a/_images/case7_DA6_E3.png b/_images/case7_DA6_E3.png new file mode 100644 index 0000000..2438bc7 Binary files /dev/null and b/_images/case7_DA6_E3.png differ diff --git a/_images/case7_DA7_E4.png b/_images/case7_DA7_E4.png new file mode 100644 index 0000000..1b19d40 Binary files /dev/null and b/_images/case7_DA7_E4.png differ diff --git a/_images/case7_DA8_E5.png b/_images/case7_DA8_E5.png new file mode 100644 index 0000000..c8ed3c4 Binary files /dev/null and b/_images/case7_DA8_E5.png differ diff --git a/_images/case7_DA9_E6.png b/_images/case7_DA9_E6.png new file mode 100644 index 0000000..8493b54 Binary files /dev/null and b/_images/case7_DA9_E6.png differ diff --git a/_images/manifestationcurve.png b/_images/manifestationcurve.png new file mode 100644 index 0000000..d4374f1 Binary files /dev/null and b/_images/manifestationcurve.png differ diff --git a/_images/sanger2024-ai.png b/_images/sanger2024-ai.png new file mode 100644 index 0000000..61133f2 Binary files /dev/null and b/_images/sanger2024-ai.png differ diff --git a/_images/sanger2024-krig.png b/_images/sanger2024-krig.png new file mode 100644 index 0000000..9be0fa4 Binary files /dev/null and b/_images/sanger2024-krig.png differ diff --git a/_images/sanger2024-roc.png b/_images/sanger2024-roc.png new file mode 100644 index 0000000..a20feab Binary files /dev/null and b/_images/sanger2024-roc.png differ diff --git a/_images/siteResponse2.png b/_images/siteResponse2.png new file mode 100644 index 0000000..10072b9 Binary files /dev/null and b/_images/siteResponse2.png differ diff --git a/_images/zhu2017.png b/_images/zhu2017.png new file mode 100644 index 0000000..35eea0c Binary files /dev/null and b/_images/zhu2017.png differ diff --git a/_sources/case_0.rst.txt b/_sources/case_0.rst.txt new file mode 100644 index 0000000..2e93797 --- /dev/null +++ b/_sources/case_0.rst.txt @@ -0,0 +1,204 @@ + +.. _case_0: + +.. figure:: ./images/case0-1.png + :scale: 50 % + :height: 200 px + :align: center + :figclass: align-center + + +Course Introduction +=================== + +CESG599 - NHERI - An introduction to NHERI Simcenter tools and DesignSafe Resources +----------------------------------------------------------------------------------- + +Authors: +-------- +**Kendra Mutch, Erick Martinez, Jose Barreto, Chungen Tai, Morgan Sanger, Luis Guerrero, Daniel Acosta, and Pedro Arduino** + +Course Description +------------------ +In this course, we explore the fundamentals of SimCenter tools and the DesignSafe infrastructure. +The course adopts a self-directed approach, where students follow a well-established framework tailored +for this format. Over the course of 10 weeks, we investigate the core concepts of SimCenter and DesignSafe, +and examine four to five SimCenter tools, covering one every two weeks. Students are tasked with mastering +the essentials of each tool and delivering presentations to the class. Additionally, they work through one +or more practical examples for each tool, presenting their findings to their peers. Constructive feedback for +each tool presentation is an integral part of the learning experience. DesignSafe and SimCenter personnel are +invited to give Zoom presentations based on availability. At the end of the course, a small final project, +with a topic of choice for each student or group of students, is required, providing an opportunity for +deeper exploration and application of the learned concepts. + + +SimCenter provides next-generation computational modeling and simulation software tools, user support, +and educational materials to the natural hazards engineering research community with the goal of advancing +the user’s capability to simulate the impact of natural hazards on structures, lifelines, and communities. + +DesignSafe is a comprehensive cyberinfrastructure that provides cloud-based tools to manage, analyze, understand, +and publish critical data for research to understand the impacts of natural hazards. The capabilities within +the DesignSafe infrastructure are available at no-cost to all researchers working in natural hazards. + + +Learning Objectives +------------------- + +#. Develop a familiarity with Simcenter tools and DesignSafe cyberinfrastructure +#. Develop a familiarity with the breath of SimCenter tools. +#. Develop a suitable background for using HPC resources. +#. Introduce/revise concepts related to structural and geotechnical engineering including UQ concepts, FEM, PB, etc. +#. Provide a working knowledge for selecting, using, and interpreting tools for Structural and geotechnical design and analysis. +#. Introduce markup language to develop easy-to-read, easy-to-write documents in the sphinx python package. + + +Introduction +------------ +This section should provide a brief executive summary, giving an overview of the project. It should be written last to ensure it accurately reflects the content of the entire report. Aim for a short paragraph that highlights the key points, objectives, and outcomes of the project. + + +Problem Description +------------------- +Clearly describe the problem being addressed. Use text and images to illustrate the issue, ensuring that even readers unfamiliar with the topic can understand the context and significance. This section should detail the background, relevance, and any previous attempts to solve the problem. + + +Solution Strategy +----------------- +Outline the strategy used to solve the problem. This should include a detailed explanation of the methods, processes, and any equations or theoretical frameworks involved. Be sure to make this section as comprehensive as necessary to fully explain the approach taken. + +SimCenter Tool Used +------------------- +Provide a brief description of the SimCenter tool(s) used in the project. Explain its relevance and how it was applied. This section should be informative yet concise, offering enough detail to understand the tool's role and capabilities without overwhelming the reader. + +Example of Application +---------------------- +Give a concrete example of how the solution strategy was applied, using text and images. This helps to illustrate the practical application of the theoretical concepts and methods discussed earlier. Ensure the example is detailed enough to show the effectiveness of the solution. + +Remarks +------- +Use this section for any additional comments or observations that do not fit into the other sections. This could include limitations, unexpected findings, future directions, or any acknowledgments. + + +EXAMPLELS of LISTS, FIGURES, TABLE, REFERENCE, etc +-------------------------------------------------- + +#. Open the Dr. Layer program. By default we get twelve layers. The top six layers are hardwired into the system with a velocity of specified as very fast. The bottom six layers are hardwired with a velocity of very slow. + +#. Select all the layers to all have very slow values using the select all option. + +#. On the top left hand corner of the menu box choose the plot box tool and apply a plot box at the top of the layers. Do the same at four arbitrary points along the soil layers. Note the height (:math:`H`) you place the plots. + + + +#. Push the time increment button for about 1 minute. + +#. Obtain the angular frequency :math:`(2p/T)`, where :math:`T` is the period i.e. time it takes to complete one revolution. + +#. Obtain the maximum displacements from the plots by clicking on the crest of the curves with your cursor. + +.. math:: + TF = \frac{1}{\cos(\frac{wH}{v_s})} + + AF = \frac{1}{|\cos(\frac{wH}{v_s})|} + + +Where + +:math:`w` = Angular frequency (2pf) + +:math:`H` = distance between any two points in the layers under consideration. + +:math:`V` = Velocity of wave travel within the soil layer. + +:math:`TF` = Transfer function + +:math:`AF` = Amplification function + + +Dr. Layer's operation is controlled via menu commands (with associated keyboard accelerators), manipulation tools, scaling buttons, the load tool bar, and time control buttons. The program displays the results of its calculations visually in the form of animated displacements, and also in the form of dynamically generated time history plots. There are also mechanisms for getting numerical values. + +.. figure:: ./images/case1.png + :scale: 30 % + :align: center + :figclass: align-center + + +SimCenter Tool Used +------------------- + +blablabla + +.. list-table:: Title + :widths: 25 25 50 + :header-rows: 1 + + * - Heading row 1, column 1 + - Heading row 1, column 2 + - Heading row 1, column 3 + * - Row 1, column 1 + - + - Row 1, column 3 + * - Row 2, column 1 + - Row 2, column 2 + - Row 2, column 3 + +Time can be controlled using either the keyboard or the time control buttons: + +* To run time **forward**: Press and hold the 'g' key or click and hold the time forward button: . + +* To reset time to **zero**: Type the '0' key or click on the time reset button: . + +* The current analysis time is **displayed** in the feedback pane at the bottom of the screen. + +* The analysis time step size can be controlled via the Time Step menu (there are combinations of material properties and time steps that intentionally lead to unstable results, so beware). + +* The display time step can be controlled via the Animation Speed menu. Internally, this command controls how many analysis time steps are computed between screen updates. + + +Example Application +------------------- + +Dr. Layer's tool palette is illustrated below (Windows version: the Mac version is similar but grouped a bit differently): + + + +* The **Arrow Tool** is used to select and manipulate objects. + +* The **Panner** and **Camera Orbit Tools** are used to change the viewing point and camera orientation via clicking and dragging. + +* The **Plot Box Tool** is used to create one of the various types of plot boxes: + + * **Displacement Time History plots** are created by clicking on the relevant layer. The top node in the layer is used as the plotting target. + + * **Fast Fourier Transform (FFT) plots** of a displacement history can be created by clicking on the time history plot. + + * **Stress-strain plots** can be created by control-clicking (i.e., holding down the control key while clicking) on the desired layer. + + + These controls are self-explanatory in regards to their functions. Note the following, however: + +.. note:: + The scaling buttons will continue to scale as long as they are held down. It is not necessary to click multiple times to get this effect. + + +Remarks +------- + +* To adjust the **plotting scales**, use the small expansion/contraction triangular buttons on the plot for the horizontal scale, and the plot scale buttons on the `Scale Button Toolbar <#scaling-buttons>`_ for the vertical scale. + +.. note:: + You will notice that all plots scale together. This is so that plots of a given type can be compared visually without any misleading differences in scale factors. + +* To adjust the **horizontal offset** of a plot, click in the plot and drag horizontally to scroll back and forth. + +.. note:: + In general, plots will automatically scroll as necessary as time is running. Once you have manually scrolled a plot, though, the automatic scrolling will cease until time is reset to zero. + +* Plot boxes can be added or removed at any time, but they only accumulate data beginning from the time they are installed, with the exception of FFT plots, which always plot the according to the data accumulated in the target time history. FFT plots can use up to the first 1024 points in a time history. + + +.. warning:: + Plotting FFT's will slow down the animation speed significantly, especially as the length of the time histories increase. + + +.. bibliography:: references.bib diff --git a/_sources/case_1.rst.txt b/_sources/case_1.rst.txt new file mode 100644 index 0000000..0522d85 --- /dev/null +++ b/_sources/case_1.rst.txt @@ -0,0 +1,146 @@ +.. _case_1: + +quoFEM - Settlements +================================ + +Author: Kendra Mutch +--------------------- + +Introduction +------------ + +This page describes basic concepts of computing settlement computations in QuoFEM. The calculation methods discussed include forward propagation, deterministic and Bayesian calibration, and sensitivity analysis. For more details, the user is encounged to read :cite:`Holtz and Kovacs 2011' + +Project Description +------------------- + +The goal of this project is to quantify settlement, parameters impacting settlement, and observe how uncertainty in various input parameters impact the ultimate settlement of a cohesive soil. These copmutations make use of the program QuoFEM. The following report discusses the features of the program, theory regarding the settlement and uncertainty concepts discussed above, as well as three example problems applying different features of QuoFEM. + +The first example makes use of the Forward Propagation feature of QuoFEM, which allows one to apply uncertainty to input parameters (such as preconsolidation pressure, compression and recommpression index, void ratio, unit weight, etc.) to determine which paramter(s) impact the ultimate settlement most. In-situ testing, lab testing, and various models used to determine soil paramters may all contain uncertainty. Thus, it is important to consider uncertainty in geotechnical calculations, such as settlement, and not accept a single predicted value without accounting for uncertainty as completely true to reality. The forward propagation analysis will help us translate uncertainty in soil parameters to uncertainty in ultimate settlement, reducing chances of highly underpredicting or overpredicting settlement. + +In the second example, Bayesian and Deterministic Calibration are used to optimize the value of an input parameter to yield a desired settlement. In other words, given a specific value of ultimate settlement, we can calculate the value of an unknown input paramter. + +The final example applies the Sensitivity Analysis feature of QuoFEM to determine which input parameters impact the resulting ultimate settlement most. As the discussion of results will reveal, settlement shows a strong correlation with some soil parameters, and a weaker correlation with other paramters. By knowing which parameters settlement is most dependent on, one can allocate funds in site investigation or lab testing to use the most accurate methods for predicting such parameters. Or, one may simply be cautious that potential uncertainty in such parameters, especially compounded uncertainty of multiple parameters, could lead to high uncertainty in the predicted settlement, and perhaps a more conservative design should be implemented. + +All examples will use a python input script, paired with the Dakota uncertainty quantification tool in QuoFEM. These aspects of the project are discussed in further detail throughout the report. + +The soil profile and problem scenario are the same for all three examples and are depicted in the image and table below. + +.. figure:: ./images/ProblemScenarioP1.png + +.. list-table:: Soil Profile Parameters + :widths: 25 25 50 + :header-rows: 1 + + * - Parameter + - Mean Value + - Coefficient of Variation (%) + * - h1 + - 3 ft + - 5 + * - h2 + - 25 ft + - 5 + * - Cc + - 0.75 + - 20 + * - eo + - 1.54 + - 7 + * - Cr + - 0.05 + - 20 + * - change in pressure + - 200 psf + - 50 + * - k + - 10E-6 (cm/sec) + - 200 + * - unit weight of fill + - 130 pcf + - 7 + * - height of fill + - 5 ft + - 2 + + +Example One Solution Strategy - Forward Propagation +--------------------------------------------------- + +#. Open the QuoFEM. By default, the UQ method is Forward Propagation and the UQ Engine is Dakota. In this example, we will use these defaults. Specify a sample number of 200 and a seed number of 949. Ensure the **Parellel Execution** and the **Save Working dirs** boxes are checked. + +#. Select the FEM tab. From the drop down menu, select Python. Navigate to the location of the **Input Script** and the **Parameters Script**. + +#. Select the RV tab. Enter the random variables (listed in the table in the problem description). Selelct a normal distribution for each random variable, and enter the mean and standard deviation. Remember, the standard deviation must be calculated for each variable from the given coefficient of variation. The below formula may be used to convert coefficient of variation to the standard deviation. + +#. In the EDP tab, specify the variable of interest as **Settlement** and assign it a **Length** of **1**. + +#. Run the example either on your machine or in the cloud. For running in the cloud, see the **SimCenter Tool Used** section for additional details. + + +Example Two Solution Strategy - Bayesian and Deterministic Calibration +---------------------------------------------------------------------- + +#. Open QuoFEM. Change the UQ method to Bayesain Callibration and keep the default UQ Engine as Dakota. + + +Example Three Solution Strategy - Sensitivity Analysis +------------------------------------------------------ +#. In the UQ tab, select **Sensitivity Analysis** as the UQ Method. From the UQ Engine drop down, select **SimCenterUQ**. In the Method drop down, select **Monte Carlo**. For the # of samples, enter 500, and for the seed number, enter 106. + +#. Select the FEM tab. From the FEM drop down, select **Python**. Locate the file path for the Input Script and the Paramters Script. + +#. In the RDV tab, enter the same random variables as the Forward Propagation example. + +#. In the EDP tab, use the same inputs as the Forward Propagation example. + +#. Choose to run the example either on your machine in the cloud. For running in the cloud, see the **SimCenter Tool Used** section for additional details. + +SimCenter Tool Used +------------------- +QouFEM allows the integration of finite element and hazard compuatations with uncertainty quantification tools. There are five different tabs in QuoFEM; four input tabs and one results tab. The four input tabs are outlined below: + + * **UQ tab** - The UQ tab allows one to select the analysis method (Forward Propagation, Bayesian + Callibration, Sensitivity Analysis, etc.). Additionally, one can specify a statistics model and the number + of samples to run. + + * **FEM tab** - The FEM is where a python script is input, and a finite element method (such as Openseas) may + be selected. + + * **RV tab** - The RV tab allows you define random variables and apply desired uncertainty and statistical + models (normal distribution, uniform distribution etc.) to each variable. + + * **EDP tab** - The EDP tab allows one to define quantities of interest. For example, the ultimate settlement. + +After entering the inputs for your project, you may choose run the project on your machine by simply clicking **Run** or you may run the project in the cloud by selecting **Run at Design Safe**. If you choose to run your project in the cloud, you must login to you Design Safe account and specify a maximum run time. To ensure that your project does not expire while waiting in the que,, select a run time of at least 10 hours. + +The results tab contains both a "Summary" page and a "Data Values" page. The "Summary" page contains a brief +outline of the values computed. The "Data Values" page contains a more comprehensive set of results and figures. + + +Example Application +------------------- +There are various features within the "Data Values" page of the Results tab which may aid in analysis. Below is information about navigating the "Data Values" page to extract desired information: + + * **To View a Scatterplot of a Parameter vs. Run Number** - left click once on any column. + + * **To View a Cumulative Frequency Distribution for a Variable** - First left click once on the column for the + variable that you want to view a cumulative frequency distribution for. Then right click once on the same + column. + + * **To View a Histogram for a Variable** - After following the steps to display a cumulative frequency + distribution, left click on the same column once more to display the histogram. + + * **To View a Scatterplot of One Variable vs. another Variable** - Right click once on one of the variables. + This defines which variable will be on the x-axis. Then, left click once on the variable which you want + plotted on the y-axis. + + * **To Export the Data Table** - Select the Save Table icon above the data, and choose a location for saving + the table as a .csv file. + + +Remarks +------- + + +.. bibliography:: references.bib \ No newline at end of file diff --git a/_sources/case_2.rst.txt b/_sources/case_2.rst.txt new file mode 100644 index 0000000..ed98866 --- /dev/null +++ b/_sources/case_2.rst.txt @@ -0,0 +1,718 @@ +.. _case_2: + +EEUQ - Transfer Function and Uncertainty +================================ + +Author: Erick Martinez +---------------------- + +Introduction +------------ + +This page describes the basic concept of transfer functions and their use in a site response analysis. Along with this, the uncertainty in this process will be investigated using EE-UQ, a SimCenter tool. For more details, the user is encouraged to read :cite:`Kramer1996`. + + +.. note:: + This example was prepared on a Mac system. Differences in the UI between Mac and other systems are possible, but should not affect the outcome. + + +Problem Description +------------------- + +A transfer function acts as a filter that can amplify or de-amplify an incoming wave from a medium to produce the output signal in another medium. To simplify the idea of a transfer function, a spring-mass system can be used. As a motion is applied on the mass connected to a spring; a responsive outgoing wave will then be propagated through the mass and the spring. This outgoing motion will be a composite factor of the stiffness and elastic damping forces found within the spring-mass system. + +.. seealso:: + For more information, visit the `Free Vibrations of a Spring-Mass-Damper System `_. + + + +This can be applied to earth systems in the form of ground motions. An example of this is an earthquake motion acting on a rock layer at a certain depth. This motion is then transferred through the soil profile and is reflected as a different motion at the surface. In order to determine the influence of a soil profile on the motion, three major components are required: thickness of layer (H), shear wave velocity (Vs), and damping ratio. + +It is important to ensure that this difference in motion is accounted for. When a structure is constructed, it has a specific resonance. Understanding this resonance is important because if an earthquake motion has similar peaks in frequency, causing amplification of the motion, the structure could have a significant and potentially disastrous behavior. While the incoming motion at the rock might have a different natural resonance, the motion at the surface might match that of the structure. The design of earthquake resistant structures relies on the accurate determination of transfer functions in sites. An example of this is shown below - where a motion was amplified from 0.03g to 0.15g due to the presence of soft clay. + + +.. figure:: ./images/case2_Resonance_Building_Example_TF.png + :scale: 40% + :align: center + + Fig. 1. Mexico City Earthquake Amplification. + + +As with any engineering properties, there will always be the presence of uncertainty. A layer might have differential thicknesses in certain regions, causing the height to be non-uniform. Shear wave velocity can change very quickly depending on depth and composition of the materials within the layer. Damping can also be affected by changes in stratigraphy and composition. To account for this, uncertainty must be incorporated into a transfer function analysis. This inclusion will aid in the accuracy and reliability of site response analyses. + + +Solution Strategy +----------------- + +Fourier Transform +^^^^^^^^^^^^^^^^^ + +In earth systems, this relationship between incoming and outgoing wave can be evaluated through mathematically converting an input motion, typically an acceleration-time history, to a Fourier series using the Fast Fourier Transform (FFT). In the Fourier space, the motion is then multiplied by the transfer function, resulting in the outgoing Fourier motion. This can then be converted back into various plots, such as acceleration-time history and spectral acceleration vs. period, that allow for analysis of the outgoing motion. An analysis of this ground motion can provide frequencies of interest where ground accelerations would be highest/lowest, which can aid in site response analysis and planning. + +.. figure:: ./images/case2_TF_Rock_to_Soil1.png + :scale: 40% + :align: center + + Fig. 2. Transfer Function from Rock to Soil. + + + + +Transfer Function Equation +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +To calculate a transfer function, the equation below can be used. In a single layer soil profile, it is assumed that the impedance contrast between layers is zero. Using a tool like EE-UQ can help provide the ratio between the input and output motion and provides the uncertainty in those motions and variables. + + +.. figure:: ./images/case2_TF_Equation.png + :scale: 40% + :align: center + + Eqn. 1. Transfer Function Equation [Kramer, 1996] + + +.. note:: + This equation changes based on the soil profile. Having multiple soil layers can lead to an impedance contrast. The equation also changes if the damping ratio is assumed to be zero. Kramer (1996) provides more information for the different instances. + +Example +^^^^^^^ + +A typical transfer function would look similar to the one provided below. In the figure below, there are various peaks of natural resonance for the transfer function, which is where the motion will have the greatest amplification/de-amplification. + +.. figure:: ./images/case2_TF_Nat_Freqs.png + :scale: 60% + :align: center + + Fig. 3. Transfer Function from Rock to Soil. + + +SimCenter Tool Used +------------------- + + +To understand transfer functions, there are many tools available. One of these tools is the SimCenter Transfer Function Tool (TFT). This tool introduces users to transfer functions by providing the output motion at a site given the motion, thickness of layers, shear wave velocities, and damping ratio. TFT allows for easy analysis of amplification/de-amplification of ground motions based on specific sites. + +The Earthquake Engineering with Uncertainty Quantification Application (EE-UQ) is a SimCenter research application that also allows for site response predictions due to earthquake loading. In addition to basic transfer function quantification, it allows for the analysis of uncertainty in the predictions based on the uncertainty found within the input model, motion, etc. This workflow application allows the user to run analyses in the background and provides a simple user interface that facilitates its use. + + + +Example Application +------------------- + +Soil Profile +^^^^^^^^^^^^ + +In this example, we will analyze the amplification/deamplification effects of a ground motion caused by its propagation through the soil layer. The 10 meter soil layer has a shear wave velocity (Vs) of 500 m/s and a damping ratio of 3%. + + +.. figure:: ./images/case2_CESG599_TF_image1.png + :scale: 50 % + :align: center + + Fig. 4. Soil Profile & Material Properties. + +Uncertainty +^^^^^^^^^^^^ + +Because of the presence of uncertainty in the soil properties, the transfer function will include uncertainty in its effects. Normal distribution values for each variable (H, Vs, damping) will be provided. This uncertainty will be quantified through multiple runs in EE-UQ and expressed as ratios of mean velocity and acceleration, along with standard deviation and skewness. + +The following normal distribution figures represent the uncertainty within each variable. + + + +.. figure:: ./images/case2_Combined_RV_1.png + :scale: 50 % + :align: center + + Fig. 5. Uncertainty in Each Variable (H, Vs, Damping). + +Motion +^^^^^^ + +An earthquake motion will be applied to a rock, located at the bottom of a one-dimensional soil profile. The motion is shown below as an acceleration time history as well as a Fourier amplitude spectra (FAS). + + +.. figure:: ./images/case2_Input_Motion_TF.png + :scale: 40 % + :align: center + + Fig. 6. Input Ground Motion. + +Pre-Workflow Python Script +^^^^^^^^^^^^^^^^^^^^^^^^^^ +To complete a transfer function analysis in EE-UQ various Python files had to be generated. The following script calculates the transfer function of a soil layer and applies it to a given acceleration record. + +.. raw:: html + +
+ Click to expand the full Transfer Function Example code +

+
+.. code-block:: python
+
+    # ############################################################################################################
+    # Title: Transfer Function Calculation
+    # Description: This script calculates the transfer function of a soil layer and applies it to a given acceleration record.
+    # Author: Pedro Arduino
+    # UW Computational Geotechnical Group
+    # Date: 2024
+    # All Rights Reserved
+    # ############################################################################################################
+
+    # %%
+    import numpy as np
+    import json
+    import matplotlib.pyplot as plt
+    from numpy.fft import fft, ifft
+    from scipy import integrate
+    from respSpectra import resp_spectra
+
+    class TFunctionClass:
+        def __init__(self, damping, H, Vs):
+            # Define the variables
+            self.m_freq = None
+            self.m_time = None
+            self.m_acc = None
+            self.m_absFft = None
+            self.m_absSoilTF = None
+            self.m_absIFft = None
+            self.m_accT = None
+
+            self.m_vel = None
+            self.m_disp = None
+            self.m_velT = None
+            self.m_dispT = None
+
+            # Define soil layer parameters
+            self.m_damping = damping / 100.0 # damping from percentage to number
+            self.m_H = H
+            self.m_Vs = Vs
+
+        
+        def calculateResponse(self):
+            SoilTF = np.empty_like(self.m_freq, dtype=np.complex_)
+            absSoilTF = np.empty_like(self.m_freq, dtype=np.float_)
+            
+            # Compute the Fourier amplitude spectrum
+            fas = fft(self.m_acc)
+            # fas = fas[:self.nyquist_index]
+            absfas = np.abs(fas)
+            self.m_absFft = absfas
+            
+            # Compute transfer function of soil layer
+            SoilTF = self.calcSoilTf()
+            self.m_absSoilTF = np.abs(SoilTF)
+            
+            # Compute surface soil response
+            ifas = fas * SoilTF
+            absfas2 = np.abs(ifas)
+            self.m_absIFft = absfas2
+            accT = ifft(ifas)
+            self.m_accT = accT.real  # Take only the real part
+
+
+        def calcSoilTf(self):
+
+            tf = []
+
+            if self.m_freq is None:
+                print("Frequency vector is not defined")    
+            else:
+
+                for f in self.m_freq:
+                    """
+                    * The uniform damped soil on rigid rock transfer function
+                    *                             1
+                    *  H = -------------------------------------------------
+                    *       cos ( 2* PI * freq * H / (Vs(1+ i*damping))
+                    """
+                    kstar = 2.0 * np.pi * f / self.m_Vs - self.m_damping * 2.0 * np.pi * f / self.m_Vs * 1j
+                    Vsstar = self.m_Vs + self.m_damping * self.m_Vs * 1j
+                    tf.append(1.0 / np.cos(2.0 * np.pi * f * self.m_H / Vsstar))
+
+            return tf
+
+        def calculate_nat_freq(self):
+            n_pt = len(self.m_freq)
+            N_freq = []
+            N_freqVal = []
+            dfreq = self.m_freq[-1] / n_pt
+
+            TF_tan = 1.0
+            for i in range(1, len(self.m_freq)):
+                TF_tan1 = (self.m_absSoilTF[i] - self.m_absSoilTF[i - 1]) / dfreq
+                if TF_tan1 * TF_tan <= 0 and TF_tan > 0:
+                    N_freq.append(self.m_freq[i])
+                    N_freqVal.append(self.m_absSoilTF[i])
+                TF_tan = TF_tan1
+        
+            return N_freq, N_freqVal
+
+        def calculate_ratio(self):
+
+            grav = 9.81 # m/s2
+            dT = self.m_time[1] - self.m_time[0]
+            accAux = [self.m_acc[ii]*grav for ii in range(len(self.m_acc))]
+            self.m_vel = integrate.cumtrapz(accAux, dx=dT)
+            # self.mvel = np.insert(self.m_vel, 0, 0.0)
+            self.m_disp = integrate.cumtrapz(self.m_vel, dx=dT)
+            # mdisp = np.insert(self.m_disp, 0, 0.0)
+
+            self.m_velT = integrate.cumtrapz((self.m_accT*grav), dx=dT)
+            # self.mvel = np.insert(self.m_vel, 0, 0.0)
+            self.m_dispT = integrate.cumtrapz(self.m_velT, dx=dT)
+            # mdisp = np.insert(self.m_disp, 0, 0.0)
+
+            ratioA = abs(max(self.m_accT))/abs(max(self.m_acc))
+            ratioV = abs(max(self.m_velT))/abs(max(self.m_vel))
+
+            return ratioA, ratioV
+
+        def sin_record(self, f):
+            n_points = 2000
+            self.m_dt = 0.02
+            self.m_acc = [0] * n_points
+            accel = []
+
+            for s in range(n_points):
+                accel.append(0.4 * np.sin(2 * f * np.pi * s * self.m_dt))
+
+            self.m_acc = accel
+            self.set_time()
+            self.set_freq()
+
+        def sweep_record(self):
+            n_points = 8000
+            self.m_dt = 0.002
+            self.m_acc = [0] * n_points
+            self.m_time = [0] * n_points
+
+            for i in range(len(self.m_time)):
+                time = i * self.m_dt
+                self.m_time[i] = time
+                self.m_acc[i] = np.sin(25.0 * time + 150.0 * (time * time / 2.0) / 16.0)
+
+            self.set_freq()
+
+
+        def load_file(self, file_name):
+            
+            self.m_filename = file_name
+            
+            try:
+                with open(file_name, 'r') as file:
+                    # Read file contents into a JSON object
+                    jsonObj = json.load(file)
+            except FileNotFoundError as e:
+                print(f"Cannot read file {file_name}: {e}")
+                return
+
+            events = jsonObj.get("Events", [])
+
+            if events:
+                patterns = events[0].get("pattern", [])
+                timeseries = events[0].get("timeSeries", [])
+                pattern_type = patterns[0].get("type", "")
+                tsname = patterns[0].get("timeSeries", "")
+
+                units = events[0].get("units", {})
+                acc_unit = 1.0
+                acc_type = units.get("acc", "")
+                if acc_type == "g":
+                    acc_unit = 1.0
+                elif acc_type == "m/s2":
+                    acc_unit = 1.0 / 9.81
+                elif acc_type in ["cm/s2", "gal", "Gal"]:
+                    acc_unit = 1.0 / 981.0
+
+                timeseries_data = timeseries[0].get("data", [])
+                dT = timeseries[0].get("dT", 0.0)
+                self.read_GM(timeseries_data, dT, acc_unit)
+                
+
+        def read_GM(self, acc_TH, dT, acc_unit):
+            n_points = len(acc_TH)
+            self.m_dt = dT
+            # self.m_acc = [acc_TH[ii].toDouble() * acc_unit for ii in range(n_points)]
+            self.m_acc = [acc_TH[ii] * acc_unit for ii in range(n_points)]
+
+            if n_points % 2 == 0:
+                self.m_acc.append(0.0)
+            self.m_acc = np.array(self.m_acc) # Convert to numpy array
+
+            self.set_time()
+            self.set_freq()        
+
+
+        def set_freq(self):
+
+            if self.m_dt == 0:
+                self.m_dt = 0.005
+                nfreq = 1 / self.m_dt*10
+                sample_freq = 1.0 / self.m_dt
+
+            else:
+                nfreq = len(self.m_acc)
+                sample_freq = 1.0 / self.m_dt
+
+            # self.m_freq = [0] * (len(self.m_acc) // 2 + 1)
+            # self.m_freq = [0] * (len(self.m_acc))   # m_freq as a list
+            self.m_freq = np.zeros(nfreq) # m_freq as a numpy array
+            sample_freq = 1.0 / self.m_dt
+
+            self.nyquist_freq = sample_freq / 2.0
+            self.nyquist_index = int(len(self.m_freq) / 2)
+            for i in range(len(self.m_freq)):
+                self.m_freq[i] = i * sample_freq / len(self.m_acc)
+
+
+        def set_time(self):
+            # self.m_time = [0] * len(self.m_acc) # m_time as a list
+            self.m_time = np.zeros(len(self.m_acc)) # m_time as a numpy array
+
+            for i in range(len(self.m_time)):
+                self.m_time[i] = i * self.m_dt
+
+
+        def plot_acc(self):
+            plt.figure()
+            plt.plot(self.m_time, self.m_acc, 'b-', label='input')
+            plt.plot(self.m_time, self.m_accT, 'r-', label='output')
+            plt.xlabel('Time [sec]')
+            plt.ylabel('Acc [g]')
+            plt.legend()
+            plt.show()
+
+        def plot_fft(self):
+            plt.figure()
+            plt.plot(self.m_freq[:self.nyquist_index], self.m_absFft[:self.nyquist_index], 'b-', label='input')
+            plt.plot(self.m_freq[:self.nyquist_index], self.m_absIFft[:self.nyquist_index], 'r-', label='output')
+            plt.xlabel('Frequency [Hz]')
+            plt.ylabel('Fourier Amplitude')
+            plt.legend()
+            plt.show()
+
+        def plot_tf(self):
+            plt.figure()
+            plt.plot(self.m_freq[:self.nyquist_index], self.m_absSoilTF[:self.nyquist_index], 'b-')
+            plt.xlabel('Frequency [Hz]')
+            plt.ylabel('TF')
+            plt.show()
+            
+        def plot_spectra(self):
+            n_points = len(self.m_acc)
+            accAux = [self.m_acc[ii]*9.81 for ii in range(n_points)]
+            accTAux = [self.m_accT[ii]*9.81 for ii in range(n_points)]
+            periods, psa = resp_spectra(self.m_time, accAux, 0.05)
+            periodsT, psaT = resp_spectra(self.m_time, accTAux, 0.05)
+            
+            plt.figure()
+            plt.plot(periods, psa, 'b-', label='input')
+            plt.plot(periodsT, psaT, 'r-', label='output')
+            plt.xlabel('Periods [s]')
+            plt.ylabel('PSA [cm/s2]')
+            plt.legend()
+            plt.show()
+
+    def main():
+        # Define input parameters
+        damping = 5.0  # damping ratio in %
+        H = 20.0  # layer height in m
+        Vs = 200.0  # shear wave velocity in m/s
+        
+        TF = TFunctionClass(damping, H, Vs)
+        
+        # Sinusoidal record
+        f = 0.5  # frequency in Hz
+        TF.sin_record(f)
+        
+        # Calculate response
+        TF.calculateResponse()
+        
+        # Calculate ratios
+        ratioA, ratioV = TF.calculate_ratio()
+        print(f"Acceleration Ratio: {ratioA}")
+        print(f"Velocity Ratio: {ratioV}")
+        
+        # Plot acceleration
+        TF.plot_acc()
+        
+        # Plot Fourier Transform
+        TF.plot_fft()
+        
+        # Plot Transfer Function
+        TF.plot_tf()
+        
+        # Plot Spectra
+        TF.plot_spectra()
+
+    if __name__ == "__main__":
+        main()
+
+.. raw:: html
+
+    
+
+ + +.. raw:: html + +

+ + +This script performs post-processing by building response spectra from acceleration time history. + +.. raw:: html + +
+ Click to expand the full Response Spectra Python code +

+
+.. code-block:: python
+
+    #########################################################
+    #
+    # Postprocessing python script
+    #
+    # Copyright: UW Computational Mechanics Group
+    #            Pedro Arduino
+    #
+    # Participants: Alborz Ghofrani
+    #               Long Chen
+    #
+    #-------------------------------------------------------
+
+    import numpy as np
+
+
+    def resp_spectra(a, time, nstep):
+        """
+        This function builds response spectra from acceleration time history,
+        a should be a numpy array,T and nStep should be integers.
+        """
+        
+        # add initial zero value to acceleration and change units
+        a = np.insert(a, 0, 0)
+        # number of periods at which spectral values are to be computed
+        nperiod = 100
+        # define range of considered periods by power of 10
+        minpower = -3.0
+        maxpower = 1.0
+        # create vector of considered periods
+        p = np.logspace(minpower, maxpower, nperiod)
+        # incremental circular frequency
+        dw = 2.0 * np.pi / time
+        # vector of circular freq
+        w = np.arange(0, (nstep+1)*dw, dw)
+        # fast fourier Horm of acceleration
+        afft = np.fft.fft(a)
+        # arbitrary stiffness value
+        k = 1000.0
+        # damping ratio
+        damp = 0.05
+        umax = np.zeros(nperiod)
+        vmax = np.zeros(nperiod)
+        amax = np.zeros(nperiod)
+        # loop to compute spectral values at each period
+        for j in range(0, nperiod):
+            # compute mass and dashpot coeff to produce desired periods
+            m = ((p[j]/(2*np.pi))**2)*k
+            c = 2*damp*(k*m)**0.5
+            h = np.zeros(nstep+2, dtype=complex)
+            # compute transfer function 
+            for l in range(0, int(nstep/2+1)):
+                h[l] = 1./(-m*w[l]*w[l] + 1j*c*w[l] + k)
+                # mirror image of Her function
+                h[nstep+1-l] = np.conj(h[l])
+            
+            # compute displacement in frequency domain using Her function
+            qfft = -m*afft
+            u = np.zeros(nstep+1, dtype=complex)
+            for l in range(0, nstep+1):
+                u[l] = h[l]*qfft[l]
+            
+            # compute displacement in time domain (ignore imaginary part)
+            utime = np.real(np.fft.ifft(u))
+            
+            # spectral displacement, velocity, and acceleration
+            umax[j] = np.max(np.abs(utime))
+            vmax[j] = (2*np.pi/p[j])*umax[j]
+            amax[j] = (2*np.pi/p[j])*vmax[j]
+        
+        return p, umax, vmax, amax
+
+.. raw:: html
+
+    
+
+ +.. raw:: html + +

+ +Workflow in EE-UQ +^^^^^^^^^^^^^^^^^ + +The procedure for performing a transfer function analysis is shown below. + +A forward propagation problem will be performed. The UQ engine to be used is Dakota with parallel execution and saved working directories. The Latin Hypercube Sampling (LHS) method will be used with 10 samples and a seed of 913. The UQ tab should look similar to the one below. + + +.. figure:: ./images/case2_UQTab_Workflow_TF.png + :scale: 30 % + :align: center + + Fig. 7. Uncertainty Quantification. + +The General Information (GI) tab will not be utilized in this example since no structure will be used. + +For the simulation (SIM tab), the input script will be loaded using a CustomPy Model. Along with this, the number of response nodes will be 1 with a spatial dimension of 2. Each node will have 3 degrees of freedom (DOF) and the profile will have damping ratio of 2%. The centroid node value will be 1. + + +.. figure:: ./images/case2_SimTab_TF.png + :scale: 30 % + :align: center + + Fig. 8. Simulations. + +In the Event (EVT) tab, a Multiple SimCenter load generator will be used. The motion of interest will be uploaded here as a JSON file and will have a factor of 1. + +In the Finite Element Modeling (FEM) tab, select a CustomPy-Simulation. + +In the Engineering Demand Parameter (EDP) tab, select a user defined generator. The response parameters will be the ratio of acceleration spectra and velocity spectra from the propagation from rock to the soil. + + +.. figure:: ./images/case2_EDPTab_Workflow_TF.png + :scale: 30 % + :align: center + + Fig. 9. Engineering Demand Parameters. + + +The Random Variables (RV) tab is where the values of H, Vs, and damping are implemented in the analysis. The values seen above are to be input here. A normal distribution will be used for all of these variables. + + +.. figure:: ./images/case2_RVTab_Workflow_TF.png + :scale: 30 % + :align: center + + Fig. 10. Random Variables. + + +The user can opt for running the analysis on their local device or in DesignSafe. + + +Results +^^^^^^^ +When the run is completed, the mean values of ratioA and ratioV, as well as uncertainty values,should be provided. These values show the ratio of average amplification/de-amplification in acceleration in velocity of the ground motion at the rock and the motion at the surface. The positive value of the ratio shows amplification occurred due to the propagation of the motion through the soil layer. + + +.. figure:: ./images/case2_Results_Workflow_TF.png + :scale: 30 % + :align: center + + Fig. 11. Results + + +Because the input variables (H, Vs, damping, motions) each have uncertainty, that uncertainty is carried on to the transfer function analysis. EE-UQ allows for uncertainty quantification which allows for an analysis of which variables might be most important or what the "worst-case scenario" could be when designing. The normalized normal distribution for the acceleration and velocity amplification ratios are shown below. + + +.. figure:: ./images/case2_Normalized_RatioA_histogram.png + :scale: 90 % + :align: center + + Fig. 12. Normalized Acceleration Amplification Factor Histogram + +.. figure:: ./images/case2_Normalized_RatioV_histogram.png + :scale: 90 % + :align: center + + Fig. 13. Normalized Velocity Amplification Factor Histogram + + +Due to the infinite possibilities of variability the three main variables (H, Vs, Damping) can have, we see that the normal distribution is not well suited for this analysis, specifically. EE-UQ allows for other methods of uncertainty quantification. Below is a Gaussian Mixture Model. This method is effective in measuring the probability of certain subpopulations within a larger population. + + +.. figure:: ./images/icase2_Gaussian_Mixture_RatioA_histogram.png + :scale: 89 % + :align: center + + Fig. 14. Gaussian Mixture Model - Acceleration Amplification Ratio. + + +.. figure:: ./images/case2_Gaussian_Mixture_RatioV_histogram.png + :scale: 60 % + :align: center + + Fig. 15. Gaussian Mixture Model - Velocity Amplification Ratio. + +.. note:: + This situation is specific only to this example; normal distributions could very well suit another example. + + + +By extrapolating the values from EE-UQ, the shape of the transfer function can be determined. The natural frequencies of the first 4 peaks in the transfer function are also shown below. + + +.. figure:: ./images/case2_TF_Nat_Freqs.png + :scale: 70 % + :align: center + + Fig. 16. Transfer Function. + + + + +.. raw:: html + +
+ +.. table:: Table 1. Natural Frequencies in the Transfer Function + :widths: auto + + +------------+---------------------+ + | Peak | Nat. Frequency (Hz) | + +============+=====================+ + | 1 | 20.49 | + +------------+---------------------+ + | 2 | 7.03 | + +------------+---------------------+ + | 3 | 4.20 | + +------------+---------------------+ + | 4 | 2.98 | + +------------+---------------------+ + +.. raw:: html + +
+ + + +With the transfer function plotted, the input motion can be transformed using the transfer function to reflect the motion at the surface. The figure below reflects the large amplification that occurred. The value of the highest acceleration increased from ~0.4g in the rock to ~1.25g in the soil. This amplification is also reflected in other frequencies. + + +.. figure:: ./images/case2_Full_Results_TF.png + :scale: 40 % + :align: center + + Fig. 17. Amplification of Ground Motion. + +The spectral acceleration spectra can be also determined for each of the motions. These spectra can be used to determine if a structure will be affected by the amplification. A single story structure (~0.1 second period) might be at risk due to this amplification. Any periods with a large amplification ratios should be further analyzed to ensure the safety of the structure and site. + + +.. figure:: ./images/case2_SpectralAcc_Results_TF.png + :scale: 50 % + :align: center + + Fig. 18. Amplification in Spectral Acceleration. + + +Remarks +------- +I'd like to thank everyone at SimCenter, specifically Sang-ri Yi, Frank McKenna, Jinyan Zhao, Aakash Bangalore Satish, and Barbaros Cetiner, for all of their effort and assistance they provided during the entire quarter. Navigating these tools and creating examples for them would've been a lot more stressful without their help. + +Transfer function is one of my favorite topics in geotechnical engineering. I'd really like to continue working with site response and performance based design so being able to create this example along with my class was great. + +Finally, I'd like to thank Prof. Arduino who made all of this possible. His determination and motivation was contagious throughout the academic quarter. There are many great professors but there is only one Pedro Arduino. + +.. bibliography:: references.bib diff --git a/_sources/case_3.rst.txt b/_sources/case_3.rst.txt new file mode 100644 index 0000000..11deaf8 --- /dev/null +++ b/_sources/case_3.rst.txt @@ -0,0 +1,144 @@ +.. _case_3: + +S3hark - Site Response 1 +================================ + +Author: Jose Barreto +-------------------- + +Introduction +------------ + +This page describes basic concepts of one-dimensional ground response analysis and the usage of transfer functions. For more details, the user is encounged to read :cite:`Kramer1996`. + + +Problem Description +------------------- + +A transfer function is somewhat like a filter that is applied to an incoming wave to produce an output signal. It determines how each frequency in the input motion is amplified or suppressed, by the medium of wave travel. Considering a spring-mass system with an excitation motion at input from the foundation connected to the spring and the corresponding response motion of the connected mass in the inertial system. The response motion of the mass will be a composite factor of the elastic and the viscous damping forces which are inherently embedded in the transfer function that determines the output motion we will obtain. In our wave propagation study we also employ transfer functions as a tool to explain the factors that make our input wave motion different from our output wave obtained. Evaluating the transfer function mathematically involves converting our known input motion to a Fourier series. Each term of the Fourier series is multiplied by the transfer function to obtain the Fourier series of the output response. Resonance is a physical phenomenon that occurs when the natural frequency of vibration of particles in a body (in our case the layers) matches the frequency of the forcing function (our input motion). It is experienced as an infinite amplification of the model. + + +Solution Strategy +----------------- + +#. Open the Dr. Layer program. By default we get twelve layers. The top six layers are hardwired into the system with a velocity of specified as very fast. The bottom six layers are hardwired with a velocity of very slow. + +#. Select all the layers to all have very slow values using the select all option. + +#. On the top left hand corner of the menu box choose the plot box tool and apply a plot box at the top of the layers. Do the same at four arbitrary points along the soil layers. Note the height (:math:`H`) you place the plots. + + + +#. Push the time increment button for about 1 minute. + +#. Obtain the angular frequency :math:`(2p/T)`, where :math:`T` is the period i.e. time it takes to complete one revolution. + +#. Obtain the maximum displacements from the plots by clicking on the crest of the curves with your cursor. + +.. math:: + TF = \frac{1}{\cos(\frac{wH}{v_s})} + + AF = \frac{1}{|\cos(\frac{wH}{v_s})|} + + +Where + +:math:`w` = Angular frequency (2pf) + +:math:`H` = distance between any two points in the layers under consideration. + +:math:`V` = Velocity of wave travel within the soil layer. + +:math:`TF` = Transfer function + +:math:`AF` = Amplification function + + +Dr. Layer's operation is controlled via menu commands (with associated keyboard accelerators), manipulation tools, scaling buttons, the load tool bar, and time control buttons. The program displays the results of its calculations visually in the form of animated displacements, and also in the form of dynamically generated time history plots. There are also mechanisms for getting numerical values. + +.. figure:: ./images/case1.png + :scale: 30 % + :align: center + :figclass: align-center + + +SimCenter Tool Used +------------------- + +blablabla + +.. list-table:: Title + :widths: 25 25 50 + :header-rows: 1 + + * - Heading row 1, column 1 + - Heading row 1, column 2 + - Heading row 1, column 3 + * - Row 1, column 1 + - + - Row 1, column 3 + * - Row 2, column 1 + - Row 2, column 2 + - Row 2, column 3 + + +Time can be controlled using either the keyboard or the time control buttons: + +* To run time **forward**: Press and hold the 'g' key or click and hold the time forward button: . + +* To reset time to **zero**: Type the '0' key or click on the time reset button: . + +* The current analysis time is **displayed** in the feedback pane at the bottom of the screen. + +* The analysis time step size can be controlled via the Time Step menu (there are combinations of material properties and time steps that intentionally lead to unstable results, so beware). + +* The display time step can be controlled via the Animation Speed menu. Internally, this command controls how many analysis time steps are computed between screen updates. + + +Example Application +------------------- + +Dr. Layer's tool palette is illustrated below (Windows version: the Mac version is similar but grouped a bit differently): + + + +* The **Arrow Tool** is used to select and manipulate objects. + +* The **Panner** and **Camera Orbit Tools** are used to change the viewing point and camera orientation via clicking and dragging. + +* The **Plot Box Tool** is used to create one of the various types of plot boxes: + + * **Displacement Time History plots** are created by clicking on the relevant layer. The top node in the layer is used as the plotting target. + + * **Fast Fourier Transform (FFT) plots** of a displacement history can be created by clicking on the time history plot. + + * **Stress-strain plots** can be created by control-clicking (i.e., holding down the control key while clicking) on the desired layer. + + + These controls are self-explanatory in regards to their functions. Note the following, however: + +.. note:: + The scaling buttons will continue to scale as long as they are held down. It is not necessary to click multiple times to get this effect. + + +Remarks +------- + +* To adjust the **plotting scales**, use the small expansion/contraction triangular buttons on the plot for the horizontal scale, and the plot scale buttons on the `Scale Button Toolbar <#scaling-buttons>`_ for the vertical scale. + +.. note:: + You will notice that all plots scale together. This is so that plots of a given type can be compared visually without any misleading differences in scale factors. + +* To adjust the **horizontal offset** of a plot, click in the plot and drag horizontally to scroll back and forth. + +.. note:: + In general, plots will automatically scroll as necessary as time is running. Once you have manually scrolled a plot, though, the automatic scrolling will cease until time is reset to zero. + +* Plot boxes can be added or removed at any time, but they only accumulate data beginning from the time they are installed, with the exception of FFT plots, which always plot the according to the data accumulated in the target time history. FFT plots can use up to the first 1024 points in a time history. + + +.. warning:: + Plotting FFT's will slow down the animation speed significantly, especially as the length of the time histories increase. + +.. bibliography:: references.bib + diff --git a/_sources/case_4.rst.txt b/_sources/case_4.rst.txt new file mode 100644 index 0000000..c6bb240 --- /dev/null +++ b/_sources/case_4.rst.txt @@ -0,0 +1,148 @@ +.. _case_4: + +S3hark - Site Response 2 +======================= + +Author: Chungen Tai +(Updated : 05/24/24) +------------------- + +Introduction +------------ + +This page shows basic concepts of one-dimensional nonlinear site response analysis by using various soil material models (ex: ElasticIsotropic, PM4Sand.).Site response analysis is commonly performed to analyze the propagation of seismic waves through soil. As shown in the below figure, one-dimensional response analyses, as a simplified method, assume that all boundaries are horizontal and that the response of a soil deposit is predominately caused by SH-waves propagating vertically from the underlying bedrock. Ground surface response is usually the major output from these analyses, together with profile plots such as peak horizontal acceleration along the soil profile. When liquefiable soils are presenting, maximum shear strain and excess pore pressure ratio plots are also important. + +.. figure:: ./images/siteResponse2.png + :scale: 60 % + :align: center + :figclass: align-center + +Problem Description +------------------- + +Treasure Island, situated atop sand fill strata overlaying Bay Mud within the San Francisco Bay, was subjected to seismic activity during the 1989 Loma Prieta Earthquake. Adjacent to Treasure Island lies Yerba Buena Island, characterized by its natural rock outcrop. Utilizing the site's soil profile and seismic data recorded on Yerba Buena Island, we endeavor to analyze the site response of Treasure Island. This entails computing parameters such as peak horizontal acceleration and shear strain distribution along the soil profile. Furthermore, we aim to investigate the influence of varying slope configurations on the site's response characteristics. + + + +Solution Strategy +----------------- + +#. Open the Dr. Layer program. By default we get twelve layers. The top six layers are hardwired into the system with a velocity of specified as very fast. The bottom six layers are hardwired with a velocity of very slow. + +#. Select all the layers to all have very slow values using the select all option. + +#. On the top left hand corner of the menu box choose the plot box tool and apply a plot box at the top of the layers. Do the same at four arbitrary points along the soil layers. Note the height (:math:`H`) you place the plots. + + + +#. Push the time increment button for about 1 minute. + +#. Obtain the angular frequency :math:`(2p/T)`, where :math:`T` is the period i.e. time it takes to complete one revolution. + +#. Obtain the maximum displacements from the plots by clicking on the crest of the curves with your cursor. + +.. math:: + TF = \frac{1}{\cos(\frac{wH}{v_s})} + + AF = \frac{1}{|\cos(\frac{wH}{v_s})|} + + +Where + +:math:`w` = Angular frequency (2pf) + +:math:`H` = distance between any two points in the layers under consideration. + +:math:`V` = Velocity of wave travel within the soil layer. + +:math:`TF` = Transfer function + +:math:`AF` = Amplification function + + +Dr. Layer's operation is controlled via menu commands (with associated keyboard accelerators), manipulation tools, scaling buttons, the load tool bar, and time control buttons. The program displays the results of its calculations visually in the form of animated displacements, and also in the form of dynamically generated time history plots. There are also mechanisms for getting numerical values. + +.. figure:: ./images/case1.png + :scale: 30 % + :align: center + :figclass: align-center + + +SimCenter Tool Used +------------------- + +blablabla + +.. list-table:: Title + :widths: 25 25 50 + :header-rows: 1 + + * - Heading row 1, column 1 + - Heading row 1, column 2 + - Heading row 1, column 3 + * - Row 1, column 1 + - + - Row 1, column 3 + * - Row 2, column 1 + - Row 2, column 2 + - Row 2, column 3 + +Time can be controlled using either the keyboard or the time control buttons: + +* To run time **forward**: Press and hold the 'g' key or click and hold the time forward button: . + +* To reset time to **zero**: Type the '0' key or click on the time reset button: . + +* The current analysis time is **displayed** in the feedback pane at the bottom of the screen. + +* The analysis time step size can be controlled via the Time Step menu (there are combinations of material properties and time steps that intentionally lead to unstable results, so beware). + +* The display time step can be controlled via the Animation Speed menu. Internally, this command controls how many analysis time steps are computed between screen updates. + + +Example Application +------------------- + +Dr. Layer's tool palette is illustrated below (Windows version: the Mac version is similar but grouped a bit differently): + + + +* The **Arrow Tool** is used to select and manipulate objects. + +* The **Panner** and **Camera Orbit Tools** are used to change the viewing point and camera orientation via clicking and dragging. + +* The **Plot Box Tool** is used to create one of the various types of plot boxes: + + * **Displacement Time History plots** are created by clicking on the relevant layer. The top node in the layer is used as the plotting target. + + * **Fast Fourier Transform (FFT) plots** of a displacement history can be created by clicking on the time history plot. + + * **Stress-strain plots** can be created by control-clicking (i.e., holding down the control key while clicking) on the desired layer. + + + These controls are self-explanatory in regards to their functions. Note the following, however: + +.. note:: + The scaling buttons will continue to scale as long as they are held down. It is not necessary to click multiple times to get this effect. + + +Remarks +------- + +* To adjust the **plotting scales**, use the small expansion/contraction triangular buttons on the plot for the horizontal scale, and the plot scale buttons on the `Scale Button Toolbar <#scaling-buttons>`_ for the vertical scale. + +.. note:: + You will notice that all plots scale together. This is so that plots of a given type can be compared visually without any misleading differences in scale factors. + +* To adjust the **horizontal offset** of a plot, click in the plot and drag horizontally to scroll back and forth. + +.. note:: + In general, plots will automatically scroll as necessary as time is running. Once you have manually scrolled a plot, though, the automatic scrolling will cease until time is reset to zero. + +* Plot boxes can be added or removed at any time, but they only accumulate data beginning from the time they are installed, with the exception of FFT plots, which always plot the according to the data accumulated in the target time history. FFT plots can use up to the first 1024 points in a time history. + + +.. warning:: + Plotting FFT's will slow down the animation speed significantly, especially as the length of the time histories increase. + +.. bibliography:: references.bib \ No newline at end of file diff --git a/_sources/case_5.rst.txt b/_sources/case_5.rst.txt new file mode 100644 index 0000000..958b1b4 --- /dev/null +++ b/_sources/case_5.rst.txt @@ -0,0 +1,124 @@ +.. _case_5: + +R2D - Liquefaction +================== + +Author: Morgan Sanger +--------------------- + +Introduction +------------ + +This page describes basic concepts of geospatial liquefaction hazard modeling. + + +Problem Description +------------------- + +Coseismic soil liquefaction is a phenomenon in which the strength and stiffness of a soil is reduced by earthquake shaking. Resilient communities and infrastructure networks, like lifelines or transportation systems, must be built to withstand and respond to hazards posed by coseismic soil liquefaction. Ideally, these predictions could be made: + +* quickly, in near-real-time after an event; + +* at high resolution, consistent with the scale of individual assets; and + +* at map-scale, across the regional extent affected by large earthquakes. + + +Common liquefaction models in practice require in-situ testing which cannot be continuously performed across large areas, thus presenting the need for “geospatial” liquefaction models. Prior tests of such models (e.g., :cite:`Zhu2017`) have shown both promising potential and severe shortcomings in predicting subsurface conditions with few geospatial predictors. There is a need to advance geospatial liquefaction modeling by integrating geotechnical data, liquefaction mechanics, artificial intelligence (AI), and many geospatial predictor variables to provide reliable regional liquefaction predictions for any earthquake event. When integrated with regional hazard assessment capabilities, geospatial liquefcation models will provide value throughout the life of infrastructure projects - from initial desk studies to refined project-specific hazard analyses - and will unlock insights beyond conventional practice, with opportunity to: + +* prescribe event-specific emergency response and evacuation routes immediately after an earthquake, + +* evaluate network reliability and infrastructure network resiliency using structural databases or other asset inventories, and + +* understand the impacts of earthquake events of vulnerable communities using population demographic data. + + +Solution Strategy +----------------- + +The state-of-practice geospatial liquefaction model is the :cite:`RB2020` model (updated version of the :cite:`Zhu2017` model), which uses logistic regression to predict probability of liquefaction based on five (5) geospatial variables and trained on a database of liquefaction case histories. + +In this problem, another modeling solution strategy is proposed, according to :cite:`Sanger2024`. The :cite:`Sanger2024` approach parses the problem into that which is empirical and best predicted by AI (the relationship between geospatial variables and subsurface traits) and that which is best predicted by mechanics (liquefaction response, conditioned on those traits). In this approach, the subsurface traits are characterized at point locations using available cone penetration testing (CPT) data. The liquefaction response at each CPT location is computed across a range of magnitude-scale peak ground accelerations (PGAM7.5) using state-of-practice liquefaction manifestation models (e.g., liquefaction potential index, LPI), thereby retaining the knowledge of liquefaction mechanics developed over the last 50+ years. The relationship between manifestation index and PGAM7.5 is represented as a functional form (Eqn 1) with two curve-fitting parameters: A and B (Fig 1). Therefore, the liquefaction response (i.e., A and B) at each CPT location becomes target variables of supervised learning AI models. + +.. math:: + MI = \left\{ \begin{array}{ll} + 0, & \text{PGA}_{M7.5} < 0.1g \\ + \arctan(B \cdot (\text{PGA}_{M7.5} - \frac{A}{B})^2) \cdot 100, & \text{PGA}_{M7.5} \geq 0.1g + \end{array} \right. + +**Eqn 1.** Manifestation index as a function of A, B, and PGAM7.5. + + +.. figure:: ./images/manifestationcurve.png + :scale: 100 % + :align: center + :figclass: align-center + + **Fig 1.** Example manifestation curve of LPI vs. PGAM7.5 for a single CPT. + +The AI model is trained to predict liquefaction response from a suite of geospatial predictor variables identified as proxies of liquefaction (37 variables). Example predictor variables include mapped or remotely sensed metrics of surface topography and roughness; distance to and elevation above water bodies; geology, geomorphology, hydrology, and more. By applying the final trained AI model to the full predictor datasets, the A and B parameters are predicted geospatially at a defined resolution. A final, key step of the approach is that AI predictions are geostatistically updated via regression kriging in the vicinity of field measurements, such that nearby predictions are based mostly on known subsurface conditions and have lower model uncertainty, whereas distal predictions are based mostly on AI and have greater model uncertainty. In summary, this approach effectively pre-computes liquefaction response across all possible ground motion intensities and durations based on AI-predicted subsurface conditions. These predictions are stored as mapped parameters, awaiting information about a specific earthquake of interest, real or scenario, such as a PGAM7.5 raster from R2D. + +Model predictions were then tested against the leading geospatial model :cite:`RB2020` in three case-history events using receiver operating characteristic and area under the curve analyses (Fig 2). The :cite:`Sanger2024` AI model (before kriging) performed significantly better than :cite:`RB2020` and was further improved by kriging (Fig 3). + +.. figure:: ./images/sanger2024-roc.png + :scale: 100 % + :align: center + :figclass: align-center + + **Fig 2.** Receiver operator characteristic curves and area under the curve (AUC) analyses comparing :cite:`RB2020` (“R&B”), and the :cite:`Sanger2024` *before* regression kriging (“LPI”). + +.. figure:: ./images/zhu2017.png + :scale: 100 % + :align: center + :figclass: align-center + + **(a)** + +.. figure:: ./images/sanger2024-ai.png + :scale: 100 % + :align: center + :figclass: align-center + + **(b)** + +.. figure:: ./images/sanger2024-krig.png + :scale: 100 % + :align: center + :figclass: align-center + + **(c)** + + **Fig 3.** Comparison between **(a)** Rashidian & Baise (2020), and this model **(b)** before and **(c)** after regression kriging for the Feb. 2011 M6.1 Christchurch event. + + +SimCenter Tool Used +------------------- + +The presented problem can be solved using SimCenter's Regional Resilience Determination `R2D `_ Tool. A substantially complete description of the tool is provided in the `R2D Documentation `_. + +The :cite:`Zhu2017` model is implemented in the R2D tool (version 4.2.0), whereas the :cite:`Sanger2024` model is not yet implemented in the R2D tool. In this project, the :cite:`Sanger2024` model was implemented in the R2D tool using Python applications file. + + +Example Application +------------------- + + +Remarks +------- + +* To adjust the **plotting scales**, use the small expansion/contraction triangular buttons on the plot for the horizontal scale, and the plot scale buttons on the `Scale Button Toolbar <#scaling-buttons>`_ for the vertical scale. + +.. note:: + You will notice that all plots scale together. This is so that plots of a given type can be compared visually without any misleading differences in scale factors. + +* To adjust the **horizontal offset** of a plot, click in the plot and drag horizontally to scroll back and forth. + +.. note:: + In general, plots will automatically scroll as necessary as time is running. Once you have manually scrolled a plot, though, the automatic scrolling will cease until time is reset to zero. + +* Plot boxes can be added or removed at any time, but they only accumulate data beginning from the time they are installed, with the exception of FFT plots, which always plot the according to the data accumulated in the target time history. FFT plots can use up to the first 1024 points in a time history. + +.. warning:: + Plotting FFT's will slow down the animation speed significantly, especially as the length of the time histories increase. + +.. bibliography:: references.bib \ No newline at end of file diff --git a/_sources/case_6.rst.txt b/_sources/case_6.rst.txt new file mode 100644 index 0000000..19ae9b3 --- /dev/null +++ b/_sources/case_6.rst.txt @@ -0,0 +1,152 @@ +.. _case_6: + +R2D - Landslides +================ + +Author: Luis Angel Guerrero Hoyos +--------------------- + +Introduction +------------ + +This page describes a preliminarly approach for landslide risk assesment using SimCenter tools (R2D). + + +Problem Description +------------------- + +Studying landslide assessment using Newmark analysis and ground motions is a multidisciplinary effort that integrates engineering, geology, and environmental science. It provides a comprehensive approach to understanding and mitigating the risks associated with landslides, ultimately leading to safer communities and more resilient infrastructure. Here we would like to analyze in a regional scale, what would be the response across a study area located in Seattle, WA, US. The idea is to estimate the predicted displacement in the study area if an earthquake with certain intensity measure (Arias Intensity :math:`I_a`) were to occur. This study integrates the infinite slope approach to estimate the static factor of safety so then the Critical Acceleration :math:`a_c` can be estimated. Finally with these parameters a Newmark displacement could be estimated using Randall W. Jibson correlation :cite:`Jibson1993`. + + +Solution Strategy +----------------- + +Jibson proposed model is used to calculate the Newmark displacement as follows: + +.. math:: + log(Dn) = 1.460\:log(I_a)-6.642\:a_c+1.546\:\:\:\:\:\:\:\:\:\:\:\:\:(1) + +Where: + +:math:`Dn` = Newmark Displacement [cm]. + +:math:`I_a` = Areas Intensity [m/s]. + +:math:`a_c` = Critical Acceleration [g]. + +Also, + +.. math:: + a_c = (FS_{static}-1)\:sin(\beta)\:\:\:\:\:\:\:\:\:\:\:\:\:(2) + +Where: + +.. math:: + FS_{static} = \frac{2c}{\gamma\:z\:sin(\beta)} + cot(\beta)\:tan(\phi)\:\:\:\:\:\:\:\:\:\:\:\:\:(3) + +:math:`\beta` = Slope Angle [°]. + +:math:`FS_{static}` = Static Factor of Safety [-]. + +:math:`c` = Cohesion [kPa]. + +:math:`\gamma` = Unit Weight [kN/m³]. + +:math:`\phi` = Friction Angle [°]. + +:math:`I_a` = Intensity measure time-history motion specific. + +In order to estimate the imput parameters of equation 1 the following steps could be done: + +#. Create a slope raster for a selected area: this can be created using a DTM model for the area of interest which can be downloaded from the `USGS portal. `_ + +#. Use QGIS built-in functions to perform the slope calculations. See QGIS `slope documentation. `_ + +To be continued... +------------------- +Dr. Layer's operation is controlled via menu commands (with associated keyboard accelerators), manipulation tools, scaling buttons, the load tool bar, and time control buttons. The program displays the results of its calculations visually in the form of animated displacements, and also in the form of dynamically generated time history plots. There are also mechanisms for getting numerical values. + +.. figure:: ./images/case1.png + :scale: 30 % + :align: center + :figclass: align-center + + +SimCenter Tool Used +------------------- + +blablabla + +.. list-table:: Title + :widths: 25 25 50 + :header-rows: 1 + + * - Heading row 1, column 1 + - Heading row 1, column 2 + - Heading row 1, column 3 + * - Row 1, column 1 + - + - Row 1, column 3 + * - Row 2, column 1 + - Row 2, column 2 + - Row 2, column 3 + +Time can be controlled using either the keyboard or the time control buttons: + +* To run time **forward**: Press and hold the 'g' key or click and hold the time forward button: . + +* To reset time to **zero**: Type the '0' key or click on the time reset button: . + +* The current analysis time is **displayed** in the feedback pane at the bottom of the screen. + +* The analysis time step size can be controlled via the Time Step menu (there are combinations of material properties and time steps that intentionally lead to unstable results, so beware). + +* The display time step can be controlled via the Animation Speed menu. Internally, this command controls how many analysis time steps are computed between screen updates. + + +Example Application +------------------- + +Dr. Layer's tool palette is illustrated below (Windows version: the Mac version is similar but grouped a bit differently): + + + +* The **Arrow Tool** is used to select and manipulate objects. + +* The **Panner** and **Camera Orbit Tools** are used to change the viewing point and camera orientation via clicking and dragging. + +* The **Plot Box Tool** is used to create one of the various types of plot boxes: + + * **Displacement Time History plots** are created by clicking on the relevant layer. The top node in the layer is used as the plotting target. + + * **Fast Fourier Transform (FFT) plots** of a displacement history can be created by clicking on the time history plot. + + * **Stress-strain plots** can be created by control-clicking (i.e., holding down the control key while clicking) on the desired layer. + + + These controls are self-explanatory in regards to their functions. Note the following, however: + +.. note:: + The scaling buttons will continue to scale as long as they are held down. It is not necessary to click multiple times to get this effect. + + +Remarks +------- + +* To adjust the **plotting scales**, use the small expansion/contraction triangular buttons on the plot for the horizontal scale, and the plot scale buttons on the `Scale Button Toolbar <#scaling-buttons>`_ for the vertical scale. + +.. note:: + You will notice that all plots scale together. This is so that plots of a given type can be compared visually without any misleading differences in scale factors. + +* To adjust the **horizontal offset** of a plot, click in the plot and drag horizontally to scroll back and forth. + +.. note:: + In general, plots will automatically scroll as necessary as time is running. Once you have manually scrolled a plot, though, the automatic scrolling will cease until time is reset to zero. + +* Plot boxes can be added or removed at any time, but they only accumulate data beginning from the time they are installed, with the exception of FFT plots, which always plot the according to the data accumulated in the target time history. FFT plots can use up to the first 1024 points in a time history. + + +.. warning:: + Plotting FFT's will slow down the animation speed significantly, especially as the length of the time histories increase. + +.. bibliography:: references.bib \ No newline at end of file diff --git a/_sources/case_7.rst.txt b/_sources/case_7.rst.txt new file mode 100644 index 0000000..2ab9bbf --- /dev/null +++ b/_sources/case_7.rst.txt @@ -0,0 +1,273 @@ +.. _case_7: + +R2D - Hurricane Maria Damage and Losses +======================================= + +Author: Daniel Acosta Reyes +--------------------------- + +Introduction +------------ + +Hurricane Maria, a Category 5 storm, struck Puerto Rico on September 20, 2017, claiming over 3000 lives. +This example assesses wind-induced damage for Vieques Island, Puerto Rico, using peak gust wind speed data from the National Institute of Standards and Technogology (NIST) and inventory of about 900 wood residential buildings. The inventory was created using a Python Notebook with BRAILS and formatted to a HAZUS-type damage assessment in R2D. The final R2D results include damage state and loss estimations. + + +Problem Description +------------------- + +Hurricanes are powerful tropical storms producing strong winds and heavy rains. The Saffir-Simpson Wind Scale, which categorizes hurricanes from 1 to 5 based on sustained wind speeds, helps estimate potential property damage :cite:`Saffir1973`. Hurricanes in categories 3 and above are deemed major due to their significant destructive potential. + +.. figure:: ./images/case7_DA1_saffirScale.png + :width: 500 + :align: center + :figclass: align-center + + **Fig. 1.** Saffir-Simpson Hurricane Scale. Soruce: TIGHE PA. +Hurricane Maria (Category 5) destroyed several homes and health facilities in Puerto Rico, including `the only healthcare center on Vieques Island `_, exacerbating the island's health crisis after decades-long military use. +A recent study by Guerra-Velasquez :cite:`Guerra2022` highlithed that infrastructure weaknesses made recovery more challenging and emphasize the need for increased resiliency and preparedness for future disasters. + +Solution Strategy +----------------- +The proposed solution gathers input data for a HAZUS-type damage and lossess analysis implemented in R2D. The dataset includes a baseline hazard, building inventory, and rulesets. + +#. **Baseline Hazard:** The hazard definition for this analysis is a raster file containing `Hurricane Maria Wind-Field Model for Puerto Rico `_ in miles per hour (mph). + + .. figure:: ./images/case7_DA2_raster.png + :width: 600 + :align: center + :figclass: align-center + + **Fig. 2.** Raster visualization of Hurricane Maria Wind-Field Model. + +#. **Building Inventory:** The building inventory for Puerto Rico is limited. However, using NHERI-SimCenter Building and Infrastructure Recognition using AI at Large-Scale `(BRAILS) `_ capabilities, it is possible to obtain building footprints and their associated attributes for a given location. Brails was implemented in a Jupyter Notebook to: + + * Obtain building footprints from open repositories (e.g., NSI) + * Fetch Google Street Views using Google API + * Import essential BRAILS modules such as NumberOfFloors, YearBuilt, and OccupancyClassifier + * Merge and create a Building Inventory Model (BIM) with required attributes for rulesets. + + A sample code to obtain bulding inventories is provided below. Make sure to ``!pip install brails`` before running.:: + + ''' Import modules ''' + from brails.workflow.FootprintHandler import FootprintHandler + from brails.workflow.NSIParser import NSIParser + from brails.workflow.ImHandler import ImageHandler + + ''' Building parameters ''' + # Define query location: + name_key = 'Vieques_2' + location = Lajas, Puerto Rico + # location = (lonmin, latmin, lonmax, latmax) # supports exten/bounding box format + + # Define footprint source: + # fpSource included in BRAILS are i) OpenStreetMaps, + # ii) Microsoft Global Building Footprints dataset, and iii) FEMA USA Structures. + # The keywords for these sources are osm, ms, and usastr, respectively. + footprint_source = 'osm' + + # Length units for the attributes (used when relevant): + lengthunit = 'm' # Options are 'm' or 'ft' + + # File where the building inventory will be stored: + outputfile = 'BuildingInventory.geojson'.format(name_key) + + ''' Initialize and Run BRAILS modules ''' + # Initialize FootprintHandler: + fpHandler = FootprintHandler() + + # Run FootprintHandler to get the footprints for the entered location: + fpHandler.fetch_footprint_data(location, fpSource=footprint_source, + outputFile='{0}_Footprints.geojson'.format(name_key), + lengthUnit=lengthunit) + footprints = fpHandler.footprints.copy() + + # Initialize NSIParser: + nsiParser = NSIParser() + + # Run NSIParser to merge the footprint data with NSI points: + nsiParser.GetNSIData(footprints, outfile=outputfile, lengthUnit=lengthunit) + + .. note:: + Complete Jupyter notebook can be accessed in DesignSafe - Data Depot at ``PRJ-4604/Losses_Damage_R2D`` under the name `InventoryBRAILS-notebook.ipynb`. + + + .. figure:: ./images/case7_DA3_footprints.png + :width: 600 + :align: center + :figclass: align-center + + **Fig. 3.** Sample of 932 Building Footprints in Vieques, Puerto Rico, and BRAILS NumberOfFloors module generator. + + +#. **HAZUS Rulesets:** `HAZUS `_ is a tool for risk modeling methodology that is implemented in R2D. To conduct damage and loss assessments, the software uses rulesets that parses building attributes such as occupancy, year built, roof height, and others. For this example, the HAZUS rulesets were obtained and modified from `E8 - Hurricane Wind Example `_ in R2D documentation. + + +SimCenter Tool Used +------------------- +This example uses the *Regional Resilience Determination Tool* (**R2D**) for wind damage and loss estimations in a residential area in Vieques, Puerto Rico, in order to assess the impact of wind forces and improve infrastructure resilience for future events. + +Example Application +------------------- ++-----------------+------------------------------------------------------------------------------------------+ +| Download files | `Download `_ | ++-----------------+------------------------------------------------------------------------------------------+ + +Download example **E17 - Hurricane Maria PR** files and open R2D. In the **File** tab, **Open** the "input.json" file within the example. + + .. figure:: ./images/case7_DA4_E1.png + :width: 400 + :align: center + :figclass: align-center + + **Fig. 4.** R2D inut data. + +.. note:: + You will notice that all the inputs are autopopulated. Make sure to follow the next steps to verify they are in the correct units and using the right file references. + + +#. In the **GI** panel, set the **Analysis Name**, **Units**, **Asset Layers**, and **Output Settings**. + + .. figure:: ./images/case7_DA5_E2.png + :width: 400 + :align: center + :figclass: align-center + + **Fig. 5.** R2D **GI** Input and Output Settings. + +#. For the **HAZ** Hazard Selection, select "Raster Defined Hazard" for an **Event Type**: "Hurricane". The **Intensity Measures of Raster** is "Peak Gust Wind Speed - PWS" in mph. + + .. figure:: ./images/case7_DA6_E3.png + :width: 400 + :align: center + :figclass: align-center + + **Fig. 6.** R2D **HAZ** Hazard Definition. + +#. In the **ASD** panel, make sure the **Regional Building Inventory** is set to "GIS File to AIM". Select the **Assets to Analyze** as intervals (e.g., 1-100) or go back to panel **VIZ** to manually select your assets by i) 'click' on the inventory layer; ii) push "Select" button (then drag selection in the map); iii) push "Add Assets" button. + + .. figure:: ./images/case7_DA7_E4.png + :width: 400 + :align: center + :figclass: align-center + + **Fig. 7 (a).** R2D **ASD** Assets Selection by Intervals. + + .. figure:: ./images/case7_DA8_E5.png + :width: 400 + :align: center + :figclass: align-center + + **Fig. 7 (b).** R2D **VIZ** Assets Selection in the Map. + +#. The **HTA** panel requires a "Site Specified" calculation + + .. figure:: ./images/case7_DA9_E6.png + :width: 400 + :align: center + :figclass: align-center + + **Fig. 8.** R2D **HTA** Building Mapping. + +#. This example does not need a Building Modeling. Therefore, **MOD** set to "none". + + .. figure:: ./images/case7_DA10_E7.png + :width: 400 + :align: center + :figclass: align-center + + **Fig. 9.** R2D **MOD** Building Model. + +#. The Building Analysis Method **ANA** will be "IMasEDP". + + .. figure:: ./images/case7_DA11_E8.png + :width: 400 + :align: center + :figclass: align-center + + **Fig. 10.** R2D **ANA** Building Analysis Method. + +#. **Damage & Loss Apllication** is found in the **DL** panel. Here you select "Pelicun3" with **Damage and Losss Method** "HAZUS MH MU". The Auto-population script referring to the specified ruleset is "auto_HU_PR.py" file. + + .. figure:: ./images/case7_DA12_E9.png + :width: 400 + :align: center + :figclass: align-center + + **Fig. 11.** R2D **DL** Damage & Loss Application. + +#. **RUN** the analysis. For the selection of 100 buildings, it should run in your local machine. For full inventory analysis, push **RUN at DesignSafe** button. + + .. warning:: + For complete inventory: run in DesignDafe, Stampede2 - 20 min|96 Skylake (SKX) cores | 2 nodes with 48 processors per node | 280 buildings per task + + .. note:: + **SP**, **UQ**, and **RV** panels are not used in this example. + +Results +------- + +Results will be retrieved from the **RUN** panel and manipulated in the visualization **VIZ** panel for mapping options. + + .. figure:: ./images/case7_DA13_E10.png + :width: 400 + :align: center + :figclass: align-center + + **Fig. 12.** R2D **RES** Regional Results Summary. + +The assessment gives two types of results: + +a) **MostLikelyCriticalDamageState**: The Damage State uses a scale from 0 to 4 that correspons to a qualitative damage description. + +.. list-table:: Damage State for Residential Buildings + :widths: 25 50 + :header-rows: 1 + + * - Damage State + - Qualitative Damage Description + * - 0 + - *No Damage or Very Minor Damage* - No visible damage from outside + * - 1 + - *Minor Damage* - One broken window and moderate roof cover loss + * - 2 + - *Moderate Damage* - Major roof cover damage + * - 3 + - *Sever Damage* - Major window damage and roof cover loss + * - 4 + - *Destruction* - Complete roof failure and/or failure of wall figremjobpane + +*Ref.:* FEMA HAZUS Hurricane Technical Manual `4.2.3 `_ + +b) **mean_RepairCost_loss_ratio**: The repair cost loss ratio is computed as a ratio of an estimated repair cost and wind-induced damage. The standard deviation of this variable is also provided as *std_RepairCost_loss_ratio*. This ratio goes on a scale from 0 to 1 and correlates with the *Damage State* (DS) variable. A typical breakdown corresponds to: + + * DS0 - Loss ratio 0% + * DS1 - Loss ratio 2% + * DS2 - Loss ratio 10% + * DS3 - Loss ratio 50% + * DS4 - Loss ratio 100% + +The results suggest that -of the 100 buildings assessed- most would suffer `Severe Damage` to `Destruction` given the inventory information. + +.. note:: + **Results Visualization**: R2D offers QGIS capabilities to visualize regional trends and produce mapping products. *Fig. 13* shows an example of a map product using the QGIS module to create *HeatMaps* of the **MostLikelyCriticalDamageState** variable and the spatial distribution of the **mean_RepairCost_loss_ratio** for different intervals. Then, using the "New Layout" option you can create maps with legends, title, and other elements. + See `QGIS Documentation `_ for more. + +.. figure:: ./images/case7_DA14_Results.png + :width: 700 + :align: center + :figclass: align-center + + **Fig. 13.** Mapping Visualization of Results Using QGIS in R2D. + +Remarks +------- + +* Hurricanes are increasingly happening with more intensity and force due to climate change. +* In locations such as Vieques, Puerto Rico, a comprehensive building inventory to assess huricane impact to infrastructure assets is limited. Assessing hazard exposure and consequences are key to increase resilience. +* R2D possess vast capabilities to adress this challenge, allowing researches to input hazard data and construct building inventories with BRAILS tools. +* This example provides strategies for creating building inventories in locations where data is scarce and implementing them in a format that could be used in R2D for regional analysis. + +References +---------- +.. bibliography:: references.bib \ No newline at end of file diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt new file mode 100644 index 0000000..36b1686 --- /dev/null +++ b/_sources/index.rst.txt @@ -0,0 +1,27 @@ +.. CESG 599 - NHERI - And Introduction to SimCenter ttols and DesignSafe Infrastructure. + +Welcome to CESG 599 - NHERI - An Introduction to SimCenter tool and DesignSafe Infrastructure! +============================================================================================== + +What is CESG599-NHERI +---------------------------------------- +This site provides a series of examples discussed during the CESG599-NHERI course. The course is designed to provide an introduction to the NHERI SimCenter tools and DesignSafe infrastructure. +The course is intended for graduate students and researchers in the field of civil engineering, but it is open to anyone interested in learning about the tools and resources available through the NHERI SimCenter and DesignSafe. + +.. toctree:: + :maxdepth: 2 + :caption: Contents + + case_0 + case_1 + case_2 + case_3 + case_4 + case_5 + case_6 + case_7 +.. Acknowledgements + +Acknowledgements +---------------- +This supporting materials were developed by CESG 599 students and Pedro Arduino in the Department of `Civil and Environmental Engineering `_ at the University of Washington under the auspices of the NHERI-SimCenter (`SimCenter `_). diff --git a/_static/CESG-599.gif b/_static/CESG-599.gif new file mode 100644 index 0000000..d182ff6 Binary files /dev/null and b/_static/CESG-599.gif differ diff --git a/_static/_sphinx_javascript_frameworks_compat.js b/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 0000000..8141580 --- /dev/null +++ b/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 0000000..f316efc --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/css/badge_only.css b/_static/css/badge_only.css new file mode 100644 index 0000000..c718cee --- /dev/null +++ b/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/_static/css/fonts/Roboto-Slab-Bold.woff b/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 0000000..6cb6000 Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/_static/css/fonts/Roboto-Slab-Bold.woff2 b/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 0000000..7059e23 Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/_static/css/fonts/Roboto-Slab-Regular.woff b/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 0000000..f815f63 Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/_static/css/fonts/Roboto-Slab-Regular.woff2 b/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 0000000..f2c76e5 Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/_static/css/fonts/fontawesome-webfont.eot b/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..e9f60ca Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/_static/css/fonts/fontawesome-webfont.svg b/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..855c845 --- /dev/null +++ b/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_static/css/fonts/fontawesome-webfont.ttf b/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..35acda2 Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/_static/css/fonts/fontawesome-webfont.woff b/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..400014a Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/_static/css/fonts/fontawesome-webfont.woff2 b/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000..4d13fc6 Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/_static/css/fonts/lato-bold-italic.woff b/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 0000000..88ad05b Binary files /dev/null and b/_static/css/fonts/lato-bold-italic.woff differ diff --git a/_static/css/fonts/lato-bold-italic.woff2 b/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 0000000..c4e3d80 Binary files /dev/null and b/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/_static/css/fonts/lato-bold.woff b/_static/css/fonts/lato-bold.woff new file mode 100644 index 0000000..c6dff51 Binary files /dev/null and b/_static/css/fonts/lato-bold.woff differ diff --git a/_static/css/fonts/lato-bold.woff2 b/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 0000000..bb19504 Binary files /dev/null and b/_static/css/fonts/lato-bold.woff2 differ diff --git a/_static/css/fonts/lato-normal-italic.woff b/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 0000000..76114bc Binary files /dev/null and b/_static/css/fonts/lato-normal-italic.woff differ diff --git a/_static/css/fonts/lato-normal-italic.woff2 b/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 0000000..3404f37 Binary files /dev/null and b/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/_static/css/fonts/lato-normal.woff b/_static/css/fonts/lato-normal.woff new file mode 100644 index 0000000..ae1307f Binary files /dev/null and b/_static/css/fonts/lato-normal.woff differ diff --git a/_static/css/fonts/lato-normal.woff2 b/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 0000000..3bf9843 Binary files /dev/null and b/_static/css/fonts/lato-normal.woff2 differ diff --git a/_static/css/theme.css b/_static/css/theme.css new file mode 100644 index 0000000..19a446a --- /dev/null +++ b/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 0000000..4d67807 --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 0000000..89435bb --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '1.0.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 0000000..a858a41 Binary files /dev/null and b/_static/file.png differ diff --git a/_static/images/CESG-599.gif b/_static/images/CESG-599.gif new file mode 100644 index 0000000..d182ff6 Binary files /dev/null and b/_static/images/CESG-599.gif differ diff --git a/_static/images/SimCenter_logo.png b/_static/images/SimCenter_logo.png new file mode 100644 index 0000000..3900bf5 Binary files /dev/null and b/_static/images/SimCenter_logo.png differ diff --git a/_static/jquery.js b/_static/jquery.js new file mode 100644 index 0000000..c4c6022 --- /dev/null +++ b/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/_static/js/html5shiv.min.js b/_static/js/html5shiv.min.js new file mode 100644 index 0000000..cd1c674 --- /dev/null +++ b/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/_static/js/theme.js b/_static/js/theme.js new file mode 100644 index 0000000..1fddb6e --- /dev/null +++ b/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 0000000..d96755f Binary files /dev/null and b/_static/minus.png differ diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 0000000..7107cec Binary files /dev/null and b/_static/plus.png differ diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 0000000..84ab303 --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_static/searchtools.js b/_static/searchtools.js new file mode 100644 index 0000000..92da3f8 --- /dev/null +++ b/_static/searchtools.js @@ -0,0 +1,619 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlinks", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js new file mode 100644 index 0000000..8a96c69 --- /dev/null +++ b/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/case_0.html b/case_0.html new file mode 100644 index 0000000..d28c125 --- /dev/null +++ b/case_0.html @@ -0,0 +1,337 @@ + + + + + + + Course Introduction — CESG-599 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+_images/case0-1.png +
+
+

Course Introduction

+
+

CESG599 - NHERI - An introduction to NHERI Simcenter tools and DesignSafe Resources

+
+
+

Authors:

+

Kendra Mutch, Erick Martinez, Jose Barreto, Chungen Tai, Morgan Sanger, Luis Guerrero, Daniel Acosta, and Pedro Arduino

+
+
+

Course Description

+

In this course, we explore the fundamentals of SimCenter tools and the DesignSafe infrastructure. +The course adopts a self-directed approach, where students follow a well-established framework tailored +for this format. Over the course of 10 weeks, we investigate the core concepts of SimCenter and DesignSafe, +and examine four to five SimCenter tools, covering one every two weeks. Students are tasked with mastering +the essentials of each tool and delivering presentations to the class. Additionally, they work through one +or more practical examples for each tool, presenting their findings to their peers. Constructive feedback for +each tool presentation is an integral part of the learning experience. DesignSafe and SimCenter personnel are +invited to give Zoom presentations based on availability. At the end of the course, a small final project, +with a topic of choice for each student or group of students, is required, providing an opportunity for +deeper exploration and application of the learned concepts.

+

SimCenter provides next-generation computational modeling and simulation software tools, user support, +and educational materials to the natural hazards engineering research community with the goal of advancing +the user’s capability to simulate the impact of natural hazards on structures, lifelines, and communities.

+

DesignSafe is a comprehensive cyberinfrastructure that provides cloud-based tools to manage, analyze, understand, +and publish critical data for research to understand the impacts of natural hazards. The capabilities within +the DesignSafe infrastructure are available at no-cost to all researchers working in natural hazards.

+
+
+

Learning Objectives

+
    +
  1. Develop a familiarity with Simcenter tools and DesignSafe cyberinfrastructure

  2. +
  3. Develop a familiarity with the breath of SimCenter tools.

  4. +
  5. Develop a suitable background for using HPC resources.

  6. +
  7. Introduce/revise concepts related to structural and geotechnical engineering including UQ concepts, FEM, PB, etc.

  8. +
  9. Provide a working knowledge for selecting, using, and interpreting tools for Structural and geotechnical design and analysis.

  10. +
  11. Introduce markup language to develop easy-to-read, easy-to-write documents in the sphinx python package.

  12. +
+
+
+

Introduction

+

This section should provide a brief executive summary, giving an overview of the project. It should be written last to ensure it accurately reflects the content of the entire report. Aim for a short paragraph that highlights the key points, objectives, and outcomes of the project.

+
+
+

Problem Description

+

Clearly describe the problem being addressed. Use text and images to illustrate the issue, ensuring that even readers unfamiliar with the topic can understand the context and significance. This section should detail the background, relevance, and any previous attempts to solve the problem.

+
+
+

Solution Strategy

+

Outline the strategy used to solve the problem. This should include a detailed explanation of the methods, processes, and any equations or theoretical frameworks involved. Be sure to make this section as comprehensive as necessary to fully explain the approach taken.

+
+
+

SimCenter Tool Used

+

Provide a brief description of the SimCenter tool(s) used in the project. Explain its relevance and how it was applied. This section should be informative yet concise, offering enough detail to understand the tool’s role and capabilities without overwhelming the reader.

+
+
+

Example of Application

+

Give a concrete example of how the solution strategy was applied, using text and images. This helps to illustrate the practical application of the theoretical concepts and methods discussed earlier. Ensure the example is detailed enough to show the effectiveness of the solution.

+
+
+

Remarks

+

Use this section for any additional comments or observations that do not fit into the other sections. This could include limitations, unexpected findings, future directions, or any acknowledgments.

+
+
+

EXAMPLELS of LISTS, FIGURES, TABLE, REFERENCE, etc

+
    +
  1. Open the Dr. Layer program. By default we get twelve layers. The top six layers are hardwired into the system with a velocity of specified as very fast. The bottom six layers are hardwired with a velocity of very slow.

  2. +
  3. Select all the layers to all have very slow values using the select all option.

  4. +
  5. On the top left hand corner of the menu box choose the plot box tool and apply a plot box at the top of the layers. Do the same at four arbitrary points along the soil layers. Note the height (\(H\)) you place the plots.

    +
    +

    <insert image>

    +
    +
  6. +
  7. Push the time increment button for about 1 minute.

  8. +
  9. Obtain the angular frequency \((2p/T)\), where \(T\) is the period i.e. time it takes to complete one revolution.

  10. +
  11. Obtain the maximum displacements from the plots by clicking on the crest of the curves with your cursor.

  12. +
+
+\[ \begin{align}\begin{aligned}TF = \frac{1}{\cos(\frac{wH}{v_s})}\\AF = \frac{1}{|\cos(\frac{wH}{v_s})|}\end{aligned}\end{align} \]
+

Where

+

\(w\) = Angular frequency (2pf)

+

\(H\) = distance between any two points in the layers under consideration.

+

\(V\) = Velocity of wave travel within the soil layer.

+

\(TF\) = Transfer function

+

\(AF\) = Amplification function

+

Dr. Layer’s operation is controlled via menu commands (with associated keyboard accelerators), manipulation tools, scaling buttons, the load tool bar, and time control buttons. The program displays the results of its calculations visually in the form of animated displacements, and also in the form of dynamically generated time history plots. There are also mechanisms for getting numerical values.

+
+_images/case1.png +
+
+
+

SimCenter Tool Used

+

blablabla

+ + +++++ + + + + + + + + + + + + + + + + +
Title

Heading row 1, column 1

Heading row 1, column 2

Heading row 1, column 3

Row 1, column 1

Row 1, column 3

Row 2, column 1

Row 2, column 2

Row 2, column 3

+

Time can be controlled using either the keyboard or the time control buttons:

+
    +
  • To run time forward: Press and hold the ‘g’ key or click and hold the time forward button: <insert icon>.

  • +
  • To reset time to zero: Type the ‘0’ key or click on the time reset button: <insert icon>.

  • +
  • The current analysis time is displayed in the feedback pane at the bottom of the screen.

  • +
  • The analysis time step size can be controlled via the Time Step menu (there are combinations of material properties and time steps that intentionally lead to unstable results, so beware).

  • +
  • The display time step can be controlled via the Animation Speed menu. Internally, this command controls how many analysis time steps are computed between screen updates.

  • +
+
+
+

Example Application

+

Dr. Layer’s tool palette is illustrated below (Windows version: the Mac version is similar but grouped a bit differently):

+

<insert tool palette image>

+
    +
  • The Arrow Tool is used to select and manipulate objects.

  • +
  • The Panner and Camera Orbit Tools are used to change the viewing point and camera orientation via clicking and dragging.

  • +
  • The Plot Box Tool is used to create one of the various types of plot boxes:

    +
    +
      +
    • Displacement Time History plots are created by clicking on the relevant layer. The top node in the layer is used as the plotting target.

    • +
    • Fast Fourier Transform (FFT) plots of a displacement history can be created by clicking on the time history plot.

    • +
    • Stress-strain plots can be created by control-clicking (i.e., holding down the control key while clicking) on the desired layer.

    • +
    +
    +
  • +
+
+

These controls are self-explanatory in regards to their functions. Note the following, however:

+
+
+

Note

+

The scaling buttons will continue to scale as long as they are held down. It is not necessary to click multiple times to get this effect.

+
+
+
+

Remarks

+
    +
  • To adjust the plotting scales, use the small expansion/contraction triangular buttons on the plot for the horizontal scale, and the plot scale buttons on the Scale Button Toolbar for the vertical scale.

  • +
+
+

Note

+

You will notice that all plots scale together. This is so that plots of a given type can be compared visually without any misleading differences in scale factors.

+
+
    +
  • To adjust the horizontal offset of a plot, click in the plot and drag horizontally to scroll back and forth.

  • +
+
+

Note

+

In general, plots will automatically scroll as necessary as time is running. Once you have manually scrolled a plot, though, the automatic scrolling will cease until time is reset to zero.

+
+
    +
  • Plot boxes can be added or removed at any time, but they only accumulate data beginning from the time they are installed, with the exception of FFT plots, which always plot the according to the data accumulated in the target time history. FFT plots can use up to the first 1024 points in a time history.

  • +
+
+

Warning

+

Plotting FFT’s will slow down the animation speed significantly, especially as the length of the time histories increase.

+
+
+
+
+[GV22] +

G. R. Guerra Velázquez. Hurricane maría and public health in puerto rico: lessons learned to increase resiliency and prepare for future disasters. Annals of Global Health, 2022.

+
+
+[RB20] +

V. Rashidian and L. G. Baise. Regional efficacy of a global geospatial liquefaction model. Engineering geology, 272:105644, 2020.

+
+
+[Saf73] +

H. S. Saffir. Hurricane wind and storm surge. The Military Engineering, pages 4–5, 1973.

+
+
+[SGM24] +

M. D. Sanger, M. Geyin, and B. W. Maurer. A global liquefaction model for rapid response and scenario modeling. Manuscript in preparation, 2024.

+
+
+[ZBT17] +

J. Zhu, L. G. Baise, and E. M. Thompson. An updated geospatial liquefaction model for global application. Bulletin of the Seismological Society of America, 107(3):1365–1385, 2017.

+
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/case_1.html b/case_1.html new file mode 100644 index 0000000..3be8da2 --- /dev/null +++ b/case_1.html @@ -0,0 +1,297 @@ + + + + + + + quoFEM - Settlements — CESG-599 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

quoFEM - Settlements

+
+

Author: Kendra Mutch

+
+
+

Introduction

+

This page describes basic concepts of computing settlement computations in QuoFEM. The calculation methods discussed include forward propagation, deterministic and Bayesian calibration, and sensitivity analysis. For more details, the user is encounged to read :cite:`Holtz and Kovacs 2011’

+
+
+

Project Description

+

The goal of this project is to quantify settlement, parameters impacting settlement, and observe how uncertainty in various input parameters impact the ultimate settlement of a cohesive soil. These copmutations make use of the program QuoFEM. The following report discusses the features of the program, theory regarding the settlement and uncertainty concepts discussed above, as well as three example problems applying different features of QuoFEM.

+

The first example makes use of the Forward Propagation feature of QuoFEM, which allows one to apply uncertainty to input parameters (such as preconsolidation pressure, compression and recommpression index, void ratio, unit weight, etc.) to determine which paramter(s) impact the ultimate settlement most. In-situ testing, lab testing, and various models used to determine soil paramters may all contain uncertainty. Thus, it is important to consider uncertainty in geotechnical calculations, such as settlement, and not accept a single predicted value without accounting for uncertainty as completely true to reality. The forward propagation analysis will help us translate uncertainty in soil parameters to uncertainty in ultimate settlement, reducing chances of highly underpredicting or overpredicting settlement.

+

In the second example, Bayesian and Deterministic Calibration are used to optimize the value of an input parameter to yield a desired settlement. In other words, given a specific value of ultimate settlement, we can calculate the value of an unknown input paramter.

+

The final example applies the Sensitivity Analysis feature of QuoFEM to determine which input parameters impact the resulting ultimate settlement most. As the discussion of results will reveal, settlement shows a strong correlation with some soil parameters, and a weaker correlation with other paramters. By knowing which parameters settlement is most dependent on, one can allocate funds in site investigation or lab testing to use the most accurate methods for predicting such parameters. Or, one may simply be cautious that potential uncertainty in such parameters, especially compounded uncertainty of multiple parameters, could lead to high uncertainty in the predicted settlement, and perhaps a more conservative design should be implemented.

+

All examples will use a python input script, paired with the Dakota uncertainty quantification tool in QuoFEM. These aspects of the project are discussed in further detail throughout the report.

+

The soil profile and problem scenario are the same for all three examples and are depicted in the image and table below.

+
+images/ProblemScenarioP1.png +
+ + +++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Soil Profile Parameters

Parameter

Mean Value

Coefficient of Variation (%)

h1

3 ft

5

h2

25 ft

5

Cc

0.75

20

eo

1.54

7

Cr

0.05

20

change in pressure

200 psf

50

k

10E-6 (cm/sec)

200

unit weight of fill

130 pcf

7

height of fill

5 ft

2

+
+
+

Example One Solution Strategy - Forward Propagation

+
    +
  1. Open the QuoFEM. By default, the UQ method is Forward Propagation and the UQ Engine is Dakota. In this example, we will use these defaults. Specify a sample number of 200 and a seed number of 949. Ensure the Parellel Execution and the Save Working dirs boxes are checked.

  2. +
  3. Select the FEM tab. From the drop down menu, select Python. Navigate to the location of the Input Script and the Parameters Script.

  4. +
  5. Select the RV tab. Enter the random variables (listed in the table in the problem description). Selelct a normal distribution for each random variable, and enter the mean and standard deviation. Remember, the standard deviation must be calculated for each variable from the given coefficient of variation. The below formula may be used to convert coefficient of variation to the standard deviation.

  6. +
  7. In the EDP tab, specify the variable of interest as Settlement and assign it a Length of 1.

  8. +
  9. Run the example either on your machine or in the cloud. For running in the cloud, see the SimCenter Tool Used section for additional details.

  10. +
+
+
+

Example Two Solution Strategy - Bayesian and Deterministic Calibration

+
    +
  1. Open QuoFEM. Change the UQ method to Bayesain Callibration and keep the default UQ Engine as Dakota.

  2. +
+
+
+

Example Three Solution Strategy - Sensitivity Analysis

+
    +
  1. In the UQ tab, select Sensitivity Analysis as the UQ Method. From the UQ Engine drop down, select SimCenterUQ. In the Method drop down, select Monte Carlo. For the # of samples, enter 500, and for the seed number, enter 106.

  2. +
  3. Select the FEM tab. From the FEM drop down, select Python. Locate the file path for the Input Script and the Paramters Script.

  4. +
  5. In the RDV tab, enter the same random variables as the Forward Propagation example.

  6. +
  7. In the EDP tab, use the same inputs as the Forward Propagation example.

  8. +
  9. Choose to run the example either on your machine in the cloud. For running in the cloud, see the SimCenter Tool Used section for additional details.

  10. +
+
+
+

SimCenter Tool Used

+

QouFEM allows the integration of finite element and hazard compuatations with uncertainty quantification tools. There are five different tabs in QuoFEM; four input tabs and one results tab. The four input tabs are outlined below:

+
+
    +
  • UQ tab - The UQ tab allows one to select the analysis method (Forward Propagation, Bayesian +Callibration, Sensitivity Analysis, etc.). Additionally, one can specify a statistics model and the number +of samples to run.

  • +
  • FEM tab - The FEM is where a python script is input, and a finite element method (such as Openseas) may +be selected.

  • +
  • RV tab - The RV tab allows you define random variables and apply desired uncertainty and statistical +models (normal distribution, uniform distribution etc.) to each variable.

  • +
  • EDP tab - The EDP tab allows one to define quantities of interest. For example, the ultimate settlement.

  • +
+
+

After entering the inputs for your project, you may choose run the project on your machine by simply clicking Run or you may run the project in the cloud by selecting Run at Design Safe. If you choose to run your project in the cloud, you must login to you Design Safe account and specify a maximum run time. To ensure that your project does not expire while waiting in the que,, select a run time of at least 10 hours.

+

The results tab contains both a “Summary” page and a “Data Values” page. The “Summary” page contains a brief +outline of the values computed. The “Data Values” page contains a more comprehensive set of results and figures.

+
+
+

Example Application

+

There are various features within the “Data Values” page of the Results tab which may aid in analysis. Below is information about navigating the “Data Values” page to extract desired information:

+
+
+
    +
  • To View a Scatterplot of a Parameter vs. Run Number - left click once on any column.

  • +
+
+
    +
  • To View a Cumulative Frequency Distribution for a Variable - First left click once on the column for the +variable that you want to view a cumulative frequency distribution for. Then right click once on the same +column.

  • +
  • To View a Histogram for a Variable - After following the steps to display a cumulative frequency +distribution, left click on the same column once more to display the histogram.

  • +
  • To View a Scatterplot of One Variable vs. another Variable - Right click once on one of the variables. +This defines which variable will be on the x-axis. Then, left click once on the variable which you want +plotted on the y-axis.

  • +
  • To Export the Data Table - Select the Save Table icon above the data, and choose a location for saving +the table as a .csv file.

  • +
+
+
+
+

Remarks

+
+
+
+[GV22] +

G. R. Guerra Velázquez. Hurricane maría and public health in puerto rico: lessons learned to increase resiliency and prepare for future disasters. Annals of Global Health, 2022.

+
+
+[RB20] +

V. Rashidian and L. G. Baise. Regional efficacy of a global geospatial liquefaction model. Engineering geology, 272:105644, 2020.

+
+
+[Saf73] +

H. S. Saffir. Hurricane wind and storm surge. The Military Engineering, pages 4–5, 1973.

+
+
+[SGM24] +

M. D. Sanger, M. Geyin, and B. W. Maurer. A global liquefaction model for rapid response and scenario modeling. Manuscript in preparation, 2024.

+
+
+[ZBT17] +

J. Zhu, L. G. Baise, and E. M. Thompson. An updated geospatial liquefaction model for global application. Bulletin of the Seismological Society of America, 107(3):1365–1385, 2017.

+
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/case_2.html b/case_2.html new file mode 100644 index 0000000..c586b10 --- /dev/null +++ b/case_2.html @@ -0,0 +1,778 @@ + + + + + + + EEUQ - Transfer Function and Uncertainty — CESG-599 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

EEUQ - Transfer Function and Uncertainty

+
+

Author: Erick Martinez

+
+
+

Introduction

+

This page describes the basic concept of transfer functions and their use in a site response analysis. Along with this, the uncertainty in this process will be investigated using EE-UQ, a SimCenter tool. For more details, the user is encouraged to read [].

+
+

Note

+

This example was prepared on a Mac system. Differences in the UI between Mac and other systems are possible, but should not affect the outcome.

+
+
+
+

Problem Description

+

A transfer function acts as a filter that can amplify or de-amplify an incoming wave from a medium to produce the output signal in another medium. To simplify the idea of a transfer function, a spring-mass system can be used. As a motion is applied on the mass connected to a spring; a responsive outgoing wave will then be propagated through the mass and the spring. This outgoing motion will be a composite factor of the stiffness and elastic damping forces found within the spring-mass system.

+
+

See also

+

For more information, visit the Free Vibrations of a Spring-Mass-Damper System.

+
+

This can be applied to earth systems in the form of ground motions. An example of this is an earthquake motion acting on a rock layer at a certain depth. This motion is then transferred through the soil profile and is reflected as a different motion at the surface. In order to determine the influence of a soil profile on the motion, three major components are required: thickness of layer (H), shear wave velocity (Vs), and damping ratio.

+

It is important to ensure that this difference in motion is accounted for. When a structure is constructed, it has a specific resonance. Understanding this resonance is important because if an earthquake motion has similar peaks in frequency, causing amplification of the motion, the structure could have a significant and potentially disastrous behavior. While the incoming motion at the rock might have a different natural resonance, the motion at the surface might match that of the structure. The design of earthquake resistant structures relies on the accurate determination of transfer functions in sites. An example of this is shown below - where a motion was amplified from 0.03g to 0.15g due to the presence of soft clay.

+
+_images/case2_Resonance_Building_Example_TF.png +
+

Fig. 1. Mexico City Earthquake Amplification.

+
+
+

As with any engineering properties, there will always be the presence of uncertainty. A layer might have differential thicknesses in certain regions, causing the height to be non-uniform. Shear wave velocity can change very quickly depending on depth and composition of the materials within the layer. Damping can also be affected by changes in stratigraphy and composition. To account for this, uncertainty must be incorporated into a transfer function analysis. This inclusion will aid in the accuracy and reliability of site response analyses.

+
+
+

Solution Strategy

+
+

Fourier Transform

+

In earth systems, this relationship between incoming and outgoing wave can be evaluated through mathematically converting an input motion, typically an acceleration-time history, to a Fourier series using the Fast Fourier Transform (FFT). In the Fourier space, the motion is then multiplied by the transfer function, resulting in the outgoing Fourier motion. This can then be converted back into various plots, such as acceleration-time history and spectral acceleration vs. period, that allow for analysis of the outgoing motion. An analysis of this ground motion can provide frequencies of interest where ground accelerations would be highest/lowest, which can aid in site response analysis and planning.

+
+_images/case2_TF_Rock_to_Soil1.png +
+

Fig. 2. Transfer Function from Rock to Soil.

+
+
+
+
+

Transfer Function Equation

+

To calculate a transfer function, the equation below can be used. In a single layer soil profile, it is assumed that the impedance contrast between layers is zero. Using a tool like EE-UQ can help provide the ratio between the input and output motion and provides the uncertainty in those motions and variables.

+
+_images/case2_TF_Equation.png +
+

Eqn. 1. Transfer Function Equation [Kramer, 1996]

+
+
+
+

Note

+

This equation changes based on the soil profile. Having multiple soil layers can lead to an impedance contrast. The equation also changes if the damping ratio is assumed to be zero. Kramer (1996) provides more information for the different instances.

+
+
+
+

Example

+

A typical transfer function would look similar to the one provided below. In the figure below, there are various peaks of natural resonance for the transfer function, which is where the motion will have the greatest amplification/de-amplification.

+
+_images/case2_TF_Nat_Freqs.png +
+

Fig. 3. Transfer Function from Rock to Soil.

+
+
+
+
+
+

SimCenter Tool Used

+

To understand transfer functions, there are many tools available. One of these tools is the SimCenter Transfer Function Tool (TFT). This tool introduces users to transfer functions by providing the output motion at a site given the motion, thickness of layers, shear wave velocities, and damping ratio. TFT allows for easy analysis of amplification/de-amplification of ground motions based on specific sites.

+

The Earthquake Engineering with Uncertainty Quantification Application (EE-UQ) is a SimCenter research application that also allows for site response predictions due to earthquake loading. In addition to basic transfer function quantification, it allows for the analysis of uncertainty in the predictions based on the uncertainty found within the input model, motion, etc. This workflow application allows the user to run analyses in the background and provides a simple user interface that facilitates its use.

+
+
+

Example Application

+
+

Soil Profile

+

In this example, we will analyze the amplification/deamplification effects of a ground motion caused by its propagation through the soil layer. The 10 meter soil layer has a shear wave velocity (Vs) of 500 m/s and a damping ratio of 3%.

+
+_images/case2_CESG599_TF_image1.png +
+

Fig. 4. Soil Profile & Material Properties.

+
+
+
+
+

Uncertainty

+

Because of the presence of uncertainty in the soil properties, the transfer function will include uncertainty in its effects. Normal distribution values for each variable (H, Vs, damping) will be provided. This uncertainty will be quantified through multiple runs in EE-UQ and expressed as ratios of mean velocity and acceleration, along with standard deviation and skewness.

+

The following normal distribution figures represent the uncertainty within each variable.

+
+_images/case2_Combined_RV_1.png +
+

Fig. 5. Uncertainty in Each Variable (H, Vs, Damping).

+
+
+
+
+

Motion

+

An earthquake motion will be applied to a rock, located at the bottom of a one-dimensional soil profile. The motion is shown below as an acceleration time history as well as a Fourier amplitude spectra (FAS).

+
+_images/case2_Input_Motion_TF.png +
+

Fig. 6. Input Ground Motion.

+
+
+
+
+

Pre-Workflow Python Script

+

To complete a transfer function analysis in EE-UQ various Python files had to be generated. The following script calculates the transfer function of a soil layer and applies it to a given acceleration record.

+
+Click to expand the full Transfer Function Example code +
# ############################################################################################################
+# Title: Transfer Function Calculation
+# Description: This script calculates the transfer function of a soil layer and applies it to a given acceleration record.
+# Author: Pedro Arduino
+# UW Computational Geotechnical Group
+# Date: 2024
+# All Rights Reserved
+# ############################################################################################################
+
+# %%
+import numpy as np
+import json
+import matplotlib.pyplot as plt
+from numpy.fft import fft, ifft
+from scipy import integrate
+from respSpectra import resp_spectra
+
+class TFunctionClass:
+    def __init__(self, damping, H, Vs):
+        # Define the variables
+        self.m_freq = None
+        self.m_time = None
+        self.m_acc = None
+        self.m_absFft = None
+        self.m_absSoilTF = None
+        self.m_absIFft = None
+        self.m_accT = None
+
+        self.m_vel = None
+        self.m_disp = None
+        self.m_velT = None
+        self.m_dispT = None
+
+        # Define soil layer parameters
+        self.m_damping = damping / 100.0 # damping from percentage to number
+        self.m_H = H
+        self.m_Vs = Vs
+
+
+    def calculateResponse(self):
+        SoilTF = np.empty_like(self.m_freq, dtype=np.complex_)
+        absSoilTF = np.empty_like(self.m_freq, dtype=np.float_)
+
+        # Compute the Fourier amplitude spectrum
+        fas = fft(self.m_acc)
+        # fas = fas[:self.nyquist_index]
+        absfas = np.abs(fas)
+        self.m_absFft = absfas
+
+        # Compute transfer function of soil layer
+        SoilTF = self.calcSoilTf()
+        self.m_absSoilTF = np.abs(SoilTF)
+
+        # Compute surface soil response
+        ifas = fas * SoilTF
+        absfas2 = np.abs(ifas)
+        self.m_absIFft = absfas2
+        accT = ifft(ifas)
+        self.m_accT = accT.real  # Take only the real part
+
+
+    def calcSoilTf(self):
+
+        tf = []
+
+        if self.m_freq is None:
+            print("Frequency vector is not defined")
+        else:
+
+            for f in self.m_freq:
+                """
+                * The uniform damped soil on rigid rock transfer function
+                *                             1
+                *  H = -------------------------------------------------
+                *       cos ( 2* PI * freq * H / (Vs(1+ i*damping))
+                """
+                kstar = 2.0 * np.pi * f / self.m_Vs - self.m_damping * 2.0 * np.pi * f / self.m_Vs * 1j
+                Vsstar = self.m_Vs + self.m_damping * self.m_Vs * 1j
+                tf.append(1.0 / np.cos(2.0 * np.pi * f * self.m_H / Vsstar))
+
+        return tf
+
+    def calculate_nat_freq(self):
+        n_pt = len(self.m_freq)
+        N_freq = []
+        N_freqVal = []
+        dfreq = self.m_freq[-1] / n_pt
+
+        TF_tan = 1.0
+        for i in range(1, len(self.m_freq)):
+            TF_tan1 = (self.m_absSoilTF[i] - self.m_absSoilTF[i - 1]) / dfreq
+            if TF_tan1 * TF_tan <= 0 and TF_tan > 0:
+                N_freq.append(self.m_freq[i])
+                N_freqVal.append(self.m_absSoilTF[i])
+            TF_tan = TF_tan1
+
+        return N_freq, N_freqVal
+
+    def calculate_ratio(self):
+
+        grav = 9.81 # m/s2
+        dT = self.m_time[1] - self.m_time[0]
+        accAux = [self.m_acc[ii]*grav for ii in range(len(self.m_acc))]
+        self.m_vel = integrate.cumtrapz(accAux, dx=dT)
+        # self.mvel = np.insert(self.m_vel, 0, 0.0)
+        self.m_disp = integrate.cumtrapz(self.m_vel, dx=dT)
+        # mdisp = np.insert(self.m_disp, 0, 0.0)
+
+        self.m_velT = integrate.cumtrapz((self.m_accT*grav), dx=dT)
+        # self.mvel = np.insert(self.m_vel, 0, 0.0)
+        self.m_dispT = integrate.cumtrapz(self.m_velT, dx=dT)
+        # mdisp = np.insert(self.m_disp, 0, 0.0)
+
+        ratioA = abs(max(self.m_accT))/abs(max(self.m_acc))
+        ratioV = abs(max(self.m_velT))/abs(max(self.m_vel))
+
+        return ratioA, ratioV
+
+    def sin_record(self, f):
+        n_points = 2000
+        self.m_dt = 0.02
+        self.m_acc = [0] * n_points
+        accel = []
+
+        for s in range(n_points):
+            accel.append(0.4 * np.sin(2 * f * np.pi * s * self.m_dt))
+
+        self.m_acc = accel
+        self.set_time()
+        self.set_freq()
+
+    def sweep_record(self):
+        n_points = 8000
+        self.m_dt = 0.002
+        self.m_acc = [0] * n_points
+        self.m_time = [0] * n_points
+
+        for i in range(len(self.m_time)):
+            time = i * self.m_dt
+            self.m_time[i] = time
+            self.m_acc[i] = np.sin(25.0 * time + 150.0 * (time * time / 2.0) / 16.0)
+
+        self.set_freq()
+
+
+    def load_file(self, file_name):
+
+        self.m_filename = file_name
+
+        try:
+            with open(file_name, 'r') as file:
+                # Read file contents into a JSON object
+                jsonObj = json.load(file)
+        except FileNotFoundError as e:
+            print(f"Cannot read file {file_name}: {e}")
+            return
+
+        events = jsonObj.get("Events", [])
+
+        if events:
+            patterns = events[0].get("pattern", [])
+            timeseries = events[0].get("timeSeries", [])
+            pattern_type = patterns[0].get("type", "")
+            tsname = patterns[0].get("timeSeries", "")
+
+            units = events[0].get("units", {})
+            acc_unit = 1.0
+            acc_type = units.get("acc", "")
+            if acc_type == "g":
+                acc_unit = 1.0
+            elif acc_type == "m/s2":
+                acc_unit = 1.0 / 9.81
+            elif acc_type in ["cm/s2", "gal", "Gal"]:
+                acc_unit = 1.0 / 981.0
+
+            timeseries_data = timeseries[0].get("data", [])
+            dT = timeseries[0].get("dT", 0.0)
+            self.read_GM(timeseries_data, dT, acc_unit)
+
+
+    def read_GM(self, acc_TH, dT, acc_unit):
+        n_points = len(acc_TH)
+        self.m_dt = dT
+        # self.m_acc = [acc_TH[ii].toDouble() * acc_unit for ii in range(n_points)]
+        self.m_acc = [acc_TH[ii] * acc_unit for ii in range(n_points)]
+
+        if n_points % 2 == 0:
+            self.m_acc.append(0.0)
+        self.m_acc = np.array(self.m_acc) # Convert to numpy array
+
+        self.set_time()
+        self.set_freq()
+
+
+    def set_freq(self):
+
+        if self.m_dt == 0:
+            self.m_dt = 0.005
+            nfreq = 1 / self.m_dt*10
+            sample_freq = 1.0 / self.m_dt
+
+        else:
+            nfreq = len(self.m_acc)
+            sample_freq = 1.0 / self.m_dt
+
+        # self.m_freq = [0] * (len(self.m_acc) // 2 + 1)
+        # self.m_freq = [0] * (len(self.m_acc))   # m_freq as a list
+        self.m_freq = np.zeros(nfreq) # m_freq as a numpy array
+        sample_freq = 1.0 / self.m_dt
+
+        self.nyquist_freq = sample_freq / 2.0
+        self.nyquist_index = int(len(self.m_freq) / 2)
+        for i in range(len(self.m_freq)):
+            self.m_freq[i] = i * sample_freq / len(self.m_acc)
+
+
+    def set_time(self):
+        # self.m_time = [0] * len(self.m_acc) # m_time as a list
+        self.m_time = np.zeros(len(self.m_acc)) # m_time as a numpy array
+
+        for i in range(len(self.m_time)):
+            self.m_time[i] = i * self.m_dt
+
+
+    def plot_acc(self):
+        plt.figure()
+        plt.plot(self.m_time, self.m_acc, 'b-', label='input')
+        plt.plot(self.m_time, self.m_accT, 'r-', label='output')
+        plt.xlabel('Time [sec]')
+        plt.ylabel('Acc [g]')
+        plt.legend()
+        plt.show()
+
+    def plot_fft(self):
+        plt.figure()
+        plt.plot(self.m_freq[:self.nyquist_index], self.m_absFft[:self.nyquist_index], 'b-', label='input')
+        plt.plot(self.m_freq[:self.nyquist_index], self.m_absIFft[:self.nyquist_index], 'r-', label='output')
+        plt.xlabel('Frequency [Hz]')
+        plt.ylabel('Fourier Amplitude')
+        plt.legend()
+        plt.show()
+
+    def plot_tf(self):
+        plt.figure()
+        plt.plot(self.m_freq[:self.nyquist_index], self.m_absSoilTF[:self.nyquist_index], 'b-')
+        plt.xlabel('Frequency [Hz]')
+        plt.ylabel('TF')
+        plt.show()
+
+    def plot_spectra(self):
+        n_points = len(self.m_acc)
+        accAux = [self.m_acc[ii]*9.81 for ii in range(n_points)]
+        accTAux = [self.m_accT[ii]*9.81 for ii in range(n_points)]
+        periods, psa = resp_spectra(self.m_time, accAux, 0.05)
+        periodsT, psaT = resp_spectra(self.m_time, accTAux, 0.05)
+
+        plt.figure()
+        plt.plot(periods, psa, 'b-', label='input')
+        plt.plot(periodsT, psaT, 'r-', label='output')
+        plt.xlabel('Periods [s]')
+        plt.ylabel('PSA [cm/s2]')
+        plt.legend()
+        plt.show()
+
+def main():
+    # Define input parameters
+    damping = 5.0  # damping ratio in %
+    H = 20.0  # layer height in m
+    Vs = 200.0  # shear wave velocity in m/s
+
+    TF = TFunctionClass(damping, H, Vs)
+
+    # Sinusoidal record
+    f = 0.5  # frequency in Hz
+    TF.sin_record(f)
+
+    # Calculate response
+    TF.calculateResponse()
+
+    # Calculate ratios
+    ratioA, ratioV = TF.calculate_ratio()
+    print(f"Acceleration Ratio: {ratioA}")
+    print(f"Velocity Ratio: {ratioV}")
+
+    # Plot acceleration
+    TF.plot_acc()
+
+    # Plot Fourier Transform
+    TF.plot_fft()
+
+    # Plot Transfer Function
+    TF.plot_tf()
+
+    # Plot Spectra
+    TF.plot_spectra()
+
+if __name__ == "__main__":
+    main()
+
+
+
+


This script performs post-processing by building response spectra from acceleration time history.

+
+Click to expand the full Response Spectra Python code +
#########################################################
+#
+# Postprocessing python script
+#
+# Copyright: UW Computational Mechanics Group
+#            Pedro Arduino
+#
+# Participants: Alborz Ghofrani
+#               Long Chen
+#
+#-------------------------------------------------------
+
+import numpy as np
+
+
+def resp_spectra(a, time, nstep):
+    """
+    This function builds response spectra from acceleration time history,
+    a should be a numpy array,T and nStep should be integers.
+    """
+
+    # add initial zero value to acceleration and change units
+    a = np.insert(a, 0, 0)
+    # number of periods at which spectral values are to be computed
+    nperiod = 100
+    # define range of considered periods by power of 10
+    minpower = -3.0
+    maxpower = 1.0
+    # create vector of considered periods
+    p = np.logspace(minpower, maxpower, nperiod)
+    # incremental circular frequency
+    dw = 2.0 * np.pi / time
+    # vector of circular freq
+    w = np.arange(0, (nstep+1)*dw, dw)
+    # fast fourier Horm of acceleration
+    afft = np.fft.fft(a)
+    # arbitrary stiffness value
+    k = 1000.0
+    # damping ratio
+    damp = 0.05
+    umax = np.zeros(nperiod)
+    vmax = np.zeros(nperiod)
+    amax = np.zeros(nperiod)
+    # loop to compute spectral values at each period
+    for j in range(0, nperiod):
+        # compute mass and dashpot coeff to produce desired periods
+        m = ((p[j]/(2*np.pi))**2)*k
+        c = 2*damp*(k*m)**0.5
+        h = np.zeros(nstep+2, dtype=complex)
+        # compute transfer function
+        for l in range(0, int(nstep/2+1)):
+            h[l] = 1./(-m*w[l]*w[l] + 1j*c*w[l] + k)
+            # mirror image of Her function
+            h[nstep+1-l] = np.conj(h[l])
+
+        # compute displacement in frequency domain using Her function
+        qfft = -m*afft
+        u = np.zeros(nstep+1, dtype=complex)
+        for l in range(0, nstep+1):
+            u[l] = h[l]*qfft[l]
+
+        # compute displacement in time domain (ignore imaginary part)
+        utime = np.real(np.fft.ifft(u))
+
+        # spectral displacement, velocity, and acceleration
+        umax[j] = np.max(np.abs(utime))
+        vmax[j] = (2*np.pi/p[j])*umax[j]
+        amax[j] = (2*np.pi/p[j])*vmax[j]
+
+    return p, umax, vmax, amax
+
+
+
+


+
+

Workflow in EE-UQ

+

The procedure for performing a transfer function analysis is shown below.

+

A forward propagation problem will be performed. The UQ engine to be used is Dakota with parallel execution and saved working directories. The Latin Hypercube Sampling (LHS) method will be used with 10 samples and a seed of 913. The UQ tab should look similar to the one below.

+
+_images/case2_UQTab_Workflow_TF.png +
+

Fig. 7. Uncertainty Quantification.

+
+
+

The General Information (GI) tab will not be utilized in this example since no structure will be used.

+

For the simulation (SIM tab), the input script will be loaded using a CustomPy Model. Along with this, the number of response nodes will be 1 with a spatial dimension of 2. Each node will have 3 degrees of freedom (DOF) and the profile will have damping ratio of 2%. The centroid node value will be 1.

+
+_images/case2_SimTab_TF.png +
+

Fig. 8. Simulations.

+
+
+

In the Event (EVT) tab, a Multiple SimCenter load generator will be used. The motion of interest will be uploaded here as a JSON file and will have a factor of 1.

+

In the Finite Element Modeling (FEM) tab, select a CustomPy-Simulation.

+

In the Engineering Demand Parameter (EDP) tab, select a user defined generator. The response parameters will be the ratio of acceleration spectra and velocity spectra from the propagation from rock to the soil.

+
+_images/case2_EDPTab_Workflow_TF.png +
+

Fig. 9. Engineering Demand Parameters.

+
+
+

The Random Variables (RV) tab is where the values of H, Vs, and damping are implemented in the analysis. The values seen above are to be input here. A normal distribution will be used for all of these variables.

+
+_images/case2_RVTab_Workflow_TF.png +
+

Fig. 10. Random Variables.

+
+
+

The user can opt for running the analysis on their local device or in DesignSafe.

+
+
+

Results

+

When the run is completed, the mean values of ratioA and ratioV, as well as uncertainty values,should be provided. These values show the ratio of average amplification/de-amplification in acceleration in velocity of the ground motion at the rock and the motion at the surface. The positive value of the ratio shows amplification occurred due to the propagation of the motion through the soil layer.

+
+_images/case2_Results_Workflow_TF.png +
+

Fig. 11. Results

+
+
+

Because the input variables (H, Vs, damping, motions) each have uncertainty, that uncertainty is carried on to the transfer function analysis. EE-UQ allows for uncertainty quantification which allows for an analysis of which variables might be most important or what the “worst-case scenario” could be when designing. The normalized normal distribution for the acceleration and velocity amplification ratios are shown below.

+
+_images/case2_Normalized_RatioA_histogram.png +
+

Fig. 12. Normalized Acceleration Amplification Factor Histogram

+
+
+
+_images/case2_Normalized_RatioV_histogram.png +
+

Fig. 13. Normalized Velocity Amplification Factor Histogram

+
+
+

Due to the infinite possibilities of variability the three main variables (H, Vs, Damping) can have, we see that the normal distribution is not well suited for this analysis, specifically. EE-UQ allows for other methods of uncertainty quantification. Below is a Gaussian Mixture Model. This method is effective in measuring the probability of certain subpopulations within a larger population.

+
+images/icase2_Gaussian_Mixture_RatioA_histogram.png +
+

Fig. 14. Gaussian Mixture Model - Acceleration Amplification Ratio.

+
+
+
+_images/case2_Gaussian_Mixture_RatioV_histogram.png +
+

Fig. 15. Gaussian Mixture Model - Velocity Amplification Ratio.

+
+
+
+

Note

+

This situation is specific only to this example; normal distributions could very well suit another example.

+
+

By extrapolating the values from EE-UQ, the shape of the transfer function can be determined. The natural frequencies of the first 4 peaks in the transfer function are also shown below.

+
+_images/case2_TF_Nat_Freqs.png +
+

Fig. 16. Transfer Function.

+
+
+
+ + + + + + + + + + + + + + + + + + + + +
Table 1. Natural Frequencies in the Transfer Function

Peak

Nat. Frequency (Hz)

1

20.49

2

7.03

3

4.20

4

2.98

+

With the transfer function plotted, the input motion can be transformed using the transfer function to reflect the motion at the surface. The figure below reflects the large amplification that occurred. The value of the highest acceleration increased from ~0.4g in the rock to ~1.25g in the soil. This amplification is also reflected in other frequencies.

+
+_images/case2_Full_Results_TF.png +
+

Fig. 17. Amplification of Ground Motion.

+
+
+

The spectral acceleration spectra can be also determined for each of the motions. These spectra can be used to determine if a structure will be affected by the amplification. A single story structure (~0.1 second period) might be at risk due to this amplification. Any periods with a large amplification ratios should be further analyzed to ensure the safety of the structure and site.

+
+_images/case2_SpectralAcc_Results_TF.png +
+

Fig. 18. Amplification in Spectral Acceleration.

+
+
+
+
+
+

Remarks

+

I’d like to thank everyone at SimCenter, specifically Sang-ri Yi, Frank McKenna, Jinyan Zhao, Aakash Bangalore Satish, and Barbaros Cetiner, for all of their effort and assistance they provided during the entire quarter. Navigating these tools and creating examples for them would’ve been a lot more stressful without their help.

+

Transfer function is one of my favorite topics in geotechnical engineering. I’d really like to continue working with site response and performance based design so being able to create this example along with my class was great.

+

Finally, I’d like to thank Prof. Arduino who made all of this possible. His determination and motivation was contagious throughout the academic quarter. There are many great professors but there is only one Pedro Arduino.

+
+
+
+[GV22] +

G. R. Guerra Velázquez. Hurricane maría and public health in puerto rico: lessons learned to increase resiliency and prepare for future disasters. Annals of Global Health, 2022.

+
+
+[RB20] +

V. Rashidian and L. G. Baise. Regional efficacy of a global geospatial liquefaction model. Engineering geology, 272:105644, 2020.

+
+
+[Saf73] +

H. S. Saffir. Hurricane wind and storm surge. The Military Engineering, pages 4–5, 1973.

+
+
+[SGM24] +

M. D. Sanger, M. Geyin, and B. W. Maurer. A global liquefaction model for rapid response and scenario modeling. Manuscript in preparation, 2024.

+
+
+[ZBT17] +

J. Zhu, L. G. Baise, and E. M. Thompson. An updated geospatial liquefaction model for global application. Bulletin of the Seismological Society of America, 107(3):1365–1385, 2017.

+
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/case_3.html b/case_3.html new file mode 100644 index 0000000..02ae16c --- /dev/null +++ b/case_3.html @@ -0,0 +1,277 @@ + + + + + + + S3hark - Site Response 1 — CESG-599 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

S3hark - Site Response 1

+
+

Author: Jose Barreto

+
+
+

Introduction

+

This page describes basic concepts of one-dimensional ground response analysis and the usage of transfer functions. For more details, the user is encounged to read [].

+
+
+

Problem Description

+

A transfer function is somewhat like a filter that is applied to an incoming wave to produce an output signal. It determines how each frequency in the input motion is amplified or suppressed, by the medium of wave travel. Considering a spring-mass system with an excitation motion at input from the foundation connected to the spring and the corresponding response motion of the connected mass in the inertial system. The response motion of the mass will be a composite factor of the elastic and the viscous damping forces which are inherently embedded in the transfer function that determines the output motion we will obtain. In our wave propagation study we also employ transfer functions as a tool to explain the factors that make our input wave motion different from our output wave obtained. Evaluating the transfer function mathematically involves converting our known input motion to a Fourier series. Each term of the Fourier series is multiplied by the transfer function to obtain the Fourier series of the output response. Resonance is a physical phenomenon that occurs when the natural frequency of vibration of particles in a body (in our case the layers) matches the frequency of the forcing function (our input motion). It is experienced as an infinite amplification of the model.

+
+
+

Solution Strategy

+
    +
  1. Open the Dr. Layer program. By default we get twelve layers. The top six layers are hardwired into the system with a velocity of specified as very fast. The bottom six layers are hardwired with a velocity of very slow.

  2. +
  3. Select all the layers to all have very slow values using the select all option.

  4. +
  5. On the top left hand corner of the menu box choose the plot box tool and apply a plot box at the top of the layers. Do the same at four arbitrary points along the soil layers. Note the height (\(H\)) you place the plots.

    +
    +

    <insert image>

    +
    +
  6. +
  7. Push the time increment button for about 1 minute.

  8. +
  9. Obtain the angular frequency \((2p/T)\), where \(T\) is the period i.e. time it takes to complete one revolution.

  10. +
  11. Obtain the maximum displacements from the plots by clicking on the crest of the curves with your cursor.

  12. +
+
+\[ \begin{align}\begin{aligned}TF = \frac{1}{\cos(\frac{wH}{v_s})}\\AF = \frac{1}{|\cos(\frac{wH}{v_s})|}\end{aligned}\end{align} \]
+

Where

+

\(w\) = Angular frequency (2pf)

+

\(H\) = distance between any two points in the layers under consideration.

+

\(V\) = Velocity of wave travel within the soil layer.

+

\(TF\) = Transfer function

+

\(AF\) = Amplification function

+

Dr. Layer’s operation is controlled via menu commands (with associated keyboard accelerators), manipulation tools, scaling buttons, the load tool bar, and time control buttons. The program displays the results of its calculations visually in the form of animated displacements, and also in the form of dynamically generated time history plots. There are also mechanisms for getting numerical values.

+
+_images/case1.png +
+
+
+

SimCenter Tool Used

+

blablabla

+ + +++++ + + + + + + + + + + + + + + + + +
Title

Heading row 1, column 1

Heading row 1, column 2

Heading row 1, column 3

Row 1, column 1

Row 1, column 3

Row 2, column 1

Row 2, column 2

Row 2, column 3

+

Time can be controlled using either the keyboard or the time control buttons:

+
    +
  • To run time forward: Press and hold the ‘g’ key or click and hold the time forward button: <insert icon>.

  • +
  • To reset time to zero: Type the ‘0’ key or click on the time reset button: <insert icon>.

  • +
  • The current analysis time is displayed in the feedback pane at the bottom of the screen.

  • +
  • The analysis time step size can be controlled via the Time Step menu (there are combinations of material properties and time steps that intentionally lead to unstable results, so beware).

  • +
  • The display time step can be controlled via the Animation Speed menu. Internally, this command controls how many analysis time steps are computed between screen updates.

  • +
+
+
+

Example Application

+

Dr. Layer’s tool palette is illustrated below (Windows version: the Mac version is similar but grouped a bit differently):

+

<insert tool palette image>

+
    +
  • The Arrow Tool is used to select and manipulate objects.

  • +
  • The Panner and Camera Orbit Tools are used to change the viewing point and camera orientation via clicking and dragging.

  • +
  • The Plot Box Tool is used to create one of the various types of plot boxes:

    +
    +
      +
    • Displacement Time History plots are created by clicking on the relevant layer. The top node in the layer is used as the plotting target.

    • +
    • Fast Fourier Transform (FFT) plots of a displacement history can be created by clicking on the time history plot.

    • +
    • Stress-strain plots can be created by control-clicking (i.e., holding down the control key while clicking) on the desired layer.

    • +
    +
    +
  • +
+
+

These controls are self-explanatory in regards to their functions. Note the following, however:

+
+
+

Note

+

The scaling buttons will continue to scale as long as they are held down. It is not necessary to click multiple times to get this effect.

+
+
+
+

Remarks

+
    +
  • To adjust the plotting scales, use the small expansion/contraction triangular buttons on the plot for the horizontal scale, and the plot scale buttons on the Scale Button Toolbar for the vertical scale.

  • +
+
+

Note

+

You will notice that all plots scale together. This is so that plots of a given type can be compared visually without any misleading differences in scale factors.

+
+
    +
  • To adjust the horizontal offset of a plot, click in the plot and drag horizontally to scroll back and forth.

  • +
+
+

Note

+

In general, plots will automatically scroll as necessary as time is running. Once you have manually scrolled a plot, though, the automatic scrolling will cease until time is reset to zero.

+
+
    +
  • Plot boxes can be added or removed at any time, but they only accumulate data beginning from the time they are installed, with the exception of FFT plots, which always plot the according to the data accumulated in the target time history. FFT plots can use up to the first 1024 points in a time history.

  • +
+
+

Warning

+

Plotting FFT’s will slow down the animation speed significantly, especially as the length of the time histories increase.

+
+
+
+
+[GV22] +

G. R. Guerra Velázquez. Hurricane maría and public health in puerto rico: lessons learned to increase resiliency and prepare for future disasters. Annals of Global Health, 2022.

+
+
+[RB20] +

V. Rashidian and L. G. Baise. Regional efficacy of a global geospatial liquefaction model. Engineering geology, 272:105644, 2020.

+
+
+[Saf73] +

H. S. Saffir. Hurricane wind and storm surge. The Military Engineering, pages 4–5, 1973.

+
+
+[SGM24] +

M. D. Sanger, M. Geyin, and B. W. Maurer. A global liquefaction model for rapid response and scenario modeling. Manuscript in preparation, 2024.

+
+
+[ZBT17] +

J. Zhu, L. G. Baise, and E. M. Thompson. An updated geospatial liquefaction model for global application. Bulletin of the Seismological Society of America, 107(3):1365–1385, 2017.

+
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/case_4.html b/case_4.html new file mode 100644 index 0000000..5d2b05e --- /dev/null +++ b/case_4.html @@ -0,0 +1,279 @@ + + + + + + + S3hark - Site Response 2 — CESG-599 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

S3hark - Site Response 2

+

Author: Chungen Tai +(Updated : 05/24/24) +——————-

+
+

Introduction

+

This page shows basic concepts of one-dimensional nonlinear site response analysis by using various soil material models (ex: ElasticIsotropic, PM4Sand.).Site response analysis is commonly performed to analyze the propagation of seismic waves through soil. As shown in the below figure, one-dimensional response analyses, as a simplified method, assume that all boundaries are horizontal and that the response of a soil deposit is predominately caused by SH-waves propagating vertically from the underlying bedrock. Ground surface response is usually the major output from these analyses, together with profile plots such as peak horizontal acceleration along the soil profile. When liquefiable soils are presenting, maximum shear strain and excess pore pressure ratio plots are also important.

+
+_images/siteResponse2.png +
+
+
+

Problem Description

+

Treasure Island, situated atop sand fill strata overlaying Bay Mud within the San Francisco Bay, was subjected to seismic activity during the 1989 Loma Prieta Earthquake. Adjacent to Treasure Island lies Yerba Buena Island, characterized by its natural rock outcrop. Utilizing the site’s soil profile and seismic data recorded on Yerba Buena Island, we endeavor to analyze the site response of Treasure Island. This entails computing parameters such as peak horizontal acceleration and shear strain distribution along the soil profile. Furthermore, we aim to investigate the influence of varying slope configurations on the site’s response characteristics.

+
+
+

Solution Strategy

+
    +
  1. Open the Dr. Layer program. By default we get twelve layers. The top six layers are hardwired into the system with a velocity of specified as very fast. The bottom six layers are hardwired with a velocity of very slow.

  2. +
  3. Select all the layers to all have very slow values using the select all option.

  4. +
  5. On the top left hand corner of the menu box choose the plot box tool and apply a plot box at the top of the layers. Do the same at four arbitrary points along the soil layers. Note the height (\(H\)) you place the plots.

    +
    +

    <insert image>

    +
    +
  6. +
  7. Push the time increment button for about 1 minute.

  8. +
  9. Obtain the angular frequency \((2p/T)\), where \(T\) is the period i.e. time it takes to complete one revolution.

  10. +
  11. Obtain the maximum displacements from the plots by clicking on the crest of the curves with your cursor.

  12. +
+
+\[ \begin{align}\begin{aligned}TF = \frac{1}{\cos(\frac{wH}{v_s})}\\AF = \frac{1}{|\cos(\frac{wH}{v_s})|}\end{aligned}\end{align} \]
+

Where

+

\(w\) = Angular frequency (2pf)

+

\(H\) = distance between any two points in the layers under consideration.

+

\(V\) = Velocity of wave travel within the soil layer.

+

\(TF\) = Transfer function

+

\(AF\) = Amplification function

+

Dr. Layer’s operation is controlled via menu commands (with associated keyboard accelerators), manipulation tools, scaling buttons, the load tool bar, and time control buttons. The program displays the results of its calculations visually in the form of animated displacements, and also in the form of dynamically generated time history plots. There are also mechanisms for getting numerical values.

+
+_images/case1.png +
+
+
+

SimCenter Tool Used

+

blablabla

+ + +++++ + + + + + + + + + + + + + + + + +
Title

Heading row 1, column 1

Heading row 1, column 2

Heading row 1, column 3

Row 1, column 1

Row 1, column 3

Row 2, column 1

Row 2, column 2

Row 2, column 3

+

Time can be controlled using either the keyboard or the time control buttons:

+
    +
  • To run time forward: Press and hold the ‘g’ key or click and hold the time forward button: <insert icon>.

  • +
  • To reset time to zero: Type the ‘0’ key or click on the time reset button: <insert icon>.

  • +
  • The current analysis time is displayed in the feedback pane at the bottom of the screen.

  • +
  • The analysis time step size can be controlled via the Time Step menu (there are combinations of material properties and time steps that intentionally lead to unstable results, so beware).

  • +
  • The display time step can be controlled via the Animation Speed menu. Internally, this command controls how many analysis time steps are computed between screen updates.

  • +
+
+
+

Example Application

+

Dr. Layer’s tool palette is illustrated below (Windows version: the Mac version is similar but grouped a bit differently):

+

<insert tool palette image>

+
    +
  • The Arrow Tool is used to select and manipulate objects.

  • +
  • The Panner and Camera Orbit Tools are used to change the viewing point and camera orientation via clicking and dragging.

  • +
  • The Plot Box Tool is used to create one of the various types of plot boxes:

    +
    +
      +
    • Displacement Time History plots are created by clicking on the relevant layer. The top node in the layer is used as the plotting target.

    • +
    • Fast Fourier Transform (FFT) plots of a displacement history can be created by clicking on the time history plot.

    • +
    • Stress-strain plots can be created by control-clicking (i.e., holding down the control key while clicking) on the desired layer.

    • +
    +
    +
  • +
+
+

These controls are self-explanatory in regards to their functions. Note the following, however:

+
+
+

Note

+

The scaling buttons will continue to scale as long as they are held down. It is not necessary to click multiple times to get this effect.

+
+
+
+

Remarks

+
    +
  • To adjust the plotting scales, use the small expansion/contraction triangular buttons on the plot for the horizontal scale, and the plot scale buttons on the Scale Button Toolbar for the vertical scale.

  • +
+
+

Note

+

You will notice that all plots scale together. This is so that plots of a given type can be compared visually without any misleading differences in scale factors.

+
+
    +
  • To adjust the horizontal offset of a plot, click in the plot and drag horizontally to scroll back and forth.

  • +
+
+

Note

+

In general, plots will automatically scroll as necessary as time is running. Once you have manually scrolled a plot, though, the automatic scrolling will cease until time is reset to zero.

+
+
    +
  • Plot boxes can be added or removed at any time, but they only accumulate data beginning from the time they are installed, with the exception of FFT plots, which always plot the according to the data accumulated in the target time history. FFT plots can use up to the first 1024 points in a time history.

  • +
+
+

Warning

+

Plotting FFT’s will slow down the animation speed significantly, especially as the length of the time histories increase.

+
+
+
+
+[GV22] +

G. R. Guerra Velázquez. Hurricane maría and public health in puerto rico: lessons learned to increase resiliency and prepare for future disasters. Annals of Global Health, 2022.

+
+
+[RB20] +

V. Rashidian and L. G. Baise. Regional efficacy of a global geospatial liquefaction model. Engineering geology, 272:105644, 2020.

+
+
+[Saf73] +

H. S. Saffir. Hurricane wind and storm surge. The Military Engineering, pages 4–5, 1973.

+
+
+[SGM24] +

M. D. Sanger, M. Geyin, and B. W. Maurer. A global liquefaction model for rapid response and scenario modeling. Manuscript in preparation, 2024.

+
+
+[ZBT17] +

J. Zhu, L. G. Baise, and E. M. Thompson. An updated geospatial liquefaction model for global application. Bulletin of the Seismological Society of America, 107(3):1365–1385, 2017.

+
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/case_5.html b/case_5.html new file mode 100644 index 0000000..06af018 --- /dev/null +++ b/case_5.html @@ -0,0 +1,257 @@ + + + + + + + R2D - Liquefaction — CESG-599 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

R2D - Liquefaction

+
+

Author: Morgan Sanger

+
+
+

Introduction

+

This page describes basic concepts of geospatial liquefaction hazard modeling.

+
+
+

Problem Description

+

Coseismic soil liquefaction is a phenomenon in which the strength and stiffness of a soil is reduced by earthquake shaking. Resilient communities and infrastructure networks, like lifelines or transportation systems, must be built to withstand and respond to hazards posed by coseismic soil liquefaction. Ideally, these predictions could be made:

+
    +
  • quickly, in near-real-time after an event;

  • +
  • at high resolution, consistent with the scale of individual assets; and

  • +
  • at map-scale, across the regional extent affected by large earthquakes.

  • +
+

Common liquefaction models in practice require in-situ testing which cannot be continuously performed across large areas, thus presenting the need for “geospatial” liquefaction models. Prior tests of such models (e.g., [ZBT17]) have shown both promising potential and severe shortcomings in predicting subsurface conditions with few geospatial predictors. There is a need to advance geospatial liquefaction modeling by integrating geotechnical data, liquefaction mechanics, artificial intelligence (AI), and many geospatial predictor variables to provide reliable regional liquefaction predictions for any earthquake event. When integrated with regional hazard assessment capabilities, geospatial liquefcation models will provide value throughout the life of infrastructure projects - from initial desk studies to refined project-specific hazard analyses - and will unlock insights beyond conventional practice, with opportunity to:

+
    +
  • prescribe event-specific emergency response and evacuation routes immediately after an earthquake,

  • +
  • evaluate network reliability and infrastructure network resiliency using structural databases or other asset inventories, and

  • +
  • understand the impacts of earthquake events of vulnerable communities using population demographic data.

  • +
+
+
+

Solution Strategy

+

The state-of-practice geospatial liquefaction model is the [RB20] model (updated version of the [ZBT17] model), which uses logistic regression to predict probability of liquefaction based on five (5) geospatial variables and trained on a database of liquefaction case histories.

+

In this problem, another modeling solution strategy is proposed, according to [SGM24]. The [SGM24] approach parses the problem into that which is empirical and best predicted by AI (the relationship between geospatial variables and subsurface traits) and that which is best predicted by mechanics (liquefaction response, conditioned on those traits). In this approach, the subsurface traits are characterized at point locations using available cone penetration testing (CPT) data. The liquefaction response at each CPT location is computed across a range of magnitude-scale peak ground accelerations (PGAM7.5) using state-of-practice liquefaction manifestation models (e.g., liquefaction potential index, LPI), thereby retaining the knowledge of liquefaction mechanics developed over the last 50+ years. The relationship between manifestation index and PGAM7.5 is represented as a functional form (Eqn 1) with two curve-fitting parameters: A and B (Fig 1). Therefore, the liquefaction response (i.e., A and B) at each CPT location becomes target variables of supervised learning AI models.

+
+\[\begin{split}MI = \left\{ \begin{array}{ll} +0, & \text{PGA}_{M7.5} < 0.1g \\ +\arctan(B \cdot (\text{PGA}_{M7.5} - \frac{A}{B})^2) \cdot 100, & \text{PGA}_{M7.5} \geq 0.1g +\end{array} \right.\end{split}\]
+

Eqn 1. Manifestation index as a function of A, B, and PGAM7.5.

+
+_images/manifestationcurve.png +
+

Fig 1. Example manifestation curve of LPI vs. PGAM7.5 for a single CPT.

+
+
+

The AI model is trained to predict liquefaction response from a suite of geospatial predictor variables identified as proxies of liquefaction (37 variables). Example predictor variables include mapped or remotely sensed metrics of surface topography and roughness; distance to and elevation above water bodies; geology, geomorphology, hydrology, and more. By applying the final trained AI model to the full predictor datasets, the A and B parameters are predicted geospatially at a defined resolution. A final, key step of the approach is that AI predictions are geostatistically updated via regression kriging in the vicinity of field measurements, such that nearby predictions are based mostly on known subsurface conditions and have lower model uncertainty, whereas distal predictions are based mostly on AI and have greater model uncertainty. In summary, this approach effectively pre-computes liquefaction response across all possible ground motion intensities and durations based on AI-predicted subsurface conditions. These predictions are stored as mapped parameters, awaiting information about a specific earthquake of interest, real or scenario, such as a PGAM7.5 raster from R2D.

+

Model predictions were then tested against the leading geospatial model [RB20] in three case-history events using receiver operating characteristic and area under the curve analyses (Fig 2). The [SGM24] AI model (before kriging) performed significantly better than [RB20] and was further improved by kriging (Fig 3).

+
+_images/sanger2024-roc.png +
+

Fig 2. Receiver operator characteristic curves and area under the curve (AUC) analyses comparing [RB20] (“R&B”), and the [SGM24] before regression kriging (“LPI”).

+
+
+
+_images/zhu2017.png +
+

(a)

+
+
+
+_images/sanger2024-ai.png +
+

(b)

+
+
+
+_images/sanger2024-krig.png +
+

(c)

+
+

Fig 3. Comparison between (a) Rashidian & Baise (2020), and this model (b) before and (c) after regression kriging for the Feb. 2011 M6.1 Christchurch event.

+
+
+
+
+
+

SimCenter Tool Used

+

The presented problem can be solved using SimCenter’s Regional Resilience Determination R2D Tool. A substantially complete description of the tool is provided in the R2D Documentation.

+

The [ZBT17] model is implemented in the R2D tool (version 4.2.0), whereas the [SGM24] model is not yet implemented in the R2D tool. In this project, the [SGM24] model was implemented in the R2D tool using Python applications file.

+
+
+

Example Application

+
+
+

Remarks

+
    +
  • To adjust the plotting scales, use the small expansion/contraction triangular buttons on the plot for the horizontal scale, and the plot scale buttons on the Scale Button Toolbar for the vertical scale.

  • +
+
+

Note

+

You will notice that all plots scale together. This is so that plots of a given type can be compared visually without any misleading differences in scale factors.

+
+
    +
  • To adjust the horizontal offset of a plot, click in the plot and drag horizontally to scroll back and forth.

  • +
+
+

Note

+

In general, plots will automatically scroll as necessary as time is running. Once you have manually scrolled a plot, though, the automatic scrolling will cease until time is reset to zero.

+
+
    +
  • Plot boxes can be added or removed at any time, but they only accumulate data beginning from the time they are installed, with the exception of FFT plots, which always plot the according to the data accumulated in the target time history. FFT plots can use up to the first 1024 points in a time history.

  • +
+
+

Warning

+

Plotting FFT’s will slow down the animation speed significantly, especially as the length of the time histories increase.

+
+
+
+
+[GV22] +

G. R. Guerra Velázquez. Hurricane maría and public health in puerto rico: lessons learned to increase resiliency and prepare for future disasters. Annals of Global Health, 2022.

+
+
+[RB20] +(1,2,3,4) +

V. Rashidian and L. G. Baise. Regional efficacy of a global geospatial liquefaction model. Engineering geology, 272:105644, 2020.

+
+
+[Saf73] +

H. S. Saffir. Hurricane wind and storm surge. The Military Engineering, pages 4–5, 1973.

+
+
+[SGM24] +(1,2,3,4,5,6) +

M. D. Sanger, M. Geyin, and B. W. Maurer. A global liquefaction model for rapid response and scenario modeling. Manuscript in preparation, 2024.

+
+
+[ZBT17] +(1,2,3) +

J. Zhu, L. G. Baise, and E. M. Thompson. An updated geospatial liquefaction model for global application. Bulletin of the Seismological Society of America, 107(3):1365–1385, 2017.

+
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/case_6.html b/case_6.html new file mode 100644 index 0000000..433528d --- /dev/null +++ b/case_6.html @@ -0,0 +1,285 @@ + + + + + + + R2D - Landslides — CESG-599 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

R2D - Landslides

+
+

Author: Luis Angel Guerrero Hoyos

+
+
+

Introduction

+

This page describes a preliminarly approach for landslide risk assesment using SimCenter tools (R2D).

+
+
+

Problem Description

+

Studying landslide assessment using Newmark analysis and ground motions is a multidisciplinary effort that integrates engineering, geology, and environmental science. It provides a comprehensive approach to understanding and mitigating the risks associated with landslides, ultimately leading to safer communities and more resilient infrastructure. Here we would like to analyze in a regional scale, what would be the response across a study area located in Seattle, WA, US. The idea is to estimate the predicted displacement in the study area if an earthquake with certain intensity measure (Arias Intensity \(I_a\)) were to occur. This study integrates the infinite slope approach to estimate the static factor of safety so then the Critical Acceleration \(a_c\) can be estimated. Finally with these parameters a Newmark displacement could be estimated using Randall W. Jibson correlation [].

+
+
+

Solution Strategy

+

Jibson proposed model is used to calculate the Newmark displacement as follows:

+
+\[log(Dn) = 1.460\:log(I_a)-6.642\:a_c+1.546\:\:\:\:\:\:\:\:\:\:\:\:\:(1)\]
+

Where:

+

\(Dn\) = Newmark Displacement [cm].

+

\(I_a\) = Areas Intensity [m/s].

+

\(a_c\) = Critical Acceleration [g].

+

Also,

+
+\[a_c = (FS_{static}-1)\:sin(\beta)\:\:\:\:\:\:\:\:\:\:\:\:\:(2)\]
+

Where:

+
+\[FS_{static} = \frac{2c}{\gamma\:z\:sin(\beta)} + cot(\beta)\:tan(\phi)\:\:\:\:\:\:\:\:\:\:\:\:\:(3)\]
+

\(\beta\) = Slope Angle [°].

+

\(FS_{static}\) = Static Factor of Safety [-].

+

\(c\) = Cohesion [kPa].

+

\(\gamma\) = Unit Weight [kN/m³].

+

\(\phi\) = Friction Angle [°].

+

\(I_a\) = Intensity measure time-history motion specific.

+

In order to estimate the imput parameters of equation 1 the following steps could be done:

+
    +
  1. Create a slope raster for a selected area: this can be created using a DTM model for the area of interest which can be downloaded from the USGS portal.

  2. +
  3. Use QGIS built-in functions to perform the slope calculations. See QGIS slope documentation.

  4. +
+
+
+

To be continued…

+

Dr. Layer’s operation is controlled via menu commands (with associated keyboard accelerators), manipulation tools, scaling buttons, the load tool bar, and time control buttons. The program displays the results of its calculations visually in the form of animated displacements, and also in the form of dynamically generated time history plots. There are also mechanisms for getting numerical values.

+
+_images/case1.png +
+
+
+

SimCenter Tool Used

+

blablabla

+ + +++++ + + + + + + + + + + + + + + + + +
Title

Heading row 1, column 1

Heading row 1, column 2

Heading row 1, column 3

Row 1, column 1

Row 1, column 3

Row 2, column 1

Row 2, column 2

Row 2, column 3

+

Time can be controlled using either the keyboard or the time control buttons:

+
    +
  • To run time forward: Press and hold the ‘g’ key or click and hold the time forward button: <insert icon>.

  • +
  • To reset time to zero: Type the ‘0’ key or click on the time reset button: <insert icon>.

  • +
  • The current analysis time is displayed in the feedback pane at the bottom of the screen.

  • +
  • The analysis time step size can be controlled via the Time Step menu (there are combinations of material properties and time steps that intentionally lead to unstable results, so beware).

  • +
  • The display time step can be controlled via the Animation Speed menu. Internally, this command controls how many analysis time steps are computed between screen updates.

  • +
+
+
+

Example Application

+

Dr. Layer’s tool palette is illustrated below (Windows version: the Mac version is similar but grouped a bit differently):

+

<insert tool palette image>

+
    +
  • The Arrow Tool is used to select and manipulate objects.

  • +
  • The Panner and Camera Orbit Tools are used to change the viewing point and camera orientation via clicking and dragging.

  • +
  • The Plot Box Tool is used to create one of the various types of plot boxes:

    +
    +
      +
    • Displacement Time History plots are created by clicking on the relevant layer. The top node in the layer is used as the plotting target.

    • +
    • Fast Fourier Transform (FFT) plots of a displacement history can be created by clicking on the time history plot.

    • +
    • Stress-strain plots can be created by control-clicking (i.e., holding down the control key while clicking) on the desired layer.

    • +
    +
    +
  • +
+
+

These controls are self-explanatory in regards to their functions. Note the following, however:

+
+
+

Note

+

The scaling buttons will continue to scale as long as they are held down. It is not necessary to click multiple times to get this effect.

+
+
+
+

Remarks

+
    +
  • To adjust the plotting scales, use the small expansion/contraction triangular buttons on the plot for the horizontal scale, and the plot scale buttons on the Scale Button Toolbar for the vertical scale.

  • +
+
+

Note

+

You will notice that all plots scale together. This is so that plots of a given type can be compared visually without any misleading differences in scale factors.

+
+
    +
  • To adjust the horizontal offset of a plot, click in the plot and drag horizontally to scroll back and forth.

  • +
+
+

Note

+

In general, plots will automatically scroll as necessary as time is running. Once you have manually scrolled a plot, though, the automatic scrolling will cease until time is reset to zero.

+
+
    +
  • Plot boxes can be added or removed at any time, but they only accumulate data beginning from the time they are installed, with the exception of FFT plots, which always plot the according to the data accumulated in the target time history. FFT plots can use up to the first 1024 points in a time history.

  • +
+
+

Warning

+

Plotting FFT’s will slow down the animation speed significantly, especially as the length of the time histories increase.

+
+
+
+
+[GV22] +

G. R. Guerra Velázquez. Hurricane maría and public health in puerto rico: lessons learned to increase resiliency and prepare for future disasters. Annals of Global Health, 2022.

+
+
+[RB20] +

V. Rashidian and L. G. Baise. Regional efficacy of a global geospatial liquefaction model. Engineering geology, 272:105644, 2020.

+
+
+[Saf73] +

H. S. Saffir. Hurricane wind and storm surge. The Military Engineering, pages 4–5, 1973.

+
+
+[SGM24] +

M. D. Sanger, M. Geyin, and B. W. Maurer. A global liquefaction model for rapid response and scenario modeling. Manuscript in preparation, 2024.

+
+
+[ZBT17] +

J. Zhu, L. G. Baise, and E. M. Thompson. An updated geospatial liquefaction model for global application. Bulletin of the Seismological Society of America, 107(3):1365–1385, 2017.

+
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/case_7.html b/case_7.html new file mode 100644 index 0000000..36a1ae4 --- /dev/null +++ b/case_7.html @@ -0,0 +1,451 @@ + + + + + + + R2D - Hurricane Maria Damage and Losses — CESG-599 1.0.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

R2D - Hurricane Maria Damage and Losses

+
+

Author: Daniel Acosta Reyes

+
+
+

Introduction

+

Hurricane Maria, a Category 5 storm, struck Puerto Rico on September 20, 2017, claiming over 3000 lives. +This example assesses wind-induced damage for Vieques Island, Puerto Rico, using peak gust wind speed data from the National Institute of Standards and Technogology (NIST) and inventory of about 900 wood residential buildings. The inventory was created using a Python Notebook with BRAILS and formatted to a HAZUS-type damage assessment in R2D. The final R2D results include damage state and loss estimations.

+
+
+

Problem Description

+

Hurricanes are powerful tropical storms producing strong winds and heavy rains. The Saffir-Simpson Wind Scale, which categorizes hurricanes from 1 to 5 based on sustained wind speeds, helps estimate potential property damage [Saf73]. Hurricanes in categories 3 and above are deemed major due to their significant destructive potential.

+
+_images/case7_DA1_saffirScale.png +
+

Fig. 1. Saffir-Simpson Hurricane Scale. Soruce: TIGHE PA.

+
+
+

Hurricane Maria (Category 5) destroyed several homes and health facilities in Puerto Rico, including the only healthcare center on Vieques Island, exacerbating the island’s health crisis after decades-long military use. +A recent study by Guerra-Velasquez [GV22] highlithed that infrastructure weaknesses made recovery more challenging and emphasize the need for increased resiliency and preparedness for future disasters.

+
+
+

Solution Strategy

+

The proposed solution gathers input data for a HAZUS-type damage and lossess analysis implemented in R2D. The dataset includes a baseline hazard, building inventory, and rulesets.

+
    +
  1. Baseline Hazard: The hazard definition for this analysis is a raster file containing Hurricane Maria Wind-Field Model for Puerto Rico in miles per hour (mph).

    +
    +
    +_images/case7_DA2_raster.png +
    +

    Fig. 2. Raster visualization of Hurricane Maria Wind-Field Model.

    +
    +
    +
    +
  2. +
  3. Building Inventory: The building inventory for Puerto Rico is limited. However, using NHERI-SimCenter Building and Infrastructure Recognition using AI at Large-Scale (BRAILS) capabilities, it is possible to obtain building footprints and their associated attributes for a given location. Brails was implemented in a Jupyter Notebook to:

    +
    +
      +
    • Obtain building footprints from open repositories (e.g., NSI)

    • +
    • Fetch Google Street Views using Google API

    • +
    • Import essential BRAILS modules such as NumberOfFloors, YearBuilt, and OccupancyClassifier

    • +
    • Merge and create a Building Inventory Model (BIM) with required attributes for rulesets.

    • +
    +

    A sample code to obtain bulding inventories is provided below. Make sure to !pip install brails before running.:

    +
    ''' Import modules '''
    +from brails.workflow.FootprintHandler import FootprintHandler
    +from brails.workflow.NSIParser import NSIParser
    +from brails.workflow.ImHandler import ImageHandler
    +
    +''' Building parameters '''
    +# Define query location:
    +name_key = 'Vieques_2'
    +location = Lajas, Puerto Rico
    +# location = (lonmin, latmin, lonmax, latmax) # supports exten/bounding box format
    +
    +# Define footprint source:
    +# fpSource included in BRAILS are i) OpenStreetMaps,
    +# ii) Microsoft Global Building Footprints dataset, and iii) FEMA USA Structures.
    +# The keywords for these sources are osm, ms, and usastr, respectively.
    +footprint_source = 'osm'
    +
    +# Length units for the attributes (used when relevant):
    +lengthunit = 'm' # Options are 'm' or 'ft'
    +
    +# File where the building inventory will be stored:
    +outputfile = 'BuildingInventory.geojson'.format(name_key)
    +
    +''' Initialize and Run BRAILS modules '''
    +# Initialize FootprintHandler:
    +fpHandler = FootprintHandler()
    +
    +# Run FootprintHandler to get the footprints for the entered location:
    +fpHandler.fetch_footprint_data(location, fpSource=footprint_source,
    +                            outputFile='{0}_Footprints.geojson'.format(name_key),
    +                            lengthUnit=lengthunit)
    +footprints = fpHandler.footprints.copy()
    +
    +# Initialize NSIParser:
    +nsiParser = NSIParser()
    +
    +# Run NSIParser to merge the footprint data with NSI points:
    +nsiParser.GetNSIData(footprints, outfile=outputfile, lengthUnit=lengthunit)
    +
    +
    +
    +

    Note

    +

    Complete Jupyter notebook can be accessed in DesignSafe - Data Depot at PRJ-4604/Losses_Damage_R2D under the name InventoryBRAILS-notebook.ipynb.

    +
    +
    +_images/case7_DA3_footprints.png +
    +

    Fig. 3. Sample of 932 Building Footprints in Vieques, Puerto Rico, and BRAILS NumberOfFloors module generator.

    +
    +
    +
    +
  4. +
  5. HAZUS Rulesets: HAZUS is a tool for risk modeling methodology that is implemented in R2D. To conduct damage and loss assessments, the software uses rulesets that parses building attributes such as occupancy, year built, roof height, and others. For this example, the HAZUS rulesets were obtained and modified from E8 - Hurricane Wind Example in R2D documentation.

  6. +
+
+
+

SimCenter Tool Used

+

This example uses the Regional Resilience Determination Tool (R2D) for wind damage and loss estimations in a residential area in Vieques, Puerto Rico, in order to assess the impact of wind forces and improve infrastructure resilience for future events.

+
+
+

Example Application

+ + + + + + +

Download files

Download

+

Download example E17 - Hurricane Maria PR files and open R2D. In the File tab, Open the “input.json” file within the example.

+
+
+_images/case7_DA4_E1.png +
+

Fig. 4. R2D inut data.

+
+
+
+
+

Note

+

You will notice that all the inputs are autopopulated. Make sure to follow the next steps to verify they are in the correct units and using the right file references.

+
+
    +
  1. In the GI panel, set the Analysis Name, Units, Asset Layers, and Output Settings.

    +
    +
    +_images/case7_DA5_E2.png +
    +

    Fig. 5. R2D GI Input and Output Settings.

    +
    +
    +
    +
  2. +
  3. For the HAZ Hazard Selection, select “Raster Defined Hazard” for an Event Type: “Hurricane”. The Intensity Measures of Raster is “Peak Gust Wind Speed - PWS” in mph.

    +
    +
    +_images/case7_DA6_E3.png +
    +

    Fig. 6. R2D HAZ Hazard Definition.

    +
    +
    +
    +
  4. +
  5. In the ASD panel, make sure the Regional Building Inventory is set to “GIS File to AIM”. Select the Assets to Analyze as intervals (e.g., 1-100) or go back to panel VIZ to manually select your assets by i) ‘click’ on the inventory layer; ii) push “Select” button (then drag selection in the map); iii) push “Add Assets” button.

    +
    +
    +_images/case7_DA7_E4.png +
    +

    Fig. 7 (a). R2D ASD Assets Selection by Intervals.

    +
    +
    +
    +_images/case7_DA8_E5.png +
    +

    Fig. 7 (b). R2D VIZ Assets Selection in the Map.

    +
    +
    +
    +
  6. +
  7. The HTA panel requires a “Site Specified” calculation

    +
    +
    +_images/case7_DA9_E6.png +
    +

    Fig. 8. R2D HTA Building Mapping.

    +
    +
    +
    +
  8. +
  9. This example does not need a Building Modeling. Therefore, MOD set to “none”.

    +
    +
    +_images/case7_DA10_E7.png +
    +

    Fig. 9. R2D MOD Building Model.

    +
    +
    +
    +
  10. +
  11. The Building Analysis Method ANA will be “IMasEDP”.

    +
    +
    +_images/case7_DA11_E8.png +
    +

    Fig. 10. R2D ANA Building Analysis Method.

    +
    +
    +
    +
  12. +
  13. Damage & Loss Apllication is found in the DL panel. Here you select “Pelicun3” with Damage and Losss Method “HAZUS MH MU”. The Auto-population script referring to the specified ruleset is “auto_HU_PR.py” file.

    +
    +
    +_images/case7_DA12_E9.png +
    +

    Fig. 11. R2D DL Damage & Loss Application.

    +
    +
    +
    +
  14. +
  15. RUN the analysis. For the selection of 100 buildings, it should run in your local machine. For full inventory analysis, push RUN at DesignSafe button.

    +
    +
    +

    Warning

    +

    For complete inventory: run in DesignDafe, Stampede2 - 20 min|96 Skylake (SKX) cores | 2 nodes with 48 processors per node | 280 buildings per task

    +
    +
    +

    Note

    +

    SP, UQ, and RV panels are not used in this example.

    +
    +
    +
  16. +
+
+
+

Results

+

Results will be retrieved from the RUN panel and manipulated in the visualization VIZ panel for mapping options.

+
+
+_images/case7_DA13_E10.png +
+

Fig. 12. R2D RES Regional Results Summary.

+
+
+
+

The assessment gives two types of results:

+
    +
  1. MostLikelyCriticalDamageState: The Damage State uses a scale from 0 to 4 that correspons to a qualitative damage description.

  2. +
+ + ++++ + + + + + + + + + + + + + + + + + + + + + + +
Damage State for Residential Buildings

Damage State

Qualitative Damage Description

0

No Damage or Very Minor Damage - No visible damage from outside

1

Minor Damage - One broken window and moderate roof cover loss

2

Moderate Damage - Major roof cover damage

3

Sever Damage - Major window damage and roof cover loss

4

Destruction - Complete roof failure and/or failure of wall figremjobpane

+

Ref.: FEMA HAZUS Hurricane Technical Manual 4.2.3

+
    +
  1. mean_RepairCost_loss_ratio: The repair cost loss ratio is computed as a ratio of an estimated repair cost and wind-induced damage. The standard deviation of this variable is also provided as std_RepairCost_loss_ratio. This ratio goes on a scale from 0 to 1 and correlates with the Damage State (DS) variable. A typical breakdown corresponds to:

    +
    +
      +
    • DS0 - Loss ratio 0%

    • +
    • DS1 - Loss ratio 2%

    • +
    • DS2 - Loss ratio 10%

    • +
    • DS3 - Loss ratio 50%

    • +
    • DS4 - Loss ratio 100%

    • +
    +
    +
  2. +
+

The results suggest that -of the 100 buildings assessed- most would suffer Severe Damage to Destruction given the inventory information.

+
+

Note

+

Results Visualization: R2D offers QGIS capabilities to visualize regional trends and produce mapping products. Fig. 13 shows an example of a map product using the QGIS module to create HeatMaps of the MostLikelyCriticalDamageState variable and the spatial distribution of the mean_RepairCost_loss_ratio for different intervals. Then, using the “New Layout” option you can create maps with legends, title, and other elements. +See QGIS Documentation for more.

+
+
+_images/case7_DA14_Results.png +
+

Fig. 13. Mapping Visualization of Results Using QGIS in R2D.

+
+
+
+
+

Remarks

+
    +
  • Hurricanes are increasingly happening with more intensity and force due to climate change.

  • +
  • In locations such as Vieques, Puerto Rico, a comprehensive building inventory to assess huricane impact to infrastructure assets is limited. Assessing hazard exposure and consequences are key to increase resilience.

  • +
  • R2D possess vast capabilities to adress this challenge, allowing researches to input hazard data and construct building inventories with BRAILS tools.

  • +
  • This example provides strategies for creating building inventories in locations where data is scarce and implementing them in a format that could be used in R2D for regional analysis.

  • +
+
+
+

References

+
+
+
+[GV22] +

G. R. Guerra Velázquez. Hurricane maría and public health in puerto rico: lessons learned to increase resiliency and prepare for future disasters. Annals of Global Health, 2022.

+
+
+[RB20] +

V. Rashidian and L. G. Baise. Regional efficacy of a global geospatial liquefaction model. Engineering geology, 272:105644, 2020.

+
+
+[Saf73] +

H. S. Saffir. Hurricane wind and storm surge. The Military Engineering, pages 4–5, 1973.

+
+
+[SGM24] +

M. D. Sanger, M. Geyin, and B. W. Maurer. A global liquefaction model for rapid response and scenario modeling. Manuscript in preparation, 2024.

+
+
+[ZBT17] +

J. Zhu, L. G. Baise, and E. M. Thompson. An updated geospatial liquefaction model for global application. Bulletin of the Seismological Society of America, 107(3):1365–1385, 2017.

+
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/genindex.html b/genindex.html new file mode 100644 index 0000000..2cc5384 --- /dev/null +++ b/genindex.html @@ -0,0 +1,116 @@ + + + + + + Index — CESG-599 1.0.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ +
+ + +
+
+
+ +
+ +
+

© Copyright 2024, UW Computational Group.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..9dde499 --- /dev/null +++ b/index.html @@ -0,0 +1,224 @@ + + + + + + + Welcome to CESG 599 - NHERI - An Introduction to SimCenter tool and DesignSafe Infrastructure! — CESG-599 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • + View page source +
  • +
+
+
+
+
+ +
+

Welcome to CESG 599 - NHERI - An Introduction to SimCenter tool and DesignSafe Infrastructure!

+
+

What is CESG599-NHERI

+

This site provides a series of examples discussed during the CESG599-NHERI course. The course is designed to provide an introduction to the NHERI SimCenter tools and DesignSafe infrastructure. +The course is intended for graduate students and researchers in the field of civil engineering, but it is open to anyone interested in learning about the tools and resources available through the NHERI SimCenter and DesignSafe.

+
+

Contents

+ +
+
+
+

Acknowledgements

+

This supporting materials were developed by CESG 599 students and Pedro Arduino in the Department of Civil and Environmental Engineering at the University of Washington under the auspices of the NHERI-SimCenter (SimCenter).

+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 0000000..8c1463d Binary files /dev/null and b/objects.inv differ diff --git a/search.html b/search.html new file mode 100644 index 0000000..e8bb342 --- /dev/null +++ b/search.html @@ -0,0 +1,131 @@ + + + + + + Search — CESG-599 1.0.0 documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2024, UW Computational Group.

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 0000000..520c191 --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"Acknowledgements": [[8, "acknowledgements"]], "Author: Daniel Acosta Reyes": [[7, "author-daniel-acosta-reyes"]], "Author: Erick Martinez": [[2, "author-erick-martinez"]], "Author: Jose Barreto": [[3, "author-jose-barreto"]], "Author: Kendra Mutch": [[1, "author-kendra-mutch"]], "Author: Luis Angel Guerrero Hoyos": [[6, "author-luis-angel-guerrero-hoyos"]], "Author: Morgan Sanger": [[5, "author-morgan-sanger"]], "Authors:": [[0, "authors"]], "CESG599 - NHERI - An introduction to NHERI Simcenter tools and DesignSafe Resources": [[0, "cesg599-nheri-an-introduction-to-nheri-simcenter-tools-and-designsafe-resources"]], "Contents": [[8, null]], "Course Description": [[0, "course-description"]], "Course Introduction": [[0, "course-introduction"]], "Damage State for Residential Buildings": [[7, "id23"]], "EEUQ - Transfer Function and Uncertainty": [[2, "eeuq-transfer-function-and-uncertainty"]], "EXAMPLELS of LISTS, FIGURES, TABLE, REFERENCE, etc": [[0, "examplels-of-lists-figures-table-reference-etc"]], "Example": [[2, "example"]], "Example Application": [[0, "example-application"], [1, "example-application"], [2, "example-application"], [3, "example-application"], [4, "example-application"], [5, "example-application"], [6, "example-application"], [7, "example-application"]], "Example One Solution Strategy - Forward Propagation": [[1, "example-one-solution-strategy-forward-propagation"]], "Example Three Solution Strategy - Sensitivity Analysis": [[1, "example-three-solution-strategy-sensitivity-analysis"]], "Example Two Solution Strategy - Bayesian and Deterministic Calibration": [[1, "example-two-solution-strategy-bayesian-and-deterministic-calibration"]], "Example of Application": [[0, "example-of-application"]], "Fourier Transform": [[2, "fourier-transform"]], "Introduction": [[0, "introduction"], [1, "introduction"], [2, "introduction"], [3, "introduction"], [4, "introduction"], [5, "introduction"], [6, "introduction"], [7, "introduction"]], "Learning Objectives": [[0, "learning-objectives"]], "Motion": [[2, "motion"]], "Pre-Workflow Python Script": [[2, "pre-workflow-python-script"]], "Problem Description": [[0, "problem-description"], [2, "problem-description"], [3, "problem-description"], [4, "problem-description"], [5, "problem-description"], [6, "problem-description"], [7, "problem-description"]], "Project Description": [[1, "project-description"]], "R2D - Hurricane Maria Damage and Losses": [[7, "r2d-hurricane-maria-damage-and-losses"]], "R2D - Landslides": [[6, "r2d-landslides"]], "R2D - Liquefaction": [[5, "r2d-liquefaction"]], "References": [[7, "references"]], "Remarks": [[0, "remarks"], [0, "id2"], [1, "remarks"], [2, "remarks"], [3, "remarks"], [4, "remarks"], [5, "remarks"], [6, "remarks"], [7, "remarks"]], "Results": [[2, "results"], [7, "results"]], "S3hark - Site Response 1": [[3, "s3hark-site-response-1"]], "S3hark - Site Response 2": [[4, "s3hark-site-response-2"]], "SimCenter Tool Used": [[0, "simcenter-tool-used"], [0, "id1"], [1, "simcenter-tool-used"], [2, "simcenter-tool-used"], [3, "simcenter-tool-used"], [4, "simcenter-tool-used"], [5, "simcenter-tool-used"], [6, "simcenter-tool-used"], [7, "simcenter-tool-used"]], "Soil Profile": [[2, "soil-profile"]], "Soil Profile Parameters": [[1, "id9"]], "Solution Strategy": [[0, "solution-strategy"], [2, "solution-strategy"], [3, "solution-strategy"], [4, "solution-strategy"], [5, "solution-strategy"], [6, "solution-strategy"], [7, "solution-strategy"]], "Table 1. Natural Frequencies in the Transfer Function": [[2, "id25"]], "Title": [[0, "id9"], [3, "id8"], [4, "id7"], [6, "id8"]], "To be continued\u2026": [[6, "to-be-continued"]], "Transfer Function Equation": [[2, "transfer-function-equation"]], "Uncertainty": [[2, "uncertainty"]], "Welcome to CESG 599 - NHERI - An Introduction to SimCenter tool and DesignSafe Infrastructure!": [[8, "welcome-to-cesg-599-nheri-an-introduction-to-simcenter-tool-and-designsafe-infrastructure"]], "What is CESG599-NHERI": [[8, "what-is-cesg599-nheri"]], "Workflow in EE-UQ": [[2, "workflow-in-ee-uq"]], "quoFEM - Settlements": [[1, "quofem-settlements"]]}, "docnames": ["case_0", "case_1", "case_2", "case_3", "case_4", "case_5", "case_6", "case_7", "index"], "envversion": {"sphinx": 61, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinxcontrib.bibtex": 9}, "filenames": ["case_0.rst", "case_1.rst", "case_2.rst", "case_3.rst", "case_4.rst", "case_5.rst", "case_6.rst", "case_7.rst", "index.rst"], "indexentries": {}, "objects": {}, "objnames": {}, "objtypes": {}, "terms": {"": [0, 1, 2, 3, 4, 5, 6, 7], "0": [0, 1, 2, 3, 4, 5, 6, 7, 8], "002": 2, "005": 2, "02": 2, "03": 2, "03g": 2, "05": [1, 2, 4], "1": [0, 1, 4, 5, 6, 7, 8], "10": [0, 1, 2, 7], "100": [2, 5, 7], "1000": 2, "1024": [0, 3, 4, 5, 6], "105644": [0, 1, 2, 3, 4, 5, 6, 7], "106": 1, "107": [0, 1, 2, 3, 4, 5, 6, 7], "10e": 1, "11": [2, 7], "12": [2, 7], "13": [2, 7], "130": 1, "1365": [0, 1, 2, 3, 4, 5, 6, 7], "1385": [0, 1, 2, 3, 4, 5, 6, 7], "14": 2, "15": 2, "150": 2, "15g": 2, "16": 2, "17": 2, "18": 2, "1973": [0, 1, 2, 3, 4, 5, 6, 7], "1989": 4, "1996": 2, "1g": 5, "1j": 2, "2": [0, 1, 2, 3, 5, 6, 7, 8], "20": [1, 2, 7], "200": [1, 2], "2000": 2, "2011": [1, 5], "2017": [0, 1, 2, 3, 4, 5, 6, 7], "2020": [0, 1, 2, 3, 4, 5, 6, 7], "2022": [0, 1, 2, 3, 4, 5, 6, 7], "2024": [0, 1, 2, 3, 4, 5, 6, 7], "24": 4, "25": [1, 2], "25g": 2, "272": [0, 1, 2, 3, 4, 5, 6, 7], "280": 7, "2c": 6, "2p": [0, 3, 4], "2pf": [0, 3, 4], "3": [0, 1, 2, 3, 4, 5, 6, 7], "3000": 7, "37": 5, "4": [0, 1, 2, 3, 4, 5, 6, 7], "460": 6, "4604": 7, "48": 7, "49": 2, "4g": 2, "5": [0, 1, 2, 3, 4, 5, 6, 7], "50": [1, 5, 7], "500": [1, 2], "54": 1, "546": 6, "6": [1, 2, 6, 7], "642": 6, "7": [1, 2, 7], "75": 1, "8": [2, 7], "8000": 2, "81": 2, "9": [2, 7], "900": 7, "913": 2, "932": 7, "949": 1, "96": 7, "98": 2, "981": 2, "A": [0, 1, 2, 3, 4, 5, 6, 7], "As": [1, 2, 4], "At": 0, "Be": 0, "By": [0, 1, 2, 3, 4, 5], "For": [1, 2, 3, 7], "If": 1, "In": [0, 1, 2, 3, 4, 5, 6, 7], "It": [0, 2, 3, 4, 6], "No": 7, "On": [0, 3, 4], "One": [2, 7, 8], "Or": 1, "The": [0, 1, 2, 3, 4, 5, 6, 7, 8], "Then": [1, 7], "There": [0, 1, 2, 3, 4, 5, 6], "These": [0, 1, 2, 3, 4, 5, 6], "To": [0, 1, 2, 3, 4, 5, 7, 8], "With": 2, "_": 5, "__init__": 2, "__main__": 2, "__name__": 2, "_footprint": 7, "a_c": 6, "aakash": 2, "ab": 2, "abl": 2, "about": [0, 1, 3, 4, 5, 7, 8], "abov": [1, 2, 5, 7], "absfa": 2, "absfas2": 2, "abssoiltf": 2, "academ": 2, "acc": 2, "acc_th": 2, "acc_typ": 2, "acc_unit": 2, "accaux": 2, "accel": 2, "acceler": [0, 2, 3, 4, 5, 6], "accept": 1, "access": 7, "accord": [0, 3, 4, 5, 6], "account": [1, 2], "acct": 2, "acctaux": 2, "accumul": [0, 3, 4, 5, 6], "accur": [0, 1, 2], "accuraci": 2, "acknowledg": 0, "acosta": [0, 8], "across": [5, 6], "act": 2, "activ": 4, "ad": [0, 3, 4, 5, 6], "add": [2, 7], "addit": [0, 1, 2], "addition": [0, 1], "address": 0, "adjac": 4, "adjust": [0, 3, 4, 5, 6], "adopt": 0, "adress": 7, "advanc": [0, 5], "af": [0, 3, 4], "affect": [2, 5], "afft": 2, "after": [1, 5, 7], "against": 5, "ai": [5, 7], "aid": [1, 2], "aim": [0, 4, 7], "alborz": 2, "all": [0, 1, 2, 3, 4, 5, 6, 7], "alloc": 1, "allow": [1, 2, 7], "along": [0, 2, 3, 4], "also": [0, 2, 3, 4, 6, 7], "alwai": [0, 2, 3, 4, 5, 6], "amax": 2, "america": [0, 1, 2, 3, 4, 5, 6, 7], "amplif": [0, 2, 3, 4], "amplifi": [2, 3], "amplitud": 2, "an": [1, 2, 3, 4, 5, 6, 7], "ana": 7, "analys": [2, 4, 5], "analysi": [0, 2, 3, 4, 6, 7, 8], "analyz": [0, 2, 4, 6, 7], "angel": 8, "angl": 6, "angular": [0, 3, 4], "ani": [0, 1, 2, 3, 4, 5, 6], "anim": [0, 3, 4, 5, 6], "annal": [0, 1, 2, 3, 4, 5, 6, 7], "anoth": [1, 2, 5], "anyon": 8, "api": 7, "apllic": 7, "append": 2, "appli": [0, 1, 2, 3, 4, 5], "applic": 8, "approach": [0, 5, 6], "ar": [0, 1, 2, 3, 4, 5, 6, 7], "arang": 2, "arbitrari": [0, 2, 3, 4], "arctan": 5, "arduino": [0, 2, 8], "area": [5, 6, 7], "aria": 6, "arrai": [2, 5], "arrow": [0, 3, 4, 6], "artifici": 5, "asd": 7, "aspect": 1, "asses": 6, "assess": [5, 6, 7], "asset": [5, 7], "assign": 1, "assist": 2, "associ": [0, 3, 4, 6, 7], "assum": [2, 4], "atop": 4, "attempt": 0, "attribut": 7, "auc": 5, "auspic": 8, "author": [4, 8], "auto": 7, "auto_hu_pr": 7, "automat": [0, 3, 4, 5, 6], "autopopul": 7, "avail": [0, 2, 5, 8], "averag": 2, "await": 5, "axi": 1, "b": [0, 1, 2, 3, 4, 5, 6, 7], "back": [0, 2, 3, 4, 5, 6, 7], "background": [0, 2], "bai": 4, "bais": [0, 1, 2, 3, 4, 5, 6, 7], "bangalor": 2, "bar": [0, 3, 4, 6], "barbaro": 2, "barreto": [0, 8], "base": [0, 2, 5, 7], "baselin": 7, "basic": [1, 2, 3, 4, 5], "bayesain": 1, "bayesian": 8, "becaus": 2, "becom": 5, "bedrock": 4, "been": 2, "befor": [5, 7], "begin": [0, 3, 4, 5, 6], "behavior": 2, "being": [0, 2], "below": [0, 1, 2, 3, 4, 6, 7], "best": 5, "beta": 6, "better": 5, "between": [0, 2, 3, 4, 5, 6], "bewar": [0, 3, 4, 6], "beyond": 5, "bim": 7, "bit": [0, 3, 4, 6], "blablabla": [0, 3, 4, 6], "bodi": [3, 5], "both": [1, 5], "bottom": [0, 2, 3, 4, 6], "bound": 7, "boundari": 4, "box": [0, 1, 3, 4, 5, 6, 7], "brail": 7, "breakdown": 7, "breath": 0, "brief": [0, 1], "broken": 7, "buena": 4, "build": 2, "buildinginventori": 7, "built": [5, 6, 7], "buld": 7, "bulletin": [0, 1, 2, 3, 4, 5, 6, 7], "button": [0, 3, 4, 5, 6, 7], "c": [2, 5, 6], "calcsoiltf": 2, "calcul": [0, 1, 2, 3, 4, 6, 7], "calculate_nat_freq": 2, "calculate_ratio": 2, "calculaterespons": 2, "calibr": 8, "callibr": 1, "camera": [0, 3, 4, 6], "can": [0, 1, 2, 3, 4, 5, 6, 7], "cannot": [2, 5], "capabl": [0, 5, 7], "carlo": 1, "carri": 2, "case": [2, 3, 5], "categor": 7, "categori": 7, "caus": [2, 4], "cautiou": 1, "cc": 1, "cdot": 5, "ceas": [0, 3, 4, 5, 6], "center": 7, "centroid": 2, "certain": [2, 6], "cesg599": [1, 2, 3, 4, 5, 6, 7], "cetin": 2, "challeng": 7, "chanc": 1, "chang": [0, 1, 2, 3, 4, 6, 7], "character": [4, 5], "characterist": [4, 5], "check": 1, "chen": 2, "choic": 0, "choos": [0, 1, 3, 4], "christchurch": 5, "chungen": [0, 4], "circular": 2, "cite": 1, "citi": 2, "civil": 8, "clai": 2, "claim": 7, "class": [0, 2], "clearli": 0, "click": [0, 1, 2, 3, 4, 5, 6, 7], "climat": 7, "cloud": [0, 1], "cm": [1, 2, 6], "co": [0, 2, 3, 4], "code": [2, 7], "coeff": 2, "coeffici": 1, "cohes": [1, 6], "column": [0, 1, 3, 4, 6], "combin": [0, 3, 4, 6], "command": [0, 3, 4, 6], "comment": 0, "common": 5, "commonli": 4, "commun": [0, 5, 6], "compar": [0, 3, 4, 5, 6], "comparison": 5, "complet": [0, 1, 2, 3, 4, 5, 7], "complex": 2, "complex_": 2, "compon": 2, "composit": [2, 3], "compound": 1, "comprehens": [0, 1, 6, 7], "compress": 1, "compuat": 1, "comput": [0, 1, 2, 3, 4, 5, 6, 7], "concept": [0, 1, 2, 3, 4, 5], "concis": 0, "concret": 0, "condit": 5, "conduct": 7, "cone": 5, "configur": 4, "conj": 2, "connect": [2, 3], "consequ": 7, "conserv": 1, "consid": [1, 2, 3], "consider": [0, 3, 4], "consist": 5, "construct": [0, 2, 7], "contagi": 2, "contain": [1, 7], "content": [0, 2], "context": 0, "continu": [0, 2, 3, 4, 5, 8], "contract": [0, 3, 4, 5, 6], "contrast": 2, "control": [0, 3, 4, 6], "convent": 5, "convert": [1, 2, 3], "copi": 7, "copmut": 1, "copyright": 2, "core": [0, 7], "corner": [0, 3, 4], "correct": 7, "correl": [1, 6, 7], "correspon": 7, "correspond": [3, 7], "coseism": 5, "cost": [0, 7], "cot": 6, "could": [0, 1, 2, 5, 6, 7], "cours": 8, "cover": [0, 7], "cpt": 5, "cr": 1, "creat": [0, 2, 3, 4, 6, 7], "crest": [0, 3, 4], "crisi": 7, "critic": [0, 6], "csv": 1, "cumtrapz": 2, "cumul": 1, "current": [0, 3, 4, 6], "cursor": [0, 3, 4], "curv": [0, 3, 4, 5], "custompi": 2, "cyberinfrastructur": 0, "d": [0, 1, 2, 3, 4, 5, 6, 7, 8], "dakota": [1, 2], "damag": 8, "damp": [2, 3], "damper": 2, "daniel": [0, 8], "dashpot": 2, "data": [0, 1, 2, 3, 4, 5, 6, 7], "databas": 5, "dataset": [5, 7], "date": 2, "de": 2, "deamplif": 2, "decad": 7, "deem": 7, "deeper": 0, "def": 2, "default": [0, 1, 3, 4], "defin": [1, 2, 5, 7], "definit": 7, "degre": 2, "deliv": 0, "demand": 2, "demograph": 5, "depart": 8, "depend": [1, 2], "depict": 1, "deposit": 4, "depot": 7, "depth": 2, "describ": [0, 1, 2, 3, 5, 6], "descript": 8, "design": [0, 1, 2, 8], "designdaf": 7, "designsaf": [1, 2, 3, 4, 5, 6, 7], "desir": [0, 1, 2, 3, 4, 6], "desk": 5, "destroi": 7, "destruct": 7, "detail": [0, 1, 2, 3], "determin": [1, 2, 3, 5, 7], "determinist": 8, "develop": [0, 5, 8], "deviat": [1, 2, 7], "devic": 2, "dfreq": 2, "differ": [0, 1, 2, 3, 4, 5, 6, 7], "differenti": 2, "dimens": 2, "dimension": [2, 3, 4], "dir": 1, "direct": 0, "directori": 2, "disast": [0, 1, 2, 3, 4, 5, 6, 7], "disastr": 2, "discuss": [0, 1, 8], "displac": [0, 2, 3, 4, 6], "displai": [0, 1, 3, 4, 6], "distal": 5, "distanc": [0, 3, 4, 5], "distribut": [1, 2, 4, 7], "dl": 7, "dn": 6, "do": [0, 3, 4], "document": [0, 5, 6, 7], "doe": [1, 7], "dof": 2, "domain": 2, "done": 6, "down": [0, 1, 3, 4, 5, 6], "download": [6, 7], "dr": [0, 3, 4, 6], "drag": [0, 3, 4, 5, 6, 7], "drop": 1, "ds0": 7, "ds1": 7, "ds2": 7, "ds3": 7, "ds4": 7, "dt": 2, "dtm": 6, "dtype": 2, "due": [2, 7], "durat": 5, "dure": [2, 4, 8], "dw": 2, "dx": 2, "dynam": [0, 3, 4, 6], "e": [0, 1, 2, 3, 4, 5, 6, 7], "e17": 7, "e8": 7, "each": [0, 1, 2, 3, 5], "earlier": 0, "earth": 2, "earthquak": [2, 4, 5, 6], "easi": [0, 2], "edp": [1, 2], "educ": 0, "eeuq": 8, "effect": [0, 2, 3, 4, 5, 6], "efficaci": [0, 1, 2, 3, 4, 5, 6, 7], "effort": [2, 6], "either": [0, 1, 3, 4, 6], "elast": [2, 3], "elasticisotrop": 4, "element": [1, 2, 7], "elev": 5, "elif": 2, "els": 2, "embed": 3, "emerg": 5, "emphas": 7, "empir": 5, "emploi": 3, "empty_lik": 2, "encoung": [1, 3], "encourag": 2, "end": [0, 5], "endeavor": 4, "engin": [0, 1, 2, 3, 4, 5, 6, 7, 8], "enough": 0, "ensur": [0, 1, 2], "entail": 4, "enter": [1, 7], "entir": [0, 2], "environment": [6, 8], "eo": 1, "eqn": [2, 5], "equat": [0, 6], "erick": [0, 8], "especi": [0, 1, 3, 4, 5, 6], "essenti": [0, 7], "establish": 0, "estim": [6, 7], "etc": [1, 2, 8], "evacu": 5, "evalu": [2, 3, 5], "even": 0, "event": [2, 5, 7], "everi": 0, "everyon": 2, "evt": 2, "ex": 4, "exacerb": 7, "examin": 0, "exampl": 8, "examplel": 8, "except": [0, 2, 3, 4, 5, 6], "excess": 4, "excit": 3, "execut": [0, 1, 2], "expand": 2, "expans": [0, 3, 4, 5, 6], "experi": 0, "experienc": 3, "expir": 1, "explain": [0, 3], "explan": 0, "explanatori": [0, 3, 4, 6], "explor": 0, "export": 1, "exposur": 7, "express": 2, "exten": 7, "extent": 5, "extract": 1, "extrapol": 2, "f": 2, "fa": 2, "facil": 7, "facilit": 2, "factor": [0, 2, 3, 4, 5, 6], "failur": 7, "familiar": 0, "fast": [0, 2, 3, 4, 6], "favorit": 2, "featur": 1, "feb": 5, "feedback": [0, 3, 4, 6], "fem": [0, 1, 2], "fema": 7, "fetch": 7, "fetch_footprint_data": 7, "few": 5, "fft": [0, 2, 3, 4, 5, 6], "field": [5, 7, 8], "fig": [2, 5, 7], "figremjobpan": 7, "figur": [1, 2, 4, 8], "file": [1, 2, 5, 7], "file_nam": 2, "filenotfounderror": 2, "fill": [1, 4], "filter": [2, 3], "final": [0, 1, 2, 5, 6, 7], "find": 0, "finit": [1, 2], "first": [0, 1, 2, 3, 4, 5, 6], "fit": [0, 5], "five": [0, 1, 5], "float_": 2, "follow": [0, 1, 2, 3, 4, 6, 7], "footprint": 7, "footprint_sourc": 7, "footprinthandl": 7, "forc": [2, 3, 7], "form": [0, 2, 3, 4, 5, 6], "format": [0, 7], "formula": 1, "forth": [0, 3, 4, 5, 6], "forward": [0, 2, 3, 4, 6, 8], "found": [2, 7], "foundat": 3, "four": [0, 1, 3, 4], "fourier": [0, 3, 4, 6], "fphandler": 7, "fpsourc": 7, "frac": [0, 3, 4, 5, 6], "framework": 0, "francisco": 4, "frank": 2, "free": 2, "freedom": 2, "freq": 2, "frequenc": [0, 1, 3, 4], "friction": 6, "from": [0, 1, 2, 3, 4, 5, 6, 7], "fs_": 6, "ft": [1, 7], "full": [2, 5, 7], "fulli": 0, "function": [0, 3, 4, 5, 6, 8], "fund": 1, "fundament": 0, "further": [1, 2, 5], "furthermor": 4, "futur": [0, 1, 2, 3, 4, 5, 6, 7], "g": [0, 1, 2, 3, 4, 5, 6, 7], "gal": 2, "gamma": 6, "gather": 7, "gaussian": 2, "gener": [0, 2, 3, 4, 5, 6, 7], "geojson": 7, "geologi": [0, 1, 2, 3, 4, 5, 6, 7], "geomorphologi": 5, "geospati": [0, 1, 2, 3, 4, 5, 6, 7], "geostatist": 5, "geotechn": [0, 1, 2, 5], "geq": 5, "get": [0, 2, 3, 4, 6, 7], "getnsidata": 7, "geyin": [0, 1, 2, 3, 4, 5, 6, 7], "ghofrani": 2, "gi": [2, 7], "github": [0, 1, 2, 3, 4, 5, 6, 7, 8], "give": [0, 7], "given": [0, 1, 2, 3, 4, 5, 6, 7], "global": [0, 1, 2, 3, 4, 5, 6, 7], "go": 7, "goal": [0, 1], "goe": 7, "googl": 7, "graduat": 8, "grav": 2, "great": 2, "greater": 5, "greatest": 2, "ground": [2, 3, 4, 5, 6], "group": [0, 2, 3, 4, 6], "guerra": [0, 1, 2, 3, 4, 5, 6, 7], "guerrero": [0, 8], "gust": 7, "gv22": [0, 1, 2, 3, 4, 5, 6, 7], "h": [0, 1, 2, 3, 4, 5, 6, 7], "h1": 1, "h2": 1, "ha": 2, "had": 2, "hand": [0, 3, 4], "happen": 7, "hardwir": [0, 3, 4], "have": [0, 2, 3, 4, 5, 6], "haz": 7, "hazard": [0, 1, 5, 7], "hazu": 7, "head": [0, 3, 4, 6], "health": [0, 1, 2, 3, 4, 5, 6, 7], "healthcar": 7, "heatmap": 7, "heavi": 7, "height": [0, 1, 2, 3, 4, 7], "held": [0, 3, 4, 6], "help": [0, 1, 2, 7], "her": 2, "here": [2, 6, 7], "hi": 2, "high": [1, 5], "highest": 2, "highli": 1, "highlight": 0, "highlith": 7, "histogram": [1, 2], "histori": [0, 2, 3, 4, 5, 6], "hold": [0, 3, 4, 6], "holtz": 1, "home": 7, "horizont": [0, 3, 4, 5, 6], "horm": 2, "hour": [1, 7], "how": [0, 1, 3, 4, 6], "howev": [0, 3, 4, 6, 7], "hoyo": 8, "hpc": 0, "hta": 7, "hurican": 7, "hurrican": [0, 1, 2, 3, 4, 5, 6, 8], "hydrologi": 5, "hypercub": 2, "hz": 2, "i": [0, 1, 2, 3, 4, 5, 6, 7], "i_a": 6, "icon": [0, 1, 3, 4, 6], "idea": [2, 6], "ideal": 5, "identifi": 5, "ifa": 2, "ifft": 2, "ignor": 2, "ii": [2, 7], "iii": 7, "illustr": [0, 3, 4, 6], "imag": [0, 1, 2, 3, 4, 6], "imagehandl": 7, "imaginari": 2, "imasedp": 7, "imhandl": 7, "immedi": 5, "impact": [0, 1, 5, 7], "imped": 2, "implement": [1, 2, 5, 7], "import": [1, 2, 4, 7], "improv": [5, 7], "imput": 6, "includ": [0, 1, 2, 5, 7], "inclus": 2, "incom": [2, 3], "incorpor": 2, "increas": [0, 1, 2, 3, 4, 5, 6, 7], "increasingli": 7, "increment": [0, 2, 3, 4], "index": [1, 5], "individu": 5, "induc": 7, "inerti": 3, "infinit": [2, 3, 6], "influenc": [2, 4], "inform": [0, 1, 2, 5, 7], "infrastructur": [0, 5, 6, 7], "inher": 3, "initi": [2, 5, 7], "input": [1, 2, 3, 7], "insert": [0, 2, 3, 4, 6], "insight": 5, "instal": [0, 3, 4, 5, 6, 7], "instanc": 2, "institut": 7, "int": 2, "integ": 2, "integr": [0, 1, 2, 5, 6], "intellig": 5, "intend": 8, "intens": [5, 6, 7], "intention": [0, 3, 4, 6], "interest": [1, 2, 5, 6, 8], "interfac": 2, "intern": [0, 3, 4, 6], "interpret": 0, "interv": 7, "introduc": [0, 2], "inut": 7, "inventori": [5, 7], "inventorybrail": 7, "investig": [0, 1, 2, 4], "invit": 0, "involv": [0, 3], "ipynb": 7, "island": [4, 7], "issu": 0, "its": [0, 2, 3, 4, 6], "j": [0, 1, 2, 3, 4, 5, 6, 7], "jibson": 6, "jinyan": 2, "jose": [0, 8], "json": [2, 7], "jsonobj": 2, "jupyt": 7, "k": [1, 2], "keep": 1, "kei": [0, 3, 4, 5, 6, 7], "kendra": [0, 8], "keyboard": [0, 3, 4, 6], "keyword": 7, "kn": 6, "know": 1, "knowledg": [0, 5], "known": [3, 5], "kovac": 1, "kpa": 6, "kramer": 2, "krige": 5, "kstar": 2, "l": [0, 1, 2, 3, 4, 5, 6, 7], "lab": 1, "label": 2, "laja": 7, "landslid": 8, "languag": 0, "larg": [2, 5, 7], "larger": 2, "last": [0, 5], "latin": 2, "latmax": 7, "latmin": 7, "layer": [0, 2, 3, 4, 6, 7], "layout": 7, "lead": [0, 1, 2, 3, 4, 5, 6], "learn": [1, 2, 3, 4, 5, 6, 7, 8], "least": 1, "left": [0, 1, 3, 4, 5], "legend": [2, 7], "len": 2, "length": [0, 1, 3, 4, 5, 6, 7], "lengthunit": 7, "lesson": [0, 1, 2, 3, 4, 5, 6, 7], "lh": 2, "li": 4, "life": 5, "lifelin": [0, 5], "like": [2, 3, 5, 6], "limit": [0, 7], "liquefact": [0, 1, 2, 3, 4, 6, 7, 8], "liquefc": 5, "liquefi": 4, "list": [1, 2, 8], "live": 7, "ll": 5, "load": [0, 2, 3, 4, 6], "load_fil": 2, "local": [2, 7], "locat": [1, 2, 5, 6, 7], "log": 6, "login": 1, "logist": 5, "logspac": 2, "loma": 4, "long": [0, 2, 3, 4, 6, 7], "lonmax": 7, "lonmin": 7, "look": 2, "loop": 2, "loss": 8, "losses_damage_r2d": 7, "lossess": 7, "losss": 7, "lot": 2, "lower": 5, "lowest": 2, "lpi": 5, "lui": [0, 8], "m": [0, 1, 2, 3, 4, 5, 6, 7], "m6": 5, "m7": 5, "m_absfft": 2, "m_absifft": 2, "m_abssoiltf": 2, "m_acc": 2, "m_acct": 2, "m_damp": 2, "m_disp": 2, "m_dispt": 2, "m_dt": 2, "m_filenam": 2, "m_freq": 2, "m_h": 2, "m_time": 2, "m_v": 2, "m_vel": 2, "m_velt": 2, "mac": [0, 2, 3, 4, 6], "machin": [1, 7], "made": [2, 5, 7], "magnitud": 5, "mai": 1, "main": 2, "major": [2, 4, 7], "make": [0, 1, 3, 7], "manag": 0, "mani": [0, 2, 3, 4, 5, 6], "manifest": 5, "manipul": [0, 3, 4, 6, 7], "manual": [0, 3, 4, 5, 6, 7], "manuscript": [0, 1, 2, 3, 4, 5, 6, 7], "map": [5, 7], "maria": 8, "markup": 0, "martinez": [0, 8], "mar\u00eda": [0, 1, 2, 3, 4, 5, 6, 7], "mass": [2, 3], "master": 0, "match": [2, 3], "materi": [0, 2, 3, 4, 6, 8], "mathemat": [2, 3], "matplotlib": 2, "maurer": [0, 1, 2, 3, 4, 5, 6, 7], "max": 2, "maximum": [0, 1, 3, 4], "maxpow": 2, "mckenna": 2, "mdisp": 2, "mean": [1, 2], "mean_repaircost_loss_ratio": 7, "measur": [2, 5, 6, 7], "mechan": [0, 2, 3, 4, 5, 6], "medium": [2, 3], "menu": [0, 1, 3, 4, 6], "merg": 7, "meter": 2, "method": [0, 1, 2, 4, 7], "methodologi": 7, "metric": 5, "mexico": 2, "mh": 7, "mi": 5, "microsoft": 7, "might": 2, "mile": 7, "militari": [0, 1, 2, 3, 4, 5, 6, 7], "min": 7, "minor": 7, "minpow": 2, "minut": [0, 3, 4], "mirror": 2, "mislead": [0, 3, 4, 5, 6], "mitig": 6, "mixtur": 2, "mod": 7, "model": [0, 1, 2, 3, 4, 5, 6, 7], "moder": 7, "modifi": 7, "modul": 7, "mont": 1, "more": [0, 1, 2, 3, 5, 6, 7], "morgan": [0, 8], "most": [1, 2, 7], "mostli": 5, "mostlikelycriticaldamagest": 7, "motion": [3, 5, 6], "motiv": 2, "mph": 7, "mu": 7, "mud": 4, "multidisciplinari": 6, "multipl": [0, 1, 2, 3, 4, 6], "multipli": [2, 3], "must": [1, 2, 5], "mutch": [0, 8], "mvel": 2, "my": 2, "m\u00b3": 6, "n_freq": 2, "n_freqval": 2, "n_point": 2, "n_pt": 2, "name": 7, "name_kei": 7, "nat": 2, "nation": 7, "natur": [0, 3, 4], "navig": [1, 2], "nearbi": 5, "necessari": [0, 3, 4, 5, 6], "need": [5, 7], "network": 5, "new": 7, "newmark": 6, "next": [0, 7], "nfreq": 2, "nheri": [1, 2, 3, 4, 5, 6, 7], "nist": 7, "node": [0, 2, 3, 4, 6, 7], "non": 2, "none": [2, 7], "nonlinear": 4, "normal": [1, 2], "note": [0, 3, 4, 6], "notebook": 7, "notic": [0, 3, 4, 5, 6, 7], "np": 2, "nperiod": 2, "nsi": 7, "nsipars": 7, "nstep": 2, "number": [1, 2], "numberoffloor": 7, "numer": [0, 3, 4, 6], "numpi": 2, "nyquist_freq": 2, "nyquist_index": 2, "object": [2, 3, 4, 6, 8], "observ": [0, 1], "obtain": [0, 3, 4, 7], "occup": 7, "occupancyclassifi": 7, "occur": [2, 3, 6], "offer": [0, 7], "offset": [0, 3, 4, 5, 6], "onc": [0, 1, 3, 4, 5, 6], "one": [0, 1, 2, 3, 4, 6], "onli": [0, 2, 3, 4, 5, 6, 7], "open": [0, 1, 2, 3, 4, 7, 8], "opensea": 1, "openstreetmap": 7, "oper": [0, 3, 4, 5, 6], "opportun": [0, 5], "opt": 2, "optim": 1, "option": [0, 3, 4, 7], "orbit": [0, 3, 4, 6], "order": [2, 6, 7], "orient": [0, 3, 4, 6], "osm": 7, "other": [0, 1, 2, 5, 7], "our": 3, "outcom": [0, 2], "outcrop": 4, "outfil": 7, "outgo": 2, "outlin": [0, 1], "output": [2, 3, 4, 7], "outputfil": 7, "outsid": 7, "over": [0, 5, 7], "overlai": 4, "overpredict": 1, "overview": 0, "overwhelm": 0, "p": 2, "pa": 7, "packag": 0, "page": [0, 1, 2, 3, 4, 5, 6, 7, 8], "pair": 1, "palett": [0, 3, 4, 6], "pane": [0, 3, 4, 6], "panel": 7, "panner": [0, 3, 4, 6], "paragraph": 0, "parallel": 2, "paramet": [2, 4, 5, 6, 7], "paramt": 1, "parellel": 1, "pars": [5, 7], "part": [0, 2], "particip": 2, "particl": 3, "path": 1, "pattern": 2, "pattern_typ": 2, "pb": 0, "pcf": 1, "peak": [2, 4, 5, 7], "pedro": [0, 2, 8], "peer": 0, "pelicun3": 7, "penetr": 5, "per": 7, "percentag": 2, "perform": [2, 4, 5, 6], "perhap": 1, "period": [0, 2, 3, 4], "periodst": 2, "personnel": 0, "pga": 5, "pgam7": 5, "phenomenon": [3, 5], "phi": 6, "physic": 3, "pi": 2, "pip": 7, "place": [0, 3, 4], "plan": 2, "plot": [0, 1, 2, 3, 4, 5, 6], "plot_acc": 2, "plot_fft": 2, "plot_spectra": 2, "plot_tf": 2, "plt": 2, "pm4sand": 4, "point": [0, 3, 4, 5, 6, 7], "popul": [2, 5, 7], "pore": 4, "portal": 6, "pose": 5, "posit": 2, "possess": 7, "possibl": [2, 5, 7], "post": 2, "postprocess": 2, "potenti": [1, 2, 5, 7], "power": [2, 7], "pr": 7, "practic": [0, 5], "pre": 5, "preconsolid": 1, "predict": [1, 2, 5, 6], "predictor": 5, "predomin": 4, "preliminarli": 6, "prepar": [0, 1, 2, 3, 4, 5, 6, 7], "prepared": 7, "prescrib": 5, "presenc": 2, "present": [0, 4, 5], "press": [0, 3, 4, 6], "pressur": [1, 4], "previou": 0, "prieta": 4, "print": 2, "prior": 5, "prj": 7, "probabl": [2, 5], "problem": [1, 8], "procedur": 2, "process": [0, 2], "processor": 7, "produc": [2, 3, 7], "product": 7, "prof": 2, "professor": 2, "profil": 4, "program": [0, 1, 3, 4, 6], "project": [0, 5, 8], "promis": 5, "propag": [2, 3, 4, 8], "properti": [0, 2, 3, 4, 6, 7], "propos": [5, 6, 7], "provid": [0, 2, 5, 6, 7, 8], "proxi": 5, "psa": 2, "psat": 2, "psf": 1, "public": [0, 1, 2, 3, 4, 5, 6, 7], "publish": 0, "puerto": [0, 1, 2, 3, 4, 5, 6, 7], "push": [0, 3, 4, 7], "pw": 7, "py": 7, "pyplot": 2, "python": [0, 1, 5, 7], "qfft": 2, "qgi": [6, 7], "qoufem": 1, "qualit": 7, "quantif": [1, 2], "quantifi": [1, 2], "quantiti": 1, "quarter": 2, "que": 1, "queri": 7, "quickli": [2, 5], "quofem": 8, "r": [0, 1, 2, 3, 4, 5, 6, 7], "r2d": 8, "rain": 7, "randal": 6, "random": [1, 2], "rang": [2, 5], "rapid": [0, 1, 2, 3, 4, 5, 6, 7], "rashidian": [0, 1, 2, 3, 4, 5, 6, 7], "raster": [5, 6, 7], "ratio": [1, 2, 4, 7], "ratioa": 2, "ratiov": 2, "rb20": [0, 1, 2, 3, 4, 5, 6, 7], "rdv": 1, "re": 7, "read": [0, 1, 2, 3], "read_gm": 2, "reader": 0, "real": [2, 5], "realiti": 1, "realli": 2, "receiv": 5, "recent": 7, "recognit": 7, "recommpress": 1, "record": [2, 4], "recoveri": 7, "reduc": [1, 5], "ref": 7, "refer": 8, "refin": 5, "reflect": [0, 2], "regard": [0, 1, 3, 4, 6], "region": [0, 1, 2, 3, 4, 5, 6, 7], "regress": 5, "relat": 0, "relationship": [2, 5], "relev": [0, 3, 4, 6, 7], "reli": 2, "reliabl": [2, 5], "remark": 8, "rememb": 1, "remot": 5, "remov": [0, 3, 4, 5, 6], "repair": 7, "report": [0, 1], "repositori": 7, "repres": [2, 5], "requir": [0, 2, 5, 7], "research": [0, 2, 7, 8], "reserv": 2, "reset": [0, 3, 4, 5, 6], "resili": [0, 1, 2, 3, 4, 5, 6, 7], "resist": 2, "resolut": 5, "reson": [2, 3], "resourc": 8, "resp_spectra": 2, "respect": 7, "respond": 5, "respons": [0, 1, 2, 5, 6, 7, 8], "respspectra": 2, "result": [0, 1, 3, 4, 6, 8], "retain": 5, "retriev": 7, "return": 2, "reveal": 1, "revis": 0, "revolut": [0, 3, 4], "rey": 8, "ri": 2, "rico": [0, 1, 2, 3, 4, 5, 6, 7], "right": [1, 2, 5, 7], "rigid": 2, "risk": [2, 6, 7], "rock": [2, 4], "role": 0, "roof": 7, "rough": 5, "rout": 5, "row": [0, 3, 4, 6], "ruleset": 7, "run": [0, 1, 2, 3, 4, 5, 6, 7], "rv": [1, 2, 7], "s2": 2, "s3hark": 8, "saf73": [0, 1, 2, 3, 4, 5, 6, 7], "safe": 1, "safer": 6, "safeti": [2, 6], "saffir": [0, 1, 2, 3, 4, 5, 6, 7], "same": [0, 1, 3, 4], "sampl": [1, 2, 7], "sample_freq": 2, "san": 4, "sand": 4, "sang": 2, "sanger": [0, 1, 2, 3, 4, 6, 7, 8], "satish": 2, "save": [1, 2], "sc": [0, 1, 2, 3, 4, 5, 6, 7, 8], "scale": [0, 3, 4, 5, 6, 7], "scarc": 7, "scatterplot": 1, "scenario": [0, 1, 2, 3, 4, 5, 6, 7], "scienc": 6, "scipi": 2, "screen": [0, 3, 4, 6], "script": [1, 7], "scroll": [0, 3, 4, 5, 6], "seattl": 6, "sec": [1, 2], "second": [1, 2], "section": [0, 1], "see": [1, 2, 6, 7], "seed": [1, 2], "seen": 2, "seismic": 4, "seismolog": [0, 1, 2, 3, 4, 5, 6, 7], "select": [0, 1, 2, 3, 4, 6, 7], "selelct": 1, "self": [0, 2, 3, 4, 6], "sens": 5, "sensit": 8, "septemb": 7, "seri": [2, 3, 8], "set": [1, 7], "set_freq": 2, "set_tim": 2, "settlement": 8, "sever": [5, 7], "sgm24": [0, 1, 2, 3, 4, 5, 6, 7], "sh": 4, "shake": 5, "shape": 2, "shear": [2, 4], "short": 0, "shortcom": 5, "should": [0, 1, 2, 7], "show": [0, 1, 2, 4, 7], "shown": [2, 4, 5], "signal": [2, 3], "signific": [0, 2, 7], "significantli": [0, 3, 4, 5, 6], "sim": 2, "simcenteruq": 1, "similar": [0, 2, 3, 4, 6], "simpl": 2, "simpli": 1, "simplifi": [2, 4], "simpson": 7, "simul": [0, 2], "sin": [2, 6], "sin_record": 2, "sinc": 2, "singl": [1, 2, 5], "sinusoid": 2, "site": [1, 2, 7, 8], "situ": [1, 5], "situat": [2, 4], "six": [0, 3, 4], "size": [0, 3, 4, 6], "skew": 2, "skx": 7, "skylak": 7, "slope": [4, 6], "slow": [0, 3, 4, 5, 6], "small": [0, 3, 4, 5, 6], "so": [0, 2, 3, 4, 5, 6], "societi": [0, 1, 2, 3, 4, 5, 6, 7], "soft": 2, "softwar": [0, 7], "soil": [0, 3, 4, 5], "soiltf": 2, "solut": 8, "solv": [0, 5], "some": 1, "somewhat": 3, "soruc": 7, "sourc": 7, "sp": 7, "space": 2, "spatial": [2, 7], "specif": [1, 2, 5, 6], "specifi": [0, 1, 3, 4, 7], "spectra": 2, "spectral": 2, "spectrum": 2, "speed": [0, 3, 4, 5, 6, 7], "sphinx": 0, "spring": [2, 3], "stampede2": 7, "standard": [1, 2, 7], "state": 5, "static": 6, "statist": 1, "std_repaircost_loss_ratio": 7, "step": [0, 1, 3, 4, 5, 6, 7], "stiff": [2, 5], "store": [5, 7], "stori": 2, "storm": [0, 1, 2, 3, 4, 5, 6, 7], "strain": [0, 3, 4, 6], "strata": 4, "strategi": 8, "stratigraphi": 2, "street": 7, "strength": 5, "stress": [0, 2, 3, 4, 6], "strong": [1, 7], "struck": 7, "structur": [0, 2, 5, 7], "student": [0, 8], "studi": [3, 5, 6, 7], "subject": 4, "subpopul": 2, "substanti": 5, "subsurfac": 5, "suffer": 7, "suggest": 7, "suit": [2, 5], "suitabl": 0, "summari": [0, 1, 5, 7], "supervis": 5, "support": [0, 7, 8], "suppress": 3, "sure": [0, 7], "surfac": [2, 4, 5], "surg": [0, 1, 2, 3, 4, 5, 6, 7], "sustain": 7, "sweep_record": 2, "system": [0, 2, 3, 4, 5], "t": [0, 2, 3, 4], "tab": [1, 2, 7], "tabl": [1, 8], "tai": [0, 4], "tailor": 0, "take": [0, 2, 3, 4], "taken": 0, "tan": 6, "target": [0, 3, 4, 5, 6], "task": [0, 7], "technic": 7, "technogologi": 7, "term": 3, "test": [1, 5], "text": [0, 5], "tf": [0, 2, 3, 4], "tf_tan": 2, "tf_tan1": 2, "tft": 2, "tfunctionclass": 2, "than": 5, "thank": 2, "thei": [0, 2, 3, 4, 5, 6, 7], "them": [2, 7], "theoret": 0, "theori": 1, "therebi": 5, "therefor": [5, 7], "thi": [0, 1, 2, 3, 4, 5, 6, 7, 8], "thick": 2, "thompson": [0, 1, 2, 3, 4, 5, 6, 7], "those": [2, 5], "though": [0, 3, 4, 5, 6], "three": [2, 5, 8], "through": [0, 2, 4, 8], "throughout": [1, 2, 5], "thu": [1, 5], "tigh": 7, "time": [0, 1, 2, 3, 4, 5, 6], "timeseri": 2, "timeseries_data": 2, "titl": [2, 7], "todoubl": 2, "togeth": [0, 3, 4, 5, 6], "toolbar": [0, 3, 4, 5, 6], "top": [0, 3, 4, 6], "topic": [0, 2], "topographi": 5, "train": 5, "trait": 5, "transfer": [0, 3, 4, 8], "transform": [0, 3, 4, 6], "translat": 1, "transport": 5, "travel": [0, 3, 4], "treasur": 4, "trend": 7, "triangular": [0, 3, 4, 5, 6], "tropic": 7, "true": 1, "try": 2, "tsname": 2, "twelv": [0, 3, 4], "two": [0, 3, 4, 5, 7, 8], "type": [0, 2, 3, 4, 5, 6, 7], "typic": [2, 7], "u": [1, 2, 6], "ui": 2, "ultim": [1, 6], "umax": 2, "uncertainti": [1, 5, 8], "under": [0, 3, 4, 5, 7, 8], "underli": 4, "underpredict": 1, "understand": [0, 2, 5, 6], "unexpect": 0, "unfamiliar": 0, "uniform": [1, 2], "unit": [1, 2, 6, 7], "univers": 8, "unknown": 1, "unlock": 5, "unstabl": [0, 3, 4, 6], "until": [0, 3, 4, 5, 6], "up": [0, 3, 4, 5, 6], "updat": [0, 1, 2, 3, 4, 5, 6, 7], "upload": 2, "uq": [0, 1, 7], "us": 8, "usa": 7, "usag": 3, "usastr": 7, "user": [0, 1, 2, 3], "usg": 6, "usual": 4, "util": [2, 4], "utim": 2, "uw": 2, "v": [0, 1, 2, 3, 4, 5, 6, 7], "v_": [0, 3, 4], "valu": [0, 1, 2, 3, 4, 5, 6], "vari": 4, "variabl": [1, 2, 5, 7], "variat": 1, "variou": [0, 1, 2, 3, 4, 6], "vast": 7, "ve": 2, "vector": 2, "velasquez": 7, "veloc": [0, 2, 3, 4], "vel\u00e1zquez": [0, 1, 2, 3, 4, 5, 6, 7], "veri": [0, 2, 3, 4, 7], "verifi": 7, "version": [0, 3, 4, 5, 6], "vertic": [0, 3, 4, 5, 6], "via": [0, 3, 4, 5, 6], "vibrat": [2, 3], "vicin": 5, "viequ": 7, "vieques_2": 7, "view": [0, 1, 3, 4, 6, 7], "viscou": 3, "visibl": 7, "visit": 2, "visual": [0, 3, 4, 5, 6, 7], "viz": 7, "vmax": 2, "void": 1, "vsstar": 2, "vulner": 5, "w": [0, 1, 2, 3, 4, 5, 6, 7], "wa": [0, 2, 4, 5, 6, 7], "wait": 1, "wall": 7, "want": 1, "washington": 8, "water": 5, "wave": [0, 2, 3, 4], "we": [0, 1, 2, 3, 4, 6], "weak": 7, "weaker": 1, "week": 0, "weight": [1, 6], "well": [0, 1, 2], "were": [5, 6, 7, 8], "wh": [0, 3, 4], "what": [2, 6], "when": [2, 3, 4, 5, 7], "where": [0, 1, 2, 3, 4, 6, 7], "wherea": 5, "which": [0, 1, 2, 3, 4, 5, 6, 7], "while": [0, 1, 2, 3, 4, 6], "who": 2, "wind": [0, 1, 2, 3, 4, 5, 6, 7], "window": [0, 3, 4, 6, 7], "within": [0, 1, 2, 3, 4, 7], "without": [0, 1, 2, 3, 4, 5, 6], "withstand": 5, "wood": 7, "word": 1, "work": [0, 1, 2], "workflow": 7, "worst": 2, "would": [2, 6, 7], "write": 0, "written": 0, "x": 1, "xlabel": 2, "y": 1, "year": [5, 7], "yearbuilt": 7, "yerba": 4, "yet": [0, 5], "yi": 2, "yield": 1, "ylabel": 2, "you": [0, 1, 3, 4, 5, 6, 7], "your": [0, 1, 3, 4, 7], "z": 6, "zbt17": [0, 1, 2, 3, 4, 5, 6, 7], "zero": [0, 2, 3, 4, 5, 6], "zhao": 2, "zhu": [0, 1, 2, 3, 4, 5, 6, 7], "zoom": 0}, "titles": ["Course Introduction", "quoFEM - Settlements", "EEUQ - Transfer Function and Uncertainty", "S3hark - Site Response 1", "S3hark - Site Response 2", "R2D - Liquefaction", "R2D - Landslides", "R2D - Hurricane Maria Damage and Losses", "Welcome to CESG 599 - NHERI - An Introduction to SimCenter tool and DesignSafe Infrastructure!"], "titleterms": {"1": [2, 3], "2": 4, "599": 8, "One": 1, "To": 6, "acknowledg": 8, "acosta": 7, "an": [0, 8], "analysi": 1, "angel": 6, "applic": [0, 1, 2, 3, 4, 5, 6, 7], "author": [0, 1, 2, 3, 5, 6, 7], "barreto": 3, "bayesian": 1, "build": 7, "calibr": 1, "cesg": 8, "cesg599": [0, 8], "content": 8, "continu": 6, "cours": 0, "damag": 7, "daniel": 7, "descript": [0, 1, 2, 3, 4, 5, 6, 7], "designsaf": [0, 8], "determinist": 1, "ee": 2, "eeuq": 2, "equat": 2, "erick": 2, "etc": 0, "exampl": [0, 1, 2, 3, 4, 5, 6, 7], "examplel": 0, "figur": 0, "forward": 1, "fourier": 2, "frequenc": 2, "function": 2, "guerrero": 6, "hoyo": 6, "hurrican": 7, "i": 8, "infrastructur": 8, "introduct": [0, 1, 2, 3, 4, 5, 6, 7, 8], "jose": 3, "kendra": 1, "landslid": 6, "learn": 0, "liquefact": 5, "list": 0, "loss": 7, "lui": 6, "maria": 7, "martinez": 2, "morgan": 5, "motion": 2, "mutch": 1, "natur": 2, "nheri": [0, 8], "object": 0, "paramet": 1, "pre": 2, "problem": [0, 2, 3, 4, 5, 6, 7], "profil": [1, 2], "project": 1, "propag": 1, "python": 2, "quofem": 1, "r2d": [5, 6, 7], "refer": [0, 7], "remark": [0, 1, 2, 3, 4, 5, 6, 7], "residenti": 7, "resourc": 0, "respons": [3, 4], "result": [2, 7], "rey": 7, "s3hark": [3, 4], "sanger": 5, "script": 2, "sensit": 1, "settlement": 1, "simcent": [0, 1, 2, 3, 4, 5, 6, 7, 8], "site": [3, 4], "soil": [1, 2], "solut": [0, 1, 2, 3, 4, 5, 6, 7], "state": 7, "strategi": [0, 1, 2, 3, 4, 5, 6, 7], "tabl": [0, 2], "three": 1, "titl": [0, 3, 4, 6], "tool": [0, 1, 2, 3, 4, 5, 6, 7, 8], "transfer": 2, "transform": 2, "two": 1, "uncertainti": 2, "uq": 2, "us": [0, 1, 2, 3, 4, 5, 6, 7], "welcom": 8, "what": 8, "workflow": 2}}) \ No newline at end of file