Skip to content
Snippets Groups Projects
Commit b1af8421 authored by David Seus's avatar David Seus
Browse files

rename _eval_sources() -> _init_sources(). Change LDDsolver accordingly to...

rename _eval_sources() -> _init_sources(). Change LDDsolver accordingly to update source expressions.
parent 2734e1e0
No related branches found
No related tags found
No related merge requests found
......@@ -100,7 +100,7 @@ class LDDsimulation(object):
## Private variables
# maximal number of L-iterations that the LDD solver uses.
self._max_iter_num = 1
self._max_iter_num = 1000
# TODO rewrite this with regard to the mesh sizes
# self.calc_tol = self.tol
# list of timesteps that get analyed. Gets initiated by self._init_analyse_timesteps
......@@ -161,6 +161,8 @@ class LDDsimulation(object):
'maximum_iterations': 1000,
'report': False
}
self.debug_solver = False
# Dictionaries needed by the LDD Solver
# dictionary holding bool variables for each subdomain indicating wether
# minimal error has been achieved, i.e. the calculation can be considered
......@@ -195,7 +197,7 @@ class LDDsimulation(object):
number_of_timesteps_to_analyse: int,#
sources: tp.Dict[int, tp.Dict[str, str]],#
initial_conditions: tp.Dict[int, tp.Dict[str, str]],#
dirichletBC_Expressions: tp.Dict[int, tp.Dict[str, str]],#
dirichletBC_expression_strings: tp.Dict[int, tp.Dict[str, str]],#
write2file: tp.Dict[str, bool],#
exact_solution: tp.Dict[int, tp.Dict[str, str]] = None, #
)-> None:
......@@ -223,7 +225,7 @@ class LDDsimulation(object):
self.timestep_size = timestep_size
self.sources = sources
self.initial_conditions = initial_conditions
self.dirichletBC_expression_strings = dirichletBC_Expressions
self.dirichletBC_expression_strings = dirichletBC_expression_strings
self.exact_solution = exact_solution
self.write2file = write2file
self._parameters_set = True
......@@ -237,22 +239,25 @@ class LDDsimulation(object):
raise RuntimeError('Parameters note set!\nYou forgott to run self.set_parameters(**kwds)')
self._add_parameters_to_output_dirname()
self._init_analyse_timesteps()
print("initialise meshes and marker functions ...\n")
df.info(colored("initialise meshes and marker functions ...\n", "orange"))
self._init_meshes_and_markers()
print("initialise interfaces ...\n")
df.info(colored("initialise interfaces ...\n", "orange"))
self._init_interfaces()
print("initialise subdomains ...\n")
df.info(colored("initialise subdomains ...\n", "orange"))
self._init_subdomains()
print("creating xdmf files for each subdomain ...\n")
df.info(colored("creating xdmf files for each subdomain ...\n", "orange"))
self._init_solution_files()
# initial values get initialised here to be able to call the solver at different
# timesteps without having to call self.run().
df.info(colored("create initial values ...", "orange"))
self._init_initial_values()
df.info(colored("create source Expressions ...", "orange"))
self._init_sources()
# initialise exact solution expression dictionary if we have an exact
# solution case.
self._init_exact_solution_expression()
if self.exact_solution:
print("writing exact solution for all time steps to xdmf files ...")
df.info(colored("writing exact solution for all time steps to xdmf files ...", "orange"))
self.write_exact_solution_to_xdmf()
self._initialised = True
......@@ -289,6 +294,8 @@ class LDDsimulation(object):
df.info(colored("Start time stepping","green"))
# write initial values to file.
self.timestep_num = int(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:
print(f"entering timestep ",
"{}".format(self.timestep_num),
......@@ -296,9 +303,9 @@ class LDDsimulation(object):
# check if the solver should beanalised or not.
if analyse_solver_at_timesteps is not None and np.isin(self.timestep_num, analyse_solver_at_timesteps, assume_unique=True):
print("analyising timestep ...")
self.LDDsolver(debug = True, analyse_timestep = True)
self.LDDsolver(debug = self.debug_solver, analyse_timestep = True)
else:
self.LDDsolver(debug = True, analyse_timestep = False)
self.LDDsolver(debug = self.debug_solver, analyse_timestep = False)
self.t += self.timestep_size
self.timestep_num += 1
......@@ -390,8 +397,8 @@ class LDDsimulation(object):
subdomain.null_all_interface_iteration_numbers()
# update the time of the source terms before starting the iteration.
# The sources and sinks are the same throughout the iteration.
self._eval_sources(time = time,
subdomain_index = ind)
# self._eval_sources(time = time,
# subdomain_index = ind)
self.update_DirichletBC_dictionary(time = time, #
subdomain_index = ind,
)
......@@ -399,6 +406,8 @@ class LDDsimulation(object):
# # to 0.
subdomain.iteration_number = 0
for phase in subdomain.has_phases:
# evaluate the sources to the current time.
subdomain.source[phase].t = time
# set the solution of the previous timestep as new prev_timestep pressure
subdomain.pressure_prev_timestep[phase].assign(
subdomain.pressure[phase]
......@@ -475,9 +484,9 @@ class LDDsimulation(object):
print(f"the maximum distance between any to points in a cell mesh.hmax() on subdomain{sd_index} is h={subdomain.mesh.hmax()}")
print(f"the minimal distance between any to points in a cell mesh.hmin() on subdomain{sd_index} is h={subdomain.mesh.hmin()}")
print(f"the error criterion is tol = {error_criterion}")
wetting_done = self._calc_isdone_for_phase[sd_index]['wetting']
nonwetting_done = self._calc_isdone_for_phase[sd_index]['nonwetting']
if nonwetting_done and wetting_done:
# wetting_done = self._calc_isdone_for_phase[sd_index]['wetting']
# nonwetting_done = self._calc_isdone_for_phase[sd_index]['nonwetting']
if total_subsequent_iter_error < error_criterion:
if debug:
print(f"subdomain{sd_index} reachd error tol = {error_criterion} in iteration {iteration}.")
self._calc_isdone_for_subdomain[sd_index] = True
......@@ -973,7 +982,7 @@ class LDDsimulation(object):
subdomain.write_pressure_to_interfaces()
subdomain.write_solution_to_xdmf(#
file = self.solution_file[num], #
time = self.t,#
time = self.starttime,#
write_iter_for_fixed_time = False,
)
......@@ -1060,27 +1069,22 @@ class LDDsimulation(object):
else:
pass
def _eval_sources(self, subdomain_index: int, #
interpolation_degree: int = None, #
time: float = 0,#
):
""" evaluate time dependent source terms or initialise them if time == 0
def _init_sources(self, interpolation_degree: int = None):
""" create source expressions at self.starttime and populate subdomain
source dictionaries.
"""
if interpolation_degree is None:
interpolation_degree = self.interpolation_degree
subdomain = self.subdomain[subdomain_index]
for phase in subdomain.has_phases:
if np.abs(time-self.starttime) < self.tol:
for subdomain_index, subdomain in self.subdomain.items():
for phase in subdomain.has_phases:
# here t = 0 and we have to initialise the sources.
f = self.sources[subdomain_index][phase]
subdomain.source.update(
{phase: df.Expression(f, domain = subdomain.mesh,#
degree = interpolation_degree, #
t = time)}
t = self.starttime)}
)
else:
subdomain.source[phase].t = time
def _add_parameters_to_output_dirname(self):
""" function to create a new output directory for given set of input
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment