diff --git a/Two-phase-Two-phase/two-patch/TP-TP-2-patch-pure-dd-avoid-interface-at-origin/TP-TP-2-patch-pure-dd-horizontal-interface-avoiding-origin.py b/Two-phase-Two-phase/two-patch/TP-TP-2-patch-pure-dd-avoid-interface-at-origin/TP-TP-2-patch-pure-dd-horizontal-interface-avoiding-origin.py index e3a5a8e9c079712c14aa4ea75d958350e91fbfdd..25ce74e7e80180f6794eac61e56ac71d7aba9bc2 100755 --- a/Two-phase-Two-phase/two-patch/TP-TP-2-patch-pure-dd-avoid-interface-at-origin/TP-TP-2-patch-pure-dd-horizontal-interface-avoiding-origin.py +++ b/Two-phase-Two-phase/two-patch/TP-TP-2-patch-pure-dd-avoid-interface-at-origin/TP-TP-2-patch-pure-dd-horizontal-interface-avoiding-origin.py @@ -9,6 +9,8 @@ import LDDsimulation as ldd import functools as ft import helpers as hlp import datetime +import os +import pandas as pd date = datetime.datetime.now() datestr = date.strftime("%Y-%m-%d") @@ -18,30 +20,71 @@ datestr = date.strftime("%Y-%m-%d") sym.init_printing() use_case = "TP-TP-2-patch-really-pure-dd-horizontal-interface-avoding-origin" -solver_tol = 1E-6 +# solver_tol = 5E-7 max_iter_num = 1000 FEM_Lagrange_degree = 1 +mesh_study = False +resolutions = { + # 1: 1e-7, # h=2 + # 2: 2e-5, # h=1.1180 + # 4: 1e-6, # h=0.5590 + # 8: 1e-6, # h=0.2814 + # 16: 5e-7, # h=0.1412 + 32: 1e-6, + # 64: 5e-7, + # 128: 5e-7 + } + ############ GRID ####################### -mesh_resolution = 10 -timestep_size = 0.0001 -number_of_timesteps = 4000 +# mesh_resolution = 20 +timestep_size = 0.0005 +number_of_timesteps = 10 +plot_timestep_every = 1 # decide how many timesteps you want analysed. Analysed means, that we write out # subsequent errors of the L-iteration within the timestep. -number_of_timesteps_to_analyse = 6 -starttime = 0 +number_of_timesteps_to_analyse = 1 +starttime = 0.0 -Lw = 0.25 #/timestep_size +Lw = 0.05 #/timestep_size Lnw=Lw -lambda_w = 4 -lambda_nw = 4 +lambda_w = 400 +lambda_nw = 400 -include_gravity = False +include_gravity = True debugflag = False analyse_condition = True -output_string = "./output/{}-{}_timesteps{}_".format(datestr, use_case, number_of_timesteps) +if mesh_study: + output_string = "./output/{}-{}_timesteps{}_P{}".format(datestr, use_case, number_of_timesteps, FEM_Lagrange_degree) +else: + for tol in resolutions.values(): + solver_tol = tol + output_string = "./output/{}-{}_timesteps{}_P{}_solver_tol{}".format(datestr, use_case, number_of_timesteps, FEM_Lagrange_degree, solver_tol) + + +# toggle what should be written to files +if mesh_study: + write_to_file = { + 'space_errornorms': True, + 'meshes_and_markers': True, + 'L_iterations_per_timestep': False, + 'solutions': False, + 'absolute_differences': False, + 'condition_numbers': analyse_condition, + 'subsequent_errors': False + } +else: + write_to_file = { + 'space_errornorms': True, + 'meshes_and_markers': True, + 'L_iterations_per_timestep': False, + 'solutions': True, + 'absolute_differences': True, + 'condition_numbers': analyse_condition, + 'subsequent_errors': True + } ##### Domain and Interface #### # global simulation domain domain @@ -503,54 +546,71 @@ for subdomain in isRichards.keys(): ) -# def saturation(pressure, subdomain_index): -# # inverse capillary pressure-saturation-relationship -# return df.conditional(pressure < 0, 1/((1 - pressure)**(1/(subdomain_index + 1))), 1) -# -# sa - -write_to_file = { - 'meshes_and_markers': True, - 'L_iterations': True -} - - -# initialise LDD simulation class -simulation = ldd.LDDsimulation( - tol=1E-14, - LDDsolver_tol=solver_tol, - debug=debugflag, - max_iter_num=max_iter_num, - FEM_Lagrange_degree=FEM_Lagrange_degree - ) - -simulation.set_parameters(use_case=use_case, - output_dir=output_string, - subdomain_def_points=subdomain_def_points, - isRichards=isRichards, - interface_def_points=interface_def_points, - outer_boundary_def_points=outer_boundary_def_points, - adjacent_subdomains=adjacent_subdomains, - mesh_resolution=mesh_resolution, - viscosity=viscosity, - porosity=porosity, - L=L, - lambda_param=lambda_param, - relative_permeability=relative_permeability, - saturation=sat_pressure_relationship, - starttime=starttime, - number_of_timesteps=number_of_timesteps, - number_of_timesteps_to_analyse=number_of_timesteps_to_analyse, - timestep_size=timestep_size, - sources=source_expression, - initial_conditions=initial_condition, - dirichletBC_expression_strings=dirichletBC, - exact_solution=exact_solution, - densities=densities, - include_gravity=include_gravity, - write2file=write_to_file, - ) - -simulation.initialise() -# simulation.write_exact_solution_to_xdmf() -simulation.run(analyse_condition=analyse_condition) +for mesh_resolution, solver_tol in resolutions.items(): + # initialise LDD simulation class + simulation = ldd.LDDsimulation( + tol=1E-14, + LDDsolver_tol=solver_tol, + debug=debugflag, + max_iter_num=max_iter_num, + FEM_Lagrange_degree=FEM_Lagrange_degree, + mesh_study=mesh_study + ) + + simulation.set_parameters(use_case=use_case, + output_dir=output_string, + subdomain_def_points=subdomain_def_points, + isRichards=isRichards, + interface_def_points=interface_def_points, + outer_boundary_def_points=outer_boundary_def_points, + adjacent_subdomains=adjacent_subdomains, + mesh_resolution=mesh_resolution, + viscosity=viscosity, + porosity=porosity, + L=L, + lambda_param=lambda_param, + relative_permeability=relative_permeability, + saturation=sat_pressure_relationship, + starttime=starttime, + number_of_timesteps=number_of_timesteps, + number_of_timesteps_to_analyse=number_of_timesteps_to_analyse, + plot_timestep_every=plot_timestep_every, + timestep_size=timestep_size, + sources=source_expression, + initial_conditions=initial_condition, + dirichletBC_expression_strings=dirichletBC, + exact_solution=exact_solution, + densities=densities, + include_gravity=include_gravity, + write2file=write_to_file, + ) + + simulation.initialise() + output_dir = simulation.output_dir + # simulation.write_exact_solution_to_xdmf() + output = simulation.run(analyse_condition=analyse_condition) + for subdomain_index, subdomain_output in output.items(): + mesh_h = subdomain_output['mesh_size'] + for phase, different_errornorms in subdomain_output['errornorm'].items(): + filename = output_dir + "subdomain{}-space-time-errornorm-{}-phase.csv".format(subdomain_index, phase) + # for errortype, errornorm in different_errornorms.items(): + + # eocfile = open("eoc_filename", "a") + # eocfile.write( str(mesh_h) + " " + str(errornorm) + "\n" ) + # eocfile.close() + # if subdomain.isRichards:mesh_h + data_dict = { + 'mesh_parameter': mesh_resolution, + 'mesh_h': mesh_h, + } + for error_type, errornorms in different_errornorms.items(): + data_dict.update( + {error_type: errornorms} + ) + errors = pd.DataFrame(data_dict, index=[mesh_resolution]) + # check if file exists + if os.path.isfile(filename) == True: + with open(filename, 'a') as f: + errors.to_csv(f, header=False, sep='\t', encoding='utf-8', index=False) + else: + errors.to_csv(filename, sep='\t', encoding='utf-8', index=False) diff --git a/Two-phase-Two-phase/two-patch/TP-TP-2-patch-test-case/TP-TP-2-patch-test.py b/Two-phase-Two-phase/two-patch/TP-TP-2-patch-test-case/TP-TP-2-patch-test.py index 15937d60d0a5e0204bb3e11ff8089bc73cfb613d..31f42519805880f3354041a3b5d7efbbeeccd9eb 100755 --- a/Two-phase-Two-phase/two-patch/TP-TP-2-patch-test-case/TP-TP-2-patch-test.py +++ b/Two-phase-Two-phase/two-patch/TP-TP-2-patch-test-case/TP-TP-2-patch-test.py @@ -19,7 +19,7 @@ datestr = date.strftime("%Y-%m-%d") # init sympy session sym.init_printing() -use_case = "TP-TP-2-patch-big-timestep" +use_case = "TP-TP-2-patch" # solver_tol = 5E-7 max_iter_num = 1000 FEM_Lagrange_degree = 1 @@ -39,12 +39,12 @@ resolutions = { ############ GRID ####################### # mesh_resolution = 20 timestep_size = 0.001 -number_of_timesteps = 1 +number_of_timesteps = 10 plot_timestep_every = 1 # decide how many timesteps you want analysed. Analysed means, that we write out # subsequent errors of the L-iteration within the timestep. number_of_timesteps_to_analyse = 1 -starttime = 0.5 +starttime = 0.0 Lw = 0.03 #/timestep_size Lnw=Lw