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