From 359e5aa0b5a8aa10fe019bab9c2ff7396dd53aa8 Mon Sep 17 00:00:00 2001 From: Young Date: Fri, 10 Mar 2023 11:57:16 -0700 Subject: [PATCH 01/94] adding a documentation skeleton and templates, renaming pvopt --- .gitignore | 7 +++ docs/Makefile | 20 ++++++ docs/background/index.rst | 20 ++++++ docs/conf.py | 57 ++++++++++++++++++ docs/how_to_guides/getting_started.rst | 23 +++++++ docs/how_to_guides/hpc_jobs.rst | 4 ++ docs/how_to_guides/index.rst | 8 +++ docs/index.rst | 30 +++++++++ docs/make.bat | 35 +++++++++++ docs/technical_reference/data_stream.rst | 5 ++ docs/technical_reference/flow_manager.rst | 5 ++ docs/technical_reference/index.rst | 10 +++ docs/technical_reference/mesh_manager.rst | 5 ++ docs/technical_reference/parameters.rst | 5 ++ environment.yaml | 2 + {pvopt => pvade}/DataStream.py | 2 +- {pvopt => pvade}/FlowManager.py | 0 {pvopt => pvade}/Parameters.py | 0 {pvopt => pvade}/__init__.py | 0 {pvopt => pvade}/enforce_periodicity.py | 0 .../generate_and_convert_3d_meshes.py | 0 {pvopt => pvade}/geometry/MeshManager.py | 2 +- {pvopt => pvade}/geometry/MeshManager2d.py | 0 {pvopt => pvade}/geometry/MeshManager3d.py | 0 {pvopt => pvade}/geometry/__init__.py | 0 .../geometry/cylinder2d/DomainCreation.py | 0 .../cylinder2d/DomainCreation_temp.py | 0 .../geometry/cylinder2d/__init__.py | 0 .../geometry/cylinder3d/DomainCreation.py | 0 .../geometry/cylinder3d/__init__.py | 0 .../geometry/panels/DomainCreation.py | 0 {pvopt => pvade}/geometry/panels/__init__.py | 0 .../geometry/panels2d/DomainCreation.py | 0 .../geometry/panels2d/__init__.py | 0 .../template/TemplateDomainCreation.py | 0 .../geometry/template/__init__.py | 0 {pvopt => pvade}/input_schema.yaml | 0 {pvopt => pvade}/save_all_net_traction.py | 0 pvopt/.DS_Store | Bin 8196 -> 0 bytes pvopt/__pycache__/DataStream.cpython-310.pyc | Bin 1304 -> 0 bytes pvopt/__pycache__/FlowManager.cpython-310.pyc | Bin 18739 -> 0 bytes .../FlowManager_copy.cpython-310.pyc | Bin 18532 -> 0 bytes pvopt/__pycache__/IOManager.cpython-310.pyc | Bin 5934 -> 0 bytes pvopt/__pycache__/MeshManager.cpython-310.pyc | Bin 13741 -> 0 bytes pvopt/__pycache__/MeshManager.cpython-39.pyc | Bin 11629 -> 0 bytes pvopt/__pycache__/Parameters.cpython-310.pyc | Bin 5435 -> 0 bytes pvopt/__pycache__/__init__.cpython-310.pyc | Bin 493 -> 0 bytes pvopt/__pycache__/__init__.cpython-39.pyc | Bin 152 -> 0 bytes .../__pycache__/MeshManager.cpython-310.pyc | Bin 9119 -> 0 bytes .../__pycache__/MeshManager.cpython-39.pyc | Bin 12177 -> 0 bytes .../__pycache__/MeshManager2d.cpython-310.pyc | Bin 9039 -> 0 bytes .../__pycache__/MeshManager3d.cpython-310.pyc | Bin 8920 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 163 -> 0 bytes .../__pycache__/__init__.cpython-39.pyc | Bin 161 -> 0 bytes .../DomainCreation.cpython-310.pyc | Bin 1585 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 174 -> 0 bytes pvopt/geometry/cylinder3d/.DS_Store | Bin 6148 -> 0 bytes .../DomainCreation.cpython-310.pyc | Bin 1744 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 174 -> 0 bytes pvopt/geometry/panels/.DS_Store | Bin 6148 -> 0 bytes .../DomainCreation.cpython-310.pyc | Bin 1793 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 170 -> 0 bytes .../domain_creation.cpython-310.pyc | Bin 2263 -> 0 bytes .../DomainCreation.cpython-310.pyc | Bin 2185 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 172 -> 0 bytes .../TemplateDomainCreation.cpython-310.pyc | Bin 2941 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 172 -> 0 bytes 67 files changed, 238 insertions(+), 2 deletions(-) create mode 100644 .gitignore create mode 100644 docs/Makefile create mode 100644 docs/background/index.rst create mode 100644 docs/conf.py create mode 100644 docs/how_to_guides/getting_started.rst create mode 100644 docs/how_to_guides/hpc_jobs.rst create mode 100644 docs/how_to_guides/index.rst create mode 100644 docs/index.rst create mode 100644 docs/make.bat create mode 100644 docs/technical_reference/data_stream.rst create mode 100644 docs/technical_reference/flow_manager.rst create mode 100644 docs/technical_reference/index.rst create mode 100644 docs/technical_reference/mesh_manager.rst create mode 100644 docs/technical_reference/parameters.rst rename {pvopt => pvade}/DataStream.py (98%) rename {pvopt => pvade}/FlowManager.py (100%) rename {pvopt => pvade}/Parameters.py (100%) rename {pvopt => pvade}/__init__.py (100%) rename {pvopt => pvade}/enforce_periodicity.py (100%) rename {pvopt => pvade}/generate_and_convert_3d_meshes.py (100%) rename {pvopt => pvade}/geometry/MeshManager.py (99%) rename {pvopt => pvade}/geometry/MeshManager2d.py (100%) rename {pvopt => pvade}/geometry/MeshManager3d.py (100%) rename {pvopt => pvade}/geometry/__init__.py (100%) rename {pvopt => pvade}/geometry/cylinder2d/DomainCreation.py (100%) rename {pvopt => pvade}/geometry/cylinder2d/DomainCreation_temp.py (100%) rename {pvopt => pvade}/geometry/cylinder2d/__init__.py (100%) rename {pvopt => pvade}/geometry/cylinder3d/DomainCreation.py (100%) rename {pvopt => pvade}/geometry/cylinder3d/__init__.py (100%) rename {pvopt => pvade}/geometry/panels/DomainCreation.py (100%) rename {pvopt => pvade}/geometry/panels/__init__.py (100%) rename {pvopt => pvade}/geometry/panels2d/DomainCreation.py (100%) rename {pvopt => pvade}/geometry/panels2d/__init__.py (100%) rename {pvopt => pvade}/geometry/template/TemplateDomainCreation.py (100%) rename {pvopt => pvade}/geometry/template/__init__.py (100%) rename {pvopt => pvade}/input_schema.yaml (100%) rename {pvopt => pvade}/save_all_net_traction.py (100%) delete mode 100644 pvopt/.DS_Store delete mode 100644 pvopt/__pycache__/DataStream.cpython-310.pyc delete mode 100644 pvopt/__pycache__/FlowManager.cpython-310.pyc delete mode 100644 pvopt/__pycache__/FlowManager_copy.cpython-310.pyc delete mode 100644 pvopt/__pycache__/IOManager.cpython-310.pyc delete mode 100644 pvopt/__pycache__/MeshManager.cpython-310.pyc delete mode 100644 pvopt/__pycache__/MeshManager.cpython-39.pyc delete mode 100644 pvopt/__pycache__/Parameters.cpython-310.pyc delete mode 100644 pvopt/__pycache__/__init__.cpython-310.pyc delete mode 100644 pvopt/__pycache__/__init__.cpython-39.pyc delete mode 100644 pvopt/geometry/__pycache__/MeshManager.cpython-310.pyc delete mode 100644 pvopt/geometry/__pycache__/MeshManager.cpython-39.pyc delete mode 100644 pvopt/geometry/__pycache__/MeshManager2d.cpython-310.pyc delete mode 100644 pvopt/geometry/__pycache__/MeshManager3d.cpython-310.pyc delete mode 100644 pvopt/geometry/__pycache__/__init__.cpython-310.pyc delete mode 100644 pvopt/geometry/__pycache__/__init__.cpython-39.pyc delete mode 100644 pvopt/geometry/cylinder2d/__pycache__/DomainCreation.cpython-310.pyc delete mode 100644 pvopt/geometry/cylinder2d/__pycache__/__init__.cpython-310.pyc delete mode 100644 pvopt/geometry/cylinder3d/.DS_Store delete mode 100644 pvopt/geometry/cylinder3d/__pycache__/DomainCreation.cpython-310.pyc delete mode 100644 pvopt/geometry/cylinder3d/__pycache__/__init__.cpython-310.pyc delete mode 100644 pvopt/geometry/panels/.DS_Store delete mode 100644 pvopt/geometry/panels/__pycache__/DomainCreation.cpython-310.pyc delete mode 100644 pvopt/geometry/panels/__pycache__/__init__.cpython-310.pyc delete mode 100644 pvopt/geometry/panels/__pycache__/domain_creation.cpython-310.pyc delete mode 100644 pvopt/geometry/panels2d/__pycache__/DomainCreation.cpython-310.pyc delete mode 100644 pvopt/geometry/panels2d/__pycache__/__init__.cpython-310.pyc delete mode 100644 pvopt/geometry/template/__pycache__/TemplateDomainCreation.cpython-310.pyc delete mode 100644 pvopt/geometry/template/__pycache__/__init__.cpython-310.pyc diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..64852b99 --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +.* +!/.gitignore +!/.readthedocs.yaml +*.pyc +*.egg-info/ + +docs/_build/ diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 00000000..d4bb2cbb --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,20 @@ +# Minimal makefile for Sphinx documentation +# + +# You can set these variables from the command line, and also +# from the environment for the first two. +SPHINXOPTS ?= +SPHINXBUILD ?= sphinx-build +SOURCEDIR = . +BUILDDIR = _build + +# Put it first so that "make" without argument is like "make help". +help: + @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) + +.PHONY: help Makefile + +# Catch-all target: route all unknown targets to Sphinx using the new +# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). +%: Makefile + @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/background/index.rst b/docs/background/index.rst new file mode 100644 index 00000000..d748404a --- /dev/null +++ b/docs/background/index.rst @@ -0,0 +1,20 @@ +Background +========== + +A collection of resources for further reading on PVade topics and the theory and implementation for solver elements. + +Fluid Solver +------------ + + + +Structural Solver +----------------- + + + +PV Wind Loading and Stability +----------------------------- + +* E. Young, "Predicting wind loading and instability in solar tracking PV arrays", PV Reliability Workshop (2023), https://www.nrel.gov/docs/fy23osti/85567.pdf. + diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 00000000..0fa4331f --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,57 @@ +# Configuration file for the Sphinx documentation builder. +# +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import sys +sys.path.insert(0, os.path.abspath('../pvade')) + + +# -- Project information ----------------------------------------------------- + +project = 'PVade' +copyright = '2023, Walid Arsalane, Ethan Young' +author = 'Walid Arsalane, Ethan Young' + + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = ['sphinx.ext.autodoc', + 'sphinx.ext.napoleon', + 'sphinx.ext.autosectionlabel' +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +# html_theme = 'alabaster' +html_theme = 'sphinx_rtd_theme' + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +autoclass_content = 'both' diff --git a/docs/how_to_guides/getting_started.rst b/docs/how_to_guides/getting_started.rst new file mode 100644 index 00000000..31437782 --- /dev/null +++ b/docs/how_to_guides/getting_started.rst @@ -0,0 +1,23 @@ +Getting Started +=============== + +Building Conda Environment +-------------------------- + +To use this software, begin by creating a Conda environment using the provided ``environment.yaml`` file:: + + conda env create -n my_env_name -f environment.yaml + +where ``my_env_name`` can be replaced with a short name for your Conda environment. When the environment finishes installing, activate it with:: + + conda activate my_env_name + +from within your activate Conda environment, a simulation can be executed with:: + + python main.py --command_line_arg value + + +Running Examples +---------------- + +.. Fill in with walkthrough pointing to an example \ No newline at end of file diff --git a/docs/how_to_guides/hpc_jobs.rst b/docs/how_to_guides/hpc_jobs.rst new file mode 100644 index 00000000..aa8dda01 --- /dev/null +++ b/docs/how_to_guides/hpc_jobs.rst @@ -0,0 +1,4 @@ +HPC Jobs +======== + +.. Fill in with walkthrough pointing to an example \ No newline at end of file diff --git a/docs/how_to_guides/index.rst b/docs/how_to_guides/index.rst new file mode 100644 index 00000000..bc86b34f --- /dev/null +++ b/docs/how_to_guides/index.rst @@ -0,0 +1,8 @@ +How To Guides +============= + +.. toctree:: + :maxdepth: 1 + + getting_started + hpc_jobs diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 00000000..5cf63f81 --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,30 @@ +.. PVade documentation master file, created by + sphinx-quickstart on Fri Mar 10 11:27:06 2023. + You can adapt this file completely to your liking, but it should at least + contain the root `toctree` directive. + +Welcome to PVade's documentation! +================================= + +PVade is an open source fluid-structure interaction model which can be used to study wind loading and stability on solar-tracking PV arrays. PVade can be used as part of a larger modeling chain to provide stressor inputs to mechanical module models to study the physics of failure for degradation mechanisms such as cell cracking, weathering of cracked cells, and glass breakage. + +Organization +------------ + +Documentation is currently organized into three main categories: + +* :ref:`How to Guides`: User guides covering basic topics and use cases for the PVade software +* :ref:`Technical Reference`: Programming details on the PVade API and functions +* :ref:`Background`: Information and research sources for fluid and structural solvers and PV topics + +New users may find it helpful to review the :ref:`Getting Started` materials first. + +Contents +-------- + +.. toctree:: + :maxdepth: 2 + + how_to_guides/index + technical_reference/index + background/index diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 00000000..32bb2452 --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,35 @@ +@ECHO OFF + +pushd %~dp0 + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set SOURCEDIR=. +set BUILDDIR=_build + +%SPHINXBUILD% >NUL 2>NUL +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.https://www.sphinx-doc.org/ + exit /b 1 +) + +if "%1" == "" goto help + +%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% +goto end + +:help +%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% + +:end +popd diff --git a/docs/technical_reference/data_stream.rst b/docs/technical_reference/data_stream.rst new file mode 100644 index 00000000..a4458b22 --- /dev/null +++ b/docs/technical_reference/data_stream.rst @@ -0,0 +1,5 @@ +DataStream +========== + +.. automodule:: DataStream + :members: diff --git a/docs/technical_reference/flow_manager.rst b/docs/technical_reference/flow_manager.rst new file mode 100644 index 00000000..9ba44b08 --- /dev/null +++ b/docs/technical_reference/flow_manager.rst @@ -0,0 +1,5 @@ +FlowManager +============= + +.. automodule:: FlowManager + :members: diff --git a/docs/technical_reference/index.rst b/docs/technical_reference/index.rst new file mode 100644 index 00000000..898141c8 --- /dev/null +++ b/docs/technical_reference/index.rst @@ -0,0 +1,10 @@ +Technical Reference +=================== + +.. toctree:: + :maxdepth: 1 + + data_stream + flow_manager + mesh_manager + parameters diff --git a/docs/technical_reference/mesh_manager.rst b/docs/technical_reference/mesh_manager.rst new file mode 100644 index 00000000..a1d361b6 --- /dev/null +++ b/docs/technical_reference/mesh_manager.rst @@ -0,0 +1,5 @@ +MeshManager +=========== + +.. automodule:: geometry.MeshManager + :members: diff --git a/docs/technical_reference/parameters.rst b/docs/technical_reference/parameters.rst new file mode 100644 index 00000000..5da774da --- /dev/null +++ b/docs/technical_reference/parameters.rst @@ -0,0 +1,5 @@ +Parameters +========== + +.. automodule:: Parameters + :members: diff --git a/environment.yaml b/environment.yaml index 03a0ce3c..e6583482 100644 --- a/environment.yaml +++ b/environment.yaml @@ -16,7 +16,9 @@ dependencies: - pyyaml - scipy - snakeviz + - sphinx - tqdm - pip - pip: + - sphinx-rtd-theme - -e . # Installs the pvopt package diff --git a/pvopt/DataStream.py b/pvade/DataStream.py similarity index 98% rename from pvopt/DataStream.py rename to pvade/DataStream.py index b7492511..990370bc 100644 --- a/pvopt/DataStream.py +++ b/pvade/DataStream.py @@ -1,4 +1,4 @@ -from dolfinx import * +# from dolfinx import * import numpy as np import time import os diff --git a/pvopt/FlowManager.py b/pvade/FlowManager.py similarity index 100% rename from pvopt/FlowManager.py rename to pvade/FlowManager.py diff --git a/pvopt/Parameters.py b/pvade/Parameters.py similarity index 100% rename from pvopt/Parameters.py rename to pvade/Parameters.py diff --git a/pvopt/__init__.py b/pvade/__init__.py similarity index 100% rename from pvopt/__init__.py rename to pvade/__init__.py diff --git a/pvopt/enforce_periodicity.py b/pvade/enforce_periodicity.py similarity index 100% rename from pvopt/enforce_periodicity.py rename to pvade/enforce_periodicity.py diff --git a/pvopt/generate_and_convert_3d_meshes.py b/pvade/generate_and_convert_3d_meshes.py similarity index 100% rename from pvopt/generate_and_convert_3d_meshes.py rename to pvade/generate_and_convert_3d_meshes.py diff --git a/pvopt/geometry/MeshManager.py b/pvade/geometry/MeshManager.py similarity index 99% rename from pvopt/geometry/MeshManager.py rename to pvade/geometry/MeshManager.py index 030a25ff..cb9a83dc 100644 --- a/pvopt/geometry/MeshManager.py +++ b/pvade/geometry/MeshManager.py @@ -9,7 +9,7 @@ import time import ufl import dolfinx -import meshio +# import meshio # from pvopt.geometry.panels.DomainCreation import * class Domain: diff --git a/pvopt/geometry/MeshManager2d.py b/pvade/geometry/MeshManager2d.py similarity index 100% rename from pvopt/geometry/MeshManager2d.py rename to pvade/geometry/MeshManager2d.py diff --git a/pvopt/geometry/MeshManager3d.py b/pvade/geometry/MeshManager3d.py similarity index 100% rename from pvopt/geometry/MeshManager3d.py rename to pvade/geometry/MeshManager3d.py diff --git a/pvopt/geometry/__init__.py b/pvade/geometry/__init__.py similarity index 100% rename from pvopt/geometry/__init__.py rename to pvade/geometry/__init__.py diff --git a/pvopt/geometry/cylinder2d/DomainCreation.py b/pvade/geometry/cylinder2d/DomainCreation.py similarity index 100% rename from pvopt/geometry/cylinder2d/DomainCreation.py rename to pvade/geometry/cylinder2d/DomainCreation.py diff --git a/pvopt/geometry/cylinder2d/DomainCreation_temp.py b/pvade/geometry/cylinder2d/DomainCreation_temp.py similarity index 100% rename from pvopt/geometry/cylinder2d/DomainCreation_temp.py rename to pvade/geometry/cylinder2d/DomainCreation_temp.py diff --git a/pvopt/geometry/cylinder2d/__init__.py b/pvade/geometry/cylinder2d/__init__.py similarity index 100% rename from pvopt/geometry/cylinder2d/__init__.py rename to pvade/geometry/cylinder2d/__init__.py diff --git a/pvopt/geometry/cylinder3d/DomainCreation.py b/pvade/geometry/cylinder3d/DomainCreation.py similarity index 100% rename from pvopt/geometry/cylinder3d/DomainCreation.py rename to pvade/geometry/cylinder3d/DomainCreation.py diff --git a/pvopt/geometry/cylinder3d/__init__.py b/pvade/geometry/cylinder3d/__init__.py similarity index 100% rename from pvopt/geometry/cylinder3d/__init__.py rename to pvade/geometry/cylinder3d/__init__.py diff --git a/pvopt/geometry/panels/DomainCreation.py b/pvade/geometry/panels/DomainCreation.py similarity index 100% rename from pvopt/geometry/panels/DomainCreation.py rename to pvade/geometry/panels/DomainCreation.py diff --git a/pvopt/geometry/panels/__init__.py b/pvade/geometry/panels/__init__.py similarity index 100% rename from pvopt/geometry/panels/__init__.py rename to pvade/geometry/panels/__init__.py diff --git a/pvopt/geometry/panels2d/DomainCreation.py b/pvade/geometry/panels2d/DomainCreation.py similarity index 100% rename from pvopt/geometry/panels2d/DomainCreation.py rename to pvade/geometry/panels2d/DomainCreation.py diff --git a/pvopt/geometry/panels2d/__init__.py b/pvade/geometry/panels2d/__init__.py similarity index 100% rename from pvopt/geometry/panels2d/__init__.py rename to pvade/geometry/panels2d/__init__.py diff --git a/pvopt/geometry/template/TemplateDomainCreation.py b/pvade/geometry/template/TemplateDomainCreation.py similarity index 100% rename from pvopt/geometry/template/TemplateDomainCreation.py rename to pvade/geometry/template/TemplateDomainCreation.py diff --git a/pvopt/geometry/template/__init__.py b/pvade/geometry/template/__init__.py similarity index 100% rename from pvopt/geometry/template/__init__.py rename to pvade/geometry/template/__init__.py diff --git a/pvopt/input_schema.yaml b/pvade/input_schema.yaml similarity index 100% rename from pvopt/input_schema.yaml rename to pvade/input_schema.yaml diff --git a/pvopt/save_all_net_traction.py b/pvade/save_all_net_traction.py similarity index 100% rename from pvopt/save_all_net_traction.py rename to pvade/save_all_net_traction.py diff --git a/pvopt/.DS_Store b/pvopt/.DS_Store deleted file mode 100644 index 0bdc1e325f0ec2a7b4e4c2daf0c5ea12341ce29f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHM&ubGw6n>LN-B2r)YRy4$#cQc;gMxU8F%^0c#fTnM;^v3#;$|o0M?)!vTvhZ> z@T5l(LGb3ui#IQd7ykqQ0Z;n9H`|(Ql2+-#LTAFvo85Wen>XLS+3lMWk;=6z^F(PP za!^@Lj-we;c%17%Nkn(1ArUFsSO)e21NdfhaYlUi z&8TfH1D1h($pF6}TvV3XNOp~sR|gtN0U(pOEd_n#0fKQOnT=%ENP)tp$sSY$RZ)te z3>@Pwt3zfZ*)`I@Nf|h)Xl4~g+Em=xw6vv_@s}P*npupe1=(?#;QVkNSYd0Bd@TIwgILzRnV4&vo$&Kh%u&4 z0pH8m5xPnNa2>h^#zNF(vBjq)aqQC=c4`E+2oE&lhj}2+>_yKrJ0mlOGOLHP8eR{3 zQh{VUA+5?7pWdA7}AGpL_2KOLDt6XROoDYmZUvz_!yon}3HzVA!*z;CwZ z=Dw=LSn|NZLyqH&JNFAKx>IO*t#&i#HSY4&Evc?0Dii*BOG-0l{+9&7@(9j>?qC23|8`{s)i|@XFkkB5Y_a~^g)9VlC;d8DQ z8eyQrWsLHAjv|~xgi~7%@|p+=-qtk)$t*(5Loevx;0Z?d2KixHqU$>cc;ZV8HwBCd zwf@cFZX4kIdg%@D3AzC<8{#PkAaB*7fjjm#Hh&s=o`gSdi2%PMm|z=431oi7wPf3e z!!|uI-{e xK;^=ET_Xj8M$&OeNyj0#{$Yr|3suHsBiS_)cToPvK>*Sj`~4U8ZL?n)_zlXodY}LR diff --git a/pvopt/__pycache__/DataStream.cpython-310.pyc b/pvopt/__pycache__/DataStream.cpython-310.pyc deleted file mode 100644 index 16d8803ac6a88d68a6b12b66ed4a281e155b6b1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1304 zcmZuxOK%)S5boDJcC))NP6APQMUglx2ah6gL`kGrK?ucI*aVnMYuKK(XWa8hcaJx= z)+guAjSE6bj{Fk-Lti=Z7Z4z-W^iIbs#RZA^<%2Ks(PB~bWDJ@Z~V3RH6r9UG%gbd z;{mWO0TfYGlYNv-)0Fj+r@WUU6}=4703_F86{S%Xr!mF-LXWC(I_~vAU#TYPq}Q3A zrqj=e3RU!+sOX%fGsX7EJpLX0kvaABW#B|r)lfUD4tw=c?Lzs)o_$Nr!&$u>n<2Auk*zFaZ!SNk1&dtTn=`690?p)E-ThCOr z^mKIq@%A*o>cyg|Dlbe{ANf(;RkAhB!g^lWLm#`QZFF;R;<+kdQ;irMD^s{!RylldHt5T)USK?)ck;;dRvtm7h0XQS zhpMTvqV{5`o0SjS%w(1IBMiL%u4m5uLJU^!kNe5jHa9j|WyWSYtCLk@juO?uk<7{V zI9W6*x5@64FL(Eo_PA+X^17N^?TL@2Eb78ZIfc*Jw*g`n)0j@!2HPA7I-xVVLGS!| zdhOD=i!%$n-34K5ylRK9z;IYrXoM0P3rhRW8DH}k9Lg%ztS{wY1%vg5Qr`JrDcO#v z**xsCYDVD0yoGQL;X1+%fVnVu4|5aYU4&Z*n6Cle2hCr#*>NuM;q*zhAHk%>_&0|e z|9yJv(vAPKd1oGA=CHz2`mvN%qdJZHM9QaKriT^t0s6d+@Y;K?VF(8PC}aX`hnECN zzuC`0OGc{E%c6ef1L#L66RTSv}J53dzTx4mY_+F)mDLOt2krY(O(iKyLDX0EbvN*8l(j diff --git a/pvopt/__pycache__/FlowManager.cpython-310.pyc b/pvopt/__pycache__/FlowManager.cpython-310.pyc deleted file mode 100644 index 1101dc7df93dd9a43ce5805b8317552bc66b9b7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18739 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 diff --git a/pvopt/__pycache__/FlowManager_copy.cpython-310.pyc b/pvopt/__pycache__/FlowManager_copy.cpython-310.pyc deleted file mode 100644 index 658b7402bcd596328d1a7a3b514992f65fe6faef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18532 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 diff --git a/pvopt/__pycache__/IOManager.cpython-310.pyc b/pvopt/__pycache__/IOManager.cpython-310.pyc deleted file mode 100644 index 0292b8cf906f22266aff1ca5b6a80be0e43c2f32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5934 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 W9R&<2r5|7)%@MIs`%L?+YX1SkrQX;8 diff --git a/pvopt/__pycache__/MeshManager.cpython-310.pyc b/pvopt/__pycache__/MeshManager.cpython-310.pyc deleted file mode 100644 index 35c0bf092b085239663e12f75b507029a4c0394f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13741 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 B;=TX? diff --git a/pvopt/__pycache__/MeshManager.cpython-39.pyc b/pvopt/__pycache__/MeshManager.cpython-39.pyc deleted file mode 100644 index 73a9460a0da1a0d0a92546893f130400be7fea0f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11629 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 H3Hn>hD5donKF4{62C&8{ zJqN$i;z$R@LFSTYaQwYY!Vw3NOhjT9{skqlGL$TDp43(yOd3wVoT~vLEgorxP@>PA_B=$dPoFs@mysCFCi*U<2 zTu!a4*B1inCkV;O8d-=E{Z zLd3-1am?d2%DqnD4Fd4ZHF=f5X9-**@FsxTdB`3i`UGwgkOZa$B$_{ZPC=Ugn~BUo zLdew6Zh`{kEF*Clrez{bj(y2sb;6h&k(na~g+^b&L(YPK4}cW>`pFPA2;jS9H{Kzp!R)eePW=9a9~tAJZ$k!O4jge8{oXl-{HD zv+(fxk-84zxi{~U{OWY)hgS=y@Q4ptEUPir0A-53cHAn%Z4`YGam%+XVZUt>mghdZ zF*yE4P?G`t(^Wc~TU7^Qn5*^m_0@Pjiqzw@@a5~N3)SZXQ8O?uj z^2P(to4GN_ou>I(-xZxL`7!jdmSJt=Wa4qPot!$x7EKwShO+v|fmD8;=oP0{6d9k4 z^3kbJB!@Ie`QQ*0hk9);(9~3BB&wDMtS4U1F z#mqUootBhzTX@psBBL|54karD4*({C-7_HgX z+^`T9aCcJsIz>r~!7;YS^H^m&%mHS@;#=C=>4e*J8;*Uk*5LD<*zmAvA;p9H8z~X& z^}P#&)ay8sULB-Yd$+s(>L9b)rAvLewS~ys*=k3{_|E0aZLdQIRA)M;lGlRUlD(}?t?y);UE$G@R^Q3DdpND8yNI|K_-Q7>twTO`LcFcl?lt!0618k~ zaa+QftxFF_Nfg)a;ND}p^IM>iK;ZYavs`+Z^{XAWcH3kq~JKR!EmQrM0?`wX4y ztHX4Cm&KE9rP`r6#+7IAoQd>nk^Y)fm>A(TT>R{9`PZh9uf@pMoGj0eOXFOiGqbpe z$@7G}xyQFEo$9z}9K+N2aJY_(mOTv1chdD24;;pX)|Bm+a_HoAL$M zy}46s$2D>m{o>jr0G+zYKOpcH0oq8iBP{nRS0g}rO#T&teDE^=2>DC}bR>{206CbtIVz$y}G9 z!5VBa<=+u?y3=ny*WZgT#E^p&rLbr~5En*9&zC=-CjOdA8PziP|FGdl_9x?c`V`5K SPtrv5k8>4u?#QQ%#{U6$6zLfN diff --git a/pvopt/__pycache__/Parameters.cpython-310.pyc b/pvopt/__pycache__/Parameters.cpython-310.pyc deleted file mode 100644 index 37b4fa3ec5e79afa7f23f27511413b009f1addb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5435 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 N31I9s`?ti5`#*KLE5HB% diff --git a/pvopt/__pycache__/__init__.cpython-310.pyc b/pvopt/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index ab189671819d3eb016c74c069a11750ccf1c5a5c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 493 zcmY*WOHRWu5OoqmOGG6WAhGn4ZjuWCDiRgDQi;MMn~8~C8a0W7owU#`T!y1?g>1P6 z5)$LI<@02Z=jS)$vFi1Fg19{TO5XAOu*P3dGzPfMF$zHAZN6E4&-h zr>m36EHw;QHIwX~8_7zZ%=v?4Q>9rPmkU)^aUA#w^8AB?)&RFTKp{!wU=>$5ktbYa z_8Na|uMV|VdNrMF*`>8xZd-6uD_|E{#**4pDrfR3k!6*t!Z6KKBL!Qg7!^{d3+Xe& zRAX9Y`~Jxd+Q6t!n=U}Xa|zJ+0J#!%X7zo5$C_uGNC!Zu1mKP6U2MJ;pJ(B%k=ley zt_{z45iXUUhoaUz=M|KTFi}F9aC~>l^hw fZT-#OaQm><|66&jb!<-eblvf}Wi$2g`kg75EIl4XJPV-N=!FakLaKwQiMBvKfH88jLFRx%WUgb~CqTm8`D)S_bj z^2DOz#GJ%D{qp>xZ2gqdqQu<9lK6r${p9?V)MEXBF#muM{erUmf)f4s_{_Y_lK6PN Wg34PQHo5sJr8%i~AY(rRF#`Y+G$lv? diff --git a/pvopt/geometry/__pycache__/MeshManager.cpython-310.pyc b/pvopt/geometry/__pycache__/MeshManager.cpython-310.pyc deleted file mode 100644 index e98e516ed1c7cc770b7f4ee1e4a0351b20887cbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9119 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 KTVsDS>i+?kfX*ra diff --git a/pvopt/geometry/__pycache__/MeshManager.cpython-39.pyc b/pvopt/geometry/__pycache__/MeshManager.cpython-39.pyc deleted file mode 100644 index 531765d1304de0d2849ecc0ff6ea6e200b5ad45c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12177 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 diff --git a/pvopt/geometry/__pycache__/MeshManager2d.cpython-310.pyc b/pvopt/geometry/__pycache__/MeshManager2d.cpython-310.pyc deleted file mode 100644 index deeb12721b5ee2e3e1d988b9b4a082d82c7839c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9039 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 diff --git a/pvopt/geometry/__pycache__/MeshManager3d.cpython-310.pyc b/pvopt/geometry/__pycache__/MeshManager3d.cpython-310.pyc deleted file mode 100644 index d9ae344c39f27e08ed699c00d094b67c5d10b20e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8920 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 diff --git a/pvopt/geometry/__pycache__/__init__.cpython-39.pyc b/pvopt/geometry/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index 6a2cb97af4e98e4bd2777580e4dc84f3ef4d394b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 161 zcmYe~<>g`kf=eA|lO=)lV-N=!FakLaKwQiMBvKfH88jLFRx%WUgb~CqH~rA!)S_bj z^2DOz#GJ%D{qp>xZ2gqdqQu<9lK6r${p9?V)MEXBF#muM{erUmf)f4o)coAklA=oe f`1s7c%#!$cy@JYH95%W6DWy57b|CXV12F>tXT~U| diff --git a/pvopt/geometry/cylinder2d/__pycache__/DomainCreation.cpython-310.pyc b/pvopt/geometry/cylinder2d/__pycache__/DomainCreation.cpython-310.pyc deleted file mode 100644 index 80c1f5bdd4f324eaff26e99e2b83a4db1a9eaa14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1585 zcmY*Z&2Hm15GM6+*-jjL`-5U%zy%ruiyn(MK!OB|)=se5W(!>eMPwW~qNI{?Ha6_b zcCUSa_LLm^D1C#1$M%$0DE819+D^R`I6owZ9DegrWxE{`Xy5<+A${i&@(()O%?9TH zx_SqK5k_+&Xhek-SrmOMw}lfq!i`+x+qozFC@{8@H$)hP#&+{&)P(hJ-iq2r??gLB z??$^uccPBbd(ocJ-Kcv)n8*D0g!#W%QIEOjq#ry&9;9#S;HRVE@o|=O?Tv-H&Po{T zUGTIn#Qu!t0d*R{gK&AUKIABay`@v)+@) zW;Sy`J0=xRH;&I=9+e`=iWI{(4Q=d)(AAe9YBHe<5?c#0vF_~$0=8pp*Vx_yXMINC zest6iqz^GVJUkr^<2R?TemK%jS_+|q6JEzMDQ>i5r14cY=eki$MO?`;Robf(nFs}F zIEv?2au@dcgUCHl|GpXgsJK*vw~16qo)m+(rMwxiDFh^ST-^@Rl5sUSyEr|2J*aNW zsveAaDR?bsgLIZ>1>^Ds8?3H;D0zY??^iP&#Bo++bsTr#7!`mB>=td&(4KdnFxuZN zN+~SZv<4U$V8HqdjGElj2SO1v01J_S0IID$z<=f4I|e$Jxei&{7JC1nYVQ6 z#w1+2%vyR2chX#VHa(}3< zktx*jL_5fR9U}Nyk|Py7s2YUphT`>TDlWOy zu7I-UI;d`AV;N3pj~V9bCRCOItynfyhItZ8B3mG|U8bpSC5*j-hm{m#cx~=o44G?p zwo>3Fcg6$d!^)#f-Do?V*1D-?MS3mE0@CU?BvK=?)A$a>Oj8NTvrOm)KF8P)JT&PU ziboCkbYxIosyaz?Zdkk$T};otoMt)u0!;JF0=ffVXa_W;4)vgiv_k`GK@X|-;ZrxX zo&zgAI^X@Dm1d7o-$fD^iQsXp!x({@=4iL#_~&VouV!Qq&XQlDzz4M@FdvCL#`mV+ zPYR?CXe%^h{bxF4Wqy?vcl%i>v5pddth%`wz2ZVTIP88joK}^@y|fP&;-o!MWnWjb zRiQq^DHq;8JVC3dv{fqY)S2Mgo?hkJU+)e<5DEulep@-4D;OYyZ&vsH7TKjf2hkxN MK&l1EZGTg`kf`n`5k|lxkV-N=!FakLaKwQiMBvKfH88jLFRx%WUgb~EAK>g6-)S_bj z^2DOz#GJ%D{qp>xZ2gqdqQu<9lK6r${p9?V)MEXBF#muM{erUmf)f4o)coAklA=oe sz>% diff --git a/pvopt/geometry/cylinder3d/.DS_Store b/pvopt/geometry/cylinder3d/.DS_Store deleted file mode 100644 index 3606724ab36bafdac4264e227d3e9dbfdb02df2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKyG{c^3>-s>NHn3N+%Jg49~|K*sQCd1P#^^kAt>ms03|w*s3_1_vS-)l z+09LHjse)}<>nYz0GQJq@#bM_{@i_HdzCRFooC$P0jGGvEv_cj-zS`Vh#mv($=T*V zb2sq3B_8p5z8S99n_(Hf^LE=K(0<+fGy3NXLjFeO zb~8cQhf$7!aKdRqQX0_I2n>q4k(j9!Sg9S@S~n9XZ3M2Ct)!WHfv06V@dF?1?W7g7 zHSYu+%{PLLW5ONYcujcY7bEC$`x)uEZ^0kw8Or_faBy@KCqg;Hv>e4bVB6;+s&aWW z$)YOGvu6d1glgYWdsJDeC`Z7}!P&Pb5pH+88KCULD0hJf5>QS8gHvw2CV|OKZUMLS zQ5@Ad%u^O;2U0Nf7vb7@^}S-M+%Sx@xC+A-xG7yAuGyk3>Y1|#A6Ty~BMMgQW`od# zp(FM&%v5ASmxN;EAY%9iOGvI-gO^xo3rok(hFIDQhucd^A+{hl-plT|IracU?mxuH zw`#3j^NvP0YOP!IO^t3<+lzY|xj)`n(i?cEu|0mUcvxHcHSg4X6FBaVyKOC<8-qLG z@eyy_n1JBQkGMNGeZrfM3HP`^H(`+Rqh;d;GXgCh^VZzBFoqPkg&gl%&+TGNP=-ut zpUk?)A`_A&d(VYTNVal#Gi!w!^jZ3E;{ZiFi1w0(V_4y6#qF3k~d-lQ`i!AeQ?;T(d(v zP$ey>mK}44?$9oEO_yS~R{fpRw5V$sfEaa$nSXcvmg&&hy$`BOZ-3IWu_7~;iZE1O zh@qb(D7V7!=Lt(zGjbbFAU{Qdzr!tpN0nH`K8(@<;u4p(JdO1>mB;hsBF?V&;#}fK zCov_IzeX=aDlLSutpA6jqL8?kYJh|vv2xNP{=As#|4!b=DH}dA0G^_3fv_>TtSWuCDeK=6#7!mvrIZY3T@J6t~R(00lM5=>Px# diff --git a/pvopt/geometry/cylinder3d/__pycache__/__init__.cpython-310.pyc b/pvopt/geometry/cylinder3d/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 50c46856df98ab0dd02099664f0834fe87a921fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 174 zcmd1j<>g`kf`n`5k|lxkV-N=!FakLaKwQiMBvKfH88jLFRx%WUgb~EAK>g6-)S_bj z^2DOz#GJ%D{qp>xZ2gqdqQu<9lK6r${p9?V)MEXBF#muM{erUmf)f4o)coAklA=oe s z?{@a=DSUSTWche`1k3?U>56#PFgBf6AK6}vD2nxHu|kV$T%j3Ne?Oqy8LJ!I;fdT& zesi|z+V!SevqE3*g}!(-;}dXz8XdM|+~5``xaX=XJTU8+FSOrIhvS_N)+R$LkP4&% zsX!|5&lKREtu~!GW=sWAfmGl_0sTJ|x?&aBJKC>MW0z$1@?|c=eW^{ Oc@R)t(o%unP~Z*5H!JA? diff --git a/pvopt/geometry/panels/__pycache__/DomainCreation.cpython-310.pyc b/pvopt/geometry/panels/__pycache__/DomainCreation.cpython-310.pyc deleted file mode 100644 index fb7d0495a1b30c1fc59c8611109d41e9b0eb99d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1793 zcmZuyOK%%D5GMDf)njehmX)M!ddfu?>C$6S6p7)shqy+arUik5*eoe|W$q*7%C-#q zWCQ8Xu#Wi^{U1CP=*fS(mZPV(0O3I2@8Q+#-rP2-?o}KglXY=r5z(ZyqS$ z!l!-*!Vtp(Wtia1Ar3aWBizg*Ugi_u>aGZ~774BFiFVc@9V`2yoApS~%7KVT1akwi zM%FFwlfLB}WW(}JvT6Ai+4>H#77MQs3wiI-B?A^5pi%nvkdXIIR(nQ2cQTiU;9!!2# zT&l@QELAMxd~#CAqX}DpZCugvc#;&1tI7WBANOBP%HyJ}CNo}SypqdF8RuN6$-|(> z zVZ+-N?Nr_Co<*Yh+6rG_kk{w^>y5_BZFtb|HgMzLc>f`?Nk48Y~#$=Q< zH*xa;+UTi_K-K}X39kK9n#HG6p5t8DyK#ZjmH9h#7lcz{(N~xDNA0MrCoLbkF7; z6+E9+hkCu%s>3un%DGayTLUL4gV8`16%?y(!(zEIb*o#jfh5gmy3GYYw$-cMWKrp^ zTIR{2Eb{b>k9^sKQy?1;f~2quIWTxwFOo9SuBA7{sWeqtlMQo%{+mTA*fxmjIgp_{ z#6#T2p&Me;y}I9SwnN;*4tx!M8+L}+`w;peSUbk@?=Qoi6X3JKCv{{O7zL)<^El&_ z>JBwWxDZC}QTlcfi+aS?q#T>LqNe^6E(E3bqF#ehX+oE6AVyFDkP!87-?i9iTX$F? zrfGgUP77(uTblII-8*#3Gim+>(vl>5) T>M@W$yjMNjL#MtELkIr9X7JlE diff --git a/pvopt/geometry/panels/__pycache__/__init__.cpython-310.pyc b/pvopt/geometry/panels/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 5a8b96b7b9d4a67a4bc1dcfd92587263292a256e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 170 zcmd1j<>g`kf`n`5k|lxkV-N=!FakLaKwQiMBvKfH88jLFRx%WUgb~CqU;WVH)S_bj z^2DOz#GJ%D{qp>xZ2gqdqQu<9lK6r${p9?V)MEXBF#muM{erUmf)f4o)coAklA=oe og2cSkoMQd>_{_Y_lK6PNg34PQHo5sJr8%i~AZv=5fCLKz0O_bI&;S4c diff --git a/pvopt/geometry/panels/__pycache__/domain_creation.cpython-310.pyc b/pvopt/geometry/panels/__pycache__/domain_creation.cpython-310.pyc deleted file mode 100644 index 184edc33a8dcd8a0fe937fcdaf84022ff7b1a53e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2263 zcmZ7%$!;7)w5zx2=~+Bpu#*r%7Ph%~gv1SmB5Wl>!gd5EK`o(HxvOT}`{6L+MIQbVMr0`yKk7HAhXge`vpzzjwbBP9Vz&A=qcn~9a$ft@;mqj@WF(?;NF+D@9OANZPfl2*_HeJ5!L z9gVv|SL3B%N#kD7(|9>p)_5gYd2BG3HC`F4@zM-dne&~|_bwm~qi-tjhwYt5kK%+Y zca+M*I0xD4Qy!JMcr?kPGS0K_3L0_MxyJU1vQsV(0b4syzTS<{+|^|Q^ANVY4S*W~ zVMbsw!pv7jU@?o?fNdR$tGe5HO5>Nhcy6pnFkQA4lbp+dqKd%1^Tt)b>+JmspHP13Lsc_fuv zP(f3v+NWU}XJJak5f`d`c8!}}<3N+*zSO+Jf#zFoBhE@LGMa>PB8HH;%a?}9BxW@S zS+*rlhGGLg<2OUx1N3@-@V(?h4o;|$G@;qxBo{{mHi1}a85YNbC}&&_o;=-qvOg$} z^P(J#c%Jf7oDB+^@k9=o&SV(XsoX5iloy6^7MEez1t0PT0MBZZHgPT2bjjPtC)17V zg|NAJGs3hi7N(;GTUW&IaI&ZfopVd)+%BD&J2!|?I^)L7gL)%#XtbJxx~sTZQ`d|S z_2bW4%$*Yg^#n9jNKJRf-SHC05ch6iwJq1&N{v^wbgkyzsqwm&Zj?7>H?`!}_}w{q z0aZEn$G2zi)mpt8uhw`SFxp3J8*}%CS>Dknx5n?kB-_T1&t5<+R~E2(A*x&ByK4sX zF1dSa_yt;CfG_+8 zXH&}6#014CtV zM;_uxdJ4q|^I-JrFSy7<)hv#~s=`L_I;_9{s0rxHH?aDB-Irn+&QuczRH(bsPoZ*? zx-Um8PL++*PWf1wF-@>PU8ra9rkawMyOZ<)I?~avDG%IMltmd+J}7KWgy31J+ef)o zOv=$ss!^ON_cWBy70Q9Orl%UA^sJWZrd5vaa^+4dshJh3At;M!Cbe5C1U*xoQqTxS zL`bs{Olm8SBIQCTU*%vI#>|K-52uUBPhhC%RtyuKjmkr{RB`2D935p`O4X_aCozLl zSL7uvVK#w-OeRP+Am}L0MykmZeyj(wvZ6_;TJkK54n>~9W%V6#7q58vT3~R$Oni!R zuW}MINEr@>@E||cGo}LfQO7x$#0kT}BliJ#dKh?Cmvo75wVgIux7Nuz=@HNJ2tIc8 zyk2Q~Fg{G!wfwc`uM_)?=XjuPqUOJMyf)aIuKjPIXqUTv2ZvHdQyzxO4>7ls1nG7d zKA+H}IuQ>bDzS$EgS-MTe1X4#4s3~k2G4+yR<*3ZrhJws!#F$LjB|ni5`q5`)mli0 zJQet35je@-ild?sXiGJK!qQc4TEw3fXH`k}@yLNJgWz+d&0H$Gj8mwG$uLok+C01k m?}BFx@Ji778}!9{UsNCbB{rfS$UUP6x4F2_>Q+6nV*Ur;+HPY2 diff --git a/pvopt/geometry/panels2d/__pycache__/DomainCreation.cpython-310.pyc b/pvopt/geometry/panels2d/__pycache__/DomainCreation.cpython-310.pyc deleted file mode 100644 index 800cd5386bb6f8ea20a7c339a055ad3947b4e70c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2185 zcmZ8iOK&4Z5T2fwXU2~>50YJ2mVJPbFR_FWCxli?lob-mM*9Mdghrj|wlmJWwtJk! zQF3ATPr%6*Cw>M0qfbbj!hs*aB0*J;y-Bu5Q?IG+DtA?VF52zDfVKbY-|=5f!}t@G z>&pV=5xnvzAk1JSH8K*C%nVI}x|v#;9om@_I$F0LJDM+rOPY7XuI9_(vgRw{%437MtntQRjn`(l%A99L&%1;?jGn2yAGUXQc9N7U zcbLh;qyXFMOCDE+*cs<>l@$52lEz%MZ>T+@?2OAp;MVT`w|g-jcYT?lJc3u=0m6-t zFe5Y>Vdfhnw3x+g;I>Z1Rh{i3qe;FcIK_A|?p-XD@!f(~hCnJ~M9z)KJU2$>)S4L} z+gf(C?4IM-21DvG@QQq90Sy>B!TmfxlBP88pA_P#&&H4|t)lX{9~X?v{{G7+`_KF3 zaZy(NAulpsiAletIZx#mtbenXo8?4#QIzCK6-6BgB5wiltQKhz*K$plTs;9f+jwvH zVrPtXSuCsv%vjwLZ{W+KC3Mj(U39y0rtZujM&*neQx6)B%wW>y8Z=(5O?}-o0W?rB zZ8CR82s9MP&?0lWJ?e~>z=phg3)^jZuC2`Zs=+0}hZT$G`0-CknhwTYbH%1??!Q{^6yCCC!ZC}{n92^0R z_6fAJJurs^Ms4x<=VS&*GWWQ*@Hodvc+P!BZX0X(9kmB=Q}#RWhv04M^XBK`y}jb| zvp&TeMj3`D*b`VJft5MyKISz5?Wn3Fst-b zGqg@>tC^RoAt*~|E_DDZ1f8gMC1?y29?^UVKx-9otXdHCDZp%PasVraTzLo)qBsF$ z(DM|fJReqvYN^($!z4b+xdZ?aMMW#X6gWATDT)oqD^BvE@_EXSHIOPR9#^UiT$7Fc%)l<{d?DIIW9R{dk+D0 zu)UsxD3a5RN0AC5EZjInxfMmP#x$+Jh=-7m*g=BnT_c#dK;Uk}D-p{*0}@)*w%(cw zSdk8r{B$!Z1fst{^jFP=b-*)$e+2@e=gJ(HrNFaP10?KAh5>KuN*y z70PBIm0cwnw7__fs>b|y*adqbGA4K}Y5g1Ym3v>;KlmG*FpZ#HqpR-|Z}aL|G5-fG CB2iBO diff --git a/pvopt/geometry/panels2d/__pycache__/__init__.cpython-310.pyc b/pvopt/geometry/panels2d/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 9e1de0b70b2388d6870b398004094c7771ade2a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 172 zcmd1j<>g`kf>l>vCrbk9#~=WHa^HWN5Qtdz%6*B<|76t%=x+~5A diff --git a/pvopt/geometry/template/__pycache__/TemplateDomainCreation.cpython-310.pyc b/pvopt/geometry/template/__pycache__/TemplateDomainCreation.cpython-310.pyc deleted file mode 100644 index ea44cbc160eba65e6bc3af57b8179cfaa0276723..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2941 zcmZ`*OK;mo5a#kN>S0-aJ85d5MH{uL)koSx5d;D3B{Y!i8$$z0ho6f8(#!74wJ3BM`ad&ohXNFn5?kMnVFZ~<*G^Z$k zqj3JwK)3^q_kmD_l2}QIOA^&p3Ce1$CAzC8hHFS!i_OGxZOQ9#C2?Fw@BtAID+ znp>BB!)?fZ&YiojP?K7(6l%Rx-6l02DsB4|)>GQ5uz%d%xpyy$Lt*w3eh_7#TX-A> zMaJ$8(x8a4^kMD?p{UP@Z6fp}esf za;)@~K6222Q-Om9oCcgmaYU!6H7IIKsspvC0o0}@&re6QPjL^Y z1`-pAg~SFjY~BykkoocEqmU(0>c=^*iPmIYkYUU)F6m-y^3WK!}$b0!_ljDd7+Y&bIp(wniB zC@n$;mU?`^_TkQy6Yj@@h@MGqlNW3d6a!X{>v;2o6QxlR`EfLayO`y8;-bRCqB}_T zz(ymJ-@jze>3jhm_w+#?o4oCKW#nxlUAe_JVYsg3 zC*(Sa!q^)`G5rKsE`x;(uU@jG1kS8C6J6iH6c|I49I9*$IMP=~5KCinf>B2L`pCfO z>zjS6Z(}r|b<#q$D{pPP!WPlO56~_x3j$H?g~i>pfCCRX!<#QGILC)@_VV!9JgUst z3l4nNR^|R&%a3C(FZkOVorf>II81xRfyVL_BS1ozPiTP9W2Hw|!N{Gy4>0#wssts6HO9F6JP-w;&^j?7{wy&$&?3Tv!ng z;tY~8re_)9>~r}U#Pww03mo_o$yZ2jBKaDKF#S9aQ!0#{flZiA6^u=bBF{}{`|6xRRs@)G0hSiB-(tM*1^875v1BZW&!c6k$W`4x* zcZXd=umS%jp!gPfHG^X)A~--a=bVYsVzg7(wg`k0vFN0$&x_&F^Gc<7=auIATDMB5-AM944RC7D;bJF!U*D*zkXesX?FYO#Jmn14WsenDA&L5Y5PYJP5NNl~SK qNosCEPGU)_etdjpUS>&ryk0@&Ee@O9{FKt1R6CGG#Y{kgg#iHE)++q~ From 8c10dd140116016125a6d8676ee9c8a3838b5524 Mon Sep 17 00:00:00 2001 From: Young Date: Fri, 10 Mar 2023 12:38:38 -0700 Subject: [PATCH 02/94] initial workflow template --- .github/workflows/test_pvade.yaml | 43 +++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 .github/workflows/test_pvade.yaml diff --git a/.github/workflows/test_pvade.yaml b/.github/workflows/test_pvade.yaml new file mode 100644 index 00000000..3a8f7c9b --- /dev/null +++ b/.github/workflows/test_pvade.yaml @@ -0,0 +1,43 @@ +# This workflow will install Python dependencies, run tests and lint with a variety of Python versions +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions + +name: test_pvade + +on: + push: + branches: [ main, dev ] + pull_request: + branches: [ main, dev ] + +jobs: + build: + name: test_pvade - ${{ matrix.os }} + runs-on: ${{ matrix.os-version }} + strategy: + fail-fast: false + matrix: + python-version: + - '3.10' + os: + - linux + - macos + steps: + - uses: actions/checkout@v2 + - uses: conda-incubator/setup-miniconda@v2 + with: + miniconda-version: "latest" + channels: conda-forge + auto-update-conda: true + python-version: ${{ matrix.python-version }} + - name: Install PVade Conda environment + shell: pwsh + run: | + conda env create -f environment.yaml -n test-env + conda activate test-env + conda list + - name: Test PVade with pytest + shell: pwsh + run: | + conda activate test-env + pytest -s pvade/tests/ + From 68520f66471024a7f4fb41e85d8fc5692f3c8a9c Mon Sep 17 00:00:00 2001 From: Young Date: Fri, 10 Mar 2023 12:46:10 -0700 Subject: [PATCH 03/94] changing references from pvopt to pvade --- README.md | 6 +- environment.yaml | 4 +- ns_main.py | 17 +- pvade/__init__.py | 4 +- pvade/enforce_periodicity.py | 142 --------- pvade/generate_and_convert_3d_meshes.py | 386 ------------------------ pvade/save_all_net_traction.py | 65 ---- 7 files changed, 11 insertions(+), 613 deletions(-) delete mode 100644 pvade/enforce_periodicity.py delete mode 100644 pvade/generate_and_convert_3d_meshes.py delete mode 100644 pvade/save_all_net_traction.py diff --git a/README.md b/README.md index fe367098..42e06685 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@ -# PVOPT -This project will develop an open source fluid-structure interaction model which can be used as part of a modeling chain to provide stressor inputs to mechanical module models to study the physics of failure for degradation mechanisms such as cell cracking, weathering of cracked cells, and glass breakage. - -https://github.nrel.gov/pages/warsalan/PVOPT/ +# PVade +`PVade` is an open source fluid-structure interaction model which can be used to study wind loading and stability on solar-tracking PV arrays. `PVade` can be used as part of a larger modeling chain to provide stressor inputs to mechanical module models to study the physics of failure for degradation mechanisms such as cell cracking, weathering of cracked cells, and glass breakage. # Getting Started 1. To use this software, begin by creating a Conda environment using the provided `environment.yaml` file: diff --git a/environment.yaml b/environment.yaml index e6583482..f79356c3 100644 --- a/environment.yaml +++ b/environment.yaml @@ -1,4 +1,4 @@ -name: pvopt-env +name: pvade channels: - conda-forge - defaults @@ -21,4 +21,4 @@ dependencies: - pip - pip: - sphinx-rtd-theme - - -e . # Installs the pvopt package + - -e . # Installs the pvade package diff --git a/ns_main.py b/ns_main.py index adf81f66..9ae2ec89 100644 --- a/ns_main.py +++ b/ns_main.py @@ -1,13 +1,6 @@ -# <<<<<<< HEAD -# ## from altFlowManager import * -# from pvopt.FlowManager_copy import * -# #from pvopt.IOManager import DataStream -# ======= - -from pvopt.FlowManager import Flow -from pvopt.DataStream import DataStream - -from pvopt.Parameters import SimParams +from pvade.FlowManager import Flow +from pvade.DataStream import DataStream +from pvade.Parameters import SimParams import cProfile import sys @@ -50,9 +43,9 @@ def main(): print("command used is: ",str(sys.argv)) if dim == 3: - from pvopt.geometry.MeshManager3d import FSIDomain + from pvade.geometry.MeshManager3d import FSIDomain elif dim == 2: - from pvopt.geometry.MeshManager2d import FSIDomain + from pvade.geometry.MeshManager2d import FSIDomain else: print("dimension not defined") exit() diff --git a/pvade/__init__.py b/pvade/__init__.py index e11e63a8..ebf194a8 100644 --- a/pvade/__init__.py +++ b/pvade/__init__.py @@ -1,8 +1,8 @@ -"""This is the base package for ``pvopt``. +"""This is the base package for ``pvade``. """ -class PvoptError(Exception): +class PVadeError(Exception): """The base error for the package. All custom exceptions raised will derive from this exception. """ diff --git a/pvade/enforce_periodicity.py b/pvade/enforce_periodicity.py deleted file mode 100644 index a8c84657..00000000 --- a/pvade/enforce_periodicity.py +++ /dev/null @@ -1,142 +0,0 @@ -from dolfin import * - -parameters["mesh_partitioner"] = "ParMETIS" -parameters["partitioning_approach"] = "REPARTITION" -parameters["ParMETIS_repartitioning_weight"] = 100000000.0 -import numpy as np - -comm = MPI.comm_world -rank = comm.Get_rank() -num_procs = comm.Get_size() - - -x_range = [-10.5, 10.5] -y_range = [-3.5, 3.5] -z_range = [0.0, 15.0] - -method = 3 - -if method == 1: - - mesh_name = "periodic_3_panel/theta_30_coarse/mesh.xdmf" - - mesh = Mesh() - with XDMFFile(MPI.comm_world, mesh_name) as infile: - infile.read(mesh) - - # if rank == 0: - # print('Successfully read XDMF file') - - # mvc = MeshValueCollection('size_t', mesh, 1) - # with XDMFFile(MPI.comm_world, mesh_name.split('.xdmf')[0]+'_mf.xdmf') as infile: - # infile.read(mvc, 'name_to_read') - - # mf = MeshFunction('size_t', mesh, mvc) - - # hdfile = HDF5File(MPI.comm_world, 'converted_mesh.h5', "w") - # hdfile.write(mesh,'mesh') - # hdfile.write(mf,'boundary_markers') - # hdfile.close() - -elif method == 2: - mesh = Mesh(MPI.comm_world) - h5file = HDF5File( - MPI.comm_world, "periodic_3_panel/theta_30_coarse/h5_mesh.h5", "r" - ) - h5file.read(mesh, "/mesh", False) - # mf = MeshFunction("size_t", mesh, mesh.geometry().dim()-1) - # h5file.read(mf, '/boundary_markers') - -else: - nn = 25 - pt1 = Point(x_range[0], y_range[0], z_range[0]) - pt2 = Point(x_range[1], y_range[1], z_range[1]) - mesh = BoxMesh(pt1, pt2, nn * 3, nn, nn * 3) - -print("Finished reading mesh.") - - -class PeriodicBoundary(SubDomain): - # Left boundary is "target domain" G - def inside(self, x, on_boundary): - # return on_boundary and near(x[0], x_range[0]) or on_boundary and near(x[1], y_range[0]) - return ( - near(x[0], x_range[0]) - and x[1] < y_range[1] - DOLFIN_EPS - and on_boundary - or near(x[1], y_range[0]) - and x[0] < x_range[1] - DOLFIN_EPS - and on_boundary - ) - - # Map right boundary to left boundary and back boundary to front boundary - def map(self, x, y): - if near(x[0], x_range[1]) and near(x[1], y_range[1]): - y[0] = x[0] - (x_range[1] - x_range[0]) - y[1] = x[1] - (y_range[1] - y_range[0]) - y[2] = x[2] - - elif near(x[0], x_range[1]): - y[0] = x[0] - (x_range[1] - x_range[0]) - y[1] = x[1] - y[2] = x[2] - - elif near(x[1], y_range[1]): - y[0] = x[0] - y[1] = x[1] - (y_range[1] - y_range[0]) - y[2] = x[2] - - else: - y[0] = x[0] - 1000 - y[1] = x[1] - 1000 - y[2] = x[2] - 1000 - - -# This gives wiggle room when mapping one periodic surface to another -periodic_map_tolerance = 1e-10 - -# Velocity (Vector) -V = VectorFunctionSpace( - mesh, "P", 2, constrained_domain=PeriodicBoundary(map_tol=periodic_map_tolerance) -) -Q = FunctionSpace( - mesh, "P", 1, constrained_domain=PeriodicBoundary(map_tol=periodic_map_tolerance) -) - -interp_exp = Expression(("x[0]", "x[1]", "x[2]"), degree=2) -fn = project(interp_exp, V, solver_type="cg", preconditioner_type="jacobi") - -fn_rank = Function(Q) -fn_rank.vector()[:] = rank -fn_rank.rename("rank", "rank") - -fp_rank = File("enforce_periodicity/rank.pvd") -fp_rank << fn_rank -proj_method = 2 - -if proj_method == 1: - interp_exp = Expression(("x[0]", "x[1]", "x[2]"), degree=2) - fn = project(interp_exp, V, solver_type="cg") - -elif proj_method == 2: - - fn = Function(V) - coords = V.tabulate_dof_coordinates()[::3] - vec = np.zeros(np.size(coords)) - eps = 1e-6 - - for k, coords in enumerate(coords): - if coords[0] < x_range[0] + eps: - vec[3 * k] = -1.0 - # pass - elif coords[0] > x_range[1] - eps: - vec[3 * k] = 1.0 - # pass - - fn.vector()[:] = vec - -fn.rename("function", "function") -fp = File("enforce_periodicity/fn.pvd") -fp << fn - -print("Finished") diff --git a/pvade/generate_and_convert_3d_meshes.py b/pvade/generate_and_convert_3d_meshes.py deleted file mode 100644 index adfe607d..00000000 --- a/pvade/generate_and_convert_3d_meshes.py +++ /dev/null @@ -1,386 +0,0 @@ -# purpose : generate mesh using gmsh api and convert to format readable by fenics -# boundaries are defined here using markers - -# mesh generated use adaptive somehow, might need more refinement outflow inflow - -# input: variable from file (bypassed) -# hard coded: every variable in yaml -# output: xdmf file for mesh and cdmf for boundary - -# objective: use yaml input, use adaptivity inflow out-flow, periodic vs non-periodic -# longterm terrain - -# from dolfin import * -# import meshio -# import gmsh - -# import numpy as np -# import os -# import time -# import sys -# import yaml - - -# import sys -import os -import numpy as np -import time - -# try: -# import gmsh -# except ImportError: -# print("This demo requires gmsh to be installed") -# sys.exit(0) -import yaml -import gmsh -from dolfinx.io import XDMFFile, gmshio - -from dolfinx import * -from mpi4py import MPI - - -# ================================================================ - - -def get_domain_tags(model, x_range, y_range, z_range): - - # Loop through all surfaces to find periodic tags - surf_ids = model.occ.getEntities(2) - - xm = 0.5 * (x_range[0] + x_range[1]) - ym = 0.5 * (y_range[0] + y_range[1]) - zm = 0.5 * (z_range[0] + z_range[1]) - - dom_tags = {} - - for surf in surf_ids: - tag = surf[1] - - com = model.occ.getCenterOfMass(2, tag) - - if np.isclose(com[0], x_range[0]): - dom_tags["left"] = [tag] - - elif np.allclose(com[0], x_range[1]): - dom_tags["right"] = [tag] - - elif np.allclose(com[1], y_range[0]): - dom_tags["front"] = [tag] - - elif np.allclose(com[1], y_range[1]): - dom_tags["back"] = [tag] - - elif np.allclose(com[2], z_range[0]): - dom_tags["bottom"] = [tag] - - elif np.allclose(com[2], z_range[1]): - dom_tags["top"] = [tag] - - else: - if "panel_surface" in dom_tags: - dom_tags["panel_surface"].append(tag) - else: - dom_tags["panel_surface"] = [tag] - print(dom_tags) - return dom_tags - - -# ================================================================ - - -def write_xdmf_mesh_file(msh, mt, ft, proj_dir, save_boundary_mesh=True, verbose=False): - output_mesh_name = "%s/mesh.xdmf" % (proj_dir) - with XDMFFile(msh.comm, output_mesh_name, "w") as file: - file.write_mesh(msh) - msh.topology.create_connectivity(2, 3) - file.write_meshtags( - mt, geometry_xpath=f"/Xdmf/Domain/Grid[@Name='{msh.name}']/Geometry" - ) - file.write_meshtags( - ft, geometry_xpath=f"/Xdmf/Domain/Grid[@Name='{msh.name}']/Geometry" - ) - - -# ================================================================ -def generate_periodic_panel_gmsh( - panel, dom, num_panel_rows, theta_deg, proj_dir, comm, lc_fac=1.0 -): - num_procs = comm.Get_size() - rank = comm.Get_rank() - model_rank = 0 - # print('rank',rank) - - if rank == model_rank: - # model = generate_periodic_panel_gmsh(panel, dom, num_panel_rows, theta_deg, proj_dir, lc_fac=3.0) - - # lc_fac=3.0 - lc_fac = 3.0 - - print("characteristic length set to", lc_fac) - - gmsh.initialize() - gmsh.option.setNumber("General.Terminal", 0) - # Set the file format, version 2.2 - gmsh.option.setNumber("Mesh.MshFileVersion", 2.2) - - # Name the *.geo file - gmsh.model.add("multi_panel_mesh") - - # Convert to radians - theta_rad = np.radians(theta_deg) - - # Calculate some useful dimensions - x_range = [-0.5 * dom["length"], 0.5 * dom["length"]] - y_range = [-0.5 * dom["span"], 0.5 * dom["span"]] - z_range = [0, dom["height"]] - panel_loc = panel["spacing"] * np.arange(num_panel_rows) - panel_loc = panel_loc - np.mean(panel_loc) - - # Create the computational domain - print("Create the computational domain") - domain = gmsh.model.occ.addBox( - x_range[0], - y_range[0], - z_range[0], - dom["length"], - dom["span"], - dom["height"], - ) - - for z in range(num_panel_rows): - panel_box = gmsh.model.occ.addBox( - -0.5 * panel["length"], - y_range[0], - -0.5 * panel["thickness"], - panel["length"], - dom["span"], - panel["thickness"], - ) - - # Rotate the panel currently centered at (0, 0, 0) - gmsh.model.occ.rotate([(3, panel_box)], 0, 0, 0, 0, -1, 0, theta_rad) - - # Translate the panel [panel_loc, 0, elev] - gmsh.model.occ.translate( - [(3, panel_box)], panel_loc[z], 0, panel["elevation"] - ) - - # Remove each panel from the overall domain - gmsh.model.occ.cut([(3, domain)], [(3, panel_box)]) - - gmsh.model.occ.synchronize() - - # Get the surface tags for the domain and panel walls - print("Get the surface tags for the domain and panel walls") - dom_tags = get_domain_tags(gmsh.model, x_range, y_range, z_range) - - gmsh.model.addPhysicalGroup(3, [1], 11) - gmsh.model.setPhysicalName(3, 11, "fluid") - - gmsh.model.addPhysicalGroup(2, dom_tags["left"], 1) - gmsh.model.setPhysicalName(2, 1, "test") - gmsh.model.addPhysicalGroup(2, dom_tags["right"], 2) - gmsh.model.setPhysicalName(2, 2, "right") - gmsh.model.addPhysicalGroup(2, dom_tags["front"], 3) - gmsh.model.setPhysicalName(2, 3, "front") - gmsh.model.addPhysicalGroup(2, dom_tags["back"], 4) - gmsh.model.setPhysicalName(2, 4, "back") - gmsh.model.addPhysicalGroup(2, dom_tags["bottom"], 5) - gmsh.model.setPhysicalName(2, 5, "bottom") - gmsh.model.addPhysicalGroup(2, dom_tags["top"], 6) - gmsh.model.setPhysicalName(2, 6, "top") - gmsh.model.addPhysicalGroup(2, dom_tags["panel_surface"], 7) - gmsh.model.setPhysicalName(2, 7, "panel_surface") - - # Mark the front/back walls for periodic mapping - front_back_translation = [ - 1, - 0, - 0, - 0, - 0, - 1, - 0, - dom["span"], - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 1, - ] - - gmsh.model.mesh.setPeriodic( - 2, dom_tags["back"], dom_tags["front"], front_back_translation - ) - - # Mark the left/right walls for periodic mapping - left_right_translation = [ - 1, - 0, - 0, - dom["length"], - 0, - 1, - 0, - 0, - 0, - 0, - 1, - 0, - 0, - 0, - 0, - 1, - ] - - gmsh.model.mesh.setPeriodic( - 2, dom_tags["right"], dom_tags["left"], left_right_translation - ) - - # Set size scales for the mesh - lc = lc_fac * panel["thickness"] - eps = 0.1 - - # Set the mesh size at each point on the panel - # panel_bbox = gmsh.model.getEntitiesInBoundingBox(x_range[0]+eps, y_range[0]-eps, z_range[0]+eps, - # x_range[1]-eps, y_range[1]+eps, z_range[1]-eps) - # gmsh.model.mesh.setSize(panel_bbox, lc) - - print("creation of the mesh") - # Define a distance field from the bottom of the domain - gmsh.model.mesh.field.add("Distance", 1) - gmsh.model.mesh.field.setNumbers(1, "FacesList", dom_tags["bottom"]) - - gmsh.model.mesh.field.add("Threshold", 2) - gmsh.model.mesh.field.setNumber(2, "IField", 1) - gmsh.model.mesh.field.setNumber(2, "LcMin", 2.0 * lc) - # gmsh.model.mesh.field.setNumber(2, 'LcMin', lc) - gmsh.model.mesh.field.setNumber(2, "LcMax", 6.0 * lc) - gmsh.model.mesh.field.setNumber(2, "DistMin", 4.5) - gmsh.model.mesh.field.setNumber(2, "DistMax", 1.0 * z_range[1]) - - # Define a distance field from the immersed panels - gmsh.model.mesh.field.add("Distance", 3) - gmsh.model.mesh.field.setNumbers(3, "FacesList", dom_tags["panel_surface"]) - - gmsh.model.mesh.field.add("Threshold", 4) - gmsh.model.mesh.field.setNumber(4, "IField", 3) - gmsh.model.mesh.field.setNumber(4, "LcMin", lc) - gmsh.model.mesh.field.setNumber(4, "LcMax", 6.0 * lc) - gmsh.model.mesh.field.setNumber(4, "DistMin", 0.5) - gmsh.model.mesh.field.setNumber(4, "DistMax", 0.6 * z_range[1]) - - gmsh.model.mesh.field.add("Min", 5) - gmsh.model.mesh.field.setNumbers(5, "FieldsList", [2, 4]) - gmsh.model.mesh.field.setAsBackgroundMesh(5) - - gmsh.model.mesh.field.setAsBackgroundMesh(5) - - print("Meshing... ", end="") - - # Generate the mesh - tic = time.time() - gmsh.model.mesh.generate(3) - toc = time.time() - - print("Finished.") - print("Total Meshing Time = %.1f s" % (toc - tic)) - - return gmsh - - -# ================================================================ - - -def main(theta_deg=30.0, mod=None): - comm = MPI.COMM_WORLD - num_procs = comm.Get_size() - rank = comm.Get_rank() - - # Set the dimensions of the panel (all in meters) - panel = {} - with open("sim_params.yaml") as fp: - output_dic = yaml.load(fp, Loader=yaml.FullLoader) - - # Specify the number of panels to mesh - num_panel_rows = output_dic["num_panel_rows"] - - # panel['spacing'] = 7.0 - panel["spacing"] = output_dic["spacing"] - panel["elevation"] = output_dic["elevation"] - panel["length"] = output_dic["panel_length"] - panel["thickness"] = output_dic["thickness"] - - # Set the dimensions of the domain (all in meters) - dom = {} - dom["length"] = num_panel_rows * panel["spacing"] - dom["span"] = 1.0 * panel["spacing"] - dom["height"] = 10.0 * panel["elevation"] - - # Create a project directory for this run - proj_dir = "periodic_3_panel_alt/theta_%04.1f" % (theta_deg) - os.makedirs("%s" % (proj_dir), exist_ok=True) - - # earlier code generated the mesh when np = 1 and computed dofs when np ~= 1 - # with dolfinx we can use any number of np, dolfinx should generate the mesh - # on rank 1 and pass the information to all other ranks without having to write and read the mesh - - gmsh = generate_periodic_panel_gmsh( - panel, dom, num_panel_rows, theta_deg, proj_dir, comm, lc_fac=3.0 - ) - - msh, mt, ft = gmshio.model_to_mesh(gmsh.model, comm, 0) - - # print(rank,msh) - - msh.name = "cmpt_domain" - mt.name = f"{msh.name}_cells" - ft.name = f"{msh.name}_facets" - - write_xdmf_mesh_file(msh, mt, ft, proj_dir) - - mesh = msh - - # V = VectorFunctionSpace(mesh, 'P', 2) - V = fem.FunctionSpace(msh, ("Lagrange", 2)) - Q = fem.FunctionSpace(msh, ("Lagrange", 1)) - - local_rangeV = V.dofmap.index_map.local_range - dofsV = np.arange(*local_rangeV) - - local_rangeQ = Q.dofmap.index_map.local_range - dofsQ = np.arange(*local_rangeQ) - - size = np.size(dofsQ) - - print("Finished.") - print("Total Dofs = ", (size)) - print("Total Dofs = ", (dofsV)) - print("Total Dofs = ", (dofsQ)) - - -# mod would be the perturbation around .1 -def run_all_angles(mod=None): # run multiple angle - for k in range(10): - print("Found mod", mod) - - theta_deg_list = np.array( - [-70, -60, -50, -40, -30, -20, -10, 0, 10, 20, 30, 40, 50, 60, 70], - dtype=np.float64, - ) - if mod is not None: - theta_deg_list += mod - - for theta_deg in theta_deg_list: - # Specify the rotation of the panels - print(theta_deg) - - main(theta_deg=theta_deg, mod=mod) - - -# run_all_angles() -# run_all_angles(mod=float(sys.argv[1])) -main() diff --git a/pvade/save_all_net_traction.py b/pvade/save_all_net_traction.py deleted file mode 100644 index 70d8e8c2..00000000 --- a/pvade/save_all_net_traction.py +++ /dev/null @@ -1,65 +0,0 @@ -import numpy as np -import glob -import sys -import time -from mpi4py import MPI - - -def get_net_traction(path_to_files): - - try: - fp = open("%s/sim_log.txt" % (path_to_files), "r") - except: - raise ValueError("Cannot find %s" % (path_to_files)) - else: - fp.close() - - csv_list = sorted(glob.glob("%s/time_series/*.csv" % (path_to_files))) - - data_out = [] - - for csv in csv_list: - raw_data = np.genfromtxt(csv, delimiter=",", skip_header=1) - p_top = raw_data[:, 3] - p_bot = raw_data[:, 7] - - data_out.append(p_top - p_bot) - - data_out = np.array(data_out) - - output_filename = "%s/net_traction" % (path_to_files) - np.savetxt(output_filename + ".csv", data_out, delimiter=",") - np.save(output_filename + ".npy", data_out) - - -comm = MPI.COMM_WORLD -rank = comm.Get_rank() -num_procs = comm.Get_size() - -try: - prefix = sys.argv[1] -except: - prefix = "output/param_study" - -run_list_global = sorted(glob.glob("%s/theta_*/uref_*" % (prefix))) -run_list_local = np.array_split(run_list_global, num_procs)[rank] - -if rank == 0: - for k in run_list_global: - print(k) - print("================================================================") - print("Found %d runs to process" % (len(run_list_global))) - print( - "Dividing work between %d cores (~%d runs per core)" - % (num_procs, len(run_list_local)) - ) - print("================================================================") - -for path_to_files in run_list_local: - tic = time.time() - get_net_traction(path_to_files) - toc = time.time() - print( - "Rank %d finished processing %s in %f seconds." - % (rank, path_to_files, toc - tic) - ) From feab904d18f1c7ce8d9296ef472fb65edaa2fd05 Mon Sep 17 00:00:00 2001 From: Young Date: Fri, 10 Mar 2023 14:05:25 -0700 Subject: [PATCH 04/94] cleaning ns_main and streamlining specification of input file/problem --- ns_main.py | 138 +++++++++++--------------------------------- pvade/Parameters.py | 21 ++++++- pvade/Utilities.py | 105 +++++++++++++++++++++++++++++++++ 3 files changed, 158 insertions(+), 106 deletions(-) create mode 100644 pvade/Utilities.py diff --git a/ns_main.py b/ns_main.py index 9ae2ec89..b1223709 100644 --- a/ns_main.py +++ b/ns_main.py @@ -1,60 +1,33 @@ from pvade.FlowManager import Flow from pvade.DataStream import DataStream from pvade.Parameters import SimParams +from pvade.Utilities import get_input_file, write_metrics +from dolfinx.common import TimingType, list_timings import cProfile import sys -import numpy as np -from mpi4py import MPI -import time -from dolfinx.common import TimingType, list_timings import tqdm.autonotebook def main(): - # problems solver are: - # cylinder3d - - # cylinder2d - # panels - # problem = "cylinder2d" - - # problem = "panels" - problem = sys.argv[2] - - # use correct inpit file - if problem == "cylinder3d": - params = SimParams("inputs/3d_cyld.yaml") - dim = 3 - elif problem == "cylinder2d": - params = SimParams("inputs/2d_cyld.yaml") - dim = 2 - elif problem == "panels": - params = SimParams("inputs/sim_params_alt.yaml") - dim = 3 - elif problem == "panels2d": - params = SimParams("inputs/sim_params_alt_2D.yaml") - dim = 2 - else: - raise ValueError(f"Problem is not defined, please specify problem type using --problem $problem \n$problem: [cylinder3d,cylinder2d,panels,panels2d] ") - - if MPI.COMM_WORLD.rank == 0: - print("Currently Solving:",problem) - print("command used is: ",str(sys.argv)) - if dim == 3: + # Get the path to the input file from the command line + input_file = get_input_file() + + # Load the parameters object specified by the input file + params = SimParams(input_file) + + if params.domain.dim == 3: from pvade.geometry.MeshManager3d import FSIDomain - elif dim == 2: + elif params.domain.dim == 2: from pvade.geometry.MeshManager2d import FSIDomain else: print("dimension not defined") exit() - - # Initialize the domain and construct the initial mesh domain = FSIDomain(params) - if params.general.create_mesh == True: + if params.general.create_mesh == True: domain.build() domain.write_mesh_file() elif params.general.read_mesh == True: @@ -62,16 +35,13 @@ def main(): else: raise ValueError(f"Error in creating/loading mesh, please correct inputs") - # domain.test_mesh_functionspace() - if params.general.mesh_only == True: - # dolfinx.cpp.common.TimingType() - list_timings(MPI.COMM_WORLD, [TimingType.wall]) + list_timings(params.comm, [TimingType.wall]) exit() # Check to ensure mesh node matching for periodic simulations # if domain.periodic_simulation: - # domain.check_mesh_periodicity(mpi_info) + # domain.check_mesh_periodicity(params) # Initialize the function spaces for the flow flow = Flow(domain) @@ -84,17 +54,11 @@ def main(): dataIO = DataStream(domain, flow, params) - - # with XDMFFile(domain.comm, results_filename, "w") as xdmf: - # xdmf.write_mesh(domain.msh) - # xdmf.write_function(flow.u_k, 0.0) - # xdmf.write_function(flow.p_k, 0.0) - # # print(np.max(flow.u_k.x.array)) - t_steps = int(params.solver.t_final / params.solver.dt) - # save_vtk_every_n = int(params.solver.save_vtk_every / params.solver.dt) - tic = time.time() if domain.rank == 0: - progress = tqdm.autonotebook.tqdm(desc="Solving PDE", total=params.solver.t_steps) + progress = tqdm.autonotebook.tqdm( + desc="Solving PDE", total=params.solver.t_steps + ) + for k in range(params.solver.t_steps): if domain.rank == 0: progress.update(1) @@ -103,7 +67,7 @@ def main(): flow.solve(params) # adjust pressure to avoid dissipation of pressure profile - # flow.adjust_dpdx_for_constant_flux(mpi_info) + # flow.adjust_dpdx_for_constant_flux(params) if (k + 1) % params.solver.save_xdmf_interval_n == 0: if domain.rank == 0: print( @@ -111,61 +75,25 @@ def main(): ) dataIO.save_XDMF_files(flow, (k + 1) * params.solver.dt) - toc = time.time() - if domain.rank == 0: - print(f"Total solve time = {toc-tic:.2f} s.") - print(f"Average time per iteration = {(toc-tic)/t_steps:.2f} s.") - list_timings(MPI.COMM_WORLD, [TimingType.wall]) - -def write_metrics(): - if MPI.COMM_WORLD.Get_rank() == 0: - with open('profiling.txt', 'r') as output_file: - #solver_line = [line for line in output_file if "(solve)" in line] - solver_line = [line for line in output_file if "(solve)" in line] - print(solver_line) - solver_line = solver_line[0].split() - print("solve: total time = ",solver_line[3], " time per call = ",solver_line[4], " num calls = ",solver_line[0]) - - with open('profiling.txt', 'r') as output_file_1: - #solver_line = [line for line in output_file if "(solve)" in line] - solver1_line = [line for line in output_file_1 if "_solver_step_1" in line] - print(solver1_line) - solver1_line = solver1_line[0].split() - print("solver 1: total time = ",solver1_line[3], " time per call = ",solver1_line[4], " num calls = ",solver1_line[0]) - - with open('profiling.txt', 'r') as output_file: - solver2_line = [line for line in output_file if "_solver_step_2" in line] - print(solver2_line) - solver2_line = solver2_line[0].split() - print("solver 2: total time = ",solver2_line[3], " time per call = ",solver2_line[4], " num calls = ",solver2_line[0]) - - with open('profiling.txt', 'r') as output_file: - solver3_line = [line for line in output_file if "_solver_step_3" in line] - print(solver3_line) - solver3_line = solver3_line[0].split() - print("solver 3: total time = ",solver3_line[3], " time per call = ",solver3_line[4], " num calls = ",solver3_line[0]) - - with open('profiling.txt', 'r') as output_file: - meshread_line = [line for line in output_file if "(read)" in line] - if meshread_line: - meshread_line =meshread_line[0].split() - print("mesh read: total time = ",meshread_line[3], " time per call = ",meshread_line[4], " num calls = ",meshread_line[0]) - - with open('profiling.txt', 'r') as output_file: - meshbuild_line = [line for line in output_file if "(build)" in line] - if meshbuild_line: - meshbuild_line = meshbuild_line[0].split() - print("mesh build: total time = ",meshbuild_line[3], " time per call = ",meshbuild_line[4], " num calls = ",meshbuild_line[0]) + + list_timings(params.comm, [TimingType.wall]) + + return params + + # Print profiling results if __name__ == "__main__": profiler = cProfile.Profile() profiler.enable() - main() + params = main() profiler.disable() - profiler.dump_stats("profiling.prof") - with open("profiling.txt", "w") as output_file: - sys.stdout = output_file - profiler.print_stats(sort="cumtime") - sys.stdout = sys.__stdout__ + if params.rank == 0: + profiler.dump_stats("profiling.prof") + + with open("profiling.txt", "w") as output_file: + sys.stdout = output_file + profiler.print_stats(sort="cumtime") + sys.stdout = sys.__stdout__ + write_metrics() diff --git a/pvade/Parameters.py b/pvade/Parameters.py index 58d33a80..d50bb571 100644 --- a/pvade/Parameters.py +++ b/pvade/Parameters.py @@ -33,6 +33,8 @@ def __init__(self, input_file_path=None): # Open the input file for reading and load its contents into a dictionary with open(input_file_path, "r") as fp: + if self.rank == 0: + print(f"Reading problem definition from {input_file_path}") self.input_file_dict = yaml.safe_load(fp) # Set values as specified by the input yaml file @@ -111,6 +113,15 @@ def _set_user_params_from_cli(self): parser = argparse.ArgumentParser() + ignore_list = ["input_file"] + + parser.add_argument( + "--input_file", + metavar="", + type=str, + help="The full path to the input file, e.g., 'intputs/my_params.yaml'", + ) + for key, value in self.flat_schema_dict.items(): help_message = f"{value['description']} (data type = {value['type']}, Units = {value['units']})" @@ -132,12 +143,15 @@ def _set_user_params_from_cli(self): # Find any command line arguments that were used and replace those entries in params for key, value in vars(command_line_inputs).items(): - if value is not None: + if key not in ignore_list and value is not None: path_to_input = key.split(".") self._set_nested_dict_value( self.input_dict, path_to_input, value, error_on_missing_key=False ) + if self.rank == 0: + print(f"| Setting {key} = {value} from command line.") + def _validate_inputs(self): # This compares the input dictionary against the yaml schema # to ensure all values are set correctly @@ -223,3 +237,8 @@ def _add_derived_quantities(self): self.solver.save_text_interval_n = int( self.solver.save_text_interval / self.solver.dt ) + + if hasattr(self.domain, "z_min"): + self.domain.dim = 3 + else: + self.domain.dim = 2 diff --git a/pvade/Utilities.py b/pvade/Utilities.py new file mode 100644 index 00000000..a21b654a --- /dev/null +++ b/pvade/Utilities.py @@ -0,0 +1,105 @@ +import argparse + + +def get_input_file(): + parser = argparse.ArgumentParser() + + parser.add_argument( + "--input_file", + metavar="", + type=str, + help="The full path to the input file, e.g., 'intputs/my_params.yaml'", + ) + + command_line_inputs, unknown = parser.parse_known_args() + + try: + input_file_path = vars(command_line_inputs)["input_file"] + assert input_file_path is not None + + except: + raise ValueError("No input file specified, quitting.") + + return input_file_path + + +def write_metrics(): + with open("profiling.txt", "r") as output_file: + # solver_line = [line for line in output_file if "(solve)" in line] + solver_line = [line for line in output_file if "(solve)" in line] + print(solver_line) + solver_line = solver_line[0].split() + print( + "solve: total time = ", + solver_line[3], + " time per call = ", + solver_line[4], + " num calls = ", + solver_line[0], + ) + + with open("profiling.txt", "r") as output_file_1: + # solver_line = [line for line in output_file if "(solve)" in line] + solver1_line = [line for line in output_file_1 if "_solver_step_1" in line] + print(solver1_line) + solver1_line = solver1_line[0].split() + print( + "solver 1: total time = ", + solver1_line[3], + " time per call = ", + solver1_line[4], + " num calls = ", + solver1_line[0], + ) + + with open("profiling.txt", "r") as output_file: + solver2_line = [line for line in output_file if "_solver_step_2" in line] + print(solver2_line) + solver2_line = solver2_line[0].split() + print( + "solver 2: total time = ", + solver2_line[3], + " time per call = ", + solver2_line[4], + " num calls = ", + solver2_line[0], + ) + + with open("profiling.txt", "r") as output_file: + solver3_line = [line for line in output_file if "_solver_step_3" in line] + print(solver3_line) + solver3_line = solver3_line[0].split() + print( + "solver 3: total time = ", + solver3_line[3], + " time per call = ", + solver3_line[4], + " num calls = ", + solver3_line[0], + ) + + with open("profiling.txt", "r") as output_file: + meshread_line = [line for line in output_file if "(read)" in line] + if meshread_line: + meshread_line = meshread_line[0].split() + print( + "mesh read: total time = ", + meshread_line[3], + " time per call = ", + meshread_line[4], + " num calls = ", + meshread_line[0], + ) + + with open("profiling.txt", "r") as output_file: + meshbuild_line = [line for line in output_file if "(build)" in line] + if meshbuild_line: + meshbuild_line = meshbuild_line[0].split() + print( + "mesh build: total time = ", + meshbuild_line[3], + " time per call = ", + meshbuild_line[4], + " num calls = ", + meshbuild_line[0], + ) From 17df4a6fe36f588e2f1b8dcf51d10039e9d3bd7f Mon Sep 17 00:00:00 2001 From: Young Date: Fri, 10 Mar 2023 14:07:30 -0700 Subject: [PATCH 05/94] add a readthedocs file --- .readthedocs.yaml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 .readthedocs.yaml diff --git a/.readthedocs.yaml b/.readthedocs.yaml new file mode 100644 index 00000000..b40a06d2 --- /dev/null +++ b/.readthedocs.yaml @@ -0,0 +1,14 @@ +# .readthedocs.yaml + +version: 2 + +build: + os: "ubuntu-20.04" + tools: + python: "mambaforge-4.10" + +sphinx: + configuration: docs/conf.py + +conda: + environment: environment.yaml From fc48d980a1f712b055d7cf7b06cf3f36df8dd8f2 Mon Sep 17 00:00:00 2001 From: Young Date: Fri, 10 Mar 2023 14:09:18 -0700 Subject: [PATCH 06/94] use makedirs vs mkdir to create nested directories automatically --- pvade/geometry/MeshManager.py | 2 +- pvade/geometry/MeshManager2d.py | 2 +- pvade/geometry/MeshManager3d.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pvade/geometry/MeshManager.py b/pvade/geometry/MeshManager.py index cb9a83dc..09a71ee1 100644 --- a/pvade/geometry/MeshManager.py +++ b/pvade/geometry/MeshManager.py @@ -173,7 +173,7 @@ def write_mesh_file(self): ) if os.path.exists(self.params.general.output_dir_mesh) == False: - os.mkdir(self.params.general.output_dir_mesh) + os.makedirs(self.params.general.output_dir_mesh) gmsh.write("%s/mesh.msh" % (self.params.general.output_dir_mesh)) gmsh.write("%s/mesh.vtk" % (self.params.general.output_dir_mesh)) diff --git a/pvade/geometry/MeshManager2d.py b/pvade/geometry/MeshManager2d.py index e2b54232..4f34dc70 100644 --- a/pvade/geometry/MeshManager2d.py +++ b/pvade/geometry/MeshManager2d.py @@ -325,7 +325,7 @@ def write_mesh_file(self): print('Writing Mesh to %s... ' % (self.params.general.output_dir_mesh), end='') if os.path.exists(self.params.general.output_dir_mesh) == False: - os.mkdir(self.params.general.output_dir_mesh) + os.makedirs(self.params.general.output_dir_mesh) gmsh.write('%s/mesh.msh' % (self.params.general.output_dir_mesh)) gmsh.write('%s/mesh.vtk' % (self.params.general.output_dir_mesh)) def create_mesh(mesh, clean_points, cell_type): diff --git a/pvade/geometry/MeshManager3d.py b/pvade/geometry/MeshManager3d.py index bcd7b31f..07fa0770 100644 --- a/pvade/geometry/MeshManager3d.py +++ b/pvade/geometry/MeshManager3d.py @@ -383,7 +383,7 @@ def write_mesh_file(self): print('Writing Mesh to %s... ' % (self.params.general.output_dir_mesh), end='') if os.path.exists(self.params.general.output_dir_mesh) == False: - os.mkdir(self.params.general.output_dir_mesh) + os.makedirs(self.params.general.output_dir_mesh) gmsh.write('%s/mesh.msh' % (self.params.general.output_dir_mesh)) gmsh.write('%s/mesh.vtk' % (self.params.general.output_dir_mesh)) def create_mesh(mesh, clean_points, cell_type): From f319eb1e809bf790b4067c99bb9813c5ba285685 Mon Sep 17 00:00:00 2001 From: Young Date: Fri, 10 Mar 2023 14:23:28 -0700 Subject: [PATCH 07/94] setting up pytest for gha --- pvade/tests/test_Parameters.py | 15 +++++++++++++++ pytest.ini | 4 ++++ setup.py | 6 ++++++ 3 files changed, 25 insertions(+) create mode 100644 pvade/tests/test_Parameters.py create mode 100644 pytest.ini create mode 100644 setup.py diff --git a/pvade/tests/test_Parameters.py b/pvade/tests/test_Parameters.py new file mode 100644 index 00000000..43ac4423 --- /dev/null +++ b/pvade/tests/test_Parameters.py @@ -0,0 +1,15 @@ +import pytest +from pvade.Parameters import SimParams + +@pytest.fixture() +def create_params(): + params = SimParams("test_params.yaml") + + return params + +@pytest.mark.unit +def test_parameters(create_params): + params = create_params + print(params) + + print('yo') \ No newline at end of file diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 00000000..93ad3d1a --- /dev/null +++ b/pytest.ini @@ -0,0 +1,4 @@ +[pytest] +markers = + unit: A short test that relies mostly on quick pass/fail outcomes. + regression: A longer test that requires solving a small problem and comparing floating point results. diff --git a/setup.py b/setup.py new file mode 100644 index 00000000..0578035a --- /dev/null +++ b/setup.py @@ -0,0 +1,6 @@ +from setuptools import setup + +setup(name = 'PV Aerodynamic Design Engineering, PVade', + version = '0.0', + packages = ['pvade'], + zip_safe = False) From 73315080affcba03338f2bf8b49834d503fd2772 Mon Sep 17 00:00:00 2001 From: Young Date: Fri, 10 Mar 2023 14:51:05 -0700 Subject: [PATCH 08/94] writing simple tests for Parameters --- pvade/tests/test_Parameters.py | 57 +++++++++++++++++++++++++++++++--- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/pvade/tests/test_Parameters.py b/pvade/tests/test_Parameters.py index 43ac4423..3b0e786f 100644 --- a/pvade/tests/test_Parameters.py +++ b/pvade/tests/test_Parameters.py @@ -1,15 +1,62 @@ import pytest +import os + from pvade.Parameters import SimParams +filename = "pvade/tests/test_inputs.yaml" + + @pytest.fixture() def create_params(): - params = SimParams("test_params.yaml") + # Create the file + with open(filename, "w") as fp: + fp.write("general:\n") + fp.write(" example: test_name\n") + fp.write(" output_dir_sol: path/to/solution/dir\n") + fp.write("domain:\n") + fp.write(" x_min: 0.0\n") + fp.write(" x_max: 2.5\n") + fp.write("solver:\n") + fp.write(" t_final: 1.0\n") + fp.write(" dt: 0.1\n") + fp.write(" save_xdmf_interval: 0.5\n") + fp.write(" save_text_interval: 0.5\n") + + # Run the actual test + yield + + # Teardown + os.remove(filename) + + +@pytest.fixture() +def create_bad_params(): + # Create the file + with open(filename, "w") as fp: + fp.write("generalTYPO:\n") + fp.write(" example: test_name\n") + fp.write(" output_dir_sol: path/to/solution/dir\n") + + # Run the actual test + yield + + # Teardown + os.remove(filename) - return params @pytest.mark.unit def test_parameters(create_params): - params = create_params - print(params) - print('yo') \ No newline at end of file + params = SimParams(filename) + + assert params.general.output_dir_sol == "path/to/solution/dir" + + assert params.domain.x_min == pytest.approx(0.0) + + assert params.solver.t_steps == 10 + assert params.solver.save_xdmf_interval_n == 5 + + +def test_bad_parameters(create_bad_params): + with pytest.raises(Exception): + params = SimParams(filename) From c3468dda0d064fdba773e95e041971418df2ec9a Mon Sep 17 00:00:00 2001 From: Young Date: Fri, 10 Mar 2023 15:27:55 -0700 Subject: [PATCH 09/94] update tests --- pvade/tests/test_Parameters.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pvade/tests/test_Parameters.py b/pvade/tests/test_Parameters.py index 3b0e786f..68f8533f 100644 --- a/pvade/tests/test_Parameters.py +++ b/pvade/tests/test_Parameters.py @@ -57,6 +57,7 @@ def test_parameters(create_params): assert params.solver.save_xdmf_interval_n == 5 +@pytest.mark.unit def test_bad_parameters(create_bad_params): with pytest.raises(Exception): params = SimParams(filename) From 80eb05910c02e3a8b1e4e6f0904546d51b2c0771 Mon Sep 17 00:00:00 2001 From: Young Date: Fri, 10 Mar 2023 15:37:31 -0700 Subject: [PATCH 10/94] new tests --- .github/workflows/test_pvade.yaml | 5 +++++ .github/workflows/test_pvade_new.yaml | 29 +++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 .github/workflows/test_pvade_new.yaml diff --git a/.github/workflows/test_pvade.yaml b/.github/workflows/test_pvade.yaml index 3a8f7c9b..6f201d0a 100644 --- a/.github/workflows/test_pvade.yaml +++ b/.github/workflows/test_pvade.yaml @@ -21,6 +21,11 @@ jobs: os: - linux - macos + include: + - os: linux + os-version: ubuntu-20.04 + - os: macos + os-version: macos-10.15 steps: - uses: actions/checkout@v2 - uses: conda-incubator/setup-miniconda@v2 diff --git a/.github/workflows/test_pvade_new.yaml b/.github/workflows/test_pvade_new.yaml new file mode 100644 index 00000000..2131c036 --- /dev/null +++ b/.github/workflows/test_pvade_new.yaml @@ -0,0 +1,29 @@ +name: Python Package using Conda + +on: [push] + +jobs: + build-linux: + runs-on: ubuntu-latest + strategy: + max-parallel: 5 + + steps: + - uses: actions/checkout@v3 + - uses: conda-incubator/setup-miniconda@v2 + with: + miniconda-version: "latest" + channels: conda-forge + auto-update-conda: true + python-version: '3.10' + - name: Install PVade Conda environment + shell: pwsh + run: | + conda env create -f environment.yaml -n test-env + conda activate test-env + conda list + - name: Test PVade with pytest + shell: pwsh + run: | + conda activate test-env + pytest -s pvade/tests/ From 0e18cf7a552958a76ddc44d28b20fc193f16b902 Mon Sep 17 00:00:00 2001 From: Young Date: Fri, 10 Mar 2023 15:44:34 -0700 Subject: [PATCH 11/94] add pull_request --- .github/workflows/test_pvade_new.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_pvade_new.yaml b/.github/workflows/test_pvade_new.yaml index 2131c036..098c090e 100644 --- a/.github/workflows/test_pvade_new.yaml +++ b/.github/workflows/test_pvade_new.yaml @@ -1,6 +1,6 @@ name: Python Package using Conda -on: [push] +on: [push, pull_request] jobs: build-linux: From 79d0f17549950eac64c47e5b9d1f7cc3a4ae48a7 Mon Sep 17 00:00:00 2001 From: Young Date: Fri, 10 Mar 2023 16:24:11 -0700 Subject: [PATCH 12/94] update tests --- .github/workflows/test_pvade.yaml | 4 ---- .github/workflows/test_pvade_new.yaml | 29 --------------------------- pvade/Parameters.py | 6 +++++- 3 files changed, 5 insertions(+), 34 deletions(-) delete mode 100644 .github/workflows/test_pvade_new.yaml diff --git a/.github/workflows/test_pvade.yaml b/.github/workflows/test_pvade.yaml index 6f201d0a..c75a9602 100644 --- a/.github/workflows/test_pvade.yaml +++ b/.github/workflows/test_pvade.yaml @@ -1,6 +1,3 @@ -# This workflow will install Python dependencies, run tests and lint with a variety of Python versions -# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions - name: test_pvade on: @@ -45,4 +42,3 @@ jobs: run: | conda activate test-env pytest -s pvade/tests/ - diff --git a/.github/workflows/test_pvade_new.yaml b/.github/workflows/test_pvade_new.yaml deleted file mode 100644 index 098c090e..00000000 --- a/.github/workflows/test_pvade_new.yaml +++ /dev/null @@ -1,29 +0,0 @@ -name: Python Package using Conda - -on: [push, pull_request] - -jobs: - build-linux: - runs-on: ubuntu-latest - strategy: - max-parallel: 5 - - steps: - - uses: actions/checkout@v3 - - uses: conda-incubator/setup-miniconda@v2 - with: - miniconda-version: "latest" - channels: conda-forge - auto-update-conda: true - python-version: '3.10' - - name: Install PVade Conda environment - shell: pwsh - run: | - conda env create -f environment.yaml -n test-env - conda activate test-env - conda list - - name: Test PVade with pytest - shell: pwsh - run: | - conda activate test-env - pytest -s pvade/tests/ diff --git a/pvade/Parameters.py b/pvade/Parameters.py index d50bb571..7aa59af2 100644 --- a/pvade/Parameters.py +++ b/pvade/Parameters.py @@ -139,7 +139,7 @@ def _set_user_params_from_cli(self): f"--{key}", metavar="", type=cli_type, help=help_message ) - command_line_inputs = parser.parse_args() + command_line_inputs, unknown = parser.parse_known_args() # Find any command line arguments that were used and replace those entries in params for key, value in vars(command_line_inputs).items(): @@ -152,6 +152,10 @@ def _set_user_params_from_cli(self): if self.rank == 0: print(f"| Setting {key} = {value} from command line.") + for key in unknown: + if self.rank == 0: + print(f"| Got unknown option {key}, skipping.") + def _validate_inputs(self): # This compares the input dictionary against the yaml schema # to ensure all values are set correctly From c33f0f585144b973fb58f56242f432f812559e43 Mon Sep 17 00:00:00 2001 From: Young Date: Fri, 10 Mar 2023 16:26:43 -0700 Subject: [PATCH 13/94] make tests verbose --- .github/workflows/test_pvade.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_pvade.yaml b/.github/workflows/test_pvade.yaml index c75a9602..74e4ed4e 100644 --- a/.github/workflows/test_pvade.yaml +++ b/.github/workflows/test_pvade.yaml @@ -41,4 +41,4 @@ jobs: shell: pwsh run: | conda activate test-env - pytest -s pvade/tests/ + pytest -sv pvade/tests/ From 1e215bb00e898525bfa8e026cd32c610aa632f3b Mon Sep 17 00:00:00 2001 From: Young Date: Fri, 10 Mar 2023 16:43:52 -0700 Subject: [PATCH 14/94] update checkout version per warning --- .github/workflows/test_pvade.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test_pvade.yaml b/.github/workflows/test_pvade.yaml index 74e4ed4e..d691af30 100644 --- a/.github/workflows/test_pvade.yaml +++ b/.github/workflows/test_pvade.yaml @@ -24,7 +24,7 @@ jobs: - os: macos os-version: macos-10.15 steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - uses: conda-incubator/setup-miniconda@v2 with: miniconda-version: "latest" From 64542c3e2f511566250ac92dec4b421de326c3fd Mon Sep 17 00:00:00 2001 From: Young Date: Fri, 10 Mar 2023 16:48:47 -0700 Subject: [PATCH 15/94] update readme --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 42e06685..14d1a980 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,13 @@ # PVade + +[![test_pvade](https://github.com/NREL/PVade/actions/workflows/test_pvade.yaml/badge.svg)](https://github.com/NREL/PVade/actions/workflows/test_pvade.yaml) + +--- + `PVade` is an open source fluid-structure interaction model which can be used to study wind loading and stability on solar-tracking PV arrays. `PVade` can be used as part of a larger modeling chain to provide stressor inputs to mechanical module models to study the physics of failure for degradation mechanisms such as cell cracking, weathering of cracked cells, and glass breakage. -# Getting Started +## Getting Started + 1. To use this software, begin by creating a Conda environment using the provided `environment.yaml` file: ```bash conda env create -n my_env_name -f environment.yaml From d8dde453f6b6578793eedc01b5c0a86f1e685b72 Mon Sep 17 00:00:00 2001 From: Young Date: Fri, 10 Mar 2023 16:55:04 -0700 Subject: [PATCH 16/94] formatting readme --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 14d1a980..c2e5a71f 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,14 @@ # PVade +`PVade` is an open source fluid-structure interaction model which can be used to study wind loading and stability on solar-tracking PV arrays. `PVade` can be used as part of a larger modeling chain to provide stressor inputs to mechanical module models to study the physics of failure for degradation mechanisms such as cell cracking, weathering of cracked cells, and glass breakage. For more information, visit the [PVade Documentation](TODO). + [![test_pvade](https://github.com/NREL/PVade/actions/workflows/test_pvade.yaml/badge.svg)](https://github.com/NREL/PVade/actions/workflows/test_pvade.yaml) ---- +## Getting Started -`PVade` is an open source fluid-structure interaction model which can be used to study wind loading and stability on solar-tracking PV arrays. `PVade` can be used as part of a larger modeling chain to provide stressor inputs to mechanical module models to study the physics of failure for degradation mechanisms such as cell cracking, weathering of cracked cells, and glass breakage. +New users are encouraged to review the [Getting Started](TODO) guide which describes how to create the Conda environment and run the example simulations. -## Getting Started +## Developer Quick Start 1. To use this software, begin by creating a Conda environment using the provided `environment.yaml` file: ```bash From 36288d1862cba9b810ba4d74e5cb3761e0e45d8d Mon Sep 17 00:00:00 2001 From: Young Date: Thu, 16 Mar 2023 13:56:49 -0600 Subject: [PATCH 17/94] updating and fixing docstrings for sphinx --- docs/technical_reference/data_stream.rst | 2 +- docs/technical_reference/flow_manager.rst | 2 +- docs/technical_reference/mesh_manager.rst | 2 +- docs/technical_reference/parameters.rst | 2 +- inputs/sim_params_alt.yaml | 2 +- pvade/DataStream.py | 59 ++++++++++++----------- pvade/Parameters.py | 5 ++ pvade/geometry/MeshManager3d.py | 26 +++++----- 8 files changed, 53 insertions(+), 47 deletions(-) diff --git a/docs/technical_reference/data_stream.rst b/docs/technical_reference/data_stream.rst index a4458b22..c19e4881 100644 --- a/docs/technical_reference/data_stream.rst +++ b/docs/technical_reference/data_stream.rst @@ -1,5 +1,5 @@ DataStream ========== -.. automodule:: DataStream +.. automodule:: pvade.DataStream :members: diff --git a/docs/technical_reference/flow_manager.rst b/docs/technical_reference/flow_manager.rst index 9ba44b08..57098262 100644 --- a/docs/technical_reference/flow_manager.rst +++ b/docs/technical_reference/flow_manager.rst @@ -1,5 +1,5 @@ FlowManager ============= -.. automodule:: FlowManager +.. automodule:: pvade.FlowManager :members: diff --git a/docs/technical_reference/mesh_manager.rst b/docs/technical_reference/mesh_manager.rst index a1d361b6..7c6d484a 100644 --- a/docs/technical_reference/mesh_manager.rst +++ b/docs/technical_reference/mesh_manager.rst @@ -1,5 +1,5 @@ MeshManager =========== -.. automodule:: geometry.MeshManager +.. automodule:: pvade.geometry.MeshManager :members: diff --git a/docs/technical_reference/parameters.rst b/docs/technical_reference/parameters.rst index 5da774da..9adf54fd 100644 --- a/docs/technical_reference/parameters.rst +++ b/docs/technical_reference/parameters.rst @@ -1,5 +1,5 @@ Parameters ========== -.. automodule:: Parameters +.. automodule:: pvade.Parameters :members: diff --git a/inputs/sim_params_alt.yaml b/inputs/sim_params_alt.yaml index e199ee0d..bc868f0a 100644 --- a/inputs/sim_params_alt.yaml +++ b/inputs/sim_params_alt.yaml @@ -4,7 +4,7 @@ general: output_dir_sol: output/panels/solution create_mesh: True read_mesh: False - mesh_only: True + mesh_only: False domain: x_min: -10 x_max: 50 diff --git a/pvade/DataStream.py b/pvade/DataStream.py index 990370bc..9bcf379e 100644 --- a/pvade/DataStream.py +++ b/pvade/DataStream.py @@ -10,8 +10,29 @@ class DataStream: - def __init__(self, domain, flow, params): + """Input/Output and file writing class + + This class manages the generation and updating of the saved xdmf files from each run along with command line outputs and log files. + + Attributes: + comm (MPI Communicator): An MPI communicator used by all PVade objects + ndim (int): The number of dimensions in the problem + num_procs (int): The total number of processors being used to solve the problem + rank (int): A unique ID for each process in the range `[0, 1, ..., num_procs-1]` + results_filename (str): The full path to the directory in which all saved files will be written. + """ + + def __init__(self, domain, flow, params): + """Initialize the DataStream object + + This initializes an object that manages the I/O for all of PVade. + + Args: + domain (:obj:`pvade.geometry.MeshManager.Domain`): A Domain object + flow (:obj:`pvade.FlowManager.Flow`): A Flow object + params (:obj:`pvade.Parameters.SimParams`): A SimParams object + """ self.comm = params.comm self.rank = params.rank self.num_procs = params.num_procs @@ -20,13 +41,6 @@ def __init__(self, domain, flow, params): self.results_filename = f"{params.general.output_dir_sol}/solution.xdmf" - # if self.num_procs > 1: - # encoding = [XDMFFile.Encoding.HDF5] - # else: - # encoding = [XDMFFile.Encoding.HDF5, XDMFFile.Encoding.ASCII] - - # # @pytest.mark.parametrize("encoding", encodings) - with XDMFFile(self.comm, self.results_filename, "w") as xdmf_file: tt = 0.0 xdmf_file.write_mesh(domain.msh) @@ -35,28 +49,15 @@ def __init__(self, domain, flow, params): def save_XDMF_files(self, flow, tt): + """Write additional timestep to XDMF file + + This function appends the state of the flow at time `tt` to an existing XDMF file. + + Args: + flow (:obj:`pvade.FlowManager.Flow`): A Flow object + tt (float): The time at which the current solution exists + """ with XDMFFile(self.comm, self.results_filename, "a") as xdmf_file: xdmf_file.write_function(flow.u_k, tt) xdmf_file.write_function(flow.p_k, tt) - # def save_XDMF_files(self, flow, params, step, xdmf_file): - # current_time = step * params["dt"] - - # xdmf_file.write(flow.u_k, current_time) - # xdmf_file.write(flow.p_k, current_time) - - # try: - # nu_T_fn = project(flow.nu_T, flow.Q, solver_type="cg") - # except: - # print("Could not project nu_T form") - # else: - # nu_T_fn.rename("nu_T", "nu_T") - # xdmf_file.write(nu_T_fn, current_time) - - # def finalize(self, mpi_info): - # if mpi_info["rank"] == 0: - # print("Solver Finished.") - # self.toc = time.time() - # self.fp_log = open(self.fp_log_name, "a") - # self.fp_log.write("\nTotal Solver Time = %f (s)\n" % (self.toc - self.tic)) - # self.fp_log.close() diff --git a/pvade/Parameters.py b/pvade/Parameters.py index 7aa59af2..66b41e6d 100644 --- a/pvade/Parameters.py +++ b/pvade/Parameters.py @@ -6,6 +6,11 @@ from pandas import json_normalize from jsonschema import validate +class Dummy: + def __init__(self): + self.x = 1e-10 + def yo(self, t): + self.t = t class SimParams: def __init__(self, input_file_path=None): diff --git a/pvade/geometry/MeshManager3d.py b/pvade/geometry/MeshManager3d.py index 07fa0770..0650f018 100644 --- a/pvade/geometry/MeshManager3d.py +++ b/pvade/geometry/MeshManager3d.py @@ -9,7 +9,7 @@ import time import ufl import dolfinx -import meshio +# import meshio # from pvopt.geometry.panels.DomainCreation import * class FSIDomain: @@ -386,21 +386,21 @@ def write_mesh_file(self): os.makedirs(self.params.general.output_dir_mesh) gmsh.write('%s/mesh.msh' % (self.params.general.output_dir_mesh)) gmsh.write('%s/mesh.vtk' % (self.params.general.output_dir_mesh)) - def create_mesh(mesh, clean_points, cell_type): - cells = mesh.get_cells_type(cell_type) - cell_data = mesh.get_cell_data("gmsh:physical", cell_type) + # def create_mesh(mesh, clean_points, cell_type): + # cells = mesh.get_cells_type(cell_type) + # cell_data = mesh.get_cell_data("gmsh:physical", cell_type) - out_mesh = meshio.Mesh(points=clean_points, cells={ - cell_type: cells}, cell_data={"name_to_read": [cell_data]}) - return out_mesh + # out_mesh = meshio.Mesh(points=clean_points, cells={ + # cell_type: cells}, cell_data={"name_to_read": [cell_data]}) + # return out_mesh - mesh_from_file = meshio.read(f'{self.params.general.output_dir_mesh}/mesh.msh') - pts = mesh_from_file.points - tetra_mesh = create_mesh(mesh_from_file, pts, "tetra") - tri_mesh = create_mesh(mesh_from_file, pts, "triangle") + # mesh_from_file = meshio.read(f'{self.params.general.output_dir_mesh}/mesh.msh') + # pts = mesh_from_file.points + # tetra_mesh = create_mesh(mesh_from_file, pts, "tetra") + # tri_mesh = create_mesh(mesh_from_file, pts, "triangle") - meshio.write(f'{self.params.general.output_dir_mesh}/mesh.xdmf', tetra_mesh) - meshio.write(f'{self.params.general.output_dir_mesh}/mesh_mf.xdmf', tri_mesh) + # meshio.write(f'{self.params.general.output_dir_mesh}/mesh.xdmf', tetra_mesh) + # meshio.write(f'{self.params.general.output_dir_mesh}/mesh_mf.xdmf', tri_mesh) print("Done.") def test_mesh_functionspace(self): From c8dcbb500e656eeab1f46721a6fe6bea24fa16ca Mon Sep 17 00:00:00 2001 From: Young Date: Thu, 16 Mar 2023 16:28:00 -0600 Subject: [PATCH 18/94] cleaning up local tests --- inputs/sim_params_alt.yaml | 2 +- pvade/Parameters.py | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/inputs/sim_params_alt.yaml b/inputs/sim_params_alt.yaml index bc868f0a..e199ee0d 100644 --- a/inputs/sim_params_alt.yaml +++ b/inputs/sim_params_alt.yaml @@ -4,7 +4,7 @@ general: output_dir_sol: output/panels/solution create_mesh: True read_mesh: False - mesh_only: False + mesh_only: True domain: x_min: -10 x_max: 50 diff --git a/pvade/Parameters.py b/pvade/Parameters.py index 66b41e6d..7aa59af2 100644 --- a/pvade/Parameters.py +++ b/pvade/Parameters.py @@ -6,11 +6,6 @@ from pandas import json_normalize from jsonschema import validate -class Dummy: - def __init__(self): - self.x = 1e-10 - def yo(self, t): - self.t = t class SimParams: def __init__(self, input_file_path=None): From 4a6d0f878db9d00ebe021b30b56e5f08d2296bf6 Mon Sep 17 00:00:00 2001 From: Young Date: Thu, 23 Mar 2023 11:18:47 -0600 Subject: [PATCH 19/94] finishing docstrings for parameters --- docs/technical_reference/parameters.rst | 1 + pvade/Parameters.py | 170 +++++++++++++++++++++++- 2 files changed, 167 insertions(+), 4 deletions(-) diff --git a/docs/technical_reference/parameters.rst b/docs/technical_reference/parameters.rst index 9adf54fd..72e57dd1 100644 --- a/docs/technical_reference/parameters.rst +++ b/docs/technical_reference/parameters.rst @@ -3,3 +3,4 @@ Parameters .. automodule:: pvade.Parameters :members: + :private-members: \ No newline at end of file diff --git a/pvade/Parameters.py b/pvade/Parameters.py index 7aa59af2..046fb9c4 100644 --- a/pvade/Parameters.py +++ b/pvade/Parameters.py @@ -8,7 +8,36 @@ class SimParams: + """Manages and validates all simulation parameters + + ``SimParams`` provides a set of methods to obtain user-input values from + both input files and the command line. It also provides input validation + via a yaml schema file. All parameters can later be access from PVade + objects like ``params.parent_group.option`` for example, + ``params.solver.dt``. + + + Attributes: + comm (MPI Communicator): An MPI communicator that will be shared by all PVade objects. + flat_schema_dict (dict): A flattened dictionary version of the yaml schema file used to set default values and provide valid command-line options. + input_dict (dict): The aggregated input dictionary containing all command-line updated values and input-file values. + input_file_dict (dict): The dictionary representing the input file. + num_procs (int): The total number of MPI processes. + rank (int): The MPI rank of this process, in the range `[0, 1, ..., num_procs-1]`. + schema_dict (dict): The unflattened (nested) representation of the yaml schema dictionary. + """ + def __init__(self, input_file_path=None): + """Create a SimParams object + + This method begins by reading both the schema file and the + user-specified file into dictionaries. It overrides entries in the + user-specified dictionary with command-line inputs and finally + validates the complete dictionary against the schema file. + + Args: + input_file_path (str, optional): The complete path to the input yaml file defining the problem. + """ # Get MPI communicators self.comm = MPI.COMM_WORLD self.rank = self.comm.Get_rank() @@ -48,8 +77,8 @@ def __init__(self, input_file_path=None): else: # Assign all default parameters using the flattened schema - # We can still support this, but maybe not the official getting started strategy - # (provide a yaml file for demos) + # We can still support this, but maybe not the official getting + # started strategy(provide a yaml file for demos) self._initialize_params_to_default() # Override any previous value with a command line input @@ -58,14 +87,36 @@ def __init__(self, input_file_path=None): # Check that the complete parameter spec conforms to the schema self._validate_inputs() - # Store the nested dictionary as attributes on this object for easy access - # e.g., params.domain.x_max instead of params['domain']['x_max'] + # Store the nested dictionary as attributes on this object for easy + # access e.g., params.domain.x_max instead of params['domain'] + # ['x_max'] self._store_dict_as_attrs() self._add_derived_quantities() def _flatten_schema_dict(self): + """Flatten the schema dictionary + + This method returns a flattened version of the schema dictionary where + nested dictionary key:val pairs are separated with dots (`.`). For + example:: + + general: + name: test_sim + size: + x: 10 + y: 20 + + will be converted to:: + + general.name: test_sim + general.size.x: 10 + general.size.y: 20 + Args: + None + + """ flat_schema_raw = json_normalize(self.schema_dict, sep=".").to_dict() self.flat_schema_dict = {} @@ -89,7 +140,15 @@ def _flatten_schema_dict(self): self.flat_schema_dict[short_key][subkey] = val def _set_user_params_from_file(self): + """Store the input-file supplied values + + This method stores the parameters supplied via input yaml file in the + aggregated input dictionary. + + Args: + None + """ flat_input_file_dict = json_normalize(self.input_file_dict, sep=".").to_dict() for key, val in flat_input_file_dict.items(): @@ -99,7 +158,16 @@ def _set_user_params_from_file(self): ) def _initialize_params_to_default(self): + """Initialize values to default + + This method uses the `default` entry associated with each parameter in + the yaml schema to provide a sane value where none is supplied by the + input yaml file. + + Args: + None + """ for key, val in self.flat_schema_dict.items(): path_to_input = key.split(".") self._set_nested_dict_value( @@ -110,7 +178,25 @@ def _initialize_params_to_default(self): ) def _set_user_params_from_cli(self): + """Store values from command line + This method uses the flattened schema dictionary, where nested options + are stored as a one-layer dictionary with keys separated by dots + (`.`), to generate a set of valid command line inputs that can be + used to override options that would otherwise be set by the input + yaml file or defaults. For example:: + + python main.py --solver.dt 0.01 + + will override whatever value of ``dt`` is present in the yaml file + with the value 0.01. Note the double hyphen to set off an argument + name, either with or without the assignment operator is allowed + (e.g., both ``--solver.dt 0.01`` and ``--solver.dt=0.01`` are valid) + + Args: + None + + """ parser = argparse.ArgumentParser() ignore_list = ["input_file"] @@ -157,6 +243,19 @@ def _set_user_params_from_cli(self): print(f"| Got unknown option {key}, skipping.") def _validate_inputs(self): + """Validate the input dictionary + + This method uses the validate function from the jsonschema package to + validate the complete user-supplied parameter set. This checks that + variables are the expected type, fall within prescribed ranges, and + also ensure that dependencies between variables are satisfied + (e.g., if variable ``a`` is specified, then variable ``b`` must also + be specified.) + + Args: + None + + """ # This compares the input dictionary against the yaml schema # to ensure all values are set correctly validate(self.input_dict, self.schema_dict) @@ -164,6 +263,18 @@ def _validate_inputs(self): # self._pprint_dict(self.input_dict) def _store_dict_as_attrs(self): + """Converts dictionary notation to nested object attributes + + This method re-structures the parameters dictionary into the slightly + easier-to-navigate ``object.attribute`` format. For example, rather + than having a parameters dictionary and accessing entries like + ``params['general']['name']``, we create a parameters object with + attributes accessed like ``params.general.name``. + + Args: + None + + """ flat_input_dict = json_normalize(self.input_dict, sep=".").to_dict() for key, val in flat_input_dict.items(): @@ -173,7 +284,18 @@ def _store_dict_as_attrs(self): def _set_nested_dict_value( self, parent_obj, path_to_input, value, error_on_missing_key=True ): + """Set a nested value in a dictionary + This method uses the flattened path to a dictionary value to create + the nested structure/path and then store the value. + + Args: + parent_obj (dict): The dictionary containing the value to be set + path_to_input (list, str): A list of strings containing the key names to be used at each level + value (int, float, object): The value to store at the final level of nesting + error_on_missing_key (bool, optional): A flag to raise an error if any of the keys or sub-keys is not already present + + """ key = path_to_input[-1] path_to_input = path_to_input[:-1] @@ -193,7 +315,22 @@ def _set_nested_dict_value( def _rec_settattr( self, parent_obj, path_to_input, value, error_on_missing_key=True ): + """Convert nested dictionary to object.attribute format + + This method recursively creates nested objects to hold attributes in the same manner as the nested dictionary. + + Args: + parent_obj (object): The parent object that will contain this value (self when first called) + path_to_input (list, str): A list of strings containing the attribute names to be used at each level + value (int, float, object): The value to store at the final level of nesting + error_on_missing_key (bool, optional): A flag to raise an error if any of the keys or sub-keys is not already present + + """ + class ParamGroup: + + """Empty class to enable nesting and attribute storage""" + pass if len(path_to_input) == 1: @@ -220,6 +357,16 @@ class ParamGroup: ) def _pprint_dict(self, d, indent=0): + """Pretty print a dictionary + + Print a dictionary where nesting is visualized with indentation. + Useful for validation and debugging. + + Args: + d (dict): The dictionary to print + indent (int, optional): The amount of indentation to use for this level, default=0 + + """ for key, val in d.items(): for k in range(indent): print("| ", end="") @@ -234,6 +381,21 @@ def _pprint_dict(self, d, indent=0): print(f"{key}: {val} ({type(val)})") def _add_derived_quantities(self): + """Add derived quantities for convenience + + For convenience, it is helpful to store certain derived quantities in + the SimParams object that are not explicitly provided by the user. + For example, ``params.solver.t_steps`` is the integer number of steps + implied by the user-provided entries for ``t_final`` and ``dt``. Such + derived and/or convenience quantities are accumulated here. Note that + no error checking is performed on these values since they do not + appear in the yaml schema file, the expectation being that valid + quantities up till this point will result in valid derived values. + + Args: + None + + """ self.solver.t_steps = int(self.solver.t_final / self.solver.dt) self.solver.save_xdmf_interval_n = int( self.solver.save_xdmf_interval / self.solver.dt From 6f55a9e940aabe82e644d1eaae57461af72e1c26 Mon Sep 17 00:00:00 2001 From: Young Date: Thu, 23 Mar 2023 13:10:22 -0600 Subject: [PATCH 20/94] adding private methods and domain_creation template --- docs/technical_reference/data_stream.rst | 1 + docs/technical_reference/domain_creation.rst | 6 ++++++ docs/technical_reference/index.rst | 5 +++-- docs/technical_reference/mesh_manager.rst | 1 + 4 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 docs/technical_reference/domain_creation.rst diff --git a/docs/technical_reference/data_stream.rst b/docs/technical_reference/data_stream.rst index c19e4881..4fd32c77 100644 --- a/docs/technical_reference/data_stream.rst +++ b/docs/technical_reference/data_stream.rst @@ -3,3 +3,4 @@ DataStream .. automodule:: pvade.DataStream :members: + :private-members: \ No newline at end of file diff --git a/docs/technical_reference/domain_creation.rst b/docs/technical_reference/domain_creation.rst new file mode 100644 index 00000000..c0849cb3 --- /dev/null +++ b/docs/technical_reference/domain_creation.rst @@ -0,0 +1,6 @@ +DomainCreation +============== + +.. automodule:: pvade.geometry.template.TemplateDomainCreation + :members: + :private-members: \ No newline at end of file diff --git a/docs/technical_reference/index.rst b/docs/technical_reference/index.rst index 898141c8..5105fe82 100644 --- a/docs/technical_reference/index.rst +++ b/docs/technical_reference/index.rst @@ -4,7 +4,8 @@ Technical Reference .. toctree:: :maxdepth: 1 + parameters data_stream - flow_manager + domain_creation mesh_manager - parameters + flow_manager diff --git a/docs/technical_reference/mesh_manager.rst b/docs/technical_reference/mesh_manager.rst index 7c6d484a..5ad67595 100644 --- a/docs/technical_reference/mesh_manager.rst +++ b/docs/technical_reference/mesh_manager.rst @@ -3,3 +3,4 @@ MeshManager .. automodule:: pvade.geometry.MeshManager :members: + :private-members: \ No newline at end of file From 90e6633e89d26aed506b1c363696424004836352 Mon Sep 17 00:00:00 2001 From: Young Date: Thu, 23 Mar 2023 13:21:47 -0600 Subject: [PATCH 21/94] partial docstrings for flow --- pvade/DataStream.py | 20 ++-- pvade/FlowManager.py | 243 ++++++++++++++++++++++++++++++++++++------- pvade/Parameters.py | 4 +- 3 files changed, 217 insertions(+), 50 deletions(-) diff --git a/pvade/DataStream.py b/pvade/DataStream.py index 9bcf379e..93e784ad 100644 --- a/pvade/DataStream.py +++ b/pvade/DataStream.py @@ -13,25 +13,28 @@ class DataStream: """Input/Output and file writing class - This class manages the generation and updating of the saved xdmf files from each run along with command line outputs and log files. - + This class manages the generation and updating of the saved xdmf files + from each run along with command line outputs and log files. + Attributes: comm (MPI Communicator): An MPI communicator used by all PVade objects ndim (int): The number of dimensions in the problem num_procs (int): The total number of processors being used to solve the problem rank (int): A unique ID for each process in the range `[0, 1, ..., num_procs-1]` results_filename (str): The full path to the directory in which all saved files will be written. + """ def __init__(self, domain, flow, params): """Initialize the DataStream object - - This initializes an object that manages the I/O for all of PVade. - + + This initializes an object that manages the I/O for all of PVade. + Args: domain (:obj:`pvade.geometry.MeshManager.Domain`): A Domain object flow (:obj:`pvade.FlowManager.Flow`): A Flow object params (:obj:`pvade.Parameters.SimParams`): A SimParams object + """ self.comm = params.comm self.rank = params.rank @@ -47,17 +50,16 @@ def __init__(self, domain, flow, params): xdmf_file.write_function(flow.u_k, 0.0) xdmf_file.write_function(flow.p_k, 0.0) - def save_XDMF_files(self, flow, tt): """Write additional timestep to XDMF file This function appends the state of the flow at time `tt` to an existing XDMF file. - + Args: flow (:obj:`pvade.FlowManager.Flow`): A Flow object - tt (float): The time at which the current solution exists + tt (float): The time at which the current solution exists + """ with XDMFFile(self.comm, self.results_filename, "a") as xdmf_file: xdmf_file.write_function(flow.u_k, tt) xdmf_file.write_function(flow.p_k, tt) - diff --git a/pvade/FlowManager.py b/pvade/FlowManager.py index 6de4890b..db17b78b 100644 --- a/pvade/FlowManager.py +++ b/pvade/FlowManager.py @@ -1,3 +1,5 @@ +"""Summary +""" import numpy as np from math import log import ufl @@ -58,12 +60,18 @@ class Flow: """This class solves the CFD problem""" def __init__(self, domain): - """The class is initialised here + """Initialize the fluid solver + + This method initialize the Flow object, namely, it creates all the + necessary function spaces on the mesh, initializes key counting and + boolean variables and records certain characteristic quantities like + the minimum cell size and the number of degrees of freedom attributed + to both the pressure and velocity function spaces. Args: - domain (_type_): all variables related to the computational domain - """ + domain (:obj:`pvade.geometry.MeshManager.Domain`): A Domain object + """ # Pressure (Scalar) P1 = ufl.FiniteElement("Lagrange", domain.msh.ufl_cell(), 1) self.Q = fem.FunctionSpace(domain.msh, P1) @@ -115,11 +123,17 @@ def __init__(self, domain): print(f"Total num dofs = {self.num_Q_dofs + self.num_V_dofs}") def build_boundary_conditions(self, domain, params): - """define and apply boundary conditions + """Build the boundary conditions + + A method to manage the building of boundary conditions, including the + steps of identifying entities on the boundary, marking those degrees + of freedom either by the identified facets or a gmsh marker function, + and finally assembling a list of Boundary objects that enforce the + correct value. Args: - domain (_type_): computational domain - params (_type_): input parameters + domain (:obj:`pvade.geometry.MeshManager.Domain`): A Domain object + params (:obj:`pvade.Parameters.SimParams`): A SimParams object """ self.facet_dim = self.ndim - 1 @@ -139,29 +153,87 @@ def _locate_boundary_entities(self, domain, params): """functions that defines facets using coordinates Args: - domain (_type_): computational domain - params (_type_): input parameters + domain (:obj:`pvade.geometry.MeshManager.Domain`): A Domain object + params (:obj:`pvade.Parameters.SimParams`): A SimParams object """ def x_min_wall(x): + """Summary + + Args: + x (TYPE): Description + + Returns: + TYPE: Description + """ return np.isclose(x[0], params.domain.x_min) def x_max_wall(x): + """Summary + + Args: + x (TYPE): Description + + Returns: + TYPE: Description + """ return np.isclose(x[0], params.domain.x_max) def y_min_wall(x): + """Summary + + Args: + x (TYPE): Description + + Returns: + TYPE: Description + """ return np.isclose(x[1], params.domain.y_min) def y_max_wall(x): + """Summary + + Args: + x (TYPE): Description + + Returns: + TYPE: Description + """ return np.isclose(x[1], params.domain.y_max) if self.ndim == 3: + def z_min_wall(x): + """Summary + + Args: + x (TYPE): Description + + Returns: + TYPE: Description + """ return np.isclose(x[2], params.domain.z_min) def z_max_wall(x): + """Summary + + Args: + x (TYPE): Description + + Returns: + TYPE: Description + """ return np.isclose(x[2], params.domain.z_max) + def internal_surface(x): + """Summary + + Args: + x (TYPE): Description + + Returns: + TYPE: Description + """ x_mid = np.logical_and( params.domain.x_min < x[0], x[0] < params.domain.x_max ) @@ -251,6 +323,8 @@ def _locate_boundary_dofs_tags(self, domain): Args: domain (_type_): computational domain + + Deleted Parameters: params (_type_): input parameters """ self.x_min_V_dofs = locate_dofs_topological( @@ -270,10 +344,12 @@ def _locate_boundary_dofs_tags(self, domain): ) if self.ndim == 3: self.z_min_V_dofs = locate_dofs_topological( - self.V, self.facet_dim, domain.ft.find(domain.z_min_marker)) + self.V, self.facet_dim, domain.ft.find(domain.z_min_marker) + ) self.z_max_V_dofs = locate_dofs_topological( - self.V, self.facet_dim, domain.ft.find(domain.z_max_marker)) + self.V, self.facet_dim, domain.ft.find(domain.z_max_marker) + ) self.internal_surface_V_dofs = locate_dofs_topological( self.V, self.facet_dim, domain.ft.find(domain.internal_surface_marker) @@ -297,10 +373,12 @@ def _locate_boundary_dofs_tags(self, domain): if self.ndim == 3: self.z_min_Q_dofs = locate_dofs_topological( - self.Q, self.facet_dim, domain.ft.find(domain.z_min_marker)) + self.Q, self.facet_dim, domain.ft.find(domain.z_min_marker) + ) self.z_max_Q_dofs = locate_dofs_topological( - self.Q, self.facet_dim, domain.ft.find(domain.z_max_marker)) + self.Q, self.facet_dim, domain.ft.find(domain.z_max_marker) + ) self.internal_surface_Q_dofs = locate_dofs_topological( self.Q, self.facet_dim, domain.ft.find(domain.internal_surface_marker) @@ -311,10 +389,10 @@ def _applybc(self, value, domain, V, marker): condition for given inputs Args: - value : scalar or function set on the dof - domain : computational domain - V : function space - marker : boundary tag + value: scalar or function set on the dof + domain: computational domain + V: function space + marker: boundary tag Returns: dirichlet boundary conditions @@ -348,11 +426,22 @@ def _build_velocity_boundary_conditions(self, domain, params): # self.bcu.append(dirichletbc(self.zero_vec, self.z_max_V_dofs, self.V)) def _apply_type_bc(bc_name, functionspace, marker, bcname): + """Summary + + Args: + bc_name (TYPE): Description + functionspace (TYPE): Description + marker (TYPE): Description + bcname (TYPE): Description + + Returns: + TYPE: Description + """ if bc_name == "free": if domain.rank == 0: print("free bc_name on ", bcname) elif bc_name == "noslip": - bc = self._applybc(self.zero_vec,domain,functionspace,marker) + bc = self._applybc(self.zero_vec, domain, functionspace, marker) if domain.rank == 0: print("noslip bc_name on ", bcname) elif bc_name == "slip": @@ -362,7 +451,13 @@ def _apply_type_bc(bc_name, functionspace, marker, bcname): temp_func = functionspace.sub(2) bc = self._applybc(self.zero_scalar, domain, temp_func, marker) if domain.rank == 0: - print("Slip bc_name on ", bcname, "boundary normal velocity in ", bcname, "are set to 0.") + print( + "Slip bc_name on ", + bcname, + "boundary normal velocity in ", + bcname, + "are set to 0.", + ) else: if domain.rank == 0: print("bc_name not recognized") @@ -402,7 +497,7 @@ def _apply_type_bc(bc_name, functionspace, marker, bcname): elif self.ndim == 2: # iterate over all noudaries - for bclocation in "bc_ywall_min", "bc_ywall_max": + for bclocation in "bc_ywall_min", "bc_ywall_max": if bclocation == "bc_ywall_max": temp_marker = domain.y_max_marker temp_bcname = "y max" @@ -429,6 +524,14 @@ def _apply_type_bc(bc_name, functionspace, marker, bcname): ) def inflow_profile_expression(x): + """Summary + + Args: + x (TYPE): Description + + Returns: + TYPE: Description + """ inflow_values = np.zeros( (domain.msh.geometry.dim, x.shape[1]), dtype=PETSc.ScalarType ) @@ -440,7 +543,7 @@ def inflow_profile_expression(x): u_hub = params.fluid.u_ref z_hub = params.pv_array.elevation - if params.general.example == 'cylinder3d': + if params.general.example == "cylinder3d": inflow_values[0] = ( 16.0 * params.fluid.u_ref @@ -450,19 +553,28 @@ def inflow_profile_expression(x): * inflow_dz / H**4 ) - elif params.general.example == 'cylinder2d': + elif params.general.example == "cylinder2d": inflow_values[0] = ( - 4 * (params.fluid.u_ref) * np.sin( np.pi/8) * x[1] * (0.41 - x[1])/(0.41**2) + 4 + * (params.fluid.u_ref) + * np.sin(np.pi / 8) + * x[1] + * (0.41 - x[1]) + / (0.41**2) # 16.0 * params.fluid.u_ref * x[1] * inflow_dy / H**4 ) - elif params.general.example == 'panels': + elif params.general.example == "panels": inflow_values[0] = ( - (params.fluid.u_ref) * np.log(((x[2])-d0)/z0) / (np.log((z_hub-d0)/z0)) + (params.fluid.u_ref) + * np.log(((x[2]) - d0) / z0) + / (np.log((z_hub - d0) / z0)) # 4 * params.fluid.u_ref * np.sin(x[2]* np.pi/params.domain.z_max) * x[2] * (params.domain.z_max - x[2])/(params.domain.z_max**2) ) - elif params.general.example == 'panels2d': + elif params.general.example == "panels2d": inflow_values[0] = ( - (params.fluid.u_ref) * np.log(((x[1])-d0)/z0) / (np.log((z_hub-d0)/z0)) + (params.fluid.u_ref) + * np.log(((x[1]) - d0) / z0) + / (np.log((z_hub - d0) / z0)) # 4 * params.fluid.u_ref * np.sin(x[2]* np.pi/params.domain.z_max) * x[2] * (params.domain.z_max - x[2])/(params.domain.z_max**2) ) @@ -470,7 +582,7 @@ def inflow_profile_expression(x): self.inflow_profile = fem.Function(self.V) - if params.general.example in ['cylinder3d', 'cylinder2d']: + if params.general.example in ["cylinder3d", "cylinder2d"]: self.inflow_profile.interpolate(inflow_profile_expression) else: @@ -478,23 +590,24 @@ def inflow_profile_expression(x): d0 = 0.5 if self.ndim == 3: upper_cells = locate_entities( - domain.msh, self.ndim, lambda x: x[2] > d0+z0 + domain.msh, self.ndim, lambda x: x[2] > d0 + z0 ) lower_cells = locate_entities( - domain.msh, self.ndim, lambda x: x[2] <= d0+z0 + domain.msh, self.ndim, lambda x: x[2] <= d0 + z0 ) elif self.ndim == 2: upper_cells = locate_entities( - domain.msh, self.ndim, lambda x: x[1] > d0+z0 + domain.msh, self.ndim, lambda x: x[1] > d0 + z0 ) lower_cells = locate_entities( - domain.msh, self.ndim, lambda x: x[1] <= d0+z0 + domain.msh, self.ndim, lambda x: x[1] <= d0 + z0 ) - - self.inflow_profile.interpolate(lambda x: np.zeros( + self.inflow_profile.interpolate( + lambda x: np.zeros( (domain.msh.geometry.dim, x.shape[1]), dtype=PETSc.ScalarType - )) + ) + ) self.inflow_profile.interpolate(inflow_profile_expression, upper_cells) self.bcu.append(dirichletbc(self.inflow_profile, self.x_min_V_dofs)) @@ -518,7 +631,7 @@ def build_forms(self, domain, params): domain (_type_): _description_ params (_type_): _description_ - Returns: + No Longer Returned: _type_: _description_ """ # Define fluid properties @@ -560,7 +673,7 @@ def build_forms(self, domain, params): use_eddy_viscosity = True if use_eddy_viscosity: - # By default, don't use any eddy viscosity + # By default, don't use any eddy viscosity filter_scale = CellVolume(domain.msh) ** (1.0 / domain.msh.topology.dim) # Strain rate tensor, 0.5*(du_i/dx_j + du_j/dx_i) @@ -578,17 +691,34 @@ def build_forms(self, domain, params): else: self.nu_T = fem.Constant(domain.msh, 0.0) - # ================================================================# # DEFINE VARIATIONAL FORMS # ================================================================# U = 0.5 * (self.u_k1 + self.u) def epsilon(u): + """Summary + + Args: + u (TYPE): Description + + Returns: + TYPE: Description + """ return sym(nabla_grad(u)) # Define stress tensor def sigma(u, p, nu): + """Summary + + Args: + u (TYPE): Description + p (TYPE): Description + nu (TYPE): Description + + Returns: + TYPE: Description + """ return 2 * nu * epsilon(u) - p * Identity(len(u)) fractional_step_scheme = "IPCS" @@ -680,8 +810,12 @@ def sigma(u, p, nu): # self.J_history = [self.J_initial] self.dpdx_history = [0.0] - def _assemble_system(self,params): - """Assemble left-hand side matrices outside the time loop and set solver options""" + def _assemble_system(self, params): + """Assemble left-hand side matrices outside the time loop and set solver options + + Args: + params (TYPE): Description + """ self.A1 = fem.petsc.assemble_matrix(self.a1, bcs=self.bcu) self.A2 = fem.petsc.assemble_matrix(self.a2, bcs=self.bcp) @@ -755,7 +889,11 @@ def solve(self, params): self.first_call_to_solver = False def _solver_step_1(self, params): + """Summary + Args: + params (TYPE): Description + """ # Step 0: Re-assemble A1 since using an implicit convective term self.A1.zeroEntries() self.A1 = fem.petsc.assemble_matrix(self.A1, self.a1, bcs=self.bcu) @@ -780,6 +918,11 @@ def _solver_step_1(self, params): self.u_k.x.scatter_forward() def _solver_step_2(self, params): + """Summary + + Args: + params (TYPE): Description + """ # Step 2: Pressure correction step with self.b2.localForm() as loc: loc.set(0) @@ -798,6 +941,11 @@ def _solver_step_2(self, params): self.p_k.x.scatter_forward() def _solver_step_3(self, params): + """Summary + + Args: + params (TYPE): Description + """ # Step 3: Velocity correction step with self.b3.localForm() as loc: loc.set(0) @@ -812,6 +960,7 @@ def _solver_step_3(self, params): self.u_k.x.scatter_forward() def compute_cfl(self): + """Summary""" # Compute the CFL number # TODO: only do this on save/print steps? with self.b5.localForm() as loc: @@ -834,7 +983,23 @@ def compute_cfl(self): self.cfl_max = self.cfl_max[0] def adjust_dpdx_for_constant_flux(self, mpi_info): + """Summary + + Args: + mpi_info (TYPE): Description + """ + def pid_controller(J_init, J_history, dt): + """Summary + + Args: + J_init (TYPE): Description + J_history (TYPE): Description + dt (TYPE): Description + + Returns: + TYPE: Description + """ assert type(J_history) is list # K_p = 0.1 diff --git a/pvade/Parameters.py b/pvade/Parameters.py index 046fb9c4..8061ebe3 100644 --- a/pvade/Parameters.py +++ b/pvade/Parameters.py @@ -22,8 +22,8 @@ class SimParams: flat_schema_dict (dict): A flattened dictionary version of the yaml schema file used to set default values and provide valid command-line options. input_dict (dict): The aggregated input dictionary containing all command-line updated values and input-file values. input_file_dict (dict): The dictionary representing the input file. - num_procs (int): The total number of MPI processes. - rank (int): The MPI rank of this process, in the range `[0, 1, ..., num_procs-1]`. + num_procs (int): The total number of processors being used to solve the problem + rank (int): A unique ID for each process in the range `[0, 1, ..., num_procs-1]` schema_dict (dict): The unflattened (nested) representation of the yaml schema dictionary. """ From e49582b16bf3961f8e64abe73bf07b71b8790af9 Mon Sep 17 00:00:00 2001 From: Young Date: Thu, 23 Mar 2023 13:23:22 -0600 Subject: [PATCH 22/94] track private members in flow --- docs/technical_reference/flow_manager.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/technical_reference/flow_manager.rst b/docs/technical_reference/flow_manager.rst index 57098262..073df6d3 100644 --- a/docs/technical_reference/flow_manager.rst +++ b/docs/technical_reference/flow_manager.rst @@ -3,3 +3,4 @@ FlowManager .. automodule:: pvade.FlowManager :members: + :private-members: \ No newline at end of file From dad30eee2f0b7400436099a66821082ff04ef252 Mon Sep 17 00:00:00 2001 From: Young Date: Thu, 23 Mar 2023 14:44:23 -0600 Subject: [PATCH 23/94] finishing flow manager docstrings --- pvade/FlowManager.py | 220 ++++++++++++++++++++++++++++--------------- 1 file changed, 145 insertions(+), 75 deletions(-) diff --git a/pvade/FlowManager.py b/pvade/FlowManager.py index db17b78b..ad669f72 100644 --- a/pvade/FlowManager.py +++ b/pvade/FlowManager.py @@ -134,6 +134,7 @@ def build_boundary_conditions(self, domain, params): Args: domain (:obj:`pvade.geometry.MeshManager.Domain`): A Domain object params (:obj:`pvade.Parameters.SimParams`): A SimParams object + """ self.facet_dim = self.ndim - 1 @@ -150,89 +151,95 @@ def build_boundary_conditions(self, domain, params): self._build_pressure_boundary_conditions(domain, params) def _locate_boundary_entities(self, domain, params): - """functions that defines facets using coordinates + """Find facet entities on boundaries + + This function builds a complete list of the facets on the x_min, + x_max, y_min, y_max, z_min, and z_max walls plus all internal + surfaces. It makes use of the ``x_min_facets = + locate_entities_boundary()`` function from dolfinx. Args: domain (:obj:`pvade.geometry.MeshManager.Domain`): A Domain object params (:obj:`pvade.Parameters.SimParams`): A SimParams object + """ def x_min_wall(x): - """Summary + """Identify entities on the x_min wall Args: - x (TYPE): Description + x (np.ndarray): An array of coordinates Returns: - TYPE: Description + bool: An array mask, true for points on x_min wall """ return np.isclose(x[0], params.domain.x_min) def x_max_wall(x): - """Summary + """Identify entities on the x_max wall Args: - x (TYPE): Description + x (np.ndarray): An array of coordinates Returns: - TYPE: Description + bool: An array mask, true for points on x_max wall """ return np.isclose(x[0], params.domain.x_max) def y_min_wall(x): - """Summary + """Identify entities on the y_min wall Args: - x (TYPE): Description + x (np.ndarray): An array of coordinates Returns: - TYPE: Description + bool: An array mask, true for points on y_min wall """ return np.isclose(x[1], params.domain.y_min) def y_max_wall(x): - """Summary + """Identify entities on the y_max wall Args: - x (TYPE): Description + x (np.ndarray): An array of coordinates Returns: - TYPE: Description + bool: An array mask, true for points on y_max wall """ return np.isclose(x[1], params.domain.y_max) if self.ndim == 3: def z_min_wall(x): - """Summary + """Identify entities on the z_min wall Args: - x (TYPE): Description + x (np.ndarray): An array of coordinates Returns: - TYPE: Description + bool: An array mask, true for points on z_min wall """ return np.isclose(x[2], params.domain.z_min) def z_max_wall(x): - """Summary + """Identify entities on the z_max wall Args: - x (TYPE): Description + x (np.ndarray): An array of coordinates Returns: - TYPE: Description + bool: An array mask, true for points on z_max wall """ return np.isclose(x[2], params.domain.z_max) def internal_surface(x): - """Summary + """Identify entities on the internal surfaces Args: - x (TYPE): Description + x (np.ndarray): An array of coordinates Returns: - TYPE: Description + bool: An array mask, true for points on internal surfaces """ x_mid = np.logical_and( params.domain.x_min < x[0], x[0] < params.domain.x_max @@ -273,7 +280,16 @@ def internal_surface(x): ) def _locate_boundary_dofs(self): - """Locate dof on boundary for a given function space""" + """Associate degrees of freedom with boundary facets + + This function takes the previously-constructed facets from + ``_locate_boundary_entities`` and finds the corresponding degrees of + freedom for use in the actual boundary condition specification. + + Args: + None + + """ self.x_min_V_dofs = locate_dofs_topological( self.V, self.facet_dim, self.x_min_facets ) @@ -319,13 +335,17 @@ def _locate_boundary_dofs(self): ) def _locate_boundary_dofs_tags(self, domain): - """Locate DOFS using boundary tags + """Associate degrees of freedom with marker functions + + This function uses the marker information in the gmsh specification to + find the corresponding degrees of freedom for use in the actual + boundary condition specification. Note that this method does not + require access to the facet information computed with + ``_locate_boundary_entities``. Args: - domain (_type_): computational domain + domain (:obj:`pvade.geometry.MeshManager.Domain`): A Domain object - Deleted Parameters: - params (_type_): input parameters """ self.x_min_V_dofs = locate_dofs_topological( self.V, self.facet_dim, domain.ft.find(domain.x_min_marker) @@ -385,17 +405,19 @@ def _locate_boundary_dofs_tags(self, domain): ) def _applybc(self, value, domain, V, marker): - """Function that applies a type of boundary - condition for given inputs - + """Apply a single boundary condition + + This function builds a single Dirichlet boundary condition given the value, gmsh marker, and function space. + Args: - value: scalar or function set on the dof - domain: computational domain - V: function space - marker: boundary tag - + value (float, dolfinx.fem.Function): Scalar or function set on the dof + domain (:obj:`pvade.geometry.MeshManager.Domain`): A Domain object + V (:obj:`dolfinx.fem.FunctionSpace`): The function space on which the boundary condition will be acting + marker (int): boundary tag created in gmsh + Returns: - dirichlet boundary conditions + :obj:`dolfinx.fem.dirichletbc`: Dirichlet boundary conditions + """ dofs = locate_dofs_topological(V, self.facet_dim, domain.ft.find(marker)) @@ -406,11 +428,14 @@ def _applybc(self, value, domain, V, marker): return bc def _build_velocity_boundary_conditions(self, domain, params): - """Sets boundary condition on the velocity + """Build all boundary conditions on velocity + + This method builds all the boundary conditions associated with velocity and stores in a list, ``bcu``. Args: - domain (_type_): computational domain - params (_type_): input parameters + domain (:obj:`pvade.geometry.MeshManager.Domain`): A Domain object + params (:obj:`pvade.Parameters.SimParams`): A SimParams object + """ # Define velocity boundary conditions self.bcu = [] @@ -524,13 +549,13 @@ def _apply_type_bc(bc_name, functionspace, marker, bcname): ) def inflow_profile_expression(x): - """Summary + """Define an inflow expression for use as boundary condition Args: - x (TYPE): Description + x (np.ndarray): Array of coordinates Returns: - TYPE: Description + np.ndarray: Value of velocity at each coordinate in input array """ inflow_values = np.zeros( (domain.msh.geometry.dim, x.shape[1]), dtype=PETSc.ScalarType @@ -613,11 +638,13 @@ def inflow_profile_expression(x): self.bcu.append(dirichletbc(self.inflow_profile, self.x_min_V_dofs)) def _build_pressure_boundary_conditions(self, domain, params): - """Sets boundary condition on the velocity + """Build all boundary conditions on pressure + + This method builds all the boundary conditions associated with pressure and stores in a list, ``bcp``. Args: - domain (_type_): computational domain - params (_type_): input parameters + domain (:obj:`pvade.geometry.MeshManager.Domain`): A Domain object + params (:obj:`pvade.Parameters.SimParams`): A SimParams object """ # Define pressure boundary conditions self.bcp = [] @@ -625,14 +652,20 @@ def _build_pressure_boundary_conditions(self, domain, params): self.bcp.append(dirichletbc(self.zero_scalar, self.x_max_Q_dofs, self.Q)) def build_forms(self, domain, params): - """Builds variational statements + """Builds all variational statements + + This method creates all the functions, expressions, and variational + forms that will be needed for the numerical solution of Navier Stokes + using a fractional step method. This includes the calculation of a + tentative velocity, the calculation of the change in pressure + required to correct the tentative velocity to enforce continuity, and + the update to the velocity field to reflect this change in + pressure. Args: - domain (_type_): _description_ - params (_type_): _description_ + domain (:obj:`pvade.geometry.MeshManager.Domain`): A Domain object + params (:obj:`pvade.Parameters.SimParams`): A SimParams object - No Longer Returned: - _type_: _description_ """ # Define fluid properties self.dpdx = fem.Constant(domain.msh, (0.0, 0.0, 0.0)) @@ -697,27 +730,27 @@ def build_forms(self, domain, params): U = 0.5 * (self.u_k1 + self.u) def epsilon(u): - """Summary + """Convenience expression for sym(nabla_grad(u)) Args: - u (TYPE): Description + u (dolfinx.fem.Function): A dolfinx function Returns: - TYPE: Description + ufl.form: sym(nabla_grad(u)) """ return sym(nabla_grad(u)) # Define stress tensor def sigma(u, p, nu): - """Summary + """Convenience expression for fluid stress, sigma Args: - u (TYPE): Description - p (TYPE): Description - nu (TYPE): Description + u (dolfinx.fem.Function): Velocity + p (dolfinx.fem.Function): Pressure + nu (float, dolfinx.fem.Function): Viscosity Returns: - TYPE: Description + ufl.form: Stress in fluid, $2\nu \epsilon (u)$ """ return 2 * nu * epsilon(u) - p * Identity(len(u)) @@ -811,10 +844,16 @@ def sigma(u, p, nu): self.dpdx_history = [0.0] def _assemble_system(self, params): - """Assemble left-hand side matrices outside the time loop and set solver options + """Pre-assemble all LHS matrices and RHS vectors + + Here we pre-assemble all the forms corresponding to the left-hand side + matrices and right-hand side vectors once outside the time loop. This + will enable us to re-use certain features like the sparsity pattern + during the timestepping without any modification of the function + calls. Args: - params (TYPE): Description + params (:obj:`pvade.Parameters.SimParams`): A SimParams object """ self.A1 = fem.petsc.assemble_matrix(self.a1, bcs=self.bcu) @@ -857,10 +896,15 @@ def _assemble_system(self, params): self.solver_5.setFromOptions() def solve(self, params): - """solve the variational forms + """Solve for a single timestep advancement + + Here we perform the three-step solution process (tentative velocity, + pressure correction, velocity update) to advance the fluid simulation + a single timestep. Additionally, we calculate the new CFL number + associated with the latest velocity solution. Args: - params (_type_): _description_ + params (:obj:`pvade.Parameters.SimParams`): A SimParams object """ if self.first_call_to_solver: if self.rank == 0: @@ -889,10 +933,13 @@ def solve(self, params): self.first_call_to_solver = False def _solver_step_1(self, params): - """Summary + """Solve step 1: tentative velocity + + Here we calculate the tentative velocity which, not guaranteed to be + divergence free. Args: - params (TYPE): Description + params (:obj:`pvade.Parameters.SimParams`): A SimParams object """ # Step 0: Re-assemble A1 since using an implicit convective term self.A1.zeroEntries() @@ -918,11 +965,15 @@ def _solver_step_1(self, params): self.u_k.x.scatter_forward() def _solver_step_2(self, params): - """Summary + """Solve step 2: pressure correction + + Here we calculate the pressure field that would be required to correct + the tentative velocity such that it is divergence free. Args: - params (TYPE): Description + params (:obj:`pvade.Parameters.SimParams`): A SimParams object """ + # Step 0: Re-assemble A1 since using an implicit convective term # Step 2: Pressure correction step with self.b2.localForm() as loc: loc.set(0) @@ -941,10 +992,13 @@ def _solver_step_2(self, params): self.p_k.x.scatter_forward() def _solver_step_3(self, params): - """Summary + """Solve step 3: velocity update + + Here we update the tentative velocity with the effect of the modified, + continuity-enforcing pressure field. Args: - params (TYPE): Description + params (:obj:`pvade.Parameters.SimParams`): A SimParams object """ # Step 3: Velocity correction step with self.b3.localForm() as loc: @@ -960,9 +1014,16 @@ def _solver_step_3(self, params): self.u_k.x.scatter_forward() def compute_cfl(self): - """Summary""" - # Compute the CFL number - # TODO: only do this on save/print steps? + """Solve for the CFL number + + Using the velocity, timestep size, and cell sizes, we calculate a CFL + number at every mesh cell. From that, we select the single highest + value of CFL number and record it for the purposes of monitoring + simulation stability. + + Args: + None + """ with self.b5.localForm() as loc: loc.set(0) @@ -982,11 +1043,20 @@ def compute_cfl(self): self.comm.Allreduce(cfl_max_local, self.cfl_max, op=MPI.MAX) self.cfl_max = self.cfl_max[0] - def adjust_dpdx_for_constant_flux(self, mpi_info): - """Summary + def adjust_dpdx_for_constant_flux(self): + """Adjust the forcing term, ``dpdx``, to maintain flowrate + + Here we calculate what the value of the constant driving + pressure/force, ``dpdx``, should be adjusted to to maintain a + constant flux through the domain. This is a useful option if + performing a periodic simulation in which the flux will slowly decay + due to viscous dissipation. The amount of change in ``dpdx`` is + calculated by comparing the current flux to the flux measured in the + initial condition and then employing a PID controller to adjust the + driving force to seek the target defined by the initial condition. Args: - mpi_info (TYPE): Description + None """ def pid_controller(J_init, J_history, dt): @@ -1037,7 +1107,7 @@ def pid_controller(J_init, J_history, dt): dpdx_val = pid_controller(self.J_initial, self.J_history, float(self.dt_c)) self.dpdx_history.append(dpdx_val) - if dpdx_val < 0.0 and mpi_info["rank"] == 0: + if dpdx_val < 0.0: print("WARNING: dpdx_val = %f" % (dpdx_val)) self.dpdx.assign(Constant((dpdx_val, 0.0, 0.0))) From d39b268f66633949ccc7e6e973cfef2035994111 Mon Sep 17 00:00:00 2001 From: arswalid Date: Mon, 27 Mar 2023 13:15:25 -0600 Subject: [PATCH 24/94] addition of docs --- .../domain_creation_panels.rst | 6 +++ docs/technical_reference/index.rst | 3 ++ docs/technical_reference/mesh_manager_2d.rst | 6 +++ docs/technical_reference/mesh_manager_3d.rst | 6 +++ pvade/geometry/MeshManager2d.py | 18 ++++----- pvade/geometry/MeshManager3d.py | 40 +++++++++++++------ pvade/geometry/cylinder2d/DomainCreation.py | 10 +++++ pvade/geometry/cylinder3d/DomainCreation.py | 12 +++++- pvade/geometry/panels/DomainCreation.py | 22 ++++++++-- pvade/geometry/panels2d/DomainCreation.py | 12 +++++- .../template/TemplateDomainCreation.py | 27 ++++++++++++- 11 files changed, 133 insertions(+), 29 deletions(-) create mode 100644 docs/technical_reference/domain_creation_panels.rst create mode 100644 docs/technical_reference/mesh_manager_2d.rst create mode 100644 docs/technical_reference/mesh_manager_3d.rst diff --git a/docs/technical_reference/domain_creation_panels.rst b/docs/technical_reference/domain_creation_panels.rst new file mode 100644 index 00000000..0aff010c --- /dev/null +++ b/docs/technical_reference/domain_creation_panels.rst @@ -0,0 +1,6 @@ +DomainCreationPanels +=========== + +.. automodule:: pvade.geometry.panels.DomainCreation + :members: + :private-members: \ No newline at end of file diff --git a/docs/technical_reference/index.rst b/docs/technical_reference/index.rst index 5105fe82..e42a7a56 100644 --- a/docs/technical_reference/index.rst +++ b/docs/technical_reference/index.rst @@ -6,6 +6,9 @@ Technical Reference parameters data_stream + domain_creation_panels domain_creation mesh_manager + mesh_manager_2d + mesh_manager_3d flow_manager diff --git a/docs/technical_reference/mesh_manager_2d.rst b/docs/technical_reference/mesh_manager_2d.rst new file mode 100644 index 00000000..0649b4ac --- /dev/null +++ b/docs/technical_reference/mesh_manager_2d.rst @@ -0,0 +1,6 @@ +MeshManager2D +=========== + +.. automodule:: pvade.geometry.MeshManager2d + :members: + :private-members: \ No newline at end of file diff --git a/docs/technical_reference/mesh_manager_3d.rst b/docs/technical_reference/mesh_manager_3d.rst new file mode 100644 index 00000000..4edb54ed --- /dev/null +++ b/docs/technical_reference/mesh_manager_3d.rst @@ -0,0 +1,6 @@ +MeshManager3d +=========== + +.. automodule:: pvade.geometry.MeshManager3d + :members: + :private-members: \ No newline at end of file diff --git a/pvade/geometry/MeshManager2d.py b/pvade/geometry/MeshManager2d.py index 4f34dc70..2706652b 100644 --- a/pvade/geometry/MeshManager2d.py +++ b/pvade/geometry/MeshManager2d.py @@ -13,7 +13,7 @@ # from pvopt.geometry.panels.DomainCreation import * class FSIDomain: - """This class creates the computational domain + """This class creates the computational domain for 2D computational domains (2D panels, 2D cylinder) """ def __init__(self, params): """The class is initialised here @@ -33,16 +33,16 @@ def __init__(self, params): problem = self.params.general.example if problem == "panels": - from pvopt.geometry.panels.DomainCreation import DomainCreation + from pvade.geometry.panels.DomainCreation import DomainCreation dim = 3 elif problem == "panels2d": - from pvopt.geometry.panels2d.DomainCreation import DomainCreation + from pvade.geometry.panels2d.DomainCreation import DomainCreation dim = 2 elif problem == "cylinder3d": - from pvopt.geometry.cylinder3d.DomainCreation import DomainCreation + from pvade.geometry.cylinder3d.DomainCreation import DomainCreation dim = 3 elif problem == "cylinder2d": - from pvopt.geometry.cylinder2d.DomainCreation import DomainCreation + from pvade.geometry.cylinder2d.DomainCreation import DomainCreation dim = 2 # define markers for boundaries @@ -74,13 +74,13 @@ def build(self): problem = self.params.general.example if problem == "panels": - from pvopt.geometry.panels.DomainCreation import DomainCreation + from pvade.geometry.panels.DomainCreation import DomainCreation elif problem == "panels2d": - from pvopt.geometry.panels2d.DomainCreation import DomainCreation + from pvade.geometry.panels2d.DomainCreation import DomainCreation elif problem == "cylinder3d": - from pvopt.geometry.cylinder3d.DomainCreation import DomainCreation + from pvade.geometry.cylinder3d.DomainCreation import DomainCreation elif problem == "cylinder2d": - from pvopt.geometry.cylinder2d.DomainCreation import DomainCreation + from pvade.geometry.cylinder2d.DomainCreation import DomainCreation geometry = DomainCreation(self.params) diff --git a/pvade/geometry/MeshManager3d.py b/pvade/geometry/MeshManager3d.py index 0650f018..f069d026 100644 --- a/pvade/geometry/MeshManager3d.py +++ b/pvade/geometry/MeshManager3d.py @@ -13,11 +13,12 @@ # from pvopt.geometry.panels.DomainCreation import * class FSIDomain: - """This class creates the computational domain + """This class creates the computational domain for 3D examples(3D panels, 3D cylinder) """ def __init__(self, params): """The class is initialised here - + Depending on the example we are solving, we import the corresponding DomainCrearion file + We define markers which will be used for boundary tag asignment Args: params (input parameters): input parameters available in the input file """ @@ -33,16 +34,16 @@ def __init__(self, params): problem = self.params.general.example if problem == "panels": - from pvopt.geometry.panels.DomainCreation import DomainCreation + from pvade.geometry.panels.DomainCreation import DomainCreation dim = 3 elif problem == "panels2d": - from pvopt.geometry.panels2d.DomainCreation import DomainCreation + from pvade.geometry.panels2d.DomainCreation import DomainCreation dim = 2 elif problem == "cylinder3d": - from pvopt.geometry.cylinder3d.DomainCreation import DomainCreation + from pvade.geometry.cylinder3d.DomainCreation import DomainCreation dim = 3 elif problem == "cylinder2d": - from pvopt.geometry.cylinder2d.DomainCreation import DomainCreation + from pvade.geometry.cylinder2d.DomainCreation import DomainCreation dim = 2 # define markers for boundaries @@ -64,7 +65,7 @@ def __init__(self, params): self.fluid_marker = 8 def build(self): - """This function call builds the geometry using Gmsh + """This function call builds the geometry, marks the boundaries and creates a mesh using Gmsh. """ self.mesh_comm = MPI.COMM_WORLD self.model_rank = 0 @@ -74,13 +75,13 @@ def build(self): problem = self.params.general.example if problem == "panels": - from pvopt.geometry.panels.DomainCreation import DomainCreation + from pvade.geometry.panels.DomainCreation import DomainCreation elif problem == "panels2d": - from pvopt.geometry.panels2d.DomainCreation import DomainCreation + from pvade.geometry.panels2d.DomainCreation import DomainCreation elif problem == "cylinder3d": - from pvopt.geometry.cylinder3d.DomainCreation import DomainCreation + from pvade.geometry.cylinder3d.DomainCreation import DomainCreation elif problem == "cylinder2d": - from pvopt.geometry.cylinder2d.DomainCreation import DomainCreation + from pvade.geometry.cylinder2d.DomainCreation import DomainCreation geometry = DomainCreation(self.params) @@ -109,7 +110,9 @@ def build(self): self.ft.name = f"{self.msh.name}_facets" def read(self): - """Read the mesh from external file located in output/mesh + """Read the mesh from an external file. + The User can load an existing mesh file (mesh.xdmf) + and use it to solve the CFD/CSD problem """ if self.rank == 0: print("Reading the mesh from file ...") @@ -124,7 +127,8 @@ def read(self): def _mark_surfaces(self): - """Creates boundary tags using gmsh + """ This function call iterates over all boundaries and assigns tags for each boundary. + The Tags are being used when appying boundaty condition. """ # Loop through all surfaces to find periodic tags surf_ids = self.pv_model.occ.getEntities(2) @@ -180,6 +184,11 @@ def _mark_surfaces(self): self.pv_model.setPhysicalName(2, self.internal_surface_marker, "panel_surface") def _set_length_scales_mod(self): + """ This function call defines the characteristic length for the mesh in locations of interst + LcMin,LcMax,DistMin and DistMax are used to create a refined mesh in specific locations + which results in a high fidelity mesh without using a uniform element size in the whole mesh. + """ + res_min = self.params.domain.l_char if self.mesh_comm.rank == self.model_rank: # Define a distance field from the immersed panels @@ -350,6 +359,9 @@ def _enforce_periodicity(self): ) def _generate_mesh(self): + """ This function call generates the mesh. + + """ if self.rank == 0: print("Starting mesh generation... ", end="") @@ -386,6 +398,8 @@ def write_mesh_file(self): os.makedirs(self.params.general.output_dir_mesh) gmsh.write('%s/mesh.msh' % (self.params.general.output_dir_mesh)) gmsh.write('%s/mesh.vtk' % (self.params.general.output_dir_mesh)) + + # def create_mesh(mesh, clean_points, cell_type): # cells = mesh.get_cells_type(cell_type) # cell_data = mesh.get_cell_data("gmsh:physical", cell_type) diff --git a/pvade/geometry/cylinder2d/DomainCreation.py b/pvade/geometry/cylinder2d/DomainCreation.py index ee8f7cb1..d5bb4ef9 100644 --- a/pvade/geometry/cylinder2d/DomainCreation.py +++ b/pvade/geometry/cylinder2d/DomainCreation.py @@ -14,7 +14,12 @@ class FSIDomain: def __init__(self, params): + """ Initialize the DomainCreation object + This initializes an object that creates the computational domain. + Args: + params (:obj:`pvade.Parameters.SimParams`): A SimParams object + """ # Get MPI communicators self.comm = MPI.COMM_WORLD self.rank = self.comm.Get_rank() @@ -24,6 +29,11 @@ def __init__(self, params): self.params = params def build(self): + """ This function creates the computational domain for a flow around a 2D cylinder. + + Returns: + The function returns gmsh.model which contains the geometric description of the computational domain + """ gmsh.initialize() gmsh.option.setNumber("General.Terminal", 0) gmsh.option.setNumber("Mesh.MshFileVersion", 2.2) diff --git a/pvade/geometry/cylinder3d/DomainCreation.py b/pvade/geometry/cylinder3d/DomainCreation.py index 8a212414..3031dd5d 100644 --- a/pvade/geometry/cylinder3d/DomainCreation.py +++ b/pvade/geometry/cylinder3d/DomainCreation.py @@ -12,10 +12,20 @@ class DomainCreation(TemplateDomainCreation): def __init__(self, params): + """ Initialize the DomainCreation object + This initializes an object that creates the computational domain. + + Args: + params (:obj:`pvade.Parameters.SimParams`): A SimParams object + """ super().__init__(params) def build(self): - + """ This function creates the computational domain for a flow around a 3D cylinder. + + Returns: + The function returns gmsh.model which contains the geometric description of the computational domain + """ # Compute and store some useful geometric quantities self.x_span = self.params.domain.x_max - self.params.domain.x_min self.y_span = self.params.domain.y_max - self.params.domain.y_min diff --git a/pvade/geometry/panels/DomainCreation.py b/pvade/geometry/panels/DomainCreation.py index d4124793..0d5ea9a3 100644 --- a/pvade/geometry/panels/DomainCreation.py +++ b/pvade/geometry/panels/DomainCreation.py @@ -2,7 +2,7 @@ from dolfinx.fem import VectorFunctionSpace, FunctionSpace from dolfinx.cpp import mesh as cppmesh from mpi4py import MPI -from pvopt.geometry.template.TemplateDomainCreation import TemplateDomainCreation +from pvade.geometry.template.TemplateDomainCreation import TemplateDomainCreation import gmsh import numpy as np @@ -11,15 +11,31 @@ import ufl import dolfinx -# import meshio +import meshio class DomainCreation(TemplateDomainCreation): + """_summary_ test + + Args: + TemplateDomainCreation (_type_): _description_ + """ def __init__(self, params): + """ Initialize the DomainCreation object + This initializes an object that creates the computational domain. + + Args: + params (:obj:`pvade.Parameters.SimParams`): A SimParams object + """ super().__init__(params) def build(self): - + """ This function creates the computational domain for a 3d simulation involving N panels. + The panels are set at a distance apart, rotated at an angle theta and are elevated with a distance H from the ground. + + Returns: + The function returns gmsh.model which contains the geometric description of the computational domain + """ # Compute and store some useful geometric quantities self.x_span = self.params.domain.x_max - self.params.domain.x_min self.y_span = self.params.domain.y_max - self.params.domain.y_min diff --git a/pvade/geometry/panels2d/DomainCreation.py b/pvade/geometry/panels2d/DomainCreation.py index 67d8b315..5221a32c 100644 --- a/pvade/geometry/panels2d/DomainCreation.py +++ b/pvade/geometry/panels2d/DomainCreation.py @@ -12,7 +12,12 @@ class DomainCreation: def __init__(self, params): + """ Initialize the DomainCreation object + This initializes an object that creates the computational domain. + Args: + params (:obj:`pvade.Parameters.SimParams`): A SimParams object + """ # Get MPI communicators self.comm = MPI.COMM_WORLD self.rank = self.comm.Get_rank() @@ -31,7 +36,12 @@ def __init__(self, params): self.fluid_marker = 8 def build(self): - + """ This function creates the computational domain for a 2d simulation involving N panels. + The panels are set at a distance apart, rotated at an angle theta and are elevated with a distance H from the ground. + + Returns: + The function returns gmsh.model which contains the geometric description of the computational domain + """ self.mesh_comm = MPI.COMM_WORLD self.model_rank = 0 self.gdim = 3 diff --git a/pvade/geometry/template/TemplateDomainCreation.py b/pvade/geometry/template/TemplateDomainCreation.py index a13e71d5..bd454e20 100644 --- a/pvade/geometry/template/TemplateDomainCreation.py +++ b/pvade/geometry/template/TemplateDomainCreation.py @@ -9,8 +9,16 @@ class TemplateDomainCreation: + """ This class creates the geometry used for a given example. + Gmsh is used to create the computational domain + + """ def __init__(self, params): + """ The class is initialised here + Args: + params (_type_): _description_ + """ # Store a full copy of params on this object self.params = params @@ -40,16 +48,31 @@ def __init__(self, params): self.gmsh_model.setCurrent("domain") def build(self): + """ + panels: This function creates the computational domain for a 3d simulation involving N panels. + The panels are set at a distance apart, rotated at an angle theta and are elevated with a distance H from the ground. + panels2d: This function creates the computational domain for a 2d simulation involving N panels. + The panels are set at a distance apart, rotated at an angle theta and are elevated with a distance H from the ground. + cylinder3d: This function creates the computational domain for a flow around a 3D cylinder. + cylinder2d: This function creates the computational domain for a flow around a 2D cylinder. + Returns: + The function returns gmsh.model which contains the geometric description of the computational domain + """ pass def set_length_scales(self): - + """ This function call defines the characteristic length for the mesh in locations of interst + LcMin,LcMax,DistMin and DistMax are used to create a refined mesh in specific locations + which results in a high fidelity mesh without using a uniform element size in the whole mesh. + """ if self.rank == 0: all_pts = self.gmsh_model.occ.getEntities(0) self.gmsh_model.mesh.setSize(all_pts, self.params.domain.l_char) def mark_surfaces(self): - """Creates boundary tags using gmsh""" + """ This function call iterates over all boundaries and assigns tags for each boundary. + The Tags are being used when appying boundaty condition. + """ # Loop through all surfaces to find periodic tags surf_ids = self.gmsh_model.occ.getEntities(2) From c0a1ab4581d6fce74f51e72441578bab98c79911 Mon Sep 17 00:00:00 2001 From: Young Date: Mon, 27 Mar 2023 13:48:29 -0600 Subject: [PATCH 25/94] getting rid of html build warnings --- .../domain_creation_panels.rst | 2 +- docs/technical_reference/mesh_manager_2d.rst | 2 +- docs/technical_reference/mesh_manager_3d.rst | 2 +- pvade/geometry/MeshManager3d.py | 193 ++++++++++-------- 4 files changed, 108 insertions(+), 91 deletions(-) diff --git a/docs/technical_reference/domain_creation_panels.rst b/docs/technical_reference/domain_creation_panels.rst index 0aff010c..8c585df9 100644 --- a/docs/technical_reference/domain_creation_panels.rst +++ b/docs/technical_reference/domain_creation_panels.rst @@ -1,5 +1,5 @@ DomainCreationPanels -=========== +==================== .. automodule:: pvade.geometry.panels.DomainCreation :members: diff --git a/docs/technical_reference/mesh_manager_2d.rst b/docs/technical_reference/mesh_manager_2d.rst index 0649b4ac..8b6b2ad1 100644 --- a/docs/technical_reference/mesh_manager_2d.rst +++ b/docs/technical_reference/mesh_manager_2d.rst @@ -1,5 +1,5 @@ MeshManager2D -=========== +============= .. automodule:: pvade.geometry.MeshManager2d :members: diff --git a/docs/technical_reference/mesh_manager_3d.rst b/docs/technical_reference/mesh_manager_3d.rst index 4edb54ed..4bafc60a 100644 --- a/docs/technical_reference/mesh_manager_3d.rst +++ b/docs/technical_reference/mesh_manager_3d.rst @@ -1,5 +1,5 @@ MeshManager3d -=========== +============= .. automodule:: pvade.geometry.MeshManager3d :members: diff --git a/pvade/geometry/MeshManager3d.py b/pvade/geometry/MeshManager3d.py index f069d026..81c71c80 100644 --- a/pvade/geometry/MeshManager3d.py +++ b/pvade/geometry/MeshManager3d.py @@ -8,17 +8,21 @@ import os import time import ufl -import dolfinx +import dolfinx + # import meshio # from pvopt.geometry.panels.DomainCreation import * class FSIDomain: - """This class creates the computational domain for 3D examples(3D panels, 3D cylinder) """ + This class creates the computational domain for 3D examples(3D panels, 3D cylinder) + """ + def __init__(self, params): """The class is initialised here Depending on the example we are solving, we import the corresponding DomainCrearion file We define markers which will be used for boundary tag asignment + Args: params (input parameters): input parameters available in the input file """ @@ -30,25 +34,29 @@ def __init__(self, params): # Store a full copy of params on this object self.params = params - + problem = self.params.general.example if problem == "panels": - from pvade.geometry.panels.DomainCreation import DomainCreation - dim = 3 + from pvade.geometry.panels.DomainCreation import DomainCreation + + dim = 3 elif problem == "panels2d": - from pvade.geometry.panels2d.DomainCreation import DomainCreation - dim = 2 + from pvade.geometry.panels2d.DomainCreation import DomainCreation + + dim = 2 elif problem == "cylinder3d": - from pvade.geometry.cylinder3d.DomainCreation import DomainCreation - dim = 3 + from pvade.geometry.cylinder3d.DomainCreation import DomainCreation + + dim = 3 elif problem == "cylinder2d": - from pvade.geometry.cylinder2d.DomainCreation import DomainCreation - dim = 2 + from pvade.geometry.cylinder2d.DomainCreation import DomainCreation - # define markers for boundaries + dim = 2 + + # define markers for boundaries if dim == 3: - self.x_min_marker = 1 + self.x_min_marker = 1 self.y_min_marker = 2 self.z_min_marker = 3 self.x_max_marker = 4 @@ -56,7 +64,7 @@ def __init__(self, params): self.z_max_marker = 6 self.internal_surface_marker = 7 self.fluid_marker = 8 - elif dim ==2: + elif dim == 2: self.x_min_marker = 1 self.y_min_marker = 2 self.x_max_marker = 4 @@ -65,34 +73,30 @@ def __init__(self, params): self.fluid_marker = 8 def build(self): - """This function call builds the geometry, marks the boundaries and creates a mesh using Gmsh. - """ + """This function call builds the geometry, marks the boundaries and creates a mesh using Gmsh.""" self.mesh_comm = MPI.COMM_WORLD self.model_rank = 0 self.gdim = 3 - problem = self.params.general.example if problem == "panels": - from pvade.geometry.panels.DomainCreation import DomainCreation + from pvade.geometry.panels.DomainCreation import DomainCreation elif problem == "panels2d": - from pvade.geometry.panels2d.DomainCreation import DomainCreation + from pvade.geometry.panels2d.DomainCreation import DomainCreation elif problem == "cylinder3d": - from pvade.geometry.cylinder3d.DomainCreation import DomainCreation + from pvade.geometry.cylinder3d.DomainCreation import DomainCreation elif problem == "cylinder2d": - from pvade.geometry.cylinder2d.DomainCreation import DomainCreation - + from pvade.geometry.cylinder2d.DomainCreation import DomainCreation geometry = DomainCreation(self.params) # Only rank 0 builds the geometry and meshes the domain # if self.rank == 0: self.pv_model = geometry.build() - - + self._mark_surfaces() - self._set_length_scales_mod() # TODO: this should probably be a method of the domain creation class + self._set_length_scales_mod() # TODO: this should probably be a method of the domain creation class if self.params.fluid.periodic: self._enforce_periodicity() @@ -108,26 +112,31 @@ def build(self): self.msh.name = self.params.general.example self.mt.name = f"{self.msh.name}_cells" self.ft.name = f"{self.msh.name}_facets" - + def read(self): """Read the mesh from an external file. - The User can load an existing mesh file (mesh.xdmf) - and use it to solve the CFD/CSD problem + The User can load an existing mesh file (mesh.xdmf) + and use it to solve the CFD/CSD problem """ - if self.rank == 0: + if self.rank == 0: print("Reading the mesh from file ...") - with dolfinx.io.XDMFFile(MPI.COMM_WORLD, self.params.general.output_dir_mesh+"/mesh.xdmf", "r") as xdmf: + with dolfinx.io.XDMFFile( + MPI.COMM_WORLD, self.params.general.output_dir_mesh + "/mesh.xdmf", "r" + ) as xdmf: self.msh = xdmf.read_mesh(name="Grid") - self.msh.topology.create_connectivity(self.msh.topology.dim-1, self.msh.topology.dim) - with XDMFFile(MPI.COMM_WORLD,self.params.general.output_dir_mesh+"/mesh_mf.xdmf",'r') as infile: + self.msh.topology.create_connectivity( + self.msh.topology.dim - 1, self.msh.topology.dim + ) + with XDMFFile( + MPI.COMM_WORLD, self.params.general.output_dir_mesh + "/mesh_mf.xdmf", "r" + ) as infile: self.ft = infile.read_meshtags(self.msh, "Grid") - if self.rank == 0: + if self.rank == 0: print("Done.") - def _mark_surfaces(self): - """ This function call iterates over all boundaries and assigns tags for each boundary. + """This function call iterates over all boundaries and assigns tags for each boundary. The Tags are being used when appying boundaty condition. """ # Loop through all surfaces to find periodic tags @@ -164,7 +173,6 @@ def _mark_surfaces(self): else: self.dom_tags["panel_surface"] = [tag] - self.pv_model.addPhysicalGroup(3, [1], 11) self.pv_model.setPhysicalName(3, 11, "fluid") @@ -180,47 +188,59 @@ def _mark_surfaces(self): self.pv_model.setPhysicalName(2, self.z_min_marker, "bottom") self.pv_model.addPhysicalGroup(2, self.dom_tags["top"], self.z_max_marker) self.pv_model.setPhysicalName(2, self.z_max_marker, "top") - self.pv_model.addPhysicalGroup(2, self.dom_tags["panel_surface"], self.internal_surface_marker) + self.pv_model.addPhysicalGroup( + 2, self.dom_tags["panel_surface"], self.internal_surface_marker + ) self.pv_model.setPhysicalName(2, self.internal_surface_marker, "panel_surface") def _set_length_scales_mod(self): - """ This function call defines the characteristic length for the mesh in locations of interst - LcMin,LcMax,DistMin and DistMax are used to create a refined mesh in specific locations - which results in a high fidelity mesh without using a uniform element size in the whole mesh. + """This function call defines the characteristic length for the mesh in locations of interst + LcMin,LcMax,DistMin and DistMax are used to create a refined mesh in specific locations + which results in a high fidelity mesh without using a uniform element size in the whole mesh. """ res_min = self.params.domain.l_char if self.mesh_comm.rank == self.model_rank: # Define a distance field from the immersed panels distance = self.pv_model.mesh.field.add("Distance", 1) - self.pv_model.mesh.field.setNumbers(distance, "FacesList", self.dom_tags["panel_surface"]) - + self.pv_model.mesh.field.setNumbers( + distance, "FacesList", self.dom_tags["panel_surface"] + ) + threshold = self.pv_model.mesh.field.add("Threshold") self.pv_model.mesh.field.setNumber(threshold, "IField", distance) - factor = self.params.domain.l_char - if 'cylinder3d' in self.params.general.example: + if "cylinder3d" in self.params.general.example: self.cyld_radius = self.params.domain.cyld_radius resolution = factor * self.cyld_radius / 10 self.pv_model.mesh.field.setNumber(threshold, "LcMin", resolution) self.pv_model.mesh.field.setNumber(threshold, "LcMax", 20 * resolution) - self.pv_model.mesh.field.setNumber(threshold, "DistMin", .5 * self.cyld_radius) - self.pv_model.mesh.field.setNumber(threshold, "DistMax", self.cyld_radius) + self.pv_model.mesh.field.setNumber( + threshold, "DistMin", 0.5 * self.cyld_radius + ) + self.pv_model.mesh.field.setNumber( + threshold, "DistMax", self.cyld_radius + ) else: - resolution = factor * 10*self.params.pv_array.panel_thickness/2 - half_panel = self.params.pv_array.panel_length * np.cos(self.params.pv_array.tracker_angle) - self.pv_model.mesh.field.setNumber(threshold, "LcMin", resolution*0.5) - self.pv_model.mesh.field.setNumber(threshold, "LcMax", 5*resolution) - self.pv_model.mesh.field.setNumber(threshold, "DistMin", self.params.pv_array.spacing[0]) - self.pv_model.mesh.field.setNumber(threshold, "DistMax", self.params.pv_array.spacing+half_panel) - + resolution = factor * 10 * self.params.pv_array.panel_thickness / 2 + half_panel = self.params.pv_array.panel_length * np.cos( + self.params.pv_array.tracker_angle + ) + self.pv_model.mesh.field.setNumber(threshold, "LcMin", resolution * 0.5) + self.pv_model.mesh.field.setNumber(threshold, "LcMax", 5 * resolution) + self.pv_model.mesh.field.setNumber( + threshold, "DistMin", self.params.pv_array.spacing[0] + ) + self.pv_model.mesh.field.setNumber( + threshold, "DistMax", self.params.pv_array.spacing + half_panel + ) # # Define a distance field from the immersed panels # zmin_dist = self.pv_model.mesh.field.add("Distance") # self.pv_model.mesh.field.setNumbers(zmin_dist, "FacesList", self.dom_tags["bottom"]) - + # zmin_thre = self.pv_model.mesh.field.add("Threshold") # self.pv_model.mesh.field.setNumber(zmin_thre, "IField", zmin_dist) # self.pv_model.mesh.field.setNumber(zmin_thre, "LcMin", .5*resolution) @@ -228,14 +248,11 @@ def _set_length_scales_mod(self): # self.pv_model.mesh.field.setNumber(zmin_thre, "DistMin", 1.5) # self.pv_model.mesh.field.setNumber(zmin_thre, "DistMax", 1.5+half_panel) - - - # other_dist = self.pv_model.mesh.field.add("Distance") # self.pv_model.mesh.field.setNumbers(other_dist, "FacesList", self.dom_tags["front"]) # self.pv_model.mesh.field.setNumbers(other_dist, "FacesList", self.dom_tags["back"]) # self.pv_model.mesh.field.setNumbers(other_dist, "FacesList", self.dom_tags["top"]) - + # other_thre = self.pv_model.mesh.field.add("Threshold") # self.pv_model.mesh.field.setNumber(other_thre, "IField", other_dist) # self.pv_model.mesh.field.setNumber(other_thre, "LcMin", 5.0 * self.params.domain.l_char) @@ -243,25 +260,29 @@ def _set_length_scales_mod(self): # self.pv_model.mesh.field.setNumber(other_thre, "DistMin", 0.1) # self.pv_model.mesh.field.setNumber(other_thre, "DistMax", 0.5) - xy_dist = self.pv_model.mesh.field.add("Distance") - self.pv_model.mesh.field.setNumbers(xy_dist, "FacesList", self.dom_tags["left"]) - self.pv_model.mesh.field.setNumbers(xy_dist, "FacesList", self.dom_tags["right"]) - + self.pv_model.mesh.field.setNumbers( + xy_dist, "FacesList", self.dom_tags["left"] + ) + self.pv_model.mesh.field.setNumbers( + xy_dist, "FacesList", self.dom_tags["right"] + ) + xy_thre = self.pv_model.mesh.field.add("Threshold") self.pv_model.mesh.field.setNumber(xy_thre, "IField", xy_dist) self.pv_model.mesh.field.setNumber(xy_thre, "LcMin", 2 * resolution) - self.pv_model.mesh.field.setNumber(xy_thre, "LcMax", 5* resolution) + self.pv_model.mesh.field.setNumber(xy_thre, "LcMax", 5 * resolution) self.pv_model.mesh.field.setNumber(xy_thre, "DistMin", 0.1) self.pv_model.mesh.field.setNumber(xy_thre, "DistMax", 0.5) - minimum = self.pv_model.mesh.field.add("Min") - self.pv_model.mesh.field.setNumbers(minimum, "FieldsList", [threshold, xy_thre ]) + self.pv_model.mesh.field.setNumbers( + minimum, "FieldsList", [threshold, xy_thre] + ) self.pv_model.mesh.field.setAsBackgroundMesh(minimum) # self.pv_model.mesh.field.setAsBackgroundMesh(7) - + # gmsh.model.mesh.field.add("Distance", 1) # gmsh.model.mesh.field.setNumbers(1, "FacesList", self.dom_tags["panel_surface"]) # r = res_min @@ -294,16 +315,14 @@ def _set_length_scales_mod(self): # gmsh.model.mesh.field.setNumbers(5, "FieldsList", [2, 4]) # gmsh.model.mesh.field.setAsBackgroundMesh(5) - # if self.mesh_comm.rank == self.model_rank: - # gmsh.option.setNumber("Mesh.Algorithm", 5) - # gmsh.option.setNumber("Mesh.RecombinationAlgorithm", 2) - # gmsh.option.setNumber("Mesh.RecombineAll", 1) - # gmsh.option.setNumber("Mesh.SubdivisionAlgorithm", 1) - # gmsh.model.mesh.generate(3) - # gmsh.model.mesh.setOrder(2) - # gmsh.model.mesh.optimize("Netgen") - + # gmsh.option.setNumber("Mesh.Algorithm", 5) + # gmsh.option.setNumber("Mesh.RecombinationAlgorithm", 2) + # gmsh.option.setNumber("Mesh.RecombineAll", 1) + # gmsh.option.setNumber("Mesh.SubdivisionAlgorithm", 1) + # gmsh.model.mesh.generate(3) + # gmsh.model.mesh.setOrder(2) + # gmsh.model.mesh.optimize("Netgen") def _enforce_periodicity(self): @@ -359,9 +378,7 @@ def _enforce_periodicity(self): ) def _generate_mesh(self): - """ This function call generates the mesh. - - """ + """This function call generates the mesh.""" if self.rank == 0: print("Starting mesh generation... ", end="") @@ -380,26 +397,26 @@ def _generate_mesh(self): print("Finished.") print(f"Total meshing time = {toc-tic:.1f} s") - def write_mesh_file(self): - ''' + """ TODO: when saving a mesh file using only dolfinx functions it's possible certain elements of the data aren't preserved and that the mesh won't be able to be properly read in later on. MAKE SURE YOU CAN SAVE A MESH USING ONLY DOLFINX FUNCTIONS AND THEN READ IN THAT SAME MESH WITHOUT A LOSS OF CAPABILITY. - ''' + """ if self.rank == 0: # Save the *.msh file and *.vtk file (the latter is for visualization only) - print('Writing Mesh to %s... ' % (self.params.general.output_dir_mesh), end='') - - if os.path.exists(self.params.general.output_dir_mesh) == False: + print( + "Writing Mesh to %s... " % (self.params.general.output_dir_mesh), end="" + ) + + if os.path.exists(self.params.general.output_dir_mesh) == False: os.makedirs(self.params.general.output_dir_mesh) - gmsh.write('%s/mesh.msh' % (self.params.general.output_dir_mesh)) - gmsh.write('%s/mesh.vtk' % (self.params.general.output_dir_mesh)) + gmsh.write("%s/mesh.msh" % (self.params.general.output_dir_mesh)) + gmsh.write("%s/mesh.vtk" % (self.params.general.output_dir_mesh)) - # def create_mesh(mesh, clean_points, cell_type): # cells = mesh.get_cells_type(cell_type) # cell_data = mesh.get_cell_data("gmsh:physical", cell_type) @@ -407,7 +424,7 @@ def write_mesh_file(self): # out_mesh = meshio.Mesh(points=clean_points, cells={ # cell_type: cells}, cell_data={"name_to_read": [cell_data]}) # return out_mesh - + # mesh_from_file = meshio.read(f'{self.params.general.output_dir_mesh}/mesh.msh') # pts = mesh_from_file.points # tetra_mesh = create_mesh(mesh_from_file, pts, "tetra") From e93fb326ec13aceae30a66ef2e5ca1332df5cef3 Mon Sep 17 00:00:00 2001 From: Young Date: Mon, 27 Mar 2023 13:50:54 -0600 Subject: [PATCH 26/94] black formatting everything --- pvade/FlowManager.py | 8 +- pvade/geometry/MeshManager.py | 1 + pvade/geometry/MeshManager2d.py | 175 +++++++++------ pvade/geometry/MeshManager3d.py | 2 +- pvade/geometry/cylinder2d/DomainCreation.py | 24 +- .../cylinder2d/DomainCreation_temp.py | 212 +++++++++++++----- pvade/geometry/cylinder3d/DomainCreation.py | 19 +- pvade/geometry/panels/DomainCreation.py | 12 +- pvade/geometry/panels2d/DomainCreation.py | 27 +-- .../template/TemplateDomainCreation.py | 21 +- 10 files changed, 312 insertions(+), 189 deletions(-) diff --git a/pvade/FlowManager.py b/pvade/FlowManager.py index ad669f72..1e2ea2c6 100644 --- a/pvade/FlowManager.py +++ b/pvade/FlowManager.py @@ -406,15 +406,15 @@ def _locate_boundary_dofs_tags(self, domain): def _applybc(self, value, domain, V, marker): """Apply a single boundary condition - + This function builds a single Dirichlet boundary condition given the value, gmsh marker, and function space. - + Args: value (float, dolfinx.fem.Function): Scalar or function set on the dof domain (:obj:`pvade.geometry.MeshManager.Domain`): A Domain object V (:obj:`dolfinx.fem.FunctionSpace`): The function space on which the boundary condition will be acting marker (int): boundary tag created in gmsh - + Returns: :obj:`dolfinx.fem.dirichletbc`: Dirichlet boundary conditions @@ -660,7 +660,7 @@ def build_forms(self, domain, params): tentative velocity, the calculation of the change in pressure required to correct the tentative velocity to enforce continuity, and the update to the velocity field to reflect this change in - pressure. + pressure. Args: domain (:obj:`pvade.geometry.MeshManager.Domain`): A Domain object diff --git a/pvade/geometry/MeshManager.py b/pvade/geometry/MeshManager.py index 09a71ee1..dace1b4b 100644 --- a/pvade/geometry/MeshManager.py +++ b/pvade/geometry/MeshManager.py @@ -9,6 +9,7 @@ import time import ufl import dolfinx + # import meshio # from pvopt.geometry.panels.DomainCreation import * diff --git a/pvade/geometry/MeshManager2d.py b/pvade/geometry/MeshManager2d.py index 2706652b..6ac88f48 100644 --- a/pvade/geometry/MeshManager2d.py +++ b/pvade/geometry/MeshManager2d.py @@ -8,13 +8,13 @@ import os import time import ufl -import dolfinx +import dolfinx import meshio # from pvopt.geometry.panels.DomainCreation import * class FSIDomain: - """This class creates the computational domain for 2D computational domains (2D panels, 2D cylinder) - """ + """This class creates the computational domain for 2D computational domains (2D panels, 2D cylinder)""" + def __init__(self, params): """The class is initialised here @@ -29,25 +29,29 @@ def __init__(self, params): # Store a full copy of params on this object self.params = params - + problem = self.params.general.example if problem == "panels": - from pvade.geometry.panels.DomainCreation import DomainCreation - dim = 3 + from pvade.geometry.panels.DomainCreation import DomainCreation + + dim = 3 elif problem == "panels2d": - from pvade.geometry.panels2d.DomainCreation import DomainCreation - dim = 2 + from pvade.geometry.panels2d.DomainCreation import DomainCreation + + dim = 2 elif problem == "cylinder3d": - from pvade.geometry.cylinder3d.DomainCreation import DomainCreation - dim = 3 + from pvade.geometry.cylinder3d.DomainCreation import DomainCreation + + dim = 3 elif problem == "cylinder2d": - from pvade.geometry.cylinder2d.DomainCreation import DomainCreation - dim = 2 + from pvade.geometry.cylinder2d.DomainCreation import DomainCreation - # define markers for boundaries + dim = 2 + + # define markers for boundaries if dim == 3: - self.x_min_marker = 1 + self.x_min_marker = 1 self.y_min_marker = 2 self.z_min_marker = 3 self.x_max_marker = 4 @@ -55,7 +59,7 @@ def __init__(self, params): self.z_max_marker = 6 self.internal_surface_marker = 7 self.fluid_marker = 8 - elif dim ==2: + elif dim == 2: self.x_min_marker = 1 self.y_min_marker = 2 self.x_max_marker = 4 @@ -64,34 +68,30 @@ def __init__(self, params): self.fluid_marker = 8 def build(self): - """This function call builds the geometry using Gmsh - """ + """This function call builds the geometry using Gmsh""" self.mesh_comm = MPI.COMM_WORLD self.model_rank = 0 self.gdim = 3 - problem = self.params.general.example if problem == "panels": - from pvade.geometry.panels.DomainCreation import DomainCreation + from pvade.geometry.panels.DomainCreation import DomainCreation elif problem == "panels2d": - from pvade.geometry.panels2d.DomainCreation import DomainCreation + from pvade.geometry.panels2d.DomainCreation import DomainCreation elif problem == "cylinder3d": - from pvade.geometry.cylinder3d.DomainCreation import DomainCreation + from pvade.geometry.cylinder3d.DomainCreation import DomainCreation elif problem == "cylinder2d": - from pvade.geometry.cylinder2d.DomainCreation import DomainCreation - + from pvade.geometry.cylinder2d.DomainCreation import DomainCreation geometry = DomainCreation(self.params) # Only rank 0 builds the geometry and meshes the domain # if self.rank == 0: self.pv_model = geometry.build() - - + self._mark_surfaces() - self._set_length_scales_mod() # TODO: this should probably be a method of the domain creation class + self._set_length_scales_mod() # TODO: this should probably be a method of the domain creation class if self.params.fluid.periodic: self._enforce_periodicity() @@ -107,25 +107,28 @@ def build(self): self.msh.name = self.params.general.example self.mt.name = f"{self.msh.name}_cells" self.ft.name = f"{self.msh.name}_facets" - + def read(self): - """Read the mesh from external file located in output/mesh - """ - if self.rank == 0: + """Read the mesh from external file located in output/mesh""" + if self.rank == 0: print("Reading the mesh from file ...") - with dolfinx.io.XDMFFile(MPI.COMM_WORLD, self.params.general.output_dir_mesh+"/mesh.xdmf", "r") as xdmf: + with dolfinx.io.XDMFFile( + MPI.COMM_WORLD, self.params.general.output_dir_mesh + "/mesh.xdmf", "r" + ) as xdmf: self.msh = xdmf.read_mesh(name="Grid") - self.msh.topology.create_connectivity(self.msh.topology.dim-1, self.msh.topology.dim) - with XDMFFile(MPI.COMM_WORLD,self.params.general.output_dir_mesh+"/mesh_mf.xdmf",'r') as infile: + self.msh.topology.create_connectivity( + self.msh.topology.dim - 1, self.msh.topology.dim + ) + with XDMFFile( + MPI.COMM_WORLD, self.params.general.output_dir_mesh + "/mesh_mf.xdmf", "r" + ) as infile: self.ft = infile.read_meshtags(self.msh, "Grid") - if self.rank == 0: + if self.rank == 0: print("Done.") - def _mark_surfaces(self): - """Creates boundary tags using gmsh - """ + """Creates boundary tags using gmsh""" # Loop through all surfaces to find periodic tags surf_ids = self.pv_model.occ.getEntities(1) @@ -154,7 +157,6 @@ def _mark_surfaces(self): else: self.dom_tags["panel_surface"] = [tag] - self.pv_model.addPhysicalGroup(2, [1], 11) self.pv_model.setPhysicalName(2, 11, "fluid") @@ -167,7 +169,9 @@ def _mark_surfaces(self): self.pv_model.addPhysicalGroup(1, self.dom_tags["top"], self.y_max_marker) self.pv_model.setPhysicalName(1, self.y_max_marker, "top") - self.pv_model.addPhysicalGroup(1, self.dom_tags["panel_surface"], self.internal_surface_marker) + self.pv_model.addPhysicalGroup( + 1, self.dom_tags["panel_surface"], self.internal_surface_marker + ) self.pv_model.setPhysicalName(1, self.internal_surface_marker, "panel_surface") def _set_length_scales_mod(self): @@ -180,18 +184,32 @@ def _set_length_scales_mod(self): ) self.pv_model.mesh.field.add("Threshold", 2) self.pv_model.mesh.field.setNumber(2, "IField", 1) - if 'cylinder2d' in self.params.general.example: + if "cylinder2d" in self.params.general.example: self.cyld_radius = self.params.domain.cyld_radius - self.pv_model.mesh.field.setNumber(2, "LcMin", self.params.domain.l_char) - self.pv_model.mesh.field.setNumber(2, "LcMax", 3.0 * self.params.domain.l_char) + self.pv_model.mesh.field.setNumber( + 2, "LcMin", self.params.domain.l_char + ) + self.pv_model.mesh.field.setNumber( + 2, "LcMax", 3.0 * self.params.domain.l_char + ) self.pv_model.mesh.field.setNumber(2, "DistMin", 2.0 * self.cyld_radius) - self.pv_model.mesh.field.setNumber(2, "DistMax", 10.0 * self.cyld_radius) + self.pv_model.mesh.field.setNumber( + 2, "DistMax", 10.0 * self.cyld_radius + ) else: - self.pv_model.mesh.field.setNumber(2, "LcMin", 0.2*self.params.domain.l_char) - self.pv_model.mesh.field.setNumber(2, "LcMax", 3.0 * self.params.domain.l_char) - self.pv_model.mesh.field.setNumber(2, "DistMin", .5 * self.params.domain.l_char) - self.pv_model.mesh.field.setNumber(2, "DistMax", 1. * self.params.domain.l_char) + self.pv_model.mesh.field.setNumber( + 2, "LcMin", 0.2 * self.params.domain.l_char + ) + self.pv_model.mesh.field.setNumber( + 2, "LcMax", 3.0 * self.params.domain.l_char + ) + self.pv_model.mesh.field.setNumber( + 2, "DistMin", 0.5 * self.params.domain.l_char + ) + self.pv_model.mesh.field.setNumber( + 2, "DistMax", 1.0 * self.params.domain.l_char + ) # self.pv_model.mesh.field.setNumber(4, "LcMin", self.params.pv_array.panel_thickness) # self.pv_model.mesh.field.setNumber(4, "LcMax", 3.0 * self.params.pv_array.panel_thickness) @@ -204,39 +222,43 @@ def _set_length_scales_mod(self): self.pv_model.mesh.field.add("Threshold", 4) self.pv_model.mesh.field.setNumber(4, "IField", 3) - self.pv_model.mesh.field.setNumber(4, "LcMin", 5.0 * self.params.domain.l_char) - self.pv_model.mesh.field.setNumber(4, "LcMax", 10.0 * self.params.domain.l_char) + self.pv_model.mesh.field.setNumber( + 4, "LcMin", 5.0 * self.params.domain.l_char + ) + self.pv_model.mesh.field.setNumber( + 4, "LcMax", 10.0 * self.params.domain.l_char + ) self.pv_model.mesh.field.setNumber(4, "DistMin", 0.1) self.pv_model.mesh.field.setNumber(4, "DistMax", 0.5) self.pv_model.mesh.field.add("Distance", 5) self.pv_model.mesh.field.setNumbers(5, "FacesList", self.dom_tags["left"]) self.pv_model.mesh.field.setNumbers(5, "FacesList", self.dom_tags["right"]) - + self.pv_model.mesh.field.add("Threshold", 6) self.pv_model.mesh.field.setNumber(6, "IField", 5) - self.pv_model.mesh.field.setNumber(6, "LcMin", 2.0 * self.params.domain.l_char) - self.pv_model.mesh.field.setNumber(6, "LcMax", 5.0 * self.params.domain.l_char) + self.pv_model.mesh.field.setNumber( + 6, "LcMin", 2.0 * self.params.domain.l_char + ) + self.pv_model.mesh.field.setNumber( + 6, "LcMax", 5.0 * self.params.domain.l_char + ) self.pv_model.mesh.field.setNumber(6, "DistMin", 0.1) self.pv_model.mesh.field.setNumber(6, "DistMax", 0.5) - self.pv_model.mesh.field.add("Min", 7) - self.pv_model.mesh.field.setNumbers(7, "FieldsList", [2,4,6]) + self.pv_model.mesh.field.setNumbers(7, "FieldsList", [2, 4, 6]) self.pv_model.mesh.field.setAsBackgroundMesh(7) - - if self.mesh_comm.rank == self.model_rank: gmsh.option.setNumber("Mesh.Algorithm", 8) gmsh.option.setNumber("Mesh.RecombinationAlgorithm", 2) gmsh.option.setNumber("Mesh.RecombineAll", 1) gmsh.option.setNumber("Mesh.SubdivisionAlgorithm", 1) - + gmsh.model.mesh.generate(2) gmsh.model.mesh.setOrder(2) gmsh.model.mesh.optimize("Netgen") - def _enforce_periodicity(self): @@ -310,39 +332,48 @@ def _generate_mesh(self): print("Finished.") print(f"Total meshing time = {toc-tic:.1f} s") - def write_mesh_file(self): - ''' + """ TODO: when saving a mesh file using only dolfinx functions it's possible certain elements of the data aren't preserved and that the mesh won't be able to be properly read in later on. MAKE SURE YOU CAN SAVE A MESH USING ONLY DOLFINX FUNCTIONS AND THEN READ IN THAT SAME MESH WITHOUT A LOSS OF CAPABILITY. - ''' + """ if self.rank == 0: # Save the *.msh file and *.vtk file (the latter is for visualization only) - print('Writing Mesh to %s... ' % (self.params.general.output_dir_mesh), end='') - - if os.path.exists(self.params.general.output_dir_mesh) == False: + print( + "Writing Mesh to %s... " % (self.params.general.output_dir_mesh), end="" + ) + + if os.path.exists(self.params.general.output_dir_mesh) == False: os.makedirs(self.params.general.output_dir_mesh) - gmsh.write('%s/mesh.msh' % (self.params.general.output_dir_mesh)) - gmsh.write('%s/mesh.vtk' % (self.params.general.output_dir_mesh)) + gmsh.write("%s/mesh.msh" % (self.params.general.output_dir_mesh)) + gmsh.write("%s/mesh.vtk" % (self.params.general.output_dir_mesh)) + def create_mesh(mesh, clean_points, cell_type): cells = mesh.get_cells_type(cell_type) cell_data = mesh.get_cell_data("gmsh:physical", cell_type) - out_mesh = meshio.Mesh(points=clean_points, cells={ - cell_type: cells}, cell_data={"name_to_read": [cell_data]}) + out_mesh = meshio.Mesh( + points=clean_points, + cells={cell_type: cells}, + cell_data={"name_to_read": [cell_data]}, + ) return out_mesh - - mesh_from_file = meshio.read(f'{self.params.general.output_dir_mesh}/mesh.msh') + + mesh_from_file = meshio.read( + f"{self.params.general.output_dir_mesh}/mesh.msh" + ) pts = mesh_from_file.points tetra_mesh = create_mesh(mesh_from_file, pts, "quad") tri_mesh = create_mesh(mesh_from_file, pts, "line") - meshio.write(f'{self.params.general.output_dir_mesh}/mesh.xdmf', tetra_mesh) - meshio.write(f'{self.params.general.output_dir_mesh}/mesh_mf.xdmf', tri_mesh) + meshio.write(f"{self.params.general.output_dir_mesh}/mesh.xdmf", tetra_mesh) + meshio.write( + f"{self.params.general.output_dir_mesh}/mesh_mf.xdmf", tri_mesh + ) print("Done.") def test_mesh_functionspace(self): diff --git a/pvade/geometry/MeshManager3d.py b/pvade/geometry/MeshManager3d.py index 81c71c80..7334541b 100644 --- a/pvade/geometry/MeshManager3d.py +++ b/pvade/geometry/MeshManager3d.py @@ -22,7 +22,7 @@ def __init__(self, params): """The class is initialised here Depending on the example we are solving, we import the corresponding DomainCrearion file We define markers which will be used for boundary tag asignment - + Args: params (input parameters): input parameters available in the input file """ diff --git a/pvade/geometry/cylinder2d/DomainCreation.py b/pvade/geometry/cylinder2d/DomainCreation.py index d5bb4ef9..475b2672 100644 --- a/pvade/geometry/cylinder2d/DomainCreation.py +++ b/pvade/geometry/cylinder2d/DomainCreation.py @@ -9,12 +9,13 @@ import ufl import dolfinx import meshio + # from pvopt.geometry.panels.domain_creation import * class FSIDomain: def __init__(self, params): - """ Initialize the DomainCreation object + """Initialize the DomainCreation object This initializes an object that creates the computational domain. Args: @@ -29,10 +30,10 @@ def __init__(self, params): self.params = params def build(self): - """ This function creates the computational domain for a flow around a 2D cylinder. - + """This function creates the computational domain for a flow around a 2D cylinder. + Returns: - The function returns gmsh.model which contains the geometric description of the computational domain + The function returns gmsh.model which contains the geometric description of the computational domain """ gmsh.initialize() gmsh.option.setNumber("General.Terminal", 0) @@ -46,16 +47,17 @@ def build(self): mesh_comm = MPI.COMM_WORLD model_rank = 0 if mesh_comm.rank == model_rank: - rectangle = self.pv_model.occ.addRectangle(self.params.domain.x_min , - self.params.domain.y_min , - 0, - self.params.domain.x_max , - self.params.domain.y_max , tag=1) + rectangle = self.pv_model.occ.addRectangle( + self.params.domain.x_min, + self.params.domain.y_min, + 0, + self.params.domain.x_max, + self.params.domain.y_max, + tag=1, + ) obstacle = self.pv_model.occ.addDisk(c_x, c_y, 0, r, r) if mesh_comm.rank == model_rank: self.pv_model.occ.cut([(gdim, rectangle)], [(gdim, obstacle)]) self.pv_model.occ.synchronize() return self.pv_model - - diff --git a/pvade/geometry/cylinder2d/DomainCreation_temp.py b/pvade/geometry/cylinder2d/DomainCreation_temp.py index a93cd099..f81a7d8b 100644 --- a/pvade/geometry/cylinder2d/DomainCreation_temp.py +++ b/pvade/geometry/cylinder2d/DomainCreation_temp.py @@ -10,6 +10,7 @@ import ufl import dolfinx import meshio + # from pvopt.geometry.panels.domain_creation import * class FSIDomain: def __init__(self, params): @@ -38,13 +39,13 @@ def build(self): L = 2.2 H = 0.41 - c_x = c_y =0.2 + c_x = c_y = 0.2 r = 0.05 gdim = 2 mesh_comm = MPI.COMM_WORLD model_rank = 0 if mesh_comm.rank == model_rank: - rectangle = gmsh.model.occ.addRectangle(0,0,0, L, H, tag=1) + rectangle = gmsh.model.occ.addRectangle(0, 0, 0, L, H, tag=1) obstacle = gmsh.model.occ.addDisk(c_x, c_y, 0, r, r) if mesh_comm.rank == model_rank: @@ -53,21 +54,32 @@ def build(self): fluid_marker = 1 if mesh_comm.rank == model_rank: volumes = gmsh.model.getEntities(dim=gdim) - assert(len(volumes) == 1) - gmsh.model.addPhysicalGroup(volumes[0][0], [volumes[0][1]], fluid_marker) + assert len(volumes) == 1 + gmsh.model.addPhysicalGroup( + volumes[0][0], [volumes[0][1]], fluid_marker + ) gmsh.model.setPhysicalName(volumes[0][0], fluid_marker, "Fluid") - self.inlet_marker, self.outlet_marker, self.wall_marker, self.obstacle_marker = 2, 3, 4, 5 + ( + self.inlet_marker, + self.outlet_marker, + self.wall_marker, + self.obstacle_marker, + ) = (2, 3, 4, 5) inflow, outflow, walls, obstacle = [], [], [], [] if mesh_comm.rank == model_rank: boundaries = gmsh.model.getBoundary(volumes, oriented=False) for boundary in boundaries: - center_of_mass = gmsh.model.occ.getCenterOfMass(boundary[0], boundary[1]) - if np.allclose(center_of_mass, [0, H/2, 0]): + center_of_mass = gmsh.model.occ.getCenterOfMass( + boundary[0], boundary[1] + ) + if np.allclose(center_of_mass, [0, H / 2, 0]): inflow.append(boundary[1]) - elif np.allclose(center_of_mass, [L, H/2, 0]): + elif np.allclose(center_of_mass, [L, H / 2, 0]): outflow.append(boundary[1]) - elif np.allclose(center_of_mass, [L/2, H, 0]) or np.allclose(center_of_mass, [L/2, 0, 0]): + elif np.allclose(center_of_mass, [L / 2, H, 0]) or np.allclose( + center_of_mass, [L / 2, 0, 0] + ): walls.append(boundary[1]) else: obstacle.append(boundary[1]) @@ -90,15 +102,21 @@ def build(self): res_min = r / 3 if mesh_comm.rank == model_rank: distance_field = gmsh.model.mesh.field.add("Distance") - gmsh.model.mesh.field.setNumbers(distance_field, "EdgesList", obstacle) + gmsh.model.mesh.field.setNumbers( + distance_field, "EdgesList", obstacle + ) threshold_field = gmsh.model.mesh.field.add("Threshold") - gmsh.model.mesh.field.setNumber(threshold_field, "IField", distance_field) + gmsh.model.mesh.field.setNumber( + threshold_field, "IField", distance_field + ) gmsh.model.mesh.field.setNumber(threshold_field, "LcMin", res_min) gmsh.model.mesh.field.setNumber(threshold_field, "LcMax", 0.25 * H) gmsh.model.mesh.field.setNumber(threshold_field, "DistMin", r) gmsh.model.mesh.field.setNumber(threshold_field, "DistMax", 2 * H) min_field = gmsh.model.mesh.field.add("Min") - gmsh.model.mesh.field.setNumbers(min_field, "FieldsList", [threshold_field]) + gmsh.model.mesh.field.setNumbers( + min_field, "FieldsList", [threshold_field] + ) gmsh.model.mesh.field.setAsBackgroundMesh(min_field) if mesh_comm.rank == model_rank: @@ -110,7 +128,9 @@ def build(self): gmsh.model.mesh.setOrder(2) gmsh.model.mesh.optimize("Netgen") - self.msh, self._, self.ft = gmshio.model_to_mesh(gmsh.model, mesh_comm, model_rank, gdim=gdim) + self.msh, self._, self.ft = gmshio.model_to_mesh( + gmsh.model, mesh_comm, model_rank, gdim=gdim + ) # Specify names for the mesh elements self.msh.name = "pv_domain" self._.name = f"{self.msh.name}_cells" @@ -118,8 +138,6 @@ def build(self): with XDMFFile(self.msh.comm, "output_mesh_name.pvd", "w") as fp: fp.write_mesh(self.msh) - - else: self.mesh_comm = MPI.COMM_WORLD self.model_rank = 0 @@ -145,7 +163,9 @@ def build(self): self._generate_mesh() # All ranks receive their portion of the mesh from rank 0 (like an MPI scatter) - self.msh, self.mt, self.ft = gmshio.model_to_mesh(self.pv_model, self.comm, 0) + self.msh, self.mt, self.ft = gmshio.model_to_mesh( + self.pv_model, self.comm, 0 + ) # Specify names for the mesh elements self.msh.name = "pv_domain" @@ -153,15 +173,21 @@ def build(self): self.ft.name = f"{self.msh.name}_facets" def read(self): - if self.rank == 0: + if self.rank == 0: print("Reading the mesh from file ...") - with dolfinx.io.XDMFFile(MPI.COMM_WORLD, self.params.general.output_dir_mesh+"/mesh.xdmf", "r") as xdmf: + with dolfinx.io.XDMFFile( + MPI.COMM_WORLD, self.params.general.output_dir_mesh + "/mesh.xdmf", "r" + ) as xdmf: self.msh = xdmf.read_mesh(name="Grid") - self.msh.topology.create_connectivity(self.msh.topology.dim-1, self.msh.topology.dim) - with XDMFFile(MPI.COMM_WORLD,self.params.general.output_dir_mesh+"/mesh_mf.xdmf",'r') as infile: + self.msh.topology.create_connectivity( + self.msh.topology.dim - 1, self.msh.topology.dim + ) + with XDMFFile( + MPI.COMM_WORLD, self.params.general.output_dir_mesh + "/mesh_mf.xdmf", "r" + ) as infile: self.ft = infile.read_meshtags(self.msh, "Grid") - if self.rank == 0: + if self.rank == 0: print("Done.") def _construct_geometry(self): @@ -303,7 +329,6 @@ def _mark_surfaces(self): else: self.dom_tags["panel_surface"] = [tag] - self.pv_model.addPhysicalGroup(3, [1], 11) self.pv_model.setPhysicalName(3, 11, "fluid") @@ -319,7 +344,9 @@ def _mark_surfaces(self): self.pv_model.setPhysicalName(2, self.z_min_marker, "bottom") self.pv_model.addPhysicalGroup(2, self.dom_tags["top"], self.z_max_marker) self.pv_model.setPhysicalName(2, self.z_max_marker, "top") - self.pv_model.addPhysicalGroup(2, self.dom_tags["panel_surface"], self.internal_surface_marker) + self.pv_model.addPhysicalGroup( + 2, self.dom_tags["panel_surface"], self.internal_surface_marker + ) self.pv_model.setPhysicalName(2, self.internal_surface_marker, "panel_surface") def _mark_surfaces_mod(self): @@ -327,20 +354,49 @@ def _mark_surfaces_mod(self): fluid_marker = 1 if self.mesh_comm.rank == self.model_rank: volumes = gmsh.model.getEntities(dim=3) - assert(len(volumes) == 1) + assert len(volumes) == 1 gmsh.model.addPhysicalGroup(volumes[0][0], [volumes[0][1]], fluid_marker) gmsh.model.setPhysicalName(volumes[0][0], fluid_marker, "Fluid") - self.inlet_marker, self.outlet_marker, self.wall_z_marker, self.obstacle_marker, self.wall_y_marker = 2, 3, 4, 5, 6 - self.inflow, self.outflow, self.walls_z, self.walls_y, self.obstacle = [], [], [], [],[] - inflow_b_found,outflow_b_found,wallz_b_found, wally_b_found, obstacle_b_found = False,False,False,False,False + ( + self.inlet_marker, + self.outlet_marker, + self.wall_z_marker, + self.obstacle_marker, + self.wall_y_marker, + ) = (2, 3, 4, 5, 6) + self.inflow, self.outflow, self.walls_z, self.walls_y, self.obstacle = ( + [], + [], + [], + [], + [], + ) + ( + inflow_b_found, + outflow_b_found, + wallz_b_found, + wally_b_found, + obstacle_b_found, + ) = (False, False, False, False, False) if self.mesh_comm.rank == self.model_rank: boundaries = gmsh.model.getBoundary(volumes, oriented=False) for boundary in boundaries: - center_of_mass = gmsh.model.occ.getCenterOfMass(boundary[0], boundary[1]) - center_x = self.params.domain.x_min + abs(self.params.domain.x_max-self.params.domain.x_min)/2 - center_y = self.params.domain.y_min + abs(self.params.domain.y_max-self.params.domain.y_min)/2 - center_z = self.params.domain.z_min + abs(self.params.domain.z_max-self.params.domain.z_min)/2 + center_of_mass = gmsh.model.occ.getCenterOfMass( + boundary[0], boundary[1] + ) + center_x = ( + self.params.domain.x_min + + abs(self.params.domain.x_max - self.params.domain.x_min) / 2 + ) + center_y = ( + self.params.domain.y_min + + abs(self.params.domain.y_max - self.params.domain.y_min) / 2 + ) + center_z = ( + self.params.domain.z_min + + abs(self.params.domain.z_max - self.params.domain.z_min) / 2 + ) # if np.allclose(center_of_mass, [self.params.domain.x_min, center_y, center_z]): # self.inflow.append(boundary[1]) # inflow_b_found = True @@ -350,17 +406,27 @@ def _mark_surfaces_mod(self): elif np.allclose(center_of_mass[0], [self.params.domain.x_max]): self.outflow.append(boundary[1]) outflow_b_found = True - elif np.allclose(center_of_mass[1], [self.params.domain.y_max]) or np.allclose(center_of_mass[1], [self.params.domain.y_min]): + elif np.allclose( + center_of_mass[1], [self.params.domain.y_max] + ) or np.allclose(center_of_mass[1], [self.params.domain.y_min]): self.walls_y.append(boundary[1]) wally_b_found = True - elif np.allclose(center_of_mass[2], [self.params.domain.z_max]) or np.allclose(center_of_mass[2], [self.params.domain.z_min]): + elif np.allclose( + center_of_mass[2], [self.params.domain.z_max] + ) or np.allclose(center_of_mass[2], [self.params.domain.z_min]): self.walls_z.append(boundary[1]) wallz_b_found = True else: self.obstacle.append(boundary[1]) obstacle_b_found = True - if (inflow_b_found and outflow_b_found and wallz_b_found and wally_b_found and obstacle_b_found) == True: + if ( + inflow_b_found + and outflow_b_found + and wallz_b_found + and wally_b_found + and obstacle_b_found + ) == True: print("all boundaries are found ") else: print("boundary missing") @@ -401,13 +467,11 @@ def _set_length_scales(self): # Define a distance field from the immersed panels self.pv_model.mesh.field.add("Distance", 3) - self.pv_model.mesh.field.setNumbers( - 3, "FacesList", self.obstacle - ) + self.pv_model.mesh.field.setNumbers(3, "FacesList", self.obstacle) self.pv_model.mesh.field.add("Threshold", 4) self.pv_model.mesh.field.setNumber(4, "IField", 3) - self.pv_model.mesh.field.setNumber(4, "LcMin", 0.2*self.params.domain.l_char) + self.pv_model.mesh.field.setNumber(4, "LcMin", 0.2 * self.params.domain.l_char) self.pv_model.mesh.field.setNumber(4, "LcMax", 6.0 * self.params.domain.l_char) self.pv_model.mesh.field.setNumber(4, "DistMin", 0.5) self.pv_model.mesh.field.setNumber(4, "DistMax", 0.6 * self.params.domain.z_max) @@ -419,10 +483,18 @@ def _set_length_scales(self): distance_field = gmsh.model.mesh.field.add("Distance") self.pv_model.mesh.field.setNumbers(distance_field, "EdgesList", self.obstacle) self.pv_model.mesh.field.setNumber(threshold_field, "IField", distance_field) - self.pv_model.mesh.field.setNumber(threshold_field, "LcMin", self.params.domain.l_char) - self.pv_model.mesh.field.setNumber(threshold_field, "LcMax", 0.25 * self.params.domain.z_max) - self.pv_model.mesh.field.setNumber(threshold_field, "DistMin", self.params.domain.l_char) - self.pv_model.mesh.field.setNumber(threshold_field, "DistMax", 2 * self.params.domain.z_max) + self.pv_model.mesh.field.setNumber( + threshold_field, "LcMin", self.params.domain.l_char + ) + self.pv_model.mesh.field.setNumber( + threshold_field, "LcMax", 0.25 * self.params.domain.z_max + ) + self.pv_model.mesh.field.setNumber( + threshold_field, "DistMin", self.params.domain.l_char + ) + self.pv_model.mesh.field.setNumber( + threshold_field, "DistMax", 2 * self.params.domain.z_max + ) min_field = gmsh.model.mesh.field.add("Min") self.pv_model.mesh.field.setNumbers(min_field, "FieldsList", [threshold_field]) self.pv_model.mesh.field.setAsBackgroundMesh(min_field) @@ -440,11 +512,17 @@ def _set_length_scales_mod(self): self.pv_model.mesh.field.add("Threshold", 2) self.pv_model.mesh.field.setNumber(2, "IField", 1) - self.pv_model.mesh.field.setNumber(2, "LcMin", 2.0 * self.params.domain.l_char) + self.pv_model.mesh.field.setNumber( + 2, "LcMin", 2.0 * self.params.domain.l_char + ) # self.pv_model.mesh.field.setNumber(2, 'LcMin', self.params.domain.l_char) - self.pv_model.mesh.field.setNumber(2, "LcMax", 6.0 * self.params.domain.l_char) + self.pv_model.mesh.field.setNumber( + 2, "LcMax", 6.0 * self.params.domain.l_char + ) self.pv_model.mesh.field.setNumber(2, "DistMin", 4.5) - self.pv_model.mesh.field.setNumber(2, "DistMax", 1.0 * self.params.domain.z_max) + self.pv_model.mesh.field.setNumber( + 2, "DistMax", 1.0 * self.params.domain.z_max + ) # Define a distance field from the immersed panels self.pv_model.mesh.field.add("Distance", 3) @@ -455,16 +533,21 @@ def _set_length_scales_mod(self): self.pv_model.mesh.field.add("Threshold", 4) self.pv_model.mesh.field.setNumber(4, "IField", 3) - self.pv_model.mesh.field.setNumber(4, "LcMin", self.params.domain.l_char*0.5) - self.pv_model.mesh.field.setNumber(4, "LcMax", 5*self.params.domain.l_char) + self.pv_model.mesh.field.setNumber( + 4, "LcMin", self.params.domain.l_char * 0.5 + ) + self.pv_model.mesh.field.setNumber( + 4, "LcMax", 5 * self.params.domain.l_char + ) self.pv_model.mesh.field.setNumber(4, "DistMin", 0.5) - self.pv_model.mesh.field.setNumber(4, "DistMax", 0.6 * self.params.domain.z_max) + self.pv_model.mesh.field.setNumber( + 4, "DistMax", 0.6 * self.params.domain.z_max + ) self.pv_model.mesh.field.add("Min", 5) self.pv_model.mesh.field.setNumbers(5, "FieldsList", [2, 4]) self.pv_model.mesh.field.setAsBackgroundMesh(5) - # gmsh.model.mesh.field.add("Distance", 1) # gmsh.model.mesh.field.setNumbers(1, "FacesList", self.dom_tags["panel_surface"]) # r = res_min @@ -497,7 +580,6 @@ def _set_length_scales_mod(self): # gmsh.model.mesh.field.setNumbers(5, "FieldsList", [2, 4]) # gmsh.model.mesh.field.setAsBackgroundMesh(5) - if self.mesh_comm.rank == self.model_rank: gmsh.option.setNumber("Mesh.Algorithm", 5) gmsh.option.setNumber("Mesh.RecombinationAlgorithm", 2) @@ -507,9 +589,6 @@ def _set_length_scales_mod(self): gmsh.model.mesh.setOrder(2) gmsh.model.mesh.optimize("Netgen") - - - # self.msh, self._, self.ft = gmshio.model_to_mesh(gmsh.model, self.mesh_comm, self.model_rank, gdim=2) # Set size scales for the mesh # eps = 0.1 @@ -625,24 +704,34 @@ def _generate_mesh(self): def write_mesh_file(self): if self.rank == 0: # Save the *.msh file and *.vtk file (the latter is for visualization only) - print('Writing Mesh to %s... ' % (self.params.general.output_dir_mesh), end='') - gmsh.write('%s/mesh.msh' % (self.params.general.output_dir_mesh)) - gmsh.write('%s/mesh.vtk' % (self.params.general.output_dir_mesh)) + print( + "Writing Mesh to %s... " % (self.params.general.output_dir_mesh), end="" + ) + gmsh.write("%s/mesh.msh" % (self.params.general.output_dir_mesh)) + gmsh.write("%s/mesh.vtk" % (self.params.general.output_dir_mesh)) + def create_mesh(mesh, clean_points, cell_type): cells = mesh.get_cells_type(cell_type) cell_data = mesh.get_cell_data("gmsh:physical", cell_type) - out_mesh = meshio.Mesh(points=clean_points, cells={ - cell_type: cells}, cell_data={"name_to_read": [cell_data]}) + out_mesh = meshio.Mesh( + points=clean_points, + cells={cell_type: cells}, + cell_data={"name_to_read": [cell_data]}, + ) return out_mesh - mesh_from_file = meshio.read(f'{self.params.general.output_dir_mesh}/mesh.msh') + mesh_from_file = meshio.read( + f"{self.params.general.output_dir_mesh}/mesh.msh" + ) pts = mesh_from_file.points tetra_mesh = create_mesh(mesh_from_file, pts, "tetra") tri_mesh = create_mesh(mesh_from_file, pts, "triangle") - meshio.write(f'{self.params.general.output_dir_mesh}/mesh.xdmf', tetra_mesh) - meshio.write(f'{self.params.general.output_dir_mesh}/mesh_mf.xdmf', tri_mesh) + meshio.write(f"{self.params.general.output_dir_mesh}/mesh.xdmf", tetra_mesh) + meshio.write( + f"{self.params.general.output_dir_mesh}/mesh_mf.xdmf", tri_mesh + ) print("Done.") def test_mesh_functionspace(self): @@ -676,4 +765,3 @@ def test_mesh_functionspace(self): coords = points[:] print(f"Rank {self.rank} owns {num_nodes_owned_by_proc} nodes\n{coords}") - diff --git a/pvade/geometry/cylinder3d/DomainCreation.py b/pvade/geometry/cylinder3d/DomainCreation.py index 3031dd5d..ce1c6781 100644 --- a/pvade/geometry/cylinder3d/DomainCreation.py +++ b/pvade/geometry/cylinder3d/DomainCreation.py @@ -12,7 +12,7 @@ class DomainCreation(TemplateDomainCreation): def __init__(self, params): - """ Initialize the DomainCreation object + """Initialize the DomainCreation object This initializes an object that creates the computational domain. Args: @@ -21,10 +21,10 @@ def __init__(self, params): super().__init__(params) def build(self): - """ This function creates the computational domain for a flow around a 3D cylinder. - + """This function creates the computational domain for a flow around a 3D cylinder. + Returns: - The function returns gmsh.model which contains the geometric description of the computational domain + The function returns gmsh.model which contains the geometric description of the computational domain """ # Compute and store some useful geometric quantities self.x_span = self.params.domain.x_max - self.params.domain.x_min @@ -57,14 +57,17 @@ def set_length_scales(self): # Define a distance field from the cylinder self.gmsh_model.mesh.field.add("Distance", 1) - self.gmsh_model.mesh.field.setNumbers(1, "FacesList", self.dom_tags["internal_surface"]) + self.gmsh_model.mesh.field.setNumbers( + 1, "FacesList", self.dom_tags["internal_surface"] + ) self.gmsh_model.mesh.field.add("Threshold", 2) self.gmsh_model.mesh.field.setNumber(2, "IField", 1) self.gmsh_model.mesh.field.setNumber(2, "LcMin", self.params.domain.l_char) - self.gmsh_model.mesh.field.setNumber(2, "LcMax", 6.0 * self.params.domain.l_char) + self.gmsh_model.mesh.field.setNumber( + 2, "LcMax", 6.0 * self.params.domain.l_char + ) self.gmsh_model.mesh.field.setNumber(2, "DistMin", 2.0 * self.cyld_radius) - self.gmsh_model.mesh.field.setNumber(2, "DistMax", 4.0*self.cyld_radius) + self.gmsh_model.mesh.field.setNumber(2, "DistMax", 4.0 * self.cyld_radius) self.gmsh_model.mesh.field.setAsBackgroundMesh(2) - diff --git a/pvade/geometry/panels/DomainCreation.py b/pvade/geometry/panels/DomainCreation.py index 0d5ea9a3..28c8ed8d 100644 --- a/pvade/geometry/panels/DomainCreation.py +++ b/pvade/geometry/panels/DomainCreation.py @@ -15,13 +15,14 @@ class DomainCreation(TemplateDomainCreation): - """_summary_ test + """_summary_ test Args: TemplateDomainCreation (_type_): _description_ """ + def __init__(self, params): - """ Initialize the DomainCreation object + """Initialize the DomainCreation object This initializes an object that creates the computational domain. Args: @@ -30,11 +31,11 @@ def __init__(self, params): super().__init__(params) def build(self): - """ This function creates the computational domain for a 3d simulation involving N panels. + """This function creates the computational domain for a 3d simulation involving N panels. The panels are set at a distance apart, rotated at an angle theta and are elevated with a distance H from the ground. - + Returns: - The function returns gmsh.model which contains the geometric description of the computational domain + The function returns gmsh.model which contains the geometric description of the computational domain """ # Compute and store some useful geometric quantities self.x_span = self.params.domain.x_max - self.params.domain.x_min @@ -80,4 +81,3 @@ def build(self): self.gmsh_model.occ.synchronize() return self.gmsh_model - diff --git a/pvade/geometry/panels2d/DomainCreation.py b/pvade/geometry/panels2d/DomainCreation.py index 5221a32c..ce16279d 100644 --- a/pvade/geometry/panels2d/DomainCreation.py +++ b/pvade/geometry/panels2d/DomainCreation.py @@ -7,12 +7,13 @@ import os import time import ufl -import dolfinx +import dolfinx import meshio + class DomainCreation: def __init__(self, params): - """ Initialize the DomainCreation object + """Initialize the DomainCreation object This initializes an object that creates the computational domain. Args: @@ -34,18 +35,18 @@ def __init__(self, params): self.z_max_marker = 6 self.internal_surface_marker = 7 self.fluid_marker = 8 - + def build(self): - """ This function creates the computational domain for a 2d simulation involving N panels. + """This function creates the computational domain for a 2d simulation involving N panels. The panels are set at a distance apart, rotated at an angle theta and are elevated with a distance H from the ground. - + Returns: - The function returns gmsh.model which contains the geometric description of the computational domain + The function returns gmsh.model which contains the geometric description of the computational domain """ self.mesh_comm = MPI.COMM_WORLD self.model_rank = 0 self.gdim = 3 - + # Initialize Gmsh options gmsh.initialize() gmsh.option.setNumber("General.Terminal", 0) @@ -70,10 +71,10 @@ def build(self): domain = self.pv_model.occ.addRectangle( self.params.domain.x_min, self.params.domain.y_min, - 0,#self.params.domain.z_min, + 0, # self.params.domain.z_min, self.x_span, self.y_span - #self.z_span, + # self.z_span, ) for panel_id in range(self.params.pv_array.num_rows): @@ -82,7 +83,7 @@ def build(self): -0.5 * self.params.pv_array.panel_thickness, 0, self.params.pv_array.panel_length, - self.params.pv_array.panel_thickness + self.params.pv_array.panel_thickness, ) # Rotate the panel currently centered at (0, 0, 0) @@ -95,15 +96,11 @@ def build(self): [(2, panel_box)], panel_id * self.params.pv_array.spacing[0], self.params.pv_array.elevation, - 0 + 0, ) # Remove each panel from the overall domain self.pv_model.occ.cut([(2, domain)], [(2, panel_box)]) - - - self.pv_model.occ.synchronize() return self.pv_model - \ No newline at end of file diff --git a/pvade/geometry/template/TemplateDomainCreation.py b/pvade/geometry/template/TemplateDomainCreation.py index bd454e20..0c8be2e4 100644 --- a/pvade/geometry/template/TemplateDomainCreation.py +++ b/pvade/geometry/template/TemplateDomainCreation.py @@ -9,12 +9,13 @@ class TemplateDomainCreation: - """ This class creates the geometry used for a given example. - Gmsh is used to create the computational domain + """This class creates the geometry used for a given example. + Gmsh is used to create the computational domain """ + def __init__(self, params): - """ The class is initialised here + """The class is initialised here Args: params (_type_): _description_ @@ -48,7 +49,7 @@ def __init__(self, params): self.gmsh_model.setCurrent("domain") def build(self): - """ + """ panels: This function creates the computational domain for a 3d simulation involving N panels. The panels are set at a distance apart, rotated at an angle theta and are elevated with a distance H from the ground. panels2d: This function creates the computational domain for a 2d simulation involving N panels. @@ -56,22 +57,22 @@ def build(self): cylinder3d: This function creates the computational domain for a flow around a 3D cylinder. cylinder2d: This function creates the computational domain for a flow around a 2D cylinder. Returns: - The function returns gmsh.model which contains the geometric description of the computational domain + The function returns gmsh.model which contains the geometric description of the computational domain """ pass def set_length_scales(self): - """ This function call defines the characteristic length for the mesh in locations of interst - LcMin,LcMax,DistMin and DistMax are used to create a refined mesh in specific locations - which results in a high fidelity mesh without using a uniform element size in the whole mesh. + """This function call defines the characteristic length for the mesh in locations of interst + LcMin,LcMax,DistMin and DistMax are used to create a refined mesh in specific locations + which results in a high fidelity mesh without using a uniform element size in the whole mesh. """ if self.rank == 0: all_pts = self.gmsh_model.occ.getEntities(0) self.gmsh_model.mesh.setSize(all_pts, self.params.domain.l_char) def mark_surfaces(self): - """ This function call iterates over all boundaries and assigns tags for each boundary. - The Tags are being used when appying boundaty condition. + """This function call iterates over all boundaries and assigns tags for each boundary. + The Tags are being used when appying boundaty condition. """ # Loop through all surfaces to find periodic tags surf_ids = self.gmsh_model.occ.getEntities(2) From c8ba851f6eb416d0e0023568184751f07021739e Mon Sep 17 00:00:00 2001 From: arswalid <39504093+arswalid@users.noreply.github.com> Date: Tue, 28 Mar 2023 09:48:14 -0600 Subject: [PATCH 27/94] Update DataStream.py --- pvade/DataStream.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pvade/DataStream.py b/pvade/DataStream.py index 93e784ad..c51a3b95 100644 --- a/pvade/DataStream.py +++ b/pvade/DataStream.py @@ -8,7 +8,7 @@ from pathlib import Path import pytest - +#test actions class DataStream: """Input/Output and file writing class From 9f69b7d16db92bd282799c3888dbcc2cf1a15d38 Mon Sep 17 00:00:00 2001 From: Young Date: Tue, 28 Mar 2023 12:26:28 -0600 Subject: [PATCH 28/94] trigger mesh testing on gha --- inputs/3d_cyld.yaml | 5 ++- inputs/sim_params_alt.yaml | 2 +- pvade/geometry/cylinder3d/DomainCreation.py | 2 ++ pvade/geometry/panels/DomainCreation.py | 2 +- pvade/tests/test_MeshManager.py | 36 +++++++++++++++++++++ 5 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 pvade/tests/test_MeshManager.py diff --git a/inputs/3d_cyld.yaml b/inputs/3d_cyld.yaml index 2ee634c4..6451191a 100644 --- a/inputs/3d_cyld.yaml +++ b/inputs/3d_cyld.yaml @@ -12,7 +12,7 @@ domain: y_max: 0.41 z_min: 0.0 z_max: 0.41 - l_char: 0.1 #.02 + l_char: 2.0 #.02 cyld_radius: 0.05 pv_array: num_rows: 1 # not used @@ -33,6 +33,9 @@ solver: solver1_pc: jacobi solver2_pc: jacobi solver3_pc: jacobi + save_text_interval: 0.1 + save_xdmf_interval: 0.1 + fluid: u_ref: 0.45 nu: 0.001 # Establish re = 20 with diam = 0.1 and u_bar = u_ref * (4/9) diff --git a/inputs/sim_params_alt.yaml b/inputs/sim_params_alt.yaml index e199ee0d..47b1af76 100644 --- a/inputs/sim_params_alt.yaml +++ b/inputs/sim_params_alt.yaml @@ -12,7 +12,7 @@ domain: y_max: 27 z_min: 0 z_max: 20 - l_char: 10 + l_char: 5 pv_array: num_rows: 7 elevation: 1.5 diff --git a/pvade/geometry/cylinder3d/DomainCreation.py b/pvade/geometry/cylinder3d/DomainCreation.py index ce1c6781..fb52f7d1 100644 --- a/pvade/geometry/cylinder3d/DomainCreation.py +++ b/pvade/geometry/cylinder3d/DomainCreation.py @@ -53,6 +53,8 @@ def build(self): self.gmsh_model.occ.synchronize() + return self.gmsh_model + def set_length_scales(self): # Define a distance field from the cylinder diff --git a/pvade/geometry/panels/DomainCreation.py b/pvade/geometry/panels/DomainCreation.py index 28c8ed8d..0268adad 100644 --- a/pvade/geometry/panels/DomainCreation.py +++ b/pvade/geometry/panels/DomainCreation.py @@ -11,7 +11,7 @@ import ufl import dolfinx -import meshio +# import meshio class DomainCreation(TemplateDomainCreation): diff --git a/pvade/tests/test_MeshManager.py b/pvade/tests/test_MeshManager.py new file mode 100644 index 00000000..4cfbd7aa --- /dev/null +++ b/pvade/tests/test_MeshManager.py @@ -0,0 +1,36 @@ +import pytest +import os + +@pytest.mark.unit +def test_meshing_3dpanels(): + from pvade.DataStream import DataStream + from pvade.Parameters import SimParams + from pvade.Utilities import get_input_file, write_metrics + + # Get the path to the input file from the command line + input_file = "inputs/sim_params_alt.yaml" #get_input_file() + + # Load the parameters object specified by the input file + params = SimParams(input_file) + from pvade.geometry.MeshManager3d import FSIDomain + + # Initialize the domain and construct the initial mesh + domain = FSIDomain(params) + domain.build() + +@pytest.mark.unit +def test_meshing_3dcylinder(): + from pvade.DataStream import DataStream + from pvade.Parameters import SimParams + from pvade.Utilities import get_input_file, write_metrics + + # get the path to the input file from the command line + input_file = "inputs/3d_cyld.yaml" #get_input_file() + + # load the parameters object specified by the input file + params = SimParams(input_file) + from pvade.geometry.MeshManager3d import FSIDomain + + # initialize the domain and construct the initial mesh + domain = FSIDomain(params) + domain.build() \ No newline at end of file From 0f8462fb0a57c69d5715d86c5d600e5cb9e84a10 Mon Sep 17 00:00:00 2001 From: Young Date: Tue, 28 Mar 2023 15:05:35 -0600 Subject: [PATCH 29/94] missed a pvopt to pvade conversion --- pvade/geometry/cylinder3d/DomainCreation.py | 2 +- pvade/tests/test_MeshManager.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pvade/geometry/cylinder3d/DomainCreation.py b/pvade/geometry/cylinder3d/DomainCreation.py index fb52f7d1..858648f3 100644 --- a/pvade/geometry/cylinder3d/DomainCreation.py +++ b/pvade/geometry/cylinder3d/DomainCreation.py @@ -2,7 +2,7 @@ from dolfinx.fem import VectorFunctionSpace, FunctionSpace from dolfinx.cpp import mesh as cppmesh from mpi4py import MPI -from pvopt.geometry.template.TemplateDomainCreation import TemplateDomainCreation +from pvade.geometry.template.TemplateDomainCreation import TemplateDomainCreation import gmsh import numpy as np diff --git a/pvade/tests/test_MeshManager.py b/pvade/tests/test_MeshManager.py index 4cfbd7aa..6e025dcc 100644 --- a/pvade/tests/test_MeshManager.py +++ b/pvade/tests/test_MeshManager.py @@ -33,4 +33,5 @@ def test_meshing_3dcylinder(): # initialize the domain and construct the initial mesh domain = FSIDomain(params) - domain.build() \ No newline at end of file + domain.build() + \ No newline at end of file From 5802086f615b73726117f736fbbf8dfb42884d97 Mon Sep 17 00:00:00 2001 From: arswalid Date: Wed, 29 Mar 2023 09:13:00 -0600 Subject: [PATCH 30/94] Addition of set length scale in DomainCreation --- pvade/FlowManager.py | 22 +- pvade/geometry/MeshManager2d.py | 68 ++--- pvade/geometry/MeshManager3d.py | 260 ++++++++------------ pvade/geometry/cylinder2d/DomainCreation.py | 2 +- pvade/geometry/cylinder3d/DomainCreation.py | 58 ++++- pvade/geometry/panels/DomainCreation.py | 50 +++- 6 files changed, 233 insertions(+), 227 deletions(-) diff --git a/pvade/FlowManager.py b/pvade/FlowManager.py index 6de4890b..c4b6c41e 100644 --- a/pvade/FlowManager.py +++ b/pvade/FlowManager.py @@ -557,7 +557,7 @@ def build_forms(self, domain, params): # Adams-Bashforth velocity U_AB = 1.5 * self.u_k1 - 0.5 * self.u_k2 - use_eddy_viscosity = True + use_eddy_viscosity = params.fluid.use_eddy_viscosity if use_eddy_viscosity: # By default, don't use any eddy viscosity @@ -599,20 +599,12 @@ def sigma(u, p, nu): ) # Define variational problem for step 1: tentative velocity self.F1 = ( - (1.0 / self.dt_c) * inner(self.u - self.u_k1, self.v) * dx - + inner(dot(U_AB, nabla_grad(U_CN)), self.v) * dx - + (nu + self.nu_T) * inner(grad(U_CN), grad(self.v)) * dx - + inner(grad(self.p_k1), self.v) * dx - - inner(self.dpdx, self.v) * dx - ) - # self.F1 = ( - # dot((self.u - self.u_k1) / self.dt_c, self.v) * dx - # + dot(dot(self.u_k1, nabla_grad(self.u_k1)), self.v) * dx - # + inner(sigma(U, self.p_k1, nu + self.nu_T), epsilon(self.v)) * dx - # + dot(self.p_k1 * n, self.v) * ds - # - dot(nu * nabla_grad(U) * n, self.v) * ds - # - dot(f, self.v) * dx - # ) + (1.0 / self.dt_c) * inner(self.u - self.u_k1, self.v) * dx + + inner(dot(U_AB, nabla_grad(U_CN)), self.v) * dx + + (nu + self.nu_T) * inner(grad(U_CN), grad(self.v)) * dx + + inner(grad(self.p_k1), self.v) * dx + - inner(self.dpdx, self.v) * dx + ) self.a1 = form(lhs(self.F1)) self.L1 = form(rhs(self.F1)) diff --git a/pvade/geometry/MeshManager2d.py b/pvade/geometry/MeshManager2d.py index 4f34dc70..657511e3 100644 --- a/pvade/geometry/MeshManager2d.py +++ b/pvade/geometry/MeshManager2d.py @@ -30,38 +30,22 @@ def __init__(self, params): # Store a full copy of params on this object self.params = params - problem = self.params.general.example - - if problem == "panels": - from pvopt.geometry.panels.DomainCreation import DomainCreation - dim = 3 - elif problem == "panels2d": - from pvopt.geometry.panels2d.DomainCreation import DomainCreation - dim = 2 - elif problem == "cylinder3d": - from pvopt.geometry.cylinder3d.DomainCreation import DomainCreation - dim = 3 - elif problem == "cylinder2d": - from pvopt.geometry.cylinder2d.DomainCreation import DomainCreation - dim = 2 + # problem = self.params.general.example + + # if problem == "panels2d": + # from pvade.geometry.panels2d.DomainCreation import DomainCreation + # elif problem == "cylinder2d": + # from pvade.geometry.cylinder2d.DomainCreation import DomainCreation + # define markers for boundaries - if dim == 3: - self.x_min_marker = 1 - self.y_min_marker = 2 - self.z_min_marker = 3 - self.x_max_marker = 4 - self.y_max_marker = 5 - self.z_max_marker = 6 - self.internal_surface_marker = 7 - self.fluid_marker = 8 - elif dim ==2: - self.x_min_marker = 1 - self.y_min_marker = 2 - self.x_max_marker = 4 - self.y_max_marker = 5 - self.internal_surface_marker = 7 - self.fluid_marker = 8 + + self.x_min_marker = 1 + self.y_min_marker = 2 + self.x_max_marker = 4 + self.y_max_marker = 5 + self.internal_surface_marker = 7 + self.fluid_marker = 8 def build(self): """This function call builds the geometry using Gmsh @@ -73,14 +57,10 @@ def build(self): problem = self.params.general.example - if problem == "panels": - from pvopt.geometry.panels.DomainCreation import DomainCreation - elif problem == "panels2d": - from pvopt.geometry.panels2d.DomainCreation import DomainCreation - elif problem == "cylinder3d": - from pvopt.geometry.cylinder3d.DomainCreation import DomainCreation + if problem == "panels2d": + from pvade.geometry.panels2d.DomainCreation import DomainCreation elif problem == "cylinder2d": - from pvopt.geometry.cylinder2d.DomainCreation import DomainCreation + from pvade.geometry.cylinder2d.DomainCreation import DomainCreation geometry = DomainCreation(self.params) @@ -108,16 +88,16 @@ def build(self): self.mt.name = f"{self.msh.name}_cells" self.ft.name = f"{self.msh.name}_facets" - def read(self): + def read(self,path): """Read the mesh from external file located in output/mesh """ if self.rank == 0: print("Reading the mesh from file ...") - with dolfinx.io.XDMFFile(MPI.COMM_WORLD, self.params.general.output_dir_mesh+"/mesh.xdmf", "r") as xdmf: + with dolfinx.io.XDMFFile(MPI.COMM_WORLD, path+"/mesh.xdmf", "r") as xdmf: self.msh = xdmf.read_mesh(name="Grid") self.msh.topology.create_connectivity(self.msh.topology.dim-1, self.msh.topology.dim) - with XDMFFile(MPI.COMM_WORLD,self.params.general.output_dir_mesh+"/mesh_mf.xdmf",'r') as infile: + with XDMFFile(MPI.COMM_WORLD,path+"/mesh_mf.xdmf",'r') as infile: self.ft = infile.read_meshtags(self.msh, "Grid") if self.rank == 0: print("Done.") @@ -297,7 +277,13 @@ def _generate_mesh(self): # Generate the mesh tic = time.time() - gmsh.option.setNumber("Mesh.Algorithm", 8) + + #Mesh.Algorithm 2D mesh algorithm + # (1: MeshAdapt, 2: Automatic, 3: Initial mesh only, 5: Delaunay, 6: Frontal-Delaunay, 7: BAMG, 8: Frontal-Delaunay for Quads, 9: Packing of Parallelograms) + # Default value: 6 + gmsh.option.setNumber("Mesh.Algorithm", 2) + + gmsh.option.setNumber("Mesh.RecombinationAlgorithm", 2) # gmsh.option.setNumber("Mesh.RecombineAll", 1) gmsh.option.setNumber("Mesh.SubdivisionAlgorithm", 1) diff --git a/pvade/geometry/MeshManager3d.py b/pvade/geometry/MeshManager3d.py index 07fa0770..8994e15a 100644 --- a/pvade/geometry/MeshManager3d.py +++ b/pvade/geometry/MeshManager3d.py @@ -11,7 +11,7 @@ import dolfinx import meshio -# from pvopt.geometry.panels.DomainCreation import * +# from pvade.geometry.panels.DomainCreation import * class FSIDomain: """This class creates the computational domain """ @@ -27,41 +27,20 @@ def __init__(self, params): self.rank = self.comm.Get_rank() self.num_procs = self.comm.Get_size() - # Store a full copy of params on this object + # # Store a full copy of params on this object self.params = params - - problem = self.params.general.example - - if problem == "panels": - from pvopt.geometry.panels.DomainCreation import DomainCreation - dim = 3 - elif problem == "panels2d": - from pvopt.geometry.panels2d.DomainCreation import DomainCreation - dim = 2 - elif problem == "cylinder3d": - from pvopt.geometry.cylinder3d.DomainCreation import DomainCreation - dim = 3 - elif problem == "cylinder2d": - from pvopt.geometry.cylinder2d.DomainCreation import DomainCreation - dim = 2 # define markers for boundaries - if dim == 3: - self.x_min_marker = 1 - self.y_min_marker = 2 - self.z_min_marker = 3 - self.x_max_marker = 4 - self.y_max_marker = 5 - self.z_max_marker = 6 - self.internal_surface_marker = 7 - self.fluid_marker = 8 - elif dim ==2: - self.x_min_marker = 1 - self.y_min_marker = 2 - self.x_max_marker = 4 - self.y_max_marker = 5 - self.internal_surface_marker = 7 - self.fluid_marker = 8 + + self.x_min_marker = 1 + self.y_min_marker = 2 + self.z_min_marker = 3 + self.x_max_marker = 4 + self.y_max_marker = 5 + self.z_max_marker = 6 + self.internal_surface_marker = 7 + self.fluid_marker = 8 + def build(self): """This function call builds the geometry using Gmsh @@ -74,24 +53,30 @@ def build(self): problem = self.params.general.example if problem == "panels": - from pvopt.geometry.panels.DomainCreation import DomainCreation - elif problem == "panels2d": - from pvopt.geometry.panels2d.DomainCreation import DomainCreation + from pvade.geometry.panels.DomainCreation import DomainCreation elif problem == "cylinder3d": - from pvopt.geometry.cylinder3d.DomainCreation import DomainCreation - elif problem == "cylinder2d": - from pvopt.geometry.cylinder2d.DomainCreation import DomainCreation + from pvade.geometry.cylinder3d.DomainCreation import DomainCreation + geometry = DomainCreation(self.params) - + print(geometry) # Only rank 0 builds the geometry and meshes the domain # if self.rank == 0: self.pv_model = geometry.build() + def print_model_info(model): + print("Model Info:") + for dim in range(3+1): + ents = model.occ.getEntities(dim) + print(f"| Dim {dim}: {ents}") + + print_model_info(self.pv_model) self._mark_surfaces() - self._set_length_scales_mod() # TODO: this should probably be a method of the domain creation class + self.pv_model = geometry._set_length_scales(self.pv_model,self.dom_tags) + + # self._set_length_scales() # TODO: this should probably be a method of the domain creation class if self.params.fluid.periodic: self._enforce_periodicity() @@ -108,16 +93,16 @@ def build(self): self.mt.name = f"{self.msh.name}_cells" self.ft.name = f"{self.msh.name}_facets" - def read(self): + def read(self,path): """Read the mesh from external file located in output/mesh """ if self.rank == 0: print("Reading the mesh from file ...") - with dolfinx.io.XDMFFile(MPI.COMM_WORLD, self.params.general.output_dir_mesh+"/mesh.xdmf", "r") as xdmf: + with dolfinx.io.XDMFFile(MPI.COMM_WORLD, path+"/mesh.xdmf", "r") as xdmf: self.msh = xdmf.read_mesh(name="Grid") self.msh.topology.create_connectivity(self.msh.topology.dim-1, self.msh.topology.dim) - with XDMFFile(MPI.COMM_WORLD,self.params.general.output_dir_mesh+"/mesh_mf.xdmf",'r') as infile: + with XDMFFile(MPI.COMM_WORLD,path+"/mesh_mf.xdmf",'r') as infile: self.ft = infile.read_meshtags(self.msh, "Grid") if self.rank == 0: print("Done.") @@ -179,121 +164,62 @@ def _mark_surfaces(self): self.pv_model.addPhysicalGroup(2, self.dom_tags["panel_surface"], self.internal_surface_marker) self.pv_model.setPhysicalName(2, self.internal_surface_marker, "panel_surface") - def _set_length_scales_mod(self): - res_min = self.params.domain.l_char - if self.mesh_comm.rank == self.model_rank: - # Define a distance field from the immersed panels - distance = self.pv_model.mesh.field.add("Distance", 1) - self.pv_model.mesh.field.setNumbers(distance, "FacesList", self.dom_tags["panel_surface"]) - - threshold = self.pv_model.mesh.field.add("Threshold") - self.pv_model.mesh.field.setNumber(threshold, "IField", distance) - - - factor = self.params.domain.l_char - if 'cylinder3d' in self.params.general.example: - self.cyld_radius = self.params.domain.cyld_radius - resolution = factor * self.cyld_radius / 10 - self.pv_model.mesh.field.setNumber(threshold, "LcMin", resolution) - self.pv_model.mesh.field.setNumber(threshold, "LcMax", 20 * resolution) - self.pv_model.mesh.field.setNumber(threshold, "DistMin", .5 * self.cyld_radius) - self.pv_model.mesh.field.setNumber(threshold, "DistMax", self.cyld_radius) - - else: - resolution = factor * 10*self.params.pv_array.panel_thickness/2 - half_panel = self.params.pv_array.panel_length * np.cos(self.params.pv_array.tracker_angle) - self.pv_model.mesh.field.setNumber(threshold, "LcMin", resolution*0.5) - self.pv_model.mesh.field.setNumber(threshold, "LcMax", 5*resolution) - self.pv_model.mesh.field.setNumber(threshold, "DistMin", self.params.pv_array.spacing[0]) - self.pv_model.mesh.field.setNumber(threshold, "DistMax", self.params.pv_array.spacing+half_panel) - - - # # Define a distance field from the immersed panels - # zmin_dist = self.pv_model.mesh.field.add("Distance") - # self.pv_model.mesh.field.setNumbers(zmin_dist, "FacesList", self.dom_tags["bottom"]) + # def _set_length_scales(self): + # res_min = self.params.domain.l_char + # if self.mesh_comm.rank == self.model_rank: + # # Define a distance field from the immersed panels + # distance = self.pv_model.mesh.field.add("Distance", 1) + # self.pv_model.mesh.field.setNumbers(distance, "FacesList", self.dom_tags["panel_surface"]) - # zmin_thre = self.pv_model.mesh.field.add("Threshold") - # self.pv_model.mesh.field.setNumber(zmin_thre, "IField", zmin_dist) - # self.pv_model.mesh.field.setNumber(zmin_thre, "LcMin", .5*resolution) - # self.pv_model.mesh.field.setNumber(zmin_thre, "LcMax", 5*resolution) - # self.pv_model.mesh.field.setNumber(zmin_thre, "DistMin", 1.5) - # self.pv_model.mesh.field.setNumber(zmin_thre, "DistMax", 1.5+half_panel) - - - - - # other_dist = self.pv_model.mesh.field.add("Distance") - # self.pv_model.mesh.field.setNumbers(other_dist, "FacesList", self.dom_tags["front"]) - # self.pv_model.mesh.field.setNumbers(other_dist, "FacesList", self.dom_tags["back"]) - # self.pv_model.mesh.field.setNumbers(other_dist, "FacesList", self.dom_tags["top"]) - - # other_thre = self.pv_model.mesh.field.add("Threshold") - # self.pv_model.mesh.field.setNumber(other_thre, "IField", other_dist) - # self.pv_model.mesh.field.setNumber(other_thre, "LcMin", 5.0 * self.params.domain.l_char) - # self.pv_model.mesh.field.setNumber(other_thre, "LcMax", 10.0 * self.params.domain.l_char) - # self.pv_model.mesh.field.setNumber(other_thre, "DistMin", 0.1) - # self.pv_model.mesh.field.setNumber(other_thre, "DistMax", 0.5) - + # threshold = self.pv_model.mesh.field.add("Threshold") + # self.pv_model.mesh.field.setNumber(threshold, "IField", distance) + + + # factor = self.params.domain.l_char + # if 'cylinder3d' in self.params.general.example: + # self.cyld_radius = self.params.domain.cyld_radius + # resolution = factor * self.cyld_radius / 10 + # self.pv_model.mesh.field.setNumber(threshold, "LcMin", resolution) + # self.pv_model.mesh.field.setNumber(threshold, "LcMax", 20 * resolution) + # self.pv_model.mesh.field.setNumber(threshold, "DistMin", .5 * self.cyld_radius) + # self.pv_model.mesh.field.setNumber(threshold, "DistMax", self.cyld_radius) + + # else: + # resolution = factor * 10*self.params.pv_array.panel_thickness/2 + # half_panel = self.params.pv_array.panel_length * np.cos(self.params.pv_array.tracker_angle) + # self.pv_model.mesh.field.setNumber(threshold, "LcMin", resolution*0.5) + # self.pv_model.mesh.field.setNumber(threshold, "LcMax", 5*resolution) + # self.pv_model.mesh.field.setNumber(threshold, "DistMin", self.params.pv_array.spacing[0]) + # self.pv_model.mesh.field.setNumber(threshold, "DistMax", self.params.pv_array.spacing+half_panel) + + + # # Define a distance field from the immersed panels + # zmin_dist = self.pv_model.mesh.field.add("Distance") + # self.pv_model.mesh.field.setNumbers(zmin_dist, "FacesList", self.dom_tags["bottom"]) + + # zmin_thre = self.pv_model.mesh.field.add("Threshold") + # self.pv_model.mesh.field.setNumber(zmin_thre, "IField", zmin_dist) + # self.pv_model.mesh.field.setNumber(zmin_thre, "LcMin", 2*resolution) + # self.pv_model.mesh.field.setNumber(zmin_thre, "LcMax", 5*resolution) + # self.pv_model.mesh.field.setNumber(zmin_thre, "DistMin", 0.1) + # self.pv_model.mesh.field.setNumber(zmin_thre, "DistMax", 0.5) - xy_dist = self.pv_model.mesh.field.add("Distance") - self.pv_model.mesh.field.setNumbers(xy_dist, "FacesList", self.dom_tags["left"]) - self.pv_model.mesh.field.setNumbers(xy_dist, "FacesList", self.dom_tags["right"]) + # xy_dist = self.pv_model.mesh.field.add("Distance") + # self.pv_model.mesh.field.setNumbers(xy_dist, "FacesList", self.dom_tags["left"]) + # self.pv_model.mesh.field.setNumbers(xy_dist, "FacesList", self.dom_tags["right"]) - xy_thre = self.pv_model.mesh.field.add("Threshold") - self.pv_model.mesh.field.setNumber(xy_thre, "IField", xy_dist) - self.pv_model.mesh.field.setNumber(xy_thre, "LcMin", 2 * resolution) - self.pv_model.mesh.field.setNumber(xy_thre, "LcMax", 5* resolution) - self.pv_model.mesh.field.setNumber(xy_thre, "DistMin", 0.1) - self.pv_model.mesh.field.setNumber(xy_thre, "DistMax", 0.5) + # xy_thre = self.pv_model.mesh.field.add("Threshold") + # self.pv_model.mesh.field.setNumber(xy_thre, "IField", xy_dist) + # self.pv_model.mesh.field.setNumber(xy_thre, "LcMin", 2 * resolution) + # self.pv_model.mesh.field.setNumber(xy_thre, "LcMax", 5* resolution) + # self.pv_model.mesh.field.setNumber(xy_thre, "DistMin", 0.1) + # self.pv_model.mesh.field.setNumber(xy_thre, "DistMax", 0.5) - minimum = self.pv_model.mesh.field.add("Min") - self.pv_model.mesh.field.setNumbers(minimum, "FieldsList", [threshold, xy_thre ]) - self.pv_model.mesh.field.setAsBackgroundMesh(minimum) + # minimum = self.pv_model.mesh.field.add("Min") + # self.pv_model.mesh.field.setNumbers(minimum, "FieldsList", [threshold, xy_thre, zmin_thre ]) + # self.pv_model.mesh.field.setAsBackgroundMesh(minimum) - # self.pv_model.mesh.field.setAsBackgroundMesh(7) - - # gmsh.model.mesh.field.add("Distance", 1) - # gmsh.model.mesh.field.setNumbers(1, "FacesList", self.dom_tags["panel_surface"]) - # r = res_min - # resolution = r - # gmsh.model.mesh.field.add("Threshold", 2) - # gmsh.model.mesh.field.setNumber(2, "IField", 1) - # gmsh.model.mesh.field.setNumber(2, "LcMin", resolution) - # gmsh.model.mesh.field.setNumber(2, "LcMax", 2*resolution) - # gmsh.model.mesh.field.setNumber(2, "DistMin", 0.5*r) - # gmsh.model.mesh.field.setNumber(2, "DistMax", r) - - # # We add a similar threshold at the inlet to ensure fully resolved inlet flow - - # gmsh.model.mesh.field.add("Distance", 3) - # gmsh.model.mesh.field.setNumbers(3, "FacesList", self.dom_tags['back'] ) - # gmsh.model.mesh.field.setNumbers(3, "FacesList", self.dom_tags['front'] ) - # gmsh.model.mesh.field.setNumbers(3, "FacesList", self.dom_tags['top'] ) - # gmsh.model.mesh.field.setNumbers(3, "FacesList", self.dom_tags['bottom'] ) - # gmsh.model.mesh.field.setNumbers(3, "FacesList", self.dom_tags['left'] ) - # gmsh.model.mesh.field.setNumbers(3, "FacesList", self.dom_tags['right'] ) - # gmsh.model.mesh.field.add("Threshold", 4) - # gmsh.model.mesh.field.setNumber(4, "IField", 3) - # gmsh.model.mesh.field.setNumber(4, "LcMin", 5*resolution) - # gmsh.model.mesh.field.setNumber(4, "LcMax", 10*resolution) - # gmsh.model.mesh.field.setNumber(4, "DistMin", 0.1) - # gmsh.model.mesh.field.setNumber(4, "DistMax", 0.5) - - # # We combine these fields by using the minimum field - # gmsh.model.mesh.field.add("Min", 5) - # gmsh.model.mesh.field.setNumbers(5, "FieldsList", [2, 4]) - # gmsh.model.mesh.field.setAsBackgroundMesh(5) - - - # if self.mesh_comm.rank == self.model_rank: - # gmsh.option.setNumber("Mesh.Algorithm", 5) - # gmsh.option.setNumber("Mesh.RecombinationAlgorithm", 2) - # gmsh.option.setNumber("Mesh.RecombineAll", 1) - # gmsh.option.setNumber("Mesh.SubdivisionAlgorithm", 1) - # gmsh.model.mesh.generate(3) - # gmsh.model.mesh.setOrder(2) - # gmsh.model.mesh.optimize("Netgen") def _enforce_periodicity(self): @@ -355,14 +281,34 @@ def _generate_mesh(self): # Generate the mesh tic = time.time() - gmsh.option.setNumber("Mesh.Algorithm", 8) - gmsh.option.setNumber("Mesh.RecombinationAlgorithm", 2) + + #Mesh.Algorithm 2D mesh algorithm + # (1: MeshAdapt, 2: Automatic, 3: Initial mesh only, 5: Delaunay, 6: Frontal-Delaunay, 7: BAMG, 8: Frontal-Delaunay for Quads, 9: Packing of Parallelograms) + # Default value: 6 + gmsh.option.setNumber("Mesh.Algorithm", 6) + + #3D mesh algorithm + # (1: Delaunay, 3: Initial mesh only, 4: Frontal, 7: MMG3D, 9: R-tree, 10: HXT) + # Default value: 1 + gmsh.option.setNumber("Mesh.Algorithm3D", 1) + + + # Mesh recombination algorithm + # (0: simple, 1: blossom, 2: simple full-quad, 3: blos- som full-quad) + # Default value: 1 + gmsh.option.setNumber("Mesh.RecombinationAlgorithm", 0) + + # Apply recombination algorithm to all surfaces, ignoring per-surface spec Default value: 0 # gmsh.option.setNumber("Mesh.RecombineAll", 1) - gmsh.option.setNumber("Mesh.SubdivisionAlgorithm", 1) + self.pv_model.mesh.generate(3) self.pv_model.mesh.setOrder(2) - self.pv_model.mesh.optimize("Netgen") + + + self.pv_model.mesh.optimize("Relocate3D") self.pv_model.mesh.generate(3) + + toc = time.time() if self.rank == 0: print("Finished.") diff --git a/pvade/geometry/cylinder2d/DomainCreation.py b/pvade/geometry/cylinder2d/DomainCreation.py index ee8f7cb1..f45d1d0c 100644 --- a/pvade/geometry/cylinder2d/DomainCreation.py +++ b/pvade/geometry/cylinder2d/DomainCreation.py @@ -12,7 +12,7 @@ # from pvopt.geometry.panels.domain_creation import * -class FSIDomain: +class DomainCreation: def __init__(self, params): # Get MPI communicators diff --git a/pvade/geometry/cylinder3d/DomainCreation.py b/pvade/geometry/cylinder3d/DomainCreation.py index 8a212414..41ea9d8f 100644 --- a/pvade/geometry/cylinder3d/DomainCreation.py +++ b/pvade/geometry/cylinder3d/DomainCreation.py @@ -2,7 +2,7 @@ from dolfinx.fem import VectorFunctionSpace, FunctionSpace from dolfinx.cpp import mesh as cppmesh from mpi4py import MPI -from pvopt.geometry.template.TemplateDomainCreation import TemplateDomainCreation +from pvade.geometry.template.TemplateDomainCreation import TemplateDomainCreation import gmsh import numpy as np @@ -42,19 +42,53 @@ def build(self): self.gmsh_model.occ.cut([(3, domain)], [(3, cylinder)]) self.gmsh_model.occ.synchronize() + return self.gmsh_model + + def _set_length_scales(self,pv_model,dom_tags): + res_min = self.params.domain.l_char + if self.rank == 0: + # Define a distance field from the immersed panels + distance = pv_model.mesh.field.add("Distance", 1) + pv_model.mesh.field.setNumbers(distance, "FacesList", dom_tags["panel_surface"]) + + threshold = pv_model.mesh.field.add("Threshold") + pv_model.mesh.field.setNumber(threshold, "IField", distance) - def set_length_scales(self): - # Define a distance field from the cylinder - self.gmsh_model.mesh.field.add("Distance", 1) - self.gmsh_model.mesh.field.setNumbers(1, "FacesList", self.dom_tags["internal_surface"]) + factor = self.params.domain.l_char + + self.cyld_radius = self.params.domain.cyld_radius + resolution = factor * self.cyld_radius / 10 + pv_model.mesh.field.setNumber(threshold, "LcMin", resolution) + pv_model.mesh.field.setNumber(threshold, "LcMax", 20 * resolution) + pv_model.mesh.field.setNumber(threshold, "DistMin", .5 * self.cyld_radius) + pv_model.mesh.field.setNumber(threshold, "DistMax", self.cyld_radius) - self.gmsh_model.mesh.field.add("Threshold", 2) - self.gmsh_model.mesh.field.setNumber(2, "IField", 1) - self.gmsh_model.mesh.field.setNumber(2, "LcMin", self.params.domain.l_char) - self.gmsh_model.mesh.field.setNumber(2, "LcMax", 6.0 * self.params.domain.l_char) - self.gmsh_model.mesh.field.setNumber(2, "DistMin", 2.0 * self.cyld_radius) - self.gmsh_model.mesh.field.setNumber(2, "DistMax", 4.0*self.cyld_radius) + + # Define a distance field from the immersed panels + zmin_dist = pv_model.mesh.field.add("Distance") + pv_model.mesh.field.setNumbers(zmin_dist, "FacesList", dom_tags["bottom"]) - self.gmsh_model.mesh.field.setAsBackgroundMesh(2) + zmin_thre = pv_model.mesh.field.add("Threshold") + pv_model.mesh.field.setNumber(zmin_thre, "IField", zmin_dist) + pv_model.mesh.field.setNumber(zmin_thre, "LcMin", 2*resolution) + pv_model.mesh.field.setNumber(zmin_thre, "LcMax", 5*resolution) + pv_model.mesh.field.setNumber(zmin_thre, "DistMin", 0.1) + pv_model.mesh.field.setNumber(zmin_thre, "DistMax", 0.5) + + xy_dist = pv_model.mesh.field.add("Distance") + pv_model.mesh.field.setNumbers(xy_dist, "FacesList", dom_tags["left"]) + pv_model.mesh.field.setNumbers(xy_dist, "FacesList", dom_tags["right"]) + + xy_thre = pv_model.mesh.field.add("Threshold") + pv_model.mesh.field.setNumber(xy_thre, "IField", xy_dist) + pv_model.mesh.field.setNumber(xy_thre, "LcMin", 2 * resolution) + pv_model.mesh.field.setNumber(xy_thre, "LcMax", 5* resolution) + pv_model.mesh.field.setNumber(xy_thre, "DistMin", 0.1) + pv_model.mesh.field.setNumber(xy_thre, "DistMax", 0.5) + + minimum = pv_model.mesh.field.add("Min") + pv_model.mesh.field.setNumbers(minimum, "FieldsList", [threshold, xy_thre, zmin_thre ]) + pv_model.mesh.field.setAsBackgroundMesh(minimum) + return pv_model \ No newline at end of file diff --git a/pvade/geometry/panels/DomainCreation.py b/pvade/geometry/panels/DomainCreation.py index d4124793..ecc5e544 100644 --- a/pvade/geometry/panels/DomainCreation.py +++ b/pvade/geometry/panels/DomainCreation.py @@ -2,7 +2,7 @@ from dolfinx.fem import VectorFunctionSpace, FunctionSpace from dolfinx.cpp import mesh as cppmesh from mpi4py import MPI -from pvopt.geometry.template.TemplateDomainCreation import TemplateDomainCreation +from pvade.geometry.template.TemplateDomainCreation import TemplateDomainCreation import gmsh import numpy as np @@ -65,3 +65,51 @@ def build(self): self.gmsh_model.occ.synchronize() return self.gmsh_model + def _set_length_scales(self,pv_model,dom_tags): + res_min = self.params.domain.l_char + if self.rank == 0: + # Define a distance field from the immersed panels + distance = pv_model.mesh.field.add("Distance", 1) + pv_model.mesh.field.setNumbers(distance, "FacesList", dom_tags["panel_surface"]) + + threshold = pv_model.mesh.field.add("Threshold") + pv_model.mesh.field.setNumber(threshold, "IField", distance) + + + factor = self.params.domain.l_char + + resolution = factor * 10*self.params.pv_array.panel_thickness/2 + half_panel = self.params.pv_array.panel_length * np.cos(self.params.pv_array.tracker_angle) + pv_model.mesh.field.setNumber(threshold, "LcMin", resolution*0.5) + pv_model.mesh.field.setNumber(threshold, "LcMax", 5*resolution) + pv_model.mesh.field.setNumber(threshold, "DistMin", self.params.pv_array.spacing[0]) + pv_model.mesh.field.setNumber(threshold, "DistMax", self.params.pv_array.spacing+half_panel) + + + # Define a distance field from the immersed panels + zmin_dist = pv_model.mesh.field.add("Distance") + pv_model.mesh.field.setNumbers(zmin_dist, "FacesList", dom_tags["bottom"]) + + zmin_thre = pv_model.mesh.field.add("Threshold") + pv_model.mesh.field.setNumber(zmin_thre, "IField", zmin_dist) + pv_model.mesh.field.setNumber(zmin_thre, "LcMin", 2*resolution) + pv_model.mesh.field.setNumber(zmin_thre, "LcMax", 5*resolution) + pv_model.mesh.field.setNumber(zmin_thre, "DistMin", 0.1) + pv_model.mesh.field.setNumber(zmin_thre, "DistMax", 0.5) + + xy_dist = pv_model.mesh.field.add("Distance") + pv_model.mesh.field.setNumbers(xy_dist, "FacesList", dom_tags["left"]) + pv_model.mesh.field.setNumbers(xy_dist, "FacesList", dom_tags["right"]) + + xy_thre = pv_model.mesh.field.add("Threshold") + pv_model.mesh.field.setNumber(xy_thre, "IField", xy_dist) + pv_model.mesh.field.setNumber(xy_thre, "LcMin", 2 * resolution) + pv_model.mesh.field.setNumber(xy_thre, "LcMax", 5* resolution) + pv_model.mesh.field.setNumber(xy_thre, "DistMin", 0.1) + pv_model.mesh.field.setNumber(xy_thre, "DistMax", 0.5) + + + minimum = pv_model.mesh.field.add("Min") + pv_model.mesh.field.setNumbers(minimum, "FieldsList", [threshold, xy_thre, zmin_thre ]) + pv_model.mesh.field.setAsBackgroundMesh(minimum) + return pv_model \ No newline at end of file From 00ba48b1de8d200d801e766cb520716e22ba92e0 Mon Sep 17 00:00:00 2001 From: arswalid Date: Wed, 29 Mar 2023 10:45:25 -0600 Subject: [PATCH 31/94] adding flow pytest --- pvade/tests/inputs_test/2d_cyld.yaml | 55 ++++++++++ pvade/tests/inputs_test/3d_cyld.yaml | 59 ++++++++++ pvade/tests/inputs_test/sim_params_alt.yaml | 50 +++++++++ .../tests/inputs_test/sim_params_alt_2D.yaml | 46 ++++++++ pvade/tests/test_meshing.py | 75 +++++++++++++ pvade/tests/test_solve.py | 103 ++++++++++++++++++ 6 files changed, 388 insertions(+) create mode 100644 pvade/tests/inputs_test/2d_cyld.yaml create mode 100644 pvade/tests/inputs_test/3d_cyld.yaml create mode 100644 pvade/tests/inputs_test/sim_params_alt.yaml create mode 100644 pvade/tests/inputs_test/sim_params_alt_2D.yaml create mode 100644 pvade/tests/test_meshing.py create mode 100644 pvade/tests/test_solve.py diff --git a/pvade/tests/inputs_test/2d_cyld.yaml b/pvade/tests/inputs_test/2d_cyld.yaml new file mode 100644 index 00000000..9fae3404 --- /dev/null +++ b/pvade/tests/inputs_test/2d_cyld.yaml @@ -0,0 +1,55 @@ +general: + example: cylinder2d + output_dir_mesh: output/cylinder2d/mesh + output_dir_sol: output/cylinder2d/solution + create_mesh: True + read_mesh: false + mesh_only: False +domain: + x_min: 0.0 + x_max: 2.5 + y_min: 0.0 + y_max: 0.41 + l_char: .05 + cyld_radius: 0.05 +pv_array: + num_rows: 1 # not used + elevation: 1.5 # not used + spacing: [7.0] # not used + panel_length: 2.0 # not used + panel_width: 7.0 # not used + panel_thickness: 0.1 # not used + tracker_angle: 30.0 # not used +solver: + dt: 0.000625 + t_final: 3 + save_text_every: 0.1 + save_vtk_every: 0.1 + solver1_ksp: gmres + solver2_ksp: cg + solver3_ksp: cg + solver1_pc: jacobi + solver2_pc: jacobi + solver3_pc: jacobi + save_text_interval: 0.1 + save_xdmf_interval: 0.1 +fluid: + use_eddy_viscosity: False + u_ref: 2.5 + nu: 0.001 # Establish re = 20 with diam = 0.1 and u_bar = u_ref * (4/9) + dpdx: 0.0 + turbulence_model: none + periodic: false + # c_s: 0.325 + bc_ywall_max: noslip # slip noslip free + bc_ywall_min: noslip # slip noslip free +structure: + youngs: 1.0e+09 +# Boundary_conditions: +# top: noslip +# bottom: noslip +# left: inflow +# right: free +# front: noslip +# back: noslip + diff --git a/pvade/tests/inputs_test/3d_cyld.yaml b/pvade/tests/inputs_test/3d_cyld.yaml new file mode 100644 index 00000000..9c951fac --- /dev/null +++ b/pvade/tests/inputs_test/3d_cyld.yaml @@ -0,0 +1,59 @@ +general: + example: cylinder3d + output_dir_mesh: output/cylinder3d/mesh + output_dir_sol: output/cylinder3d/solution + create_mesh: True + read_mesh: False + mesh_only: True +domain: + x_min: 0.0 + x_max: 2.5 + y_min: 0.0 + y_max: 0.41 + z_min: 0.0 + z_max: 0.41 + l_char: 20 #.02 + cyld_radius: 0.05 +pv_array: + num_rows: 1 # not used + elevation: 1.5 # not used + spacing: [7.0] # not used + panel_length: 2.0 # not used + panel_width: 7.0 # not used + panel_thickness: 0.1 # not used + tracker_angle: 30.0 # not used +solver: + dt: 0.025 + t_final: 0.1 + save_text_every: 0.1 + save_vtk_every: 0.1 + solver1_ksp: cg + solver2_ksp: cg + solver3_ksp: cg + solver1_pc: jacobi + solver2_pc: jacobi + solver3_pc: jacobi + save_text_interval: 0.1 + save_xdmf_interval: 0.1 +fluid: + use_eddy_viscosity: True + u_ref: 0.45 + nu: 0.001 # Establish re = 20 with diam = 0.1 and u_bar = u_ref * (4/9) + dpdx: 0.0 + turbulence_model: none + periodic: false + # c_s: 0.325 + bc_ywall_max: noslip # slip noslip free + bc_ywall_min: noslip # slip noslip free + bc_zwall_max: noslip # slip noslip free + bc_zwall_min: noslip # slip noslip free +structure: + youngs: 1.0e+09 +# Boundary_conditions: +# top: noslip +# bottom: noslip +# left: inflow +# right: free +# front: noslip +# back: noslip + diff --git a/pvade/tests/inputs_test/sim_params_alt.yaml b/pvade/tests/inputs_test/sim_params_alt.yaml new file mode 100644 index 00000000..cab2d8b3 --- /dev/null +++ b/pvade/tests/inputs_test/sim_params_alt.yaml @@ -0,0 +1,50 @@ +general: + example: panels + output_dir_mesh: output/panels/mesh + output_dir_sol: output/panels/solution + create_mesh: True + read_mesh: False + mesh_only: True +domain: + x_min: -10 + x_max: 50 + y_min: -20 + y_max: 27 + z_min: 0 + z_max: 20 + l_char: 20 +pv_array: + num_rows: 7 + elevation: 1.5 + spacing: [7.0] + panel_length: 2.0 + panel_width: 7.0 + panel_thickness: 0.1 + tracker_angle: 30.0 +solver: + dt: 0.005 + t_final: 10.0 + save_text_every: 0.01 + save_vtk_every: 0.01 + solver1_ksp: cg + solver2_ksp: cg + solver3_ksp: cg + solver1_pc: jacobi + solver2_pc: jacobi + solver3_pc: jacobi + save_text_interval: 0.1 + save_xdmf_interval: 0.1 +fluid: + use_eddy_viscosity: True + u_ref: 8.0 + nu: 0.01 + dpdx_val: 0.0 + turbulence_model: none + periodic: false + bc_ywall_max: slip # slip noslip free + bc_ywall_min: slip # slip noslip free + bc_zwall_max: slip # slip noslip free + bc_zwall_min: noslip # slip noslip free + # c_s: 0.325 +structure: + youngs: 1.0e+09 diff --git a/pvade/tests/inputs_test/sim_params_alt_2D.yaml b/pvade/tests/inputs_test/sim_params_alt_2D.yaml new file mode 100644 index 00000000..239df46e --- /dev/null +++ b/pvade/tests/inputs_test/sim_params_alt_2D.yaml @@ -0,0 +1,46 @@ +general: + example: panels2d + output_dir_mesh: output/panels2d/mesh + output_dir_sol: output/panels2d/solution + create_mesh: True + read_mesh: False + mesh_only: False +domain: + x_min: -10 + x_max: 50 + y_min: 0 + y_max: 20 + l_char: 0.9 +pv_array: + num_rows: 3 + elevation: 1.5 + spacing: [7.0] + panel_length: 2.0 + panel_width: 7.0 + panel_thickness: 0.1 + tracker_angle: 30.0 +solver: + dt: 0.005 + t_final: 0.1 + save_text_every: 0.01 + save_vtk_every: 0.01 + solver1_ksp: gmres + solver2_ksp: cg + solver3_ksp: cg + solver1_pc: jacobi + solver2_pc: jacobi + solver3_pc: jacobi + save_text_interval: 0.1 + save_xdmf_interval: 0.1 +fluid: + use_eddy_viscosity: False + u_ref: 0.8 + nu: 0.001 + dpdx_val: 0.0 + turbulence_model: none + periodic: false + bc_ywall_max: slip # slip noslip free + bc_ywall_min: noslip # slip noslip free + # c_s: 0.325 +structure: + youngs: 1.0e+09 diff --git a/pvade/tests/test_meshing.py b/pvade/tests/test_meshing.py new file mode 100644 index 00000000..63867780 --- /dev/null +++ b/pvade/tests/test_meshing.py @@ -0,0 +1,75 @@ +import pytest +import os + + +input_path="pvade/tests/inputs_test/" + +@pytest.mark.unit +def test_meshing_2dcylinder(): + from pvade.DataStream import DataStream + from pvade.Parameters import SimParams + from pvade.Utilities import get_input_file, write_metrics + + # Get the path to the input file from the command line + input_file = input_path+"2d_cyld.yaml" #get_input_file() + + # Load the parameters object specified by the input file + params = SimParams(input_file) + + from pvade.geometry.MeshManager2d import FSIDomain + + # Initialize the domain and construct the initial mesh + domain = FSIDomain(params) + domain.build() + + +@pytest.mark.unit +def test_meshing_2dpanels(): + from pvade.DataStream import DataStream + from pvade.Parameters import SimParams + from pvade.Utilities import get_input_file, write_metrics + # Get the path to the input file from the command line + input_file = input_path+"sim_params_alt_2D.yaml" #get_input_file() + + # Load the parameters object specified by the input file + params = SimParams(input_file) + + from pvade.geometry.MeshManager2d import FSIDomain + + # Initialize the domain and construct the initial mesh + domain = FSIDomain(params) + domain.build() + +@pytest.mark.unit +def test_meshing_3dpanels(): + from pvade.DataStream import DataStream + from pvade.Parameters import SimParams + from pvade.Utilities import get_input_file, write_metrics + # Get the path to the input file from the command line + input_file = input_path+"sim_params_alt.yaml" #get_input_file() + + # Load the parameters object specified by the input file + params = SimParams(input_file) + + from pvade.geometry.MeshManager3d import FSIDomain + + # Initialize the domain and construct the initial mesh + domain = FSIDomain(params) + domain.build() + +@pytest.mark.unit +def test_meshing_3dcylinder(): + from pvade.DataStream import DataStream + from pvade.Parameters import SimParams + from pvade.Utilities import get_input_file, write_metrics + # get the path to the input file from the command line + input_file = input_path+"3d_cyld.yaml" #get_input_file() + + # load the parameters object specified by the input file + params = SimParams(input_file) + + from pvade.geometry.MeshManager3d import FSIDomain + + # initialize the domain and construct the initial mesh + domain = FSIDomain(params) + domain.build() diff --git a/pvade/tests/test_solve.py b/pvade/tests/test_solve.py new file mode 100644 index 00000000..2e58aa3b --- /dev/null +++ b/pvade/tests/test_solve.py @@ -0,0 +1,103 @@ +import pytest +import os + + +from pvade.FlowManager import Flow +from pvade.DataStream import DataStream +from pvade.Parameters import SimParams +from pvade.Utilities import get_input_file, write_metrics + +from dolfinx.common import TimingType, list_timings +import cProfile +import sys +import tqdm.autonotebook + +input_path="pvade/tests/inputs_test/" + +@pytest.mark.unit +def test_flow_3dpanels(): + # Get the path to the input file from the command line + input_file = input_path+"sim_params_alt.yaml" #get_input_file() + + # Load the parameters object specified by the input file + params = SimParams(input_file) + + from pvade.geometry.MeshManager3d import FSIDomain + + # Initialize the domain and construct the initial mesh + domain = FSIDomain(params) + domain.read("pvade/tests/test_mesh/panels") + # Initialize the function spaces for the flow + flow = Flow(domain) + # # # Specify the boundary conditions + flow.build_boundary_conditions(domain, params) + # # # Build the fluid forms + flow.build_forms(domain, params) + dataIO = DataStream(domain, flow, params) + flow.solve(params) + +@pytest.mark.unit +def test_flow_2dpanels(): + # Get the path to the input file from the command line + input_file = input_path+"sim_params_alt_2D.yaml" #get_input_file() + + # Load the parameters object specified by the input file + params = SimParams(input_file) + + from pvade.geometry.MeshManager2d import FSIDomain + + # Initialize the domain and construct the initial mesh + domain = FSIDomain(params) + domain.read("pvade/tests/test_mesh/panels2d") + # Initialize the function spaces for the flow + flow = Flow(domain) + # # # Specify the boundary conditions + flow.build_boundary_conditions(domain, params) + # # # Build the fluid forms + flow.build_forms(domain, params) + dataIO = DataStream(domain, flow, params) + flow.solve(params) + +@pytest.mark.unit +def test_flow_2dcylinder(): + # Get the path to the input file from the command line + input_file = input_path+"2d_cyld.yaml" #get_input_file() + + # Load the parameters object specified by the input file + params = SimParams(input_file) + + from pvade.geometry.MeshManager2d import FSIDomain + + # Initialize the domain and construct the initial mesh + domain = FSIDomain(params) + domain.read("pvade/tests/test_mesh/cylinder2d") + # Initialize the function spaces for the flow + flow = Flow(domain) + # # # Specify the boundary conditions + flow.build_boundary_conditions(domain, params) + # # # Build the fluid forms + flow.build_forms(domain, params) + dataIO = DataStream(domain, flow, params) + flow.solve(params) + +@pytest.mark.unit +def test_flow_3dcylinder(): + # Get the path to the input file from the command line + input_file = input_path+"3d_cyld.yaml" #get_input_file() + + # Load the parameters object specified by the input file + params = SimParams(input_file) + + from pvade.geometry.MeshManager3d import FSIDomain + + # Initialize the domain and construct the initial mesh + domain = FSIDomain(params) + domain.read("pvade/tests/test_mesh/cylinder3d") + # Initialize the function spaces for the flow + flow = Flow(domain) + # # # Specify the boundary conditions + flow.build_boundary_conditions(domain, params) + # # # Build the fluid forms + flow.build_forms(domain, params) + dataIO = DataStream(domain, flow, params) + flow.solve(params) From 8b1dc47747e63bb7cd34913ae58e23cb3a02ddb1 Mon Sep 17 00:00:00 2001 From: arswalid Date: Wed, 29 Mar 2023 13:04:08 -0600 Subject: [PATCH 32/94] addition of seperate tests --- ns_main.py | 3 +- pvade/geometry/MeshManager3d.py | 5 ++- pvade/geometry/cylinder2d/DomainCreation.py | 4 +-- pvade/tests/test_MeshManager.py | 37 --------------------- pvade/tests/test_MeshManager_2dcylinder.py | 23 +++++++++++++ pvade/tests/test_MeshManager_2dpanels.py | 22 ++++++++++++ pvade/tests/test_MeshManager_3dcylinder.py | 21 ++++++++++++ pvade/tests/test_MeshManager_3dpanels.py | 21 ++++++++++++ 8 files changed, 93 insertions(+), 43 deletions(-) delete mode 100644 pvade/tests/test_MeshManager.py create mode 100644 pvade/tests/test_MeshManager_2dcylinder.py create mode 100644 pvade/tests/test_MeshManager_2dpanels.py create mode 100644 pvade/tests/test_MeshManager_3dcylinder.py create mode 100644 pvade/tests/test_MeshManager_3dpanels.py diff --git a/ns_main.py b/ns_main.py index b1223709..40282eab 100644 --- a/ns_main.py +++ b/ns_main.py @@ -12,7 +12,8 @@ def main(): # Get the path to the input file from the command line - input_file = get_input_file() + # input_file = get_input_file() + input_file = "inputs/2d_cyld.yaml" #get_input_file() # Load the parameters object specified by the input file params = SimParams(input_file) diff --git a/pvade/geometry/MeshManager3d.py b/pvade/geometry/MeshManager3d.py index 5a45f944..1515d5f4 100644 --- a/pvade/geometry/MeshManager3d.py +++ b/pvade/geometry/MeshManager3d.py @@ -93,7 +93,7 @@ def build(self): def read(self,path): - """"""Read the mesh from an external file. + """Read the mesh from an external file. The User can load an existing mesh file (mesh.xdmf) and use it to solve the CFD/CSD problem """ @@ -319,8 +319,7 @@ def _generate_mesh(self): print(f"Total meshing time = {toc-tic:.1f} s") def write_mesh_file(self): - """ - TODO: when saving a mesh file using only dolfinx functions + """ TODO: when saving a mesh file using only dolfinx functions it's possible certain elements of the data aren't preserved and that the mesh won't be able to be properly read in later on. MAKE SURE YOU CAN SAVE A MESH USING ONLY DOLFINX FUNCTIONS diff --git a/pvade/geometry/cylinder2d/DomainCreation.py b/pvade/geometry/cylinder2d/DomainCreation.py index 98409796..ed99cad0 100644 --- a/pvade/geometry/cylinder2d/DomainCreation.py +++ b/pvade/geometry/cylinder2d/DomainCreation.py @@ -53,9 +53,9 @@ def build(self): 0, self.params.domain.x_max, self.params.domain.y_max, - tag=1, + tag=500 ) - obstacle = self.pv_model.occ.addDisk(c_x, c_y, 0, r, r) + obstacle = self.pv_model.occ.addDisk(c_x, c_y, 0, r, r,tag=600) if mesh_comm.rank == model_rank: self.pv_model.occ.cut([(gdim, rectangle)], [(gdim, obstacle)]) diff --git a/pvade/tests/test_MeshManager.py b/pvade/tests/test_MeshManager.py deleted file mode 100644 index 6e025dcc..00000000 --- a/pvade/tests/test_MeshManager.py +++ /dev/null @@ -1,37 +0,0 @@ -import pytest -import os - -@pytest.mark.unit -def test_meshing_3dpanels(): - from pvade.DataStream import DataStream - from pvade.Parameters import SimParams - from pvade.Utilities import get_input_file, write_metrics - - # Get the path to the input file from the command line - input_file = "inputs/sim_params_alt.yaml" #get_input_file() - - # Load the parameters object specified by the input file - params = SimParams(input_file) - from pvade.geometry.MeshManager3d import FSIDomain - - # Initialize the domain and construct the initial mesh - domain = FSIDomain(params) - domain.build() - -@pytest.mark.unit -def test_meshing_3dcylinder(): - from pvade.DataStream import DataStream - from pvade.Parameters import SimParams - from pvade.Utilities import get_input_file, write_metrics - - # get the path to the input file from the command line - input_file = "inputs/3d_cyld.yaml" #get_input_file() - - # load the parameters object specified by the input file - params = SimParams(input_file) - from pvade.geometry.MeshManager3d import FSIDomain - - # initialize the domain and construct the initial mesh - domain = FSIDomain(params) - domain.build() - \ No newline at end of file diff --git a/pvade/tests/test_MeshManager_2dcylinder.py b/pvade/tests/test_MeshManager_2dcylinder.py new file mode 100644 index 00000000..82c4749e --- /dev/null +++ b/pvade/tests/test_MeshManager_2dcylinder.py @@ -0,0 +1,23 @@ +import pytest +import os +import sys + +@pytest.mark.unit +def test_meshing_cylinder2d(): + sys.modules[__name__].__dict__.clear() + input_path="pvade/tests/inputs_test/" + from pvade.DataStream import DataStream + from pvade.Parameters import SimParams + from pvade.Utilities import get_input_file, write_metrics + + # Get the path to the input file from the command line + input_file = input_path+"2d_cyld.yaml" #get_input_file() + + # Load the parameters object specified by the input file + params = SimParams(input_file) + + from pvade.geometry.MeshManager2d import FSIDomain + + # Initialize the domain and construct the initial mesh + domain = FSIDomain(params) + domain.build() diff --git a/pvade/tests/test_MeshManager_2dpanels.py b/pvade/tests/test_MeshManager_2dpanels.py new file mode 100644 index 00000000..fa3b6e55 --- /dev/null +++ b/pvade/tests/test_MeshManager_2dpanels.py @@ -0,0 +1,22 @@ +import pytest +import os +import sys + +@pytest.mark.unit +def test_meshing_2dpanels(): + sys.modules[__name__].__dict__.clear() + input_path="pvade/tests/inputs_test/" + from pvade.DataStream import DataStream + from pvade.Parameters import SimParams + from pvade.Utilities import get_input_file, write_metrics + # Get the path to the input file from the command line + input_file = input_path+"sim_params_alt_2D.yaml" #get_input_file() + + # Load the parameters object specified by the input file + params = SimParams(input_file) + + from pvade.geometry.MeshManager2d import FSIDomain + + # Initialize the domain and construct the initial mesh + domain = FSIDomain(params) + domain.build() diff --git a/pvade/tests/test_MeshManager_3dcylinder.py b/pvade/tests/test_MeshManager_3dcylinder.py new file mode 100644 index 00000000..c2c9af0c --- /dev/null +++ b/pvade/tests/test_MeshManager_3dcylinder.py @@ -0,0 +1,21 @@ +import pytest +import os + + +@pytest.mark.unit() +def test_meshing_cylinder3d(): + input_path="pvade/tests/inputs_test/" + from pvade.DataStream import DataStream + from pvade.Parameters import SimParams + from pvade.Utilities import get_input_file, write_metrics + + # get the path to the input file from the command line + input_file = input_path+"3d_cyld.yaml" #get_input_file() + + # load the parameters object specified by the input file + params = SimParams(input_file) + from pvade.geometry.MeshManager3d import FSIDomain + + # initialize the domain and construct the initial mesh + domain = FSIDomain(params) + domain.build() diff --git a/pvade/tests/test_MeshManager_3dpanels.py b/pvade/tests/test_MeshManager_3dpanels.py new file mode 100644 index 00000000..a4d2778e --- /dev/null +++ b/pvade/tests/test_MeshManager_3dpanels.py @@ -0,0 +1,21 @@ +import pytest +import os + +@pytest.mark.unit +def test_meshing_3dpanels(): + input_path="pvade/tests/inputs_test/" + from pvade.DataStream import DataStream + from pvade.Parameters import SimParams + from pvade.Utilities import get_input_file, write_metrics + + # Get the path to the input file from the command line + input_file = input_path+"sim_params_alt.yaml" #get_input_file() + + # Load the parameters object specified by the input file + params = SimParams(input_file) + from pvade.geometry.MeshManager3d import FSIDomain + + # Initialize the domain and construct the initial mesh + domain = FSIDomain(params) + domain.build() + From d5f4db15cfc816937cf921cb6c075e9bda4d210f Mon Sep 17 00:00:00 2001 From: arswalid Date: Wed, 29 Mar 2023 13:15:30 -0600 Subject: [PATCH 33/94] adding meshes for tests --- pvade/tests/test_mesh/cylinder2d/mesh.h5 | Bin 0 -> 171025 bytes pvade/tests/test_mesh/cylinder2d/mesh.xdmf | 1 + pvade/tests/test_mesh/cylinder2d/mesh_mf.h5 | Bin 0 -> 118206 bytes pvade/tests/test_mesh/cylinder2d/mesh_mf.xdmf | 1 + pvade/tests/test_mesh/cylinder3d/mesh.h5 | Bin 0 -> 33357 bytes pvade/tests/test_mesh/cylinder3d/mesh.xdmf | 1 + pvade/tests/test_mesh/cylinder3d/mesh_mf.h5 | Bin 0 -> 23278 bytes pvade/tests/test_mesh/cylinder3d/mesh_mf.xdmf | 1 + pvade/tests/test_mesh/panels/mesh.h5 | Bin 0 -> 24769 bytes pvade/tests/test_mesh/panels/mesh.xdmf | 1 + pvade/tests/test_mesh/panels/mesh_mf.h5 | Bin 0 -> 16950 bytes pvade/tests/test_mesh/panels/mesh_mf.xdmf | 1 + pvade/tests/test_mesh/panels2d/mesh.h5 | Bin 0 -> 711561 bytes pvade/tests/test_mesh/panels2d/mesh.xdmf | 1 + pvade/tests/test_mesh/panels2d/mesh_mf.h5 | Bin 0 -> 485178 bytes pvade/tests/test_mesh/panels2d/mesh_mf.xdmf | 1 + 16 files changed, 8 insertions(+) create mode 100644 pvade/tests/test_mesh/cylinder2d/mesh.h5 create mode 100644 pvade/tests/test_mesh/cylinder2d/mesh.xdmf create mode 100644 pvade/tests/test_mesh/cylinder2d/mesh_mf.h5 create mode 100644 pvade/tests/test_mesh/cylinder2d/mesh_mf.xdmf create mode 100644 pvade/tests/test_mesh/cylinder3d/mesh.h5 create mode 100644 pvade/tests/test_mesh/cylinder3d/mesh.xdmf create mode 100644 pvade/tests/test_mesh/cylinder3d/mesh_mf.h5 create mode 100644 pvade/tests/test_mesh/cylinder3d/mesh_mf.xdmf create mode 100644 pvade/tests/test_mesh/panels/mesh.h5 create mode 100644 pvade/tests/test_mesh/panels/mesh.xdmf create mode 100644 pvade/tests/test_mesh/panels/mesh_mf.h5 create mode 100644 pvade/tests/test_mesh/panels/mesh_mf.xdmf create mode 100644 pvade/tests/test_mesh/panels2d/mesh.h5 create mode 100644 pvade/tests/test_mesh/panels2d/mesh.xdmf create mode 100644 pvade/tests/test_mesh/panels2d/mesh_mf.h5 create mode 100644 pvade/tests/test_mesh/panels2d/mesh_mf.xdmf diff --git a/pvade/tests/test_mesh/cylinder2d/mesh.h5 b/pvade/tests/test_mesh/cylinder2d/mesh.h5 new file mode 100644 index 0000000000000000000000000000000000000000..1972b228f22c021b4c3639ccecfc435454498c83 GIT binary patch literal 171025 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�l1j*}HV{CqCZ}H|D7^Y5*{@7m$tD&?F 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

t%V5(pWbpzYT-xhJ{) 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

ZTa{UMBX#;wrn8weHbEkGFgQQvam+ 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 literal 0 HcmV?d00001 diff --git a/pvade/tests/test_mesh/cylinder2d/mesh.xdmf b/pvade/tests/test_mesh/cylinder2d/mesh.xdmf new file mode 100644 index 00000000..cfe85640 --- /dev/null +++ b/pvade/tests/test_mesh/cylinder2d/mesh.xdmf @@ -0,0 +1 @@ +mesh.h5:/data0mesh.h5:/data1mesh.h5:/data2 \ No newline at end of file diff --git a/pvade/tests/test_mesh/cylinder2d/mesh_mf.h5 b/pvade/tests/test_mesh/cylinder2d/mesh_mf.h5 new file mode 100644 index 0000000000000000000000000000000000000000..e4f07e40ef151b599fe1c92325c3e0e33eab1237 GIT binary patch literal 118206 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 Lfjmesh_mf.h5:/data0mesh_mf.h5:/data1mesh_mf.h5:/data2 \ No newline at end of file diff --git a/pvade/tests/test_mesh/cylinder3d/mesh.h5 b/pvade/tests/test_mesh/cylinder3d/mesh.h5 new file mode 100644 index 0000000000000000000000000000000000000000..b75c7401d26d123f978c197371756c57bd455b41 GIT binary patch literal 33357 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ñd6x~*-(+5Iwm0y*;QVi~V5 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 literal 0 HcmV?d00001 diff --git a/pvade/tests/test_mesh/cylinder3d/mesh.xdmf b/pvade/tests/test_mesh/cylinder3d/mesh.xdmf new file mode 100644 index 00000000..53c4f5c7 --- /dev/null +++ b/pvade/tests/test_mesh/cylinder3d/mesh.xdmf @@ -0,0 +1 @@ +mesh.h5:/data0mesh.h5:/data1mesh.h5:/data2 \ No newline at end of file diff --git a/pvade/tests/test_mesh/cylinder3d/mesh_mf.h5 b/pvade/tests/test_mesh/cylinder3d/mesh_mf.h5 new file mode 100644 index 0000000000000000000000000000000000000000..d7d4f270b1b64b5339299fb0e6dcf47c78d8f00d GIT binary patch literal 23278 zcmeIacT`l*voA_UKtMo6G75+Yg5(U6C4+$EoFs=KXCzBhksL*GmYj1QavHLv8DM}B z24;XEJp6rit$WV7=e+mFd3W7)uRXJNbyrnab$>eSHM^&F)N5&3LVQYmv|s7Y9W*So zd;iM*x!n9thkE~T{*?d7O@3$4f78g{vEQ2q_PdB?Vd`f3^0x4ca{i`V zxAf2a6!@d~|B<4j;rvtgw*hptXaA~+j`0t}@3()<-}e4}8S{4L|I#F(7e~AEFP&Ft zJOpSwH@_=j-*SJ+F);seLx4vAuMGM>=5O=A^+FPZWN$|E%lx>i@Og z|0&X6`yDzO#(&uFR*3%V9##?mBTps&hyEJ$|5=Kq{kPmddVhxN&-ndYt-qze2>eCh zF9LrN_=~__1pXrM7lHrX5b!c`Pw^Jf(x)1TmzvMlWF*w&N>-a;l7dERJbOY}@u{?e zlTmqiA{0jkFJCQs?M zzeZl#V*c8oRp8z6YaPBQxLvx#O2L~Cfc7|5ADR;E8&8_Z^T*8Kh>VmD`b1jsmn4d5 za_cl+hnD0H>ul9!^h6 zZj@a*Fd7-~Jji4m`(Q+By}ireGUtc$I^#=VLa#2I`l-v?m;?c6TOQ+>5A0D?&8o1< zMj2A&(-|y>1f7*QwFcZHduv0J)Oz%DX0LAW7;Ili#?K@3iCBvYNrb!5^2)u`uWuu7 zjJ(9g%J6r@3ooO3o%-O>!%MuM1>y(%nXJDMkTu8DBs&SGx0%s=qKTgdZ|5GiDI z4Ab2vCQZJ>*|3@yjv#S0?h3o+RhTHwfRrFwhF}Ve@(RYlGFjo>LF| zj>rsc6i`lXmWb4N>+U6Y_0pzKA^n#K z`L+2y^`79zTmJD{@H{crt&QJh*Etb&f5|cYt-MGdB0=@>$IN?zTU9D9Z5N~RKBwuQ zPxknkcOL|A`p681Kp(8PIcMD*R8Dv^9^W9ecSOd(pi7%9Y&c<00ANR)v)%mzbAo`r zCj1kPBZY;Ss91b2i{+;Z%TGU%^Z@}v#3vuQ&lZ&Z*WWs4^LKCaH}ahWL%*H?U$rxCx(-_=y6c_8{+|IUR;F)_( z%smNUM&tg-s5^LC@A1y{2Gku!Pj*s&6uK0)8uy7jPF&YY!Vx;FBGNl$Tw z+S$w|cDiTFHzjl2;g{(#g>{pJ*U~1o4DIWw*vAk2hc!n$=UnI;i+737*|%`te)EQl zxQ=7Rbj5}N0(mw>2Cv4cXXiw6EL_h%=siEyW>7TDp!DPFiZd@C`Fi*`n`1;DCA6tU z+eq=o=p>N{nj%?D(Slr=`+jH3CzVdCYN!9aO}aW>@VQG+zT%ZYVdItU-9|Db3dI`? z?;RY^=*CPSUN`U~vR)SJ5a^uhp$KRx8yWebPo1#9b+IglSFXB$OtKb7xUJ)&xinyz z+uoyY?r$ybgtMcFT;3ae)joONH2dnE7p;!Kwc}ttS#11w+KH29HH^1KYj^R#&HoT- zLpCS8GZMPfxc{l3Baak!p8C^3{h3mmttzGh=d(}oDc1WT2)k_) zxtY$~H&w;+KY%%e$2Kbi4=fi3G|;n6%&*Gbo{Oy}lRnA$W{fUW0ftj=N}ie*rf!tY zBhfRe6WINV!}^yl%J_B9o6!W8;@*y0=d=%LoNbYHI4Rw0`sO9ke*d_qS}1@+xhW;5 zl8QS=sj%`WBUq%u-D(%8n0s>;26sy45rQsk1S=Z;^gDm33CT62b>C!C z?<@m38o2--j72!yG!_3K!4^7C^mK54b;0l;f3ZI04bD@3{pFo08Gq${>WWyY7Jx+f zhtS9{9=(Q%$AmHsghx4IGcw3j{=GGA#TOmynIEz5HZDv_8mb4-F(ba5)aV#qr4jjE znpWIV4cs-T`mve(tPQ(J)f3_8Z=3p>*7@p^>&BIJiXTAM!laru95i9T6whItFb0a8 z#dX?Z!xi7TtUvOdM4CqHMkU(?-dD4Jqp`E`8hHsAN6@%D$Cc$`Q7F7`ed3u5_Ppue zQ;24Hl#~-aRt$ZJoc5;7QMl zCBBqXr=iq!PJhPs9OszW`%13F*STGm{@GCKM?&ffmFB*oJlL0_+~spc{9SsR{k1o- z6c9!3ydRV(HNLZat=>~8y-*=+i9r1MeXEcak&xU5-(sG@hB?}aGAom2)BQ#e2rH8T zbL@HsTBs209zs^w`E1b>?_7x3CY!Vh{5rqEFV6XTYx$46r6|?fMV1E5} zY!ajr_1(5fWXD>`Tyq(WH({;rZ7$;O6enEvy!zoR+XM;M`M=0E*3ub^J$^n)`In_wOcZ$6I8+n3@!L%EZ<)W&TRGCyB$hq!jti|EP@5HCDO?V z)ahQ((m8U>KEzw)$5&YUZe7Ttic)n`eb*s`8tb{kw}`pEzTaA6k-==2T6^stCK){( zVAL+zd>^8A)5Dm?&)5I-M~1Z|Y|AocK9GHg8WeWX6;F3DUhX|CtFh(Q{$g4!9PaBl z@1q3aK|7V`EA2t48SCtAyF*)cUj8igB>nzY0`Auid7Ix2cl>EZ`*Kc8Qbe2C^B_Ob zB|&*X^yf45Z5Mp+*7@-i1@kj@Z*j3rBe#5t!keo%_0^sc5Mjm@zFHzW1G9s8y$JRQN|n{b(&dOhZKmyyB2}LgDrAvZS%hIVDkmK(yu8*GlqRc zzO+&u(YYRFePr;|p9>aT4L}@t>VwL>IpuSu!H57Jqm1KJ?Mr^%a2mO*oKp3bbtRxR z&dC^oJ)M-lC5(SExK$?VmAK1z6y#wMajcait5eknOx*X0%zP$dWXG?%LZURpGqGMk-xd%@jEu0<~d^zEt94ck1 zd=JcR*9amv*q7cMFD$iQ>+u8o?R|QW2DFx39jyDH{|KH+ehejkXDUWU2jeYaiab|x zZ|}`df0>Qv9pXHifDPsbc}E zH(6p4sEAa@D5H>v3XE@6bXK|-J zI*(m4p8%dp*2dqWK``k*qW6V{ESfWWxA4-8hYx3EiBT-z)j^kE!ARBX{&q398x3LF zpF!`>fx`2jkpVHXNEu|lj}J#Ach}tN6eEkc+ZYw!+N_C5K#-?4c;L2Q=N}4$*$q<0 zTls)hV${)x==`cv#tNola4ye|=p337x*n{9sG+YS^cnD}Lk9vq)y=wj&o`Xex=U7V zZnty6XtAba)I5AVba~CSuX=#{b~?P+P-yQ<8NZw4=j?r};kdrdu=VnGw6hY-4B(=K zw?k`ajzwh9>sJtMG#Y!`h9-5lc*(n9ZjA?QpZRNZgdpD=1q7nbf#0a?>X1u zTe1!KfxEAm5Infw#K+ye(;;SJHQQgvR7=^L>CDR}oB{oQ;NXvfC}93%v&>290gnzH zv71Q8P?%4iuS`wG`gBIhxJZkycaM~IVxXbxzUt!bv=cl@b+sbGeee+2D878nm1^fs zE3j9%NjLf7ZjBz8W%afklm{n+(cj6>gW0Vm~+UWb}iKnsb8AfdH|2>VjL8 z81{s~$|>WQbil_}K3+zK$(|y!2UG*&oCfyY5m^qz` zmvaiagm3)4s+oDCOouS=wi8*kAfDQk&2Dgox+cM)GRwC{=3XpXJN* zPY4F)`+WbbL^5&avW@>m(QRz9IwM6$3*Q>zVDR!nQ%Jl8@!(L+l7&%Jc^{9~yz^?^ zzu~^?2!UM=a}KMtc1K1_G0i3yD&N(Qn+{5t0=_;2i zQ^5S2XAb`D0K|{GhEDrjEeUK!I7}bOD1dg59Rv7Jd5VzKH-qGG#KL`URS3Hj&P;P5 z)61G_SNfID9}k_fT`Ee>-{KEi!eYv+=?bCK!%HYkocrl)Nn`2BMQU7*;-<*^`!^h4)C(8J3dxb0Q3150sV4qxGq z6ip!+NZBW>rUOEzAj3g_$DUOgi1}MWPRWp=S9{wegx^hi<*$2Kg3d+3Yu?gqk%htg z#v;v6#&T3}q5*hgAGwC@bKrpk_p7P{0xl(aqQ}IuuDC>WJMOe0A8JC6)g3z+NR01` z;)vgDsJ7cY@2S(ha}%vNd`VfFp#QjJCpmm9`h|_9JD2VIZFc=n-Hw`ci18itu8xiM zl=Y}DdzUzS?UVCc(_A~tXW+_ewCtN>4ngTw0l~;Vnvzpn0tXrYCk6A$xVWlls|E(M z5Xutbm}3T0G3Ah(29ge1gsf1~yAlBf(J7ymqRp4-^A2;oJAr+I;KOtOj6f1b%_AXJ^`e_ex%e1>(O3wv8l%*S z+8F7eahb9%#)yDpv|ig@$8i%HbDJ1@3oUCd{D2w&QL!FHpL@wM%TBl*W?$?Gqyqo= zQFgyn;_068>AGJL>l=59c*S`852|Gw1h4088$V?y?`RyOsMAmdtMwD7coSVt(B1_wPR6X^lWp zQ-sDorT;tyf20X!7$dinTzA=SB*qYKOSY z!0N)O8MiEOce{3HFW;5H#5|PPQzbXDp1Dz}?7ONBwb2<=d0}!_>O6u9Kllluc~wAO zii{OCB{TWx#q?RSdL&mjS&UI0)YWgad9;25_ax$YrFd56{7DFfFpD#m{b(57$Di*4 z23N_oEHA=Mi#5Sso;<_x;^3z2Z1FqzxL=W{-Z^5Yj=nH=p_m>8e+T_^@!|2E&#ot7 z9he;8Jbmx^K!i<6Ww)6nZicNlicJe^CBD1vQg~BJzbm-f#Egl2)Vh2eo#cbRXaW}F zh)Pnf-}$>d(XK)~w>3(}GT&hEbi&YUZu3(DrLc_yLQ?fMd(9PX&Q!72Ygc@}D7nOr z3xA`wicb6j={&Kz4rJYlF$8o^u|tFahGw8nEzDO%dn(_oO-`DwbvO3o0c}X;j!$53 zz36hF{Ua3-$LEWmLXP1oo_3WF*?S(He=(+iaGE_%!X*Rb~V;BI%F4PAGhoALa^Ls63sjA4thl2fB+O8@feeRvo};m+KF>-le0m^_Wj)koKx6gu_QduLlKcj;=-n~ zc^WfLddQ}*w_@m32yHX6t z(8-BsdSN?LV`9$A%6puqjl)%rW9KqaA6wU*dHc}9Z8dGOHNg6uEAW|cv=JvvUXL!Aw9!_iYrvajgTL@+!1~( z?*9a?O)KyXLxd7WE;)XmX(vT+ahw?Ag2z4OkqgK9#rIXGqI>|&N{_i}#3N@e5o_#2 z#XRqNb^kWEA6z6BkXU3|X^x9n0FVb_DTBS>-$%sRS`;6%{oFC}Ltj(;UF{HbA&#z& zR;dy1hgpqP#ug)}@oO#Mo+5%SWImfJ?{nCsw<_Jhb2+?#kW^Jk$(rJ#4u|EYoc%b< zpN(u*4jsOP<)~^3Gqes?26k}d1Jp>wI~rBJmQp$3(;l6{^`GIf z@;l9YNW;Zi2JGhrI7B5axfl9daHAjHk${UW+m3b!cjk?7iu3H{=l5@@i>ri4w+^!9 zuCIj2R9^X!dipk!c$8?{ubk2yGM6MCK9df9u_1%`{7n36EYxo0=BkSH%Uxd^1JWTo z(p?cgHCN`58p+1ePXO&^{Mj`vZu)0x3hQaK6}${F3XoV5wwc%Dj5oO3+#{}P*RYmk z3_GL1c`A|6{vO2O-lkEi9oS{x}0vyj=g#O-SJW zoNE2+S`EmkK~kvF`!kOzw|rQ|i_g`b?AHs)N{xBdlbHnEEGGBj;w>#u03y!y3es$0 zSDHL@ITxR}Yq0paRrk6K!^YA1?!?gQ3*gJ({u?3y2mMe4K5@jOPnFLvi@C|zrD=s1 zRoLG{Dyg!~ z=H~Lc;o8aZx%0HQJ1(IWf3-rnj^?EIkqRNY`j;mrtbUIMthBIQobtvTR1UE0^*?Q? z>f+mzd%?Wo@^Q=rSLhCv_p!oz5UKHzSRn6C4DLDu!ZiL3+6vV@EOMg20=dsTgEh*q zw4S-nHd~iI>~&h94)Yrhj)UuD^MHB(tM;3D?y1m>cam7m*J}bTUA&qaZ_C;!uFsbf z&H-ZXm|&Lpw9cdkHzE#vMu5IBS{~oq+{>4=7zN85-eC0{ydFy9`H-LF!Z104x=z-X z2^qpU1+|MORc*Tzr17ORHVqOYpyLDIu1O{I?Aohg$F4i#dh}jU8Saw~9=9YW4SLOj zp!Q}02=4iyfei6HTiy+h3BP;<6G?%k2QNF-r}ZXFjKV$+BOwls z2N{F|@?wJ8?t>HaEb%v*AzJ{vO8X&6G$+I+p>@B)`W{($PWYlqr{7J^E9tS=t~@i@ zR)+i^hfDD!Ys-YCUCe7(IQMdsPI-)%yGWg5#Vbeaim9r;bL|l@v;L@ha#Kuj2e$gO z$>hl-ChPw4yllC`1^&m!AmvhxZu)39WTiaK)8UX|Mx1 z%hqOo5b0*I+|xniDG>}~mCAmls++-gE-)Y8b?yE^w)BYy24r8CRmk)-C!<2$`o#`7 z+JdJnQ8J60jMJRv4M#hmbpE8+Iq?!8hCa!xWzh8cnaoMz^(QqhLei{7nNqH#F8&w1 zA)Xtrv(6EzHBTTlp}b@&*P0Z5!+uSIArw*EHkFyCI+#2JNcWv5VsD?OgLOY7T*AH^ zOvJv!Iv>TbH?p@(kh%L2UurIT;r{9&2y{pA>x<{I*2DCNDu~dJB2y8#niuBZ_SQeY ziyc^Gwp2@Q*Z+o9%mBW_$q>^-w11Rsm(Ac#?Nw1Dk6%2$XA=TkDSZB8MA>!!Oqokb z+ZPl?f7Rrp&hJ{O&Jr1Q)c#W9#LNgcRwnQi&=8)?s7TXl-3lv>ceZH>ayFL#mOcBV z{z&X;XP&Q7(kf*5M?rA$w_2XBft2}WW7#+~y^mG=Gr8`xQ9ZJdl-w|-pui8v#)-2* zEXyS;-=r8`(i3K7flWpkwR?0`=34Y?NUqhj z7|zTXA_ot36jtA2mPteOqb^@(AUQ+@h7xhg<{u)Jj%Lw#E!>IcE4`7ch`v3w-0i-P zPsjjV_6<38Epzn#wC1)~Wi_;3&E}NaOdrL_N!9O2Z*+;+jd?rA<9DrIH*vC9+$)8y z{RCmB&f}p{j2p4dC_1>DVxM7FK2jE4GQMzxe@do&@Y1TTa$AFiB3xTifbLRn{;+gw zuYA@S$SN0C9D3J-*}`~5=FHYv4PWCCN!)!mRM^L%1c~z8rmN%ICGs65$G4mT-|`ri z^Aq3)j%?n`###mDVNCu!M7ADdSkPT7i~gW=&3yc|js!vN`bCMSICr3FFVi;bJMRZt z2pwI+N4SB1!3#G!E%G{8AvnQ*SajD_;wyG|8^+zAEWDjH<{NfTt;xT4yj~$3^nsli zEmkM1VV=r_&c?4L1oVq40Au3Al#`~fq2;!nIfq9$T`b>j`pP`r`eb?@){Wfk@ak1B z9E{TZ*xO&@d@+qxQ=&SbjbsjnL`OB0F7T>-g@xxvYW&a~3MsL0!1rqCo1<{NBH{%O zRMfrJpyzA@>LOlJe0@TMf&zIZozFX|I0-1#wx}0EwIVxBuj3;03-NgJG&J+d@T&Ar zl6vCspOgtN(ET_i^5#E#ZdCb9(yfmo&t6hf2Rcv)X>O-GwAiuv@aXl2yR7_vfCeH|S;8Nj*4|Zf zhm5K}z}v>N>qRA-sPh>#G@FrE&0#h-OY*Hb6_vXT!S0V?sOn#K^Y zgg4Al3R;e%5c7GJ|EcS-OQ zg{bi7bd%BMqug>^dD|vDtZH-lQ|`Dp632=0j0L6H-|XzI(@xltxu?*Uz0V!2Jk8Tf zb^dWw$MP|fC{mnk{Ef9lXa@c$tH;nFs!vw!QgGnDbmR5_e(9%m?9%U}*C+6)Tg_(=8;MQ9HYlCbLEB&An6oRN*rY9S%(qXBSOXt>X8sDcibPer8FxN74RFT;4|53Q=v?zxw4jW~<-2T24wb>)VBQC*mzsL}r9 z@`9nlAX%f^@B>cUDH(N_D`Ucbq(6i^sIQIV-K2wOj-*MpRTA8p#EZ>VZ+fw+F=(BH zNp~ybT%ANkk+`s%msOwml8mh)Ktn=z-v3EP*>K5%i89u<8gN>6A-hV@9kF+yA>H_u zn=WnrEf%DZ>h-6P%$zruef4_Hc(i?~5cvRLFdf|(&}`15>+5CC_f=>7NZGf_W)+)V z9s570g(~=dP{)gO!mIJxl@rTPb)JPoi3lzi29d?)ZDU8@Qw@qXR=jS^{An|uf$EP} zydE^a->-CX=fF6C8(A)oN9J@?p?Z96WDUq{rcWC#1%C={H#U4V;#70@++oLLaI}t1 zmS|MRJZU{%YhPif5;z5{&Qho0q8^XwjMQV?Gnw4uL~@|5$B*x~>T?Q&6tlM1Sn|BI zad(oRdiv^sUGcqO6R}TP+mmkMH?M4+y|1EzDepD0(DMgphdVMA)B-km1SoC$w$`-n zY|}Vg3ckK%j%&zd*DS>aXf5W#YDMVRTwV$l&SMm>Ux7GH@tqBIKQLm=znUu68e>r) zs3rI$w(6USL*?0~OqW@L!)Q1wC2xI(S<;lfr0rFp0b!x5Wo+g{o1eoF@EL;q+{Chc zUHS8KjHleGg{{UPa{AnT<=$)3ocVxyl^q}9w($2POAXspt;qL6(*fu~QmPop1yWGa zJV3!Y3tvBy1xCg`-}UC2{`w9bg{wfzJh?DLLUnUfdy@Hh{Y~CNePoI5Pd{y8;Qp(S zLw6-t5)S+y>y5*U(^=6!zh&%jhQZupaXkk^XF`);z51hhcLVYF{q%Fr9nQwe8 zVahmu9s{TheI8u$mHJ~<3TCF?;l<&x)Q^Wc69Et`LN_6tvJ_i_p!LJ{uQ;)^2|FdT z!;h4)M|6UHx#W)2bV!<(+^QaUxSy4dh^U5ghklW=ENA*5TqR+*rO#R=CVtL~=PmvW zgnb%jml$*%221&wB_=?zuJ38Y^PoKiJY;+N1cl1W(lrH%+-H0Ql=GPSky-DQ*l0ww zlb?_4Q?2?Qz}$1#q(ymFEzP(*$cAPo7cd}9xQ0Fem`#?;LNnu=6U>nadOM6#_gEEs zL~Ap&8A8#$jw0Fl;xNo?k$_o73by3RfQN-WYMRKVVNI+J`r@f8YiC^kn8P~K> z2MR%Fi_tf)y#}xb&l*GfY}Fq3F?cHL`p~4TF=D3>)d%%{;+H2DO#UJ&1GSc%?(*RC z+wI@NkQUC+7g&icSEdIKKQ9Yz;6@2?u8l?xNCd5Cin+EdL&C53AW zw5bQ1U+UAGd9lAEXjBQRVwbr1+2!io*W4U;y#DyBT_my=N(=(X2ikXtQ>@myL=6qT zdF&t2TmHP_?b%qV^P+q;iBMg;@7|$ONH!+88V~w3xP~@Rp5$Dm)ffE2)54DFb*v}U zUTZ&`Xq@U&#VS963tH+==AE4Ba|RE~rNAV5uH?b{d}AG+&dGpE_qub`Y7TC%!{&)r zeo_n_q2F3b{^pX)mh+5=W$@(WJ^WR-Ui)QyXT8^Rt37qjs#MO}DtvR7AzbAqiUNXM zdVlXiRWZURO{yb=iX87T&xg$38)7a`6Om6n7{r;Qbo%1);I0bu)fvH@JieRoCLu$Z zYnOj&i)*fp}hjiVbnUQ~8|9^{u zdHy>r($Uyc5sB}4gt%l)JG2j4$YK>t?jZ|N@re-ZeLz+VLZ zBJdZ1zX<$A;D0v+yo{7VVdPd?6n*QyyN|4P4iBxuX`87&lM>v^zrw|mwz*50pQzIJ zkXoG*9UFUyL`_nHCFI0k09D3YGiQWC9wPnLJYh|c3}J4va0F!QOk};9M|(GB%CETk zS}9*+10K$tWW}CIYy5Iw7|fpe2;45mm+K~(0(EJ!qwnyvU55RTmqN8w%7UDl9=2^V zlyPXIE-$58vMXgkr)&wU+E2=0VkaumP*Xu<3p3M=k3o5af5bAZ<)J8WCED)IX24B9 zSrPyc?4Rv&VQ_HapAAE{gre#wpf%SiOH>Nb{Qj(H2ujm0_h(wZu7Ya+JbtBqTHT3~ zAN;3%{tE@qHzv=-_tN})th84xzw=6&Y;oFDFsz#|8XkSw1Qc` zmghw(<;X);QSxhb*NP-4hmj9GaQi!xLdWx!Pn3WjU4DW+o7x43qpK6#de8`7|HW}2v*@Xe9S`O2?!0mXKKzj)|mdpe*fw2$|KV&b0NVF0m=Q=Ti`}gJ#h?H{d0E&s>(fy|U{m-R9hrdT=HCl|aRz zuY^@RNE9SzXJp=Mf&5LH(kJ$ucQ{{Qer}*N42U-mtg2%Lhh0NUG<2!*I-QbA@ zn5fD1K2=>?k0mHWknV=m^Wn7^aGT3|W7-9>W_atAPcWV~E2TKV1tid z==KG8@jSH29ptNH6~n6x0=W2BbW~E<8w2W=PxY8rqe9!H&QGd*J;&$DPfPm^96E#> zmeWOFfkZDd+#OosK!NdeDo7KOl4?^|c)D>B0O>ci8}_NO#uMkQ^`78nHgGr)9MAAZ z5)Q!y)<*T!3@o>y;IP~)!_^jIR9=A7 zyPGWf)`N*_$8*HQ7)rF~yQsnq>nQEIe>lQl42o)%y5X%|TlWF^9&evC(IP7RUif!k ztj6EG&K^11nu6|<&1Jv2@VzjIYa_l%6*KjRb!ksQT=!|t-d>zIUU0F&RW9xNT}AEN zjb3M0wJ%ebj8^)tvD>fu9JDtOkN6y{dcKaev_-a=>#W)#+cj+2G+JPpJ;z2ZNW(Yg zsf+$F$|U54Q~pXfSh_sI(ud=Vhbr;N3xjvLtoM^+2j&X<2IhKP>qKkp z`;WJ~mmk^F-JbC;3)qjdiT<*O0KPYe!fCogW9#C<6iYge)CdD|m0u9oyw%4|PYkqp zw@-0;aWy3u(f{43Qsc7vq*|#>^=P2y_yI$cl2i1CYUp;GQOo7$ZPu7r%WoXhsGQoh z2~dhr<(t;P3!Q?jytAOH*7?$8x)iabVhEeqGd9?1+IF@A-N+1poQ^sP=@WabS{QG+ zhu4>lH{#o-cWymBz;#;EmrXF@E2@1C`Ilp@fY-l_6`xJq8iOX&CEXeu*x>l(+uPnc zgc1onr}vb#*SXBUm0ts(k-61n^U%11ef7;O-E3FuQMNw0hy#7zdZ$?*?qoV{o;ld5 zF~U?IPLKR|G^N@P4en2o z-!%tR@`=M^9UQAfEBnDU^Kk3C#`M6^#~z32!mtqH@snRR=Z(ylT6o;;eIMMyumnP| zD$_1q_qx{k*NlP?_~rcd-rcTsS1r>ZM9DZTGo~s_v}FW@D0C5K-gMmuo>FIwj2Vo} z_iuwld=9}$Wq9zoZCm((p#@vAIlxXiRU6)(f{;VUgu`$TDbl5(k0U-oLu zfmFW^v2=dvRF=}n-WMY0?ek@ei8MQEV@01MwbgQ?rg;3(_O3M(M|vaQhjGV)6;>vr zc}m|7`|V!Z^6E4os4{-oi*gHGwO7< zPpu_Pk6-Iou3ney5l`8MC|V3w&)FuX(DHRc7EMB9O4>wk#VhJ{{$F2}R`Qp4IR0YC zmmEC6)@$!7T9jGIlNEQfaZD&TyE-pwdm@`>3yZ;cvF4@e0DCsEmmX7MIC;x1 z$g_2V(o(c76fK(G`bdv2X{)|%(F@sGqBx8f4Ro{Y`?S1zaR;im+fna`zPYb_z4b=q zoQ`t6_J*=Lh3W`Gg?fQ<#1h50O7rEY)_$#5y}a6>-gx6vQB0vFikUrLP<4dpHTCMP z4(`*3GL|AQgrB**wqr}C$?&q%?4SNFMH*4xAMLx-%bLd(P^}`y=A!aTnk7)g`}Q-< zM}f!BH*FR^MrrqE6k5tLA?#wezvqz^%Kb9*wA%WYDuMcf8QqtrnmEU{6j7=#EiGfz z?gMR)@oU@M=86^%)pKT7ylpEFe)Xe`Y(yNi-$XnLul1c+K?YlSu0=q+7o9lQxbp&- z17$;!gpr3KaJ@~qzPa^HVi92P((GD8-8wN)F(k=18wH_>g4BD+nO<)iZrXSb6{{n0 zz~XcEm&k^G*R>g#U<+@6`%DAG23dRcZ+_M@_eGTz2@e>Cp2y3sh+cjn)C-W9Sx6tFzu7H<4;e4#Y>#EuoR-X; z?FD2Nu6*q0#RYaWo%5D+!s6VuAHf#Nj{th+o+AW#hwZyWTjHed;>X&&@0xs7;{$*l zrRPkyibQU(rcJR)J>|G_B+on18}V$y#ip*Y2eIDPqqIl-okxU=6y0NwV!Z>!y*iLW z!mm(9?KB7WW=1Mh8jft{Am3N|WKb#Lnv~?}{^TVM1ZaqGF`%JiCPTgqd{-rFu18p( zN35K;UR)I7KSmTQPT^kRO$lG!rCHqtnt5U#_}h*ZBX0wOCvLw!8Rp23+%e_FZSv;6 zt|gOPqH}Z9v-`R^r;R=%ctHj>KV{$r})0x4%4e(x`3O+Hz-PS(PUV>JnGbLE#0# zeka=B@O1hLs88ql&3F1L^1#qKxqob5Gtbgz-xOJt2FI_Z6@=|K8+&`QPPkI0GsKQg zceo#tLondiDtVbSO@ZnAc*sZK151oe8;sYjs*PD*x@~!fVH4nXd`lHMl#aN6s zz_DW#tiZ_X{tnsacttb?cx+n3>iT$-%sB3X26VYgMw%U8V$Qqh)Gk;;RNK5P>>Y@^a=)$u zzez-)n9+Uc{3yY4!%CSQ|w6O1Dw|38MO3?vCN`RK96;!Y}K#| z04)Z&Cj|%a!cGlitY5UwJ7L%fTV7bkkMJ4`RUemmnVRL#K-^T!jmBMvn3>+b_P==6 zVYVkzzMYcn#BUpuEflmn!0dKR&a94=()|P ztbgvKR zvOYq$x5?ed<1cit=ThJo)k-&C4^u}!oa5FaVhlJqw3Bt0hEN4yv%{M`!J`|8q{+Rx zEp5V!dBVj-%4xXbm@Rccu@!~GD!A5d+ySUyzS>%r>8|VXc0YC73Xp{`Jb58r>NK=g zsVjRUYCC?Fm)Zfy%0_$x8eN&sP&759b~t5u7E}SfkCrmYY2kCG$39g+qq?VvhSPz| z=QU0Ks#GIQe1Sl!WQ6c`N&_TQ0^Sgil08-c^qB%RAZYx>*B+$9o%A->>ic~xd@i3- z+_d00#0F*g%ml1a-W2m9R8q6Vd3Jo$+M?(35ZM879eENXv!@rUpBv{L`79cPCx(<-1Byqq+Jd8R?W>NstSddalems zx>3zSthC8hTDJ}ubt4{@%dKRgEedC7!}$u}76)bN+=Yi%a}yT}zSC(_;IGEGj?%0J>iIQs?kdo literal 0 HcmV?d00001 diff --git a/pvade/tests/test_mesh/cylinder3d/mesh_mf.xdmf b/pvade/tests/test_mesh/cylinder3d/mesh_mf.xdmf new file mode 100644 index 00000000..f93da2c3 --- /dev/null +++ b/pvade/tests/test_mesh/cylinder3d/mesh_mf.xdmf @@ -0,0 +1 @@ +mesh_mf.h5:/data0mesh_mf.h5:/data1mesh_mf.h5:/data2 \ No newline at end of file diff --git a/pvade/tests/test_mesh/panels/mesh.h5 b/pvade/tests/test_mesh/panels/mesh.h5 new file mode 100644 index 0000000000000000000000000000000000000000..671451054b76d57e7e915ad8129af9d4ab199c96 GIT binary patch literal 24769 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 CfqpXp literal 0 HcmV?d00001 diff --git a/pvade/tests/test_mesh/panels/mesh.xdmf b/pvade/tests/test_mesh/panels/mesh.xdmf new file mode 100644 index 00000000..dd34024e --- /dev/null +++ b/pvade/tests/test_mesh/panels/mesh.xdmf @@ -0,0 +1 @@ +mesh.h5:/data0mesh.h5:/data1mesh.h5:/data2 \ No newline at end of file diff --git a/pvade/tests/test_mesh/panels/mesh_mf.h5 b/pvade/tests/test_mesh/panels/mesh_mf.h5 new file mode 100644 index 0000000000000000000000000000000000000000..9306868f9e138aba7dde998a7bb8232f2e52f30e GIT binary patch literal 16950 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.h5:/data0mesh_mf.h5:/data1mesh_mf.h5:/data2 \ No newline at end of file diff --git a/pvade/tests/test_mesh/panels2d/mesh.h5 b/pvade/tests/test_mesh/panels2d/mesh.h5 new file mode 100644 index 0000000000000000000000000000000000000000..4b3c23c58d642c4d32bec984886ec8de4fbcc665 GIT binary patch literal 711561 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