From 29b025f486748ce4b77a3b5fda069015f0e6adba Mon Sep 17 00:00:00 2001
From: Timo Koch <timo.koch@iws.uni-stuttgart.de>
Date: Sat, 24 Jul 2021 12:16:03 +0200
Subject: [PATCH] [python][pmflow] Improve style, add some, use wrapper helpers

---
 python/dumux/porousmediumflow/__init__.py | 62 ++++++++++++++++-------
 1 file changed, 43 insertions(+), 19 deletions(-)

diff --git a/python/dumux/porousmediumflow/__init__.py b/python/dumux/porousmediumflow/__init__.py
index efe82d555b..15e8eed9ab 100644
--- a/python/dumux/porousmediumflow/__init__.py
+++ b/python/dumux/porousmediumflow/__init__.py
@@ -1,20 +1,31 @@
+"""Classes and functions related to the porousmedium flow models"""
+
 from dune.generator.generator import SimpleGenerator
 from dune.common.hashit import hashIt
+from dumux.wrapping import cppWrapperCreator, cppWrapperClassAlias
+
+
+@cppWrapperCreator
+def _createPorousMediumFlowProblemDecorator(
+    gridGeometry, spatialParams, enableInternalDirichletConstraints=False
+):
+    """A problem decorator generator for Python problems
+
+    Usage:
+        from dumux.common import PorousMediumFlowProblem
+        @PorousMediumFlowProblem(gridGeometry)
+        class MyProblem:
+            ...
+    """
 
-# A problem decorator generator for Python problems
-#
-# from dumux.common import PorousMediumFlowProblem
-# @PorousMediumFlowProblem(gridGeometry)
-# class MyProblem:
-#    ...
-#
-def PorousMediumFlowProblem(gridGeometry, spatialParams, enableInternalDirichletConstraints=False):
     def createModule(numEq):
-        priVarType = f"Dune::FieldVector<double, {numEq}>"
+        priVars = f"Dune::FieldVector<double, {numEq}>"
         ggType = gridGeometry._typeName
-        spatialParamsType = spatialParams._typeName
-        enableIntDirConstraint = "true" if enableInternalDirichletConstraints else "false"
-        problemType = f"Dumux::Python::PorousMediumFlowProblem<{ggType}, {priVarType}, {spatialParamsType}, {enableIntDirConstraint}>"
+        spType = spatialParams._typeName
+        enableIDC = "true" if enableInternalDirichletConstraints else "false"
+        problemType = (
+            "Dumux::Python::PorousMediumFlowProblem" f"<{ggType}, {priVars}, {spType}, {enableIDC}>"
+        )
         includes = (
             gridGeometry._includes
             + spatialParams._includes
@@ -25,22 +36,30 @@ def PorousMediumFlowProblem(gridGeometry, spatialParams, enableInternalDirichlet
         module = generator.load(includes, problemType, moduleName, holder="std::shared_ptr")
         return module
 
-    def PorousMediumFlowProblemDecorator(Cls):
-        module = createModule(Cls.numEq)
+    def decoratePorousMediumFlowProblem(cls):
+        module = createModule(cls.numEq)
 
         def createPorousMediumFlowProblem():
-            return module.PorousMediumFlowProblem(gridGeometry, spatialParams, Cls())
+            return module.PorousMediumFlowProblem(gridGeometry, spatialParams, cls())
 
         return createPorousMediumFlowProblem
 
-    return PorousMediumFlowProblemDecorator
+    return decoratePorousMediumFlowProblem
 
 
-def PorousMediumFlowVelocityOutput(*, gridVariables):
+@cppWrapperClassAlias(creator=_createPorousMediumFlowProblemDecorator)
+class PorousMediumFlowProblem:
+    """A class alias used to create a problem decorator Python problems"""
+
+
+@cppWrapperCreator
+def _createPorousMediumFlowVelocityOutput(*, gridVariables):
+    """Create a PorousMediumFlowVelocityOutput"""
+
     includes = gridVariables._includes
     includes += ["dumux/python/porousmediumflow/velocityoutput.hh", "dumux/io/velocityoutput.hh"]
     fluxVarsType = (
-        f"Dumux::GetPropType<{gridVariables._model.getTypeTag()}, Dumux::Properties::FluxVariables>"
+        f"Dumux::GetPropType<{gridVariables.model.cppType}, Dumux::Properties::FluxVariables>"
     )
     typeName = f"Dumux::PorousMediumFlowVelocityOutput<{gridVariables._typeName}, {fluxVarsType}>"
     moduleName = "porousmediumflowvelocityoutput_" + hashIt(typeName)
@@ -51,7 +70,12 @@ def PorousMediumFlowVelocityOutput(*, gridVariables):
         typeName,
         moduleName,
         holder="std::shared_ptr",
-        preamble=gridVariables._model.getProperties(),
+        preamble=gridVariables.model.cppHeader,
         baseClasses=baseClass,
     )
     return module.PorousMediumFlowVelocityOutput(gridVariables)
+
+
+@cppWrapperClassAlias(creator=_createPorousMediumFlowVelocityOutput)
+class PorousMediumFlowVelocityOutput:
+    """A class alias used to create PorousMediumFlowVelocityOutput instances"""
-- 
GitLab