From e62698e1bbc3c6493ad1bcfb3971ba86a244adc7 Mon Sep 17 00:00:00 2001
From: David Seus <david.seus@ians.uni-stuttgart.de>
Date: Wed, 3 Apr 2019 10:21:37 +0200
Subject: [PATCH] rewrite self._eval_sources() to operate on a single domain

---
 LDDsimulation/LDDsimulation.py | 94 +++++++++++++++++++---------------
 1 file changed, 54 insertions(+), 40 deletions(-)

diff --git a/LDDsimulation/LDDsimulation.py b/LDDsimulation/LDDsimulation.py
index f6ed481..3da0268 100644
--- a/LDDsimulation/LDDsimulation.py
+++ b/LDDsimulation/LDDsimulation.py
@@ -145,9 +145,6 @@ class LDDsimulation(object):
         self._init_interfaces()
         self._init_subdomains()
         self._init_initial_values()
-        self._eval_sources()
-        # init Dirichlet Boundary values for the first time
-        self.set_DirichletBC(time = 0, first_init = True)
 
     def LDDsolver(self, time: float):
         """ calulate the solution on all patches for the next timestep
@@ -165,6 +162,11 @@ class LDDsimulation(object):
         # and
         for ind, subdomain in self.subdomain.items():
             subdomain_calc_isdone.update({ind, False})
+            # update the time of the source terms before starting the iteration.
+            # The sources and sinks are the same throughout the iteration.
+            self._eval_sources(interpolation_degree = 2,
+                               time = time,
+                               subdomain_index = ind)
             # the following only needs to be done when time is not equal 0 since
             # our initialisation functions already took care of setting what follows
             # for the initial iteration step.
@@ -177,6 +179,7 @@ class LDDsimulation(object):
                 # TODO recheck if
                 subdomain.pressure_prev_iter = subdomain.pressure
                 # needs to be set also
+
         ### actual iteration starts here
         # gobal stopping criterion for the iteration.
         all_subdomains_done = False
@@ -189,12 +192,12 @@ class LDDsimulation(object):
                 # finished.
                 if not subdomain_calc_isdone[sd_index]:
                     # solve the problem on subdomain
-                    self.Lsolver_step(subdomain = subdomain,#
+                    self.Lsolver_step(subdomain_index = sd_index,#
                                       iteration = iteration,#
                                       debug = True
                     )
                     subsequent_iterations_err = self.calc_iteration_error(
-                        subdomain = subdomain,#
+                        subdomain_index = sd_index,#
                         error_type = "L2"
                     )
                     # check if error criterion has been met
@@ -226,6 +229,26 @@ class LDDsimulation(object):
             iteration += 1
             # end iteration while loop.
 
+    def Lsolver_step(subdomain_index: int],#
+                     iteration: int,#
+                     debug: bool = False) -> None:
+        """ L-scheme solver iteration step for an object of class subdomain
+
+        Lsolver_step implements L-scheme solver iteration step for an subdomain
+        with index subdomain_index, i.e. for the model form (already in L-scheme
+        form) stored in the domain patch subdomain. 
+
+        # parameters
+        subdomain_index:    int                         subdomain index that defines
+                                                        which subdomain to perform
+                                                        the iteration on.
+        iteration:          int                         iteration number
+        debug:              bool                        flag to toggle weather or not
+                                                        to write out each iteration.
+        """
+
+
+
     ## Private methods
     def _init_meshes_and_markers(self, subdomain_def_points: tp.List[tp.List[df.Point]] = None,#
                                 mesh_resolution: float = None) -> None:
@@ -444,43 +467,34 @@ class LDDsimulation(object):
                     {'nonwetting': df.DirichletBC(V['nonwetting'], pDCnw, boundary_marker, 1)},#
                 )
 
-    def _eval_sources(self, interpolation_degree: int = 2, time: float = 0):
+    def _eval_sources(self, interpolation_degree: int = 2, #
+                            time: float = 0,
+                            subdomain_index: int):
         """ evaluate time dependent source terms or initialise them if time == 0
         """
+        subdomain = self.subdomain[subdomain_index]
         if np.abs(time) < self.tol:
             # here t = 0 and we have to initialise the sources.
-            for num, subdomain in self.subdomain.items():
-                mesh = subdomain.mesh
-                V = subdomain.function_space
-                # p0 contains both pw_0 and pnw_0 for subdomain[num]
-                f = self.sources[num]
-                if subdomain.isRichards:
-                    # note that the default interpolation degree is 2
-                    fw = df.Expression(f['wetting'], domain = mesh, degree = interpolation_degree, t = time)
-                    # subdomain.source = {'wetting' : df.interpolate(fw, V['wetting'])}
-                    subdomain.source = {'wetting' : fw}
-                else:
-                    fw = df.Expression(f['wetting'], domain = mesh, degree = interpolation_degree, t = time)
-                    fnw = df.Expression(f['nonwetting'], domain = mesh, degree = interpolation_degree, t = time)
-                    # subdomain.pressure_prev_iter = {'wetting' : df.interpolate(fw, V['wetting']),#
-                    #                                 'nonwetting' : df.interpolate(fnw, V['nonwetting'])}
-                    # subdomain.pressure_prev_timestep = {'wetting' : df.interpolate(fw, V['wetting']),#
-                    #                                     'nonwetting' : df.interpolate(fnw, V['nonwetting'])}
-                    subdomain.source = {'wetting' : fw,#
-                                        'nonwetting' : fnw}
+            mesh = subdomain.mesh
+            V = subdomain.function_space
+            # p0 contains both pw_0 and pnw_0 for subdomain[subdomain_index]
+            f = self.sources[subdomain_index]
+            if subdomain.isRichards:
+                # note that the default interpolation degree is 2
+                fw = df.Expression(f['wetting'], domain = mesh, degree = interpolation_degree, t = time)
+                # subdomain.source = {'wetting' : df.interpolate(fw, V['wetting'])}
+                subdomain.source = {'wetting' : fw}
+            else:
+                fw = df.Expression(f['wetting'], domain = mesh, degree = interpolation_degree, t = time)
+                fnw = df.Expression(f['nonwetting'], domain = mesh, degree = interpolation_degree, t = time)
+                subdomain.source = {'wetting' : fw,#
+                                    'nonwetting' : fnw}
         else:
-            for num, subdomain in self.subdomain.items():
-                # mesh = subdomain.mesh
-                # V = subdomain.function_space
-                # # p0 contains both pw_0 and pnw_0 for subdomain[num]
-                # f = self.sources[num]
-                if subdomain.isRichards:
-                    # note that the default interpolation degree is 2
-                    # fw = df.Expression(f['wetting'], domain = mesh, degree = interpolation_degree, t = time)
-                    # subdomain.source = {'wetting' : df.interpolate(fw, V['wetting'])}
-                    subdomain.source['wetting'].t = time
-                else:
-                    # fw = df.Expression(f['wetting'], domain = mesh, degree = interpolation_degree, t = time)
-                    # fnw = df.Expression(f['nonwetting'], domain = mesh, degree = interpolation_degree, t = time)
-                    subdomain.source['wetting'].t = time
-                    subdomain.source['nonwetting'].t = time
+            # here the sources are already initiated and stored in the subdomain.
+            # they must be updated in time.
+            if subdomain.isRichards:
+                # note that the default interpolation degree is 2
+                subdomain.source['wetting'].t = time
+            else:
+                subdomain.source['wetting'].t = time
+                subdomain.source['nonwetting'].t = time
-- 
GitLab