Coverage for pySDC/projects/Resilience/heat.py: 26%

35 statements  

« prev     ^ index     » next       coverage.py v7.6.9, created at 2024-12-20 14:51 +0000

1# script to run a simple heat problem 

2 

3from pySDC.implementations.problem_classes.HeatEquation_ND_FD import heatNd_unforced 

4from pySDC.implementations.sweeper_classes.generic_implicit import generic_implicit 

5from pySDC.implementations.controller_classes.controller_nonMPI import controller_nonMPI 

6from pySDC.core.hooks import Hooks 

7from pySDC.helpers.stats_helper import get_sorted 

8from pySDC.projects.Resilience.hook import hook_collection, LogData 

9import numpy as np 

10from pySDC.projects.Resilience.strategies import merge_descriptions 

11 

12 

13def run_heat( 

14 custom_description=None, 

15 num_procs=1, 

16 Tend=2e-1, 

17 hook_class=LogData, 

18 fault_stuff=None, 

19 custom_controller_params=None, 

20): 

21 """ 

22 Run a heat problem with default parameters. 

23 

24 Args: 

25 custom_description (dict): Overwrite presets 

26 num_procs (int): Number of steps for MSSDC 

27 Tend (float): Time to integrate to 

28 hook_class (pySDC.Hook): A hook to store data 

29 fault_stuff (dict): A dictionary with information on how to add faults 

30 custom_controller_params (dict): Overwrite presets 

31 

32 Returns: 

33 dict: The stats object 

34 controller: The controller 

35 Tend: The time that was supposed to be integrated to 

36 """ 

37 

38 # initialize level parameters 

39 level_params = dict() 

40 level_params['dt'] = 0.05 

41 

42 # initialize sweeper parameters 

43 sweeper_params = dict() 

44 sweeper_params['quad_type'] = 'RADAU-RIGHT' 

45 sweeper_params['num_nodes'] = 3 

46 sweeper_params['QI'] = 'IE' 

47 

48 problem_params = { 

49 'freq': 2, 

50 'nvars': 2**9, 

51 'nu': 1.0, 

52 'stencil_type': 'center', 

53 'order': 6, 

54 'bc': 'periodic', 

55 'solver_type': 'direct', 

56 'lintol': None, 

57 'liniter': None, 

58 } 

59 

60 # initialize step parameters 

61 step_params = dict() 

62 step_params['maxiter'] = 5 

63 

64 # initialize controller parameters 

65 controller_params = dict() 

66 controller_params['logger_level'] = 30 

67 controller_params['hook_class'] = hook_collection + (hook_class if type(hook_class) == list else [hook_class]) 

68 controller_params['mssdc_jac'] = False 

69 

70 if custom_controller_params is not None: 

71 controller_params = {**controller_params, **custom_controller_params} 

72 

73 # fill description dictionary for easy step instantiation 

74 description = dict() 

75 description['problem_class'] = heatNd_unforced # pass problem class 

76 description['problem_params'] = problem_params # pass problem parameters 

77 description['sweeper_class'] = generic_implicit # pass sweeper 

78 description['sweeper_params'] = sweeper_params # pass sweeper parameters 

79 description['level_params'] = level_params # pass level parameters 

80 description['step_params'] = step_params 

81 

82 if custom_description is not None: 

83 description = merge_descriptions(description, custom_description) 

84 

85 # set time parameters 

86 t0 = 0.0 

87 

88 # instantiate controller 

89 controller = controller_nonMPI(num_procs=num_procs, controller_params=controller_params, description=description) 

90 

91 # insert faults 

92 if fault_stuff is not None: 

93 raise NotImplementedError("The parameters have not been adapted to this equation yet!") 

94 

95 # get initial values on finest level 

96 P = controller.MS[0].levels[0].prob 

97 uinit = P.u_exact(t0) 

98 

99 # call main function to get things done... 

100 uend, stats = controller.run(u0=uinit, t0=t0, Tend=Tend) 

101 return stats, controller, Tend 

102 

103 

104if __name__ == '__main__': 

105 run_heat()