Coverage for pySDC / projects / RayleighBenard / run_experiment.py: 53%
51 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-27 07:06 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-27 07:06 +0000
1def parse_args():
2 import argparse
4 def cast_to_bool(me):
5 return False if me in ['False', '0', 0] else True
7 def str_to_procs(me):
8 procs = me.split('/')
9 assert len(procs) == 3
10 return [int(p) for p in procs]
12 parser = argparse.ArgumentParser()
13 parser.add_argument('--useGPU', type=cast_to_bool, help='Toggle for GPUs', default=False)
14 parser.add_argument(
15 '--mode',
16 type=str,
17 help='Mode for this script',
18 default=None,
19 choices=['run', 'plot', 'benchmark'],
20 )
21 parser.add_argument('--config', type=str, help='Configuration to load', default=None)
22 parser.add_argument('--restart_idx', type=int, help='Restart from file by index', default=0)
23 parser.add_argument('--procs', type=str_to_procs, help='Processes in steps/sweeper/space', default='1/1/1')
24 parser.add_argument('--res', type=int, help='Space resolution along first axis', default=-1)
25 parser.add_argument('--dt', type=float, help='(Starting) Step size', default=-1)
26 parser.add_argument(
27 '--logger_level', type=int, help='Logger level on the first rank in space and in the sweeper', default=15
28 )
29 parser.add_argument('-o', type=str, help='output path', default='./')
30 parser.add_argument(
31 '--distribution',
32 type=str,
33 help='distribute tasks',
34 default='space_first',
35 choices=['space_first', 'time_first'],
36 )
38 return vars(parser.parse_args())
41def run_experiment(args, config, **kwargs):
42 import pickle
43 import os
45 from pySDC.implementations.controller_classes.controller_nonMPI import controller_nonMPI
46 from pySDC.helpers.stats_helper import filter_stats
48 type(config).base_path = args['o']
49 os.makedirs(f'{args["o"]}/data', exist_ok=True)
51 if args['mode'] == 'benchmark':
52 config.prepare_for_benchmark()
54 description = config.get_description(
55 useGPU=args['useGPU'], MPIsweeper=args['procs'][1] > 1, res=args['res'], dt=args['dt'], **kwargs
56 )
57 controller_params = config.get_controller_params(logger_level=args['logger_level'])
59 if args['mode'] == 'benchmark':
60 config.prepare_description_for_benchmark(description, controller_params)
62 if args['useGPU']:
63 from pySDC.implementations.hooks.log_timings import GPUTimings
65 controller_params['hook_class'].append(GPUTimings)
67 assert (
68 config.comms[0].size == 1
69 ), 'Have not figured out how to do MPI controller with GPUs yet because I need NCCL for that!'
70 controller = controller_nonMPI(num_procs=1, controller_params=controller_params, description=description)
71 prob = controller.MS[0].levels[0].prob
73 u0, t0 = config.get_initial_condition(prob, restart_idx=args['restart_idx'])
75 if args['mode'] == 'benchmark':
76 config.prepare_caches_for_benchmark(prob, controller)
78 config.prepare_caches(prob)
80 uend, stats = controller.run(u0=u0, t0=t0, Tend=config.Tend)
82 combined_stats = filter_stats(stats, comm=config.comm_world)
84 if config.comm_world.rank == config.comm_world.size - 1:
85 path = f'{config.base_path}/data/{config.get_path()}-stats-whole-run.pickle'
86 with open(path, 'wb') as file:
87 pickle.dump(combined_stats, file)
88 print(f'Stored stats in {path}', flush=True)
90 return uend
93if __name__ == '__main__':
94 from pySDC.projects.RayleighBenard.RBC3D_configs import get_config
96 args = parse_args()
98 config = get_config(args)
100 if args['mode'] in ['run', 'benchmark']:
101 run_experiment(args, config)
102 else:
103 raise NotImplementedError