Coverage for pySDC/projects/GPU/ac_fft.py: 100%

48 statements  

« prev     ^ index     » next       coverage.py v7.16.1, created at 2026-09-25 20:28 +0000

1from pySDC.implementations.problem_classes.AllenCahn_2D_FFT import allencahn2d_imex 

2from pySDC.core.collocation import CollBase as Collocation 

3from pySDC.implementations.sweeper_classes.imex_1st_order import imex_1st_order 

4from pySDC.implementations.controller_classes.controller_nonMPI import controller_nonMPI 

5from pySDC.helpers.stats_helper import filter_stats, sort_stats 

6 

7 

8def set_parameter(): 

9 # initialize problem parameters 

10 problem_params = dict() 

11 problem_params['eps'] = 0.04 

12 problem_params['radius'] = 0.25 

13 problem_params['nvars'] = (512, 512) 

14 

15 # initialize level parameters 

16 level_params = dict() 

17 level_params['restol'] = 1e-07 

18 level_params['dt'] = 1e-07 

19 level_params['nsweeps'] = 1 

20 

21 # initialize sweeper parameters 

22 sweeper_params = dict() 

23 sweeper_params['collocation_class'] = Collocation 

24 sweeper_params['node_type'] = 'LEGENDRE' 

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

26 sweeper_params['QI'] = ['LU'] 

27 sweeper_params['QE'] = ['PIC'] 

28 sweeper_params['num_nodes'] = 3 

29 sweeper_params['initial_guess'] = 'spread' 

30 

31 # initialize step parameters 

32 step_params = dict() 

33 step_params['maxiter'] = 50 

34 

35 # setup parameters "in time" 

36 t0 = 0 

37 schritte = 8 

38 Tend = schritte * level_params['dt'] 

39 

40 # initialize controller parameters 

41 controller_params = dict() 

42 controller_params['logger_level'] = 30 

43 

44 # fill description dictionary for easy step instantiation 

45 description = dict() 

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

47 description['sweeper_class'] = imex_1st_order # pass sweeper 

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

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

50 description['step_params'] = step_params # pass step parameters 

51 

52 return controller_params, description, t0, Tend 

53 

54 

55def main(): 

56 controller_params, description, t0, Tend = set_parameter() 

57 

58 # fill description dictionary with CPU problem 

59 description['problem_class'] = allencahn2d_imex 

60 

61 # instantiate controller cpu 

62 controller = controller_nonMPI(num_procs=1, controller_params=controller_params, description=description) 

63 

64 # get initial values on finest level cpu 

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

66 uinit = P.u_exact(t0) 

67 

68 # call main function to get things done on cpu... 

69 uend_cpu, stats_cpu = controller.run(u0=uinit, t0=t0, Tend=Tend) 

70 timing_cpu = sort_stats(filter_stats(stats_cpu, type='timing_run'), sortby='time') 

71 print('Runtime CPU:', timing_cpu[0][1]) 

72 

73 # same problem again, this time on the GPU 

74 description['problem_params'] = dict(description['problem_params'], useGPU=True) 

75 

76 # instantiate controller cpu 

77 controller = controller_nonMPI(num_procs=1, controller_params=controller_params, description=description) 

78 

79 # get initial values on finest level cpu 

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

81 uinit = P.u_exact(t0) 

82 

83 # call main function to get things done on cpu... 

84 uend_gpu, stats_gpu = controller.run(u0=uinit, t0=t0, Tend=Tend) 

85 timing_gpu = sort_stats(filter_stats(stats_gpu, type='timing_run'), sortby='time') 

86 print('Runtime GPU:', timing_gpu[0][1]) 

87 

88 assert abs(uend_gpu.get() - uend_cpu) < 1e-13, abs(uend_gpu.get() - uend_cpu) 

89 

90 

91if __name__ == '__main__': 

92 main()