├── .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 | $('\u00B6'). 166 | attr('href', '#' + this.id). 167 | attr('title', _('Permalink to this headline')). 168 | appendTo(this); 169 | }); 170 | $('dt[id]').each(function() { 171 | $('\u00B6'). 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 | $('') 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 | 72 | 73 |
[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)
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 | 84 | 85 |
[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
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 | 97 | 98 | 100 | 101 | 103 | 104 | 105 |
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 |
Returns:

vfield, an instance of the VelocityField class

99 |
Return type:

class VelocityField

102 |
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 | 74 | 75 | 76 | 77 | 78 | 79 | 80 |
Parameters:vfield (class VelocityField) – contains spatial mesh and velocity components
Returns:delta criterion
Return type:ndarray
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 | 93 | 94 | 95 | 96 | 97 | 98 | 99 |
Parameters:vfield (class VelocityField()) – contains spatial mesh and velocity components
Returns:Q criterion
Return type:ndarray
100 |
101 | 102 |
103 |
104 | detection.calc_swirling(vfield)
105 |

2D Swirling strength

106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 |
Parameters:vfield (class VelocityField()) – contains spatial mesh and velocity components
Returns:swirling strength criterion
Return type:ndarray
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 |
57 |
58 |
59 |
60 | 61 |
62 |

Modules

63 |
64 | 71 |
72 |
73 | 74 | 75 |
76 |
77 |
78 | 112 |
113 |
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 | 75 | 76 | 77 | 80 | 81 | 83 | 84 | 85 | 88 | 89 | 91 | 92 | 93 | 96 | 97 | 99 | 100 | 101 | 104 | 105 | 107 | 108 | 109 | 112 |
 
74 | c
78 | classes 79 |
 
82 | d
86 | detection 87 |
 
90 | f
94 | fitting 95 |
 
98 | o
102 | output 103 |
 
106 | s
110 | schemes 111 |
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 |
76 | 77 | 78 | 79 |
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 | --------------------------------------------------------------------------------