Metadata-Version: 2.1
Name: casefoam
Version: 0.2.0
Summary: Create and manipulate OpenFOAM cases
Home-page: https://github.com/DLR-RY/caseFoam
Author: Joe Pearson and Henning Scheufler
Author-email: Henning.Scheufler@dlr.de
License: GPLv3
Project-URL: Documentation, https://casefoam.readthedocs.io/en/latest/
Project-URL: Issue Tracker, https://github.com/DLR-RY/caseFoam/issues
Keywords: cfd,openfoam,postProcessing,automation
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Science/Research
Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
Classifier: Operating System :: Unix
Classifier: Operating System :: POSIX
Classifier: Operating System :: Microsoft :: Windows
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Topic :: Utilities
Classifier: Topic :: Scientific/Engineering
Requires-Python: >=3.6
Provides-Extra: dev
Provides-Extra: plot
License-File: LICENSE

=========================================================
**CaseFOAM** - An OpenFOAM case manipulatior and creator.
=========================================================





.. _intro:

This module is a addition to ``PyFoam`` and can automatically setup OpenFOAM
cases with varying conditions.


.. _getting_started:

Getting started
===============

.. _installing-casefoam:

Installing CaseFOAM
-------------------

In order to use the Python module you need the ``PyFoam`` package.

install the package after cloning the repository with:

.. sourcecode:: bash

   $ pip install .
 
 or via pypi by executing:
 
.. sourcecode:: bash

   $ pip install casefoam

User's Guide
------------

For a full documentation change into `doc` and build the documentation for
example as html.

.. sourcecode:: bash

    $ cd doc/
    $ make html
    $ firefox build/html/index.html

Example
========

CaseFoam offers two main features: the easy generation of parameter studies
and the analysis of these. In the example, we want to change the intial height
of the column and perform a grid study for the damBreak test case:


.. image:: doc/media/damBreak.gif


parameter studies
-----------------

The first step is the generation of the cases. We want to generate three
column heights where each case has three grids with a differnt cell size.

.. sourcecode:: python

    cat genCases.py:

    import casefoam

    baseCase = 'damBreak'
    caseStructure = [['height_02', 'height_03', 'height_04'],
                    ['grid1', 'grid2', 'grid3']
                    ]

    def update_grid(a,b,c,d,e):
        return {
            'system/blockMeshDict': {'#!stringManipulation': {'varA': '%s' %a,
                                                              'varB': '%s' %b,
                                                              'varC': '%s' %c,
                                                              'varD': '%s' %d,
                                                              'varE': '%s' %e
                                                              }
                                    }
        }

    def update_height(height):
        return {
            'system/setFieldsDict': {'#!stringManipulation':
                                    {'var_height': '%s' %height}}
        }

    caseData = {
        'height_02': update_height(0.2),
        'height_03': update_height(0.3),
        'height_04': update_height(0.4),
        'grid1': update_grid(23,8,19,42,4),
        'grid2': update_grid(23*2,8*2,19*2,42*2,4*2),
        'grid3': update_grid(23*3,8*3,19*3,42*3,4*3)
    }

    # generate cases
    casefoam.mkCases(baseCase, caseStructure, caseData, hierarchy='tree',writeDir='Cases')

There a three different options how the cases can be manipulated:

    - replacing a string inside the specified files
    - executing a bash script
    - by specifying a dictionary

for details please see the user manual.



The script is executed by:

.. sourcecode:: python

    python genCases.py

This will the generate the following structure:

.. image:: doc/media/caseStructure.png



The cases can be started by running the newly created Allrun script

.. sourcecode:: python

    ./Allrun


postProcessing
--------------

Three functions are avaiable for the postProcessing:

    - time_series
    - positional_field
    - posField_to_timeSeries

For the damBreak test case we want to plot the freesurface position at a given time.
For that, we use the positional_field function and get a pandas dataframe which we plot with holoviews

.. sourcecode:: python

    import casefoam
    import matplotlib.pyplot as plt
    import pandas as pd
    import holoviews as hv
    hv.extension('bokeh')

    caseStructure = [['height_02', 'height_03', 'height_04'],
                    ['grid1', 'grid2', 'grid3']]
    baseCase = 'Cases'
    surfaceDir = 'freeSurface'
    surface = casefoam.positional_field(surfaceDir,'U_freeSurface.raw',0.3,caseStructure,baseCase)
    surface.columns = ['x','y','z','Ux','Uy','Uz','col_height','res']
    surface_ds = hv.Dataset(surface, [ 'col_height','res'], ['x','y','z','Ux','Uy','Uz'])

holoviews is optimized for the use for the jupyter notebooks. The %%opts arguments are used to modify the layout of the plot.
holoviews renders an interactive plot which can be exported as html:

.. sourcecode:: python

    %%opts Scatter [width=600,height=600,title='freeSurface at 0.3s',tools=['hover']]
    %%opts (muted_alpha=0.0)
    surface_ds.to(hv.Scatter,'x','y').overlay('res')

.. image:: doc/media/freeSurface.gif


version 0.0.1
=============

0.0.1 (2021-04-14)
------------------

* First release on PyPI.


version 0.0.2
=============

0.0.2 (2021-04-14)
------------------

* First release on PyPI.


version 0.0.3
=============

0.0.3 (2021-04-14)
------------------

* First release on PyPI.


version 0.0.4
=============

0.0.4 (2021-04-14)
------------------

* First release on PyPI.

version 0.1.0
=============

0.1.0 (2022-02-16)
------------------

* added CI
* replaced append with concat

version 0.1.1
=============

0.1.1 (2022-05-18)
------------------

* new Function: of_cases finds all OpenFOAM cases in folder

version 0.2.0
=============

0.2.0 (2022-05-18)
------------------

* new Function: profiling allows to load profiling data from OpenFOAM

.. sourcecode:: cpp

    add profiling to system controlDict:
    profiling
    {
        active      true;
        cpuInfo     false;
        memInfo     false;
        sysInfo     false;
    }

.. sourcecode:: python

    prof = casefoam.profiling(time=0,processorDir="", caseStructure=caseStructure,baseCase=baseCase)


