Source code for fluidsimfoam.foam_input_files

"""OpenFOAM input files

.. rubric:: AST and parser

.. autosummary::
   :toctree:

    ast
    generators
    parser
    format

.. rubric:: Helper to create input files

.. autosummary::
   :toctree:

    blockmesh
    control_dict
    fields
    fv_schemes
    constant_files
    fv_options
    decompose_par
    util

"""
from abc import ABC, abstractmethod

from inflection import underscore

from .ast import Dict, DimensionSet, FoamInputFile, List, Value
from .parser import dump, parse

__all__ = [
    "parse",
    "dump",
    "create_field_from_code",
    "FoamInputFile",
    "DEFAULT_HEADER",
    "ControlDictHelper",
    "Dict",
    "List",
    "Value",
    "BlockMeshDict",
    "VolScalarField",
    "VolVectorField",
    "FvSchemesHelper",
    "Vertex",
    "read_field_file",
    "FileHelper",
    "ConstantFileHelper",
    "BlockMeshDictRectilinear",
    "FvOptionsHelper",
    "DimensionSet",
    "DecomposeParDictHelper",
    "format_code",
    "FoamFormatError",
    "read_header",
    "parse_header",
]


def _as_py_name(name):
    return underscore(name).replace(".", "_")


def _update_dict_with_params(data, params_data):
    for key, value in data.items():
        name = underscore(key)

        try:
            param_value = params_data[name]
        except (KeyError, AttributeError):
            continue

        if isinstance(value, dict):
            _update_dict_with_params(value, param_value)
        else:
            data[key] = param_value


def _complete_params_dict(subparams, name, default, doc=None):
    name = _as_py_name(name)
    subsubparams = subparams._set_child(name, doc=doc)

    for key, value in default.items():
        if isinstance(value, dict):
            _complete_params_dict(subsubparams, key, value)
            continue

        subsubparams._set_attrib(_as_py_name(key), value)


[docs]class FileHelper(ABC): """Abstract class for "Helper" objects"""
[docs] @abstractmethod def complete_params(self, params): """Complete the params object"""
[docs] @abstractmethod def make_tree(self, params): """Make the AST corresponding to a file"""
DEFAULT_HEADER = r""" /*--------------------------------*- C++ -*----------------------------------*\ | ========= | | | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox | | \\ / O peration | Version: v2206 | | \\ / A nd | Website: www.openfoam.com | | \\/ M anipulation | | \*---------------------------------------------------------------------------*/ """ DEFAULT_HEADER = DEFAULT_HEADER[1:-1]
[docs]def read_header(path): """Read the header ("FoamFile" entry) of an OpenFOAM file""" lines_header = [] with open(path) as file: # reach header for line in file: if line.startswith("FoamFile\n"): lines_header.append(line) break for line in file: lines_header.append(line) if line.startswith("}"): break if not lines_header: raise ValueError("No FoamFile entry found") code_header = "".join(lines_header) tree = parse(code_header) return tree.value
[docs]def parse_header(code: str): """Parse the header ("FoamFile" entry) of an OpenFOAM file""" code_header = ( "FoamFile" + code.split("FoamFile", 1)[1].split("\n}", 1)[0] + "\n}" ) tree = parse(code_header) return tree.value
from .blockmesh import BlockMeshDict, BlockMeshDictRectilinear, Vertex from .constant_files import ConstantFileHelper from .control_dict import ControlDictHelper from .decompose_par import DecomposeParDictHelper from .fields import ( VolScalarField, VolVectorField, create_field_from_code, read_field_file, ) from .format import FoamFormatError, format_code from .fv_options import FvOptionsHelper from .fv_schemes import FvSchemesHelper