From c29d9e1b20cdd155320e5599aca4ac09ad664e23 Mon Sep 17 00:00:00 2001
From: Bernd Flemisch <bernd@iws.uni-stuttgart.de>
Date: Fri, 6 Feb 2015 14:08:14 +0000
Subject: [PATCH] [multidomain] introduce a property for SplitAndMerge

The routines for splitting and merging multidomain and subdomain
solution vectors have been hardcoded. Introducing a property enhances
the flexibility. For example, if one of the subdomain models is itself a
PDELab model, a different SplitAndMerge mechanism is required.

Reviewed by Dennis.



git-svn-id: svn://svn.iws.uni-stuttgart.de/DUMUX/dumux/trunk@14201 2fb0f335-1f38-0410-981e-8018bf24f1b0
---
 dumux/multidomain/common/multidomainconvergencewriter.hh | 5 +++--
 dumux/multidomain/common/multidomainmodel.hh             | 2 +-
 dumux/multidomain/common/multidomainnewtoncontroller.hh  | 9 ++++-----
 dumux/multidomain/common/multidomainproperties.hh        | 3 +++
 dumux/multidomain/common/multidomainpropertydefaults.hh  | 3 +++
 5 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/dumux/multidomain/common/multidomainconvergencewriter.hh b/dumux/multidomain/common/multidomainconvergencewriter.hh
index b49b3f27d0..ba2e626c0a 100644
--- a/dumux/multidomain/common/multidomainconvergencewriter.hh
+++ b/dumux/multidomain/common/multidomainconvergencewriter.hh
@@ -44,6 +44,7 @@ struct MultiDomainConvergenceWriter
 
     typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem;
     typedef typename GET_PROP_TYPE(TypeTag, SolutionVector) SolutionVector;
+    typedef typename GET_PROP_TYPE(TypeTag, SplitAndMerge) SplitAndMerge;
 
     typedef typename GET_PROP_TYPE(TypeTag, SubDomain1TypeTag) SubDomain1TypeTag;
     typedef typename GET_PROP_TYPE(TypeTag, SubDomain2TypeTag) SubDomain2TypeTag;
@@ -121,8 +122,8 @@ struct MultiDomainConvergenceWriter
             SolutionVector1 deltaU1(uLastIter1);
             SolutionVector2 deltaU2(uLastIter2);
 
-            SplitAndMerge<TypeTag>::splitSolVector(uLastIter, uLastIter1, uLastIter2);
-            SplitAndMerge<TypeTag>::splitSolVector(deltaU, deltaU1, deltaU2);
+            SplitAndMerge::splitSolVector(uLastIter, uLastIter1, uLastIter2);
+            SplitAndMerge::splitSolVector(deltaU, deltaU1, deltaU2);
 
             std::cout << "\n writing convergence file of current Newton iteration \n";
             ctl_.method().model().sdModel1().addConvergenceVtkFields(*vtkMultiWriter1_, uLastIter1, deltaU1);
diff --git a/dumux/multidomain/common/multidomainmodel.hh b/dumux/multidomain/common/multidomainmodel.hh
index 814daa8b32..4d22a4a665 100644
--- a/dumux/multidomain/common/multidomainmodel.hh
+++ b/dumux/multidomain/common/multidomainmodel.hh
@@ -58,7 +58,7 @@ class MultiDomainModel
     typedef typename GET_PROP_TYPE(SubDomain1TypeTag, Model) SubDomainModel1;
     typedef typename GET_PROP_TYPE(SubDomain2TypeTag, Model) SubDomainModel2;
 
-    typedef Dumux::SplitAndMerge<TypeTag> SplitAndMerge;
+    typedef typename GET_PROP_TYPE(TypeTag, SplitAndMerge) SplitAndMerge;
 
     enum {
         numEq1 = GET_PROP_VALUE(TypeTag, NumEq1),
diff --git a/dumux/multidomain/common/multidomainnewtoncontroller.hh b/dumux/multidomain/common/multidomainnewtoncontroller.hh
index cc71989d53..d021a668d4 100644
--- a/dumux/multidomain/common/multidomainnewtoncontroller.hh
+++ b/dumux/multidomain/common/multidomainnewtoncontroller.hh
@@ -63,6 +63,7 @@ class MultiDomainNewtonController : public NewtonController<TypeTag>
 
     typedef typename GET_PROP_TYPE(TypeTag, NewtonMethod) NewtonMethod;
     typedef typename GET_PROP_TYPE(TypeTag, SolutionVector) SolutionVector;
+    typedef typename GET_PROP_TYPE(TypeTag, SplitAndMerge) SplitAndMerge;
     typedef typename GET_PROP_TYPE(TypeTag, Problem) Problem;
     typedef typename GET_PROP_TYPE(TypeTag, GridView) GridView;
 
@@ -241,11 +242,9 @@ public:
     */
     void newtonEndStep(SolutionVector &uCurrentIter, SolutionVector &uLastIter)
     {
-        typedef Dumux::SplitAndMerge<TypeTag> Common;
-
-        Common::splitSolVector(this->model_().curSol(),
-                               this->model_().sdModel1().curSol(),
-                               this->model_().sdModel2().curSol());
+        SplitAndMerge::splitSolVector(this->model_().curSol(),
+                                      this->model_().sdModel1().curSol(),
+                                      this->model_().sdModel2().curSol());
 
         ParentType::newtonEndStep(uCurrentIter, uLastIter);
     }
diff --git a/dumux/multidomain/common/multidomainproperties.hh b/dumux/multidomain/common/multidomainproperties.hh
index 373062fc7e..22b480b770 100644
--- a/dumux/multidomain/common/multidomainproperties.hh
+++ b/dumux/multidomain/common/multidomainproperties.hh
@@ -120,6 +120,9 @@ NEW_PROP_TAG(ConstraintsTrafo);
 //! Specifies the type of the jacobian matrix as used for the linear solver
 NEW_PROP_TAG(JacobianMatrix);
 
+//! the routines that are used to split and merge solution vectors
+NEW_PROP_TAG(SplitAndMerge);
+
 } // namespace Properties
 } // namespace Dumux
 
diff --git a/dumux/multidomain/common/multidomainpropertydefaults.hh b/dumux/multidomain/common/multidomainpropertydefaults.hh
index 10fb338c8c..3ec34d67bd 100644
--- a/dumux/multidomain/common/multidomainpropertydefaults.hh
+++ b/dumux/multidomain/common/multidomainpropertydefaults.hh
@@ -240,6 +240,9 @@ SET_INT_PROP(MultiDomain, LinearSolverMaxIterations, 250);
 // set the maximum time step divisions
 SET_INT_PROP(MultiDomain, NewtonMaxTimeStepDivisions, 10);
 
+// set the routines for splitting and merging solution vectors
+SET_TYPE_PROP(MultiDomain, SplitAndMerge, SplitAndMerge<TypeTag>);
+
 } // namespace Properties
 } // namespace Dumux
 
-- 
GitLab