diff --git a/LDDsimulation/domainPatch.py b/LDDsimulation/domainPatch.py index 1de1635cc8b7e867fcea926e4bd13bd5508e8a1c..8eed97a5091b7918aa76ff86d3bc80646b4c2626 100644 --- a/LDDsimulation/domainPatch.py +++ b/LDDsimulation/domainPatch.py @@ -132,7 +132,8 @@ class DomainPatch(df.SubDomain): include_gravity: bool = False,# gravity_acceleration: float = 9.81, interpolation_degree: int = 10, - tol = None,# + tol: float = None,# + degree: int = 1, ): # because we declare our own __init__ method for the derived class BoundaryPart, # we overwrite the __init__-method of the parent class df.SubDomain. However, @@ -163,6 +164,7 @@ class DomainPatch(df.SubDomain): # timestep size, tau in the paper self.timestep_size = timestep_size self.interpolation_degree = interpolation_degree + self.FEM_Lagrange_degree = degree ### Class variables set by methods # sometimes we need to loop over the phases and the length of the loop is # determined by the model we are assuming @@ -674,16 +676,21 @@ class DomainPatch(df.SubDomain): pass #### PRIVATE METHODS - def _init_function_space(self) -> None: + def _init_function_space(self, degree: int = None) -> None: """ create function space for solution and trial functions - Note that P1 FEM is hard coded here, as it is assumed in other methods - aswell. This method sets the class variable + This method sets the class variable self.function_space["pressure"] self.trialfunction self.pressure self.testfunction + + INPUT + degree int degree of the Lagrange ansatz space """ + if degree is None: + degree = self.FEM_Lagrange_degree + function_name = ["pressure", "gli", "flux"] self.function_space = dict() @@ -692,16 +699,20 @@ class DomainPatch(df.SubDomain): if function == "pressure": self.trialfunction = dict() self.testfunction = dict() - # self.neighbouring_interface_pressure = dict() + + # we want the same space for both primary variables (pw + # and pnw) to be able to calculate pnw-pw without issues. + pressure_space = df.FunctionSpace(self.mesh, 'P', degree) for phase in self.has_phases: if function == "pressure": - self.function_space[function].update({phase: df.FunctionSpace(self.mesh, 'P', 1)}) + self.function_space[function].update({phase: pressure_space}) self.trialfunction.update({phase: df.TrialFunction(self.function_space["pressure"][phase])}) self.testfunction.update({phase: df.TestFunction(self.function_space["pressure"][phase])}) elif function == "gli": degree = self.function_space["pressure"][phase].ufl_element().degree() self.function_space[function].update({phase: df.FunctionSpace(self.mesh, 'DG', degree)}) else: + # here function = flux degree = self.function_space["pressure"][phase].ufl_element().degree() self.function_space[function].update({phase: df.VectorFunctionSpace(self.mesh, 'DG', degree)}) @@ -811,7 +822,7 @@ class DomainPatch(df.SubDomain): self.ds = df.Measure('ds', domain = self.mesh, subdomain_data = self.interface_marker) - def _calc_interface_dof_indices_and_coordinates(self, debug: bool = False): + def _calc_interface_dof_indices_and_coordinates(self, debug: bool = True): """ calculate dictionaries containing for each local facet index of interfaces a dictionary containing {interface_dof_index: dof_coordinates} """ @@ -847,11 +858,11 @@ class DomainPatch(df.SubDomain): if debug: print(f"\ndofs on interface for function space {function} for phase {phase}:") self.interface_dof_indices_and_coordinates[function][interface_index].update(# - {phase: interface.dofs_and_coordinates(function_space[phase], marker, marker_value, debug=False)} + {phase: interface.dofs_and_coordinates(function_space[phase], marker, marker_value, debug=debug)} ) - def _calc_corresponding_dof_indices(self, debug=True): + def _calc_corresponding_dof_indices(self, debug=False): """ calculate dictionary which for each interface and each phase holds for each facet index, the dof indices of the pressures and flux components corresponding to a given dof index of the gli function. @@ -1053,9 +1064,10 @@ class DomainPatch(df.SubDomain): if self.isRichards: capillary_pressure.assign(-self.pressure["wetting"]) else: - pc_temp = self.pressure["nonwetting"].vector()[:] - self.pressure["wetting"].vector()[:] - capillary_pressure.vector().set_local(pc_temp) - # capillary_pressure.assign(pc_temp) + # pc_temp = self.pressure["nonwetting"].vector()[:] - self.pressure["wetting"].vector()[:] + # capillary_pressure.vector().set_local(pc_temp) + pc_temp = self.pressure["nonwetting"] - self.pressure["wetting"] + capillary_pressure.assign(pc_temp) capillary_pressure.rename("pc_num", "pc_num") file.write(capillary_pressure, t) else: