From 8437f927b7a1634f4ec68df84e246b5298a79a00 Mon Sep 17 00:00:00 2001 From: Timo Koch <timo.koch@iws.uni-stuttgart.de> Date: Sat, 24 Jul 2021 12:12:47 +0200 Subject: [PATCH] [python][common] Improve style, add some, use wrapper helpers --- python/dumux/common/__init__.py | 96 ++++++++++++++++++++++++--------- 1 file changed, 70 insertions(+), 26 deletions(-) diff --git a/python/dumux/common/__init__.py b/python/dumux/common/__init__.py index de90e79c80..261ff76d6e 100644 --- a/python/dumux/common/__init__.py +++ b/python/dumux/common/__init__.py @@ -1,19 +1,27 @@ -from ._common import * - -from dumux.common.properties import Model, Property +""" +The DuMux common module +containing classes and functions needed for most simulations +""" from dune.generator.generator import SimpleGenerator from dune.common.hashit import hashIt +from dumux.common.properties import Model, Property +from dumux.wrapping import cppWrapperCreator, cppWrapperClassAlias + +from ._common import * + + +@cppWrapperCreator +def _createFVProblemDecorator(gridGeometry, enableInternalDirichletConstraints=False): + """A problem decorator generator for Python problems + + from dumux.common import FVProblem + @FVProblem(gridGeometry) + class MyProblem: + ... + """ -# A problem decorator generator for Python problems -# -# from dumux.common import FVProblem -# @FVProblem(gridGeometry) -# class MyProblem: -# ... -# -def FVProblem(gridGeometry, enableInternalDirichletConstraints=False): def createModule(numEq): priVarType = "Dune::FieldVector<double, {}>".format(numEq) ggType = gridGeometry._typeName @@ -28,19 +36,26 @@ def FVProblem(gridGeometry, enableInternalDirichletConstraints=False): module = generator.load(includes, problemType, moduleName, options=[holderType]) return module - def FVProblemDecorator(Cls): - module = createModule(Cls.numEq) + def decorateFVProblem(cls): + module = createModule(cls.numEq) def createFVProblem(): - return module.FVProblem(gridGeometry, Cls()) + return module.FVProblem(gridGeometry, cls()) return createFVProblem - return FVProblemDecorator + return decorateFVProblem + + +@cppWrapperClassAlias(creator=_createFVProblemDecorator) +class FVProblem: + """Class alias used to decorate a Python finite volume problem""" -# Function for JIT copmilation of Dumux::BoundaryTypes -def BoundaryTypes(numEq=1): +@cppWrapperCreator +def _createBoundaryTypes(numEq=1): + """Create BoundaryTypes instances""" + # only compile this once per numEq cacheKey = "BoundaryTypes_{}".format(numEq) try: @@ -55,7 +70,30 @@ def BoundaryTypes(numEq=1): return globals()[cacheKey]() -def Parameters(dict={}, file=None): +@cppWrapperClassAlias(creator=_createBoundaryTypes) +class BoundaryTypes: + """Class alias used to create a BoundaryTypes instance""" + + +@cppWrapperCreator +def _createParameters(params: dict = None, fileName: str = None): + """Create Parameters + + Args: + params (dict): A dictionary of parameter key-value pairs + fileName (str): Optionally a file to read parameters from + + Usage: + parameters = Parameters( + { + "Problem.EnableGravity": True, + "SpatialParams.Porosity": 0.3, + "SpatialParams.Permeability": 1e-8, + "Vtk.AddVelocity": False, + "Assembly.NumericDifference.PriVarMagnitude": 1e5, + } + ) + """ parametersType = "Dumux::Parameters" includes = ["dumux/common/parameters.hh", "dumux/python/common/parameters.hh"] moduleName = "parameters_" + hashIt(parametersType) @@ -63,11 +101,17 @@ def Parameters(dict={}, file=None): module = generator.load(includes, parametersType, moduleName) # make sure all dict keys are strings - for key in dict: - if not isinstance(dict[key], str): - dict[key] = str(dict[key]) - - if file is not None: - return module.Parameters(file, dict) - else: - return module.Parameters(dict) + if params is None: + params = {} + for key, value in params.items(): + params[key] = str(value) + + if fileName is not None: + return module.Parameters(fileName, params) + + return module.Parameters(params) + + +@cppWrapperClassAlias(creator=_createParameters) +class Parameters: + """Class alias used to create a Parameters instance""" -- GitLab