diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..eee3932 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,51 @@ +--- +name: Build Project + +on: + workflow_call: + pull_request: + branches: + - main + - master +jobs: + build: + name: Build Release + + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + include: + - os: ubuntu-latest + release_suffix: out + - os: windows-latest + release_suffix: exe + - os: macos-latest + release_suffix: out + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v2 + + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.0' + bundler-cache: true + + - name: Install Ceedling + run: gem install ceedling + + - name: Build Release + run: ceedling release + + + - name: Rename build binary + shell: pwsh + run: Move-Item -Path build/release/flowVC.out -Destination build/release/flowVC_${{ runner.os }}.${{ matrix.release_suffix}} + + - name: Upload Build Artifact + uses: actions/upload-artifact@v4 + with: + name: flowVC_${{ runner.os }} + path: build/release/flowVC_${{ runner.os }}.${{ matrix.release_suffix}} + overwrite: true diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml new file mode 100644 index 0000000..de9a28e --- /dev/null +++ b/.github/workflows/cd.yml @@ -0,0 +1,63 @@ +--- +name: CD + +on: + push: + branches: + - main + - master + + +jobs: + + run-tests: + uses: ./.github/workflows/ci.yml + + build-release: + uses: ./.github/workflows/build.yml + + semantic-release: + needs: [run-tests, build-release] + + if: "!contains(github.event.head_commit.message, '[skip ci]')" + + name: Semantic Release + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + persist-credentials: false + + - uses: actions/setup-node@v3 + with: + node-version: "lts/*" + + - name: Download Artifacts + uses: actions/download-artifact@v4 + + - name: Semantic Release + uses: cycjimmy/semantic-release-action@v4 + id: semantic # Need an `id` for output variables + with: + semantic_version: 17 + extra_plugins: | + @semantic-release/changelog@5 + @semantic-release/exec@5 + @semantic-release/git@9 + + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Do something when a new release published + if: steps.semantic.outputs.new_release_published == 'true' + run: | + echo ${{ steps.semantic.outputs.new_release_version }} + echo ${{ steps.semantic.outputs.new_release_major_version }} + echo ${{ steps.semantic.outputs.new_release_minor_version }} + echo ${{ steps.semantic.outputs.new_release_patch_version }} + echo ${{ steps.semantic.outputs.new_release_git_tag }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..e633fb3 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,56 @@ +--- +name: CI + +on: + # Manually triggered testing + workflow_dispatch: + + # Called from another work flow + workflow_call: + + pull_request: + branches: + - main + - master + push: + # Called from CD, prevents duplicate running + branches-ignore: + - main + - master + +jobs: + build: + name: Run Tests + + strategy: + matrix: + os: [ubuntu-latest, windows-latest, macos-latest] + include: + - os: ubuntu-latest + release_suffix: out + - os: windows-latest + release_suffix: exe + - os: macos-latest + release_suffix: out + runs-on: ${{ matrix.os }} + + steps: + - uses: actions/checkout@v2 + + - name: Setup Ruby + uses: ruby/setup-ruby@v1 + with: + ruby-version: '3.0' + bundler-cache: true + + - name: Install Ceedling + run: gem install ceedling + + - name: Run Tests + run: ceedling gcov:all + + - name: Upload Coverage Report to Codecov + uses: codecov/codecov-action@v5 + if: matrix.os == 'ubuntu-latest' + with: + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..126c248 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,30 @@ +name: Docs + +on: + push: + branches: + - main + - master + +permissions: + contents: write + +jobs: + publish: + runs-on: ubuntu-latest + steps: + - name: Check out + uses: actions/checkout@v4 + + - name: Install Emacs + run: sudo apt install emacs-nox --yes + + - name: Build the site + run: ./build.sh + working-directory: docs/ + + - name: Publish generated content to GitHub Pages + uses: JamesIves/github-pages-deploy-action@4.1.4 + with: + branch: docs + folder: docs/public/ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4ae392f --- /dev/null +++ b/.gitignore @@ -0,0 +1,69 @@ +# Prerequisites +*.d + +# Object files +*.o +*.ko +*.obj +*.elf + +# Linker output +*.ilk +*.map +*.exp + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su +*.idb +*.pdb + +# Kernel Module Compile Results +*.mod* +*.cmd +.tmp_versions/ +modules.order +Module.symvers +Mkfile.old +dkms.conf + +# Build directory +/build/ + + +# temp +*tmp* + +#settings file +settings_script_controlled.in + + +**ltximg** + +# packaged directory +.packages/ +/docs/public/ \ No newline at end of file diff --git a/.releaserc.json b/.releaserc.json new file mode 100644 index 0000000..5eab74b --- /dev/null +++ b/.releaserc.json @@ -0,0 +1,17 @@ +{ + "plugins": [ + "@semantic-release/commit-analyzer", + "@semantic-release/release-notes-generator", + "@semantic-release/changelog", + [ + "@semantic-release/github", + { + "assets": ["flowVC_Linux", "flowVC_Windows", "flowVC_macOS"] + } + ], + "@semantic-release/git" + ], + "branches": [ + "main" + ] +} diff --git a/.releaserc.prerelease.json b/.releaserc.prerelease.json new file mode 100644 index 0000000..f4c43ac --- /dev/null +++ b/.releaserc.prerelease.json @@ -0,0 +1,18 @@ +{ + "plugins": [ + "@semantic-release/commit-analyzer", + "@semantic-release/release-notes-generator", + "@semantic-release/changelog", + [ + "@semantic-release/github", + { + "assets": ["build/release/flowVC.out"] + } + ], + "@semantic-release/git" + ], + "branches": [ + "main", + "alpha" + ] +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..9a2b9ff --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,69 @@ +## [0.0.8](https://github.com/bkm82/flowVC/compare/v0.0.7...v0.0.8) (2025-02-12) + + +### Bug Fixes + +* Update README.org and tagging with fix to force a deployment ([f9e1fb5](https://github.com/bkm82/flowVC/commit/f9e1fb583f7751d32c31f915d9a100e2408ad337)) + +## [0.0.7](https://github.com/bkm82/flowVC/compare/v0.0.6...v0.0.7) (2025-02-11) + + +### Bug Fixes + +* Add OS identifier to build artifact names for uniqueness. ([fe67c3c](https://github.com/bkm82/flowVC/commit/fe67c3c624b109c075165a3383cf1fd795105ba3)) + +## [0.0.6](https://github.com/bkm82/flowVC/compare/v0.0.5...v0.0.6) (2025-02-11) + + +### Bug Fixes + +* fix yaml formating ([fee167f](https://github.com/bkm82/flowVC/commit/fee167fa6fe60b5c8337dd351bce69e61302d19d)) + +## [0.0.5](https://github.com/bkm82/flowVC/compare/v0.0.4...v0.0.5) (2025-02-11) + + +### Bug Fixes + +* update ReMapPt function call correcting pointer type for MP#.X ([f001d52](https://github.com/bkm82/flowVC/commit/f001d520ec23b189d8c1bfa1734abe12a4d351b5)) + +## [0.0.4](https://github.com/bkm82/flowVC/compare/v0.0.3...v0.0.4) (2025-02-08) + + +### Bug Fixes + +* remove token and use default ([#18](https://github.com/bkm82/flowVC/issues/18)) ([21b8c7f](https://github.com/bkm82/flowVC/commit/21b8c7fc8386f10d3a87d1f93acc3c16d1d025df)) + +## [0.0.4](https://github.com/bkm82/flowVC/compare/v0.0.3...v0.0.4) (2025-02-08) + + +### Bug Fixes + +* remove token and use default ([#18](https://github.com/bkm82/flowVC/issues/18)) ([21b8c7f](https://github.com/bkm82/flowVC/commit/21b8c7fc8386f10d3a87d1f93acc3c16d1d025df)) + +## [0.0.4](https://github.com/bkm82/flowVC/compare/v0.0.3...v0.0.4) (2025-02-08) + + +### Bug Fixes + +* remove token and use default ([#18](https://github.com/bkm82/flowVC/issues/18)) ([21b8c7f](https://github.com/bkm82/flowVC/commit/21b8c7fc8386f10d3a87d1f93acc3c16d1d025df)) + +## [0.0.3](https://github.com/bkm82/flowVC/compare/v0.0.2...v0.0.3) (2025-02-07) + + +### Bug Fixes + +* **devtools:** Try another gh action build ([#15](https://github.com/bkm82/flowVC/issues/15)) ([3fae177](https://github.com/bkm82/flowVC/commit/3fae1776860b9ba8ee9ab7bf5ad1df0bfcf9d7d2)) + +## [0.0.2](https://github.com/bkm82/flowVC/compare/v0.0.1...v0.0.2) (2025-02-07) + + +### Bug Fixes + +* **devtools:** Try fix the adding artifacts to a release ([#14](https://github.com/bkm82/flowVC/issues/14)) ([871f697](https://github.com/bkm82/flowVC/commit/871f69746e427c45bc797b70bf80475aeb4cb91d)) + +## [0.0.1](https://github.com/bkm82/flowVC/compare/v0.0.0...v0.0.1) (2025-02-07) + + +### Bug Fixes + +* **devtools:** Update release github actions to try update version ([#12](https://github.com/bkm82/flowVC/issues/12)) ([56f0f0c](https://github.com/bkm82/flowVC/commit/56f0f0c8374509bf1942198261db2b6a8cf5d6c0)) diff --git a/README.md b/README.md deleted file mode 100644 index 76794b1..0000000 --- a/README.md +++ /dev/null @@ -1,14 +0,0 @@ -flowVC -====== - -Flow Visualization Code - -Copyright 2013 Shadden Research Group. All rights reserved. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.org b/README.org new file mode 100644 index 0000000..9f49444 --- /dev/null +++ b/README.org @@ -0,0 +1,177 @@ +* flowVC + + +[[../../actions][../../workflows/CI/badge.svg]] +[[../../actions][../../workflows/CD/badge.svg]] +[[../../actions][../../workflows/Docs/badge.svg]] + + +Flow Visualization Code forked from FlowPhysics/flowVC + +#+begin_quote +[!TIP] +Check out the [[https://FlowPhysics.github.io/flowVC/][Docs]] +#+end_quote + +Copyright 2013 Shadden Research Group. All rights reserved. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +** Capabilities +flowVC is capable of reading in 2D or 3D velocity data and + +- Computing Finite Time Lyoponove Exponent (FTLE) fields +- Computing tracer/partile tragectories +- Interpolating the velocity onto another mesh + +#+begin_quote +[!Note] +You cannot compute FTLE and particle trajectories at the same time. The feature to interpolate velocity data onto another mesh is mainly useful to check if the program is reading in and interpolating your velocity data correctly. The velocity data must be defined on a Cartesian OR tetrahedral (3D) / triangular (2D) mesh. +#+end_quote + + +** Usage +*** Quick Start +**** Download or Build the Latest Verison of flowVC + + #+begin_quote + [!Note] + Grab a pre-compiled binary for Windows Linux or macOS [[../../releases/latest][here]] + Alternatly build it from source as shown below + #+end_quote + +**** Create the input data files + #+begin_quote + [!Note] + For the Input Data Files Format reference the [[https://FlowPhysics.github.io/flowVC/][Docs]] + #+end_quote + + #+begin_quote + [!TIP] + For 3d Tetrahedral Data, the vtu_2bin in [[https://github.com/bkm82/flowVC-utils][flowVC-utils]] might be helpful! + #+end_quote + +**** Create a settings.in file. + #+begin_quote + [!TIP] + [[./examples/inputfile.in][Example Input File]] + #+end_quote + + +**** Run the code from the command line +#+begin_src shell +./flowvc.out settings_file.in +#+end_src + +**** Report any Issues +[[../../issues][Issues]] + +** Installation + +*** Build From Source +If you want to edit / modify the code, there are various ways to compile the code from source. + +**** Ceedling + +#+begin_quote +[!Note] +[[https://github.com/ThrowTheSwitch/Ceedling][Ceedling]] is a test-centered build system for C. It is how we test and build the release versions. It bundles some tools (Unity, CMock) together and provides a testing interface. +#+end_quote + +***** Dependencies +[[https://www.ruby-lang.org/en/][Ruby]] > v 3.0: A programing language used for Ceedling + +[[https://github.com/ThrowTheSwitch/Ceedling][Ceedling]]: Ceedling is a Test-Centered Build System for C. It utilizes a collection of tools for testing (Unity) and mocking (CMock) + +***** Instalation +****** Install [[https://www.ruby-lang.org/en/][Ruby]] by refering to the ruby documentation for your operating system. + +****** Install Ceedling gem from the RubyGems repository + #+begin_src shell + gem install ceedling + #+end_src + +****** Clone the repository + #+begin_src shell + git clone + cd flowVC + #+end_src +****** To compile and run all of the tests, run + #+begin_src shell + ceedling test:all + #+end_src +****** To build the relese run + + #+begin_src shell + ceedling release + #+end_src + + this will create the executable in the ./build/release/flowVC.out path. + +**** Docker +Alternatly, there is a docker image has the tooling installed. + #+begin_quote + [!Warning] + The method shown here should work, but i havent tested it extensivly. + #+end_quote + +***** Install [[https://docs.docker.com/engine/install/][Docker]] +***** Clone the repository + #+begin_src shell + git clone + cd flowVC + #+end_src + +***** Pull the docker image from docker hub [[https://hub.docker.com/r/throwtheswitch/madsciencelab][madsciencelab]] + #+begin_src shell + docker pull throwtheswitch/madsciencelab:latest + #+end_src +***** Run the tests: if you are in the flowVC directory + #+begin_src shell + docker run -it --rm -v :/home/dev/project throwtheswitch/madsciencelab:latest + ceedling test:all + #+end_src + + #+begin_quote + [!Note] + If you are in the flowVC directory, you can replace the with a "." (without the quotes) + #+end_quote +***** Build the executable + #+begin_src shell + docker run -it --rm -v :/home/dev/project throwtheswitch/madsciencelab:latest + ceedling release + #+end_src +***** This will create the ./build/release/flowVC.out executable. + + #+begin_src shell + docker run -it --rm -v .:/home/dev/project throwtheswitch/madsciencelab:latest + .build/release/flowVC.out + #+end_src + + +**** Make +The third option is to compile the source code using the provided Make file, however this file is not currently part of the CI/CD. Issues or contributions are welcome! + +** Contributing +Contributions or fixes to issues are welcome. + + +*** Semantic Versioning: +This project intends to use a Trunk-Based Release with semantic versioning. Commit messages should follow [[https://www.conventionalcommits.org/en/v1.0.0/][conventional commits]] +#+begin_src shell +[optional scope]: +#+end_src + +Where the type determines the version updates. + +Valid types are fix, feat, BREAKING CHANGE, build, chore, ci, docs, style, refactor, perf, test + + +*** Planned Updates + diff --git a/docs/build-site.el b/docs/build-site.el new file mode 100644 index 0000000..baa273c --- /dev/null +++ b/docs/build-site.el @@ -0,0 +1,53 @@ +;; Set the package installation directory so that packages aren't stored in the +;; ~/.emacs.d/elpa path. +(require 'package) +(setq package-user-dir (expand-file-name "./.packages")) +(setq package-archives '(("melpa" . "https://melpa.org/packages/") + ("elpa" . "https://elpa.gnu.org/packages/"))) + +;; Initialize the package system +(package-initialize) +(unless package-archive-contents + (package-refresh-contents)) + +;; Install dependencies +(package-install 'htmlize) + +;; Load the publishing system +(require 'ox-publish) + +;; Define the publishing project +(setq org-publish-project-alist + (list + '("my-org-site" + :recursive t + :base-directory "./content" + :publishing-directory "./public" + :base-extension "org" + :publishing-function org-html-publish-to-html + :with-author nil ;; Don't include author name + :with-creator t ;; Emacs and Org versions in footer + + :with-toc t ;; Include a table of contents + :section-numbers nil ;; Don't include section numbers + :time-stamp-file nil ;; Don't include time stamp in file + ) + '("org-static" + :base-directory "./content" + :base-extension "css\\|js\\|png\\|jpg\\|gif\\|pdf\\|mp3\\|ogg\\|swf" + :publishing-directory "./public" + :recursive t + :publishing-function org-publish-attachment + ) + )) +;; Remove validate ling at bottom +(setq org-html-validation-link nil ;; Dont show validation link + org-html-head-include-scripts nil ;; Use our own scripts + org-html-head-include-default-style nil) ;; Use our own styles + ;;org-html-head "") + ;;org-html-head "") +;; Generate the site output +(org-publish-all t) + + +(message "Build complete!") diff --git a/docs/build.sh b/docs/build.sh new file mode 100755 index 0000000..b2ca9cb --- /dev/null +++ b/docs/build.sh @@ -0,0 +1,3 @@ +#!/bin/sh +SCRIPT_DIR="$(dirname "$(realpath "$0")")" +emacs -Q --script $SCRIPT_DIR/build-site.el diff --git a/docs/content/FTLE_example.org b/docs/content/FTLE_example.org new file mode 100644 index 0000000..60bfaaa --- /dev/null +++ b/docs/content/FTLE_example.org @@ -0,0 +1,353 @@ +#+SETUPFILE: ../org-themes/theme-readtheorg.setup +#+INCLUDE: "./header.org" +* Input File + +#+begin_src shell :tangle ../../examples/inputfile.in + +################################# flowVC INPUT FILE ##################################### +# +# NOTE: Order of parameters listed must be maintained for proper parsing of input file +# Comment lines begin with #, comments can be added or removed as desired +# Comments cannot occur on lines containing variable declartations +# Standard format: VARIABLE_NAME = VALUE +# +####################################################################################### + +# Path_Data: String, Directory containing data files, e.g. velocity data, etc. +# Can be set to pwd (i.e. present working directory) +Path_Data = ../bin/ + +# Path_Output: String, Directory where output files will be written +# Can be set to pwd (i.e. present working directory) +Path_Output = ../output/ + +# Dimensions: Integer, Specifies if velocity data is 2D or 3D +Dimensions = 2 + +# Data_MeshType: Integer, Specifies mesh type of velocity data +# 0: Cartesian +# You will need files Data_InFilePrefix_vel.*.bin and Data_InFilePrefix_Cartesian.bin +# 1: Unstructured (tetrahedral for 3D and triangular for 2D) +# You will need files Data_InFilePrefix_vel.*.bin and Data_InFilePrefix_coordinates.bin, +# Data_InFilePrefix_connectivity.bin and Data_InFilePrefix_adjacency.bin +Data_MeshType = 0 + +# Data_InFilePrefix: String, common prefix for input velocity files (see minimum files needed above) +Data_InFilePrefix = dg + +# Data_SuffixTMin: Integer, number appended to the name of first velocity data file +# Assumes naming convention of Data_InFilePrefix_vel.N.bin, where Data_InFilePrefix is +# specified above and N varies from Data_SuffixTMin to (Data_SuffixTMin + Data_SuffixTDelta * Data_SuffixTRes) +Data_SuffixTMin = 0 + +# Data_SuffixTDelta: Integer, Increment between successive velocity data files +Data_SuffixTDelta = 1 + +# Data_SuffixTRes: Integer, number of velocity data files +Data_TRes = 51 + +# Data_TDelta: (Positive) Float, actual time spacing between successive velocity data files +# Assumes time spacing between velocity data files is constant +Data_TDelta = 0.02 + +# Data_TMin: Float, actual time assigned to first velocity data file +# Choice is arbitrary, but it usually makes sense to set this to 0.0, which would +# imply that the first velocity data file specifies the velocity at time 0.0 +Data_TMin = 0.0 + +# Data_TPeriodic: Binary flag, Specifies if data is periodic in time +# 0: Not periodic +# 1: Periodic (make sure first and last data file correspond to same point in cycle) +Data_TPeriodic = 1 + +# Data_XPeriodic: Binary flag, Specifies if data is periodic in space +# 0: Not periodic +# 1: Periodic +Data_XPeriodic = 0 + +# Data_MeshBounds.XMin, ..., Data_MeshBounds.ZMax: Specifies bounding box of velocity data +# Setting these bounds LARGER than the actual velocity domain will NOT affect the results +# Setting these bounds SMALLER than the actual velocity domain WILL limit the velocity data considered +Data_MeshBounds.XMin = 0.0 +Data_MeshBounds.XMax = 2.0 +Data_MeshBounds.YMin = 0.0 +Data_MeshBounds.YMax = 1.0 +Data_MeshBounds.ZMin = 0.0 +Data_MeshBounds.ZMax = 0.0 + +# Fluid_Density: Float, specifies fluid density (use consistent units) +# Valid only if Particle_Radius > 0 +Fluid_Density = 1.0 + +# Fluid_Viscosity: Float, specifies fluid viscosity (use consistent units) +# Valid only if Particle_Radius > 0 +Fluid_Viscosity = 1.0 + +# Output_TStart: Float, initial time to start simulation and begin writing output +# If FTLE_Compute = 1: Specifies time at which first FTLE field is computed AND output +# If Trace_Compute = 1: Specifies start time to begin computing tracer trajectories AND outputting positions to file +Output_TStart = 0.0 + +# Output_TRes: (Positive) Integer, Number of output times +# If FTLE_Compute: Specifies number of time instances when the FTLE field will be computed AND output +# If Trace_Compute: Specifies number of time instances that tracer positions will be output to file +Output_TRes = 11 + +# Output_TDelta: (Positive) Float, Time between successive output +# If FTLE_Compute: How often the FTLE field will be computed AND output +# If Trace_Compute: How often the tracer positions will be output to file +Output_TDelta = 0.1 + +# Int_Type: Integer, specified integration routine used +# 0: Euler +# 1: 4th order Runge Kutta +# 2: Runge Kutta Fehlberg (adaptive time stepping) +Int_Type = 1 + +# Int_TimeStep: (Positive) Float, Time step used for integration Euler or RK4 routines (i.e. Int_Type = 0 or 1) +# Valid only for Int_Type = 0 or 1 +Int_TimeStep = 0.001 + +# Int_Accuracy: (Positive) Float, Absolute error tolorance (between RK4 and RK5) +# Valid only for Int_Type = 2 +Int_Accuracy = 0.001 + +# Int_MinTimeStep: (Positive) Float, Minimum allowable time step used in RKF routine +# Once this time step is reached, RK4 approximation automatically accepted +# Valid only for Int_Type = 2 +Int_MinTimeStep = 0.00001 + +# Int_MaxTimeStep: (Positive) Float, Maximum allowable time step used in RKF routine +# Time step will not be increased beyond this limit even if error between RK4 and RK5 is less than Int_Accuracy +# Valid only for Int_Type = 2 +Int_MaxTimeStep = 0.1 + +# Int_TimeDirection: Integer, Should be set to 1 or -1 +# 1: Advect particles forward in time +# -1: Advect particles backward in time (used to compute backward time FTLE field) +Int_TimeDirection = 1 + +# Int_NormalFlow: Binary flag +# 0: Do not impose inward flow on no-slip boundaries +# 1: Replace no-slip condition on boundaries with inward velocity (magnitude specified by NormalFlowScaling below) +# Requires the file Data_InFilePrefix_normals.bin generated from program GetNormals.exe +# Currently valid only for Data_MeshType = 1 +Int_NormalFlow = 0 + +# Int_NormalFlowScaling: Float, Scaling for inward pointing boundary velocity (to prevent tracers from crossing +# no-slip boundaries), Need to set the number negative if file contains outward normals +# Valid only for Data_MeshType = 1, Int_NormalFlow = 1 +Int_NormalFlowScaling = 1.0 + +# Int_Extrapolate: Integer, allows particles to be integrated outside of domain of data by extrapolation of data set +# 0: End integration once particle leaves domain (or subset defined by Data_MeshBounds above). +# Computes FTLE for such points (and neighbors) early. +# 1: Extrapolate velocity outside domain by continuing particle with exit velocity (usually better than below) +# 2: Linear extrapolation of entire data set (NOT recommended unless you know what you're doing) +Int_Extrapolate = 0 + +# Particle_Radius: Float, Radius of all things treated as Lagrangian points +# Set to zero if you want points to behave as perfect tracers (recommended unless you know what you're doing) +Particle_Radius = 0.0 + +# Particle_Density: Float, Mass density of all things treated as Lagrangian points +# Respectively, set =, >, or < fluid density for neutrally buoyant, aerosols, or bubbles +# Only valid if Particle_Radius > 0 +Particle_Density = 1.0 + +# Particle_ICType: Int, Specified type of initial condition assigned to particles +# 0: Start particles from rest +# 1: Start particles with velocity equal to fluid velocity at particle release location (recommended) +# Valid only if Particle_Radius > 0 +Particle_ICType = 1 + +# Gravity_Vector[i]: Floats, Specifies components of gravity vector (use consistent units) +# Valid only if Particle_Radius > 0 +Gravity_Vector[0] = 0.0 +Gravity_Vector[1] = 0.0 +Gravity_Vector[2] = 0.0 + +# Local_Search_Checking: Binary flag +# 0: Only use local search protocol to determine elements containing initial location of points +# where velocity will need to be interpolated (recommended) +# 1: Use global search to check failures of local search protocol (safest, but can be painfully slow +# if you're not careful) +# Valid only if Data_MeshType = 1 +LocalSearchChecking = 0 + +# FTLE_Compute: Binary flag +# 0: Do not compute FTLE fields +# 1: Compute FTLE fields (Trace_Compute MUST be 0) +FTLE_Compute = 1 + +# FTLE_GenerateMesh: Binary flag +# 0: Read in FTLE mesh data from file FTLE_ICFile (this file created by running flowVC with FTLE_GenerateMesh = 1) +# 1: Generate a Cartesian mesh over which FTLE will be computed (mesh parameters specified below, resulting data +# saved to file FTLE_ICFile) +# Valid only if FTLE_Compute = 1 +FTLE_GenerateMesh = 1 + +# FTLE_ICFile: String, Name of file storing FTLE mesh information +# If FTLE_GenerateMesh = 0, this file should be located in Path_Work directory +# If FTLE_GenerateMesh = 0, this file will be written to Path_Work directory +# Valid only if FTLE_Compute = 1 +FTLE_ICFile = dg_FTLEgrid + +# FTLE_MeshBounds.XMin, ..., FTLE_MeshBounds.ZRes: Specifies structured grid over which FTLE is computed +# Valid only if FTLE_Compute = 1 +FTLE_MeshBounds.XMin = 0.0 +FTLE_MeshBounds.XMax = 2.0 +FTLE_MeshBounds.YMin = 0.0 +FTLE_MeshBounds.YMax = 1.0 +FTLE_MeshBounds.ZMin = 0.0 +FTLE_MeshBounds.ZMax = 0.0 +FTLE_MeshBounds.XRes = 201 +FTLE_MeshBounds.YRes = 101 +FTLE_MeshBounds.ZRes = 1 + +# FTLE_IntTLength: (Positive) Float, Integration time used to compute FTLE +# Valid only if FTLE_Compute = 1 +FTLE_IntTLength = 1.0 + +# FTLE_ComputeVariation: Binary flag, Used to help determine appropriate integration time by ah hoc means +# 0: Compute FTLE at each output time with integration time set to FTLE_IntTimeLength (nominally, can be reduced when a tracer leaves early) +# 1: Compute variation of FTLE with integration time +# Output_TRes MUST be 1 if FTLE_ComputeVariation = 1 +# Valid only if FTLE_Compute = 1 +FTLE_ComputeVariation = 0 + +# FTLE_VariationOutFreq: (Positive) Integer, controls how often FTLE is output when computing variation of FTLE with +# integration time +# If set to 1, output is generated at every time instance that velocity data is defined, if set to, e.g., 5, then output +# is generated at 1/5 of that rate (i.e. every 5 velocity data frames) +# Valid only if FTLE_ComputeVariation = 1 +FTLE_VariationOutFreq = 1 + +# FTLE_OutFilePrefix: String, Filename prefix where FTLE output data is written +# A separate file is generated for each output time (e.g. dg_forFTLE.0.bin, ..., dg_forFTLE.10.bin if Output_TRes = 11) +# NOTE: Two types of output files are generated, one set with the 1/T scaling in the definition of FTLE (*_noT.bin files), and ones with the scaling +# Valid only if FTLE_Compute = 1 +FTLE_OutFilePrefix = dg_forwardFTLE + + +# Trace_Compute: Binary flag +# 0: Do not compute tracer trajectories +# 1: Compute tracer trajectories (FTLE_Compute MUST be 0) +Trace_Compute = 0 + +Trace_ReleaseStrategy = 0 +Trace_ReleaseTMax = 0.000755 + + +# Trace_GenerateMesh: Binary Flag +# 0: Read in tracer initial positions from a file (specified by Trace_InFile) +# 1: Generate a Cartesian grid of tracers to integrate (mesh parameters specified below) +# Valid only if Trace_Compute = 1 +Trace_GenerateMesh = 1 + +# Trace_InFile: String, Name of File containing tracer initial positions +# Valid only if Trace_Compute = 1 and Trace_GenerateMesh = 0 +Trace_InFile = tracer_grid.bin + +# Trace_MultipleInFiles: Binary Flag +# 0: Default +# 1: Tracer initial conditions change over time and are specified by multiple files +Trace_MultipleInFiles = 0 + +# Trace_InFileFormat: Integer, specifies format of Trace_InFile +# 0: Use this if you want to reuse the .IC file that is generated from flowVC (use with care) +# 1: ASCII file, first line lists the number of tracers and subsequent lines list the x,y,z coordinates +# 2: ASCII legacy VTK polydata mesh format +# 3: ASCII legacy VTK unstructured mesh format +# 4: Binary file, first entry (int) lists the number of tracers and subsequent entries (doubles) list the x,y,z coordinates (binary version of format 1) +# Valid only if Compute_Tracers = 1 and Trace_GenerateMesh = 0 +Trace_InFileFormat = 4 + +# Trace_OutFile: String, Prefix for files where tracer position data will be written +# Tracer positions written to separate files for each output time +# Valid only if Trace_Compute = 1 +Trace_OutFilePrefix = dg_tracer-positions + +# Trace_NumLaunchTimes: (Positive) Integer, Number of times to release tracers from initial positions +# If Trace_MultipleInFiles = 1, then this should be number of files +# Valid only if Trace_Compute = 1 +Trace_NumLaunchTimes = 1 + +# Trace_LaunchTimeSpacing: (Positive) Float, Time between successive release of tracers from initial positions +# Valid only if Trace_Compute = 1 and Trace_NumLaunchTimes > 1 +Trace_LaunchTimeSpacing = 0.1 + +# Trace_IntTLength: (Positive) Float, Can be used to limit amount of time any tracer will be integrated +# Recommended to set this to some value larger than (Output_TRes x Output_TDelta) unless you know what you're doing +# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 0 +Trace_IntTLength = 100 + +# Trace_AlwaysOutput: Binary Flag +# 0: Do not write out tracer position to file once it has left the domain +# 1: Always write out tracer position to file, even if it left the domain +# Valid only if Trace_Compute = 1 +Trace_AlwaysOutput = 0 + +# Trace_CartMesh.XMin, ..., Trace_CartMesh.ZRes: Specifies Cartesian mesh of tracers to be intergrated +# Valid only if Trace_Compute = 1 AND Trace_GenerateMesh = 1 +Trace_CartMesh.XMin = 0.0 +Trace_CartMesh.XMax = 2.0 +Trace_CartMesh.YMin = 0.0 +Trace_CartMesh.YMax = 0.1 +Trace_CartMesh.ZMin = 0.0 +Trace_CartMesh.ZMax = 0.0 +Trace_CartMesh.XRes = 201 +Trace_CartMesh.YRes = 101 +Trace_CartMesh.ZRes = 1 + +# TODO Fill in this documentation +# These are required but their functionality is not +Trace_VorticityCompute = 0 +Trace_APCompute = 0 +Trace_CETCompute = 0 +Trace_CETAuxillaryMesh = 0 +Trace_CETMeshPrefix = specified +Trace_CETSubsteps = 0 +Trace_RTCompute = 0 +Trace_RTOutFilePrefix = dg_tracer-rt + +# VelOut_Compute: Binary flag, Used to generate interpolated velocity fields +# 0: Do not generate interpolated velocity fields +# 1: Generate interploated velocity fields +VelOut_Compute = 0 + +# VelOut_GenerateMesh: Binary flag +# 0: Read interpolation locations from file specified by VelOut_InFile +# 1: Generate a Cartesian mesh of positions where velocity will be interpolated (mesh parameters specified below) +# Valid only for VelOut_Compute = 1 +VelOut_GenerateMesh = 1 + +# VelOut_InFile: String, filename containing locations of points for interpolation +# Valid only for VelOut_Compute = 1 and VelOut_GenerateMesh = 0 +VelOut_InFile = interpolation-positions.vtk + +# VelOut_InFileFormat, Integer, specified format of VelOut_InFile +# 1: ASCII file, first line lists the number of locations and subsequent lines list the coordinates +# 3: ASCII legacy VTK polydata mesh format (as output from Paraview) +# 4: ASCII legacy VTK unstructured mesh format (as output from Paraview) +# Valid only if VelOut_Compute = 1 AND VelOut_GenerateMesh = 0 +VelOut_InFileFormat = 1 + +# VelOut_FilePrefix: String, Filename prefix for files that interpolated velocity is data is written to +# Velocity output written to separate files, one per output time +# Valid only if VelOut_Compute = 1 +VelOut_FilePrefix = dg-interpolated + +# VelOut_CartMesh.XMin, ..., VelOut_CartMesh.ZRes: Specifies Cartesian mesh of interpolation positions +# Valid only if VelOut_Compute = 1 +VelOut_CartMesh.XMin = 0.0 +VelOut_CartMesh.XMax = 2.0 +VelOut_CartMesh.YMin = 0.0 +VelOut_CartMesh.YMax = 1.0 +VelOut_CartMesh.ZMin = 0.0 +VelOut_CartMesh.ZMax = 0.0 +VelOut_CartMesh.XRes = 21 +VelOut_CartMesh.YRes = 11 +VelOut_CartMesh.ZRes = 1 +#+end_src + diff --git a/docs/content/css/htmlize.css b/docs/content/css/htmlize.css new file mode 100644 index 0000000..0b32a03 --- /dev/null +++ b/docs/content/css/htmlize.css @@ -0,0 +1,145 @@ +.org-bold { /* bold */ font-weight: bold; } +.org-bold-italic { /* bold-italic */ font-weight: bold; font-style: italic; } +.org-buffer-menu-buffer { /* buffer-menu-buffer */ font-weight: bold; } +.org-builtin { /* font-lock-builtin-face */ color: #7a378b; } +.org-button { /* button */ text-decoration: underline; } +.org-calendar-today { /* calendar-today */ text-decoration: underline; } +.org-change-log-acknowledgement { /* change-log-acknowledgement */ color: #b22222; } +.org-change-log-conditionals { /* change-log-conditionals */ color: #a0522d; } +.org-change-log-date { /* change-log-date */ color: #8b2252; } +.org-change-log-email { /* change-log-email */ color: #a0522d; } +.org-change-log-file { /* change-log-file */ color: #0000ff; } +.org-change-log-function { /* change-log-function */ color: #a0522d; } +.org-change-log-list { /* change-log-list */ color: #a020f0; } +.org-change-log-name { /* change-log-name */ color: #008b8b; } +.org-comint-highlight-input { /* comint-highlight-input */ font-weight: bold; } +.org-comint-highlight-prompt { /* comint-highlight-prompt */ color: #00008b; } +.org-comment { /* font-lock-comment-face */ color: #999988; font-style: italic; } +.org-comment-delimiter { /* font-lock-comment-delimiter-face */ color: #999988; font-style: italic; } +.org-completions-annotations { /* completions-annotations */ font-style: italic; } +.org-completions-common-part { /* completions-common-part */ color: #000000; background-color: #ffffff; } +.org-completions-first-difference { /* completions-first-difference */ font-weight: bold; } +.org-constant { /* font-lock-constant-face */ color: #008b8b; } +.org-diary { /* diary */ color: #ff0000; } +.org-diff-context { /* diff-context */ color: #7f7f7f; } +.org-diff-file-header { /* diff-file-header */ background-color: #b3b3b3; font-weight: bold; } +.org-diff-function { /* diff-function */ background-color: #cccccc; } +.org-diff-header { /* diff-header */ background-color: #cccccc; } +.org-diff-hunk-header { /* diff-hunk-header */ background-color: #cccccc; } +.org-diff-index { /* diff-index */ background-color: #b3b3b3; font-weight: bold; } +.org-diff-nonexistent { /* diff-nonexistent */ background-color: #b3b3b3; font-weight: bold; } +.org-diff-refine-change { /* diff-refine-change */ background-color: #d9d9d9; } +.org-dired-directory { /* dired-directory */ color: #0000ff; } +.org-dired-flagged { /* dired-flagged */ color: #ff0000; font-weight: bold; } +.org-dired-header { /* dired-header */ color: #228b22; } +.org-dired-ignored { /* dired-ignored */ color: #7f7f7f; } +.org-dired-mark { /* dired-mark */ color: #008b8b; } +.org-dired-marked { /* dired-marked */ color: #ff0000; font-weight: bold; } +.org-dired-perm-write { /* dired-perm-write */ color: #b22222; } +.org-dired-symlink { /* dired-symlink */ color: #a020f0; } +.org-dired-warning { /* dired-warning */ color: #ff0000; font-weight: bold; } +.org-doc { /* font-lock-doc-face */ color: #8b2252; } +.org-escape-glyph { /* escape-glyph */ color: #a52a2a; } +.org-file-name-shadow { /* file-name-shadow */ color: #7f7f7f; } +.org-flyspell-duplicate { /* flyspell-duplicate */ color: #cdad00; font-weight: bold; text-decoration: underline; } +.org-flyspell-incorrect { /* flyspell-incorrect */ color: #ff4500; font-weight: bold; text-decoration: underline; } +.org-fringe { /* fringe */ background-color: #f2f2f2; } +.org-function-name { /* font-lock-function-name-face */ color: teal; } +.org-header-line { /* header-line */ color: #333333; background-color: #e5e5e5; } +.org-help-argument-name { /* help-argument-name */ font-style: italic; } +.org-highlight { /* highlight */ background-color: #b4eeb4; } +.org-holiday { /* holiday */ background-color: #ffc0cb; } +.org-isearch { /* isearch */ color: #b0e2ff; background-color: #cd00cd; } +.org-isearch-fail { /* isearch-fail */ background-color: #ffc1c1; } +.org-italic { /* italic */ font-style: italic; } +.org-keyword { /* font-lock-keyword-face */ color: #0086b3; } +.org-lazy-highlight { /* lazy-highlight */ background-color: #afeeee; } +.org-link { /* link */ color: #0000ff; text-decoration: underline; } +.org-link-visited { /* link-visited */ color: #8b008b; text-decoration: underline; } +.org-log-edit-header { /* log-edit-header */ color: #a020f0; } +.org-log-edit-summary { /* log-edit-summary */ color: #0000ff; } +.org-log-edit-unknown-header { /* log-edit-unknown-header */ color: #b22222; } +.org-match { /* match */ background-color: #ffff00; } +.org-next-error { /* next-error */ background-color: #eedc82; } +.org-nobreak-space { /* nobreak-space */ color: #a52a2a; text-decoration: underline; } +.org-org-archived { /* org-archived */ color: #7f7f7f; } +.org-org-block { /* org-block */ color: #7f7f7f; } +.org-org-block-begin-line { /* org-block-begin-line */ color: #b22222; } +.org-org-block-end-line { /* org-block-end-line */ color: #b22222; } +.org-org-checkbox { /* org-checkbox */ font-weight: bold; } +.org-org-checkbox-statistics-done { /* org-checkbox-statistics-done */ color: #228b22; font-weight: bold; } +.org-org-checkbox-statistics-todo { /* org-checkbox-statistics-todo */ color: #ff0000; font-weight: bold; } +.org-org-clock-overlay { /* org-clock-overlay */ background-color: #ffff00; } +.org-org-code { /* org-code */ color: #7f7f7f; } +.org-org-column { /* org-column */ background-color: #e5e5e5; } +.org-org-column-title { /* org-column-title */ background-color: #e5e5e5; font-weight: bold; text-decoration: underline; } +.org-org-date { /* org-date */ color: #a020f0; text-decoration: underline; } +.org-org-document-info { /* org-document-info */ color: #191970; } +.org-org-document-info-keyword { /* org-document-info-keyword */ color: #7f7f7f; } +.org-org-document-title { /* org-document-title */ color: #191970; font-size: 144%; font-weight: bold; } +.org-org-done { /* org-done */ color: #228b22; font-weight: bold; } +.org-org-drawer { /* org-drawer */ color: #0000ff; } +.org-org-ellipsis { /* org-ellipsis */ color: #b8860b; text-decoration: underline; } +.org-org-footnote { /* org-footnote */ color: #a020f0; text-decoration: underline; } +.org-org-formula { /* org-formula */ color: #b22222; } +.org-org-headline-done { /* org-headline-done */ color: #bc8f8f; } +.org-org-hide { /* org-hide */ color: #ffffff; } +.org-org-latex-and-export-specials { /* org-latex-and-export-specials */ color: #8b4513; } +.org-org-level-1 { /* org-level-1 */ color: #0000ff; } +.org-org-level-2 { /* org-level-2 */ color: #a0522d; } +.org-org-level-3 { /* org-level-3 */ color: #a020f0; } +.org-org-level-4 { /* org-level-4 */ color: #b22222; } +.org-org-level-5 { /* org-level-5 */ color: #228b22; } +.org-org-level-6 { /* org-level-6 */ color: #008b8b; } +.org-org-level-7 { /* org-level-7 */ color: #7a378b; } +.org-org-level-8 { /* org-level-8 */ color: #8b2252; } +.org-org-link { /* org-link */ color: #0000ff; text-decoration: underline; } +.org-org-meta-line { /* org-meta-line */ color: #b22222; } +.org-org-mode-line-clock { /* org-mode-line-clock */ color: #000000; background-color: #bfbfbf; } +.org-org-mode-line-clock-overrun { /* org-mode-line-clock-overrun */ color: #000000; background-color: #ff0000; } +.org-org-quote { /* org-quote */ color: #7f7f7f; } +.org-org-scheduled { /* org-scheduled */ color: #006400; } +.org-org-scheduled-previously { /* org-scheduled-previously */ color: #b22222; } +.org-org-scheduled-today { /* org-scheduled-today */ color: #006400; } +.org-org-sexp-date { /* org-sexp-date */ color: #a020f0; } +.org-org-special-keyword { /* org-special-keyword */ color: #a020f0; } +.org-org-table { /* org-table */ color: #0000ff; } +.org-org-tag { /* org-tag */ font-weight: bold; } +.org-org-target { /* org-target */ text-decoration: underline; } +.org-org-time-grid { /* org-time-grid */ color: #b8860b; } +.org-org-todo { /* org-todo */ color: #ff0000; font-weight: bold; } +.org-org-upcoming-deadline { /* org-upcoming-deadline */ color: #b22222; } +.org-org-verbatim { /* org-verbatim */ color: #7f7f7f; } +.org-org-verse { /* org-verse */ color: #7f7f7f; } +.org-org-warning { /* org-warning */ color: #ff0000; font-weight: bold; } +.org-outline-1 { /* outline-1 */ color: #0000ff; } +.org-outline-2 { /* outline-2 */ color: #a0522d; } +.org-outline-3 { /* outline-3 */ color: #a020f0; } +.org-outline-4 { /* outline-4 */ color: #b22222; } +.org-outline-5 { /* outline-5 */ color: #228b22; } +.org-outline-6 { /* outline-6 */ color: #008b8b; } +.org-outline-7 { /* outline-7 */ color: #7a378b; } +.org-outline-8 { /* outline-8 */ color: #8b2252; } +.org-preprocessor { /* font-lock-preprocessor-face */ color: #7a378b; } +.org-query-replace { /* query-replace */ color: #b0e2ff; background-color: #cd00cd; } +.org-regexp-grouping-backslash { /* font-lock-regexp-grouping-backslash */ font-weight: bold; } +.org-regexp-grouping-construct { /* font-lock-regexp-grouping-construct */ font-weight: bold; } +.org-region { /* region */ background-color: #eedc82; } +.org-secondary-selection { /* secondary-selection */ background-color: #ffff00; } +.org-shadow { /* shadow */ color: #7f7f7f; } +.org-show-paren-match { /* show-paren-match */ background-color: #40e0d0; } +.org-show-paren-mismatch { /* show-paren-mismatch */ color: #ffffff; background-color: #a020f0; } +.org-string { /* font-lock-string-face */ color: #dd1144; } +.org-tool-bar { /* tool-bar */ color: #000000; background-color: #bfbfbf; } +.org-tooltip { /* tooltip */ color: #000000; background-color: #ffffe0; } +.org-trailing-whitespace { /* trailing-whitespace */ background-color: #ff0000; } +.org-type { /* font-lock-type-face */ color: #228b22; } +.org-underline { /* underline */ text-decoration: underline; } +.org-variable-name { /* font-lock-variable-name-face */ color: teal; } +.org-warning { /* font-lock-warning-face */ color: #ff0000; font-weight: bold; } +.org-widget-button { /* widget-button */ font-weight: bold; } +.org-widget-button-pressed { /* widget-button-pressed */ color: #ff0000; } +.org-widget-documentation { /* widget-documentation */ color: #006400; } +.org-widget-field { /* widget-field */ background-color: #d9d9d9; } +.org-widget-inactive { /* widget-inactive */ color: #7f7f7f; } +.org-widget-single-line-field { /* widget-single-line-field */ background-color: #d9d9d9; } diff --git a/docs/content/css/readtheorg.css b/docs/content/css/readtheorg.css new file mode 100644 index 0000000..56c0b09 --- /dev/null +++ b/docs/content/css/readtheorg.css @@ -0,0 +1,1144 @@ +@import url("https://fonts.googleapis.com/css?family=Lato:400,700,400italic,700italic|Roboto+Slab:400,700|Inconsolata:400,700"); +@import url("https://maxcdn.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.min.css"); + +h1,h2,h3,h4,h5,h6,legend{ + font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif; + font-weight:700; + margin-top:0; +} + +h1{ + font-size:175%; + text-align: left !important; + margin-bottom: 0.83em !important; +} + +.subtitle{ + font-size:95%; /* of h1 */ +} + +h2{ + font-size:150%; +} + +h3{ + font-size:125%; +} + +h4{ + font-size:115%; +} + +h5{ + font-size:110%; +} + +h6{ + font-size:100%; +} + +h4,h5,h6{ + color:#2980B9; + font-weight:300; +} + +html{ + -ms-text-size-adjust:100%; + -webkit-text-size-adjust:100%; + font-size:100%; + height:100%; +} + +body{ + background:#edf0f2; + color:#404040; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; + font-weight:normal; + margin:0; + min-height:100%; +} + +#content{ + background:#fcfcfc; + margin-left:300px; + /* margin:auto; */ + max-width:800px; + min-height:100%; + padding:1.618em 3.236em; +} + +p{ + font-size:16px; + line-height:24px; + margin:0px 0px 24px 0px; +} + +b,strong{ + font-weight:bold} + +blockquote{ + background-color: #F0F0F0; + border-left:5px solid #CCCCCC; + font-style:italic; + line-height:24px; + margin:0px 0px 24px 0px; + /* margin-left:24px; */ + padding: 6px 20px; +} + +ul,ol,dl{ + line-height:24px; + list-style-image:none; + /* list-style:none; */ + margin:0px 0px 24px 0px; + padding:0; +} + +li{ + margin-left: 24px; +} + +dd{ + margin:0; +} + +#content .section ul,#content .toctree-wrapper ul,article ul{ + list-style:disc; + line-height:24px; + margin-bottom:24px} + +#content .section ul li,#content .toctree-wrapper ul li,article ul li{ + list-style:disc; + margin-left:24px} + +#content .section ul li p:last-child,#content .toctree-wrapper ul li p:last-child,article ul li p:last-child{ + margin-bottom:0} + +#content .section ul li ul,#content .toctree-wrapper ul li ul,article ul li ul{ + margin-bottom:0} + +#content .section ul li li,#content .toctree-wrapper ul li li,article ul li li{ + list-style:circle} + +#content .section ul li li li,#content .toctree-wrapper ul li li li,article ul li li li{ + list-style:square} + +#content .section ul li ol li,#content .toctree-wrapper ul li ol li,article ul li ol li{ + list-style:decimal} + +#content .section ol,#content ol,article ol{ + list-style:decimal; + line-height:24px; + margin-bottom:24px} + +#content .section ol li,#content ol li,article ol li{ + list-style:decimal; + margin-left:24px} + +#content .section ol li p:last-child,#content ol li p:last-child,article ol li p:last-child{ + margin-bottom:0} + +#content .section ol li ul,#content ol li ul,article ol li ul{ + margin-bottom:0} + +#content .section ol li ul li,#content ol li ul li,article ol li ul li{ + list-style:disc} + +dl dt{ + font-weight:bold; +} + +dl p,dl table,dl ul,dl ol{ + margin-bottom:12px !important; +} + +dl dd{ + margin:0 0 12px 24px; +} + +@media print{ + .codeblock,pre.src{ + white-space:pre.src-wrap} +} + +@media print{ + html,body,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} + + pre.src,blockquote{ + page-break-inside:avoid} + + thead{ + display:table-header-group} + + tr,img{ + page-break-inside:avoid} + + img{ + max-width:100% !important} + + @page{ + margin:0.5cm} + + p,h2,h3{ + orphans:3; + widows:3} + + h2,h3{ + page-break-after:avoid} +} + +@media print{ + #postamble{ + display:none} + + #content{ + margin-left:0} +} + +@media print{ + #table-of-contents{ + display:none} + + @page{ + size: auto; + margin: 25mm 25mm 25mm 25mm;} + + body { + margin: 0px;} +} + +@media screen and (max-width: 768px){ +} + +@media only screen and (max-width: 480px){ +} + +@media screen and (max-width: 768px){ + .tablet-hide{ + display:none} +} + +@media screen and (max-width: 480px){ + .mobile-hide{ + display:none} +} + +@media screen and (max-width: 480px){ +} + +@media screen and (max-width: 768px){ + #content{ + margin-left:0} + + #content #content{ + padding:1.618em} + + #content.shift{ + position:fixed; + min-width:100%; + left:85%; + top:0; + height:100%; + overflow:hidden} +} + +@media screen and (min-width: 1400px){ + #content{ + background:rgba(0,0,0,0.05)} + + #content{ + background:#fcfcfc} +} + +@media screen and (max-width: 768px){ + #copyright{ + width:85%; + display:none} + + #copyright.shift{ + display:block} + + img{ + width:100%; + height:auto} +} + +@media screen and (max-width: 480px){ + #content .sidebar{ + width:100%} +} + +code{ + background:#fff; + border:solid 1px #e1e4e5; + /* color:#000; for clickable code */ + font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace; + font-size:75%; + max-width:100%; + overflow-x:auto; + padding:0 5px; + white-space:nowrap; +} + +.codeblock-example{ + border:1px solid #e1e4e5; + border-bottom:none; + padding:24px; + padding-top:48px; + font-weight:500; + background:#fff; + position:relative} + +.codeblock-example:after{ + content:"Example"; + position:absolute; + top:0px; + left:0px; + background:#9B59B6; + color:#fff; + padding:6px 12px} + +.codeblock-example.prettyprint-example-only{ + border:1px solid #e1e4e5; + margin-bottom:24px} + +.codeblock,pre.src,#content .literal-block{ + border:1px solid #e1e4e5; + padding:12px; + overflow-x:auto; + background:#fff; + margin:1px 0 24px 0} + +pre.src{ + /* color:#404040; */ + display:block; + font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace; + font-size:12px; + line-height:1.5; + margin:1px 0px 24px 0px; + overflow:auto; + padding:12px; + white-space:pre; +} + +.example{ + background:#f3f6f6; + border:1px solid #e1e4e5; + color:#404040; + font-size: 12px; + line-height: 1.5; + margin-bottom:24px; + padding:12px; + overflow: auto; +} + +table{ + border-collapse:collapse; + border-spacing:0; + empty-cells:show; + margin-bottom:24px; + border-bottom:1px solid #e1e4e5; +} + +td{ + vertical-align:top} + +table td,table th{ + font-size:90%; + margin:0; + overflow:visible; + padding:8px 16px; + background-color:white; + border:1px solid #e1e4e5; +} + +table thead th{ + font-weight:bold; + border-top:3px solid #e1e4e5; + border-bottom:1px solid #e1e4e5; +} + +table caption{ + color:#000; + font:italic 85%/1 arial,sans-serif; + padding:1em 0; +} + +table tr:nth-child(2n-1) td{ + background-color:#f3f6f6; +} + +table tr:nth-child(2n) td{ + background-color:white; +} + +.figure p{ + color:#000; + font:italic 85%/1 arial,sans-serif; + padding:1em 0; +} + +.rotate-90{ + -webkit-transform:rotate(90deg); + -moz-transform:rotate(90deg); + -ms-transform:rotate(90deg); + -o-transform:rotate(90deg); + transform:rotate(90deg); +} + +.rotate-270{ + -webkit-transform:rotate(270deg); + -moz-transform:rotate(270deg); + -ms-transform:rotate(270deg); + -o-transform:rotate(270deg); + transform:rotate(270deg); +} + +#toggle-sidebar, +#table-of-contents .close-sidebar { + display: none; +} + +@media screen and (max-width: 768px) { + #table-of-contents { + display: none; + width: 60%; + } + + #table-of-contents h2 a { + display: block; + } + + #table-of-contents:target { + display: block; + } + + #copyright, #postamble { + display: none; + } + + #toggle-sidebar { + display: block; + margin-bottom: 1.6em; + padding: 0.6em; + text-align: center; + } + + #toggle-sidebar h2 { + background-color:#2980B9; + width:100%; + height:50px; + left:0; + top:0; + color: white; + font-size: 100%; + line-height: 50px; + position:fixed; + margin: 0; + padding: 0; + opacity:0.7; + z-index: 10; + } + + #table-of-contents .close-sidebar { + color: rgba(255, 255, 255, 0.3); + display: inline-block; + margin: 0px 10px 0px 45px; + padding: 10px; + } +} + +*{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; +} + +figcaption,figure,footer,header,hgroup,nav{ + display:block} + +ins{ + background:#ff9; + color:#000; + text-decoration:none} + +mark{ + background:#ff0; + color:#000; + font-style:italic; + font-weight:bold} + +small{ + font-size:85%} + +sub,sup{ + font-size:75%; + line-height:0; + position:relative; + vertical-align:baseline} + +sup{ + top:-0.5em} + +sub{ + bottom:-0.25em} + +img{ + -ms-interpolation-mode:bicubic; + vertical-align:middle; + max-width:100%} + +svg:not(:root){ + overflow:hidden} + +figure{ + margin:0} + +label{ + cursor:pointer} + +legend{ + border:0; + margin-left:-7px; + padding:0; + white-space:normal} + +.fa:before,#content .admonition-title:before,#content h1 .headerlink:before,#content h2 .headerlink:before,#content h3 .headerlink:before,#content h4 .headerlink:before,#content h5 .headerlink:before,#content h6 .headerlink:before,#content dl dt .headerlink:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-alert,#content .note,#content .attention,#content .caution,#content .danger,#content .error,#content .hint,#content .important,#content .tip,#content .warning,#content .seealso,#content .admonitiontodo,.btn,input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"],select,textarea,#table-of-contents li.on a,#table-of-contents li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{ + -webkit-font-smoothing:antialiased} + +/*! + * Font Awesome 4.1.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?v=4.1.0"); + src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.1.0") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff?v=4.1.0") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.1.0") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.1.0#fontawesomeregular") format("svg"); + font-weight:normal; + font-style:normal} + +.fa,#content .admonition-title,.icon{ + display:inline-block; + font-family:FontAwesome; + font-style:normal; + font-weight:normal; + line-height:1; + -webkit-font-smoothing:antialiased; + -moz-osx-font-smoothing:grayscale} + +.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:0.14286em; + text-align:center} + +.fa-li.fa-lg{ + left:-1.85714em} + +.fa-border{ + padding:.2em .25em .15em; + border:solid 0.08em #eee; + border-radius:.1em} + +.fa,#content .admonition-title{ + font-family:inherit} + +.fa:before,#content .admonition-title:before{ + font-family:"FontAwesome"; + display:inline-block; + font-style:normal; + font-weight:normal; + line-height:1; + text-decoration:inherit} + +a .fa,a #content .admonition-title,#content a .admonition-title{ + display:inline-block; + text-decoration:inherit} + +.nav #content .admonition-title,#content .nav .admonition-title,.nav .icon{ + display:inline} + +.wy-alert-title,#content .admonition-title{ + color:#fff; + font-weight:bold; + display:block; + color:#fff; + /* background:#6ab0de; */ + /* margin:-12px; */ + padding:6px 12px; + margin-bottom:0px} + +.admonition-title + div{ + padding: 12px; + margin-bottom: 24px; +} + +.admonition-title + div > p{ + margin: 0; +} + +.danger + div, .error + div, #content .danger,#content .error{ + background:#fdf3f2} + +.wy-alert.wy-alert-warning,#content .wy-alert-warning.note, #content .attention,#content .caution, #content .warning, #content .admonitiontodo, .attention + div, .caution + div, .warning + div, #content .wy-alert-warning.danger,#content .wy-alert-warning.error, #content .wy-alert-warning.hint,#content .wy-alert-warning.important,#content .wy-alert-warning.tip,#content .wy-alert-warning.seealso{ + background:#ffedcc} + +#content .admonition-title.note:before, #content .admonition-title.seealso:before, +#content .admonition-title.warning:before, #content .admonition-title.caution:before, +#content .admonition-title.attention:before, +#content .admonition-title.tip:before, #content .admonition-title.hint:before, +#content .admonition-title.important:before, +#content .admonition-title.error:before, #content .admonition-title.danger:before{ + font-family:FontAwesome; + content: "";} + +.seealso + div, .note + div, #content .note,#content .seealso{ + background:#e7f2fa; +} + +#content .admonition-title.tip,#content .admonition-title.important,#content .admonition-title.hint{ + line-height: 1; + background:#1abc9c} + +.important + div, .tip + div, .hint + div, #content .important, #content .tip, #content .hint{ + background:#dbfaf4} + +#content .admonition-title.note,#content .admonition-title.seealso{ + line-height: 1; + background:#6ab0de} + +#content .admonition-title.warning,#content .admonition-title.caution,#content .admonition-title.attention{ + line-height: 1; + background:#F0B37E} + +#content .admonition-title.error,#content .admonition-title.danger{ + line-height: 1; + background:#f29f97} + +legend{ + display:block; + width:100%; + border:0; + padding:0; + white-space:normal; + margin-bottom:24px; + font-size:150%; + *margin-left:-7px} + +label{ + display:block; + margin:0 0 0.3125em 0; + color:#333; + font-size:90%} + +a{ + color:#2980B9; + text-decoration:none; + cursor:pointer} + + +a:hover,a:active{ + outline:0; +} + +a:hover{ + color:#3091d1} + +a:visited{ + color:#9B59B6} + +.left{ + text-align:left} + +.center{ + text-align:center} + +.right{ + text-align:right} + +hr{ + display:block; + height:1px; + border:0; + border-top:1px solid #e1e4e5; + margin:24px 0; + padding:0} + +#table-of-contents li{ + list-style:none; + margin-left: 0px; +} + +#table-of-contents header{ + height:32px; + display:inline-block; + line-height:32px; + padding:0 1.618em; + display:block; + font-weight:bold; + text-transform:uppercase; + font-size:80%; + color:#2980B9; + white-space:nowrap} + +#table-of-contents ul{ + margin-bottom:0} + +#table-of-contents li.divide-top{ + border-top:solid 1px #404040} + +#table-of-contents li.divide-bottom{ + border-bottom:solid 1px #404040} + +#table-of-contents li.current{ + background:#e3e3e3} + +#table-of-contents li.current a{ + color:gray; + border-right:solid 1px #c9c9c9; + padding:0.4045em 2.427em} + +#table-of-contents li.current a:hover{ + background:#d6d6d6} + +#table-of-contents li a{ + /* color:#404040; */ + padding:0.4045em 1.618em; + position:relative; + /* background:#fcfcfc; */ + border:none; + /* border-bottom:solid 1px #c9c9c9; */ + /* border-top:solid 1px #c9c9c9; */ + padding-left:1.618em -4px} + +#table-of-contents li.on a:hover,#table-of-contents li.current>a:hover{ + background:#fcfcfc} + +#table-of-contents li ul li a{ + /* background:#c9c9c9; */ + padding:0.4045em 2.427em} + +#table-of-contents li ul li ul li a{ + padding:0.4045em 3.236em} + +#table-of-contents li.current ul{ + display:block} + +/* #table-of-contents li ul{ */ +/* margin-bottom:0; */ +/* display:none} */ + +#table-of-contents .local-toc li ul{ + display:block} + +#table-of-contents li ul li a{ + margin-bottom:0; + color:#b3b3b3; + font-weight:normal} + +#table-of-contents a{ + display:inline-block; + line-height:18px; + padding:0.4045em 1.618em; + display:block; + position:relative; + font-size:90%; + color:#b3b3b3; + direction: ltr; +} + +#table-of-contents a:hover{ + color: #ffffff !important; + background-color:#4e4a4a; + cursor:pointer} + +/* #text-table-of-contents { */ +/* overflow:scroll; */ +/* } */ + +#table-of-contents{ + position:fixed; + top:0; + left:0; + width:300px; + overflow-x:hidden; + overflow-y:scroll; + height:100%; + background:#343131; + z-index:200; + scrollbar-base-color: #1F1D1D; + scrollbar-arrow-color: #b3b3b3; + scrollbar-shadow-color: #1F1D1D; + scrollbar-track-color : #343131; +} + +#table-of-contents h2{ + z-index:200; + background-color:#2980B9; + text-align:center; + padding:0.809em; + display:block; + color:#fcfcfc; + font-size: 100%; + margin-bottom:0.809em} + +ul.nav > li ul { + display: none; +} + +li.active { + background-color: #e3e3e3; +} + +li.active>a { + color: black !important; +} + +ul.nav>li.active a { + color: #404040 !important; +} + +ul.nav>li.active li.active { + background-color: #c9c9c9; +} + +ul.nav>li.active li.active>a { + color: black !important; + border-right:solid 1px #c9c9c9 !important; + font-weight: bold !important; + display: block !important; +} + +ul.nav>li.active>a { + background-color: #fcfcfc; + color: black !important; + border-bottom:solid 1px #c9c9c9 !important; /* XXX Restrict it to 2nd level */ + border-right:solid 1px #c9c9c9 !important; + font-weight: bold !important; + display: block !important; +} + +li.active>ul { + display: inline !important; +} +/* ul.nav li ul li { */ +/* display: none; */ +/* } */ + +/* ul.nav li ul li ul li { */ +/* display: none; */ +/* } */ + +/* ul.nav li.active ul li { */ +/* display: inline; */ +/* } */ + +/* ul.nav li.active ul li ul li { */ +/* display: inline; */ +/* } */ + +/* ul.nav li.active ul li a { */ +/* background-color: #E3E3E3; */ +/* color: #8099B0; */ +/* border-right:solid 1px #c9c9c9 !important; */ +/* } */ + +/* ul.nav li.active ul li.active a { */ +/* background-color: #C9C9C9; */ +/* color: black !important; */ +/* font-weight: bold !important; */ +/* } */ + +/* ul.nav li.active ul li.active ul li.active a { */ + /* color: black !important; */ + /* font-weight: bold !important; */ + /* display: block !important; */ +/* } */ + +/* ul.nav li.active ul li.active ul li a { */ +/* color: #808080 !important; */ +/* font-weight: normal !important; */ +/* display: block !important; */ +/* } */ + +/* ul.nav li.active ul li ul li a { */ +/* display: none !important; */ +/* } */ + +/* ul.nav li ul li ul li { */ +/* display: none !important; /\* as long as nav is on multiple levels of ul *\/ */ +/* /\* display: none; /\* as long as nav is on multiple levels of ul *\\/ *\/ */ +/* } */ + +/* ul.nav li ul li ul li ul li { */ +/* display: none !important; /\* as long as nav is on multiple levels of ul *\/ */ +/* /\* display: none; /\* as long as nav is on multiple levels of ul *\\/ *\/ */ +/* } */ + +/* ul.nav li.active > a { */ + /* border-bottom:solid 1px #c9c9c9 !important; /\* XXX Restrict it to 2nd level *\/ */ + /* border-right:solid 1px #c9c9c9 !important; */ +/* } */ + +/* ul.nav li.active a { */ +/* color: gray !important; */ +/* font-weight:bold; */ +/* background-color: white; */ +/* border-right:solid 0px white !important; */ +/* } */ + +/* ul.nav > li.active > a { */ +/* color: black !important; */ +/* } */ + +footer{ + color:#999} + +footer p{ + margin-bottom:12px} + +#copyright, #postamble{ + position:fixed; + bottom:0; + left:0; + width:300px; + color:#fcfcfc; + background:#1f1d1d; + border-top:solid 10px #343131; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; + font-size: 90%; + z-index:400; + padding:12px; +} + +#postamble .author { + font-size: 100%; + margin-bottom: 0px; +} + +#postamble .date { + font-size: 90%; + margin-bottom: 0px; + color: #27AE60; +} + +#postamble .creator,#postamble .validation { + display:none; +} + +#copyright a{ + color:#2980B9; + text-decoration:none} + +#copyright .rst-current-version{ + padding:12px; + background-color:#272525; + display:block; + text-align:right; + font-size:90%; + cursor:pointer; + color:#27AE60; + *zoom:1} + +#content img{ + max-width:100%; +} + +#content div.figure{ + margin-bottom:24px} + +#content div.figure.align-center{ + text-align:center} + +#content .section>img,#content .section>a>img{ + margin-bottom:24px} + +.verse{ + border-left:5px solid #6AB0DE; + background-color: #E7F2FA; + padding: 6px 20px; + font-style:italic; +} + +#content .note .last,#content .attention .last,#content .caution .last,#content .danger .last,#content .error .last,#content .hint .last,#content .important .last,#content .tip .last,#content .warning .last,#content .seealso .last,#content .admonitiontodo .last{ + margin-bottom:0} + +#content .admonition-title:before{ + margin-right:4px} + +#content .section ol p,#content .section ul p{ + margin-bottom:12px} + +#content h1 .headerlink,#content h2 .headerlink,#content h3 .headerlink,#content h4 .headerlink,#content h5 .headerlink,#content h6 .headerlink,#content dl dt .headerlink{ + display:none; + visibility:hidden; + font-size:14px} + +#content h1 .headerlink:after,#content h2 .headerlink:after,#content h3 .headerlink:after,#content h4 .headerlink:after,#content h5 .headerlink:after,#content h6 .headerlink:after,#content dl dt .headerlink:after{ + visibility:visible; + content:""; + font-family:FontAwesome; + display:inline-block} + +#content h1:hover .headerlink,#content h2:hover .headerlink,#content h3:hover .headerlink,#content h4:hover .headerlink,#content h5:hover .headerlink,#content h6:hover .headerlink,#content dl dt:hover .headerlink{ + display:inline-block} + +#content .sidebar{ + float:right; + width:40%; + display:block; + margin:0 0 24px 24px; + padding:24px; + background:#f3f6f6; + border:solid 1px #e1e4e5} + +#content .sidebar p,#content .sidebar ul,#content .sidebar dl{ + font-size:90%} + +#content .sidebar .last{ + margin-bottom:0} + +#content .sidebar .sidebar-title{ + display:block; + font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif; + font-weight:bold; + background:#e1e4e5; + padding:6px 12px; + margin:-24px; + margin-bottom:24px; + font-size:100%} + +#content .highlighted{ + background:#F1C40F; + display:inline-block; + font-weight:bold; + padding:0 6px} + +#content .footnote-reference,#content .citation-reference{ + vertical-align:super; + font-size:90%} + +span[id*='MathJax-Span']{ + color:#404040} + +.math{ + text-align:center} + +#footnotes{ + border-top:1px solid #e1e4e5; + padding-top: 36px; +} + +h2.footnotes{ + display:none; +} + +.footnum, .footref{ + color: #2980b9; + font-size: 90%; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; +} + +.footnum:before, .footref:before{ + content:"["; +} + +.footnum:after, .footref:after{ + content:"]"; +} + +.footpara { + color: #999; + font-size: 90%; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; + padding-bottom: 8px; + padding-left: 16px; + padding-right: 16px; + padding-top: 8px; + line-height: 1.25em; + /* display: inline; */ +} + +.todo{ + background-color: #f29f97; + padding: 0px 4px; + color: #fff; +} + +.WAIT, .nilWAIT{ + background-color: #6ab0de; + padding: 0px 4px; + color: #fff; +} + +.done{ + background-color: #6AB097; +} + +.tag span { + background-color: #EDEDED; + border: 1px solid #EDEDED; + color: #939393; + cursor: pointer; + display: block; + float: right; + font-size: 80%; + font-weight: normal; + margin: 0 3px; + padding: 1px 2px; + border-radius: 10px; +} + +.tag .FLAGGED { + background-color: #DB2D27; + border: 1px solid #DB2D27; + color: white; + font-weight: bold; +} + +.timestamp { + font-family: Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace; + font-size: 90%; + color: navy; +} + +.nav .timestamp { + color: inherit; +} + +.inlinetask { + background: #FFF9E3; /* url(dialog-todo.png) no-repeat 10px 8px; */ + border: 3px solid #FFEB8E; + /* border-right-style: none; */ + /* border-left-style: none; */ + /* padding: 10px 20px 10px 60px; */ + padding: 9px 12px; + margin-bottom: 24px; + font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif} + +#org-div-home-and-up { + text-align: right; + padding-right: 10pt; +} + +.underline { + text-decoration:underline +} diff --git a/docs/content/css/rtd-full.css b/docs/content/css/rtd-full.css new file mode 100644 index 0000000..6cb3346 --- /dev/null +++ b/docs/content/css/rtd-full.css @@ -0,0 +1,3910 @@ +*{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box} + +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{ + display:block} + +audio,canvas,video{ + display:inline-block; + *display:inline; + *zoom:1} + +audio:not([controls]){ + display:none} + +[hidden]{ + 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:hover,a:active{ + outline:0} + +abbr[title]{ + border-bottom:1px dotted} + +b,strong{ + font-weight:bold} + +blockquote{ + margin:0} + +dfn{ + font-style:italic} + +ins{ + background:#ff9; + color:#000; + text-decoration:none} + +mark{ + background:#ff0; + color:#000; + font-style:italic; + font-weight:bold} + +pre,code,.rst-content tt,kbd,samp{ + font-family:monospace,serif; + _font-family:"courier new",monospace; + font-size:1em} + +pre{ + white-space:pre} + +q{ + quotes:none} + +q:before,q:after{ + content:""; + content:none} + +small{ + font-size:85%} + +sub,sup{ + font-size:75%; + line-height:0; + position:relative; + vertical-align:baseline} + +sup{ + top:-0.5em} + +sub{ + bottom:-0.25em} + +ul,ol,dl{ + 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{ + margin:0} + +form{ + margin:0} + +fieldset{ + border:0; + margin:0; + padding:0} + +label{ + cursor:pointer} + +legend{ + border:0; + *margin-left:-7px; + padding:0; + white-space:normal} + +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="checkbox"],input[type="radio"]{ + box-sizing:border-box; + padding:0; + *width:13px; + *height:13px} + +input[type="search"]{ + -webkit-appearance:textfield; + -moz-box-sizing:content-box; + -webkit-box-sizing:content-box; + box-sizing:content-box} + +input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{ + -webkit-appearance:none} + +button::-moz-focus-inner,input::-moz-focus-inner{ + border:0; + padding:0} + +textarea{ + overflow:auto; + vertical-align:top; + resize:vertical} + +table{ + border-collapse:collapse; + border-spacing:0} + +td{ + vertical-align:top} + +.chromeframe{ + margin:0.2em 0; + background:#ccc; + color:#000; + padding:0.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{ + html,body,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^="javascript:"]:after,a[href^="#"]:after{ + content:""} + + pre,blockquote{ + page-break-inside:avoid} + + thead{ + display:table-header-group} + + tr,img{ + page-break-inside:avoid} + + img{ + max-width:100% !important} + + @page{ + margin:0.5cm} + + p,h2,h3{ + orphans:3; + widows:3} + + h2,h3{ + page-break-after:avoid} + +} + +.fa:before,.rst-content .admonition-title: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 dl dt .headerlink:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo,.btn,input[type="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"],select,textarea,.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a,.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a,.wy-nav-top a{ + -webkit-font-smoothing:antialiased} + +.clearfix{ + *zoom:1} + +.clearfix:before,.clearfix:after{ + display:table; + content:""} + +.clearfix:after{ + clear:both} + +/*! + * Font Awesome 4.1.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?v=4.1.0"); + src:url("../fonts/fontawesome-webfont.eot?#iefix&v=4.1.0") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff?v=4.1.0") format("woff"),url("../fonts/fontawesome-webfont.ttf?v=4.1.0") format("truetype"),url("../fonts/fontawesome-webfont.svg?v=4.1.0#fontawesomeregular") format("svg"); + font-weight:normal; + font-style:normal} + +.fa,.rst-content .admonition-title,.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 dl dt .headerlink,.icon{ + display:inline-block; + font-family:FontAwesome; + font-style:normal; + font-weight:normal; + line-height:1; + -webkit-font-smoothing:antialiased; + -moz-osx-font-smoothing:grayscale} + +.fa-lg{ + font-size:1.33333em; + line-height:0.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:0.14286em; + text-align:center} + +.fa-li.fa-lg{ + left:-1.85714em} + +.fa-border{ + padding:.2em .25em .15em; + border:solid 0.08em #eee; + border-radius:.1em} + +.pull-right{ + float:right} + +.pull-left{ + float:left} + +.fa.pull-left,.rst-content .pull-left.admonition-title,.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 dl dt .pull-left.headerlink,.pull-left.icon{ + margin-right:.3em} + +.fa.pull-right,.rst-content .pull-right.admonition-title,.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 dl dt .pull-right.headerlink,.pull-right.icon{ + margin-left:.3em} + +.fa-spin{ + -webkit-animation:spin 2s infinite linear; + -moz-animation:spin 2s infinite linear; + -o-animation:spin 2s infinite linear; + animation:spin 2s infinite linear} + +@-moz-keyframes spin{ + 0%{ + -moz-transform:rotate(0deg)} + + 100%{ + -moz-transform:rotate(359deg)} + +} + +@-webkit-keyframes spin{ + 0%{ + -webkit-transform:rotate(0deg)} + + 100%{ + -webkit-transform:rotate(359deg)} + +} + +@-o-keyframes spin{ + 0%{ + -o-transform:rotate(0deg)} + + 100%{ + -o-transform:rotate(359deg)} + +} + +@keyframes spin{ + 0%{ + -webkit-transform:rotate(0deg); + transform:rotate(0deg)} + + 100%{ + -webkit-transform:rotate(359deg); + transform:rotate(359deg)} + +} + +.fa-rotate-90{ + filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform:rotate(90deg); + -moz-transform:rotate(90deg); + -ms-transform:rotate(90deg); + -o-transform:rotate(90deg); + transform:rotate(90deg)} + +.fa-rotate-180{ + filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform:rotate(180deg); + -moz-transform:rotate(180deg); + -ms-transform:rotate(180deg); + -o-transform:rotate(180deg); + transform:rotate(180deg)} + +.fa-rotate-270{ + filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform:rotate(270deg); + -moz-transform:rotate(270deg); + -ms-transform:rotate(270deg); + -o-transform:rotate(270deg); + transform:rotate(270deg)} + +.fa-flip-horizontal{ + filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0); + -webkit-transform:scale(-1, 1); + -moz-transform:scale(-1, 1); + -ms-transform:scale(-1, 1); + -o-transform:scale(-1, 1); + transform:scale(-1, 1)} + +.fa-flip-vertical{ + filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform:scale(1, -1); + -moz-transform:scale(1, -1); + -ms-transform:scale(1, -1); + -o-transform:scale(1, -1); + transform:scale(1, -1)} + +.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-times:before{ + content:""} + +.fa-search-plus:before{ + content:""} + +.fa-search-minus:before{ + content:""} + +.fa-power-off:before{ + content:""} + +.fa-signal:before{ + content:""} + +.fa-gear:before,.fa-cog: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{ + 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-rotate-right:before,.fa-repeat: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-photo:before,.fa-image: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,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.rst-content .admonition-title: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-warning:before,.fa-exclamation-triangle: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{ + content:""} + +.fa-twitter-square:before{ + content:""} + +.fa-facebook-square:before{ + content:""} + +.fa-camera-retro:before{ + content:""} + +.fa-key:before{ + content:""} + +.fa-gears:before,.fa-cogs: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:before{ + content:""} + +.fa-github:before,.icon-github:before{ + content:""} + +.fa-unlock:before{ + content:""} + +.fa-credit-card:before{ + content:""} + +.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-save:before,.fa-floppy-o:before{ + content:""} + +.fa-square:before{ + content:""} + +.fa-navicon:before,.fa-reorder:before,.fa-bars: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,.wy-dropdown .caret:before,.icon-caret-down:before{ + content:""} + +.fa-caret-up:before{ + content:""} + +.fa-caret-left:before{ + content:""} + +.fa-caret-right:before{ + content:""} + +.fa-columns:before{ + content:""} + +.fa-unsorted:before,.fa-sort:before{ + content:""} + +.fa-sort-down:before,.fa-sort-desc:before{ + content:""} + +.fa-sort-up:before,.fa-sort-asc:before{ + content:""} + +.fa-envelope:before{ + content:""} + +.fa-linkedin:before{ + content:""} + +.fa-rotate-left:before,.fa-undo:before{ + content:""} + +.fa-legal:before,.fa-gavel:before{ + content:""} + +.fa-dashboard:before,.fa-tachometer:before{ + content:""} + +.fa-comment-o:before{ + content:""} + +.fa-comments-o:before{ + content:""} + +.fa-flash:before,.fa-bolt:before{ + content:""} + +.fa-sitemap:before{ + content:""} + +.fa-umbrella:before{ + content:""} + +.fa-paste:before,.fa-clipboard: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-unlink:before,.fa-chain-broken: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{ + 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-toggle-down:before,.fa-caret-square-o-down:before{ + content:""} + +.fa-toggle-up:before,.fa-caret-square-o-up:before{ + content:""} + +.fa-toggle-right:before,.fa-caret-square-o-right:before{ + content:""} + +.fa-euro:before,.fa-eur:before{ + content:""} + +.fa-gbp:before{ + content:""} + +.fa-dollar:before,.fa-usd:before{ + content:""} + +.fa-rupee:before,.fa-inr:before{ + content:""} + +.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{ + content:""} + +.fa-ruble:before,.fa-rouble:before,.fa-rub:before{ + content:""} + +.fa-won:before,.fa-krw: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{ + 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-toggle-left:before,.fa-caret-square-o-left:before{ + content:""} + +.fa-dot-circle-o:before{ + content:""} + +.fa-wheelchair:before{ + content:""} + +.fa-vimeo-square:before{ + content:""} + +.fa-turkish-lira:before,.fa-try:before{ + content:""} + +.fa-plus-square-o: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-institution:before,.fa-bank:before,.fa-university:before{ + content:""} + +.fa-mortar-board:before,.fa-graduation-cap: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-square:before,.fa-pied-piper: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-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{ + content:""} + +.fa-file-zip-o:before,.fa-file-archive-o:before{ + content:""} + +.fa-file-sound-o:before,.fa-file-audio-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-saver:before,.fa-support:before,.fa-life-ring:before{ + content:""} + +.fa-circle-o-notch:before{ + content:""} + +.fa-ra:before,.fa-rebel:before{ + content:""} + +.fa-ge:before,.fa-empire:before{ + content:""} + +.fa-git-square:before{ + content:""} + +.fa-git:before{ + content:""} + +.fa-hacker-news:before{ + content:""} + +.fa-tencent-weibo:before{ + content:""} + +.fa-qq:before{ + content:""} + +.fa-wechat:before,.fa-weixin:before{ + content:""} + +.fa-send:before,.fa-paper-plane:before{ + content:""} + +.fa-send-o:before,.fa-paper-plane-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,.rst-content .admonition-title,.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 dl dt .headerlink,.icon,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context{ + font-family:inherit} + +.fa:before,.rst-content .admonition-title: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 dl dt .headerlink:before,.icon:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before{ + font-family:"FontAwesome"; + display:inline-block; + font-style:normal; + font-weight:normal; + line-height:1; + text-decoration:inherit} + +a .fa,a .rst-content .admonition-title,.rst-content a .admonition-title,a .rst-content h1 .headerlink,.rst-content h1 a .headerlink,a .rst-content h2 .headerlink,.rst-content h2 a .headerlink,a .rst-content h3 .headerlink,.rst-content h3 a .headerlink,a .rst-content h4 .headerlink,.rst-content h4 a .headerlink,a .rst-content h5 .headerlink,.rst-content h5 a .headerlink,a .rst-content h6 .headerlink,.rst-content h6 a .headerlink,a .rst-content dl dt .headerlink,.rst-content dl dt a .headerlink,a .icon{ + display:inline-block; + text-decoration:inherit} + +.btn .fa,.btn .rst-content .admonition-title,.rst-content .btn .admonition-title,.btn .rst-content h1 .headerlink,.rst-content h1 .btn .headerlink,.btn .rst-content h2 .headerlink,.rst-content h2 .btn .headerlink,.btn .rst-content h3 .headerlink,.rst-content h3 .btn .headerlink,.btn .rst-content h4 .headerlink,.rst-content h4 .btn .headerlink,.btn .rst-content h5 .headerlink,.rst-content h5 .btn .headerlink,.btn .rst-content h6 .headerlink,.rst-content h6 .btn .headerlink,.btn .rst-content dl dt .headerlink,.rst-content dl dt .btn .headerlink,.btn .icon,.nav .fa,.nav .rst-content .admonition-title,.rst-content .nav .admonition-title,.nav .rst-content h1 .headerlink,.rst-content h1 .nav .headerlink,.nav .rst-content h2 .headerlink,.rst-content h2 .nav .headerlink,.nav .rst-content h3 .headerlink,.rst-content h3 .nav .headerlink,.nav .rst-content h4 .headerlink,.rst-content h4 .nav .headerlink,.nav .rst-content h5 .headerlink,.rst-content h5 .nav .headerlink,.nav .rst-content h6 .headerlink,.rst-content h6 .nav .headerlink,.nav .rst-content dl dt .headerlink,.rst-content dl dt .nav .headerlink,.nav .icon{ + display:inline} + +.btn .fa.fa-large,.btn .rst-content .fa-large.admonition-title,.rst-content .btn .fa-large.admonition-title,.btn .rst-content h1 .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.btn .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .btn .fa-large.headerlink,.btn .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .fa-large.admonition-title,.rst-content .nav .fa-large.admonition-title,.nav .rst-content h1 .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.nav .rst-content dl dt .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.nav .fa-large.icon{ + line-height:0.9em} + +.btn .fa.fa-spin,.btn .rst-content .fa-spin.admonition-title,.rst-content .btn .fa-spin.admonition-title,.btn .rst-content h1 .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.btn .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .btn .fa-spin.headerlink,.btn .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .fa-spin.admonition-title,.rst-content .nav .fa-spin.admonition-title,.nav .rst-content h1 .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.nav .rst-content dl dt .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.nav .fa-spin.icon{ + display:inline-block} + +.btn.fa:before,.rst-content .btn.admonition-title: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 dl dt .btn.headerlink:before,.btn.icon:before{ + opacity:0.5; + -webkit-transition:opacity 0.05s ease-in; + -moz-transition:opacity 0.05s ease-in; + transition:opacity 0.05s ease-in} + +.btn.fa:hover:before,.rst-content .btn.admonition-title: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 dl dt .btn.headerlink:hover:before,.btn.icon:hover:before{ + opacity:1} + +.btn-mini .fa:before,.btn-mini .rst-content .admonition-title:before,.rst-content .btn-mini .admonition-title:before,.btn-mini .rst-content h1 .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.btn-mini .rst-content dl dt .headerlink:before,.rst-content dl dt .btn-mini .headerlink:before,.btn-mini .icon:before{ + font-size:14px; + vertical-align:-15%} + +.wy-alert,.rst-content .note,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .warning,.rst-content .seealso,.rst-content .admonition-todo{ + padding:12px; + line-height:24px; + margin-bottom:24px; + background:#e7f2fa} + +.wy-alert-title,.rst-content .admonition-title{ + color:#fff; + font-weight:bold; + display:block; + color:#fff; + background:#6ab0de; + margin:-12px; + padding:6px 12px; + margin-bottom:12px} + +.wy-alert.wy-alert-danger,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.admonition-todo{ + background:#fdf3f2} + +.wy-alert.wy-alert-danger .wy-alert-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .danger .wy-alert-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .danger .admonition-title,.rst-content .error .admonition-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title{ + background:#f29f97} + +.wy-alert.wy-alert-warning,.rst-content .wy-alert-warning.note,.rst-content .attention,.rst-content .caution,.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.tip,.rst-content .warning,.rst-content .wy-alert-warning.seealso,.rst-content .admonition-todo{ + background:#ffedcc} + +.wy-alert.wy-alert-warning .wy-alert-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .attention .wy-alert-title,.rst-content .caution .wy-alert-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .admonition-todo .wy-alert-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .attention .admonition-title,.rst-content .caution .admonition-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .warning .admonition-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .admonition-todo .admonition-title{ + background:#f0b37e} + +.wy-alert.wy-alert-info,.rst-content .note,.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,.rst-content .seealso,.rst-content .wy-alert-info.admonition-todo{ + background:#e7f2fa} + +.wy-alert.wy-alert-info .wy-alert-title,.rst-content .note .wy-alert-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.rst-content .note .admonition-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .seealso .admonition-title,.rst-content .wy-alert-info.admonition-todo .admonition-title{ + background:#6ab0de} + +.wy-alert.wy-alert-success,.rst-content .wy-alert-success.note,.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 .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.warning,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.admonition-todo{ + background:#dbfaf4} + +.wy-alert.wy-alert-success .wy-alert-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .hint .wy-alert-title,.rst-content .important .wy-alert-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .hint .admonition-title,.rst-content .important .admonition-title,.rst-content .tip .admonition-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.admonition-todo .admonition-title{ + background:#1abc9c} + +.wy-alert.wy-alert-neutral,.rst-content .wy-alert-neutral.note,.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.tip,.rst-content .wy-alert-neutral.warning,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.admonition-todo{ + background:#f3f6f6} + +.wy-alert.wy-alert-neutral .wy-alert-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .admonition-title{ + color:#404040; + background:#e1e4e5} + +.wy-alert.wy-alert-neutral a,.rst-content .wy-alert-neutral.note 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.tip a,.rst-content .wy-alert-neutral.warning a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.admonition-todo a{ + color:#2980B9} + +.wy-alert p:last-child,.rst-content .note 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 .tip p:last-child,.rst-content .warning p:last-child,.rst-content .seealso p:last-child,.rst-content .admonition-todo p:last-child{ + margin-bottom:0} + +.wy-tray-container{ + position:fixed; + bottom:0px; + 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,0.1); + padding:0 24px; + min-width:20%; + opacity:0; + height:0; + line-height:56px; + overflow:hidden; + -webkit-transition:all 0.3s ease-in; + -moz-transition:all 0.3s ease-in; + transition:all 0.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 12px; + color:#fff; + border:1px solid rgba(0,0,0,0.1); + background-color:#27AE60; + text-decoration:none; + font-weight:normal; + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; + box-shadow:0px 1px 2px -1px rgba(255,255,255,0.5) inset,0px -2px 0px 0px rgba(0,0,0,0.1) inset; + 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 0.1s linear; + -moz-transition:all 0.1s linear; + transition:all 0.1s linear} + +.btn-hover{ + background:#2e8ece; + color:#fff} + +.btn:hover{ + background:#2cc36b; + color:#fff} + +.btn:focus{ + background:#2cc36b; + outline:0} + +.btn:active{ + box-shadow:0px -1px 0px 0px rgba(0,0,0,0.05) inset,0px 2px 0px 0px rgba(0,0,0,0.1) inset; + padding:8px 12px 6px 12px} + +.btn:visited{ + color:#fff} + +.btn:disabled{ + background-image:none; + filter:progid:DXImageTransform.Microsoft.gradient(enabled = false); + filter:alpha(opacity=40); + opacity:0.4; + cursor:not-allowed; + box-shadow:none} + +.btn-disabled{ + background-image:none; + filter:progid:DXImageTransform.Microsoft.gradient(enabled = false); + filter:alpha(opacity=40); + opacity:0.4; + cursor:not-allowed; + box-shadow:none} + +.btn-disabled:hover,.btn-disabled:focus,.btn-disabled:active{ + background-image:none; + filter:progid:DXImageTransform.Microsoft.gradient(enabled = false); + filter:alpha(opacity=40); + opacity:0.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:hover{ + background-color:transparent !important; + color:#409ad5 !important; + box-shadow:none} + +.btn-link:active{ + 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:before,.wy-btn-group:after{ + 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:solid 1px #cfd7dd; + box-shadow:0 2px 2px 0 rgba(0,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:solid 1px #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; + 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 input,.wy-form-aligned textarea,.wy-form-aligned select,.wy-form-aligned .wy-help-inline,.wy-form-aligned label{ + 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{ + border:0; + margin:0; + padding:0} + +legend{ + display:block; + width:100%; + border:0; + padding:0; + white-space:normal; + margin-bottom:24px; + font-size:150%; + *margin-left:-7px} + +label{ + display:block; + margin:0 0 0.3125em 0; + 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; + *zoom:1; + max-width:68em; + margin-left:auto; + margin-right:auto; + *zoom:1} + +.wy-control-group:before,.wy-control-group:after{ + display:table; + content:""} + +.wy-control-group:after{ + clear:both} + +.wy-control-group:before,.wy-control-group:after{ + 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 select,.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds select{ + width:100%} + +.wy-control-group .wy-form-full input[type="text"],.wy-control-group .wy-form-full input[type="password"],.wy-control-group .wy-form-full input[type="email"],.wy-control-group .wy-form-full input[type="url"],.wy-control-group .wy-form-full input[type="date"],.wy-control-group .wy-form-full input[type="month"],.wy-control-group .wy-form-full input[type="time"],.wy-control-group .wy-form-full input[type="datetime"],.wy-control-group .wy-form-full input[type="datetime-local"],.wy-control-group .wy-form-full input[type="week"],.wy-control-group .wy-form-full input[type="number"],.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="color"],.wy-control-group .wy-form-halves input[type="text"],.wy-control-group .wy-form-halves input[type="password"],.wy-control-group .wy-form-halves input[type="email"],.wy-control-group .wy-form-halves input[type="url"],.wy-control-group .wy-form-halves input[type="date"],.wy-control-group .wy-form-halves input[type="month"],.wy-control-group .wy-form-halves input[type="time"],.wy-control-group .wy-form-halves input[type="datetime"],.wy-control-group .wy-form-halves input[type="datetime-local"],.wy-control-group .wy-form-halves input[type="week"],.wy-control-group .wy-form-halves input[type="number"],.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="color"],.wy-control-group .wy-form-thirds input[type="text"],.wy-control-group .wy-form-thirds input[type="password"],.wy-control-group .wy-form-thirds input[type="email"],.wy-control-group .wy-form-thirds input[type="url"],.wy-control-group .wy-form-thirds input[type="date"],.wy-control-group .wy-form-thirds input[type="month"],.wy-control-group .wy-form-thirds input[type="time"],.wy-control-group .wy-form-thirds input[type="datetime"],.wy-control-group .wy-form-thirds input[type="datetime-local"],.wy-control-group .wy-form-thirds input[type="week"],.wy-control-group .wy-form-thirds input[type="number"],.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="color"]{ + width:100%} + +.wy-control-group .wy-form-full{ + float:left; + display:block; + margin-right:2.35765%; + 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{ + margin-right:0} + +.wy-control-group .wy-form-halves:nth-of-type(2n){ + margin-right:0} + +.wy-control-group .wy-form-halves:nth-of-type(2n+1){ + 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{ + margin-right:0} + +.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{ + margin:6px 0 0 0; + font-size:90%} + +.wy-control-no-input{ + display:inline-block; + margin:6px 0 0 0; + font-size:90%} + +.wy-control-group.fluid-input input[type="text"],.wy-control-group.fluid-input input[type="password"],.wy-control-group.fluid-input input[type="email"],.wy-control-group.fluid-input input[type="url"],.wy-control-group.fluid-input input[type="date"],.wy-control-group.fluid-input input[type="month"],.wy-control-group.fluid-input input[type="time"],.wy-control-group.fluid-input input[type="datetime"],.wy-control-group.fluid-input input[type="datetime-local"],.wy-control-group.fluid-input input[type="week"],.wy-control-group.fluid-input input[type="number"],.wy-control-group.fluid-input input[type="search"],.wy-control-group.fluid-input input[type="tel"],.wy-control-group.fluid-input input[type="color"]{ + width:100%} + +.wy-form-message-inline{ + display:inline-block; + padding-left:0.3em; + color:#666; + vertical-align:middle; + font-size:90%} + +.wy-form-message{ + display:block; + color:#999; + font-size:70%; + margin-top:0.3125em; + font-style:italic} + +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="text"],input[type="password"],input[type="email"],input[type="url"],input[type="date"],input[type="month"],input[type="time"],input[type="datetime"],input[type="datetime-local"],input[type="week"],input[type="number"],input[type="search"],input[type="tel"],input[type="color"]{ + -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 0.3s linear; + -moz-transition:border 0.3s linear; + transition:border 0.3s linear} + +input[type="datetime-local"]{ + padding:0.34375em 0.625em} + +input[disabled]{ + cursor:default} + +input[type="checkbox"],input[type="radio"]{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + padding:0; + margin-right:0.3125em; + *height:13px; + *width:13px} + +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="text"]:focus,input[type="password"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus{ + outline:0; + outline:thin dotted \9; + border-color:#333} + +input.no-focus:focus{ + border-color:#ccc !important} + +input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{ + outline:thin dotted #333; + outline:1px auto #129FEA} + +input[type="text"][disabled],input[type="password"][disabled],input[type="email"][disabled],input[type="url"][disabled],input[type="date"][disabled],input[type="month"][disabled],input[type="time"][disabled],input[type="datetime"][disabled],input[type="datetime-local"][disabled],input[type="week"][disabled],input[type="number"][disabled],input[type="search"][disabled],input[type="tel"][disabled],input[type="color"][disabled]{ + cursor:not-allowed; + background-color:#f3f6f6; + color:#cad2d3} + +input:focus:invalid,textarea:focus:invalid,select:focus:invalid{ + color:#E74C3C; + border:1px solid #E74C3C} + +input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{ + border-color:#E74C3C} + +input[type="file"]:focus:invalid:focus,input[type="radio"]:focus:invalid:focus,input[type="checkbox"]: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:0.5em 0.625em; + display:inline-block; + border:1px solid #ccc; + font-size:80%; + box-shadow:inset 0 1px 3px #ddd; + -webkit-transition:border 0.3s linear; + -moz-transition:border 0.3s linear; + transition:border 0.3s linear} + +select{ + border:1px solid #ccc; + background-color:#fff} + +select[multiple]{ + height:auto} + +select:focus,textarea:focus{ + outline:0} + +select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{ + cursor:not-allowed; + background-color:#fff; + color:#cad2d3; + border-color:transparent} + +.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:solid 1px #ccc; + color:#999} + +.wy-input-suffix .wy-input-context{ + border-left:0} + +.wy-input-prefix .wy-input-context{ + border-right:0} + +.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="text"],.wy-control-group.wy-control-group-error input[type="password"],.wy-control-group.wy-control-group-error input[type="email"],.wy-control-group.wy-control-group-error input[type="url"],.wy-control-group.wy-control-group-error input[type="date"],.wy-control-group.wy-control-group-error input[type="month"],.wy-control-group.wy-control-group-error input[type="time"],.wy-control-group.wy-control-group-error input[type="datetime"],.wy-control-group.wy-control-group-error input[type="datetime-local"],.wy-control-group.wy-control-group-error input[type="week"],.wy-control-group.wy-control-group-error input[type="number"],.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="color"]{ + border:solid 1px #E74C3C} + +.wy-control-group.wy-control-group-error textarea{ + border:solid 1px #E74C3C} + +.wy-inline-validate{ + white-space:nowrap} + +.wy-inline-validate .wy-input-context{ + padding:0.5em 0.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:0.7em 0 0} + + .wy-form input[type="text"],.wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{ + margin-bottom:0.3em; + display:block} + + .wy-form label{ + margin-bottom:0.3em; + display:block} + + .wy-form input[type="password"],.wy-form input[type="email"],.wy-form input[type="url"],.wy-form input[type="date"],.wy-form input[type="month"],.wy-form input[type="time"],.wy-form input[type="datetime"],.wy-form input[type="datetime-local"],.wy-form input[type="week"],.wy-form input[type="number"],.wy-form input[type="search"],.wy-form input[type="tel"],.wy-form input[type="color"]{ + margin-bottom:0} + + .wy-form-aligned .wy-control-group label{ + margin-bottom:0.3em; + text-align:left; + display:block; + width:100%} + + .wy-form-aligned .wy-control{ + margin:1.5em 0 0 0} + + .wy-form .wy-help-inline,.wy-form-message-inline,.wy-form-message{ + 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%} + +.wy-table,.rst-content table.docutils,.rst-content table.field-list{ + border-collapse:collapse; + border-spacing:0; + empty-cells:show; + margin-bottom:24px} + +.wy-table caption,.rst-content table.docutils caption,.rst-content table.field-list caption{ + color:#000; + font:italic 85%/1 arial,sans-serif; + padding:1em 0; + text-align:center} + +.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td,.wy-table th,.rst-content table.docutils th,.rst-content table.field-list th{ + font-size:90%; + margin:0; + overflow:visible; + padding:8px 16px} + +.wy-table td:first-child,.rst-content table.docutils td:first-child,.rst-content table.field-list td:first-child,.wy-table th:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list th:first-child{ + border-left-width:0} + +.wy-table thead,.rst-content table.docutils thead,.rst-content table.field-list thead{ + color:#000; + text-align:left; + vertical-align:bottom; + white-space:nowrap} + +.wy-table thead th,.rst-content table.docutils thead th,.rst-content table.field-list thead th{ + font-weight:bold; + border-bottom:solid 2px #e1e4e5} + +.wy-table td,.rst-content table.docutils td,.rst-content table.field-list td{ + background-color:transparent; + vertical-align:middle} + +.wy-table td p,.rst-content table.docutils td p,.rst-content table.field-list td p{ + line-height:18px} + +.wy-table td p:last-child,.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child{ + margin-bottom:0} + +.wy-table .wy-table-cell-min,.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min{ + width:1%; + padding-right:0} + +.wy-table .wy-table-cell-min input[type=checkbox],.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],.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox]{ + margin:0} + +.wy-table-secondary{ + color:gray; + font-size:90%} + +.wy-table-tertiary{ + color:gray; + font-size:80%} + +.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td,.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td{ + background-color:#f3f6f6} + +.wy-table-backed{ + background-color:#f3f6f6} + +.wy-table-bordered-all,.rst-content table.docutils{ + border:1px solid #e1e4e5} + +.wy-table-bordered-all td,.rst-content table.docutils td{ + border-bottom:1px solid #e1e4e5; + border-left:1px solid #e1e4e5} + +.wy-table-bordered-all tbody>tr:last-child td,.rst-content table.docutils 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 tbody>tr:last-child td{ + border-bottom-width:0} + +.wy-table-horizontal td,.wy-table-horizontal th{ + border-width:0 0 1px 0; + 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%; + overflow-x:hidden} + +body{ + font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif; + font-weight:normal; + color:#404040; + min-height:100%; + overflow-x:hidden; + 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} + +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; + margin:0; + font-size:16px; + margin-bottom:24px} + +h1{ + font-size:175%} + +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} + +code,.rst-content tt{ + white-space:nowrap; + max-width:100%; + background:#fff; + border:solid 1px #e1e4e5; + font-size:75%; + padding:0 5px; + font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace; + color:#E74C3C; + overflow-x:auto} + +code.code-large,.rst-content tt.code-large{ + font-size:90%} + +.wy-plain-list-disc,.rst-content .section ul,.rst-content .toctree-wrapper ul,article ul{ + list-style:disc; + line-height:24px; + margin-bottom:24px} + +.wy-plain-list-disc li,.rst-content .section ul li,.rst-content .toctree-wrapper ul li,article ul li{ + list-style:disc; + margin-left:24px} + +.wy-plain-list-disc li p:last-child,.rst-content .section ul li p:last-child,.rst-content .toctree-wrapper ul li p:last-child,article ul li p:last-child{ + margin-bottom:0} + +.wy-plain-list-disc li ul,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li ul,article ul li ul{ + margin-bottom:0} + +.wy-plain-list-disc li li,.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,article ul li li{ + list-style:circle} + +.wy-plain-list-disc li li li,.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,article ul li li li{ + list-style:square} + +.wy-plain-list-disc li ol li,.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,article ul li ol li{ + list-style:decimal} + +.wy-plain-list-decimal,.rst-content .section ol,.rst-content ol.arabic,article ol{ + list-style:decimal; + line-height:24px; + margin-bottom:24px} + +.wy-plain-list-decimal li,.rst-content .section ol li,.rst-content ol.arabic li,article ol li{ + list-style:decimal; + margin-left:24px} + +.wy-plain-list-decimal li p:last-child,.rst-content .section ol li p:last-child,.rst-content ol.arabic li p:last-child,article ol li p:last-child{ + margin-bottom:0} + +.wy-plain-list-decimal li ul,.rst-content .section ol li ul,.rst-content ol.arabic li ul,article ol li ul{ + margin-bottom:0} + +.wy-plain-list-decimal li ul li,.rst-content .section ol li ul li,.rst-content ol.arabic li ul li,article ol li ul li{ + list-style:disc} + +.codeblock-example{ + border:1px solid #e1e4e5; + border-bottom:none; + padding:24px; + padding-top:48px; + font-weight:500; + background:#fff; + position:relative} + +.codeblock-example:after{ + content:"Example"; + position:absolute; + top:0px; + left:0px; + background:#9B59B6; + color:#fff; + padding:6px 12px} + +.codeblock-example.prettyprint-example-only{ + border:1px solid #e1e4e5; + margin-bottom:24px} + +.codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight']{ + border:1px solid #e1e4e5; + padding:0px; + overflow-x:auto; + background:#fff; + margin:1px 0 24px 0} + +.codeblock div[class^='highlight'],pre.literal-block div[class^='highlight'],.rst-content .literal-block div[class^='highlight'],div[class^='highlight'] div[class^='highlight']{ + border:none; + background:none; + margin:0} + +div[class^='highlight'] td.code{ + width:100%} + +.linenodiv pre{ + border-right:solid 1px #e6e9ea; + margin:0; + padding:12px 12px; + font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace; + font-size:12px; + line-height:1.5; + color:#d9d9d9} + +div[class^='highlight'] pre{ + white-space:pre; + margin:0; + padding:12px 12px; + font-family:Consolas,"Andale Mono WT","Andale Mono","Lucida Console","Lucida Sans Typewriter","DejaVu Sans Mono","Bitstream Vera Sans Mono","Liberation Mono","Nimbus Mono L",Monaco,"Courier New",Courier,monospace; + font-size:12px; + line-height:1.5; + display:block; + overflow:auto; + color:#404040} + +@media print{ + .codeblock,pre.literal-block,.rst-content .literal-block,.rst-content pre.literal-block,div[class^='highlight'],div[class^='highlight'] pre{ + white-space:pre-wrap} + +} + +.hll{ + background-color:#ffc; + margin:0 -12px; + padding:0 12px; + display:block} + +.c{ + color:#998; + font-style:italic} + +.err{ + color:#a61717; + background-color:#e3d2d2} + +.k{ + font-weight:bold} + +.o{ + font-weight:bold} + +.cm{ + color:#998; + font-style:italic} + +.cp{ + color:#999; + font-weight:bold} + +.c1{ + color:#998; + font-style:italic} + +.cs{ + color:#999; + font-weight:bold; + font-style:italic} + +.gd{ + color:#000; + background-color:#fdd} + +.gd .x{ + color:#000; + background-color:#faa} + +.ge{ + font-style:italic} + +.gr{ + color:#a00} + +.gh{ + color:#999} + +.gi{ + color:#000; + background-color:#dfd} + +.gi .x{ + color:#000; + background-color:#afa} + +.go{ + color:#888} + +.gp{ + color:#555} + +.gs{ + font-weight:bold} + +.gu{ + color:purple; + font-weight:bold} + +.gt{ + color:#a00} + +.kc{ + font-weight:bold} + +.kd{ + font-weight:bold} + +.kn{ + font-weight:bold} + +.kp{ + font-weight:bold} + +.kr{ + font-weight:bold} + +.kt{ + color:#458; + font-weight:bold} + +.m{ + color:#099} + +.s{ + color:#d14} + +.n{ + color:#333} + +.na{ + color:teal} + +.nb{ + color:#0086b3} + +.nc{ + color:#458; + font-weight:bold} + +.no{ + color:teal} + +.ni{ + color:purple} + +.ne{ + color:#900; + font-weight:bold} + +.nf{ + color:#900; + font-weight:bold} + +.nn{ + color:#555} + +.nt{ + color:navy} + +.nv{ + color:teal} + +.ow{ + font-weight:bold} + +.w{ + color:#bbb} + +.mf{ + color:#099} + +.mh{ + color:#099} + +.mi{ + color:#099} + +.mo{ + color:#099} + +.sb{ + color:#d14} + +.sc{ + color:#d14} + +.sd{ + color:#d14} + +.s2{ + color:#d14} + +.se{ + color:#d14} + +.sh{ + color:#d14} + +.si{ + color:#d14} + +.sx{ + color:#d14} + +.sr{ + color:#009926} + +.s1{ + color:#d14} + +.ss{ + color:#990073} + +.bp{ + color:#999} + +.vc{ + color:teal} + +.vg{ + color:teal} + +.vi{ + color:teal} + +.il{ + color:#099} + +.gc{ + color:#999; + background-color:#EAF2F5} + +.wy-breadcrumbs li{ + display:inline-block} + +.wy-breadcrumbs li.wy-breadcrumbs-aside{ + float:right} + +.wy-breadcrumbs li a{ + display:inline-block; + padding:5px} + +.wy-breadcrumbs li a:first-child{ + padding-left:0} + +.wy-breadcrumbs-extra{ + margin-bottom:0; + color:#b3b3b3; + font-size:80%; + display:inline-block} + +@media screen and (max-width: 480px){ + .wy-breadcrumbs-extra{ + display:none} + + .wy-breadcrumbs li.wy-breadcrumbs-aside{ + display:none} + +} + +@media print{ + .wy-breadcrumbs li.wy-breadcrumbs-aside{ + display:none} + +} + +.wy-affix{ + position:fixed; + top:1.618em} + +.wy-menu a:hover{ + text-decoration:none} + +.wy-menu-horiz{ + *zoom:1} + +.wy-menu-horiz:before,.wy-menu-horiz:after{ + display:table; + content:""} + +.wy-menu-horiz:after{ + clear:both} + +.wy-menu-horiz ul,.wy-menu-horiz li{ + display:inline-block} + +.wy-menu-horiz li:hover{ + background:rgba(255,255,255,0.1)} + +.wy-menu-horiz li.divide-left{ + border-left:solid 1px #404040} + +.wy-menu-horiz li.divide-right{ + border-right:solid 1px #404040} + +.wy-menu-horiz a{ + height:32px; + display:inline-block; + line-height:32px; + padding:0 16px} + +.wy-menu-vertical header{ + height:32px; + display:inline-block; + line-height:32px; + padding:0 1.618em; + display:block; + font-weight:bold; + text-transform:uppercase; + font-size:80%; + color:#2980B9; + white-space:nowrap} + +.wy-menu-vertical ul{ + margin-bottom:0} + +.wy-menu-vertical li.divide-top{ + border-top:solid 1px #404040} + +.wy-menu-vertical li.divide-bottom{ + border-bottom:solid 1px #404040} + +.wy-menu-vertical li.current{ + background:#e3e3e3} + +.wy-menu-vertical li.current a{ + color:gray; + border-right:solid 1px #c9c9c9; + padding:0.4045em 2.427em} + +.wy-menu-vertical li.current a:hover{ + background:#d6d6d6} + +.wy-menu-vertical li.on a,.wy-menu-vertical li.current>a{ + color:#404040; + padding:0.4045em 1.618em; + font-weight:bold; + position:relative; + background:#fcfcfc; + border:none; + border-bottom:solid 1px #c9c9c9; + border-top:solid 1px #c9c9c9; + padding-left:1.618em -4px} + +.wy-menu-vertical li.on a:hover,.wy-menu-vertical li.current>a:hover{ + background:#fcfcfc} + +.wy-menu-vertical li.toctree-l2.current>a{ + background:#c9c9c9; + padding:0.4045em 2.427em} + +.wy-menu-vertical li.current ul{ + display:block} + +.wy-menu-vertical li ul{ + margin-bottom:0; + display:none} + +.wy-menu-vertical .local-toc li ul{ + display:block} + +.wy-menu-vertical li ul li a{ + margin-bottom:0; + color:#b3b3b3; + font-weight:normal} + +.wy-menu-vertical a{ + display:inline-block; + line-height:18px; + padding:0.4045em 1.618em; + display:block; + position:relative; + font-size:90%; + color:#b3b3b3} + +.wy-menu-vertical a:hover{ + background-color:#4e4a4a; + cursor:pointer} + +.wy-menu-vertical a:active{ + background-color:#2980B9; + cursor:pointer; + color:#fff} + +.wy-side-nav-search{ + z-index:200; + background-color:#2980B9; + text-align:center; + padding:0.809em; + display:block; + color:#fcfcfc; + margin-bottom:0.809em} + +.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 0.809em auto; + height:45px; + width:45px; + background-color:#2980B9; + padding:5px; + border-radius:100%} + +.wy-side-nav-search>a,.wy-side-nav-search .wy-dropdown>a{ + color:#fcfcfc; + font-size:100%; + font-weight:bold; + display:inline-block; + padding:4px 6px; + margin-bottom:0.809em} + +.wy-side-nav-search>a:hover,.wy-side-nav-search .wy-dropdown>a:hover{ + background:rgba(255,255,255,0.1)} + +.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 0.2s ease-in; + -moz-transition:all 0.2s ease-in; + transition:all 0.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:left repeat-y #fcfcfc; + background-image:url(data:image/png; + base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxOERBMTRGRDBFMUUxMUUzODUwMkJCOThDMEVFNURFMCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxOERBMTRGRTBFMUUxMUUzODUwMkJCOThDMEVFNURFMCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjE4REExNEZCMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjE4REExNEZDMEUxRTExRTM4NTAyQkI5OEMwRUU1REUwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+EwrlwAAAAA5JREFUeNpiMDU0BAgwAAE2AJgB9BnaAAAAAElFTkSuQmCC); + background-size:300px 1px} + +.wy-grid-for-nav{ + position:absolute; + width:100%; + height:100%} + +.wy-nav-side{ + position:absolute; + top:0; + left:0; + width:300px; + overflow:hidden; + min-height:100%; + background:#343131; + z-index:200} + +.wy-nav-top{ + display:none; + background:#2980B9; + color:#fff; + padding:0.4045em 0.809em; + position:relative; + line-height:50px; + text-align:center; + font-size:100%; + *zoom:1} + +.wy-nav-top:before,.wy-nav-top:after{ + display:table; + content:""} + +.wy-nav-top:after{ + clear:both} + +.wy-nav-top a{ + color:#fff; + font-weight:bold} + +.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} + +.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,0.2); + display:none; + z-index:499} + +.wy-body-mask.on{ + display:block} + +footer{ + color:#999} + +footer p{ + margin-bottom:12px} + +.rst-footer-buttons{ + *zoom:1} + +.rst-footer-buttons:before,.rst-footer-buttons:after{ + display:table; + content:""} + +.rst-footer-buttons:after{ + clear:both} + +#search-results .search li{ + margin-bottom:24px; + border-bottom:solid 1px #e1e4e5; + padding-bottom:24px} + +#search-results .search li:first-child{ + border-top:solid 1px #e1e4e5; + padding-top:24px} + +#search-results .search li a{ + font-size:120%; + margin-bottom:12px; + display:inline-block} + +#search-results .context{ + color:gray; + font-size:90%} + +@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-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: 1400px){ + .wy-nav-content-wrap{ + background:rgba(0,0,0,0.05)} + + .wy-nav-content{ + margin:0; + background:#fcfcfc} + +} + +@media print{ + .rst-versions,footer,.wy-nav-side{ + display:none} + + .wy-nav-content-wrap{ + margin-left:0} + +} + +nav.stickynav{ + position:fixed; + top:0} + +.rst-versions{ + position:fixed; + bottom:0; + left:0; + width:300px; + color:#fcfcfc; + background:#1f1d1d; + border-top:solid 10px #343131; + 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:before,.rst-versions .rst-current-version:after{ + display:table; + content:""} + +.rst-versions .rst-current-version:after{ + clear:both} + +.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-versions .rst-current-version .icon{ + color:#fcfcfc} + +.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{ + float:left} + +.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 .rst-other-versions{ + display:block} + +.rst-versions .rst-other-versions{ + font-size:90%; + padding:12px; + color:gray; + display:none} + +.rst-versions .rst-other-versions hr{ + display:block; + height:1px; + border:0; + margin:20px 0; + padding:0; + border-top:solid 1px #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} + +.rst-versions.rst-badge .icon-book{ + float:none} + +.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{ + float:none} + +.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.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} + + img{ + width:100%; + height:auto} + +} + +.rst-content img{ + max-width:100%; + height:auto !important} + +.rst-content div.figure{ + margin-bottom:24px} + +.rst-content div.figure.align-center{ + text-align:center} + +.rst-content .section>img,.rst-content .section>a>img{ + margin-bottom:24px} + +.rst-content blockquote{ + margin-left:24px; + line-height:24px; + margin-bottom:24px} + +.rst-content .note .last,.rst-content .attention .last,.rst-content .caution .last,.rst-content .danger .last,.rst-content .error .last,.rst-content .hint .last,.rst-content .important .last,.rst-content .tip .last,.rst-content .warning .last,.rst-content .seealso .last,.rst-content .admonition-todo .last{ + margin-bottom:0} + +.rst-content .admonition-title:before{ + margin-right:4px} + +.rst-content .admonition table{ + border-color:rgba(0,0,0,0.1)} + +.rst-content .admonition table td,.rst-content .admonition table th{ + background:transparent !important; + border-color:rgba(0,0,0,0.1) !important} + +.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{ + list-style:upper-alpha} + +.rst-content .section ol p,.rst-content .section ul p{ + margin-bottom:12px} + +.rst-content .line-block{ + margin-left:24px} + +.rst-content .topic-title{ + font-weight:bold; + margin-bottom:12px} + +.rst-content .toc-backref{ + color:#404040} + +.rst-content .align-right{ + float:right; + margin:0px 0px 24px 24px} + +.rst-content .align-left{ + float:left; + margin:0px 24px 24px 0px} + +.rst-content .align-center{ + margin:auto; + display:block} + +.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 dl dt .headerlink{ + display:none; + visibility:hidden; + font-size:14px} + +.rst-content h1 .headerlink:after,.rst-content h2 .headerlink:after,.rst-content h3 .headerlink:after,.rst-content h4 .headerlink:after,.rst-content h5 .headerlink:after,.rst-content h6 .headerlink:after,.rst-content dl dt .headerlink:after{ + visibility:visible; + content:""; + font-family:FontAwesome; + display:inline-block} + +.rst-content h1:hover .headerlink,.rst-content h2:hover .headerlink,.rst-content h3:hover .headerlink,.rst-content h4:hover .headerlink,.rst-content h5:hover .headerlink,.rst-content h6:hover .headerlink,.rst-content dl dt:hover .headerlink{ + display:inline-block} + +.rst-content .sidebar{ + float:right; + width:40%; + display:block; + margin:0 0 24px 24px; + padding:24px; + background:#f3f6f6; + border:solid 1px #e1e4e5} + +.rst-content .sidebar p,.rst-content .sidebar ul,.rst-content .sidebar dl{ + font-size:90%} + +.rst-content .sidebar .last{ + margin-bottom:0} + +.rst-content .sidebar .sidebar-title{ + display:block; + font-family:"Roboto Slab","ff-tisa-web-pro","Georgia",Arial,sans-serif; + font-weight:bold; + background:#e1e4e5; + padding:6px 12px; + margin:-24px; + margin-bottom:24px; + font-size:100%} + +.rst-content .highlighted{ + background:#F1C40F; + display:inline-block; + font-weight:bold; + padding:0 6px} + +.rst-content .footnote-reference,.rst-content .citation-reference{ + vertical-align:super; + font-size:90%} + +.rst-content table.docutils.citation,.rst-content table.docutils.footnote{ + background:none; + border:none; + color:#999} + +.rst-content table.docutils.citation td,.rst-content table.docutils.citation tr,.rst-content table.docutils.footnote td,.rst-content table.docutils.footnote tr{ + border:none; + background-color:transparent !important; + white-space:normal} + +.rst-content table.docutils.citation td.label,.rst-content table.docutils.footnote td.label{ + padding-left:0; + padding-right:0; + vertical-align:top} + +.rst-content table.field-list{ + border:none} + +.rst-content table.field-list td{ + border:none; + padding-top:5px} + +.rst-content table.field-list td>strong{ + display:inline-block; + margin-top:3px} + +.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; + padding-left:0} + +.rst-content tt{ + color:#000} + +.rst-content tt big,.rst-content tt em{ + font-size:100% !important; + line-height:normal} + +.rst-content tt .xref,a .rst-content tt{ + font-weight:bold} + +.rst-content a tt{ + color:#2980B9} + +.rst-content dl{ + margin-bottom:24px} + +.rst-content dl dt{ + font-weight:bold} + +.rst-content dl p,.rst-content dl table,.rst-content dl ul,.rst-content dl ol{ + margin-bottom:12px !important} + +.rst-content dl dd{ + margin:0 0 12px 24px} + +.rst-content dl:not(.docutils){ + margin-bottom:24px} + +.rst-content dl:not(.docutils) dt{ + display:inline-block; + margin:6px 0; + font-size:90%; + line-height:normal; + background:#e7f2fa; + color:#2980B9; + border-top:solid 3px #6ab0de; + padding:6px; + position:relative} + +.rst-content dl:not(.docutils) dt:before{ + color:#6ab0de} + +.rst-content dl:not(.docutils) dt .headerlink{ + color:#404040; + font-size:100% !important} + +.rst-content dl:not(.docutils) dl dt{ + margin-bottom:6px; + border:none; + border-left:solid 3px #ccc; + background:#f0f0f0; + color:gray} + +.rst-content dl:not(.docutils) dl dt .headerlink{ + color:#404040; + font-size:100% !important} + +.rst-content dl:not(.docutils) dt:first-child{ + margin-top:0} + +.rst-content dl:not(.docutils) tt{ + font-weight:bold} + +.rst-content dl:not(.docutils) tt.descname,.rst-content dl:not(.docutils) tt.descclassname{ + background-color:transparent; + border:none; + padding:0; + font-size:100% !important} + +.rst-content dl:not(.docutils) tt.descname{ + font-weight:bold} + +.rst-content dl:not(.docutils) .optional{ + display:inline-block; + padding:0 4px; + color:#000; + font-weight:bold} + +.rst-content dl:not(.docutils) .property{ + display:inline-block; + padding-right:8px} + +.rst-content .viewcode-link,.rst-content .viewcode-back{ + 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:bold} + +@media screen and (max-width: 480px){ + .rst-content .sidebar{ + width:100%} + +} + +span[id*='MathJax-Span']{ + color:#404040} + +.math{ + text-align:center} + + +/*# sourceMappingURL=theme.css.map */ diff --git a/docs/content/css/search.css b/docs/content/css/search.css new file mode 100644 index 0000000..7be21f9 --- /dev/null +++ b/docs/content/css/search.css @@ -0,0 +1,47 @@ +/* -*- mode: css -*- */ + +/* read-the-org search styles, v1.6 */ + +#search-container { + padding: 10px; + background-color: #343131; +} + +#search-input { + width: 100%; + padding: 5px; + border: 1px solid #ccc; + border-radius: 4px; + font-size: 14px; +} + +#search-results { + list-style-type: none; + padding: 0; + margin: 10px 0 0 0; + max-height: 300px; + overflow-y: auto; +} + +#search-results li { + background-color: #2980B9; + color: white; + margin-bottom: 5px; + padding: 5px; + border-radius: 4px; + cursor: pointer; + font-size: 14px; +} + +#search-results li:hover { + background-color: #3091d1; +} + +#search-description { + color: #b3b3b3; /* Lighter color, matching the TOC text color in readtheorg.css */ +} + +mark { + background-color: yellow; + color: black; +} diff --git a/docs/content/header.org b/docs/content/header.org new file mode 100644 index 0000000..d2f35cd --- /dev/null +++ b/docs/content/header.org @@ -0,0 +1,3 @@ +#+OPTIONS: ^:nil +| [[./index.org][Home]] |[[./FTLE_example.org][Settings File]] | + diff --git a/docs/content/index.org b/docs/content/index.org new file mode 100644 index 0000000..e1ca632 --- /dev/null +++ b/docs/content/index.org @@ -0,0 +1,13 @@ +#+SETUPFILE: ../org-themes/theme-readtheorg.setup +#+INCLUDE: "./header.org" +* Welcome +Welcome to the flowVC documentation. +* Input Data Files +#+INCLUDE: "./vtu_2bin.org::Data Format" + + +* Setting File +The input settings are controlled using a settings.in file + + +For an example input file [[./FTLE_example.org][Click Here]] diff --git a/docs/content/js/readtheorg.js b/docs/content/js/readtheorg.js new file mode 100644 index 0000000..355cbf3 --- /dev/null +++ b/docs/content/js/readtheorg.js @@ -0,0 +1,145 @@ +function collapse_toc_elements_on_click (nav_li_a){ + /* + When an `a' element in the TOC is clicked, its parent + `li' element's active attribute is toggled. This causes + the element to toggle between minimized and maximized + states. The active attribute is documented in bootstrap. + https://getbootstrap.com/docs/4.0/components/navbar/#nav + */ + $(nav_li_a).parent().toggleClass("active"); +} + +$( document ).ready(function() { + // When the document is loaded and ready, bind the + // function `collapse_toc_elements_on_click' to the + // `a' elements in the table of contents. + $("#text-table-of-contents a").click(function() { + collapse_toc_elements_on_click(this); + }); +}); + +$(function() { + function replace_admonition (tag, map, language) { + var language = document.documentElement.lang; + var translations = map.get(tag); + var readable = translations.get(language) || translations.get("en"); // fallback to english + $(`span.${tag}:not(#table-of-contents *)`) .parent().parent() + .replaceWith(`

${readable}

`); + $(`div.${tag}`).before(`

${readable}

`) + } + const map = new Map() + .set("note", new Map() + .set("en", "Note") + .set("de", "Hinweis")) + .set("seealso", new Map() + .set("en", "See also") + .set("de", "Siehe auch")) + .set("warning", new Map() + .set("en", "Warning") + .set("de", "Warnung")) + .set("caution", new Map() + .set("en", "Caution") + .set("de", "Vorsicht")) + .set("attention", new Map() + .set("en", "Attention") + .set("de", "Obacht")) + .set("tip", new Map() + .set("en", "Tip") + .set("de", "Tipp")) + .set("important", new Map() + .set("en", "Important") + .set("de", "Wichtig")) + .set("hint", new Map() + .set("en", "Hint") + .set("de", "Hinweis")) + .set("error", new Map() + .set("en", "Error") + .set("de", "Fehler")) + .set("danger", new Map() + .set("en", "Danger") + .set("de", "Gefahr")) + ; + replace_admonition('note', map); + replace_admonition('seealso', map); + replace_admonition('warning', map); + replace_admonition('caution', map); + replace_admonition('attention', map); + replace_admonition('tip', map); + replace_admonition('important', map); + replace_admonition('hint', map); + replace_admonition('error', map); + replace_admonition('danger', map); +}); + +$( document ).ready(function() { + + // Shift nav in mobile when clicking the menu. + $(document).on('click', "[data-toggle='wy-nav-top']", function() { + $("[data-toggle='wy-nav-shift']").toggleClass("shift"); + $("[data-toggle='rst-versions']").toggleClass("shift"); + }); + // Close menu when you click a link. + $(document).on('click', ".wy-menu-vertical .current ul li a", function() { + $("[data-toggle='wy-nav-shift']").removeClass("shift"); + $("[data-toggle='rst-versions']").toggleClass("shift"); + }); + $(document).on('click', "[data-toggle='rst-current-version']", function() { + $("[data-toggle='rst-versions']").toggleClass("shift-up"); + }); + // Make tables responsive + $("table.docutils:not(.field-list)").wrap("
"); +}); + +$( document ).ready(function() { + $('#text-table-of-contents ul').first().addClass('nav'); + // ScrollSpy also requires that we use + // a Bootstrap nav component. + $('body').scrollspy({target: '#text-table-of-contents'}); + + // DON'T add sticky table headers (Fix issue #69?) + // $('table').stickyTableHeaders(); + + // set the height of tableOfContents + var $postamble = $('#postamble'); + var $tableOfContents = $('#table-of-contents'); + $tableOfContents.css({paddingBottom: $postamble.outerHeight()}); + + // add TOC button + var toggleSidebar = $(''); + $('#content').prepend(toggleSidebar); + + // add close button when sidebar showed in mobile screen + var closeBtn = $('Close'); + var tocTitle = $('#table-of-contents').find('h2'); + tocTitle.append(closeBtn); +}); + +window.SphinxRtdTheme = (function (jquery) { + var stickyNav = (function () { + var navBar, + win, + stickyNavCssClass = 'stickynav', + applyStickNav = function () { + if (navBar.height() <= win.height()) { + navBar.addClass(stickyNavCssClass); + } else { + navBar.removeClass(stickyNavCssClass); + } + }, + enable = function () { + applyStickNav(); + win.on('resize', applyStickNav); + }, + init = function () { + navBar = jquery('nav.wy-nav-side:first'); + win = jquery(window); + }; + jquery(init); + return { + enable : enable + }; + }()); + return { + StickyNav : stickyNav + }; +}($)); diff --git a/docs/content/js/search.js b/docs/content/js/search.js new file mode 100644 index 0000000..99b676c --- /dev/null +++ b/docs/content/js/search.js @@ -0,0 +1,187 @@ +// -*- mode: js2 -*- + +// read-the-org-search + +// Configuration +const SEARCH_VERSION = "v1.12"; + +// Default configuration +window.searchConfig = { + enableSearch: true, + searchResultLimit: 0 +}; + +// Configuration function + + +function enableSearch(enableSearch, searchResultLimit) { + window.searchConfig.enableSearch = true; +} + + +function disableSearch() { + window.searchConfig.enableSearch = false; +} + + +function setSearchLimit(searchResultLimit) { + window.searchConfig.searchResultLimit = searchResultLimit; +} + + +console.log(`custom-search.js ${SEARCH_VERSION} is being loaded`); + + +$(document).ready(function() { + console.log(`Document ready, initializing search ${SEARCH_VERSION}`); + + const ENABLE_SEARCH = window.searchConfig.enableSearch; + const SEARCH_RESULT_LIMIT = window.searchConfig.searchResultLimit; + + if (!ENABLE_SEARCH) { + console.log('Search functionality is disabled'); + return; + } + + $('#table-of-contents').prepend(` +
+ + +
Type to search the document. Use arrow keys to navigate results.
+
    +
    + `); + + const searchInput = $('#search-input'); + const searchResults = $('#search-results'); + const searchDescription = $('#search-description'); + const content = $('#content'); + let searchIndex = []; + + function createSearchIndex() { + console.log('Creating search index'); + content.find('h1, h2, h3, h4, h5, h6, p').each(function() { + const element = $(this); + const text = element.text().trim(); + if (text) { + searchIndex.push({ + text: text.toLowerCase(), + element: element, + type: element.prop('tagName').toLowerCase() + }); + } + }); + console.log(`Search index created with ${searchIndex.length} items`); + } + + createSearchIndex(); + + function debounce(func, wait) { + let timeout; + return function executedFunction(...args) { + const later = () => { + clearTimeout(timeout); + func(...args); + }; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + }; + } + + function highlightText(text, term) { + const regex = new RegExp(`(${term})`, 'gi'); + return text.replace(regex, '$1'); + } + + function performSearch() { + const searchTerm = searchInput.val().toLowerCase(); + searchResults.empty(); + + if (searchTerm.length === 0) { + searchDescription.show(); + searchResults.hide(); + return; + } + + searchDescription.hide(); + searchResults.show(); + + if (searchTerm.length < 3) { + searchResults.html('
  • Please enter at least 3 characters
  • '); + return; + } + + const matches = searchIndex.filter(item => item.text.includes(searchTerm)); + + if (matches.length === 0) { + searchResults.append('
  • No results found
  • '); + return; + } + + // Apply the search result limit + const limitedMatches = SEARCH_RESULT_LIMIT > 0 ? matches.slice(0, SEARCH_RESULT_LIMIT) : matches; + + limitedMatches.forEach((match, index) => { + const snippet = match.text.length > 100 ? match.text.substr(0, 100) + '...' : match.text; + const highlightedSnippet = highlightText(snippet, searchTerm); + const li = $(`
  • ${highlightedSnippet}
  • `); + li.data('element', match.element); + searchResults.append(li); + }); + + searchResults.children().first().attr('tabindex', '0'); + } + + const debouncedSearch = debounce(performSearch, 300); + + searchInput.on('input', debouncedSearch); + + searchResults.on('click keypress', 'li', function(e) { + if (e.type === 'click' || (e.type === 'keypress' && e.which === 13)) { + const element = $(this).data('element'); + const searchTerm = searchInput.val(); + + // Remove existing highlights + content.find('mark').each(function() { + const text = $(this).text(); + $(this).replaceWith(text); + }); + + // Highlight all occurrences + element.html(highlightText(element.text(), searchTerm)); + + // Scroll to element + $('html, body').animate({ + scrollTop: element.offset().top - 50 + }, 500); + + // Set focus to the highlighted element + element.attr('tabindex', '-1').focus(); + } + }); + + // Keyboard navigation for search results + searchResults.on('keydown', 'li', function(e) { + const current = $(this); + let target; + + switch(e.which) { + case 38: // Up arrow + target = current.prev(); + break; + case 40: // Down arrow + target = current.next(); + break; + default: return; + } + + if (target.length > 0) { + current.attr('tabindex', '-1'); + target.attr('tabindex', '0').focus(); + } + + e.preventDefault(); + }); + + console.log(`Search ${SEARCH_VERSION} initialization complete`); +}); diff --git a/docs/content/vtu_2bin.org b/docs/content/vtu_2bin.org new file mode 100644 index 0000000..8b767d9 --- /dev/null +++ b/docs/content/vtu_2bin.org @@ -0,0 +1,103 @@ +#+SETUPFILE: ../org-themes/theme-readtheorg.setup +#+OPTIONS: ^:nil + +#+INCLUDE: "./header.org" + + + +* Data Format +To use flowVC, you'll need to supply velocity data in binary format. The velocity data typically requires separate files for the velocity field at each time point. A single (Cartesian) or multiple (Unstructured) files define the mesh. These files all share a common prefix, which can be any name you choose and is referred to here as InFilePrefix. + + +** Velocity +If the velocity is defined discretely in time, each time instant should have its own separate file. The velocity data must be equally spaced in time. File names should follow the format InFilePrefix_vel.#.bin, where # is a unique index for each time instant. The difference between successive file time points must be consistent + +Each file's content should begin with a time stamp, followed by the velocity vectors at each node. + +\begin{equation} +t_s \; \underbrace{u_0\; v_0\; w_0}_{\text{node 0}} \underbrace{u_1\; v_1 \; w_1}_{\text{node 1}} ....\; \underbrace{u_{n-1} \; v_{n-1}\; w_{n-1}}_{\text{node n-1}} +\end{equation} + +- Cartesian Data: the order should loop over the x-direction in the innermost loop, followed by y, and then z in the outer loop. +- Unstructured Data: The ordering must align with the nodes specified in the InFilePrefix coordinates.#.bin file. +- 2D Data: you must still specify a third velocity component, $w_i$, which can be set to 0.0. +#+ATTR_HTML: :width 100% +| Value | Data Type | +|-------+-----------| +| t | double | +| u,v,w | double | + + + +** Cartesian Mesh +To define a cartesian mesh, the mesh bounds and resolution needs to be defined. + + \begin{equation} + x_{min} \;\; x_{max} \;\; x_{res} \;\; y_{min} \;\; y_{max}\;\; y_{res} \;\; z_{min} \;\; z_{max} \; \; z_{res} + \end{equation} + +- Resolution: Number of *nodes* in each direction (not intervals) +- 2D: Set $z_{min} = z_{max} = 0.0$ and $z_{res}=1$ +#+Latex: \hfill +#+ATTR_HTML: :width 100% +| | | +| Value | Type | +|---------+--------| +| min/max | double | +| res | int | + +** Unstructured Mesh +The unstructured mesh is defined by three files: +- Coordinates File : InFilePrefix_coordinates.bin +- Connectivity File: InFilePrefix_connectivity.bin +- Adjacency File: InFilePrefix_adjacency.bin + +*** Cordinates File +\begin{equation} +n \; \underbrace{x_0\; y_0\; z_0}_{\text{node 0}} \underbrace{x_1\; y_1 \; z_1}_{\text{node 1}} ....\; \underbrace{x_{n-1} \; y_{n-1}\; z_{n-1}}_{\text{node n-1}} +\end{equation} + +- n: The the number of points in the data set +- $x_i \; y_i \; z_i$: The cordinates of each node +- 2D: set $z_i = 0$ + + +#+ATTR_HTML: :width 100% +| Value | Data Type | +|---------------------+-----------| +| n | int | +| $x_i \; y_i \; z_i$ | double | +*** Connectivity +The connectivity specifies the indices of the 4 nodes that make up each element. The index of each node is based on coordinates file ordering counting from 0. + + \begin{equation} + e\; \underbrace{i_0^0\; i_0^1\; i_0^2\; i_0^3}_{\text{element 0}} \underbrace{i_1^0\; i_1^1\; i_1^2\; i_1^3}_{\text{element 1}} ... \underbrace{i_{e-1}^0\; i_{e-1}^1\; i_{e-1}^2\; i_{e-1}^3}_{\text{element e-1}} + \end{equation} + + - e: The number of elements in the data set + - $i_i^j$: The index of the j'th node making i'th element in the dataset + - 2D: $n_i^3 = -1$ + + #+ATTR_HTML: :width 100% +| Value | Data Type | +|---------+-----------| +| e | int | +| $i_i^j$ | int | + + +*** Adjacency +The adjacency file contains the indices of the adacent elements that share a face with the current element. The index of each element is based on the order of the connectivity file. + + \begin{equation} + e\; \underbrace{e_0^0\; e_0^1\; e_0^2\; e_0^3}_{\text{element 0}} \underbrace{e_1^0\; e_1^1\; e_1^2\; e_1^3}_{\text{element 1}} ... \underbrace{e_{e-1}^0\; e_{e-1}^1\; e_{e-1}^2\; e_{e-1}^3}_{\text{element e-1}} + \end{equation} + + - Boundary Elements: For faces not shared with other elements set $e=-1$ + - 2D: $e_i^3=-1$ + - Ordering: +**** Data Type +e(int): The number of elements in the data set +$e_i^j$ (int): The index of the element that shares the j'th face for the ith element in the dataset. Note if the element face is not shared with another element (i.e. on the edge this is a -1) + + + diff --git a/docs/org-themes/theme-readtheorg.setup b/docs/org-themes/theme-readtheorg.setup new file mode 100644 index 0000000..964acb0 --- /dev/null +++ b/docs/org-themes/theme-readtheorg.setup @@ -0,0 +1,30 @@ +# -*- mode: org; -*- + +#+OPTIONS: html-style:nil +#+HTML_HEAD: +#+HTML_HEAD: + +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: +#+HTML_HEAD: + + +#+MACRO: enable-search #+HTML_HEAD: +#+MACRO: disable-search #+HTML_HEAD: +#+MACRO: set-search-limit #+HTML_HEAD: + +* Search Configuration (v1.12) :noexport: + +Usage: Optionally place these macros after including this file, before your content. + +- {{{enable-search}}} :: Enable search bar (default) +- {{{disable-search}}} :: Disable search bar +- {{{set-search-limit(N)}}} :: Limit results to N (default: 0 for no limit) + +Example: + +#+begin_src org +{{{enable-search}}} +{{{set-search-limit(10)}}} +#+end_src diff --git a/examples/inputfile.in b/examples/inputfile.in new file mode 100644 index 0000000..abd3807 --- /dev/null +++ b/examples/inputfile.in @@ -0,0 +1,345 @@ +################################# flowVC INPUT FILE ##################################### +# +# NOTE: Order of parameters listed must be maintained for proper parsing of input file +# Comment lines begin with #, comments can be added or removed as desired +# Comments cannot occur on lines containing variable declartations +# Standard format: VARIABLE_NAME = VALUE +# +####################################################################################### + +# Path_Data: String, Directory containing data files, e.g. velocity data, etc. +# Can be set to pwd (i.e. present working directory) +Path_Data = ../bin/ + +# Path_Output: String, Directory where output files will be written +# Can be set to pwd (i.e. present working directory) +Path_Output = ../output/ + +# Dimensions: Integer, Specifies if velocity data is 2D or 3D +Dimensions = 2 + +# Data_MeshType: Integer, Specifies mesh type of velocity data +# 0: Cartesian +# You will need files Data_InFilePrefix_vel.*.bin and Data_InFilePrefix_Cartesian.bin +# 1: Unstructured (tetrahedral for 3D and triangular for 2D) +# You will need files Data_InFilePrefix_vel.*.bin and Data_InFilePrefix_coordinates.bin, +# Data_InFilePrefix_connectivity.bin and Data_InFilePrefix_adjacency.bin +Data_MeshType = 0 + +# Data_InFilePrefix: String, common prefix for input velocity files (see minimum files needed above) +Data_InFilePrefix = dg + +# Data_SuffixTMin: Integer, number appended to the name of first velocity data file +# Assumes naming convention of Data_InFilePrefix_vel.N.bin, where Data_InFilePrefix is +# specified above and N varies from Data_SuffixTMin to (Data_SuffixTMin + Data_SuffixTDelta * Data_SuffixTRes) +Data_SuffixTMin = 0 + +# Data_SuffixTDelta: Integer, Increment between successive velocity data files +Data_SuffixTDelta = 1 + +# Data_SuffixTRes: Integer, number of velocity data files +Data_TRes = 51 + +# Data_TDelta: (Positive) Float, actual time spacing between successive velocity data files +# Assumes time spacing between velocity data files is constant +Data_TDelta = 0.02 + +# Data_TMin: Float, actual time assigned to first velocity data file +# Choice is arbitrary, but it usually makes sense to set this to 0.0, which would +# imply that the first velocity data file specifies the velocity at time 0.0 +Data_TMin = 0.0 + +# Data_TPeriodic: Binary flag, Specifies if data is periodic in time +# 0: Not periodic +# 1: Periodic (make sure first and last data file correspond to same point in cycle) +Data_TPeriodic = 1 + +# Data_XPeriodic: Binary flag, Specifies if data is periodic in space +# 0: Not periodic +# 1: Periodic +Data_XPeriodic = 0 + +# Data_MeshBounds.XMin, ..., Data_MeshBounds.ZMax: Specifies bounding box of velocity data +# Setting these bounds LARGER than the actual velocity domain will NOT affect the results +# Setting these bounds SMALLER than the actual velocity domain WILL limit the velocity data considered +Data_MeshBounds.XMin = 0.0 +Data_MeshBounds.XMax = 2.0 +Data_MeshBounds.YMin = 0.0 +Data_MeshBounds.YMax = 1.0 +Data_MeshBounds.ZMin = 0.0 +Data_MeshBounds.ZMax = 0.0 + +# Fluid_Density: Float, specifies fluid density (use consistent units) +# Valid only if Particle_Radius > 0 +Fluid_Density = 1.0 + +# Fluid_Viscosity: Float, specifies fluid viscosity (use consistent units) +# Valid only if Particle_Radius > 0 +Fluid_Viscosity = 1.0 + +# Output_TStart: Float, initial time to start simulation and begin writing output +# If FTLE_Compute = 1: Specifies time at which first FTLE field is computed AND output +# If Trace_Compute = 1: Specifies start time to begin computing tracer trajectories AND outputting positions to file +Output_TStart = 0.0 + +# Output_TRes: (Positive) Integer, Number of output times +# If FTLE_Compute: Specifies number of time instances when the FTLE field will be computed AND output +# If Trace_Compute: Specifies number of time instances that tracer positions will be output to file +Output_TRes = 11 + +# Output_TDelta: (Positive) Float, Time between successive output +# If FTLE_Compute: How often the FTLE field will be computed AND output +# If Trace_Compute: How often the tracer positions will be output to file +Output_TDelta = 0.1 + +# Int_Type: Integer, specified integration routine used +# 0: Euler +# 1: 4th order Runge Kutta +# 2: Runge Kutta Fehlberg (adaptive time stepping) +Int_Type = 1 + +# Int_TimeStep: (Positive) Float, Time step used for integration Euler or RK4 routines (i.e. Int_Type = 0 or 1) +# Valid only for Int_Type = 0 or 1 +Int_TimeStep = 0.001 + +# Int_Accuracy: (Positive) Float, Absolute error tolorance (between RK4 and RK5) +# Valid only for Int_Type = 2 +Int_Accuracy = 0.001 + +# Int_MinTimeStep: (Positive) Float, Minimum allowable time step used in RKF routine +# Once this time step is reached, RK4 approximation automatically accepted +# Valid only for Int_Type = 2 +Int_MinTimeStep = 0.00001 + +# Int_MaxTimeStep: (Positive) Float, Maximum allowable time step used in RKF routine +# Time step will not be increased beyond this limit even if error between RK4 and RK5 is less than Int_Accuracy +# Valid only for Int_Type = 2 +Int_MaxTimeStep = 0.1 + +# Int_TimeDirection: Integer, Should be set to 1 or -1 +# 1: Advect particles forward in time +# -1: Advect particles backward in time (used to compute backward time FTLE field) +Int_TimeDirection = 1 + +# Int_NormalFlow: Binary flag +# 0: Do not impose inward flow on no-slip boundaries +# 1: Replace no-slip condition on boundaries with inward velocity (magnitude specified by NormalFlowScaling below) +# Requires the file Data_InFilePrefix_normals.bin generated from program GetNormals.exe +# Currently valid only for Data_MeshType = 1 +Int_NormalFlow = 0 + +# Int_NormalFlowScaling: Float, Scaling for inward pointing boundary velocity (to prevent tracers from crossing +# no-slip boundaries), Need to set the number negative if file contains outward normals +# Valid only for Data_MeshType = 1, Int_NormalFlow = 1 +Int_NormalFlowScaling = 1.0 + +# Int_Extrapolate: Integer, allows particles to be integrated outside of domain of data by extrapolation of data set +# 0: End integration once particle leaves domain (or subset defined by Data_MeshBounds above). +# Computes FTLE for such points (and neighbors) early. +# 1: Extrapolate velocity outside domain by continuing particle with exit velocity (usually better than below) +# 2: Linear extrapolation of entire data set (NOT recommended unless you know what you're doing) +Int_Extrapolate = 0 + +# Particle_Radius: Float, Radius of all things treated as Lagrangian points +# Set to zero if you want points to behave as perfect tracers (recommended unless you know what you're doing) +Particle_Radius = 0.0 + +# Particle_Density: Float, Mass density of all things treated as Lagrangian points +# Respectively, set =, >, or < fluid density for neutrally buoyant, aerosols, or bubbles +# Only valid if Particle_Radius > 0 +Particle_Density = 1.0 + +# Particle_ICType: Int, Specified type of initial condition assigned to particles +# 0: Start particles from rest +# 1: Start particles with velocity equal to fluid velocity at particle release location (recommended) +# Valid only if Particle_Radius > 0 +Particle_ICType = 1 + +# Gravity_Vector[i]: Floats, Specifies components of gravity vector (use consistent units) +# Valid only if Particle_Radius > 0 +Gravity_Vector[0] = 0.0 +Gravity_Vector[1] = 0.0 +Gravity_Vector[2] = 0.0 + +# Local_Search_Checking: Binary flag +# 0: Only use local search protocol to determine elements containing initial location of points +# where velocity will need to be interpolated (recommended) +# 1: Use global search to check failures of local search protocol (safest, but can be painfully slow +# if you're not careful) +# Valid only if Data_MeshType = 1 +LocalSearchChecking = 0 + +# FTLE_Compute: Binary flag +# 0: Do not compute FTLE fields +# 1: Compute FTLE fields (Trace_Compute MUST be 0) +FTLE_Compute = 1 + +# FTLE_GenerateMesh: Binary flag +# 0: Read in FTLE mesh data from file FTLE_ICFile (this file created by running flowVC with FTLE_GenerateMesh = 1) +# 1: Generate a Cartesian mesh over which FTLE will be computed (mesh parameters specified below, resulting data +# saved to file FTLE_ICFile) +# Valid only if FTLE_Compute = 1 +FTLE_GenerateMesh = 1 + +# FTLE_ICFile: String, Name of file storing FTLE mesh information +# If FTLE_GenerateMesh = 0, this file should be located in Path_Work directory +# If FTLE_GenerateMesh = 0, this file will be written to Path_Work directory +# Valid only if FTLE_Compute = 1 +FTLE_ICFile = dg_FTLEgrid + +# FTLE_MeshBounds.XMin, ..., FTLE_MeshBounds.ZRes: Specifies structured grid over which FTLE is computed +# Valid only if FTLE_Compute = 1 +FTLE_MeshBounds.XMin = 0.0 +FTLE_MeshBounds.XMax = 2.0 +FTLE_MeshBounds.YMin = 0.0 +FTLE_MeshBounds.YMax = 1.0 +FTLE_MeshBounds.ZMin = 0.0 +FTLE_MeshBounds.ZMax = 0.0 +FTLE_MeshBounds.XRes = 201 +FTLE_MeshBounds.YRes = 101 +FTLE_MeshBounds.ZRes = 1 + +# FTLE_IntTLength: (Positive) Float, Integration time used to compute FTLE +# Valid only if FTLE_Compute = 1 +FTLE_IntTLength = 1.0 + +# FTLE_ComputeVariation: Binary flag, Used to help determine appropriate integration time by ah hoc means +# 0: Compute FTLE at each output time with integration time set to FTLE_IntTimeLength (nominally, can be reduced when a tracer leaves early) +# 1: Compute variation of FTLE with integration time +# Output_TRes MUST be 1 if FTLE_ComputeVariation = 1 +# Valid only if FTLE_Compute = 1 +FTLE_ComputeVariation = 0 + +# FTLE_VariationOutFreq: (Positive) Integer, controls how often FTLE is output when computing variation of FTLE with +# integration time +# If set to 1, output is generated at every time instance that velocity data is defined, if set to, e.g., 5, then output +# is generated at 1/5 of that rate (i.e. every 5 velocity data frames) +# Valid only if FTLE_ComputeVariation = 1 +FTLE_VariationOutFreq = 1 + +# FTLE_OutFilePrefix: String, Filename prefix where FTLE output data is written +# A separate file is generated for each output time (e.g. dg_forFTLE.0.bin, ..., dg_forFTLE.10.bin if Output_TRes = 11) +# NOTE: Two types of output files are generated, one set with the 1/T scaling in the definition of FTLE (*_noT.bin files), and ones with the scaling +# Valid only if FTLE_Compute = 1 +FTLE_OutFilePrefix = dg_forwardFTLE + + +# Trace_Compute: Binary flag +# 0: Do not compute tracer trajectories +# 1: Compute tracer trajectories (FTLE_Compute MUST be 0) +Trace_Compute = 0 + +Trace_ReleaseStrategy = 0 +Trace_ReleaseTMax = 0.000755 + + +# Trace_GenerateMesh: Binary Flag +# 0: Read in tracer initial positions from a file (specified by Trace_InFile) +# 1: Generate a Cartesian grid of tracers to integrate (mesh parameters specified below) +# Valid only if Trace_Compute = 1 +Trace_GenerateMesh = 1 + +# Trace_InFile: String, Name of File containing tracer initial positions +# Valid only if Trace_Compute = 1 and Trace_GenerateMesh = 0 +Trace_InFile = tracer_grid.bin + +# Trace_MultipleInFiles: Binary Flag +# 0: Default +# 1: Tracer initial conditions change over time and are specified by multiple files +Trace_MultipleInFiles = 0 + +# Trace_InFileFormat: Integer, specifies format of Trace_InFile +# 0: Use this if you want to reuse the .IC file that is generated from flowVC (use with care) +# 1: ASCII file, first line lists the number of tracers and subsequent lines list the x,y,z coordinates +# 2: ASCII legacy VTK polydata mesh format +# 3: ASCII legacy VTK unstructured mesh format +# 4: Binary file, first entry (int) lists the number of tracers and subsequent entries (doubles) list the x,y,z coordinates (binary version of format 1) +# Valid only if Compute_Tracers = 1 and Trace_GenerateMesh = 0 +Trace_InFileFormat = 4 + +# Trace_OutFile: String, Prefix for files where tracer position data will be written +# Tracer positions written to separate files for each output time +# Valid only if Trace_Compute = 1 +Trace_OutFilePrefix = dg_tracer-positions + +# Trace_NumLaunchTimes: (Positive) Integer, Number of times to release tracers from initial positions +# If Trace_MultipleInFiles = 1, then this should be number of files +# Valid only if Trace_Compute = 1 +Trace_NumLaunchTimes = 1 + +# Trace_LaunchTimeSpacing: (Positive) Float, Time between successive release of tracers from initial positions +# Valid only if Trace_Compute = 1 and Trace_NumLaunchTimes > 1 +Trace_LaunchTimeSpacing = 0.1 + +# Trace_IntTLength: (Positive) Float, Can be used to limit amount of time any tracer will be integrated +# Recommended to set this to some value larger than (Output_TRes x Output_TDelta) unless you know what you're doing +# Valid only if Trace_Compute = 1 and Trace_ReleaseStrategy = 0 +Trace_IntTLength = 100 + +# Trace_AlwaysOutput: Binary Flag +# 0: Do not write out tracer position to file once it has left the domain +# 1: Always write out tracer position to file, even if it left the domain +# Valid only if Trace_Compute = 1 +Trace_AlwaysOutput = 0 + +# Trace_CartMesh.XMin, ..., Trace_CartMesh.ZRes: Specifies Cartesian mesh of tracers to be intergrated +# Valid only if Trace_Compute = 1 AND Trace_GenerateMesh = 1 +Trace_CartMesh.XMin = 0.0 +Trace_CartMesh.XMax = 2.0 +Trace_CartMesh.YMin = 0.0 +Trace_CartMesh.YMax = 0.1 +Trace_CartMesh.ZMin = 0.0 +Trace_CartMesh.ZMax = 0.0 +Trace_CartMesh.XRes = 201 +Trace_CartMesh.YRes = 101 +Trace_CartMesh.ZRes = 1 + +# TODO Fill in this documentation +# These are required but their functionality is not +Trace_VorticityCompute = 0 +Trace_APCompute = 0 +Trace_CETCompute = 0 +Trace_CETAuxillaryMesh = 0 +Trace_CETMeshPrefix = specified +Trace_CETSubsteps = 0 +Trace_RTCompute = 0 +Trace_RTOutFilePrefix = dg_tracer-rt + +# VelOut_Compute: Binary flag, Used to generate interpolated velocity fields +# 0: Do not generate interpolated velocity fields +# 1: Generate interploated velocity fields +VelOut_Compute = 0 + +# VelOut_GenerateMesh: Binary flag +# 0: Read interpolation locations from file specified by VelOut_InFile +# 1: Generate a Cartesian mesh of positions where velocity will be interpolated (mesh parameters specified below) +# Valid only for VelOut_Compute = 1 +VelOut_GenerateMesh = 1 + +# VelOut_InFile: String, filename containing locations of points for interpolation +# Valid only for VelOut_Compute = 1 and VelOut_GenerateMesh = 0 +VelOut_InFile = interpolation-positions.vtk + +# VelOut_InFileFormat, Integer, specified format of VelOut_InFile +# 1: ASCII file, first line lists the number of locations and subsequent lines list the coordinates +# 3: ASCII legacy VTK polydata mesh format (as output from Paraview) +# 4: ASCII legacy VTK unstructured mesh format (as output from Paraview) +# Valid only if VelOut_Compute = 1 AND VelOut_GenerateMesh = 0 +VelOut_InFileFormat = 1 + +# VelOut_FilePrefix: String, Filename prefix for files that interpolated velocity is data is written to +# Velocity output written to separate files, one per output time +# Valid only if VelOut_Compute = 1 +VelOut_FilePrefix = dg-interpolated + +# VelOut_CartMesh.XMin, ..., VelOut_CartMesh.ZRes: Specifies Cartesian mesh of interpolation positions +# Valid only if VelOut_Compute = 1 +VelOut_CartMesh.XMin = 0.0 +VelOut_CartMesh.XMax = 2.0 +VelOut_CartMesh.YMin = 0.0 +VelOut_CartMesh.YMax = 1.0 +VelOut_CartMesh.ZMin = 0.0 +VelOut_CartMesh.ZMax = 0.0 +VelOut_CartMesh.XRes = 21 +VelOut_CartMesh.YRes = 11 +VelOut_CartMesh.ZRes = 1 diff --git a/makefile b/makefile new file mode 100644 index 0000000..17dafe2 --- /dev/null +++ b/makefile @@ -0,0 +1,93 @@ +ifeq ($(OS),Windows_NT) + ifeq ($(shell uname -s),) # not in a bash-like shell + CLEANUP = del /F /Q + MKDIR = mkdir + else # in a bash-like shell, like msys + CLEANUP = rm -f + MKDIR = mkdir -p + endif + TARGET_EXTENSION=exe +else + CLEANUP = rm -f + MKDIR = mkdir -p + TARGET_EXTENSION=out +endif + +.PHONY: clean +.PHONY: all + +PATHS = src/ +PATHT = test/ +PATHB = build/release/ +PATHD = build/release/dependencies/ +PATHO = build/release/out/ + +BUILD_PATHS = $(PATHB) $(PATHD) $(PATHO) + +SRCT = $(wildcard $(PATHT)*.c) + +COMPILE=gcc -c +LINK=gcc +DEPEND=gcc -MM -MG -MF +LFLAG= -lm + +# Set build mode +ifeq ($(mode),debug) + CFLAGS = -g -Wall -O0 -I. -I$(PATHS) -DDEBUG_LEVEL=1 +else + mode = release + CFLAGS = -Wall -O3 -I. -I$(PATHS) +endif + + + +all: info project + +info: +ifneq ($(mode),release) +ifneq ($(mode),debug) + @echo "Invalid build mode." + @echo "Please use 'make mode=release' or 'make mode=debug'" + @exit 1 +endif +endif + @echo "Building in "$(mode)" mode..." + +# Define the output filename +OUTPUT_NAME = flowVC + +# List of source files for your project +SRCS = $(wildcard $(PATHS)*.c) + +# List of object files for your project +OBJS = $(patsubst $(PATHS)%.c,$(PATHO)%.o,$(SRCS)) + +# Target for building your project +project: $(BUILD_PATHS) $(OBJS) + $(LINK) -o $(PATHB)$(OUTPUT_NAME).$(TARGET_EXTENSION) $(OBJS) $(LFLAG) + +# Dependency rule for object files +$(PATHO)%.o: $(PATHS)%.c + $(COMPILE) $(CFLAGS) $< -o $@ + + +$(PATHB): + $(MKDIR) $(PATHB) + +$(PATHD): + $(MKDIR) $(PATHD) + +$(PATHO): + $(MKDIR) $(PATHO) + +clean: + $(CLEANUP) $(PATHO)*.o + $(CLEANUP) $(PATHB)*.$(TARGET_EXTENSION) + +.PRECIOUS: $(PATHD)%.d +.PRECIOUS: $(PATHO)%.o + + + + + diff --git a/project.yml b/project.yml new file mode 100644 index 0000000..37f1e56 --- /dev/null +++ b/project.yml @@ -0,0 +1,404 @@ +# ========================================================================= +# Ceedling - Test-Centered Build System for C +# ThrowTheSwitch.org +# Copyright (c) 2010-25 Mike Karlesky, Mark VanderVoord, & Greg Williams +# SPDX-License-Identifier: MIT +# ========================================================================= + +--- +:project: + # how to use ceedling. If you're not sure, leave this as `gem` and `?` + :which_ceedling: gem + :ceedling_version: 1.0.1 + + # optional features. If you don't need them, keep them turned off for performance + :use_mocks: TRUE + :use_test_preprocessor: :none # options are :none, :mocks, :tests, or :all + :use_deep_preprocessor: :none # options are :none, :mocks, :tests, or :all + :use_backtrace: :simple # options are :none, :simple, or :gdb + :use_decorators: :auto # decorate Ceedling's output text. options are :auto, :all, or :none + + # tweak the way ceedling handles automatic tasks + :build_root: build + :test_file_prefix: test_ + :default_tasks: + - test:all + + # performance options. If your tools start giving mysterious errors, consider + # dropping this to 1 to force single-tasking + :test_threads: 8 + :compile_threads: 8 + + # enable release build (more details in release_build section below) + :release_build: TRUE + +# Specify where to find mixins and any that should be enabled automatically +:mixins: + :enabled: [] + :load_paths: [] + +# further details to configure the way Ceedling handles test code +:test_build: + :use_assembly: FALSE + +# further details to configure the way Ceedling handles release code +:release_build: + :output: flowVC.out + :use_assembly: FALSE + :artifacts: [] + +# Plugins are optional Ceedling features which can be enabled. Ceedling supports +# a variety of plugins which may effect the way things are compiled, reported, +# or may provide new command options. Refer to the readme in each plugin for +# details on how to use it. +:plugins: + :load_paths: + :enabled: + #- beep # beeps when finished, so you don't waste time waiting for ceedling + - module_generator # handy for quickly creating source, header, and test templates + - gcov # test coverage using gcov. Requires gcc, gcov, and a coverage analyzer like gcovr + #- bullseye # test coverage using bullseye. Requires bullseye for your platform + #- command_hooks # write custom actions to be called at different points during the build process + #- compile_commands_json_db # generate a compile_commands.json file + #- dependencies # automatically fetch 3rd party libraries, etc. + #- subprojects # managing builds and test for static libraries + #- fake_function_framework # use FFF instead of CMock + + # Report options (You'll want to choose one stdout option, but may choose multiple stored options if desired) + #- report_build_warnings_log + #- report_tests_gtestlike_stdout + #- report_tests_ide_stdout + #- report_tests_log_factory + - report_tests_pretty_stdout + #- report_tests_raw_output_log + #- report_tests_teamcity_stdout + +# Specify which reports you'd like from the log factory +:report_tests_log_factory: + :reports: + - json + - junit + - cppunit + - html + +# override the default extensions for your system and toolchain +:extension: + #:header: .h + #:source: .c + #:assembly: .s + #:dependencies: .d + #:object: .o + :executable: .out + #:testpass: .pass + #:testfail: .fail + #:subprojects: .a + +# This is where Ceedling should look for your source and test files. +# see documentation for the many options for specifying this. +:paths: + :test: + - +:test/** + - -:test/support + :source: + - src/** + :include: + - src/** # In simple projects, this entry often duplicates :source + :support: + - test/support + :libraries: [] + +# You can even specify specific files to add or remove from your test +# and release collections. Usually it's better to use paths and let +# Ceedling do the work for you! +:files: + :test: [] + :source: [] + +# Compilation symbols to be injected into builds +# See documentation for advanced options: +# - Test name matchers for different symbols per test executable build +# - Referencing symbols in multiple lists using advanced YAML +# - Specifiying symbols used during test preprocessing +:defines: + :test: + - TEST # Simple list option to add symbol 'TEST' to compilation of all files in all test executables + :release: [] + + # Enable to inject name of a test as a unique compilation symbol into its respective executable build. + :use_test_definition: FALSE + +# Configure additional command line flags provided to tools used in each build step +# :flags: +# :release: +# :compile: # Add '-Wall' and '--02' to compilation of all files in release target +# - -Wall +# - --O2 +# :test: +# :compile: +# '(_|-)special': # Add '-pedantic' to compilation of all files in all test executables with '_special' or '-special' in their names +# - -pedantic +# '*': # Add '-foo' to compilation of all files in all test executables +# - -foo + +# Configuration Options specific to CMock. See CMock docs for details +:cmock: + # Core conffiguration + :plugins: # What plugins should be used by CMock? + - :ignore + - :callback + :verbosity: 2 # the options being 0 errors only, 1 warnings and errors, 2 normal info, 3 verbose + :when_no_prototypes: :warn # the options being :ignore, :warn, or :erro + + # File configuration + :skeleton_path: '' # Subdirectory to store stubs when generated (default: '') + :mock_prefix: 'mock_' # Prefix to append to filenames for mocks + :mock_suffix: '' # Suffix to append to filenames for mocks + + # Parser configuration + :strippables: ['(?:__attribute__\s*\([ (]*.*?[ )]*\)+)'] + :attributes: + - __ramfunc + - __irq + - __fiq + - register + - extern + :c_calling_conventions: + - __stdcall + - __cdecl + - __fastcall + :treat_externs: :exclude # the options being :include or :exclud + :treat_inlines: :exclude # the options being :include or :exclud + + # Type handling configuration + #:unity_helper_path: '' # specify a string of where to find a unity_helper.h file to discover custom type assertions + :treat_as: # optionally add additional types to map custom types + uint8: HEX8 + uint16: HEX16 + uint32: UINT32 + int8: INT8 + bool: UINT8 + #:treat_as_array: {} # hint to cmock that these types are pointers to something + #:treat_as_void: [] # hint to cmock that these types are actually aliases of void + :memcmp_if_unknown: true # allow cmock to use the memory comparison assertions for unknown types + :when_ptr: :compare_data # hint to cmock how to handle pointers in general, the options being :compare_ptr, :compare_data, or :smart + + # Mock generation configuration + :weak: '' # Symbol to use to declare weak functions + :enforce_strict_ordering: true # Do we want cmock to enforce ordering of all function calls? + :fail_on_unexpected_calls: true # Do we want cmock to fail when it encounters a function call that wasn't expected? + :callback_include_count: true # Do we want cmock to include the number of calls to this callback, when using callbacks? + :callback_after_arg_check: false # Do we want cmock to enforce an argument check first when using a callback? + #:includes: [] # You can add additional includes here, or specify the location with the options below + #:includes_h_pre_orig_header: [] + #:includes_h_post_orig_header: [] + #:includes_c_pre_header: [] + #:includes_c_post_header: [] + #:array_size_type: [] # Specify a type or types that should be used for array lengths + #:array_size_name: 'size|len' # Specify a name or names that CMock might automatically recognize as the length of an array + :exclude_setjmp_h: false # Don't use setjmp when running CMock. Note that this might result in late reporting or out-of-order failures. + +# Configuration options specific to Unity. +:unity: + :defines: + - UNITY_INCLUDE_DOUBLE + + +# You can optionally have ceedling create environment variables for you before +# performing the rest of its tasks. +:environment: [] +# :environment: +# # List enforces order allowing later to reference earlier with inline Ruby substitution +# - :var1: value +# - :var2: another value +# - :path: # Special PATH handling with platform-specific path separators +# - #{ENV['PATH']} # Environment variables can use inline Ruby substitution +# - /another/path/to/include + +# LIBRARIES +# These libraries are automatically injected into the build process. Those specified as +# common will be used in all types of builds. Otherwise, libraries can be injected in just +# tests or releases. These options are MERGED with the options in supplemental yaml files. +:libraries: + :placement: :end + :flag: "-l${1}" + :path_flag: "-L ${1}" + :system: # for example, you might list 'm' to grab the math library + - m + :test: [] + :release: [] + +################################################################ +# PLUGIN CONFIGURATION +################################################################ + +# Add -gcov to the plugins list to make sure of the gcov plugin +# You will need to have gcov and gcovr both installed to make it work. +# For more information on these options, see docs in plugins/gcov +:gcov: + :summaries: TRUE # Enable simple coverage summaries to console after tests + :report_task: FALSE # Disabled dedicated report generation task (this enables automatic report generation) + :utilities: + #- gcovr # Use gcovr to create the specified reports (default). + #- ReportGenerator # Use ReportGenerator to create the specified reports. + :reports: # Specify one or more reports to generate. + # Make an HTML summary report. + # - HtmlBasic + # - HtmlDetailed + # - Text + # - Cobertura + # - SonarQube + # - JSON + # - HtmlInline + # - HtmlInlineAzure + # - HtmlInlineAzureDark + # - HtmlChart + # - MHtml + # - Badges + # - CsvSummary + # - Latex + # - LatexSummary + # - PngChart + # - TeamCitySummary + # - lcov + # - Xml + # - XmlSummary + :gcovr: + # :html_artifact_filename: TestCoverageReport.html + # :html_title: Test Coverage Report + :html_medium_threshold: 75 + :html_high_threshold: 90 + # :html_absolute_paths: TRUE + # :html_encoding: UTF-8 + +# :module_generator: +# :naming: :snake #options: :bumpy, :camel, :caps, or :snake +# :includes: +# :tst: [] +# :src: [] +# :boilerplates: +# :src: "" +# :inc: "" +# :tst: "" + +# :dependencies: +# :libraries: +# - :name: WolfSSL +# :source_path: third_party/wolfssl/source +# :build_path: third_party/wolfssl/build +# :artifact_path: third_party/wolfssl/install +# :fetch: +# :method: :zip +# :source: \\shared_drive\third_party_libs\wolfssl\wolfssl-4.2.0.zip +# :environment: +# - CFLAGS+=-DWOLFSSL_DTLS_ALLOW_FUTURE +# :build: +# - "autoreconf -i" +# - "./configure --enable-tls13 --enable-singlethreaded" +# - make +# - make install +# :artifacts: +# :static_libraries: +# - lib/wolfssl.a +# :dynamic_libraries: +# - lib/wolfssl.so +# :includes: +# - include/** + +# :subprojects: +# :paths: +# - :name: libprojectA +# :source: +# - ./subprojectA/source +# :include: +# - ./subprojectA/include +# :build_root: ./subprojectA/build +# :defines: [] + +# :command_hooks: +# :pre_mock_preprocess: +# :post_mock_preprocess: +# :pre_test_preprocess: +# :post_test_preprocess: +# :pre_mock_generate: +# :post_mock_generate: +# :pre_runner_generate: +# :post_runner_generate: +# :pre_compile_execute: +# :post_compile_execute: +# :pre_link_execute: +# :post_link_execute: +# :pre_test_fixture_execute: +# :post_test_fixture_execute: +# :pre_test: +# :post_test: +# :pre_release: +# :post_release: +# :pre_build: +# :post_build: +# :post_error: + +################################################################ +# TOOLCHAIN CONFIGURATION +################################################################ + +#:tools: +# Ceedling defaults to using gcc for compiling, linking, etc. +# As [:tools] is blank, gcc will be used (so long as it's in your system path) +# See documentation to configure a given toolchain for use +# :tools: +# :test_compiler: +# :executable: +# :arguments: [] +# :name: +# :optional: FALSE +# :test_linker: +# :executable: +# :arguments: [] +# :name: +# :optional: FALSE +# :test_assembler: +# :executable: +# :arguments: [] +# :name: +# :optional: FALSE +# :test_fixture: +# :executable: +# :arguments: [] +# :name: +# :optional: FALSE +# :test_includes_preprocessor: +# :executable: +# :arguments: [] +# :name: +# :optional: FALSE +# :test_file_preprocessor: +# :executable: +# :arguments: [] +# :name: +# :optional: FALSE +# :test_file_preprocessor_directives: +# :executable: +# :arguments: [] +# :name: +# :optional: FALSE +# :release_compiler: +# :executable: +# :arguments: [] +# :name: +# :optional: FALSE +# :release_linker: +# :executable: +# :arguments: [] +# :name: +# :optional: FALSE +# :release_assembler: +# :executable: +# :arguments: [] +# :name: +# :optional: FALSE +# :release_dependencies_generator: +# :executable: +# :arguments: [] +# :name: +# :optional: FALSE +... diff --git a/src/exposuretime.o b/src/exposuretime.o deleted file mode 100644 index f63ed52..0000000 Binary files a/src/exposuretime.o and /dev/null differ diff --git a/src/flowVC b/src/flowVC deleted file mode 100755 index 024e570..0000000 Binary files a/src/flowVC and /dev/null differ diff --git a/src/ftle.c b/src/ftle.c index d60a441..ba6d330 100644 --- a/src/ftle.c +++ b/src/ftle.c @@ -1,7 +1,8 @@ /* * ftle.c * flowVC - * + * forked from FlowPhysics/flowVC + * Modified by Bray Moll * Created by Shawn Shadden. * Copyright 2010 Flow Physics Group. All rights reserved. * @@ -20,11 +21,19 @@ #include "structs.h" #include "velocity.h" + +// Define global variable +//Search ***global_search_success = NULL; + + + void InitializeFTLEArray(void) { - int ss, i, j, k, seed = -1, index = -1, found = 0, guess = -1, iguess = -1, jguess = -1, count = 0, foundGS = 0, percentage = 0; + int ss, i, j, k, seed = -1, index = -1, found = 0, guess = -1, iguess = -1, jguess = -1, count = 0 ,count_report =0; + int percentage = 0; + //int foundGS = 0, percentage = 0 ; double Xseed[3]; - double FTLE_outside = -1.0; /* Used to mask FTLE values outside of domain */ + //double FTLE_outside = -1.0; /* Used to mask FTLE values outside of domain */ FILE *FTLE_BinFileID; char FTLE_BinFilePath[LONGSTRING]; @@ -43,6 +52,16 @@ void InitializeFTLEArray(void) { if((FTLE_MeshPt[i][j] = (FTLEPoint *)malloc(FTLE_CartMesh.ZRes * sizeof(FTLEPoint))) == NULL) FatalError("Malloc failed for FTLE[%d][%d]", i, j); } + + //int i,j,k; + Search *** global_search_success = (Search ***)malloc(FTLE_CartMesh.XRes*sizeof(Search**)); + for (i = 0; i< FTLE_CartMesh.XRes; i++) { + global_search_success[i] = (Search **) malloc(FTLE_CartMesh.YRes*sizeof(Search *)); + for (j = 0; j < FTLE_CartMesh.ZRes; j++) { + global_search_success[i][j] = (Search *)malloc(FTLE_CartMesh.ZRes*sizeof(Search)); + } + } + /* Initialize FTLE_MeshPt */ for(i = 0; i < FTLE_CartMesh.XRes; i++) { @@ -56,6 +75,10 @@ void InitializeFTLEArray(void) { FTLE_MeshPt[i][j][k].HaveFTLE = 0; FTLE_MeshPt[i][j][k].Pt.LeftDomain = 0; FTLE_MeshPt[i][j][k].Pt.LeftDomainTime = 0.0; + FTLE_MeshPt[i][j][k].Pt.ElementIndex = -1; + + global_search_success[i][j][k].searched = 0; + global_search_success[i][j][k].found = 0; } } } @@ -65,25 +88,7 @@ void InitializeFTLEArray(void) { for(j = 0; j < FTLE_CartMesh.YRes; j++) { for(k = 0; k < FTLE_CartMesh.ZRes; k++) { if(TestOutsideDomain(FTLE_MeshPt[i][j][k].Pt.X)) { - FTLE_MeshPt[i][j][k].Pt.LeftDomain = 1; - FTLE_MeshPt[i][j][k].Pt.LeftDomainTime = -1.0; - FTLE_MeshPt[i][j][k].FTLEwT = FTLE_outside; - FTLE_MeshPt[i][j][k].FTLEwoT = FTLE_outside; - /* No need to calculate FTLE for this point */ - FTLE_MeshPt[i][j][k].HaveFTLE = 1; - /* Or neighboring points */ - if(i > 0) - FTLE_MeshPt[i-1][j][k].HaveFTLE = 1; - if(i < FTLE_CartMesh.XRes - 1) - FTLE_MeshPt[i+1][j][k].HaveFTLE = 1; - if(j > 0) - FTLE_MeshPt[i][j-1][k].HaveFTLE = 1; - if(j < FTLE_CartMesh.YRes - 1) - FTLE_MeshPt[i][j+1][k].HaveFTLE = 1; - if(k > 0) - FTLE_MeshPt[i][j][k-1].HaveFTLE = 1; - if(k < FTLE_CartMesh.ZRes - 1) - FTLE_MeshPt[i][j][k+1].HaveFTLE = 1; + FTLE_dont_compute(i,j,k); } } } @@ -101,150 +106,126 @@ void InitializeFTLEArray(void) { fflush(stdout); guess = seed; } - + + /* // BRAY RE_WRITE COMMENT START */ /* Search over all the points */ for(i = 0; i < FTLE_CartMesh.XRes; i++) { - iguess = -1; - for(j = 0; j < FTLE_CartMesh.YRes; j++) { - jguess = -1; - for(k = 0; k < FTLE_CartMesh.ZRes; k++) { - if(!FTLE_MeshPt[i][j][k].Pt.LeftDomain) { - if(seed < 0) { - seed = Get_Element_Global_Search(FTLE_MeshPt[i][j][k].Pt.X); - if(seed < 0) { - FTLE_MeshPt[i][j][k].Pt.LeftDomain = 1; - FTLE_MeshPt[i][j][k].Pt.LeftDomainTime = -1.0; - /* No need to calculate FTLE for this point */ - FTLE_MeshPt[i][j][k].HaveFTLE = 1; - FTLE_MeshPt[i][j][k].FTLEwT = FTLE_outside; - FTLE_MeshPt[i][j][k].FTLEwoT = FTLE_outside; - /* Or its neighbors */ - if(i > 0) - FTLE_MeshPt[i-1][j][k].HaveFTLE = 1; - if(i < FTLE_CartMesh.XRes - 1) - FTLE_MeshPt[i+1][j][k].HaveFTLE = 1; - if(j > 0) - FTLE_MeshPt[i][j-1][k].HaveFTLE = 1; - if(j < FTLE_CartMesh.YRes - 1) - FTLE_MeshPt[i][j+1][k].HaveFTLE = 1; - if(k > 0) - FTLE_MeshPt[i][j][k-1].HaveFTLE = 1; - if(k < FTLE_CartMesh.ZRes - 1) - FTLE_MeshPt[i][j][k+1].HaveFTLE = 1; - } - else { - printf(" Using first located element seed.\n"); - fflush(stdout); - FTLE_MeshPt[i][j][k].Pt.ElementIndex = seed; - found++; - guess = seed; - jguess = seed; - iguess = seed; - } - } - else { - count++; - if(100 * count / (FTLE_CartMesh.XRes * FTLE_CartMesh.YRes * FTLE_CartMesh.ZRes) > percentage) { - printf(" %d%%", percentage); - fflush(stdout); - percentage = percentage + 10; - } - index = Get_Element_Local_Search(FTLE_MeshPt[i][j][k].Pt.X, guess); - if(index < 0) { - /* An element not found, try searching from seed location */ - index = Get_Element_Local_Search(FTLE_MeshPt[i][j][k].Pt.X, seed); - if(index < 0) { - /* If an element still not found, do global search if local search checking requested */ - if(LocalSearchChecking) { - index = Get_Element_Global_Search(FTLE_MeshPt[i][j][k].Pt.X); - if(index < 0) { /* Point is definitely not in any element */ - FTLE_MeshPt[i][j][k].Pt.LeftDomain = 1; - FTLE_MeshPt[i][j][k].Pt.LeftDomainTime = -1.0; - /* No need to calculate FTLE for this point or its neighbors */ - FTLE_MeshPt[i][j][k].HaveFTLE = 1; - FTLE_MeshPt[i][j][k].FTLEwT = FTLE_outside; - FTLE_MeshPt[i][j][k].FTLEwoT = FTLE_outside; - if(i > 0) - FTLE_MeshPt[i-1][j][k].HaveFTLE = 1; - if(i < FTLE_CartMesh.XRes - 1) - FTLE_MeshPt[i+1][j][k].HaveFTLE = 1; - if(j > 0) - FTLE_MeshPt[i][j-1][k].HaveFTLE = 1; - if(j < FTLE_CartMesh.YRes - 1) - FTLE_MeshPt[i][j+1][k].HaveFTLE = 1; - if(k > 0) - FTLE_MeshPt[i][j][k-1].HaveFTLE = 1; - if(k < FTLE_CartMesh.ZRes - 1) - FTLE_MeshPt[i][j][k+1].HaveFTLE = 1; - } - else { - FTLE_MeshPt[i][j][k].Pt.ElementIndex = index; - foundGS++; - found++; - guess = index; - if(jguess < 0) - jguess = index; - if(iguess < 0) - iguess = index; - } - } - else { - FTLE_MeshPt[i][j][k].Pt.LeftDomain = 1; - FTLE_MeshPt[i][j][k].Pt.LeftDomainTime = -1.0; - /* No need to calculate FTLE for this point or its neighbors */ - FTLE_MeshPt[i][j][k].HaveFTLE = 1; - FTLE_MeshPt[i][j][k].FTLEwT = FTLE_outside; - FTLE_MeshPt[i][j][k].FTLEwoT = FTLE_outside; - if(i > 0) - FTLE_MeshPt[i-1][j][k].HaveFTLE = 1; - if(i < FTLE_CartMesh.XRes - 1) - FTLE_MeshPt[i+1][j][k].HaveFTLE = 1; - if(j > 0) - FTLE_MeshPt[i][j-1][k].HaveFTLE = 1; - if(j < FTLE_CartMesh.YRes - 1) - FTLE_MeshPt[i][j+1][k].HaveFTLE = 1; - if(k > 0) - FTLE_MeshPt[i][j][k-1].HaveFTLE = 1; - if(k < FTLE_CartMesh.ZRes - 1) - FTLE_MeshPt[i][j][k+1].HaveFTLE = 1; - } - } - else { - FTLE_MeshPt[i][j][k].Pt.ElementIndex = index; - found++; - guess = index; - if(jguess < 0) - jguess = index; - if(iguess < 0) - iguess = index; - } - } - else { - FTLE_MeshPt[i][j][k].Pt.ElementIndex = index; - found++; - guess = index; - if(jguess < 0) - jguess = index; - if(iguess < 0) - iguess = index; - } - } - } - } + iguess = -1; + for(j = 0; j < FTLE_CartMesh.YRes; j++) { + jguess = -1; + for(k = 0; k < FTLE_CartMesh.ZRes; k++) { + if(!FTLE_MeshPt[i][j][k].Pt.LeftDomain) { + count++; + + #ifdef DEBUG_1 + // If debugging, print the status every 1000 points + if (count>count_report){ + printf( + "found: %d, searched:%d total to search %d \n", + found, + count, + FTLE_CartMesh.XRes * FTLE_CartMesh.YRes * FTLE_CartMesh.ZRes); + fflush(stdout); + count_report+=1000; } - if(jguess >= 0) - guess = jguess; - } + #endif + + // Original report in 10% increments + if(100 * count / (FTLE_CartMesh.XRes * FTLE_CartMesh.YRes * FTLE_CartMesh.ZRes) > percentage) { + printf(" %d%%", percentage); + fflush(stdout); + percentage = percentage + 10; + } + + + index = -1; + //if we dont have a seed yet, try a global search + if(seed < 0) { + index = Get_Element_Global_Search(FTLE_MeshPt[i][j][k].Pt.X); + if (index >= 0){ + // record the index as seed and best guess + printf(" Using first located element seed.\n"); + fflush(stdout); + seed = index; + guess = index; + jguess = index; + iguess = index; + + } + } + + // If we do have a seed try a local search + if(index < 0 && seed >=0) { + index = Get_Element_Local_Search(FTLE_MeshPt[i][j][k].Pt.X, guess); + } + // If we do have a seed, but did not find an index yet, try a local search from seed + if(index < 0 && seed >=0) { + index = Get_Element_Local_Search(FTLE_MeshPt[i][j][k].Pt.X, seed); + } + + if (index < -1){ + FatalError("Incorrect Index (likely overflow): Index = %d \n", index); + }; + + //If we found a point + if (index >= 0){ + global_search_success[i][j][k].searched = 1; // mark the point as searched + global_search_success[i][j][k].found = 1; // mark the point as found + FTLE_MeshPt[i][j][k].Pt.ElementIndex = index; // record the element the pont was found inside + found++; + guess = index; + + if(jguess < 0) + jguess = index; + if(iguess < 0) + iguess = index; + } + + + + } //pt left domain close + + } //k loop close + + }// j loop close + if(jguess >= 0) + guess = jguess; + }// i loop close if(iguess >= 0) - guess = iguess; + guess = iguess; + /* // Try a global search for points next to found points */ + if(LocalSearchChecking){ + global_search_check(100000, 100000, &found,global_search_success); + + } + // + + //Dont compute the FTLE for any points (or neighbors) that were not found + for(i = 0; i < FTLE_CartMesh.XRes; i++) { + for(j = 0; j < FTLE_CartMesh.YRes; j++) { + for(k = 0; k < FTLE_CartMesh.ZRes; k++) { + if(global_search_success[i][j][k].found != 1) { + FTLE_dont_compute(i,j,k); + FTLE_dont_compute_neighbors( + i, + j, + k, + FTLE_CartMesh.XRes, + FTLE_CartMesh.YRes, + FTLE_CartMesh.ZRes + ); + } + } + } + } - if(LocalSearchChecking) - printf(" %d of %d located in domain (%d caught by local search checking)\n", found, FTLE_CartMesh.XRes * FTLE_CartMesh.YRes * FTLE_CartMesh.ZRes, foundGS); - else - printf(" %d of %d located in domain\n", found, FTLE_CartMesh.XRes * FTLE_CartMesh.YRes * FTLE_CartMesh.ZRes); + + //else + printf(" %d of %d located in domain\n", found, FTLE_CartMesh.XRes * FTLE_CartMesh.YRes * FTLE_CartMesh.ZRes); fflush(stdout); - } + } + /* Open bin file to store FTLE_MeshPt initialization data */ sprintf(FTLE_BinFilePath, "%s%s", Path_Data, FTLE_ICFile); @@ -836,6 +817,140 @@ LagrangianPoint Advect_FTLEPoint(int i, int j, int k, double t1, double t2) { } +void global_search_check(int max_loops, int count_report_interval, int *found, Search ***global_search_success) { + /** + * Perform a global search on all points next to a found point + * + * Loop through all of the data points max_loops times, + * performing a global search on every point that is next to a found point + * stopping if no points are found in a full loop or if max_loops is reached + * + * + * max_loops: The maximum number of times to loop through the data + * count_report_interval: + * number of itterations to do before printing the status + * *found: a pointer to the global found counter + * ***global_search_success: a pointer to a 3d array that stores the following + * global_search_success[i][j][k].found: + * 1 if a point has been found (else 0) + * global_search_success[i][j][k].searched: + * 1 if a point has already been searched using a global search, else 0 + * + */ + + // perform a global_search for any points directly next to a found point + int i, j, k,index,top, left, right, bottom, front, back, outside, me,count,count_report, global_count_total, global_count, stop, loops; + global_count_total =0; + stop = 0; + loops = 0; + printf("Starting Global Search Checking \n"); + + while (stop==0){ + global_count = 0; + loops++; + count = 0; + count_report = 0; + for(i = 1; i < FTLE_CartMesh.XRes-1; i++) { + for(j = 1; j < FTLE_CartMesh.YRes-1; j++) { + for(k = 1; k < FTLE_CartMesh.ZRes-1; k++) { + count++; + #ifdef DEBUG_1 + if (count>count_report){ + printf( + "found: %d, from local: %d: this loop: %d, searched:%d total to search %d \n", + *found, + global_count_total, + global_count, + count, + (FTLE_CartMesh.XRes-2) * (FTLE_CartMesh.YRes-2) * (FTLE_CartMesh.ZRes-2)); + fflush(stdout); + count_report+=count_report_interval; + } + #endif + + //If my point has not had a global search + me = global_search_success[i][j][k].searched; + //But i am next to a point that has been found + left = global_search_success[i-1][j][k].found; + right = global_search_success[i+1][j][k].found; + top = global_search_success[i][j+1][k].found; + bottom = global_search_success[i][j-1][k].found; + front = global_search_success[i][j][k+1].found; + back = global_search_success[i][j][k-1].found; + // And i am not outside the domain + outside = TestOutsideDomain(FTLE_MeshPt[i][j][k].Pt.X); + + index = -1; + // Try searching using a global search + if((me == 0) && (top == 1 || bottom == 1 || front == 1 || back ==1 || left == 1 || right == 1) && (outside != 1) ){ + + index = Get_Element_Global_Search(FTLE_MeshPt[i][j][k].Pt.X); + global_search_success[i][j][k].searched = 1; // record that this point saw a global search + if (index < -1){ + FatalError("Incorrect Index (likely overflow): Index = %d \n", index); + }; + + if(index >= 0){ + global_search_success[i][j][k].found =1; + + //Set index and reset other settings that were zeroed + FTLE_MeshPt[i][j][k].Pt.ElementIndex = index; + + + // Increment counters + // pts found this while loop + global_count++; + + // total number found by global counting + global_count_total++; + // Total found overall + *found = *found + 1; + + } + } + } + } // end + }//End i loop + + + //If no points were found + // Or we have reached our max loops + if(global_count == 0 || loops>=max_loops){ + stop = 1; + } + + } +} + +void FTLE_dont_compute(int i, int j, int k) { + // For a point and its neighbors, set the values to indicate that the FTLE doesnt need to be computed + + //printf("point not found"); + FTLE_MeshPt[i][j][k].Pt.LeftDomain = 1; + FTLE_MeshPt[i][j][k].Pt.LeftDomainTime = -1.0; + /* No need to calculate FTLE for this point */ + FTLE_MeshPt[i][j][k].HaveFTLE = 1; + FTLE_MeshPt[i][j][k].FTLEwT = -1.0; + FTLE_MeshPt[i][j][k].FTLEwoT = -1.0; +} +void FTLE_dont_compute_neighbors(int i, int j, int k, int i_max, int j_max, int k_max){ + //Dont compute FTLE for neighbors + if(i > 0) + FTLE_MeshPt[i-1][j][k].HaveFTLE = 1; + if(i < i_max - 1) + FTLE_MeshPt[i+1][j][k].HaveFTLE = 1; + if(j > 0) + FTLE_MeshPt[i][j-1][k].HaveFTLE = 1; + if(j < j_max - 1) + FTLE_MeshPt[i][j+1][k].HaveFTLE = 1; + if(k > 0) + FTLE_MeshPt[i][j][k-1].HaveFTLE = 1; + if(k < k_max - 1) + FTLE_MeshPt[i][j][k+1].HaveFTLE = 1; +} + + + void UpdateFTLELocations(void) { /* Copies contents of FTLE_NewArray to FTLE_MeshPt */ int i, j, k; @@ -955,15 +1070,30 @@ void FreeFTLEData(void) { FTLE_NewArray[i][j] = NULL; free(FTLE_MeshPt[i][j]); FTLE_MeshPt[i][j] = NULL; + } free(FTLE_NewArray[i]); FTLE_NewArray[i] = NULL; free(FTLE_MeshPt[i]); FTLE_MeshPt[i] = NULL; + } free(FTLE_NewArray); FTLE_NewArray = NULL; free(FTLE_MeshPt); FTLE_MeshPt = NULL; + } + + +void free_global_search_success (Search ***global_search_success, int l, int m){ + + for (int i = 0;iX[0] + 0.5 * k1[0] * h; MP2.X[1] = pt->X[1] + 0.5 * k1[1] * h; MP2.X[2] = pt->X[2] + 0.5 * k1[2] * h; - if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP2, &MP2.X); + if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP2, MP2.X); GetVelocity(tc + h/2, &MP2, k2); /* k3 */ MP3.X[0] = pt->X[0] + 0.5 * k2[0] * h; MP3.X[1] = pt->X[1] + 0.5 * k2[1] * h; MP3.X[2] = pt->X[2] + 0.5 * k2[2] * h; - if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP3, &MP3.X); + if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP3, MP3.X); GetVelocity(tc + h/2, &MP3, k3); /* k4 */ MP4.X[0] = pt->X[0] + k3[0] * h; MP4.X[1] = pt->X[1] + k3[1] * h; MP4.X[2] = pt->X[2] + k3[2] * h; - if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP4, &MP4.X); + if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP4, MP4.X); GetVelocity(tc + h, &MP4, k4); /* Update position, time, and (if needed) element index */ @@ -686,7 +686,7 @@ double RKF(LagrangianPoint *pt, double tstart, double tend) { MP2.X[0] = pt->X[0] + 0.25 * k1[0] * h; MP2.X[1] = pt->X[1] + 0.25 * k1[1] * h; MP2.X[2] = pt->X[2] + 0.25 * k1[2] * h; - if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP2, &MP2.X); + if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP2, MP2.X); ts = tc + 0.25 * h; GetVelocity(ts, &MP2, k2); @@ -694,7 +694,7 @@ double RKF(LagrangianPoint *pt, double tstart, double tend) { MP3.X[0] = pt->X[0] + (a3 * k1[0] + b3 * k2[0]) * h; MP3.X[1] = pt->X[1] + (a3 * k1[1] + b3 * k2[1]) * h; MP3.X[2] = pt->X[2] + (a3 * k1[2] + b3 * k2[2]) * h; - if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP3, &MP3.X); + if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP3, MP3.X); ts = tc + 0.375 * h; GetVelocity(ts, &MP3, k3); @@ -702,7 +702,7 @@ double RKF(LagrangianPoint *pt, double tstart, double tend) { MP4.X[0] = pt->X[0] + (a4 * k1[0] + b4 * k2[0] + c4 * k3[0]) * h; MP4.X[1] = pt->X[1] + (a4 * k1[1] + b4 * k2[1] + c4 * k3[1]) * h; MP4.X[2] = pt->X[2] + (a4 * k1[2] + b4 * k2[2] + c4 * k3[2]) * h; - if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP4, &MP4.X); + if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP4, MP4.X); ts = tc + (12.0 * h) / 13.0; GetVelocity(ts, &MP4, k4); @@ -710,7 +710,7 @@ double RKF(LagrangianPoint *pt, double tstart, double tend) { MP5.X[0] = pt->X[0] + (a5 * k1[0] + b5 * k2[0] + c5 * k3[0] + d5 * k4[0]) * h; MP5.X[1] = pt->X[1] + (a5 * k1[1] + b5 * k2[1] + c5 * k3[1] + d5 * k4[1]) * h; MP5.X[2] = pt->X[2] + (a5 * k1[2] + b5 * k2[2] + c5 * k3[2] + d5 * k4[2]) * h; - if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP5, &MP5.X); + if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP5, MP5.X); ts = tc + h; GetVelocity(ts, &MP5, k5); @@ -718,7 +718,7 @@ double RKF(LagrangianPoint *pt, double tstart, double tend) { MP6.X[0] = pt->X[0] + (a6 * k1[0] + b6 * k2[0] + c6 * k3[0] + d6 * k4[0] + e6 * k5[0]) * h; MP6.X[1] = pt->X[1] + (a6 * k1[1] + b6 * k2[1] + c6 * k3[1] + d6 * k4[1] + e6 * k5[1]) * h; MP6.X[2] = pt->X[2] + (a6 * k1[2] + b6 * k2[2] + c6 * k3[2] + d6 * k4[2] + e6 * k5[2]) * h; - if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP6, &MP6.X); + if(Data_MeshType == CARTESIAN && Data_XPeriodic == SPATIALPERIODIC) ReMapPt(&MP6, MP6.X); ts = tc + 0.5 * h; GetVelocity(ts, &MP6, k6); diff --git a/src/integration.o b/src/integration.o deleted file mode 100644 index 320b8c8..0000000 Binary files a/src/integration.o and /dev/null differ diff --git a/src/io.o b/src/io.o deleted file mode 100644 index f65bde9..0000000 Binary files a/src/io.o and /dev/null differ diff --git a/src/macros.h b/src/macros.h index e71b384..d15ef62 100644 --- a/src/macros.h +++ b/src/macros.h @@ -39,4 +39,16 @@ #define SHORTSTRING 100 #define LONGSTRING 200 -#endif \ No newline at end of file +#ifdef DEBUG_LEVEL +#if DEBUG_LEVEL >= 3 +#define DEBUG_3 +#endif +#if DEBUG_LEVEL >= 2 +#define DEBUG_2 +#endif +#if DEBUG_LEVEL >= 1 +#define DEBUG_1 +#endif +#endif + +#endif diff --git a/src/main.o b/src/main.o deleted file mode 100644 index 46aeef7..0000000 Binary files a/src/main.o and /dev/null differ diff --git a/src/makefile b/src/makefile deleted file mode 100755 index e1efb67..0000000 --- a/src/makefile +++ /dev/null @@ -1,40 +0,0 @@ -# Generic makefile for flowVC -# -# -ifeq ($(mode),debug) - CFLAGS = -g -Wall -O0 -else - mode = release - CFLAGS = -Wall -O3 -endif -LFLAGS = -lm -CC = gcc -SRC = exposuretime.c ftle.c globals.c integration.c io.c main.c memory.c mesh.c mymath.c parameters.c \ - residencetime.c strainrate.c tracers.c velocity.c velout.c vorticity.c -OBJ = $(SRC:.c=.o) -EXE = flowVC - -.PHONY: all -all: info $(EXE) - -info: -ifneq ($(mode),release) -ifneq ($(mode),debug) - @echo "Invalid build mode." - @echo "Please use 'make mode=release' or 'make mode=debug'" - @exit 1 -endif -endif - @echo "Building in "$(mode)" mode..." - -$(EXE): $(OBJ) - $(CC) $(LFLAGS) $(OBJ) -o $@ - -.c.o: - $(CC) $(CFLAGS) -c $< -o $@ - -.PHONY: clean -clean: - rm -vf *.o $(EXE) - - diff --git a/src/memory.o b/src/memory.o deleted file mode 100644 index 38a5833..0000000 Binary files a/src/memory.o and /dev/null differ diff --git a/src/mesh.c b/src/mesh.c index 4bba470..fae169f 100644 --- a/src/mesh.c +++ b/src/mesh.c @@ -10,14 +10,18 @@ #include #include #include +#include #include "exposuretime.h" #include "globals.h" #include "io.h" #include "macros.h" #include "memory.h" #include "mesh.h" +//#define DEBUG +int check_bounds(int *i, int *stop_flag, double x, int coord); + void LoadMeshData(void) { printf("Loading mesh data..."); @@ -142,7 +146,6 @@ void LoadUnstructMeshData(void) { /* Read number of nodes */ if(fread(&Vel_MeshNumNodes, sizeof(int), 1, Mesh_BinFileID) < 1) FatalError("Could not read number of mesh nodes from %s", Mesh_BinFilePath); - printf("Loading coordinate data for %d nodes...", Vel_MeshNumNodes); fflush(stdout); @@ -314,56 +317,93 @@ int Get_Element_Global_Search(const double *X) { double a11, a12, a13, a21, a22, a23, a31, a32, a33; double r, s, t, d; double V; - + double x_min, x_max, y_min, y_max, z_min, z_max; x = X[0]; y = X[1]; z = X[2]; i = 0; + int stop_flag; + #ifdef DEBUG + //clock_t tic = clock(); + //printf("DEBUG: starting global search \n"); + #endif + //int fist_pt_debug = 0; + //double point_check; while(i < Vel_MeshNumElements) { /* Search over all elements */ + if(Dimensions == 3) { - /* Physical coordinates of nodes of the test element */ - x0 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[0]][0]; - y0 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[0]][1]; - z0 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[0]][2]; - x1 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[1]][0]; - y1 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[1]][1]; - z1 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[1]][2]; - x2 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[2]][0]; - y2 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[2]][1]; - z2 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[2]][2]; - x3 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[3]][0]; - y3 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[3]][1]; - z3 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[3]][2]; - - /* Entries for mapping of physical to natural coordinates of test element */ - a11 = (z3 - z0) * (y2 - y3) - (z2 - z3) * (y3 - y0); - a21 = (z3 - z0) * (y0 - y1) - (z0 - z1) * (y3 - y0); - a31 = (z1 - z2) * (y0 - y1) - (z0 - z1) * (y1 - y2); - a12 = (x3 - x0) * (z2 - z3) - (x2 - x3) * (z3 - z0); - a22 = (x3 - x0) * (z0 - z1) - (x0 - x1) * (z3 - z0); - a32 = (x1 - x2) * (z0 - z1) - (x0 - x1) * (z1 - z2); - a13 = (y3 - y0) * (x2 - x3) - (y2 - y3) * (x3 - x0); - a23 = (y3 - y0) * (x0 - x1) - (y0 - y1) * (x3 - x0); - a33 = (y1 - y2) * (x0 - x1) - (y0 - y1) * (x1 - x2); - - /* Determinant of mapping from natural to physical coordinates of test element */ - V = (x1 - x0) * ((y2 - y0) * (z3 - z0) - (z2 - z0) * (y3 - y0)) + - (x2 - x0) * ((y0 - y1) * (z3 - z0) - (z0 - z1) * (y3 - y0)) + - (x3 - x0) * ((y1 - y0) * (z2 - z0) - (z1 - z0) * (y2 - y0)); - - /* Natural coordinates of point to be interpolated */ - r = (a11 * (x - x0) + a12 * (y - y0) + a13 * (z - z0)) / V; - s = (a21 * (x - x0) + a22 * (y - y0) + a23 * (z - z0)) / V; - t = (a31 * (x - x0) + a32 * (y - y0) + a33 * (z - z0)) / V; - - d = fmin(r, fmin(s, fmin(t, 1 - r - s - t))); - - if(d > -TINY) /* Point inside test element */ - return(i); - else /* Check next element */ - i++; - } + // Check to ensure we are not outside the boudning rectangle + // First check if x < x_min or x>x_max. If so stop early + stop_flag = 0; + check_bounds(&i, &stop_flag, x, 0); + // check if y < y_min or y>y_max. If so stop early + if(stop_flag==0){ + check_bounds(&i, &stop_flag, y, 1); + } + // check if z < z_min or z>z_max. If so stop early + if(stop_flag==0){ + check_bounds(&i, &stop_flag, z, 2); + } + + // If we are inside the boudning rectangle, check if we are inside the tetrahedron + if(stop_flag==0){ + #ifdef DEBUG + // printf("DEBUG: checking tetrahedron \n"); + // printf("x_min %f, x_max %f, x %f \n",x_min, x_max, x); + // printf("y_min %f, y_max %f, y %f \n",y_min, y_max, y); + // printf("z_min %f, z_max %f, z %f \n",z_min, z_max, z); + #endif + /* Check if any coordinate is further than the tolerance away */ + //if (!((fabs(x0 - x) > 0.01 || fabs(y0 - y) > 0.01 || fabs(z0 - z) > 0.01))){ + x0 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[0]][0]; + y0 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[0]][1]; + z0 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[0]][2]; + x1 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[1]][0]; + y1 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[1]][1]; + z1 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[1]][2]; + x2 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[2]][0]; + y2 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[2]][1]; + z2 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[2]][2]; + x3 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[3]][0]; + y3 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[3]][1]; + z3 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[3]][2]; + + /* Entries for mapping of physical to natural coordinates of test element */ + a11 = (z3 - z0) * (y2 - y3) - (z2 - z3) * (y3 - y0); + a21 = (z3 - z0) * (y0 - y1) - (z0 - z1) * (y3 - y0); + a31 = (z1 - z2) * (y0 - y1) - (z0 - z1) * (y1 - y2); + a12 = (x3 - x0) * (z2 - z3) - (x2 - x3) * (z3 - z0); + a22 = (x3 - x0) * (z0 - z1) - (x0 - x1) * (z3 - z0); + a32 = (x1 - x2) * (z0 - z1) - (x0 - x1) * (z1 - z2); + a13 = (y3 - y0) * (x2 - x3) - (y2 - y3) * (x3 - x0); + a23 = (y3 - y0) * (x0 - x1) - (y0 - y1) * (x3 - x0); + a33 = (y1 - y2) * (x0 - x1) - (y0 - y1) * (x1 - x2); + + /* Determinant of mapping from natural to physical coordinates of test element */ + V = (x1 - x0) * ((y2 - y0) * (z3 - z0) - (z2 - z0) * (y3 - y0)) + + (x2 - x0) * ((y0 - y1) * (z3 - z0) - (z0 - z1) * (y3 - y0)) + + (x3 - x0) * ((y1 - y0) * (z2 - z0) - (z1 - z0) * (y2 - y0)); + + /* Natural coordinates of point to be interpolated */ + r = (a11 * (x - x0) + a12 * (y - y0) + a13 * (z - z0)) / V; + s = (a21 * (x - x0) + a22 * (y - y0) + a23 * (z - z0)) / V; + t = (a31 * (x - x0) + a32 * (y - y0) + a33 * (z - z0)) / V; + + d = fmin(r, fmin(s, fmin(t, 1 - r - s - t))); + + if(d > -TINY){ /* Point inside test element */ + #ifdef DEBUG + printf("DEBUG: global search sucessful \n"); + #endif + return(i); + } + else /* Check next element */ + i++; + } + + + } else { /* Dimensions == 2 */ /* Physical coordinates of nodes of the test element */ x0 = Vel_MeshNodeArray[Vel_MeshElementArray[i].Nodes[0]][0]; @@ -388,13 +428,18 @@ int Get_Element_Global_Search(const double *X) { d = fmin(r, fmin(s, 1 - r - s)); - if(d > -TINY) /* Point inside test element */ + if(d > -TINY) {/* Point inside test element */ + return(i); + } else /* Check next element */ i++; } + } - + #ifdef DEBUG + //printf("global search did not return \n"); + #endif return -1; } @@ -504,10 +549,13 @@ int Get_Element_Local_Search(const double *X, int guess) { double a11, a12, a13, a21, a22, a23, a31, a32, a33; double r, s, t, d; double V; - + x = X[0]; y = X[1]; z = X[2]; + #ifdef DEBUG + printf("DEBUG: starting local search \n"); + #endif while(1) { if(Dimensions == 3) { @@ -548,8 +596,12 @@ int Get_Element_Local_Search(const double *X, int guess) { d = fmin(r, fmin(s, fmin(t, 1 - r - s - t))); - if(d > -TINY) /* Point inside test element */ - return(guess); + if(d > -TINY){ /* Point inside test element */ + #ifdef DEBUG + printf("DEBUG: Local Search Successful \n"); + #endif + return(guess); + } else { /* Reset test element to neighbor */ if(fabs(r - d) < TINY) guess = Vel_MeshElementArray[guess].NeighborIndex[0]; @@ -728,3 +780,43 @@ int Get_Element_Local_Search_Aux(const double *X, int guess) { } + +int check_bounds(int *i, int *stop_flag, double x, int coord){ + double x0, x1, x2, x3; + double x_max, x_min; + // Function to determine if a points value (either x, y or z) is between an elements min and max of that cordinate + // Arguments + // *i : a pointer to the i counter wich is the element of interest + // *stop_flag: a pointer to the stop flag. If the cordinate cannot possibly be in the element the value stored in this location will be set to 1 + // *x: the cordinate value that you are checking (either the x, y or z value) + // coord: (0 = x , 1= y, 2 = z) + // + + // + //get the value of the cordinate ( + x0 = Vel_MeshNodeArray[Vel_MeshElementArray[*i].Nodes[0]][coord]; + x1 = Vel_MeshNodeArray[Vel_MeshElementArray[*i].Nodes[1]][coord]; + x2 = Vel_MeshNodeArray[Vel_MeshElementArray[*i].Nodes[2]][coord]; + x3 = Vel_MeshNodeArray[Vel_MeshElementArray[*i].Nodes[3]][coord]; + x_min = fmin(x0, fmin(x1, fmin(x2,x3))); + x_max = fmax(x0, fmax(x1, fmax(x2,x3))); + // If we are not in y range, move to next element + if(x> x_max || x< x_min){ + *i =*i+1; + *stop_flag = 1; + #ifdef DEBUG + if(coord ==0){ + //printf("DEBUG: stop at x \n"); + } + else if (coord ==1){ + //printf("DEBUG: stop at y \n"); + } + else{ + //printf("DEBUG: stop at z \n"); + } + + #endif + } +} + + diff --git a/src/mesh.o b/src/mesh.o deleted file mode 100644 index 10d9b41..0000000 Binary files a/src/mesh.o and /dev/null differ diff --git a/src/mymath.o b/src/mymath.o deleted file mode 100644 index 7f2030c..0000000 Binary files a/src/mymath.o and /dev/null differ diff --git a/src/parameters.o b/src/parameters.o deleted file mode 100644 index a1f362a..0000000 Binary files a/src/parameters.o and /dev/null differ diff --git a/src/residencetime.o b/src/residencetime.o deleted file mode 100644 index ae425e2..0000000 Binary files a/src/residencetime.o and /dev/null differ diff --git a/src/strainrate.o b/src/strainrate.o deleted file mode 100644 index e8d0760..0000000 Binary files a/src/strainrate.o and /dev/null differ diff --git a/src/structs.h b/src/structs.h index cc53433..6cef967 100644 --- a/src/structs.h +++ b/src/structs.h @@ -75,4 +75,9 @@ typedef struct _CETE { int Encounters; } CETE; -#endif \ No newline at end of file +typedef struct _Search { + int searched; + int found; +} Search; + +#endif diff --git a/src/tracers.o b/src/tracers.o deleted file mode 100644 index 539f6f4..0000000 Binary files a/src/tracers.o and /dev/null differ diff --git a/src/velocity.c b/src/velocity.c index 508b542..fe048d5 100644 --- a/src/velocity.c +++ b/src/velocity.c @@ -480,7 +480,8 @@ void GetVelocity_Unstructured(const double tq, LagrangianPoint *pt, double *dXdt double r, s, t, d; double V; double tloc; - + + if(pt->ElementIndex == -1) FatalError("Attempting to interpolate velocity at point with Element_Index = -1"); diff --git a/src/velocity.o b/src/velocity.o deleted file mode 100644 index 934c08c..0000000 Binary files a/src/velocity.o and /dev/null differ diff --git a/src/velout.o b/src/velout.o deleted file mode 100644 index 861f1f6..0000000 Binary files a/src/velout.o and /dev/null differ diff --git a/src/vorticity.o b/src/vorticity.o deleted file mode 100644 index 13d311f..0000000 Binary files a/src/vorticity.o and /dev/null differ diff --git a/test/support/.gitignore b/test/support/.gitignore new file mode 100644 index 0000000..e69de29 diff --git a/test/test_mymath.c b/test/test_mymath.c new file mode 100644 index 0000000..eebdaac --- /dev/null +++ b/test/test_mymath.c @@ -0,0 +1,117 @@ +#ifdef TEST +#include "unity.h" +#include "mymath.h" +#include "mock_io.h" + + +void setUp(void) { + // set stuff up here +} + +void tearDown(void) { + // clean stuff up here +} + +void test_vdot(void) { + double v1[] = {1.0, 2.0, 3.0}; + double v2[] = {4.0, 5.0, 6.0}; + int dim = 3; + + double expected = 1.0 * 4.0 + 2.0 * 5.0 + 3.0 * 6.0; // Expected result: 32.0 + double result = vdot(v1, v2, dim); + + TEST_ASSERT_DOUBLE_WITHIN(1e-6, expected, result); +} + +// Test for cross function +void test_cross(void) { + double u[] = {1.0, 2.0, 3.0}; + double v[] = {4.0, 5.0, 6.0}; + double result[3]; + cross(u, v, result); + TEST_ASSERT_EQUAL_DOUBLE(-3.0, result[0]); + TEST_ASSERT_EQUAL_DOUBLE(6.0, result[1]); + TEST_ASSERT_EQUAL_DOUBLE(-3.0, result[2]); +} + +// Test for dist function +void test_dist(void) { + double v1[] = {1.0, 2.0, 3.0}; + double v2[] = {4.0, 5.0, 6.0}; + double distance = dist(v1, v2, 3); + TEST_ASSERT_EQUAL_DOUBLE(sqrt(27), distance); // sqrt((4-1)^2 + (5-2)^2 + (6-3)^2) +} + +// Test for vdiff function +void test_vdiff(void) { + double v1[] = {5.0, 2.0, 1.0}; + double v2[] = {3.0, 2.0, 0.0}; + double result[3]; + vdiff(v1, v2, result); + TEST_ASSERT_EQUAL_DOUBLE(2.0, result[0]); + TEST_ASSERT_EQUAL_DOUBLE(0.0, result[1]); + TEST_ASSERT_EQUAL_DOUBLE(1.0, result[2]); +} + +// Test for distline function +void test_distline(void) { + double x1[] = {0.0, 0.0, 0.0}; + double x2[] = {1.0, 0.0, 0.0}; + double x0[] = {1.0, 3.0, 4.0}; + double result = distline(x1, x2, x0); + double expected = 5.0; + TEST_ASSERT_DOUBLE_WITHIN(0.001, expected, result); + +} + +// Test for TwoVectorMean function +void test_TwoVectorMean(void) { + double v1[] = {1.0, 2.0, 3.0}; + double v2[] = {5.0, 6.0, 7.0}; + double mean[3]; + TwoVectorMean(v1, v2, mean); + TEST_ASSERT_EQUAL_DOUBLE(3.0, mean[0]); + TEST_ASSERT_EQUAL_DOUBLE(4.0, mean[1]); + TEST_ASSERT_EQUAL_DOUBLE(5.0, mean[2]); +} + +// Test for ThreeVectorMean function +void test_ThreeVectorMean(void) { + double v1[] = {1.0, 2.0, 3.0}; + double v2[] = {4.0, 5.0, 6.0}; + double v3[] = {7.0, 8.0, 9.0}; + double mean[3]; + ThreeVectorMean(v1, v2, v3, mean); + TEST_ASSERT_EQUAL_DOUBLE(4.0, mean[0]); + TEST_ASSERT_EQUAL_DOUBLE(5.0, mean[1]); + TEST_ASSERT_EQUAL_DOUBLE(6.0, mean[2]); +} + +void test_GetMaxEigenvalue(void) { + double matrix[3][3] = { + {1.0, 2.0, 3.0}, + {2.0, 5.0, 8.0}, + {3.0, 8.0, 14.0} + }; + + double expected = 19.384; + double result = GetMaxEigenvalue(matrix); + + TEST_ASSERT_DOUBLE_WITHIN(0.01, expected, result); +} + +/* int main(void) */ +/* { */ +/* UNITY_BEGIN(); */ +/* RUN_TEST(test_vdot); */ +/* RUN_TEST(test_cross); */ +/* RUN_TEST(test_dist); */ +/* RUN_TEST(test_vdiff); */ +/* RUN_TEST(test_distline); */ +/* RUN_TEST(test_TwoVectorMean); */ +/* RUN_TEST(test_ThreeVectorMean); */ +/* RUN_TEST(test_GetMaxEigenvalue); */ + +/* return UNITY_END(); */ +/* } */ +#endif // TEST diff --git a/test/test_strainrate.c b/test/test_strainrate.c new file mode 100644 index 0000000..d6fa7c7 --- /dev/null +++ b/test/test_strainrate.c @@ -0,0 +1,22 @@ +#ifdef TEST +#include "unity.h" +#include "globals.h" +#include "io.h" +#include "macros.h" +#include "memory.h" +#include "mock_mesh.h" +#include "structs.h" +#include "mock_tracers.h" +#include "velocity.h" +#include "strainrate.h" + +void setUp(void) { + // set stuff up here +} + +void tearDown(void) { + // clean stuff up here +} + + +#endif // TEST