├── .gitattributes
├── .gitignore
├── LICENSE
├── MANIFEST.in
├── README.md
├── data
├── example_Ub_planeZ_0.01.raw
├── example_adim_vel_000010.dat
├── example_adim_vel_000011.dat
├── example_adim_vel_000012.dat
├── example_data_HIT.nc
├── example_data_numerical_PIV.nc
├── example_dim_vel_000010.dat
├── example_mean.dat
├── example_vel_000005.dat
├── example_vel_000006.dat
├── generatedField.nc
├── test_dataHIT.nc
├── test_dataHIT2.nc
├── test_dataHIT_ascii.dat
├── test_dataHIT_back_converted.dat
└── test_dataHIT_back_converted.nc
├── docs
├── .nojekyll
├── Makefile
├── _images
│ ├── DNSvortex0_1.png
│ ├── DNSvortex0_2.png
│ ├── DNSvortex1_1.png
│ ├── DNSvortex1_2.png
│ ├── FittingFlow.png
│ ├── HIT_00.svg
│ ├── HIT_01.svg
│ ├── HIT_02.svg
│ ├── HIT_04.svg
│ ├── PIV_accepted_10.svg
│ ├── PIVbox12normalized.png
│ ├── PIVnonnormalized.pdf
│ ├── PIVnonnormalized.png
│ ├── PIVnormalized.png
│ ├── PIVvortex0_1.png
│ ├── PIVvortex0_2.png
│ ├── PIVvortex1_1.png
│ ├── PIVvortex1_2.png
│ ├── dns_detect.png
│ ├── dns_fit1.png
│ ├── dns_fit2.png
│ ├── dns_fit3.png
│ ├── dns_fit4.png
│ ├── dns_fit5.png
│ ├── dns_fit6.png
│ ├── dns_quiver1.png
│ ├── dns_quiver2.png
│ ├── generateNetCDF_vortex.png
│ ├── math
│ │ ├── 05e1e42015bc83ca93e9c4f6d1f6dd79e403ee73.png
│ │ ├── 06282858f9fa69319d9381c2043f8d89f1de25a3.png
│ │ ├── 08768bea9a4f32ddae76840e221d2b53b66e3682.png
│ │ ├── 09a0032b49d6ee37826d2c7832939925f295a150.png
│ │ ├── 0a224fe2b9dc9ecd1db1026be04320b36212cd0f.png
│ │ ├── 0ac5fbb61b3d037658b7fb6cb587ed0a8c8807be.png
│ │ ├── 0b537bc410c50c531264483f8ef482bffa44487b.png
│ │ ├── 0cd5cbcaf1f0b35ed0d20e07d7a7dc6902c05f89.png
│ │ ├── 0d9d1bf51babbf25b68a5fce448ee23f82e3082f.png
│ │ ├── 0e446cddc6db58a37e508b13d0bef16fbbb474ad.png
│ │ ├── 0e93d8d50fc35b57aea5ef75f3d6120cc11c7869.png
│ │ ├── 0f7e6ace98f72af999964ce8b01dbcc0cb51fa47.png
│ │ ├── 125f35ff10498aba1858d99bf74cbcf6fdf833d0.png
│ │ ├── 12e2dcb0d6ea780af305f4e4608e95fe03217f1a.png
│ │ ├── 14eb89266154200b9c81dcfc3bd058638fa221bf.png
│ │ ├── 18cab73c968ee2b0cc8c1459d97f668b6ba9ca47.png
│ │ ├── 20da0878c34a32477a28a5f05d6617b9c8ac5eba.png
│ │ ├── 2128d4325d76e6f3e161b93c6b2357522ade5388.png
│ │ ├── 21bbfc7253cef94c182b12dfd4ce7b11ff0655fc.png
│ │ ├── 229f7377f257cf043cef091bd71b3821e3e95711.png
│ │ ├── 26f5c0e9a27e4bb9eed0d75b3cb1f7c0d93f0402.png
│ │ ├── 2923141ad5fe162100a4ba939ce731ab13dc54a7.png
│ │ ├── 326c13bdcad398311610f57f8a093c3223cb1374.png
│ │ ├── 339149b0b69037580e74227ddff876c2636dd105.png
│ │ ├── 37d331872bccce71ceb318ca290950c681187cb4.png
│ │ ├── 39342f84ed5586fb861cb245fa5aee822f5fac3b.png
│ │ ├── 3ada1e1ff7afb768184fbca182c019730ac0ec24.png
│ │ ├── 3be04d4207434584251f6921820c24ac9fa8c6f1.png
│ │ ├── 3d9d12a9c67ce6e3d26fef531041d477a448166a.png
│ │ ├── 3ed0beb19a713357408972e04b961b2a22f37700.png
│ │ ├── 3f5bdeb915cff30277afb36ea90eebe003de8053.png
│ │ ├── 4855baa594b81935504161defd13c3fc952a4550.png
│ │ ├── 4cfc3c9abab5a5c2870dd9235a43b255ba28e3c3.png
│ │ ├── 4d26a3c646f81ab56cceb818c7801dd1f3cfaaf3.png
│ │ ├── 51708e129f045be4af893527b6d35c53a5ce0ec2.png
│ │ ├── 536203b6089ad8850e6a6a8f7120f554dd8989c2.png
│ │ ├── 53bb978c28a4fca1d2e5711bf3152e65f182884f.png
│ │ ├── 55c6e208f7350dd48f8d4d1172101a37f9659bae.png
│ │ ├── 57649815d515c2baa7b6fadfceed4067e439495f.png
│ │ ├── 579df97bf3643d610cb2778afcd3c79129fce5de.png
│ │ ├── 6450616b75212cb568e905db49efd0c3dd584648.png
│ │ ├── 65635b3694a7e7cb3de56ecb92d87afcff9487c3.png
│ │ ├── 6b236716ab129ffe94eb30e9023c84c8d4a6f5b3.png
│ │ ├── 6e960eccb22a501212200c8f5f87c95e6898ef2d.png
│ │ ├── 6f27ee4cd76ae38403d2aaee80f1d52fe28bf489.png
│ │ ├── 745eb364a9475062a5c09ab50c8f5cba68f14601.png
│ │ ├── 78f5bc027ff3ddbb99d1fedea3c5b41c306900ae.png
│ │ ├── 79a3d439d28652c547386f39b555d90d3aaf102d.png
│ │ ├── 7b5d236cfd7d352d86450e807eb7dcd0a62db2bc.png
│ │ ├── 8162cb172ecdaaf8557f86284715c6dc26f057e9.png
│ │ ├── 86618d947a94eaaaf4ef96bfa62c43186b3301b9.png
│ │ ├── 87cc8f2cb5da678b00fdd3a9942b419da71d0665.png
│ │ ├── 8a014c4fa69db152179d9df21fa224d8944f59e9.png
│ │ ├── 8a221894ca9b7abb34efd05f787ec33073be4187.png
│ │ ├── 8a87f04e7d7cca18343c084cceca5237fae62491.png
│ │ ├── 8cf54edeb14d31849024a87a40d956a787b79109.png
│ │ ├── 8f431f1535704a32339e823dbfc67f230f5bcd89.png
│ │ ├── 91154ea44770144e9d39196b6f28c54ea553188c.png
│ │ ├── 92f3adf08bed8246a0f9221af961292467dee08a.png
│ │ ├── 97ce8490384510232af439974e12cd5336841e7c.png
│ │ ├── 984c8a8922eecd2d9e30bd84eb136b3faf36adb4.png
│ │ ├── 9a018f0a7fe05ec406a9bd8374ed418d0745114f.png
│ │ ├── a0c62aaf8433160b7aae20b522e4e03eb2148b7d.png
│ │ ├── a0fba1111fb08ada16b5c455e227418c0aa07874.png
│ │ ├── a3f2adb46197c15367a9a3b8db89e0020989f251.png
│ │ ├── a432f4bc897a07a74d2b2d20747b3d8b769d2de4.png
│ │ ├── a6552654d8248cb3119190570d8a244eed0ecc9b.png
│ │ ├── a69f36fb7823eb935addff55f9d59dab484298b1.png
│ │ ├── a77d8f7f396d4c1d9e610005aaf150bbd020048a.png
│ │ ├── a7ed46b778b12ebd6441fc1c78537a68495e92cd.png
│ │ ├── ab3ca355d97c3be04d1bfeefe17d274ddfb0553b.png
│ │ ├── af198cc9e8f5cd01bbefe2e68060d3fca18bd490.png
│ │ ├── aff85625c5f240217712f329a522f2b70cbe582e.png
│ │ ├── b527d3e4d6589c8a96c282b6615c83a831bf7179.png
│ │ ├── b60d2e0a877a42bf270d53d476dd884f7aaa92c3.png
│ │ ├── b78394d00b424394921b457b7153b8af07fc939c.png
│ │ ├── b938ef7cf0d858368af8b24c5a1581ef6afcb369.png
│ │ ├── b98fddf0781eb412543cbd6b46a9343b0560d4a1.png
│ │ ├── bbcf06400a1235cfb5a871b48df5eecc83abc842.png
│ │ ├── be9a07b2c8c9f23ba3ff5c67985ef3f26e1b427c.png
│ │ ├── bed6e7e19f16d3c74617a973da6b0f78a3249a83.png
│ │ ├── c04e056decf5efdb3b3fe69e0a2d995bfa680488.png
│ │ ├── c483f522eb6956f8b0a7341fdf0dbe63c9f575f2.png
│ │ ├── c79c965e2ebd7b4cf0724beb64c8929aed7d635d.png
│ │ ├── c90118167c66a803463d7deda73f276163ef3eda.png
│ │ ├── ca3b8fa4180eee2dfc3af9d13fae1da451cd2c31.png
│ │ ├── d2bac4d3f7f89f981f16e99a409b504e39e80c1b.png
│ │ ├── d3e07657a7ee6e91d95a458406e8a776a55be4f6.png
│ │ ├── d872993ed0c7c420e73e77a1d285ac100c516806.png
│ │ ├── d99f24d9ef68df0eb3a2fcc8c2ba8dafd2973ecc.png
│ │ ├── dbce97688e276bfb719b2e65988a5d1cb17eb1a5.png
│ │ ├── dc66df3fc466f497b4e9157c9943acdafb1aa717.png
│ │ ├── e0bb5f2e43819498dd495faee10e8964fb66c479.png
│ │ ├── e5fafa36c515181a1fd8bc7b1ba0c44faeabe4f4.png
│ │ ├── e7003fd3463f843ee1e53385878369f078d362ad.png
│ │ ├── eaa0e4f79b9e9b0d1ee9b00e837ebdf6a42f82ed.png
│ │ ├── eaa6ad49a7f78fe5a13b486690163bf2dc7e3e60.png
│ │ ├── eb7664a3ab226a838f4b25de0a190e37dd9cec57.png
│ │ ├── eca23fb19395340d7b4467a697d88862e05ae6b8.png
│ │ ├── edf63edf19b49aa39ec3005de91eff83ef1bbbe5.png
│ │ ├── eeb7d854d71ddcc1537e1ece9017ae60ac703fc2.png
│ │ ├── ef217602d7ecee6f4986e2eb1e547cc96f839808.png
│ │ ├── f0a426e317a9c5ce68ee512fcff4b29da2665828.png
│ │ ├── f9aefa6e6dd9b26a90b378c77e493a0fe7db79ff.png
│ │ ├── fb5ea61e9a68aab0b56d46c9cd642b623dffc456.png
│ │ ├── fcade169349aa461f70318e0f45ee675b88b2a33.png
│ │ └── ffd13fe6632b9cfd8d1c8d4b8aeb32aae6c498d4.png
│ ├── openfoam.png
│ ├── openfoam_quiverplot.png
│ ├── piv_15.svg
│ ├── script.sh
│ ├── test_02_10.png
│ ├── test_02_10N.png
│ ├── test_02_10_02.png
│ ├── test_02_10_02N.png
│ ├── test_09_40.png
│ ├── test_09_40N.png
│ ├── test_09_40_02.png
│ ├── test_09_40_02N.png
│ └── vortexFittingFlow.png
├── _static
│ ├── ajax-loader.gif
│ ├── basic.css
│ ├── comment-bright.png
│ ├── comment-close.png
│ ├── comment.png
│ ├── dialog-note.png
│ ├── dialog-seealso.png
│ ├── dialog-todo.png
│ ├── dialog-topic.png
│ ├── dialog-warning.png
│ ├── doctools.js
│ ├── down-pressed.png
│ ├── down.png
│ ├── epub.css
│ ├── file.png
│ ├── footerbg.png
│ ├── headerbg.png
│ ├── ie6.css
│ ├── jquery-3.1.0.js
│ ├── jquery.js
│ ├── middlebg.png
│ ├── minus.png
│ ├── plus.png
│ ├── pygments.css
│ ├── pyramid.css
│ ├── searchtools.js
│ ├── transparent.gif
│ ├── underscore-1.3.1.js
│ ├── underscore.js
│ ├── up-pressed.png
│ ├── up.png
│ └── websupport.js
├── conf.py
├── contributors.html
├── contributors.rst
├── examples.html
├── examples.rst
├── genindex.html
├── index.html
├── index.rst
├── installation.html
├── installation.rst
├── introduction.html
├── introduction.rst
├── make.bat
├── methodology.html
├── methodology.rst
├── modules
│ ├── classes.html
│ ├── classes.rst
│ ├── detection.html
│ ├── detection.rst
│ ├── fitting.html
│ ├── fitting.rst
│ ├── modules.html
│ ├── modules.rst
│ ├── output.html
│ ├── output.rst
│ ├── schemes.html
│ └── schemes.rst
├── objects.inv
├── py-modindex.html
├── search.html
├── searchindex.js
├── software_options.html
├── software_options.rst
├── update_docs.py
└── update_docs.sh
├── makeExamples.py
├── makeExamples.sh
├── makeTests.py
├── makeTests.sh
├── requirements.txt
├── run.py
├── setup.py
├── tests
├── testOseen.py
├── test_fitting.py
├── test_schemes.py
├── test_tools.py
└── vortex0_0_initial_vfield.png
└── vortexfitting
├── __init__.py
├── __main__.py
├── classes.py
├── convertToASCII.py
├── convertToNC.py
├── detection.py
├── fitting.py
├── generateNetCDF.py
├── output.py
└── schemes.py
/.gitattributes:
--------------------------------------------------------------------------------
1 | *.* linguist-language=Python
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | results/
2 | docs/_sources/
3 | *.aux
4 | *.bbl
5 | *.blg
6 | *.lof
7 | *.lot
8 | *.toc
9 | *.gz
10 |
11 |
12 | # Byte-compiled / optimized / DLL files
13 | __pycache__/
14 | *.py[cod]
15 | *$py.class
16 |
17 | # C extensions
18 | *.so
19 |
20 | # Distribution / packaging
21 | .Python
22 | env/
23 | build/
24 | develop-eggs/
25 | dist/
26 | downloads/
27 | eggs/
28 | .eggs/
29 | lib/
30 | lib64/
31 | parts/
32 | sdist/
33 | var/
34 | *.egg-info/
35 | .installed.cfg
36 | *.egg
37 |
38 | # PyInstaller
39 | # Usually these files are written by a python script from a template
40 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
41 | *.manifest
42 | *.spec
43 |
44 | # Installer logs
45 | pip-log.txt
46 | pip-delete-this-directory.txt
47 |
48 | # Unit test / coverage reports
49 | htmlcov/
50 | .tox/
51 | .coverage
52 | .coverage.*
53 | .cache
54 | nosetests.xml
55 | coverage.xml
56 | *,cover
57 | .hypothesis/
58 |
59 | # Translations
60 | *.mo
61 | *.pot
62 |
63 | # Django stuff:
64 | *.log
65 | local_settings.py
66 |
67 | # Flask stuff:
68 | instance/
69 | .webassets-cache
70 |
71 | # Scrapy stuff:
72 | .scrapy
73 |
74 | # Sphinx documentation
75 | docs/_build/
76 |
77 | # PyBuilder
78 | target/
79 |
80 | # IPython Notebook
81 | .ipynb_checkpoints
82 |
83 | # pyenv
84 | .python-version
85 |
86 | # celery beat schedule file
87 | celerybeat-schedule
88 |
89 | # dotenv
90 | .env
91 |
92 | # virtualenv
93 | venv/
94 | ENV/
95 |
96 | # Spyder project settings
97 | .spyderproject
98 |
99 | # Rope project settings
100 | .ropeproject
101 |
102 | # PyCharm project settings
103 | .idea/
104 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 Guilherme Lindner
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/MANIFEST.in:
--------------------------------------------------------------------------------
1 | include vortexfitting/data/*
2 | include *.sh
3 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # VortexFitting
2 | Tools for detection, identification and fitting of vortices based on the non-linear fitting of the Lamb-Oseen vortex model.
3 |
4 | # Documentation
5 | https://guilindner.github.io/VortexFitting/
6 |
7 | If using this software, please cite the following article: [VortexFitting at SoftwareX](https://doi.org/10.1016/j.softx.2020.100604)
8 |
9 |
10 | This project started from the [International Master in Turbulence](https://centralelille.fr/en/aeronautic-space-major-turbulence/
11 | ), at Ecole Centrale de Lille, under the supervision of Jean-Philippe Laval, Jean Marc Foucaut and Ilkay Solak.
12 | The code was improved and [validated](https://iopscience.iop.org/article/10.1088/1873-7005/ab7ebf) by Dr. Yann Devaux at Institute Pprime, Poitiers, France.
13 |
--------------------------------------------------------------------------------
/data/example_data_HIT.nc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/data/example_data_HIT.nc
--------------------------------------------------------------------------------
/data/example_data_numerical_PIV.nc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/data/example_data_numerical_PIV.nc
--------------------------------------------------------------------------------
/data/generatedField.nc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/data/generatedField.nc
--------------------------------------------------------------------------------
/data/test_dataHIT2.nc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/data/test_dataHIT2.nc
--------------------------------------------------------------------------------
/data/test_dataHIT_back_converted.dat:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/data/test_dataHIT_back_converted.dat
--------------------------------------------------------------------------------
/data/test_dataHIT_back_converted.nc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/data/test_dataHIT_back_converted.nc
--------------------------------------------------------------------------------
/docs/.nojekyll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/.nojekyll
--------------------------------------------------------------------------------
/docs/Makefile:
--------------------------------------------------------------------------------
1 | # Minimal makefile for Sphinx documentation
2 | #
3 |
4 | # You can set these variables from the command line.
5 | SPHINXOPTS =
6 | SPHINXBUILD = python -msphinx
7 | SPHINXPROJ = VortexFitting
8 | SOURCEDIR = .
9 | BUILDDIR = _build
10 |
11 | # Put it first so that "make" without argument is like "make help".
12 | help:
13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
14 |
15 | .PHONY: help Makefile
16 |
17 | # Catch-all target: route all unknown targets to Sphinx using the new
18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
19 | %: Makefile
20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
--------------------------------------------------------------------------------
/docs/_images/DNSvortex0_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/DNSvortex0_1.png
--------------------------------------------------------------------------------
/docs/_images/DNSvortex0_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/DNSvortex0_2.png
--------------------------------------------------------------------------------
/docs/_images/DNSvortex1_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/DNSvortex1_1.png
--------------------------------------------------------------------------------
/docs/_images/DNSvortex1_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/DNSvortex1_2.png
--------------------------------------------------------------------------------
/docs/_images/FittingFlow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/FittingFlow.png
--------------------------------------------------------------------------------
/docs/_images/PIVbox12normalized.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/PIVbox12normalized.png
--------------------------------------------------------------------------------
/docs/_images/PIVnonnormalized.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/PIVnonnormalized.pdf
--------------------------------------------------------------------------------
/docs/_images/PIVnonnormalized.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/PIVnonnormalized.png
--------------------------------------------------------------------------------
/docs/_images/PIVnormalized.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/PIVnormalized.png
--------------------------------------------------------------------------------
/docs/_images/PIVvortex0_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/PIVvortex0_1.png
--------------------------------------------------------------------------------
/docs/_images/PIVvortex0_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/PIVvortex0_2.png
--------------------------------------------------------------------------------
/docs/_images/PIVvortex1_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/PIVvortex1_1.png
--------------------------------------------------------------------------------
/docs/_images/PIVvortex1_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/PIVvortex1_2.png
--------------------------------------------------------------------------------
/docs/_images/dns_detect.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/dns_detect.png
--------------------------------------------------------------------------------
/docs/_images/dns_fit1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/dns_fit1.png
--------------------------------------------------------------------------------
/docs/_images/dns_fit2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/dns_fit2.png
--------------------------------------------------------------------------------
/docs/_images/dns_fit3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/dns_fit3.png
--------------------------------------------------------------------------------
/docs/_images/dns_fit4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/dns_fit4.png
--------------------------------------------------------------------------------
/docs/_images/dns_fit5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/dns_fit5.png
--------------------------------------------------------------------------------
/docs/_images/dns_fit6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/dns_fit6.png
--------------------------------------------------------------------------------
/docs/_images/dns_quiver1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/dns_quiver1.png
--------------------------------------------------------------------------------
/docs/_images/dns_quiver2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/dns_quiver2.png
--------------------------------------------------------------------------------
/docs/_images/generateNetCDF_vortex.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/generateNetCDF_vortex.png
--------------------------------------------------------------------------------
/docs/_images/math/05e1e42015bc83ca93e9c4f6d1f6dd79e403ee73.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/05e1e42015bc83ca93e9c4f6d1f6dd79e403ee73.png
--------------------------------------------------------------------------------
/docs/_images/math/06282858f9fa69319d9381c2043f8d89f1de25a3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/06282858f9fa69319d9381c2043f8d89f1de25a3.png
--------------------------------------------------------------------------------
/docs/_images/math/08768bea9a4f32ddae76840e221d2b53b66e3682.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/08768bea9a4f32ddae76840e221d2b53b66e3682.png
--------------------------------------------------------------------------------
/docs/_images/math/09a0032b49d6ee37826d2c7832939925f295a150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/09a0032b49d6ee37826d2c7832939925f295a150.png
--------------------------------------------------------------------------------
/docs/_images/math/0a224fe2b9dc9ecd1db1026be04320b36212cd0f.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/0a224fe2b9dc9ecd1db1026be04320b36212cd0f.png
--------------------------------------------------------------------------------
/docs/_images/math/0ac5fbb61b3d037658b7fb6cb587ed0a8c8807be.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/0ac5fbb61b3d037658b7fb6cb587ed0a8c8807be.png
--------------------------------------------------------------------------------
/docs/_images/math/0b537bc410c50c531264483f8ef482bffa44487b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/0b537bc410c50c531264483f8ef482bffa44487b.png
--------------------------------------------------------------------------------
/docs/_images/math/0cd5cbcaf1f0b35ed0d20e07d7a7dc6902c05f89.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/0cd5cbcaf1f0b35ed0d20e07d7a7dc6902c05f89.png
--------------------------------------------------------------------------------
/docs/_images/math/0d9d1bf51babbf25b68a5fce448ee23f82e3082f.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/0d9d1bf51babbf25b68a5fce448ee23f82e3082f.png
--------------------------------------------------------------------------------
/docs/_images/math/0e446cddc6db58a37e508b13d0bef16fbbb474ad.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/0e446cddc6db58a37e508b13d0bef16fbbb474ad.png
--------------------------------------------------------------------------------
/docs/_images/math/0e93d8d50fc35b57aea5ef75f3d6120cc11c7869.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/0e93d8d50fc35b57aea5ef75f3d6120cc11c7869.png
--------------------------------------------------------------------------------
/docs/_images/math/0f7e6ace98f72af999964ce8b01dbcc0cb51fa47.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/0f7e6ace98f72af999964ce8b01dbcc0cb51fa47.png
--------------------------------------------------------------------------------
/docs/_images/math/125f35ff10498aba1858d99bf74cbcf6fdf833d0.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/125f35ff10498aba1858d99bf74cbcf6fdf833d0.png
--------------------------------------------------------------------------------
/docs/_images/math/12e2dcb0d6ea780af305f4e4608e95fe03217f1a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/12e2dcb0d6ea780af305f4e4608e95fe03217f1a.png
--------------------------------------------------------------------------------
/docs/_images/math/14eb89266154200b9c81dcfc3bd058638fa221bf.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/14eb89266154200b9c81dcfc3bd058638fa221bf.png
--------------------------------------------------------------------------------
/docs/_images/math/18cab73c968ee2b0cc8c1459d97f668b6ba9ca47.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/18cab73c968ee2b0cc8c1459d97f668b6ba9ca47.png
--------------------------------------------------------------------------------
/docs/_images/math/20da0878c34a32477a28a5f05d6617b9c8ac5eba.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/20da0878c34a32477a28a5f05d6617b9c8ac5eba.png
--------------------------------------------------------------------------------
/docs/_images/math/2128d4325d76e6f3e161b93c6b2357522ade5388.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/2128d4325d76e6f3e161b93c6b2357522ade5388.png
--------------------------------------------------------------------------------
/docs/_images/math/21bbfc7253cef94c182b12dfd4ce7b11ff0655fc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/21bbfc7253cef94c182b12dfd4ce7b11ff0655fc.png
--------------------------------------------------------------------------------
/docs/_images/math/229f7377f257cf043cef091bd71b3821e3e95711.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/229f7377f257cf043cef091bd71b3821e3e95711.png
--------------------------------------------------------------------------------
/docs/_images/math/26f5c0e9a27e4bb9eed0d75b3cb1f7c0d93f0402.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/26f5c0e9a27e4bb9eed0d75b3cb1f7c0d93f0402.png
--------------------------------------------------------------------------------
/docs/_images/math/2923141ad5fe162100a4ba939ce731ab13dc54a7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/2923141ad5fe162100a4ba939ce731ab13dc54a7.png
--------------------------------------------------------------------------------
/docs/_images/math/326c13bdcad398311610f57f8a093c3223cb1374.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/326c13bdcad398311610f57f8a093c3223cb1374.png
--------------------------------------------------------------------------------
/docs/_images/math/339149b0b69037580e74227ddff876c2636dd105.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/339149b0b69037580e74227ddff876c2636dd105.png
--------------------------------------------------------------------------------
/docs/_images/math/37d331872bccce71ceb318ca290950c681187cb4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/37d331872bccce71ceb318ca290950c681187cb4.png
--------------------------------------------------------------------------------
/docs/_images/math/39342f84ed5586fb861cb245fa5aee822f5fac3b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/39342f84ed5586fb861cb245fa5aee822f5fac3b.png
--------------------------------------------------------------------------------
/docs/_images/math/3ada1e1ff7afb768184fbca182c019730ac0ec24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/3ada1e1ff7afb768184fbca182c019730ac0ec24.png
--------------------------------------------------------------------------------
/docs/_images/math/3be04d4207434584251f6921820c24ac9fa8c6f1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/3be04d4207434584251f6921820c24ac9fa8c6f1.png
--------------------------------------------------------------------------------
/docs/_images/math/3d9d12a9c67ce6e3d26fef531041d477a448166a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/3d9d12a9c67ce6e3d26fef531041d477a448166a.png
--------------------------------------------------------------------------------
/docs/_images/math/3ed0beb19a713357408972e04b961b2a22f37700.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/3ed0beb19a713357408972e04b961b2a22f37700.png
--------------------------------------------------------------------------------
/docs/_images/math/3f5bdeb915cff30277afb36ea90eebe003de8053.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/3f5bdeb915cff30277afb36ea90eebe003de8053.png
--------------------------------------------------------------------------------
/docs/_images/math/4855baa594b81935504161defd13c3fc952a4550.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/4855baa594b81935504161defd13c3fc952a4550.png
--------------------------------------------------------------------------------
/docs/_images/math/4cfc3c9abab5a5c2870dd9235a43b255ba28e3c3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/4cfc3c9abab5a5c2870dd9235a43b255ba28e3c3.png
--------------------------------------------------------------------------------
/docs/_images/math/4d26a3c646f81ab56cceb818c7801dd1f3cfaaf3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/4d26a3c646f81ab56cceb818c7801dd1f3cfaaf3.png
--------------------------------------------------------------------------------
/docs/_images/math/51708e129f045be4af893527b6d35c53a5ce0ec2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/51708e129f045be4af893527b6d35c53a5ce0ec2.png
--------------------------------------------------------------------------------
/docs/_images/math/536203b6089ad8850e6a6a8f7120f554dd8989c2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/536203b6089ad8850e6a6a8f7120f554dd8989c2.png
--------------------------------------------------------------------------------
/docs/_images/math/53bb978c28a4fca1d2e5711bf3152e65f182884f.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/53bb978c28a4fca1d2e5711bf3152e65f182884f.png
--------------------------------------------------------------------------------
/docs/_images/math/55c6e208f7350dd48f8d4d1172101a37f9659bae.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/55c6e208f7350dd48f8d4d1172101a37f9659bae.png
--------------------------------------------------------------------------------
/docs/_images/math/57649815d515c2baa7b6fadfceed4067e439495f.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/57649815d515c2baa7b6fadfceed4067e439495f.png
--------------------------------------------------------------------------------
/docs/_images/math/579df97bf3643d610cb2778afcd3c79129fce5de.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/579df97bf3643d610cb2778afcd3c79129fce5de.png
--------------------------------------------------------------------------------
/docs/_images/math/6450616b75212cb568e905db49efd0c3dd584648.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/6450616b75212cb568e905db49efd0c3dd584648.png
--------------------------------------------------------------------------------
/docs/_images/math/65635b3694a7e7cb3de56ecb92d87afcff9487c3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/65635b3694a7e7cb3de56ecb92d87afcff9487c3.png
--------------------------------------------------------------------------------
/docs/_images/math/6b236716ab129ffe94eb30e9023c84c8d4a6f5b3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/6b236716ab129ffe94eb30e9023c84c8d4a6f5b3.png
--------------------------------------------------------------------------------
/docs/_images/math/6e960eccb22a501212200c8f5f87c95e6898ef2d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/6e960eccb22a501212200c8f5f87c95e6898ef2d.png
--------------------------------------------------------------------------------
/docs/_images/math/6f27ee4cd76ae38403d2aaee80f1d52fe28bf489.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/6f27ee4cd76ae38403d2aaee80f1d52fe28bf489.png
--------------------------------------------------------------------------------
/docs/_images/math/745eb364a9475062a5c09ab50c8f5cba68f14601.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/745eb364a9475062a5c09ab50c8f5cba68f14601.png
--------------------------------------------------------------------------------
/docs/_images/math/78f5bc027ff3ddbb99d1fedea3c5b41c306900ae.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/78f5bc027ff3ddbb99d1fedea3c5b41c306900ae.png
--------------------------------------------------------------------------------
/docs/_images/math/79a3d439d28652c547386f39b555d90d3aaf102d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/79a3d439d28652c547386f39b555d90d3aaf102d.png
--------------------------------------------------------------------------------
/docs/_images/math/7b5d236cfd7d352d86450e807eb7dcd0a62db2bc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/7b5d236cfd7d352d86450e807eb7dcd0a62db2bc.png
--------------------------------------------------------------------------------
/docs/_images/math/8162cb172ecdaaf8557f86284715c6dc26f057e9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/8162cb172ecdaaf8557f86284715c6dc26f057e9.png
--------------------------------------------------------------------------------
/docs/_images/math/86618d947a94eaaaf4ef96bfa62c43186b3301b9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/86618d947a94eaaaf4ef96bfa62c43186b3301b9.png
--------------------------------------------------------------------------------
/docs/_images/math/87cc8f2cb5da678b00fdd3a9942b419da71d0665.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/87cc8f2cb5da678b00fdd3a9942b419da71d0665.png
--------------------------------------------------------------------------------
/docs/_images/math/8a014c4fa69db152179d9df21fa224d8944f59e9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/8a014c4fa69db152179d9df21fa224d8944f59e9.png
--------------------------------------------------------------------------------
/docs/_images/math/8a221894ca9b7abb34efd05f787ec33073be4187.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/8a221894ca9b7abb34efd05f787ec33073be4187.png
--------------------------------------------------------------------------------
/docs/_images/math/8a87f04e7d7cca18343c084cceca5237fae62491.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/8a87f04e7d7cca18343c084cceca5237fae62491.png
--------------------------------------------------------------------------------
/docs/_images/math/8cf54edeb14d31849024a87a40d956a787b79109.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/8cf54edeb14d31849024a87a40d956a787b79109.png
--------------------------------------------------------------------------------
/docs/_images/math/8f431f1535704a32339e823dbfc67f230f5bcd89.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/8f431f1535704a32339e823dbfc67f230f5bcd89.png
--------------------------------------------------------------------------------
/docs/_images/math/91154ea44770144e9d39196b6f28c54ea553188c.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/91154ea44770144e9d39196b6f28c54ea553188c.png
--------------------------------------------------------------------------------
/docs/_images/math/92f3adf08bed8246a0f9221af961292467dee08a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/92f3adf08bed8246a0f9221af961292467dee08a.png
--------------------------------------------------------------------------------
/docs/_images/math/97ce8490384510232af439974e12cd5336841e7c.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/97ce8490384510232af439974e12cd5336841e7c.png
--------------------------------------------------------------------------------
/docs/_images/math/984c8a8922eecd2d9e30bd84eb136b3faf36adb4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/984c8a8922eecd2d9e30bd84eb136b3faf36adb4.png
--------------------------------------------------------------------------------
/docs/_images/math/9a018f0a7fe05ec406a9bd8374ed418d0745114f.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/9a018f0a7fe05ec406a9bd8374ed418d0745114f.png
--------------------------------------------------------------------------------
/docs/_images/math/a0c62aaf8433160b7aae20b522e4e03eb2148b7d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/a0c62aaf8433160b7aae20b522e4e03eb2148b7d.png
--------------------------------------------------------------------------------
/docs/_images/math/a0fba1111fb08ada16b5c455e227418c0aa07874.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/a0fba1111fb08ada16b5c455e227418c0aa07874.png
--------------------------------------------------------------------------------
/docs/_images/math/a3f2adb46197c15367a9a3b8db89e0020989f251.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/a3f2adb46197c15367a9a3b8db89e0020989f251.png
--------------------------------------------------------------------------------
/docs/_images/math/a432f4bc897a07a74d2b2d20747b3d8b769d2de4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/a432f4bc897a07a74d2b2d20747b3d8b769d2de4.png
--------------------------------------------------------------------------------
/docs/_images/math/a6552654d8248cb3119190570d8a244eed0ecc9b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/a6552654d8248cb3119190570d8a244eed0ecc9b.png
--------------------------------------------------------------------------------
/docs/_images/math/a69f36fb7823eb935addff55f9d59dab484298b1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/a69f36fb7823eb935addff55f9d59dab484298b1.png
--------------------------------------------------------------------------------
/docs/_images/math/a77d8f7f396d4c1d9e610005aaf150bbd020048a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/a77d8f7f396d4c1d9e610005aaf150bbd020048a.png
--------------------------------------------------------------------------------
/docs/_images/math/a7ed46b778b12ebd6441fc1c78537a68495e92cd.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/a7ed46b778b12ebd6441fc1c78537a68495e92cd.png
--------------------------------------------------------------------------------
/docs/_images/math/ab3ca355d97c3be04d1bfeefe17d274ddfb0553b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/ab3ca355d97c3be04d1bfeefe17d274ddfb0553b.png
--------------------------------------------------------------------------------
/docs/_images/math/af198cc9e8f5cd01bbefe2e68060d3fca18bd490.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/af198cc9e8f5cd01bbefe2e68060d3fca18bd490.png
--------------------------------------------------------------------------------
/docs/_images/math/aff85625c5f240217712f329a522f2b70cbe582e.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/aff85625c5f240217712f329a522f2b70cbe582e.png
--------------------------------------------------------------------------------
/docs/_images/math/b527d3e4d6589c8a96c282b6615c83a831bf7179.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/b527d3e4d6589c8a96c282b6615c83a831bf7179.png
--------------------------------------------------------------------------------
/docs/_images/math/b60d2e0a877a42bf270d53d476dd884f7aaa92c3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/b60d2e0a877a42bf270d53d476dd884f7aaa92c3.png
--------------------------------------------------------------------------------
/docs/_images/math/b78394d00b424394921b457b7153b8af07fc939c.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/b78394d00b424394921b457b7153b8af07fc939c.png
--------------------------------------------------------------------------------
/docs/_images/math/b938ef7cf0d858368af8b24c5a1581ef6afcb369.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/b938ef7cf0d858368af8b24c5a1581ef6afcb369.png
--------------------------------------------------------------------------------
/docs/_images/math/b98fddf0781eb412543cbd6b46a9343b0560d4a1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/b98fddf0781eb412543cbd6b46a9343b0560d4a1.png
--------------------------------------------------------------------------------
/docs/_images/math/bbcf06400a1235cfb5a871b48df5eecc83abc842.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/bbcf06400a1235cfb5a871b48df5eecc83abc842.png
--------------------------------------------------------------------------------
/docs/_images/math/be9a07b2c8c9f23ba3ff5c67985ef3f26e1b427c.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/be9a07b2c8c9f23ba3ff5c67985ef3f26e1b427c.png
--------------------------------------------------------------------------------
/docs/_images/math/bed6e7e19f16d3c74617a973da6b0f78a3249a83.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/bed6e7e19f16d3c74617a973da6b0f78a3249a83.png
--------------------------------------------------------------------------------
/docs/_images/math/c04e056decf5efdb3b3fe69e0a2d995bfa680488.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/c04e056decf5efdb3b3fe69e0a2d995bfa680488.png
--------------------------------------------------------------------------------
/docs/_images/math/c483f522eb6956f8b0a7341fdf0dbe63c9f575f2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/c483f522eb6956f8b0a7341fdf0dbe63c9f575f2.png
--------------------------------------------------------------------------------
/docs/_images/math/c79c965e2ebd7b4cf0724beb64c8929aed7d635d.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/c79c965e2ebd7b4cf0724beb64c8929aed7d635d.png
--------------------------------------------------------------------------------
/docs/_images/math/c90118167c66a803463d7deda73f276163ef3eda.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/c90118167c66a803463d7deda73f276163ef3eda.png
--------------------------------------------------------------------------------
/docs/_images/math/ca3b8fa4180eee2dfc3af9d13fae1da451cd2c31.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/ca3b8fa4180eee2dfc3af9d13fae1da451cd2c31.png
--------------------------------------------------------------------------------
/docs/_images/math/d2bac4d3f7f89f981f16e99a409b504e39e80c1b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/d2bac4d3f7f89f981f16e99a409b504e39e80c1b.png
--------------------------------------------------------------------------------
/docs/_images/math/d3e07657a7ee6e91d95a458406e8a776a55be4f6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/d3e07657a7ee6e91d95a458406e8a776a55be4f6.png
--------------------------------------------------------------------------------
/docs/_images/math/d872993ed0c7c420e73e77a1d285ac100c516806.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/d872993ed0c7c420e73e77a1d285ac100c516806.png
--------------------------------------------------------------------------------
/docs/_images/math/d99f24d9ef68df0eb3a2fcc8c2ba8dafd2973ecc.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/d99f24d9ef68df0eb3a2fcc8c2ba8dafd2973ecc.png
--------------------------------------------------------------------------------
/docs/_images/math/dbce97688e276bfb719b2e65988a5d1cb17eb1a5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/dbce97688e276bfb719b2e65988a5d1cb17eb1a5.png
--------------------------------------------------------------------------------
/docs/_images/math/dc66df3fc466f497b4e9157c9943acdafb1aa717.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/dc66df3fc466f497b4e9157c9943acdafb1aa717.png
--------------------------------------------------------------------------------
/docs/_images/math/e0bb5f2e43819498dd495faee10e8964fb66c479.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/e0bb5f2e43819498dd495faee10e8964fb66c479.png
--------------------------------------------------------------------------------
/docs/_images/math/e5fafa36c515181a1fd8bc7b1ba0c44faeabe4f4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/e5fafa36c515181a1fd8bc7b1ba0c44faeabe4f4.png
--------------------------------------------------------------------------------
/docs/_images/math/e7003fd3463f843ee1e53385878369f078d362ad.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/e7003fd3463f843ee1e53385878369f078d362ad.png
--------------------------------------------------------------------------------
/docs/_images/math/eaa0e4f79b9e9b0d1ee9b00e837ebdf6a42f82ed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/eaa0e4f79b9e9b0d1ee9b00e837ebdf6a42f82ed.png
--------------------------------------------------------------------------------
/docs/_images/math/eaa6ad49a7f78fe5a13b486690163bf2dc7e3e60.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/eaa6ad49a7f78fe5a13b486690163bf2dc7e3e60.png
--------------------------------------------------------------------------------
/docs/_images/math/eb7664a3ab226a838f4b25de0a190e37dd9cec57.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/eb7664a3ab226a838f4b25de0a190e37dd9cec57.png
--------------------------------------------------------------------------------
/docs/_images/math/eca23fb19395340d7b4467a697d88862e05ae6b8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/eca23fb19395340d7b4467a697d88862e05ae6b8.png
--------------------------------------------------------------------------------
/docs/_images/math/edf63edf19b49aa39ec3005de91eff83ef1bbbe5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/edf63edf19b49aa39ec3005de91eff83ef1bbbe5.png
--------------------------------------------------------------------------------
/docs/_images/math/eeb7d854d71ddcc1537e1ece9017ae60ac703fc2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/eeb7d854d71ddcc1537e1ece9017ae60ac703fc2.png
--------------------------------------------------------------------------------
/docs/_images/math/ef217602d7ecee6f4986e2eb1e547cc96f839808.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/ef217602d7ecee6f4986e2eb1e547cc96f839808.png
--------------------------------------------------------------------------------
/docs/_images/math/f0a426e317a9c5ce68ee512fcff4b29da2665828.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/f0a426e317a9c5ce68ee512fcff4b29da2665828.png
--------------------------------------------------------------------------------
/docs/_images/math/f9aefa6e6dd9b26a90b378c77e493a0fe7db79ff.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/f9aefa6e6dd9b26a90b378c77e493a0fe7db79ff.png
--------------------------------------------------------------------------------
/docs/_images/math/fb5ea61e9a68aab0b56d46c9cd642b623dffc456.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/fb5ea61e9a68aab0b56d46c9cd642b623dffc456.png
--------------------------------------------------------------------------------
/docs/_images/math/fcade169349aa461f70318e0f45ee675b88b2a33.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/fcade169349aa461f70318e0f45ee675b88b2a33.png
--------------------------------------------------------------------------------
/docs/_images/math/ffd13fe6632b9cfd8d1c8d4b8aeb32aae6c498d4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/math/ffd13fe6632b9cfd8d1c8d4b8aeb32aae6c498d4.png
--------------------------------------------------------------------------------
/docs/_images/openfoam.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/openfoam.png
--------------------------------------------------------------------------------
/docs/_images/openfoam_quiverplot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/openfoam_quiverplot.png
--------------------------------------------------------------------------------
/docs/_images/script.sh:
--------------------------------------------------------------------------------
1 | for f in *.pdf
2 | do
3 | echo "convert $f ${f%%.*}.png"
4 | convert $f ${f%%.*}.png
5 | done
6 |
--------------------------------------------------------------------------------
/docs/_images/test_02_10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/test_02_10.png
--------------------------------------------------------------------------------
/docs/_images/test_02_10N.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/test_02_10N.png
--------------------------------------------------------------------------------
/docs/_images/test_02_10_02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/test_02_10_02.png
--------------------------------------------------------------------------------
/docs/_images/test_02_10_02N.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/test_02_10_02N.png
--------------------------------------------------------------------------------
/docs/_images/test_09_40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/test_09_40.png
--------------------------------------------------------------------------------
/docs/_images/test_09_40N.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/test_09_40N.png
--------------------------------------------------------------------------------
/docs/_images/test_09_40_02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/test_09_40_02.png
--------------------------------------------------------------------------------
/docs/_images/test_09_40_02N.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/test_09_40_02N.png
--------------------------------------------------------------------------------
/docs/_images/vortexFittingFlow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_images/vortexFittingFlow.png
--------------------------------------------------------------------------------
/docs/_static/ajax-loader.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_static/ajax-loader.gif
--------------------------------------------------------------------------------
/docs/_static/comment-bright.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_static/comment-bright.png
--------------------------------------------------------------------------------
/docs/_static/comment-close.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_static/comment-close.png
--------------------------------------------------------------------------------
/docs/_static/comment.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_static/comment.png
--------------------------------------------------------------------------------
/docs/_static/dialog-note.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_static/dialog-note.png
--------------------------------------------------------------------------------
/docs/_static/dialog-seealso.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_static/dialog-seealso.png
--------------------------------------------------------------------------------
/docs/_static/dialog-todo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_static/dialog-todo.png
--------------------------------------------------------------------------------
/docs/_static/dialog-topic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_static/dialog-topic.png
--------------------------------------------------------------------------------
/docs/_static/dialog-warning.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_static/dialog-warning.png
--------------------------------------------------------------------------------
/docs/_static/doctools.js:
--------------------------------------------------------------------------------
1 | /*
2 | * doctools.js
3 | * ~~~~~~~~~~~
4 | *
5 | * Sphinx JavaScript utilities for all documentation.
6 | *
7 | * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
8 | * :license: BSD, see LICENSE for details.
9 | *
10 | */
11 |
12 | /**
13 | * select a different prefix for underscore
14 | */
15 | $u = _.noConflict();
16 |
17 | /**
18 | * make the code below compatible with browsers without
19 | * an installed firebug like debugger
20 | if (!window.console || !console.firebug) {
21 | var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
22 | "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
23 | "profile", "profileEnd"];
24 | window.console = {};
25 | for (var i = 0; i < names.length; ++i)
26 | window.console[names[i]] = function() {};
27 | }
28 | */
29 |
30 | /**
31 | * small helper function to urldecode strings
32 | */
33 | jQuery.urldecode = function(x) {
34 | return decodeURIComponent(x).replace(/\+/g, ' ');
35 | };
36 |
37 | /**
38 | * small helper function to urlencode strings
39 | */
40 | jQuery.urlencode = encodeURIComponent;
41 |
42 | /**
43 | * This function returns the parsed url parameters of the
44 | * current request. Multiple values per key are supported,
45 | * it will always return arrays of strings for the value parts.
46 | */
47 | jQuery.getQueryParameters = function(s) {
48 | if (typeof s == 'undefined')
49 | s = document.location.search;
50 | var parts = s.substr(s.indexOf('?') + 1).split('&');
51 | var result = {};
52 | for (var i = 0; i < parts.length; i++) {
53 | var tmp = parts[i].split('=', 2);
54 | var key = jQuery.urldecode(tmp[0]);
55 | var value = jQuery.urldecode(tmp[1]);
56 | if (key in result)
57 | result[key].push(value);
58 | else
59 | result[key] = [value];
60 | }
61 | return result;
62 | };
63 |
64 | /**
65 | * highlight a given string on a jquery object by wrapping it in
66 | * span elements with the given class name.
67 | */
68 | jQuery.fn.highlightText = function(text, className) {
69 | function highlight(node) {
70 | if (node.nodeType == 3) {
71 | var val = node.nodeValue;
72 | var pos = val.toLowerCase().indexOf(text);
73 | if (pos >= 0 && !jQuery(node.parentNode).hasClass(className)) {
74 | var span = document.createElement("span");
75 | span.className = className;
76 | span.appendChild(document.createTextNode(val.substr(pos, text.length)));
77 | node.parentNode.insertBefore(span, node.parentNode.insertBefore(
78 | document.createTextNode(val.substr(pos + text.length)),
79 | node.nextSibling));
80 | node.nodeValue = val.substr(0, pos);
81 | }
82 | }
83 | else if (!jQuery(node).is("button, select, textarea")) {
84 | jQuery.each(node.childNodes, function() {
85 | highlight(this);
86 | });
87 | }
88 | }
89 | return this.each(function() {
90 | highlight(this);
91 | });
92 | };
93 |
94 | /*
95 | * backward compatibility for jQuery.browser
96 | * This will be supported until firefox bug is fixed.
97 | */
98 | if (!jQuery.browser) {
99 | jQuery.uaMatch = function(ua) {
100 | ua = ua.toLowerCase();
101 |
102 | var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
103 | /(webkit)[ \/]([\w.]+)/.exec(ua) ||
104 | /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
105 | /(msie) ([\w.]+)/.exec(ua) ||
106 | ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
107 | [];
108 |
109 | return {
110 | browser: match[ 1 ] || "",
111 | version: match[ 2 ] || "0"
112 | };
113 | };
114 | jQuery.browser = {};
115 | jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
116 | }
117 |
118 | /**
119 | * Small JavaScript module for the documentation.
120 | */
121 | var Documentation = {
122 |
123 | init : function() {
124 | this.fixFirefoxAnchorBug();
125 | this.highlightSearchWords();
126 | this.initIndexTable();
127 |
128 | },
129 |
130 | /**
131 | * i18n support
132 | */
133 | TRANSLATIONS : {},
134 | PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; },
135 | LOCALE : 'unknown',
136 |
137 | // gettext and ngettext don't access this so that the functions
138 | // can safely bound to a different name (_ = Documentation.gettext)
139 | gettext : function(string) {
140 | var translated = Documentation.TRANSLATIONS[string];
141 | if (typeof translated == 'undefined')
142 | return string;
143 | return (typeof translated == 'string') ? translated : translated[0];
144 | },
145 |
146 | ngettext : function(singular, plural, n) {
147 | var translated = Documentation.TRANSLATIONS[singular];
148 | if (typeof translated == 'undefined')
149 | return (n == 1) ? singular : plural;
150 | return translated[Documentation.PLURALEXPR(n)];
151 | },
152 |
153 | addTranslations : function(catalog) {
154 | for (var key in catalog.messages)
155 | this.TRANSLATIONS[key] = catalog.messages[key];
156 | this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
157 | this.LOCALE = catalog.locale;
158 | },
159 |
160 | /**
161 | * add context elements like header anchor links
162 | */
163 | addContextElements : function() {
164 | $('div[id] > :header:first').each(function() {
165 | $('').
166 | attr('href', '#' + this.id).
167 | attr('title', _('Permalink to this headline')).
168 | appendTo(this);
169 | });
170 | $('dt[id]').each(function() {
171 | $('').
172 | attr('href', '#' + this.id).
173 | attr('title', _('Permalink to this definition')).
174 | appendTo(this);
175 | });
176 | },
177 |
178 | /**
179 | * workaround a firefox stupidity
180 | * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075
181 | */
182 | fixFirefoxAnchorBug : function() {
183 | if (document.location.hash)
184 | window.setTimeout(function() {
185 | document.location.href += '';
186 | }, 10);
187 | },
188 |
189 | /**
190 | * highlight the search words provided in the url in the text
191 | */
192 | highlightSearchWords : function() {
193 | var params = $.getQueryParameters();
194 | var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
195 | if (terms.length) {
196 | var body = $('div.body');
197 | if (!body.length) {
198 | body = $('body');
199 | }
200 | window.setTimeout(function() {
201 | $.each(terms, function() {
202 | body.highlightText(this.toLowerCase(), 'highlighted');
203 | });
204 | }, 10);
205 | $('
' + _('Hide Search Matches') + '
')
207 | .appendTo($('#searchbox'));
208 | }
209 | },
210 |
211 | /**
212 | * init the domain index toggle buttons
213 | */
214 | initIndexTable : function() {
215 | var togglers = $('img.toggler').click(function() {
216 | var src = $(this).attr('src');
217 | var idnum = $(this).attr('id').substr(7);
218 | $('tr.cg-' + idnum).toggle();
219 | if (src.substr(-9) == 'minus.png')
220 | $(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
221 | else
222 | $(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
223 | }).css('display', '');
224 | if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
225 | togglers.click();
226 | }
227 | },
228 |
229 | /**
230 | * helper function to hide the search marks again
231 | */
232 | hideSearchWords : function() {
233 | $('#searchbox .highlight-link').fadeOut(300);
234 | $('span.highlighted').removeClass('highlighted');
235 | },
236 |
237 | /**
238 | * make the url absolute
239 | */
240 | makeURL : function(relativeURL) {
241 | return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
242 | },
243 |
244 | /**
245 | * get the current relative url
246 | */
247 | getCurrentURL : function() {
248 | var path = document.location.pathname;
249 | var parts = path.split(/\//);
250 | $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
251 | if (this == '..')
252 | parts.pop();
253 | });
254 | var url = parts.join('/');
255 | return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
256 | },
257 |
258 | initOnKeyListeners: function() {
259 | $(document).keyup(function(event) {
260 | var activeElementType = document.activeElement.tagName;
261 | // don't navigate when in search box or textarea
262 | if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT') {
263 | switch (event.keyCode) {
264 | case 37: // left
265 | var prevHref = $('link[rel="prev"]').prop('href');
266 | if (prevHref) {
267 | window.location.href = prevHref;
268 | return false;
269 | }
270 | case 39: // right
271 | var nextHref = $('link[rel="next"]').prop('href');
272 | if (nextHref) {
273 | window.location.href = nextHref;
274 | return false;
275 | }
276 | }
277 | }
278 | });
279 | }
280 | };
281 |
282 | // quick alias for translations
283 | _ = Documentation.gettext;
284 |
285 | $(document).ready(function() {
286 | Documentation.init();
287 | });
--------------------------------------------------------------------------------
/docs/_static/down-pressed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_static/down-pressed.png
--------------------------------------------------------------------------------
/docs/_static/down.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_static/down.png
--------------------------------------------------------------------------------
/docs/_static/epub.css:
--------------------------------------------------------------------------------
1 | /*
2 | * default.css_t
3 | * ~~~~~~~~~~~~~
4 | *
5 | * Sphinx stylesheet -- default theme.
6 | *
7 | * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
8 | * :license: BSD, see LICENSE for details.
9 | *
10 | */
11 |
12 | @import url("basic.css");
13 |
14 | /* -- page layout ----------------------------------------------------------- */
15 |
16 | body {
17 | font-family: {{ theme_bodyfont }};
18 | font-size: 100%;
19 | background-color: {{ theme_footerbgcolor }};
20 | color: #000;
21 | margin: 0;
22 | padding: 0;
23 | }
24 |
25 | div.document {
26 | background-color: {{ theme_sidebarbgcolor }};
27 | }
28 |
29 | div.documentwrapper {
30 | float: left;
31 | width: 100%;
32 | }
33 |
34 | div.bodywrapper {
35 | margin: 0 0 0 230px;
36 | }
37 |
38 | div.body {
39 | background-color: {{ theme_bgcolor }};
40 | color: {{ theme_textcolor }};
41 | padding: 0 20px 30px 20px;
42 | }
43 |
44 | {%- if theme_rightsidebar|tobool %}
45 | div.bodywrapper {
46 | margin: 0 230px 0 0;
47 | }
48 | {%- endif %}
49 |
50 | div.footer {
51 | color: {{ theme_footertextcolor }};
52 | width: 100%;
53 | padding: 9px 0 9px 0;
54 | text-align: center;
55 | font-size: 75%;
56 | }
57 |
58 | div.footer a {
59 | color: {{ theme_footertextcolor }};
60 | text-decoration: underline;
61 | }
62 |
63 | div.related {
64 | background-color: {{ theme_relbarbgcolor }};
65 | line-height: 30px;
66 | color: {{ theme_relbartextcolor }};
67 | }
68 |
69 | div.related a {
70 | color: {{ theme_relbarlinkcolor }};
71 | }
72 |
73 | div.sphinxsidebar {
74 | {%- if theme_stickysidebar|tobool %}
75 | top: 30px;
76 | bottom: 0;
77 | margin: 0;
78 | position: fixed;
79 | overflow: auto;
80 | height: auto;
81 | {%- endif %}
82 | {%- if theme_rightsidebar|tobool %}
83 | float: right;
84 | {%- if theme_stickysidebar|tobool %}
85 | right: 0;
86 | {%- endif %}
87 | {%- endif %}
88 | }
89 |
90 | {%- if theme_stickysidebar|tobool %}
91 | /* this is nice, but it it leads to hidden headings when jumping
92 | to an anchor */
93 | /*
94 | div.related {
95 | position: fixed;
96 | }
97 |
98 | div.documentwrapper {
99 | margin-top: 30px;
100 | }
101 | */
102 | {%- endif %}
103 |
104 | div.sphinxsidebar h3 {
105 | font-family: {{ theme_headfont }};
106 | color: {{ theme_sidebartextcolor }};
107 | font-size: 1.4em;
108 | font-weight: normal;
109 | margin: 0;
110 | padding: 0;
111 | }
112 |
113 | div.sphinxsidebar h3 a {
114 | color: {{ theme_sidebartextcolor }};
115 | }
116 |
117 | div.sphinxsidebar h4 {
118 | font-family: {{ theme_headfont }};
119 | color: {{ theme_sidebartextcolor }};
120 | font-size: 1.3em;
121 | font-weight: normal;
122 | margin: 5px 0 0 0;
123 | padding: 0;
124 | }
125 |
126 | div.sphinxsidebar p {
127 | color: {{ theme_sidebartextcolor }};
128 | }
129 |
130 | div.sphinxsidebar p.topless {
131 | margin: 5px 10px 10px 10px;
132 | }
133 |
134 | div.sphinxsidebar ul {
135 | margin: 10px;
136 | padding: 0;
137 | color: {{ theme_sidebartextcolor }};
138 | }
139 |
140 | div.sphinxsidebar a {
141 | color: {{ theme_sidebarlinkcolor }};
142 | }
143 |
144 | div.sphinxsidebar input {
145 | border: 1px solid {{ theme_sidebarlinkcolor }};
146 | font-family: sans-serif;
147 | font-size: 1em;
148 | }
149 |
150 | {% if theme_collapsiblesidebar|tobool %}
151 | /* for collapsible sidebar */
152 | div#sidebarbutton {
153 | background-color: {{ theme_sidebarbtncolor }};
154 | }
155 | {% endif %}
156 |
157 | /* -- hyperlink styles ------------------------------------------------------ */
158 |
159 | a {
160 | color: {{ theme_linkcolor }};
161 | text-decoration: none;
162 | }
163 |
164 | a:visited {
165 | color: {{ theme_visitedlinkcolor }};
166 | text-decoration: none;
167 | }
168 |
169 | a:hover {
170 | text-decoration: underline;
171 | }
172 |
173 | {% if theme_externalrefs|tobool %}
174 | a.external {
175 | text-decoration: none;
176 | border-bottom: 1px dashed {{ theme_linkcolor }};
177 | }
178 |
179 | a.external:hover {
180 | text-decoration: none;
181 | border-bottom: none;
182 | }
183 |
184 | a.external:visited {
185 | text-decoration: none;
186 | border-bottom: 1px dashed {{ theme_visitedlinkcolor }};
187 | }
188 | {% endif %}
189 |
190 | /* -- body styles ----------------------------------------------------------- */
191 |
192 | div.body h1,
193 | div.body h2,
194 | div.body h3,
195 | div.body h4,
196 | div.body h5,
197 | div.body h6 {
198 | font-family: {{ theme_headfont }};
199 | background-color: {{ theme_headbgcolor }};
200 | font-weight: normal;
201 | color: {{ theme_headtextcolor }};
202 | border-bottom: 1px solid #ccc;
203 | margin: 20px -20px 10px -20px;
204 | padding: 3px 0 3px 10px;
205 | }
206 |
207 | div.body h1 { margin-top: 0; font-size: 200%; }
208 | div.body h2 { font-size: 160%; }
209 | div.body h3 { font-size: 140%; }
210 | div.body h4 { font-size: 120%; }
211 | div.body h5 { font-size: 110%; }
212 | div.body h6 { font-size: 100%; }
213 |
214 | a.headerlink {
215 | color: {{ theme_headlinkcolor }};
216 | font-size: 0.8em;
217 | padding: 0 4px 0 4px;
218 | text-decoration: none;
219 | }
220 |
221 | a.headerlink:hover {
222 | background-color: {{ theme_headlinkcolor }};
223 | color: white;
224 | }
225 |
226 | div.body p, div.body dd, div.body li {
227 | text-align: justify;
228 | line-height: 130%;
229 | }
230 |
231 | div.admonition p.admonition-title + p {
232 | display: inline;
233 | }
234 |
235 | div.admonition p {
236 | margin-bottom: 5px;
237 | }
238 |
239 | div.admonition pre {
240 | margin-bottom: 5px;
241 | }
242 |
243 | div.admonition ul, div.admonition ol {
244 | margin-bottom: 5px;
245 | }
246 |
247 | div.note {
248 | background-color: #eee;
249 | border: 1px solid #ccc;
250 | }
251 |
252 | div.seealso {
253 | background-color: #ffc;
254 | border: 1px solid #ff6;
255 | }
256 |
257 | div.topic {
258 | background-color: #eee;
259 | }
260 |
261 | div.warning {
262 | background-color: #ffe4e4;
263 | border: 1px solid #f66;
264 | }
265 |
266 | p.admonition-title {
267 | display: inline;
268 | }
269 |
270 | p.admonition-title:after {
271 | content: ":";
272 | }
273 |
274 | pre {
275 | padding: 5px;
276 | background-color: {{ theme_codebgcolor }};
277 | color: {{ theme_codetextcolor }};
278 | line-height: 120%;
279 | border: 1px solid #ac9;
280 | border-left: none;
281 | border-right: none;
282 | }
283 |
284 | code {
285 | background-color: #ecf0f3;
286 | padding: 0 1px 0 1px;
287 | font-size: 0.95em;
288 | }
289 |
290 | th {
291 | background-color: #ede;
292 | }
293 |
294 | .warning code {
295 | background: #efc2c2;
296 | }
297 |
298 | .note code {
299 | background: #d6d6d6;
300 | }
301 |
302 | .viewcode-back {
303 | font-family: {{ theme_bodyfont }};
304 | }
305 |
306 | div.viewcode-block:target {
307 | background-color: #f4debf;
308 | border-top: 1px solid #ac9;
309 | border-bottom: 1px solid #ac9;
310 | }
311 |
--------------------------------------------------------------------------------
/docs/_static/file.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_static/file.png
--------------------------------------------------------------------------------
/docs/_static/footerbg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_static/footerbg.png
--------------------------------------------------------------------------------
/docs/_static/headerbg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_static/headerbg.png
--------------------------------------------------------------------------------
/docs/_static/ie6.css:
--------------------------------------------------------------------------------
1 | * html img,
2 | * html .png{position:relative;behavior:expression((this.runtimeStyle.behavior="none")&&(this.pngSet?this.pngSet=true:(this.nodeName == "IMG" && this.src.toLowerCase().indexOf('.png')>-1?(this.runtimeStyle.backgroundImage = "none",
3 | this.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.src + "',sizingMethod='image')",
4 | this.src = "_static/transparent.gif"):(this.origBg = this.origBg? this.origBg :this.currentStyle.backgroundImage.toString().replace('url("','').replace('")',''),
5 | this.runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + this.origBg + "',sizingMethod='crop')",
6 | this.runtimeStyle.backgroundImage = "none")),this.pngSet=true)
7 | );}
8 |
--------------------------------------------------------------------------------
/docs/_static/middlebg.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_static/middlebg.png
--------------------------------------------------------------------------------
/docs/_static/minus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_static/minus.png
--------------------------------------------------------------------------------
/docs/_static/plus.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_static/plus.png
--------------------------------------------------------------------------------
/docs/_static/pygments.css:
--------------------------------------------------------------------------------
1 | .highlight .hll { background-color: #ffffcc }
2 | .highlight { background: #f8f8f8; }
3 | .highlight .c { color: #60a0b0; font-style: italic } /* Comment */
4 | .highlight .err { color: #a40000; background-color: #fbe3e4 } /* Error */
5 | .highlight .k { color: #007020; font-weight: bold } /* Keyword */
6 | .highlight .o { color: #666666 } /* Operator */
7 | .highlight .ch { color: #60a0b0; font-style: italic } /* Comment.Hashbang */
8 | .highlight .cm { color: #60a0b0; font-style: italic } /* Comment.Multiline */
9 | .highlight .cp { color: #007020 } /* Comment.Preproc */
10 | .highlight .cpf { color: #60a0b0; font-style: italic } /* Comment.PreprocFile */
11 | .highlight .c1 { color: #60a0b0; font-style: italic } /* Comment.Single */
12 | .highlight .cs { color: #60a0b0; background-color: #fff0f0 } /* Comment.Special */
13 | .highlight .gd { color: #A00000 } /* Generic.Deleted */
14 | .highlight .ge { font-style: italic } /* Generic.Emph */
15 | .highlight .gr { color: #FF0000 } /* Generic.Error */
16 | .highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */
17 | .highlight .gi { color: #00A000 } /* Generic.Inserted */
18 | .highlight .go { color: #888888 } /* Generic.Output */
19 | .highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */
20 | .highlight .gs { font-weight: bold } /* Generic.Strong */
21 | .highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
22 | .highlight .gt { color: #0044DD } /* Generic.Traceback */
23 | .highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */
24 | .highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */
25 | .highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */
26 | .highlight .kp { color: #007020 } /* Keyword.Pseudo */
27 | .highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */
28 | .highlight .kt { color: #902000 } /* Keyword.Type */
29 | .highlight .m { color: #40a070 } /* Literal.Number */
30 | .highlight .s { color: #4070a0 } /* Literal.String */
31 | .highlight .na { color: #0e84b5 } /* Name.Attribute */
32 | .highlight .nb { color: #007020 } /* Name.Builtin */
33 | .highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */
34 | .highlight .no { color: #60add5 } /* Name.Constant */
35 | .highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */
36 | .highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */
37 | .highlight .ne { color: #007020 } /* Name.Exception */
38 | .highlight .nf { color: #06287e } /* Name.Function */
39 | .highlight .nl { color: #002070; font-weight: bold } /* Name.Label */
40 | .highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */
41 | .highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */
42 | .highlight .nv { color: #bb60d5 } /* Name.Variable */
43 | .highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */
44 | .highlight .w { color: #bbbbbb } /* Text.Whitespace */
45 | .highlight .mb { color: #40a070 } /* Literal.Number.Bin */
46 | .highlight .mf { color: #40a070 } /* Literal.Number.Float */
47 | .highlight .mh { color: #40a070 } /* Literal.Number.Hex */
48 | .highlight .mi { color: #40a070 } /* Literal.Number.Integer */
49 | .highlight .mo { color: #40a070 } /* Literal.Number.Oct */
50 | .highlight .sa { color: #4070a0 } /* Literal.String.Affix */
51 | .highlight .sb { color: #4070a0 } /* Literal.String.Backtick */
52 | .highlight .sc { color: #4070a0 } /* Literal.String.Char */
53 | .highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */
54 | .highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */
55 | .highlight .s2 { color: #4070a0 } /* Literal.String.Double */
56 | .highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */
57 | .highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */
58 | .highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */
59 | .highlight .sx { color: #c65d09 } /* Literal.String.Other */
60 | .highlight .sr { color: #235388 } /* Literal.String.Regex */
61 | .highlight .s1 { color: #4070a0 } /* Literal.String.Single */
62 | .highlight .ss { color: #517918 } /* Literal.String.Symbol */
63 | .highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */
64 | .highlight .fm { color: #06287e } /* Name.Function.Magic */
65 | .highlight .vc { color: #bb60d5 } /* Name.Variable.Class */
66 | .highlight .vg { color: #bb60d5 } /* Name.Variable.Global */
67 | .highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */
68 | .highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */
69 | .highlight .il { color: #40a070 } /* Literal.Number.Integer.Long */
--------------------------------------------------------------------------------
/docs/_static/pyramid.css:
--------------------------------------------------------------------------------
1 | /*
2 | * pyramid.css_t
3 | * ~~~~~~~~~~~~
4 | *
5 | * Sphinx stylesheet -- pylons theme.
6 | *
7 | * :copyright: Copyright 2007-2017 by the Sphinx team, see AUTHORS.
8 | * :license: BSD, see LICENSE for details.
9 | *
10 | */
11 |
12 | @import url("basic.css");
13 |
14 | /* -- page layout ----------------------------------------------------------- */
15 |
16 | body {
17 | font-family: "Nobile", sans-serif;
18 | font-size: 100%;
19 | background-color: #393939;
20 | color: #ffffff;
21 | margin: 0;
22 | padding: 0;
23 | }
24 |
25 | div.documentwrapper {
26 | float: left;
27 | width: 100%;
28 | }
29 |
30 | div.bodywrapper {
31 | margin: 0 0 0 230px;
32 | }
33 |
34 | hr {
35 | border: 1px solid #B1B4B6;
36 | }
37 |
38 | div.document {
39 | background-color: #eee;
40 | }
41 |
42 | div.header {
43 | width:100%;
44 | background: #f4ad32 url(headerbg.png) repeat-x 0 top;
45 | border-bottom: 2px solid #ffffff;
46 | }
47 |
48 | div.logo {
49 | text-align: center;
50 | padding-top: 10px;
51 | }
52 |
53 | div.body {
54 | background-color: #ffffff;
55 | color: #3E4349;
56 | padding: 0 30px 30px 30px;
57 | font-size: 1em;
58 | border: 2px solid #ddd;
59 | border-right-style: none;
60 | overflow: auto;
61 | }
62 |
63 | div.footer {
64 | color: #ffffff;
65 | width: 100%;
66 | padding: 13px 0;
67 | text-align: center;
68 | font-size: 75%;
69 | background: transparent;
70 | clear:both;
71 | }
72 |
73 | div.footer a {
74 | color: #ffffff;
75 | text-decoration: none;
76 | }
77 |
78 | div.footer a:hover {
79 | color: #e88f00;
80 | text-decoration: underline;
81 | }
82 |
83 | div.related {
84 | line-height: 30px;
85 | color: #373839;
86 | font-size: 0.8em;
87 | background-color: #eee;
88 | }
89 |
90 | div.related a {
91 | color: #1b61d6;
92 | }
93 |
94 | div.related ul {
95 | padding-left: 240px;
96 | }
97 |
98 | div.sphinxsidebar {
99 | font-size: 0.75em;
100 | line-height: 1.5em;
101 | }
102 |
103 | div.sphinxsidebarwrapper{
104 | padding: 10px 0;
105 | }
106 |
107 | div.sphinxsidebar h3,
108 | div.sphinxsidebar h4 {
109 | font-family: "Neuton", sans-serif;
110 | color: #373839;
111 | font-size: 1.4em;
112 | font-weight: normal;
113 | margin: 0;
114 | padding: 5px 10px;
115 | border-bottom: 2px solid #ddd;
116 | }
117 |
118 | div.sphinxsidebar h4{
119 | font-size: 1.3em;
120 | }
121 |
122 | div.sphinxsidebar h3 a {
123 | color: #000000;
124 | }
125 |
126 |
127 | div.sphinxsidebar p {
128 | color: #888;
129 | padding: 5px 20px;
130 | }
131 |
132 | div.sphinxsidebar p.topless {
133 | }
134 |
135 | div.sphinxsidebar ul {
136 | margin: 10px 20px;
137 | padding: 0;
138 | color: #373839;
139 | }
140 |
141 | div.sphinxsidebar a {
142 | color: #444;
143 | }
144 |
145 | div.sphinxsidebar input {
146 | border: 1px solid #ccc;
147 | font-family: sans-serif;
148 | font-size: 1em;
149 | }
150 |
151 | div.sphinxsidebar input[type=text]{
152 | margin-left: 20px;
153 | }
154 |
155 | div.sphinxsidebar input[type=submit]{
156 | margin-left: 20px;
157 | }
158 |
159 | /* -- sidebars -------------------------------------------------------------- */
160 |
161 | div.sidebar {
162 | margin: 0 0 0.5em 1em;
163 | border: 2px solid #c6d880;
164 | background-color: #e6efc2;
165 | width: 40%;
166 | float: right;
167 | border-right-style: none;
168 | border-left-style: none;
169 | padding: 10px 20px;
170 | }
171 |
172 | p.sidebar-title {
173 | font-weight: bold;
174 | }
175 |
176 | /* -- body styles ----------------------------------------------------------- */
177 |
178 | a, a .pre {
179 | color: #1b61d6;
180 | text-decoration: none;
181 | }
182 |
183 | a:hover, a:hover .pre {
184 | text-decoration: underline;
185 | }
186 |
187 | div.body h1,
188 | div.body h2,
189 | div.body h3,
190 | div.body h4,
191 | div.body h5,
192 | div.body h6 {
193 | font-family: "Neuton", sans-serif;
194 | background-color: #ffffff;
195 | font-weight: normal;
196 | color: #373839;
197 | margin: 30px 0px 10px 0px;
198 | padding: 5px 0;
199 | }
200 |
201 | div.body h1 { border-top: 20px solid white; margin-top: 0; font-size: 200%; }
202 | div.body h2 { font-size: 150%; background-color: #ffffff; }
203 | div.body h3 { font-size: 120%; background-color: #ffffff; }
204 | div.body h4 { font-size: 110%; background-color: #ffffff; }
205 | div.body h5 { font-size: 100%; background-color: #ffffff; }
206 | div.body h6 { font-size: 100%; background-color: #ffffff; }
207 |
208 | a.headerlink {
209 | color: #1b61d6;
210 | font-size: 0.8em;
211 | padding: 0 4px 0 4px;
212 | text-decoration: none;
213 | }
214 |
215 | a.headerlink:hover {
216 | text-decoration: underline;
217 | }
218 |
219 | div.body p, div.body dd, div.body li {
220 | line-height: 1.5em;
221 | }
222 |
223 | div.admonition p.admonition-title + p {
224 | display: inline;
225 | }
226 |
227 | div.admonition {
228 | background: #eeeeec;
229 | border: 2px solid #babdb6;
230 | border-right-style: none;
231 | border-left-style: none;
232 | padding: 10px 20px 10px 60px;
233 | }
234 |
235 | div.highlight{
236 | background-color: white;
237 | }
238 |
239 | div.note {
240 | border: 2px solid #7a9eec;
241 | border-right-style: none;
242 | border-left-style: none;
243 | padding: 10px 20px 10px 60px;
244 | background: #e1ecfe url(dialog-note.png) no-repeat 10px 8px;
245 | }
246 |
247 | div.seealso {
248 | background: #fff6bf url(dialog-seealso.png) no-repeat 10px 8px;
249 | border: 2px solid #ffd324;
250 | border-left-style: none;
251 | border-right-style: none;
252 | padding: 10px 20px 10px 60px;
253 | }
254 |
255 | div.topic {
256 | background: #eeeeee;
257 | border: 2px solid #C6C9CB;
258 | padding: 10px 20px;
259 | border-right-style: none;
260 | border-left-style: none;
261 | }
262 |
263 | div.warning {
264 | background: #fbe3e4 url(dialog-warning.png) no-repeat 10px 8px;
265 | border: 2px solid #fbc2c4;
266 | border-right-style: none;
267 | border-left-style: none;
268 | padding: 10px 20px 10px 60px;
269 | }
270 |
271 | div.admonition-todo {
272 | background: #f2d9b4 url(dialog-todo.png) no-repeat 10px 8px;
273 | border: 2px solid #e9b96e;
274 | border-right-style: none;
275 | border-left-style: none;
276 | padding: 10px 20px 10px 60px;
277 | }
278 |
279 | div.note p.admonition-title,
280 | div.warning p.admonition-title,
281 | div.seealso p.admonition-title,
282 | div.admonition-todo p.admonition-title {
283 | display: none;
284 | }
285 |
286 | p.admonition-title:after {
287 | content: ":";
288 | }
289 |
290 | pre {
291 | padding: 10px;
292 | background-color: #fafafa;
293 | color: #222;
294 | line-height: 1.2em;
295 | border: 2px solid #C6C9CB;
296 | font-size: 1.1em;
297 | margin: 1.5em 0 1.5em 0;
298 | border-right-style: none;
299 | border-left-style: none;
300 | }
301 |
302 | code {
303 | background-color: transparent;
304 | color: #222;
305 | font-size: 1.1em;
306 | font-family: monospace;
307 | }
308 |
309 | .viewcode-back {
310 | font-family: "Nobile", sans-serif;
311 | }
312 |
313 | div.viewcode-block:target {
314 | background-color: #fff6bf;
315 | border: 2px solid #ffd324;
316 | border-left-style: none;
317 | border-right-style: none;
318 | padding: 10px 20px;
319 | }
320 |
321 | table.highlighttable {
322 | width: 100%;
323 | }
324 |
325 | table.highlighttable td {
326 | padding: 0;
327 | }
328 |
329 | a em.std-term {
330 | color: #007f00;
331 | }
332 |
333 | a:hover em.std-term {
334 | text-decoration: underline;
335 | }
336 |
337 | .download {
338 | font-family: "Nobile", sans-serif;
339 | font-weight: normal;
340 | font-style: normal;
341 | }
342 |
343 | code.xref {
344 | font-weight: normal;
345 | font-style: normal;
346 | }
347 |
348 | div.code-block-caption {
349 | background-color: #ddd;
350 | color: #222;
351 | }
--------------------------------------------------------------------------------
/docs/_static/transparent.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_static/transparent.gif
--------------------------------------------------------------------------------
/docs/_static/up-pressed.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_static/up-pressed.png
--------------------------------------------------------------------------------
/docs/_static/up.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/_static/up.png
--------------------------------------------------------------------------------
/docs/conf.py:
--------------------------------------------------------------------------------
1 | # Configuration file for the Sphinx documentation builder.
2 | #
3 | # This file only contains a selection of the most common options. For a full
4 | # list see the documentation:
5 | # https://www.sphinx-doc.org/en/master/usage/configuration.html
6 |
7 | # -- Path setup --------------------------------------------------------------
8 |
9 | # If extensions (or modules to document with autodoc) are in another directory,
10 | # add these directories to sys.path here. If the directory is relative to the
11 | # documentation root, use os.path.abspath to make it absolute, like shown here.
12 | #
13 | import os
14 | import sys
15 | sys.path.insert(0, os.path.abspath('../vortexfitting'))
16 |
17 | # -- Project information -----------------------------------------------------
18 |
19 | project = 'VortexFitting'
20 | copyright = '2020, Guilherme Lindner'
21 | author = 'Guilherme Lindner \\ Yann Devaux'
22 |
23 | # The full version, including alpha/beta/rc tags
24 | release = '1'
25 |
26 |
27 | # -- General configuration ---------------------------------------------------
28 |
29 | # Add any Sphinx extension module names here, as strings. They can be
30 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
31 | # ones.
32 | extensions = ['sphinx.ext.autodoc',
33 | 'sphinx.ext.todo',
34 | 'sphinx.ext.imgmath',
35 | 'sphinx.ext.graphviz']
36 |
37 | # Add any paths that contain templates here, relative to this directory.
38 | templates_path = ['_templates']
39 |
40 | # The suffix(es) of source filenames.
41 | # You can specify multiple suffix as a list of string:
42 | #
43 | # source_suffix = ['.rst', '.md']
44 | source_suffix = '.rst'
45 |
46 | # The master toctree document.
47 | master_doc = 'index'
48 |
49 | # List of patterns, relative to source directory, that match files and
50 | # directories to ignore when looking for source files.
51 | # This pattern also affects html_static_path and html_extra_path.
52 | exclude_patterns = []
53 |
54 |
55 | # -- Options for HTML output -------------------------------------------------
56 |
57 | # The theme to use for HTML and HTML Help pages. See the documentation for
58 | # a list of builtin themes.
59 | #
60 | html_theme = 'pyramid'
61 | html_sidebars = {'**': ['globaltoc.html','searchbox.html']}
62 | # Add any paths that contain custom static files (such as style sheets) here,
63 | # relative to this directory. They are copied after the builtin static files,
64 | # so a file named "default.css" will overwrite the builtin "default.css".
65 | html_static_path = ['_static']
66 |
67 | numfig = True
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
--------------------------------------------------------------------------------
/docs/contributors.html:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 | Contributors — VortexFitting 1 documentation
9 |
10 |
11 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
32 |
33 |
34 |
35 |
36 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
Contributors
59 |
60 | Guilherme Lindner - PhD Student at University of British Columbia, Canada
61 | Yann Devaux - PhD at Pprime - Poitiers, France [DEVAUX2020]
62 | Ilkay Solak - PhD
63 |
64 |
65 |
66 |
Articles
67 |
68 |
69 |
70 | [DEVAUX2020] Yann Devaux, Lionel Thomas, Damien Calluaud and Gérard Pineau (2020)
71 | Isolated columnar vortex generation: influence of momentum impulsion characteristics and wall roughness Fluid Dynamics Research, V 52, N 2(2020), DOI: (https://doi.org/10.1088/1873-7005/ab7ebf )
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
107 |
108 |
109 |
124 |
128 |
129 |
--------------------------------------------------------------------------------
/docs/contributors.rst:
--------------------------------------------------------------------------------
1 | Contributors
2 | ------------
3 |
4 | * Guilherme Lindner - PhD Student at University of British Columbia, Canada
5 |
6 | * Yann Devaux - PhD at `Pprime `_ - Poitiers, France [DEVAUX2020]_, [DEVAUX2021]_
7 |
8 | * Ilkay Solak - PhD
9 |
10 |
11 | Articles
12 | --------
13 |
14 | .. [DEVAUX2020] Yann Devaux, Lionel Thomas, Damien Calluaud and Gérard Pineau (2020)
15 | *Isolated columnar vortex generation: influence of momentum impulsion characteristics and wall roughness* Fluid Dynamics Research, V 52, N 2, DOI: (https://doi.org/10.1088/1873-7005/ab7ebf)
16 |
17 | .. [DEVAUX2021] Yann Devaux, Lionel Thomas, Damien Calluaud and Gérard Pineau (2021)
18 | *Sediment bed destabilization by an isolated vortex: an experimental approach* Journal of Hydrodynamics, V 33, N 2, DOI: (http://doi.org/10.1007/s42241-021-0035-7)
19 |
--------------------------------------------------------------------------------
/docs/examples.rst:
--------------------------------------------------------------------------------
1 | Examples
2 | ========
3 |
4 | The example data files can be downloaded from the `github project page `_
5 |
6 | DNS case
7 | --------
8 | This velocity field is from a DNS simulation of an Homogeneous Isotropic Turbulence (HIT) case.
9 |
10 | Using default input file *example_dataHIT.nc*, default scheme *least square filter* and
11 | default detection *swirling strength* we test here two cases:
12 |
13 | * Case 1: threshold on swirling strength = 0.0
14 | * Case 2: threshold on swirling strength = 0.1
15 | * Case 3: threshold on swirling strength = 0.2
16 | * Case 4: threshold on swirling strength = 0.4
17 |
18 | If you set *self.normalization_flag = True* on the classes.py module, the value of swirling
19 | strength will be normalized. The values of the threshold must be set to avoid
20 | unnecessary noise.
21 |
22 | Case 1
23 | ``````
24 | .. code-block:: bash
25 |
26 | $ vortexfitting -t 0.0 -i data/example_dataHIT.nc
27 |
28 | .. image:: _images/HIT_00.svg
29 | :width: 80%
30 | :alt: detected vortices for example_dataHIT.nc, with a threshold of 0.0
31 | :align: center
32 |
33 | 361 vortices detected with 84 accepted.
34 |
35 | Case 2
36 | ``````
37 | .. code-block:: bash
38 |
39 | $ vortexfitting -t 0.1 -i data/example_dataHIT.nc
40 |
41 | .. image:: _images/HIT_01.svg
42 | :width: 80%
43 | :alt: detected vortices for example_dataHIT.nc, with a threshold of 0.1
44 | :align: center
45 |
46 | 162 vortices detected with 72 accepted.
47 |
48 | Case 3
49 | ``````
50 | .. code-block:: bash
51 |
52 | $ vortexfitting -t 0.2 -i data/example_dataHIT.nc
53 |
54 | .. image:: _images/HIT_02.svg
55 | :width: 80%
56 | :alt: detected vortices for example_dataHIT.nc, with a threshold of 0.2
57 | :align: center
58 |
59 | 58 vortices detected with 40 accepted.
60 |
61 | Case 4
62 | ``````
63 |
64 | .. code-block:: bash
65 |
66 | $ vortexfitting -t 0.4 -i data/example_dataHIT.nc
67 |
68 | .. image:: _images/HIT_04.svg
69 | :width: 80%
70 | :alt: detected vortices for example_dataHIT.nc, with a threshold of 0.4
71 | :align: center
72 |
73 | 9 vortices detected with 8 accepted.
74 |
75 | Below two vortices are displayed, where in the left we have the normal field
76 | and to the right we have the advection velocity subtracted.
77 |
78 | .. image:: _images/DNSvortex0_1.png
79 | :width: 45 %
80 | :alt: detected vortex and its Lamb-Oseen model
81 | .. image:: _images/DNSvortex0_2.png
82 | :width: 45 %
83 | :alt: detected vortex and its Lamb-Oseen model
84 |
85 | .. image:: _images/DNSvortex1_1.png
86 | :width: 45 %
87 | :alt: detected vortex and its Lamb-Oseen model
88 | .. image:: _images/DNSvortex1_2.png
89 | :width: 45 %
90 | :alt: detected vortex and its Lamb-Oseen model
91 |
92 | +----+---------+--------+--------+
93 | |Case|Threshold|Detected|Accepted|
94 | +====+=========+========+========+
95 | |1 |0.0 |361 |84 |
96 | +----+---------+--------+--------+
97 | |2 |0.1 |162 |72 |
98 | +----+---------+--------+--------+
99 | |3 |0.2 |58 |40 |
100 | +----+---------+--------+--------+
101 | |4 |0.4 |9 |8 |
102 | +----+---------+--------+--------+
103 |
104 | PIV case - NetCDF file
105 | ----------------------
106 |
107 | For PIV data we need to update the format, to match NetCDF file.
108 |
109 | It is done with the *-ft piv_netcdf* (*file type*) argument.
110 |
111 | Here, since we have an advection velocity, we have to set *self.normalization_flag = True*
112 | and *self.normalization_direction = 'y'*.
113 | This is done directly in the **classes.py** module.
114 |
115 | The *-rmax* argument leaves the software calculate the initial radius.
116 |
117 | .. code-block:: bash
118 |
119 | $ vortexfitting -i data/example_dataPIV.nc -ft piv_netcdf -t 1.5 -rmax 0
120 |
121 | .. image:: _images/piv_15.svg
122 | :width: 90 %
123 |
124 | 203 vortices detected with 24 accepted.
125 |
126 | Below two vortices are displayed, where in the left we have the normal field
127 | and to the right we have the advection velocity subtracted.
128 |
129 | .. image:: _images/PIVvortex0_1.png
130 | :width: 45 %
131 | :alt: detected vortex and its Lamb-Oseen model
132 | .. image:: _images/PIVvortex0_2.png
133 | :width: 45 %
134 | :alt: detected vortex and its Lamb-Oseen model
135 |
136 | .. image:: _images/PIVvortex1_1.png
137 | :width: 45 %
138 | :alt: detected vortex and its Lamb-Oseen model
139 | .. image:: _images/PIVvortex1_2.png
140 | :width: 45 %
141 | :alt: detected vortex and its Lamb-Oseen model
142 |
143 | PIV case - Tecplot file
144 | -----------------------
145 |
146 | For PIV data with Tecplot, we need to update the format, to match Tecplot file.
147 |
148 | It is done with the *-ft piv_tecplot* (*file type*) argument.
149 |
150 | .. code-block:: bash
151 |
152 | $ vortexfitting.py data/adim_vel_{:06d}.dat -first 10 -t 5 -b 10 -ft piv_tecplot
153 |
154 | .. image:: _images/PIV_accepted_10.svg
155 | :width: 40 %
156 | :align: center
157 | :alt: detected vortices for an experimental case
158 |
159 | An average field can be subtracted, using *-mf* argument (*mean file*)
160 |
161 | If you want to analyze a set of images, use arguments *-first*, *-last* and *-step*.
162 |
163 | (please modify data input to format the image number: *dim_vel_{:06d}.dat* with *-first 10* is formatted as *dim_vel_000010.dat*).
164 |
165 | .. code-block:: bash
166 |
167 | $ vortexfitting.py -i data/dim_vel_{:06d}.dat -mf data/mean.dat -t 50 -first 10 -ft piv_tecplot
168 |
169 | As presented in the image, one main vortex is found in the velocity field provided.
170 |
171 | Numerical case - OpenFOAM file
172 | ------------------------------
173 |
174 | A columnar Lamb-Oseen vortex is generated on OpenFOAM. By default, data are extracted in a text file, with a *.raw* extension.
175 |
176 | Here, a z-plane is extracted, with a 100x100 mesh. :math:`(u;v;w)` data are exported.
177 |
178 | The spatial mesh for this simulation is quite small, so the default initial radius (*rmax = 10*) is too large.
179 |
180 | Specify a smaller value (close to the spatial mesh); *-rmax 0* gets an initial radius of :math:`r_{max} =2\sqrt{dx^2+dy^2}`,
181 |
182 | with :math:`dx` and :math:`dy` the spatial resolution.
183 |
184 | .. code-block:: bash
185 |
186 | $ vortexfitting.py -i data/example_Ub_planeZ_0.01.raw -ft openfoam -rmax 0.0
187 |
188 | .. image:: _images/openfoam_quiverplot.png
189 | :width: 45 %
190 | :alt: detected vortex for an openfoam simulation of an isolated columnar vortex
191 | .. image:: _images/openfoam.png
192 | :width: 45 %
193 | :alt: detected vortex for an openfoam simulation of an isolated columnar vortex
194 |
--------------------------------------------------------------------------------
/docs/index.rst:
--------------------------------------------------------------------------------
1 | .. VortexFitting documentation master file, created by
2 | sphinx-quickstart on Mon Apr 24 16:12:09 2017.
3 | You can adapt this file completely to your liking, but it should at least
4 | contain the root `toctree` directive.
5 |
6 | Vortex Fitting Documentation
7 | ===============================================
8 |
9 | This tools allows the detection and fitting of vortices in a turbulent flow.
10 |
11 | It uses data from DNS or PIV using several formats (netCDF4, TecPlot, OpenFoam ...).
12 |
13 | The code is hosted at https://github.com/guilindner/VortexFitting
14 |
15 | .. warning::
16 | This software is still under development
17 |
18 | .. toctree::
19 | :maxdepth: 2
20 | :caption: Contents:
21 |
22 | introduction
23 | methodology
24 | installation
25 | software_options
26 | examples
27 | modules/modules
28 | contributors
29 |
30 | Indices and tables
31 | ==================
32 |
33 | * :ref:`genindex`
34 | * :ref:`modindex`
35 | * :ref:`search`
36 |
--------------------------------------------------------------------------------
/docs/installation.html:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 | Installation — VortexFitting 1 documentation
9 |
10 |
11 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
33 |
34 |
35 |
36 |
37 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
Installation
63 |
The VortexFitting code works only on Python 3.6 and superior.
64 | The following packages are used:
65 |
66 | NumPy
67 | SciPy
68 | Matplotlib
69 | netCDF4
70 |
71 |
72 |
Using PIP
73 |
We recommend creating a new virtual environment for your projects
74 |
$ python3 -m venv NAME
75 |
76 | $ source NAME/bin/activate
77 |
78 | $ pip install vortexfitting
79 |
80 |
81 |
Simply run “pip install vortexfitting”
82 |
83 |
84 |
Documentation
85 |
In order to generate the documentation you need the sphinx package.
86 |
To perform changes on the documentation, you should modify directly the .rst
87 | files, located in the docs folder. After modifying the desired files, run the
88 | script update_docs.py (for Linux and Windows):
89 |
$ python update_docs.py
90 |
91 |
92 |
After this, the html files will be generated in the same folder.
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
131 |
132 |
133 |
151 |
155 |
156 |
--------------------------------------------------------------------------------
/docs/installation.rst:
--------------------------------------------------------------------------------
1 | Installation
2 | ============
3 |
4 | The VortexFitting code works only on **Python 3.6** and superior.
5 | The following packages are used:
6 |
7 | * NumPy
8 | * SciPy
9 | * Matplotlib
10 | * netCDF4
11 |
12 | Using PIP
13 | ------------
14 |
15 | We recommend creating a new virtual environment for your projects
16 |
17 | .. code-block:: bash
18 |
19 | $ python3 -m venv NAME
20 |
21 | $ source NAME/bin/activate
22 |
23 | $ pip install vortexfitting
24 |
25 | Simply run "pip install vortexfitting"
26 |
27 |
28 | Documentation
29 | -------------
30 |
31 | In order to generate the documentation you need the **sphinx** package.
32 |
33 | To perform changes on the documentation, you should modify directly the *.rst*
34 | files, located in the *docs* folder. After modifying the desired files, run the
35 | script *update_docs.py* (for Linux and Windows):
36 |
37 | .. code-block:: bash
38 |
39 | $ python update_docs.py
40 |
41 | After this, the html files will be generated in the same folder.
42 |
--------------------------------------------------------------------------------
/docs/introduction.html:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 | Introduction — VortexFitting 1 documentation
9 |
10 |
11 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
33 |
34 |
35 |
36 |
37 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
Introduction
63 |
Coherent structures and vortices sometimes are misunderstood for not having a
64 | clear definition. In general ways, any form of pattern arising in the flow that
65 | has an effect on it is considered a coherent structure. Meanwhile, the vortices
66 | are commonly explained as the existence of some kind of rotation in the flow.
67 | The difficulty on identifying these vortices it’s in the fact that is not so
68 | clear to measure the extension of the vortex from its center of rotation.
69 | All of this becomes more complicated when we have the interaction between
70 | multiples coherent structures. According to Shawn et al (2005) [SHAWN2005]
71 | the definition is:
72 |
73 | “It is generally accepted that flows with general time dependence admit
74 | emergent patterns which influence the transport of tracers, those structures
75 | are often generically refered to as Coherent Structures”
76 |
In short we can say that vortices are one of the specific definition for
77 | coherent structures.
78 |
79 |
80 |
81 | [SHAWN2005] Shawn C. Shadden, Francois Lekien, Jerrold E. Marsden (2005)
82 | Definition and properties of Lagrangian coherent structures from finite-time
83 | Lyapunov exponents in two-dimensional aperiodic flows Physica D 212 (2005) 271-304
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
119 |
120 |
121 |
139 |
143 |
144 |
--------------------------------------------------------------------------------
/docs/introduction.rst:
--------------------------------------------------------------------------------
1 | Introduction
2 | ============
3 |
4 | Coherent structures and vortices sometimes are misunderstood for not having a
5 | clear definition. In general ways, any form of pattern arising in the flow that
6 | has an effect on it is considered a coherent structure. Meanwhile, the vortices
7 | are commonly explained as the existence of some kind of rotation in the flow.
8 | The difficulty on identifying these vortices it's in the fact that is not so
9 | clear to measure the extension of the vortex from its center of rotation.
10 | All of this becomes more complicated when we have the interaction between
11 | multiples coherent structures. According to Shawn *et al* (2005) [SHAWN2005]_
12 | the definition is:
13 |
14 | "It is generally accepted that flows with general time dependence admit
15 | emergent patterns which influence the transport of tracers, those structures
16 | are often generically refered to as Coherent Structures"
17 |
18 | In short we can say that vortices are one of the specific definition for
19 | coherent structures.
20 |
21 | .. [SHAWN2005] Shawn C. Shadden, Francois Lekien, Jerrold E. Marsden (2005)
22 | *Definition and properties of Lagrangian coherent structures from finite-time
23 | Lyapunov exponents in two-dimensional aperiodic flows* Physica D 212 (2005) 271-304
24 |
--------------------------------------------------------------------------------
/docs/make.bat:
--------------------------------------------------------------------------------
1 | @ECHO OFF
2 |
3 | pushd %~dp0
4 |
5 | REM Command file for Sphinx documentation
6 |
7 | if "%SPHINXBUILD%" == "" (
8 | set SPHINXBUILD=python -msphinx
9 | )
10 | set SOURCEDIR=.
11 | set BUILDDIR=_build
12 | set SPHINXPROJ=VortexFitting
13 |
14 | if "%1" == "" goto help
15 |
16 | %SPHINXBUILD% >NUL 2>NUL
17 | if errorlevel 9009 (
18 | echo.
19 | echo.The Sphinx module was not found. Make sure you have Sphinx installed,
20 | echo.then set the SPHINXBUILD environment variable to point to the full
21 | echo.path of the 'sphinx-build' executable. Alternatively you may add the
22 | echo.Sphinx directory to PATH.
23 | echo.
24 | echo.If you don't have Sphinx installed, grab it from
25 | echo.http://sphinx-doc.org/
26 | exit /b 1
27 | )
28 |
29 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
30 | goto end
31 |
32 | :help
33 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS%
34 |
35 | :end
36 | popd
37 |
--------------------------------------------------------------------------------
/docs/modules/classes.html:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 | classes.py — VortexFitting 1 documentation
9 |
10 |
11 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
33 |
34 |
35 |
36 |
37 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
classes.py
64 |
class VelocityField
65 |
66 |
67 | class classes.VelocityField( file_path='/' , time_step=0 , mean_file_path='/' , file_type='/' )
68 | Bases: object
69 | Data file
70 | Loads the input file with the NetCFD (.nc)
71 | format or a Tecplot format (.dat);
72 | initialize the variables.
73 |
74 |
75 |
76 |
77 | Parameters:
78 | file_path (str ) – file path
79 | time_step (int ) – current time step
80 | mean_file_path (str ) – in case of a mean field subtraction
81 | file_type (str ) – ‘piv_netcdf’, ‘dns, ‘dns2’, ‘piv_tecplot’, ‘openfoam’
82 | x_coordinate_matrix (ndarray ) – spatial mesh
83 | y_coordinate_matrix (ndarray ) – spatial mesh
84 | z_coordinate_matrix (ndarray ) – spatial mesh, optional
85 | u_velocity_matrix (ndarray ) – 1st component velocity field
86 | v_velocity_matrix (ndarray ) – 2nd component velocity field
87 | w_velocity_matrix (ndarray ) – 3rd component velocity field, optional
88 | normalization_flag (boolean ) – for normalization of the swirling field
89 | normalization_direction (str ) – ‘None’, ‘x’ or ‘y’
90 | x_coordinate_step (float ) – for homogeneous mesh, provides a unique step
91 | y_coordinate_step (float ) – for homogeneous mesh, provides a unique step
92 | z_coordinate_step (float ) – for homogeneous mesh, provides a unique step
93 | derivative (dict ) – contains ‘dudx’, ‘dudy’, ‘dvdx’, ‘dvdy’.
94 | Can be extended to the 3rd dimension
95 |
96 |
97 |
98 | Returns: vfield, an instance of the VelocityField class
99 |
100 |
101 | Return type: class VelocityField
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
148 |
149 |
150 |
169 |
173 |
174 |
--------------------------------------------------------------------------------
/docs/modules/classes.rst:
--------------------------------------------------------------------------------
1 | classes.py
2 | ==========
3 |
4 | .. automodule:: classes
5 | :members:
6 | :undoc-members:
7 | :show-inheritance:
8 |
--------------------------------------------------------------------------------
/docs/modules/detection.html:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 | detection.py — VortexFitting 1 documentation
9 |
10 |
11 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
33 |
34 |
35 |
36 |
37 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
detection.py
64 |
Different methods for vortex detection
65 |
66 |
67 | detection.calc_delta_criterion( vfield )
68 | Delta Criterion
69 |
70 |
71 |
72 |
73 | Parameters: vfield (class VelocityField ) – contains spatial mesh and velocity components
74 |
75 | Returns: delta criterion
76 |
77 | Return type: ndarray
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 | detection.calc_q_criterion( vfield )
86 | Q Criterion
87 | vorticity magnitude and mean strain rate
88 |
89 |
90 |
91 |
92 | Parameters: vfield (class VelocityField ( ) ) – contains spatial mesh and velocity components
93 |
94 | Returns: Q criterion
95 |
96 | Return type: ndarray
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 | detection.calc_swirling( vfield )
105 | 2D Swirling strength
106 |
107 |
108 |
109 |
110 | Parameters: vfield (class VelocityField ( ) ) – contains spatial mesh and velocity components
111 |
112 | Returns: swirling strength criterion
113 |
114 | Return type: ndarray
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
160 |
161 |
162 |
181 |
185 |
186 |
--------------------------------------------------------------------------------
/docs/modules/detection.rst:
--------------------------------------------------------------------------------
1 | detection.py
2 | ============
3 |
4 | .. automodule:: detection
5 | :members:
6 | :undoc-members:
7 | :show-inheritance:
8 |
--------------------------------------------------------------------------------
/docs/modules/fitting.rst:
--------------------------------------------------------------------------------
1 | fitting.py
2 | ==========
3 |
4 | .. automodule:: fitting
5 | :members:
6 | :undoc-members:
7 | :show-inheritance:
8 |
--------------------------------------------------------------------------------
/docs/modules/modules.html:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 | Modules — VortexFitting 1 documentation
9 |
10 |
11 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
33 |
34 |
35 |
36 |
37 |
55 |
56 |
114 |
132 |
136 |
137 |
--------------------------------------------------------------------------------
/docs/modules/modules.rst:
--------------------------------------------------------------------------------
1 | Modules
2 | =======
3 |
4 | .. toctree::
5 | :maxdepth: 4
6 |
7 | classes
8 | detection
9 | fitting
10 | output
11 | schemes
12 |
13 |
--------------------------------------------------------------------------------
/docs/modules/output.rst:
--------------------------------------------------------------------------------
1 | output.py
2 | =========
3 |
4 | .. automodule:: output
5 | :members:
6 | :undoc-members:
7 | :show-inheritance:
8 |
--------------------------------------------------------------------------------
/docs/modules/schemes.rst:
--------------------------------------------------------------------------------
1 | schemes.py
2 | ==========
3 |
4 | .. automodule:: schemes
5 | :members:
6 | :undoc-members:
7 | :show-inheritance:
8 |
--------------------------------------------------------------------------------
/docs/objects.inv:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/docs/objects.inv
--------------------------------------------------------------------------------
/docs/py-modindex.html:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 | Python Module Index — VortexFitting 1 documentation
9 |
10 |
11 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
32 |
33 |
34 |
37 |
38 |
39 |
40 |
41 |
42 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
Python Module Index
62 |
63 |
64 |
c |
65 |
d |
66 |
f |
67 |
o |
68 |
s
69 |
70 |
71 |
72 |
73 |
74 | c
75 |
76 |
77 |
78 | classes
79 |
80 |
81 |
82 | d
83 |
84 |
85 |
86 | detection
87 |
88 |
89 |
90 | f
91 |
92 |
93 |
94 | fitting
95 |
96 |
97 |
98 | o
99 |
100 |
101 |
102 | output
103 |
104 |
105 |
106 | s
107 |
108 |
109 |
110 | schemes
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
145 |
146 |
147 |
159 |
163 |
164 |
--------------------------------------------------------------------------------
/docs/search.html:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 | Search — VortexFitting 1 documentation
9 |
10 |
11 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
30 |
31 |
32 |
33 |
34 |
35 |
38 |
39 |
40 |
41 |
42 |
43 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
Search
62 |
63 |
64 |
65 | Please activate JavaScript to enable the search
66 | functionality.
67 |
68 |
69 |
70 | From here you can search these documents. Enter your search
71 | words into the box below and click "search". Note that the search
72 | function will automatically search for all of the words. Pages
73 | containing fewer words won't appear in the result list.
74 |
75 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
105 |
106 |
107 |
119 |
123 |
124 |
--------------------------------------------------------------------------------
/docs/software_options.rst:
--------------------------------------------------------------------------------
1 | Software options
2 | ================
3 |
4 | How to use the code / detection and fitting options
5 | ---------------------------------------------------
6 |
7 | Data input
8 | ``````````
9 |
10 | The data used can be of different format.
11 | For NetCDF, the axis of the velocity components are ordered like z, y, x,
12 | where z can also be the number of samples in a 2D field.
13 |
14 | Tecplot format or OpenFoam export are also accepted.
15 |
16 | If you want to implement a custom format, change the variable names, their order ...
17 | it should be directly changed in the **class.py** file
18 |
19 |
20 | Parameters
21 | ``````````
22 |
23 | The code comes with default test cases, located in *../data/*.
24 |
25 | If no input file with the *-i* (*--input*) argument has been specified, the *example_dataHIT.nc* will be used.
26 |
27 | .. code-block:: bash
28 |
29 | $ vortexfitting
30 |
31 | If we want to define a threshold for the swirling strength, we can specify with
32 | the *-t* (*--threshold*) argument, like this:
33 |
34 | .. code-block:: bash
35 |
36 | $ python3 vortexfitting.py -t 0.5
37 |
38 | The differencing scheme can be changed with the *-s* (*--scheme*) argument:
39 |
40 | .. code-block:: bash
41 |
42 | $ python3 vortexfitting.py -s 4
43 |
44 | .. note:: Available schemes:
45 |
46 | * 2 - Second Order
47 | * 22 - Least-square filter (default)
48 | * 4 - Fourth order
49 |
50 | We can as well change the detection method with the *-d* (*--detect*) argument
51 |
52 | .. code-block:: bash
53 |
54 | $ python3 vortexfitting.py -d Q
55 |
56 | .. note:: Available methods:
57 |
58 | * Q - Q criterion
59 | * swirling - Swirling Strenght criterion (default)
60 | * delta - Delta criterion
61 |
62 | If you want to write the detection field, the *write_field* function from the
63 | **output.py** module should be useful: it can be used in **__main__.py**.
64 |
65 | An initial guessing radius can be set with *-rmax* argument.
66 |
67 | .. code-block:: bash
68 |
69 | $ python3 vortexfitting.py -rmax 15
70 |
71 | An output directory can be specified with the *-o* (*--output*) argument.
72 |
73 | .. code-block:: bash
74 |
75 | $ python3 vortexfitting.py -o ../results/MY_DIRECTORY
76 |
77 | Use arguments *-first*, *-last* and *-step* to analyze a set of images. Default for *-step* is 1.
78 |
79 | For example, if you want to compute from image #10 to #20, each 2 images, enter:
80 |
81 | .. code-block:: bash
82 |
83 | $ python3 vortexfitting.py -first 10 -last 20 -step 2
84 |
85 |
86 | By default, the correlation threshold to detect a vortex is 0.75. This value may be changed with the
87 | *-ct* (*--corrthreshold*) argument.
88 |
89 | .. code-block:: bash
90 |
91 | $ python3 vortexfitting.py -ct 0.85
92 |
93 | To avoid vortices overlapping, the box size parameter *-b* (*--boxsize*) can be used.
94 | It takes an integer distance in mesh units, between two vortex centers.
95 |
96 | .. code-block:: bash
97 |
98 | $ python3 vortexfitting.py -b 10
99 |
100 |
101 | The plot method is chosen with the *-p* (*--plot*) argument
102 |
103 | .. note:: Available methods:
104 |
105 | * fit - detection and fitting, saves images (default)
106 | * detect - Locate the potential vortices (without fitting)
107 | * fields - display the velocity fields and vorticity
108 |
109 | .. code-block:: bash
110 |
111 | $ python3 vortexfitting.py -p fields
112 |
113 |
114 |
115 | Data output
116 | ```````````
117 |
118 | The results will be written to the *../results/* folder with the following files:
119 |
120 | * accepted.svg: The location and size of the accepted vortices
121 | * linked.svg: same as *accepted.svg* but can be open on the web browser with
122 | clickable vortices
123 | * vortex#_initial_vfield.png: Comparison of the velocity field of the vortex and the model
124 | * vortex#_advection_field_subtracted.png: Comparison of the velocity field of the vortex and the model,
125 | subtracting the advection velocity
126 | * vortices.dat: parameters of all the detected vortices
127 |
128 | If you want to update the output format of *vortices.dat*, it should be done in the **output.py** file.
129 |
130 | The format (png, pdf ...) can be specified with the *-of* (*--output_format*) option.
131 |
132 | NB: the *vortices.dat* file is written according to the TecPlot format.
133 | It contains some auxiliary data, to keep a record of the different parameters used.
134 |
135 | The plot results are handled in the **fitting.py** module.
136 |
137 |
138 | Generating a custom Vortex
139 | --------------------------
140 |
141 | It's possible to generate a custom vortex using the **generateNetCDF.py** module.
142 | It will create a NetCDF file with the same characteristics as the DNS HIT file.
143 |
144 | .. code-block:: bash
145 |
146 | $ python3 generateNetCDF.py
147 |
148 | This command will create a file *generatedField.nc* at the data folder.
149 |
150 | You can tune the characteristics and position of the vortex by changing the
151 | following values directly on *generatedField.nc*:
152 |
153 | * core_radius;
154 | * gamma;
155 | * x_center;
156 | * y_center;
157 | * u_advection;
158 | * v_advection.
159 |
160 | The size of the domain can also be changed on the *ndim* variable.
161 |
162 | You can use the *output* option (*-o*) to specify the name of the created file,
163 | and *ndim* (*-ndim*) option to change the domain size.
164 | For example:
165 |
166 | .. code-block:: bash
167 |
168 | $ python3 generateNetCDF.py -o ./data/testGenerate.nc -ndim 300
169 |
170 |
171 | will produce a 300x300 mesh, in a file named *testGenerate.nc*.
172 |
173 | .. _generateNetCDF_vortex:
174 | .. figure:: _images/generateNetCDF_vortex.png
175 | :width: 45 %
176 | :alt: Vortex produced with the generateNetCDF.py function
177 | :align: center
178 |
179 | Vortex produced with the **generateNetCDF.py** function
180 |
181 | Converting NetCDF to ASCII (and vice-versa)
182 | -------------------------------------------
183 |
184 | If for any reason you need to convert a netCDF file to a text format (ASCII), the
185 | module **convertToASCII.py** can do the job. It will open the *infile* and save
186 | all z planes (or time) into separated files.
187 |
188 | .. code-block:: bash
189 |
190 | $ python3 convertToASCII.py -i input.nc -o output.dat
191 |
192 | Depending on the file you need to change the variable names like *velocity_x*
193 | and such for the corresponding variable.
194 |
195 | The module **convertToNC.py** can convert an ASCII file to a NetCDF4 format.
196 | You can specify the spatial dimensions (*nx*, *ny* respectively for x and y directions),
197 | with the options *-nx* or *-ny*
198 |
199 | .. code-block:: bash
200 |
201 | $ python3 convertToNC.py -i input.dat -o output.nc
202 |
203 |
--------------------------------------------------------------------------------
/docs/update_docs.py:
--------------------------------------------------------------------------------
1 | import os
2 | import sys
3 | import glob, shutil
4 |
5 | is_windows = sys.platform.startswith('win')
6 |
7 | if is_windows:
8 | print("Running on Windows ...")
9 | cmd='make html'
10 | os.system(cmd)
11 | files = glob.iglob(os.path.join('./_build/html', "*.html"))
12 | for file in files:
13 | if os.path.isfile(file):
14 | print(file)
15 | shutil.copy2(file, './')
16 | else:
17 | print("Running on Linux ...")
18 | cmd='make html && cp -R _build/html/* .'
19 | os.system(cmd)
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/docs/update_docs.sh:
--------------------------------------------------------------------------------
1 | make html
2 | cp -R _build/html/* .
3 |
--------------------------------------------------------------------------------
/makeExamples.py:
--------------------------------------------------------------------------------
1 | import os
2 | import sys
3 |
4 | is_windows = sys.platform.startswith('win')
5 |
6 | if is_windows:
7 | print("Running on Windows ...")
8 | else:
9 | print("Running on Linux ...")
10 |
11 | if sys.version_info[0] < 3:
12 | raise Exception("Must be using Python 3")
13 | else:
14 | cmd = 'python3 run.py -i data/example_Ub_planeZ_0.01.raw ' \
15 | '-ft openfoam -o results/example_openfoam -rmax 0'
16 | os.system(cmd)
17 |
18 | cmd = 'python3 run.py -i data/example_Ub_planeZ_0.01.raw ' \
19 | '-ft openfoam -xy 20 50 -p detect'
20 | os.system(cmd)
21 |
22 | cmd = 'python3 run.py -i data/example_adim_vel_{:06d}.dat ' \
23 | '-ft piv_tecplot -o results/example_adim_vel_000010 -first 10 -t 5 -b 20'
24 | os.system(cmd)
25 |
26 | cmd = 'python3 run.py -i data/example_data_HIT.nc ' \
27 | '-ft dns -o results/example_data_HIT '
28 | os.system(cmd)
29 |
30 | cmd = 'python3 run.py -i data/example_data_numerical_PIV.nc ' \
31 | '-ft piv_netcdf -o results/example_data_numerical_PIV -t 1.5 -rmax 0'
32 | os.system(cmd)
33 |
34 | cmd = 'python3 run.py -i data/example_dim_vel_{:06d}.dat ' \
35 | '-ft piv_tecplot -o results/example_dim_vel_000010 -first 10 -mf data/example_mean.dat -t 50 -ct 0.5 -b 15'
36 | os.system(cmd)
37 |
38 | cmd = 'python3 run.py -i data/example_vel_{:06d}.dat ' \
39 | '-ft piv_tecplot -o results/example_temporal_series -mf data/example_mean.dat -first 5 -last 6 -t 20 -ct 0.5'
40 | os.system(cmd)
41 |
--------------------------------------------------------------------------------
/makeExamples.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | python3 run.py -i data/example_Ub_planeZ_0.01.raw -ft openfoam -o results/example_openfoam -rmax 0
4 |
5 | python3 run.py -i data/example_Ub_planeZ_0.01.raw -ft openfoam -xy 20 50
6 |
7 | python3 run.py -i data/example_adim_vel_{:06d}.dat -ft piv_tecplot -o results/example_adim_vel_000010 -first 10 -t 5 -b 20
8 |
9 | python3 run.py -i data/example_data_HIT.nc -ft dns -o results/example_data_HIT
10 |
11 | python3 run.py -i data/example_data_numerical_PIV.nc -ft piv_netcdf -o results/example_data_numerical_PIV -t 1.5 -rmax 0
12 |
13 | python3 run.py -i data/example_dim_vel_{:06d}.dat -ft piv_tecplot -o results/example_dim_vel_000010 -first 10 -mf data/example_mean.dat -t 50 -ct 0.5 -b 15
14 |
15 | python3 run.py -i data/example_vel_{:06d}.dat -ft piv_tecplot -o results/example_temporal_series -mf data/example_mean.dat -first 5 -last 6 -t 20 -ct 0.5
16 |
17 |
18 | exit
19 |
20 | vortexfitting -i data/example_Ub_planeZ_0.01.raw -ft openfoam -o results/example_openfoam -rmax 0
21 |
22 | vortexfitting -i data/example_Ub_planeZ_0.01.raw -ft openfoam -xy 20 50
23 |
24 | vortexfitting -i data/example_adim_vel_{:06d}.dat -ft piv_tecplot -o results/example_adim_vel_000010 -first 10 -t 5 -b 20
25 |
26 | vortexfitting -i data/example_data_HIT.nc -ft dns -o results/example_data_HIT
27 |
28 | vortexfitting -i data/example_data_numerical_PIV.nc -ft piv_netcdf -o results/example_data_numerical_PIV -t 1.5 -rmax 0
29 |
30 | vortexfitting -i data/example_dim_vel_{:06d}.dat -ft piv_tecplot -o results/example_dim_vel_000010 -first 10 -mf data/example_mean.dat -t 50 -ct 0.5 -b 15
31 |
32 | vortexfitting -i data/example_vel_{:06d}.dat -ft piv_tecplot -o results/example_temporal_series -mf data/example_mean.dat -first 5 -last 6 -t 20 -ct 0.5
33 |
34 |
--------------------------------------------------------------------------------
/makeTests.py:
--------------------------------------------------------------------------------
1 | import os
2 | import sys
3 |
4 | is_windows = sys.platform.startswith('win')
5 |
6 | if is_windows:
7 | print("Running on Windows ...")
8 | else:
9 | print("Running on Linux ...")
10 |
11 | if sys.version_info[0] < 3:
12 | raise Exception("Must be using Python 3")
13 | else:
14 | cwd = os.getcwd()
15 | os.chdir(cwd + '/tests')
16 |
17 | cmd = 'python3 test_fitting.py'
18 | os.system(cmd)
19 | cmd = 'python3 test_tools.py'
20 | os.system(cmd)
21 | cmd = 'python3 testOseen.py'
22 | os.system(cmd)
23 |
24 | os.chdir(cwd + '/vortexfitting')
25 |
26 | cmd = 'python3 convertToASCII.py -i ../data/example_data_HIT.nc -o ../data/test_dataHIT_ascii.dat'
27 | os.system(cmd)
28 | cmd = 'python3 convertToNC.py -i ../data/test_dataHIT_ascii.dat -o ../data/test_dataHIT_back_converted.nc'
29 | os.system(cmd)
30 | cmd = 'python3 generateNetCDF.py'
31 | os.system(cmd)
32 |
--------------------------------------------------------------------------------
/makeTests.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | dir=`pwd`
4 |
5 | cd $dir/tests
6 |
7 | python3 test_fitting.py
8 | python3 test_tools.py
9 | python3 testOseen.py
10 |
11 | cd $dir/vortexfitting
12 |
13 | python3 convertToASCII.py -i ../data/example_data_HIT.nc -o ../data/test_dataHIT_ascii.dat
14 | python3 convertToNC.py -i ../data/test_dataHIT_ascii.dat -o ../data/test_dataHIT_back_converted.nc
15 | python3 generateNetCDF.py
16 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | cftime==1.1.3
2 | cycler==0.10.0
3 | kiwisolver==1.2.0
4 | matplotlib==3.2.1
5 | netCDF4==1.5.3
6 | numpy==1.18.5
7 | pyparsing==2.4.7
8 | python-dateutil==2.8.1
9 | scipy==1.4.1
10 | six==1.15.0
11 | sphinx==1.6.3
12 |
--------------------------------------------------------------------------------
/run.py:
--------------------------------------------------------------------------------
1 | import vortexfitting.__main__
2 |
3 | if __name__ == '__main__':
4 | vortexfitting.__main__.main()
5 |
--------------------------------------------------------------------------------
/setup.py:
--------------------------------------------------------------------------------
1 | from setuptools import setup, find_packages
2 | import pathlib
3 |
4 | # The directory containing this file
5 | HERE = pathlib.Path(__file__).parent
6 |
7 | # The text of the README file
8 | README = (HERE / "README.md").read_text()
9 |
10 | # This call to setup() does all the work
11 | setup(
12 | name="vortexfitting",
13 | version="1.0.1",
14 | description="A tool to locate and characterize vortices",
15 | long_description=README,
16 | long_description_content_type="text/markdown",
17 | url="https://github.com/guilindner/VortexFitting",
18 | author="Guilherme Anrain Lindner",
19 | keywords='vortex cfd fluid mechanics',
20 | author_email="lindner.guilherme@gmail.com",
21 | license="MIT",
22 | classifiers=[
23 | "License :: OSI Approved :: MIT License",
24 | "Programming Language :: Python :: 3.6",
25 | "Programming Language :: Python :: 3.7",
26 | 'Programming Language :: Python :: 3.8',
27 | ],
28 |
29 | packages= ['vortexfitting'],
30 | #package_dir={'vortexfitting': 'vortexfitting'},
31 | #package_data={'vortexfitting': ['data/*.*']},
32 | #include_package_data=True,
33 | install_requires=['netcdf4','matplotlib', 'numpy', 'scipy'],
34 | project_urls={
35 | 'Source': 'https://github.com/guilindner/VortexFitting',
36 | },
37 | entry_points={
38 | "console_scripts": [
39 | "vortexfitting = vortexfitting.__main__:main",
40 | ]
41 | },
42 | )
43 |
--------------------------------------------------------------------------------
/tests/testOseen.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env/ python3
2 | """
3 | vortex detection tool, by Guilherme Lindner, 2017-04\n
4 | This program load NetCDF files from DNS simulations or PIV experiments
5 | and detect the vortices and apply a fitting to them.
6 | """
7 |
8 | import argparse
9 | import numpy as np
10 | import sys
11 |
12 | sys.path.insert(1, '../vortexfitting')
13 |
14 | import fitting # noqa: E402
15 | # import schemes # noqa: E402
16 | # import detection # noqa: E402
17 | from classes import VelocityField # noqa: E402
18 |
19 | if __name__ == '__main__':
20 | parser = argparse.ArgumentParser(description='Optional app description',
21 | formatter_class=argparse.RawTextHelpFormatter)
22 |
23 | parser.add_argument('-i', '--input', dest='infilename',
24 | default='../data/example_data_numerical_PIV.nc',
25 | help='input NetCDF file', metavar='FILE')
26 | args = parser.parse_args()
27 |
28 | print('Some tests for the Lamb-Oseen model')
29 | print(args.infilename)
30 |
31 | vfield = VelocityField(args.infilename, 0, '/', 'piv_netcdf')
32 |
33 |
34 | def test_oseen(core_radius, gamma, dist, xdrift, ydrift, u_advection, v_advection):
35 | print('core_radius:', core_radius, 'Gamma', gamma, 'xdrift', xdrift,
36 | 'ydrift', ydrift, 'u_advection', u_advection, 'v_advection', v_advection)
37 | model = [[], [], [], [], [], []]
38 | model[0] = core_radius
39 | model[1] = gamma
40 | core_radius_ori = model[0]
41 | gamma_ori = model[1]
42 | x_index = np.linspace(-1, 1, dist)
43 | y_index = np.linspace(-1, 1, dist)
44 | x_index, y_index = np.meshgrid(x_index, y_index)
45 | x_real = 0.0
46 | y_real = 0.0
47 | model[4] = u_advection
48 | model[5] = v_advection
49 | u_data, v_data = fitting.velocity_model(core_radius, gamma, x_real, y_real,
50 | u_advection, v_advection, x_index + xdrift, y_index + ydrift)
51 | u_data = u_data + u_advection
52 | v_data = v_data + v_advection
53 | # NOISE
54 | u_data = np.random.normal(u_data, 0.3)
55 | v_data = np.random.normal(v_data, 0.3)
56 | model = fitting.fit(core_radius, gamma, x_index, y_index, x_real, y_real, u_data, v_data, u_advection,
57 | v_advection, 0)
58 | print('core_radius:', model[0], 'error(%):', (1 - (model[0]) / core_radius_ori) * 100)
59 | print('gamma:', model[1], 'error(%):', (1 - (model[1]) / gamma_ori) * 100)
60 | print('x_real:', model[2])
61 | print('y_real:', model[3])
62 | u_model, v_model = fitting.velocity_model(model[0], model[1], model[2], model[3],
63 | model[4], model[5], x_index, y_index)
64 | corr = fitting.correlation_coef(u_data, v_data, u_model, v_model)
65 | print('correlation:', corr)
66 | print('---')
67 | fitting.plot_fit(x_index, y_index, u_data, v_data, u_model, v_model, model[2], model[3], model[0], model[1],
68 | model[4], model[5], corr, 0, 0, '.', 0, 'png')
69 |
70 |
71 | test_oseen(0.2, 10, 10, 0.0, 0.0, 0.01, 0.01)
72 | test_oseen(0.2, 10, 10, 0.2, 0.2, 0.01, 0.01)
73 | test_oseen(0.9, 40, 10, 0.0, 0.0, 0.01, 0.01)
74 | test_oseen(0.9, 40, 10, 0.2, 0.2, 0.01, 0.01)
75 |
--------------------------------------------------------------------------------
/tests/test_fitting.py:
--------------------------------------------------------------------------------
1 | import unittest
2 | # from nose import with_setup # optional
3 |
4 | import numpy as np
5 | import sys
6 |
7 | sys.path.insert(1, '../vortexfitting')
8 |
9 | import fitting # noqa: E402
10 |
11 | """
12 | test using "nosetests -v tests/test_tools.py"
13 | """
14 |
15 | # Dummy field to use
16 | sample_field = np.array([[1.1, 0.9, 1.3, 0.7],
17 | [2.1, 1.9, 2.3, 1.7],
18 | [3.1, 2.9, 3.3, 2.7],
19 | [4.1, 3.9, 4.3, 3.7]])
20 |
21 |
22 | class FittingTest(unittest.TestCase):
23 |
24 | # def my_teardown_function():
25 | # print("my_teardown_function")
26 |
27 | def test_correlation_coef_1_1_1_1(self):
28 | # Exact same u and v compared with exact same u and v
29 | result_calc = fitting.correlation_coef(sample_field,
30 | sample_field,
31 | sample_field,
32 | sample_field)
33 |
34 | np.testing.assert_almost_equal(result_calc, 1.0)
35 |
36 | def test_correlation_coef_2_05_2_05(self):
37 | # Different u and v compared with the same u and v
38 | result_calc = fitting.correlation_coef(sample_field * 2.0,
39 | sample_field * 0.5,
40 | sample_field * 2.0,
41 | sample_field * 0.5)
42 |
43 | np.testing.assert_almost_equal(result_calc, 1.0)
44 |
45 | def test_correlation_coef_2_2_0_0(self):
46 | # Different u and v compared with u=0 and v=v
47 | result_calc = fitting.correlation_coef(sample_field * 2.0,
48 | sample_field * 2.0,
49 | sample_field,
50 | sample_field)
51 |
52 | np.testing.assert_almost_equal(result_calc, 0.5)
53 |
54 | def test_correlation_coef_05_05_1_1(self):
55 | # Different u and v compared with u=0 and v=v
56 | result_calc = fitting.correlation_coef(sample_field * 0.5,
57 | sample_field * 0.5,
58 | sample_field,
59 | sample_field)
60 |
61 | np.testing.assert_almost_equal(result_calc, 0.5)
62 |
63 | def test_correlation_coef_025_025_1_1(self):
64 | # Different u and v compared with u=0 and v=v
65 | result_calc = fitting.correlation_coef(sample_field * 0.25,
66 | sample_field * 0.25,
67 | sample_field,
68 | sample_field)
69 |
70 | np.testing.assert_almost_equal(result_calc, 0.25)
71 |
72 | def test_correlation_coef_1_0_1_1(self):
73 | # Different u and v compared with u=0 and v=v
74 | result_calc = fitting.correlation_coef(sample_field,
75 | sample_field * 0.,
76 | sample_field,
77 | sample_field)
78 |
79 | np.testing.assert_almost_equal(result_calc, 0.5)
80 |
81 | def test_correlation_coef_1_1_0_1(self):
82 | # Different u and v compared with u=0 and v=v
83 | result_calc = fitting.correlation_coef(sample_field,
84 | sample_field,
85 | sample_field * 0.0,
86 | sample_field)
87 |
88 | np.testing.assert_almost_equal(result_calc, 0.5)
89 |
90 |
91 | if __name__ == '__main__':
92 | print('Some tests from the fitting functions')
93 | unittest.main()
94 |
--------------------------------------------------------------------------------
/tests/test_schemes.py:
--------------------------------------------------------------------------------
1 | import unittest
2 | import numpy as np
3 | import sys
4 |
5 | sys.path.insert(1, '../vortexfitting')
6 |
7 | import schemes # noqa: E402
8 |
9 | """
10 | test using "nosetests /tests/test_schemes.py"
11 | """
12 |
13 |
14 | class SchemeTest(unittest.TestCase):
15 |
16 | def test_my(self):
17 | x = np.arange(0.0, 1.0, 0.01)
18 | func = np.sin(np.pi * x)
19 | res = np.pi * (np.cos(np.pi * x))
20 | res_my = schemes.second_order_diff(func)
21 | self.assertAlmostEqual(res, res_my, 6)
22 |
23 |
24 | # def test_numpy(self):
25 | # res_np = np.gradient(func,0.01)
26 |
27 | if __name__ == '__main__':
28 | print('Some tests for the difference schemes')
29 | unittest.main()
30 |
--------------------------------------------------------------------------------
/tests/test_tools.py:
--------------------------------------------------------------------------------
1 | import unittest
2 | import numpy as np
3 |
4 |
5 | import sys
6 | sys.path.insert(1, '../vortexfitting')
7 |
8 | import fitting # noqa: E402
9 |
10 | """
11 | test using "nosetests tests/test_tools.py"
12 | """
13 |
14 |
15 | class ToolsTest(unittest.TestCase):
16 |
17 | def test_get_fluctuations(self):
18 | print('Some tests from the fitting functions')
19 | sample_field = np.array([[1.1, 0.9, 1.3, 0.7],
20 | [2.1, 1.9, 2.3, 1.7],
21 | [3.1, 2.9, 3.3, 2.7],
22 | [4.1, 3.9, 4.3, 3.7]])
23 |
24 | # Test in hom. in x axis
25 | mean = np.array([1.0, 2.0, 3.0, 4.0])
26 |
27 | result_calc = fitting.get_fluctuations(sample_field, mean, 'x')
28 |
29 | result = np.array([[0.1, -0.1, 0.3, -0.3],
30 | [0.1, -0.1, 0.3, -0.3],
31 | [0.1, -0.1, 0.3, -0.3],
32 | [0.1, -0.1, 0.3, -0.3]])
33 |
34 | np.testing.assert_array_almost_equal(result_calc, result)
35 |
36 | # Test in hom. in y axis
37 | mean = np.array([2.6, 2.4, 2.8, 2.2])
38 |
39 | result_calc = fitting.get_fluctuations(sample_field, mean, 'y')
40 |
41 | result = np.array([[-1.5, -1.5, -1.5, -1.5],
42 | [-0.5, -0.5, -0.5, -0.5],
43 | [0.5, 0.5, 0.5, 0.5],
44 | [1.5, 1.5, 1.5, 1.5]])
45 |
46 | np.testing.assert_array_almost_equal(result_calc, result)
47 |
48 |
49 | if __name__ == '__main__':
50 | unittest.main()
51 |
--------------------------------------------------------------------------------
/tests/vortex0_0_initial_vfield.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/tests/vortex0_0_initial_vfield.png
--------------------------------------------------------------------------------
/vortexfitting/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/guilindner/VortexFitting/6b790a086dc34c2aa1a3514afab1e9010421d118/vortexfitting/__init__.py
--------------------------------------------------------------------------------
/vortexfitting/__main__.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env/ python3
2 |
3 | import sys
4 | import os.path
5 | import argparse
6 |
7 | from vortexfitting import fitting
8 | from vortexfitting import schemes
9 | from vortexfitting import detection
10 | from vortexfitting import output
11 | from vortexfitting import classes
12 |
13 |
14 | def main():
15 | parser = argparse.ArgumentParser(description='Optional app description',
16 | formatter_class=argparse.RawTextHelpFormatter)
17 |
18 | parser.add_argument('-i', '--input', dest='input_filename',
19 | default='data/example_dataHIT.nc', type=str,
20 | help='Input file', metavar='FILE')
21 |
22 | parser.add_argument('-o', '--output', dest='output_directory',
23 | default='results', type=str,
24 | help='To specify an output directory', metavar='DIRECTORY')
25 |
26 | parser.add_argument('-s', '--scheme', dest='scheme',
27 | default=22, type=int,
28 | help='Scheme for differencing\n'
29 | '2 = second order \n'
30 | '22 = least-square filter (default)\n'
31 | '4 = fourth order')
32 |
33 | parser.add_argument('-d', '--detect', dest='detection_method',
34 | default='swirling', type=str,
35 | help='Detection method:\n'
36 | 'Q = Q criterion\n'
37 | 'delta = delta criterion\n'
38 | 'swirling = 2D Swirling Strength (default)')
39 |
40 | parser.add_argument('-t', '--threshold', dest='detection_threshold',
41 | default=0.0, type=float,
42 | help='Threshold for detection (default=0.0)')
43 |
44 | parser.add_argument('-b', '--boxsize', dest='box_size',
45 | default=6, type=int,
46 | help='Box size for the detection (default=6)')
47 |
48 | parser.add_argument('-f', '--flip', dest='flip_axis',
49 | default=False, type=bool,
50 | help='Flip X and Y axis for plotting:\n'
51 | '0 = False (default)\n'
52 | '1 = True')
53 |
54 | parser.add_argument('-mf', '--meanfilename', dest='mean_filename',
55 | default='/', type=str,
56 | help='Subtract a mean field from your instant field')
57 |
58 | parser.add_argument('-p', '--plot', dest='plot_method',
59 | default='fit', type=str,
60 | help='Plot on screen:\n'
61 | 'fit = Detection and fitting, saves images (default)\n'
62 | 'detect = Possible vortices (no fitting)\n'
63 | 'fields = Velocity fields and vorticity\n')
64 |
65 | parser.add_argument('-xy', '--xy', nargs=2, dest='xy_location',
66 | default=[0, 0],
67 | help='specify a location to see the data. ex: -xy 80 60')
68 |
69 | parser.add_argument('-first', '--first', dest='first',
70 | default=0, type=int,
71 | help='Index of first field (default: 0)')
72 |
73 | parser.add_argument('-last', '--last', dest='last',
74 | default=0, type=int,
75 | help='Index of last field (default: 0)')
76 |
77 | parser.add_argument('-step', '--step', dest='step',
78 | default=1, type=int,
79 | help='Step between 2 fields (default: 1)')
80 |
81 | parser.add_argument('-rmax', '--rmax', dest='rmax',
82 | default=10, type=float,
83 | help='Initial guess on the vortex radius (default: 10)')
84 |
85 | parser.add_argument('-ft', '--filetype', dest='file_type',
86 | default='dns', type=str,
87 | help='Type of the file (default: dns)\n'
88 | 'piv_netcdf: read a netCDF format\n'
89 | 'dns: read a netCDF format\n'
90 | 'piv_tecplot: read a tecplot format\n'
91 | 'openfoam: read an openfoam format\n')
92 |
93 | parser.add_argument('-ct', '--corrthreshold', dest='correlation_threshold',
94 | default=0.75, type=float,
95 | help='Correlation threshold (default: 0.75).\n'
96 | 'If the vortex is too big, its better to decrease this value')
97 |
98 | parser.add_argument('-of', '--outputformat', dest='output_format',
99 | default='png', type=str,
100 | help='Format of the output file (default: png).\n'
101 | 'Can be png, pdf, jpg ...')
102 | # parser.add_argument('-v', '--verbose', dest='verbose',
103 | # default=False, type=bool,
104 | # help='Displays info or hides it. (default: True) ')
105 |
106 | args = parser.parse_args()
107 | # start = time.time()
108 |
109 | # ---- LOAD DATA ----#
110 |
111 | if args.last < args.first:
112 | args.last = args.first # last should be at least equal to first
113 |
114 | for time_step in range(args.first, args.last + 1, args.step):
115 |
116 | if not os.path.exists(args.input_filename.format(time_step)):
117 | print('The input file does not exist. Exiting.')
118 | sys.exit()
119 |
120 | print('\nOpening file: ', args.input_filename.format(time_step), ', file type: ', args.file_type)
121 | if args.mean_filename != '/':
122 | print('Opening mean field: ', args.mean_filename)
123 |
124 | vfield = classes.VelocityField(args.input_filename, time_step, args.mean_filename, args.file_type)
125 |
126 | # ---- DIFFERENCE APPROXIMATION ----#
127 | # lap = time.time()
128 | if args.scheme == 4:
129 | vfield.derivative = schemes.fourth_order_diff(vfield)
130 | elif args.scheme == 2:
131 | vfield.derivative = schemes.second_order_diff(vfield)
132 | elif args.scheme == 22:
133 | vfield.derivative = schemes.least_square_diff(vfield)
134 | else:
135 | print('No scheme', args.scheme, 'found. Exiting!')
136 | sys.exit()
137 | # print(round(time.time() - lap,3), 'seconds')
138 |
139 | # ---- VORTICITY ----#
140 |
141 | vorticity = vfield.derivative['dvdx'] - vfield.derivative['dudy']
142 |
143 | # ---- METHOD FOR DETECTION OF VORTICES ----#
144 | # lap = time.time()
145 |
146 | detection_field = []
147 | if args.detection_method == 'Q':
148 | detection_field = detection.calc_q_criterion(vfield)
149 | elif args.detection_method == 'swirling':
150 | detection_field = detection.calc_swirling(vfield)
151 | elif args.detection_method == 'delta':
152 | detection_field = detection.calc_delta_criterion(vfield)
153 |
154 | # print(round(time.time() - lap,3), 'seconds')
155 |
156 | if vfield.normalization_flag:
157 | print('Normalization for ', vfield.normalization_direction, ' direction')
158 | detection_field = fitting.normalize(detection_field, vfield.normalization_direction) # normalization
159 |
160 | # ---- PEAK DETECTION ----#
161 | print('Threshold=', args.detection_threshold, ', box size=', args.box_size)
162 |
163 | peaks = fitting.find_peaks(detection_field, args.detection_threshold, args.box_size)
164 |
165 | print('Vortices found: ', len(peaks[0]))
166 | # ---- PEAKS DIRECTION OF ROTATION ----#
167 | vortices_counterclockwise, vortices_clockwise = fitting.direction_rotation(vorticity, peaks)
168 |
169 | # ---- MODEL FITTING ----#
170 | vortices = list()
171 | if (args.plot_method == 'fit') and (args.xy_location == [0, 0]):
172 | vortices = fitting.get_vortices(vfield, peaks, vorticity, args.rmax, args.correlation_threshold)
173 | print('---- Accepted vortices ----')
174 | print(len(vortices))
175 | else:
176 | print('No fitting')
177 |
178 | # ---- PLOTTING OPTIONS ----#
179 | if args.xy_location != [0, 0]:
180 | x_location = int(args.xy_location[0])
181 | y_location = int(args.xy_location[1])
182 | detection_field_window = detection_field[y_location - 10:y_location + 10, x_location - 10:x_location + 10]
183 | x_index, y_index, u_data, v_data = fitting.window(vfield, x_location, y_location, 10)
184 | fitting.plot_quiver(x_index, y_index, u_data, v_data, detection_field_window)
185 | if args.plot_method == 'detect':
186 | fitting.plot_detect(vortices_counterclockwise, vortices_clockwise, detection_field, args.flip_axis)
187 | if args.plot_method == 'fields':
188 | fitting.plot_fields(vfield, vorticity)
189 | if args.plot_method == 'fit':
190 | # create file 'vortices.dat' to store output vortices data
191 | output.create(args.output_directory, args)
192 | fitting.plot_accepted(vfield, vortices, detection_field, args.output_directory, time_step,
193 | args.output_format)
194 | fitting.plot_vortex(vfield, vortices, args.output_directory, time_step, args.output_format)
195 | output.write(vortices, args.output_directory, time_step)
196 | # output.write_field(args.output_directory+'/detection_field.dat', args.detection_method,
197 | # vfield,detection_field)
198 |
--------------------------------------------------------------------------------
/vortexfitting/convertToASCII.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env/ python3
2 | """
3 | Convert NetCDF4 files to ASCII (plain text)
4 | """
5 |
6 | import sys
7 | import argparse
8 | import numpy as np
9 | import netCDF4
10 |
11 | args = []
12 |
13 | if __name__ == '__main__':
14 | parser = argparse.ArgumentParser(description='convert file from netCDF to ASCII format',
15 | formatter_class=argparse.RawTextHelpFormatter)
16 |
17 | parser.add_argument('-i', '--input', dest='infile', type=str,
18 | default='../data/example_dataHIT.nc',
19 | help='input NetCDF file', metavar='FILE')
20 |
21 | parser.add_argument('-o', '--output', dest='outfile', type=str,
22 | default='../data/test_dataHIT_ascii.dat',
23 | help='output ASCII file', metavar='FILE')
24 |
25 | args = parser.parse_args()
26 |
27 | # Try to read the file
28 | try:
29 | datafile_read = netCDF4.Dataset(args.infile, 'r')
30 | except IOError:
31 | print('There was an error opening the file!')
32 | sys.exit()
33 |
34 | u = np.array(datafile_read.variables['velocity_x'][:, :, :])
35 | v = np.array(datafile_read.variables['velocity_y'][:, :, :])
36 | w = np.array(datafile_read.variables['velocity_z'][:, :, :])
37 |
38 | print("Converting {:s} file to {:s} file".format(args.infile, args.outfile))
39 |
40 | # Try to read the file
41 | try:
42 | outfile = open(args.outfile, 'w')
43 | except IOError:
44 | print('There was an error writing the file!')
45 | sys.exit()
46 |
47 | for k in range(len(u)):
48 | outfile.write('x y u v \n')
49 | for i in range(u[0, 0].size):
50 | for j in range(v[0, 0].size):
51 | outfile.write(str(i) + ' ' + str(j) + ' ' + str(u[k, j, i]) + ' ' + str(v[k, j, i]) + '\n')
52 |
53 | outfile.close()
54 |
55 | # this routine reads the ascii file in top of the netCDF file
56 | # used to see if the exported ascii is equal to the original file
57 | # put this in vortexfitting.py after "a = VelocityField(args.infilename, args.timestep)"
58 |
59 | # a.uu = []
60 | # a.vv = []
61 |
62 | # infile = open('ascii/DNS_zPlane0.dat', 'r')
63 | # lines = infile.readlines()[1:]
64 | # for x in lines:
65 | # a.uu.append(float(x.split(' ')[2]))
66 | # a.vv.append(float(x.split(' ')[3]))
67 |
68 | # a.uu = np.array(a.uu)
69 | # a.vv = np.array(a.vv)
70 | # a.uu = a.uu.reshape(a.u[:, 0].size, a.u[0, :].size)
71 | # a.vv = a.vv.reshape(a.v[:, 0].size, a.v[0, :].size)
72 | # a.u = a.uu
73 | # a.v = a.vv
74 |
--------------------------------------------------------------------------------
/vortexfitting/convertToNC.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env/ python3
2 | """
3 | Convert ASCII files to NetCDF4 (plain text)
4 | """
5 |
6 | import sys
7 | import argparse
8 | import numpy as np
9 | import netCDF4
10 |
11 | args = []
12 |
13 | if __name__ == '__main__':
14 | parser = argparse.ArgumentParser(description='convert file from ASCII to netCDF format',
15 | formatter_class=argparse.RawTextHelpFormatter)
16 |
17 | parser.add_argument('-i', '--input', dest='infile', type=str,
18 | default='../data/test_dataHIT_ascii.dat',
19 | help='input ASCII file', metavar='FILE')
20 |
21 | parser.add_argument('-o', '--output', dest='outfile', type=str,
22 | default='../data/test_dataHIT_back_converted.nc',
23 | help='output NetCDF file', metavar='FILE')
24 |
25 | parser.add_argument('-nx', '--nx', dest='ndimx', type=int,
26 | help='spatial mesh dimension, for the x variable', default=159)
27 |
28 | parser.add_argument('-ny', '--ny', dest='ndimy', type=int,
29 | help='spatial mesh dimension, for the y variable', default=134)
30 |
31 | args = parser.parse_args()
32 |
33 | # Try to write the file
34 | try:
35 | datafile_write = netCDF4.Dataset(args.outfile, 'w', format='NETCDF4')
36 | except IOError:
37 | print('There was an error writing the file!')
38 | sys.exit()
39 |
40 | datafile_write.description = 'Experiments conducted at Rouen ...'
41 |
42 | ndimx = args.ndimx # spacing
43 | ndimy = args.ndimy # spacing
44 |
45 | # dimensions
46 | datafile_write.createDimension('resolution_x', ndimx)
47 | datafile_write.createDimension('resolution_y', ndimy)
48 | datafile_write.createDimension('resolution_z', 1)
49 |
50 | # variables
51 | velocity_x = datafile_write.createVariable('velocity_x', 'f4', ('resolution_z',
52 | 'resolution_y',
53 | 'resolution_x'))
54 | velocity_y = datafile_write.createVariable('velocity_y', 'f4', ('resolution_z',
55 | 'resolution_y',
56 | 'resolution_x'))
57 | velocity_z = datafile_write.createVariable('velocity_z', 'f4', ('resolution_z',
58 | 'resolution_y',
59 | 'resolution_x'))
60 | grid_x = datafile_write.createVariable('grid_x', 'f4', 'resolution_x')
61 | grid_y = datafile_write.createVariable('grid_y', 'f4', 'resolution_y')
62 |
63 | # data
64 | # velocity_x[:] = np.random.random((1,ndimy,ndimx))/1
65 | # velocity_y[:] = np.random.random((1,ndimy,ndimx))/1
66 | # velocity_z[:] = np.random.random((1,ndimy,ndimx))/1
67 |
68 | # grid
69 | x = np.linspace(0, ndimy, ndimx)
70 | y = np.linspace(0, ndimy, ndimx)
71 |
72 | print("Converting {:s} file to {:s} file".format(args.infile, args.outfile))
73 |
74 | # Try to read the file
75 | try:
76 | infile = open(args.infile, 'r')
77 | except IOError:
78 | print('There was an error reading the file!')
79 | sys.exit()
80 |
81 | line = infile.readline()
82 | lines = infile.readlines()
83 | for j in range(ndimy):
84 | for i in range(ndimx):
85 | velocity_x[0, j, i] = lines[j * ndimx + i].split()[2]
86 | velocity_y[0, j, i] = lines[j * ndimx + i].split()[3]
87 | if j == 0:
88 | grid_x[i] = lines[i].split()[0]
89 | if i == 0:
90 | grid_y[j] = lines[j * ndimx].split()[1]
91 |
92 | datafile_write.close()
93 |
--------------------------------------------------------------------------------
/vortexfitting/detection.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env/ python3
2 | """
3 | Different methods for vortex detection
4 | """
5 |
6 | import numpy as np
7 |
8 |
9 | def calc_swirling(vfield):
10 | """
11 | 2D Swirling strength
12 |
13 | :param vfield: contains spatial mesh and velocity components
14 | :type vfield: class VelocityField()
15 | :returns: swirling strength criterion
16 | :rtype: ndarray
17 | """
18 | print('Detection method: 2D swirling strength')
19 |
20 | matrix_a = np.array(
21 | [[vfield.derivative['dudx'].ravel(), vfield.derivative['dudy'].ravel(),
22 | vfield.derivative['dudz'].ravel()],
23 | [vfield.derivative['dvdx'].ravel(), vfield.derivative['dvdy'].ravel(),
24 | vfield.derivative['dvdz'].ravel()],
25 | [vfield.derivative['dwdx'].ravel(), vfield.derivative['dwdy'].ravel(),
26 | -vfield.derivative['dudx'].ravel() - vfield.derivative['dvdy'].ravel()]])
27 |
28 | matrix_a = matrix_a.transpose((2, 1, 0))
29 | eigenvalues = np.linalg.eigvals(matrix_a)
30 | swirling = np.max(eigenvalues.imag, axis=1).reshape(vfield.u_velocity_matrix[:, 0].size,
31 | vfield.u_velocity_matrix[0, :].size)
32 | print('Max value of swirling: ', np.round(np.max(swirling), 2))
33 | return swirling
34 |
35 |
36 | def calc_q_criterion(vfield):
37 | """
38 | Q Criterion
39 | vorticity magnitude and mean strain rate
40 |
41 | :param vfield: contains spatial mesh and velocity components
42 | :type vfield: class VelocityField()
43 | :returns: Q criterion
44 | :rtype: ndarray
45 | """
46 | print('Detection method: Q criterion')
47 | q_matrix = np.zeros((vfield.u_velocity_matrix.shape[0], vfield.u_velocity_matrix.shape[1]))
48 | for i in range(vfield.u_velocity_matrix.shape[0]):
49 | for j in range(vfield.u_velocity_matrix.shape[1]):
50 | q_matrix[i, j] = -0.5 * (vfield.derivative['dudx'][i, j] ** 2 + vfield.derivative['dvdy'][i, j] ** 2) \
51 | - vfield.derivative['dudy'][i, j] * vfield.derivative['dvdx'][i, j]
52 | return q_matrix
53 |
54 |
55 | def calc_delta_criterion(vfield):
56 | """
57 | Delta Criterion
58 |
59 | :param vfield: contains spatial mesh and velocity components
60 | :type vfield: class VelocityField
61 | :returns: delta criterion
62 | :rtype: ndarray
63 | """
64 | print('Detection method: Delta criterion')
65 | q_matrix = np.zeros((vfield.u_velocity_matrix.shape[0], vfield.u_velocity_matrix.shape[1]))
66 | r_matrix = np.zeros((vfield.u_velocity_matrix.shape[0], vfield.u_velocity_matrix.shape[1]))
67 | delta = np.zeros((vfield.u_velocity_matrix.shape[0], vfield.u_velocity_matrix.shape[1]))
68 | for i in range(vfield.u_velocity_matrix.shape[0]):
69 | for j in range(vfield.u_velocity_matrix.shape[1]):
70 | q_matrix[i, j] = -0.5 * (vfield.derivative['dudx'][i, j] ** 2 + vfield.derivative['dvdy'][i, j] ** 2) \
71 | - vfield.derivative['dudy'][i, j] * vfield.derivative['dvdx'][i, j]
72 | r_matrix[i, j] = vfield.derivative['dudx'][i, j] * vfield.derivative['dvdy'][i, j] \
73 | - vfield.derivative['dvdx'][i, j] * vfield.derivative['dudy'][i, j] # noqa: E261
74 | delta[i, j] = (q_matrix[i, j] / 3) ** 3 + (r_matrix[i, j] / 2) ** 2
75 | return delta
76 |
--------------------------------------------------------------------------------
/vortexfitting/generateNetCDF.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env/ python3
2 | """
3 | Generate a netCDF file with a vortex field.
4 | """
5 |
6 | import sys
7 | import argparse
8 | import numpy as np
9 | import matplotlib.pyplot as plt
10 | import netCDF4
11 |
12 | import fitting
13 |
14 | args = []
15 |
16 | if __name__ == '__main__':
17 | parser = argparse.ArgumentParser(description='generate a vortex field in a netCDF file',
18 | formatter_class=argparse.RawTextHelpFormatter)
19 |
20 | parser.add_argument('-o', '--output', dest='outfile', type=str,
21 | help='output NetCDF file', metavar='FILE',
22 | default='../data/generatedField.nc')
23 |
24 | parser.add_argument('-ndim', '--ndim', dest='ndim', type=int,
25 | help='spatial mesh dimension, for each x and y variables',
26 | default=256)
27 |
28 | args = parser.parse_args()
29 |
30 | print('Generating {:s} file with a {:d}x{:d} mesh'.format(args.outfile, args.ndim, args.ndim))
31 |
32 | # Try to write the file
33 | try:
34 | datafile_write = netCDF4.Dataset(args.outfile, 'w', format='NETCDF4')
35 | except IOError:
36 | print('There was an error writing the file!')
37 | sys.exit()
38 |
39 | datafile_write.description = 'Sample field with an Oseen vortex'
40 |
41 | ndim = args.ndim # spacing
42 |
43 | # dimensions
44 | datafile_write.createDimension('resolution_x', ndim)
45 | datafile_write.createDimension('resolution_y', ndim)
46 | datafile_write.createDimension('resolution_z', 1)
47 |
48 | # variables
49 | velocity_x = datafile_write.createVariable('velocity_x', 'f4', ('resolution_z', 'resolution_y', 'resolution_x'))
50 | velocity_y = datafile_write.createVariable('velocity_y', 'f4', ('resolution_z', 'resolution_y', 'resolution_x'))
51 | velocity_z = datafile_write.createVariable('velocity_z', 'f4', ('resolution_z', 'resolution_y', 'resolution_x'))
52 |
53 | # data
54 | velocity_x[:] = np.random.random((1, ndim, ndim)) / 10
55 | velocity_y[:] = np.random.random((1, ndim, ndim)) / 10
56 | velocity_z[:] = np.random.random((1, ndim, ndim)) / 10
57 |
58 | # grid
59 | x_grid = np.linspace(0, ndim, ndim)
60 | y_grid = np.linspace(0, ndim, ndim)
61 |
62 | x_matrix, y_matrix = np.meshgrid(x_grid, y_grid)
63 | core_radius = 5.0
64 | gamma = 30
65 | x_center = 64
66 | y_center = 192
67 | u_advection = 0.0
68 | v_advection = 0.3
69 | u_data, v_data = fitting.velocity_model(core_radius, gamma, x_center, y_center, u_advection, v_advection, x_matrix,
70 | y_matrix)
71 | u_data = u_data + u_advection
72 | v_data = v_data + v_advection
73 |
74 | velocity_x[0, :, :] += u_data[:, :]
75 | velocity_y[0, :, :] += v_data[:, :]
76 | s = 4 # sampling factor for quiver plot
77 | plt.quiver(x_matrix[::s, ::s], y_matrix[::s, ::s], velocity_x[0, ::s, ::s], velocity_y[0, ::s, ::s])
78 |
79 | plt.show()
80 | datafile_write.close()
81 |
--------------------------------------------------------------------------------
/vortexfitting/output.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env/ python3
2 | """
3 | Create an output file for the detected vortices, with tecplot format
4 | """
5 |
6 | import os
7 | import numpy as np
8 |
9 |
10 | def create(output_directory, args):
11 | """
12 | Create an output file
13 |
14 | :param output_directory: directory hosting the file vortices.dat
15 | :type output_directory: str
16 | :param args: directory hosting the file vortices.dat
17 | :type args: class parser
18 | :returns: file with time, radius, gamma, xcenter, ycenter, u_advection, v_advection, correlation, vtheta
19 | :rtype: file
20 | """
21 |
22 | if not os.path.exists(output_directory):
23 | os.makedirs(output_directory)
24 | outfile = open(output_directory + '/vortices.dat', 'w')
25 | outfile.write("TITLE=\"Vortex characteristics evolution\"\n")
26 | outfile.write("Variables=\"time\",\"radius\",\"gamma\",\"xcenter\",\"ycenter\","
27 | "\"u_advection\",\"v_advection\",\"correlation\",\"vtheta\"\n")
28 | outfile.write("DATASETAUXDATA Detection_method=\"{}\"\n".format(args.detection_method))
29 | if args.scheme == 22:
30 | outfile.write("DATASETAUXDATA Scheme=\"{}\"\n".format('least_square'))
31 | else:
32 | outfile.write("DATASETAUXDATA Scheme=\"{}\"\n".format(args.scheme))
33 | outfile.write("DATASETAUXDATA Box_size=\"{}\"\n".format(args.box_size))
34 | outfile.write("DATASETAUXDATA Detection_threshold=\"{}\"\n".format(args.detection_threshold))
35 | outfile.write("DATASETAUXDATA Rmax=\"{}\"\n".format(args.rmax))
36 | outfile.write("DATASETAUXDATA Correlation_threshold=\"{}\"\n".format(args.correlation_threshold))
37 | outfile.write("DATASETAUXDATA Vortex_Model=\"{}\"\n".format('Lamb_Oseen'))
38 | outfile.write("DATASETAUXDATA Mean_file=\"{}\"\n".format(args.mean_filename))
39 | outfile.write("DATASETAUXDATA File_type=\"{}\"\n".format(args.file_type))
40 | outfile.write("ZONE T=\"0\", SOLUTIONTIME=0\n")
41 | outfile.close()
42 |
43 |
44 | def write(vortices, output_directory, time_step):
45 | """
46 | Update an output file
47 |
48 | :param vortices: list of the detected vortices
49 | :param output_directory: directory hosting the file vortices.dat
50 | :param time_step: time of the current velocity field
51 | :type vortices: list
52 | :type output_directory: str
53 | :type time_step: int
54 | :returns: empty
55 | :rtype: empty
56 | """
57 |
58 | outfile = open(output_directory + '/vortices.dat', 'a')
59 |
60 | for i, line in enumerate(vortices):
61 | outfile.write("{0} {1} {2} {3} {4} {5} {6} {7} {8}\n".format(time_step, line[0], line[1], line[2], line[3],
62 | line[4], line[5], line[7], line[8]))
63 | outfile.close()
64 |
65 |
66 | def write_field(output_file, detection_method, vfield, detection_field):
67 | """
68 | Write a detection field file
69 |
70 | :param output_file: directory hosting the file vortices.dat
71 | :param detection_method: writes the selected detection method (Q, Delta, swirling strength)
72 | :param vfield: full size velocity field
73 | :param detection_field: full size detection field
74 | :type output_file: str
75 | :type detection_method: str
76 | :type vfield: ndarray
77 | :type detection_field: ndarray
78 | :returns: file
79 | :rtype: file
80 | """
81 | if not os.path.exists(output_file):
82 | os.makedirs(output_file)
83 | outfile = open(output_file, 'w')
84 | outfile.write("TITLE=\"Detection field\"\n")
85 | outfile.write("Variables=\"X\",\"Y\",\"{}\"\n".format(detection_method))
86 | outfile.write(
87 | "ZONE T=\"0\", I={:d}, J={:d}, SOLUTIONTIME=0\n".format(vfield.x_coordinate_size, vfield.y_coordinate_size))
88 | for j in np.arange(0, vfield.y_coordinate_size, 1):
89 | for i in np.arange(0, vfield.x_coordinate_size, 1):
90 | outfile.write("{0} {1} {2}\n".format(str(vfield.x_coordinate_matrix[j]), str(vfield.y_coordinate_matrix[i]),
91 | detection_field[i, j]))
92 | outfile.write("{0} {1} {2}\n".format(0, 0, 0))
93 | outfile.close()
94 |
--------------------------------------------------------------------------------
/vortexfitting/schemes.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env/ python3
2 | """
3 | Difference schemes for the velocity derivatives
4 | """
5 |
6 | import numpy as np
7 |
8 |
9 | def second_order_diff(vfield):
10 | """
11 | Second order accurate finite difference scheme.
12 |
13 | .. note:: Scheme 1:0:-1
14 |
15 | :params vfield: 2D array of the velocity field, containing u and v
16 | :type vfield: class VelocityField
17 | :returns: derivative
18 | :rtype: 2D array of float
19 | """
20 | print('Difference scheme: Second Order Scheme')
21 |
22 | dx = vfield.x_coordinate_step # only for homogeneous mesh
23 | dy = vfield.y_coordinate_step # only for homogeneous mesh
24 |
25 | vfield.derivative['dudy'], vfield.derivative['dudx'] = np.gradient(vfield.u_velocity_matrix, dy, dx)
26 | vfield.derivative['dvdy'], vfield.derivative['dvdx'] = np.gradient(vfield.v_velocity_matrix, dy, dx)
27 |
28 | return vfield.derivative
29 |
30 |
31 | def least_square_diff(vfield): # may have a problem on the boundary
32 | """
33 | Least-square filter difference scheme [RAFFEL1998]_.
34 |
35 | .. note:: Scheme -2:-1:0:1:2
36 |
37 | :params vfield: 2D array of the velocity field, containing u and v
38 | :type vfield: class VelocityField
39 | :returns: derivative
40 | :rtype: 2D array of float
41 |
42 | .. [RAFFEL1998] Raffel M, Willert C and Kompenhans J 1998
43 | *Particle image velocimetry A Practical Guide* (Berlin: Springer)
44 | """
45 | print('Difference scheme: least-square filter')
46 |
47 | dx = vfield.x_coordinate_step # only for homogeneous mesh
48 | dy = vfield.y_coordinate_step # only for homogeneous mesh
49 |
50 | vfield.derivative['dudx'][:, 2:-2] = (-2 * vfield.u_velocity_matrix[:, 0:-4] -
51 | vfield.u_velocity_matrix[:, 1:-3] +
52 | vfield.u_velocity_matrix[:, 3:-1] +
53 | 2 * vfield.u_velocity_matrix[:, 4:]) / (10 * dy)
54 | vfield.derivative['dudy'][2:-2, :] = (-2 * vfield.u_velocity_matrix[0:-4, :] -
55 | vfield.u_velocity_matrix[1:-3, :] +
56 | vfield.u_velocity_matrix[3:-1, :] +
57 | 2 * vfield.u_velocity_matrix[4:, :]) / (10 * dx)
58 | vfield.derivative['dvdx'][:, 2:-2] = (-2 * vfield.v_velocity_matrix[:, 0:-4] -
59 | vfield.v_velocity_matrix[:, 1:-3] +
60 | vfield.v_velocity_matrix[:, 3:-1] +
61 | 2 * vfield.v_velocity_matrix[:, 4:]) / (10 * dy)
62 | vfield.derivative['dvdy'][2:-2, :] = (-2 * vfield.v_velocity_matrix[0:-4, :] -
63 | vfield.v_velocity_matrix[1:-3, :] +
64 | vfield.v_velocity_matrix[3:-1, :] +
65 | 2 * vfield.v_velocity_matrix[4:, :]) / (10 * dx)
66 |
67 | return vfield.derivative
68 |
69 |
70 | def fourth_order_diff(vfield):
71 | """
72 | Fourth order accurate finite difference scheme.
73 |
74 | .. note:: Scheme: 1:-8:0:8:-1
75 |
76 | :params vfield: 2D array of the velocity field, containing u and v
77 | :type vfield: class VelocityField
78 | :returns: derivative
79 | :rtype: 2D array of float
80 | """
81 | print('Difference scheme: Fourth Order Scheme')
82 |
83 | dx = vfield.x_coordinate_step # only for homogeneous mesh
84 | dy = vfield.y_coordinate_step # only for homogeneous mesh
85 |
86 | vfield.derivative['dudx'][:, 2:-2] = (vfield.u_velocity_matrix[:, 0:-4] -
87 | 8 * vfield.u_velocity_matrix[:, 1:-3] +
88 | 8 * vfield.u_velocity_matrix[:, 3:-1] -
89 | vfield.u_velocity_matrix[:, 4:]) / (12 * dy)
90 | vfield.derivative['dudy'][2:-2, :] = (vfield.u_velocity_matrix[0:-4, :] -
91 | 8 * vfield.u_velocity_matrix[1:-3, :] +
92 | 8 * vfield.u_velocity_matrix[3:-1, :] -
93 | vfield.u_velocity_matrix[4:, :]) / (12 * dx)
94 | vfield.derivative['dvdx'][:, 2:-2] = (vfield.v_velocity_matrix[:, 0:-4] -
95 | 8 * vfield.v_velocity_matrix[:, 1:-3] +
96 | 8 * vfield.v_velocity_matrix[:, 3:-1] -
97 | vfield.v_velocity_matrix[:, 4:]) / (12 * dy)
98 | vfield.derivative['dvdy'][2:-2, :] = (vfield.v_velocity_matrix[0:-4, :] -
99 | 8 * vfield.v_velocity_matrix[1:-3, :] +
100 | 8 * vfield.v_velocity_matrix[3:-1, :] -
101 | vfield.v_velocity_matrix[4:, :]) / (12 * dx)
102 |
103 | return vfield.derivative
104 |
--------------------------------------------------------------------------------