diff --git a/TurTLE/DNS.py b/TurTLE/DNS.py index d2f7dba660f04bd6082ea87594b020892cbbe04d..6e971a250d96a4d3561d05c0ba8bb0b49064f0c8 100644 --- a/TurTLE/DNS.py +++ b/TurTLE/DNS.py @@ -49,6 +49,7 @@ class DNS(_code): work_dir = work_dir, simname = simname) self.generate_default_parameters() + self.generate_extra_parameters() self.statistics = {} return None def set_precision( @@ -179,6 +180,28 @@ class DNS(_code): #for key in ['NSVEparticles', 'NSVEparticles_no_output', 'NSVEcomplex_particles']: # self.extra_parameters[key].update(self.NSVEp_extra_parameters) return None + + def generate_extra_parameters(self): + self.extra_parameters = {} + self.extra_parameters['kraichnan_field'] = { + 'output_velocity': int(1), + 'field_random_seed': int(1), + 'spectrum_dissipation': float(0.027), + 'spectrum_Lint': float(1.3), + 'spectrum_etaK': float(0.3), + 'spectrum_large_scale_const': float(6.78), + 'spectrum_small_scale_const': float(0.40)} + self.extra_parameters['NSVE_Stokes_particles'] = { + 'initial_field_amplitude': float(0.0), + 'initial_particle_vel': float(0.05), + 'drag_coefficient': float(0.1)} + self.extra_parameters['NSVEp_extra_sampling'] = { + 'sample_pressure': int(1), + 'sample_pressure_gradient': int(1), + 'sample_pressure_Hessian': int(1), + 'sample_velocity_gradient': int(1)} + return None + def get_kspace(self): kspace = {} if self.parameters['dealias_type'] == 1: @@ -625,105 +648,79 @@ class DNS(_code): def add_parser_arguments( self, parser): + """Creates subparsers for all simulation types and supplies them with parameters""" subparsers = parser.add_subparsers( dest = 'DNS_class', help = 'type of simulation to run') subparsers.required = True - parser_NSE = subparsers.add_parser( + parser_list = {} + + parser_list['NSE'] = subparsers.add_parser( 'NSE', help = 'plain Navier-Stokes equation') - parser_NSVE = subparsers.add_parser( + parser_list['NSVE'] = subparsers.add_parser( 'NSVE', help = 'plain Navier-Stokes vorticity equation') - parser_NSVE_no_output = subparsers.add_parser( + parser_list['NSVE_no_output'] = subparsers.add_parser( 'NSVE_no_output', help = 'plain Navier-Stokes vorticity formulation, checkpoints are NOT SAVED') - parser_NSVEparticles_no_output = subparsers.add_parser( + parser_list['NSVEparticles_no_output'] = subparsers.add_parser( 'NSVEparticles_no_output', help = 'plain Navier-Stokes vorticity formulation, with basic fluid tracers, checkpoints are NOT SAVED') - parser_static_field = subparsers.add_parser( + parser_list['static_field'] = subparsers.add_parser( 'static_field', help = 'static field with basic fluid tracers') - parser_static_field_with_ghost_collisions = subparsers.add_parser( + parser_list['static_field_with_ghost_collisions'] = subparsers.add_parser( 'static_field_with_ghost_collisions', help = 'static field with basic fluid tracers and ghost collisions') - parser_kraichnan_field = subparsers.add_parser( + parser_list['kraichnan_field'] = subparsers.add_parser( 'kraichnan_field', help = 'Kraichnan field with basic fluid tracers') - parser_NSVEp2 = subparsers.add_parser( + parser_list['NSVEparticles'] = subparsers.add_parser( 'NSVEparticles', help = 'plain Navier-Stokes vorticity formulation, with basic fluid tracers') - parser_NSVE_Stokes_particles = subparsers.add_parser( + parser_list['NSVE_Stokes_particles'] = subparsers.add_parser( 'NSVE_Stokes_particles', help = 'plain Navier-Stokes vorticity formulation, with passive Stokes drag particles') - parser_NSVEp2p = subparsers.add_parser( + parser_list['NSVEcomplex_particles'] = subparsers.add_parser( 'NSVEcomplex_particles', help = 'plain Navier-Stokes vorticity formulation, with oriented active particles') - parser_NSVEp_extra_sampling = subparsers.add_parser( + parser_list['NSVEp_extra_sampling'] = subparsers.add_parser( 'NSVEp_extra_sampling', help = 'plain Navier-Stokes vorticity formulation, with basic fluid tracers, that sample velocity gradient, as well as pressure and its derivatives.') + + for pp in parser_list: + self.simulation_parser_arguments(parser_list[pp]) + self.job_parser_arguments(parser_list[pp]) + self.parameters_to_parser_arguments(parser_list[pp]) + if pp in self.extra_parameters: + self.parameters_to_parser_arguments( + parser_list[pp], + self.extra_parameters[pp]) + for pp in [ - 'NSE', - 'NSVE', - 'NSVE_no_output', - 'NSVEparticles_no_output', - 'NSVEp2', - 'NSVEp2p', + 'NSVEparticles', + 'NSVEcomplex_particles', 'NSVE_Stokes_particles', - 'NSVEp_extra_sampling', - 'static_field', - 'static_field_with_ghost_collisions', - 'kraichnan_field']: - eval('self.simulation_parser_arguments({0})'.format('parser_' + pp)) - eval('self.job_parser_arguments({0})'.format('parser_' + pp)) - eval('self.parameters_to_parser_arguments({0})'.format('parser_' + pp)) - eval('self.parameters_to_parser_arguments(' - 'parser_{0},' - 'self.generate_extra_parameters(\'{0}\'))'.format(pp)) - for pp in [ 'NSVEparticles_no_output', - 'NSVEp2', - 'NSVEp2p', - 'NSVE_Stokes_particles', 'NSVEp_extra_sampling', 'static_field', + 'static_field_with_ghost_collisions', 'kraichnan_field']: - eval('self.particle_parser_arguments({0})'.format('parser_' + pp)) - eval('self.parameters_to_parser_arguments(' - 'parser_{0},' - 'self.NSVEp_extra_parameters)'.format(pp)) + self.particle_parser_arguments(parser_list[pp]) + self.parameters_to_parser_arguments(parser_list[pp], + self.NSVEp_extra_parameters) return None - def generate_extra_parameters( - self, - dns_type): - pars = {} - if dns_type == 'kraichnan_field': - pars['output_velocity'] = int(1) - pars['field_random_seed'] = int(1) - pars['spectrum_dissipation'] = float(0.027) - pars['spectrum_Lint'] = float(1.3) - pars['spectrum_etaK'] = float(0.3) - pars['spectrum_large_scale_const'] = float(6.78) - pars['spectrum_small_scale_const'] = float(0.40) - if dns_type == 'NSVE_Stokes_particles': - pars['initial_field_amplitude'] = float(0.0) - pars['initial_particle_vel'] = float(0.05) - pars['drag_coefficient'] = float(0.1) - if dns_type == 'NSVEp_extra_sampling': - pars['sample_pressure'] = int(1) - pars['sample_pressure_gradient'] = int(1) - pars['sample_pressure_Hessian'] = int(1) - pars['sample_velocity_gradient'] = int(1) - return pars + def prepare_launch( self, args = [], @@ -757,7 +754,9 @@ class DNS(_code): self.set_precision(opt.precision) self.dns_type = opt.DNS_class self.name = self.dns_type + '-' + self.fluid_precision + '-v' + TurTLE.__version__ - # merge parameters if needed + + # adding parameters for the chosen dns_type to self.parameters + # NSVEp_extra_parameters if self.dns_type in [ 'NSVEparticles', 'NSVEcomplex_particles', @@ -769,13 +768,16 @@ class DNS(_code): 'kraichnan_field']: for k in self.NSVEp_extra_parameters.keys(): self.parameters[k] = self.NSVEp_extra_parameters[k] + # extra parameters from prepare launch argument if type(extra_parameters) != type(None): if self.dns_type in extra_parameters.keys(): for k in extra_parameters[self.dns_type].keys(): self.parameters[k] = extra_parameters[self.dns_type][k] - additional_parameters = self.generate_extra_parameters(self.dns_type) - for k in additional_parameters.keys(): - self.parameters[k] = additional_parameters[k] + # extra parameters from `self.extra_parameters` + if self.dns_type in self.extra_parameters.keys(): + for k in self.extra_parameters[self.dns_type].keys(): + self.parameters[k] = self.extra_parameters[self.dns_type][k] + if ((self.parameters['niter_todo'] % self.parameters['niter_out']) != 0): self.parameters['niter_out'] = self.parameters['niter_todo'] if len(opt.src_work_dir) == 0: @@ -1217,6 +1219,7 @@ class DNS(_code): self, opt = None, iter0 = 0): + """Launches jobs. Prepares initial condition and writes parameters to file if necessary.""" if not os.path.exists(self.get_data_file_name()): if not os.path.isdir(self.work_dir): os.makedirs(self.work_dir) diff --git a/TurTLE/_base.py b/TurTLE/_base.py index 2cfe93a1853f595f7ba92785c1bd756afb734b53..c713ccd9ca3f5b3feb17a18283b647e1f734d281 100644 --- a/TurTLE/_base.py +++ b/TurTLE/_base.py @@ -340,6 +340,7 @@ class _base(object): parser, parameters = None, parameter_description = None): + """Adds dict of parameters to parser arguments.""" if type(parameters) == type(None): parameters = self.parameters if type(parameter_description) == type(None): diff --git a/TurTLE/test/test_Heun_p2p.py b/TurTLE/test/test_Heun_p2p.py index ba997c8b687a309d5c95871aa855d122d4f35596..189edea050db31ade20743150d9c3d492e6ec4d5 100644 --- a/TurTLE/test/test_Heun_p2p.py +++ b/TurTLE/test/test_Heun_p2p.py @@ -70,45 +70,6 @@ class ADNS(TurTLE.DNS): outfile.write(self.main + '\n') self.check_current_vorticity_exists = True return None - def generate_default_parameters(self): - # these parameters are relevant for all DNS classes - self.parameters['fftw_plan_rigor'] = 'FFTW_ESTIMATE' - self.parameters['dealias_type'] = int(1) - self.parameters['dkx'] = float(1.0) - self.parameters['dky'] = float(1.0) - self.parameters['dkz'] = float(1.0) - self.parameters['niter_todo'] = int(200) - self.parameters['niter_stat'] = int(20) - self.parameters['niter_out'] = int(200) - self.parameters['checkpoints_per_file'] = int(1) - self.parameters['dt'] = float(0.0001) - self.parameters['histogram_bins'] = int(64) - self.parameters['max_velocity_estimate'] = float(1) - self.parameters['max_vorticity_estimate'] = float(1) - self.parameters['niter_part'] = int(1) - self.parameters['niter_part_fine_period'] = int(2) - self.parameters['niter_part_fine_duration'] = int(0) - self.parameters['nparticles'] = int(1000) - self.parameters['tracers0_integration_steps'] = int(0) - self.parameters['tracers0_neighbours'] = int(3) - self.parameters['tracers0_smoothness'] = int(2) - self.parameters['tracers0_enable_p2p'] = int(0) - self.parameters['tracers0_enable_inner'] = int(0) - self.parameters['tracers0_enable_vorticity_omega'] = int(0) - self.parameters['tracers0_cutoff'] = float(0.920272) - self.parameters['tracers0_inner_v0'] = float(1) - self.parameters['tracers0_lambda'] = float(1) - - self.parameters['nu'] = float(0.1) - self.parameters['fmode'] = int(1) - self.parameters['famplitude'] = float(0.5) - self.parameters['friction_coefficient'] = float(0.5) - self.parameters['injection_rate'] = float(0.4) - self.parameters['fk0'] = float(2.0) - self.parameters['fk1'] = float(4.0) - self.parameters['energy'] = float(0.5) - self.parameters['forcing_type'] = 'fixed_energy_injection_rate' - return None def generate_tracer_state( self, rseed = None, @@ -171,11 +132,17 @@ class ADNS(TurTLE.DNS): self.simulation_parser_arguments(parser) self.particle_parser_arguments(parser) self.parameters_to_parser_arguments(parser) + self.parameters_to_parser_arguments(parser, + self.NSVEp_extra_parameters) opt = parser.parse_args(args) self.simname=opt.simname self.set_precision(opt.precision) self.dns_type = 'NSVEparticle_set' self.name = self.dns_type + '-' + self.fluid_precision + '-v' + TurTLE.__version__ + + for k in self.NSVEp_extra_parameters.keys(): + self.parameters[k] = self.NSVEp_extra_parameters[k] + if ((self.parameters['niter_todo'] % self.parameters['niter_out']) != 0): self.parameters['niter_out'] = self.parameters['niter_todo'] if len(opt.src_work_dir) == 0: @@ -323,7 +290,17 @@ class ADNS(TurTLE.DNS): def main(): bla = ADNS() - bla.launch(sys.argv[1:]) + bla.launch([ + '--niter_todo', '200', + '--niter_stat', '20', + '--niter_out', '200', + '--dt', '0.0001', + '--nparticles', '1000', + '--tracers0_integration_steps', '0', + '--tracers0_neighbours', '3', + '--tracers0_smoothness', '2', + '--tracers0_cutoff', '0.920272' + ] + sys.argv[1:]) assert(bla.parameters['niter_part'] == 1) df = bla.get_particle_file() x = []