diff --git a/LDDsimulation/LDDsimulation.py b/LDDsimulation/LDDsimulation.py index 2d676444e3508eda92f2f06c6e96e45b1db4c188..9260e68d657ac334e555362a2ad5e85e0d716daf 100644 --- a/LDDsimulation/LDDsimulation.py +++ b/LDDsimulation/LDDsimulation.py @@ -302,6 +302,7 @@ class LDDsimulation(object): # solution case. self._init_exact_solution_expression() self._init_DirichletBC_dictionary() + self._init_simulation_output() if self.exact_solution and self.write2file['solutions']: df.info(colored("writing exact solution for all time steps to xdmf files ...", "yellow")) self.write_exact_solution_to_xdmf() @@ -343,18 +344,7 @@ class LDDsimulation(object): df.info(colored("Start time stepping","green")) # write initial values to file. self.timestep_num = int(1) - # set up spacetime_errornorm dictionaries. - self.spacetime_errornorm = dict() - for subdom_ind, subdomain in self.subdomain.items(): - self.spacetime_errornorm.update({subdom_ind: dict()}) - for phase in subdomain.has_phases: - self.spacetime_errornorm[subdom_ind].update({phase: dict()}) - self.spacetime_errornorm[subdom_ind][phase].update( - {# keys mean the norm in time. We use L2 in space - 'Linf': 0.0, - 'L1': 0.0, - 'L2': 0.0 } - ) + # note that at this point of the code self.t = self.starttime as set in # the beginning. while self.timestep_num <= self.number_of_timesteps: @@ -395,10 +385,10 @@ class LDDsimulation(object): pa_exact.t = self.t norm_pa_exact = df.norm(pa_exact, norm_type='L2', mesh=subdomain.mesh) error_calculated = df.errornorm(pa_exact, subdomain.pressure[phase], 'L2', degree_rise=6) - self.spacetime_errornorm[subdom_ind][phase]['L1'] += self.timestep_size*self.spacetime_errornorm[subdom_ind][phase]['L1'] - self.spacetime_errornorm[subdom_ind][phase]['L2'] += self.timestep_size*self.spacetime_errornorm[subdom_ind][phase]['L2']**2 - if error_calculated > self.spacetime_errornorm[subdom_ind][phase]['Linf']: - self.spacetime_errornorm[subdom_ind][phase]['Linf'] = error_calculated + self.output[subdom_ind]['errornorm'][phase]['L1'] += self.timestep_size*self.output[subdom_ind]['errornorm'][phase]['L1'] + self.output[subdom_ind]['errornorm'][phase]['L2'] += self.timestep_size*self.output[subdom_ind]['errornorm'][phase]['L2']**2 + if error_calculated > self.output[subdom_ind]['errornorm'][phase]['Linf']: + self.output[subdom_ind]['errornorm'][phase]['Linf'] = error_calculated if norm_pa_exact > self.tol: relative_L2_errornorm.update( @@ -437,7 +427,7 @@ class LDDsimulation(object): ) self.timestep_num += 1 - self.spacetime_errornorm[subdom_ind][phase]['L2'] = np.sqrt(self.spacetime_errornorm[subdom_ind][phase]['L2']) + self.output[subdom_ind]['errornorm'][phase]['L2'] = np.sqrt(self.output[subdom_ind]['errornorm'][phase]['L2']) print("LDD simulation use case: {}".format(self.use_case)) df.info("Finished calculation") @@ -455,7 +445,7 @@ class LDDsimulation(object): # df.info(colored("start post processing calculations ...\n", "yellow")) # self.post_processing() # df.info(colored("finished post processing calculations \nAll right. I'm Done.", "green")) - return self.spacetime_errornorm + return self.output def LDDsolver(self, time: float = None, # debug: bool = False, # @@ -759,7 +749,7 @@ class LDDsimulation(object): for subdom_ind, subdomain in self.subdomain.items(): tau = subdomain.timestep_size L = subdomain.L - h = subdomain.mesh.hmax() + h = subdomain.mesh_size if subdomain.isRichards: Lam = subdomain.lambda_param['wetting'] name1 ="subdomain" + "{}".format(subdom_ind) @@ -1488,3 +1478,20 @@ class LDDsimulation(object): self.endtime = self.number_of_timesteps*self.timestep_size # time_interval = [starttime, Tmax] print(f"The simulation interval is [{self.starttime}, {self.endtime}]") + + + def _init_simulation_output(self): + """set up dictionary for simulation output""" + self.output = dict() + for subdom_ind, subdomain in self.subdomain.items(): + self.output.update({subdom_ind: dict()}) + self.output[subdom_ind].update({'mesh_size': subdomain.mesh_size}) + self.output[subdom_ind].update({'errornorm': dict()}) + for phase in subdomain.has_phases: + self.output[subdom_ind]['errornorm'].update({phase: dict()}) + self.output[subdom_ind]['errornorm'][phase].update( + {# keys mean the norm in time. We use L2 in space + 'Linf': 0.0, + 'L1': 0.0, + 'L2': 0.0 } + ) diff --git a/LDDsimulation/domainPatch.py b/LDDsimulation/domainPatch.py index 098089a829a23133d5023f7946a6cdc42744712f..b1c8b11336141778014367b9271efe9d74211173 100644 --- a/LDDsimulation/domainPatch.py +++ b/LDDsimulation/domainPatch.py @@ -149,6 +149,7 @@ class DomainPatch(df.SubDomain): self.subdomain_index = subdomain_index self.isRichards = isRichards self.mesh = mesh + self.mesh_size = self.mesh.hmax() self.porosity = porosity self.viscosity = viscosity self.outer_boundary_def_points = outer_boundary_def_points