Coverage for pySDC/projects/parallelSDC/nonlinear_playground.py: 100%
106 statements
« prev ^ index » next coverage.py v7.6.9, created at 2024-12-20 14:51 +0000
« prev ^ index » next coverage.py v7.6.9, created at 2024-12-20 14:51 +0000
1import os
2import pickle
4import numpy as np
6import pySDC.helpers.plot_helper as plt_helper
7from pySDC.helpers.stats_helper import get_sorted
9from pySDC.implementations.controller_classes.controller_nonMPI import controller_nonMPI
10from pySDC.implementations.sweeper_classes.generic_implicit import generic_implicit
11from pySDC.projects.parallelSDC.GeneralizedFisher_1D_FD_implicit_Jac import generalized_fisher_jac
12from pySDC.projects.parallelSDC.linearized_implicit_fixed_parallel import linearized_implicit_fixed_parallel
13from pySDC.projects.parallelSDC.linearized_implicit_fixed_parallel_prec import linearized_implicit_fixed_parallel_prec
14from pySDC.projects.parallelSDC.linearized_implicit_parallel import linearized_implicit_parallel
17def main():
18 # initialize level parameters
19 level_params = dict()
20 level_params['restol'] = 1e-10
21 level_params['dt'] = 0.01
23 # This comes as read-in for the step class (this is optional!)
24 step_params = dict()
25 step_params['maxiter'] = 50
27 # This comes as read-in for the problem class
28 problem_params = dict()
29 problem_params['nu'] = 1
30 problem_params['nvars'] = 255
31 problem_params['lambda0'] = 5.0
32 problem_params['newton_maxiter'] = 50
33 problem_params['newton_tol'] = 1e-12
34 problem_params['interval'] = (-5, 5)
36 # This comes as read-in for the sweeper class
37 sweeper_params = dict()
38 sweeper_params['quad_type'] = 'RADAU-RIGHT'
39 sweeper_params['num_nodes'] = 5
40 sweeper_params['QI'] = 'LU'
41 sweeper_params['fixed_time_in_jacobian'] = 0
43 # initialize controller parameters
44 controller_params = dict()
45 controller_params['logger_level'] = 30
47 # Fill description dictionary for easy hierarchy creation
48 description = dict()
49 description['problem_class'] = generalized_fisher_jac
50 description['problem_params'] = problem_params
51 description['sweeper_params'] = sweeper_params
52 description['level_params'] = level_params
53 description['step_params'] = step_params
55 sweeper_list = [
56 generic_implicit,
57 linearized_implicit_fixed_parallel_prec,
58 linearized_implicit_fixed_parallel,
59 linearized_implicit_parallel,
60 ]
62 f = open('data/parallelSDC_nonlinear_out.txt', 'w')
63 uinit = None
64 uex = None
65 uend = None
66 P = None
68 # loop over the different sweepers and check results
69 for sweeper in sweeper_list:
70 description['sweeper_class'] = sweeper
72 # instantiate the controller
73 controller = controller_nonMPI(num_procs=1, controller_params=controller_params, description=description)
75 # setup parameters "in time"
76 t0 = 0
77 Tend = 0.1
79 # get initial values on finest level
80 P = controller.MS[0].levels[0].prob
81 uinit = P.u_exact(t0)
83 # call main function to get things done...
84 uend, stats = controller.run(u0=uinit, t0=t0, Tend=Tend)
86 # compute exact solution and compare
87 uex = P.u_exact(Tend)
88 err = abs(uex - uend)
90 print('error at time %s: %s' % (Tend, err))
92 # filter statistics by type (number of iterations)
93 iter_counts = get_sorted(stats, type='niter', sortby='time')
95 # compute and print statistics
96 niters = np.array([item[1] for item in iter_counts])
97 out = ' Mean number of iterations: %4.2f' % np.mean(niters)
98 f.write(out + '\n')
99 print(out)
100 out = ' Range of values for number of iterations: %2i ' % np.ptp(niters)
101 f.write(out + '\n')
102 print(out)
103 out = ' Position of max/min number of iterations: %2i -- %2i' % (
104 int(np.argmax(niters)),
105 int(np.argmin(niters)),
106 )
107 f.write(out + '\n')
108 print(out)
109 out = ' Std and var for number of iterations: %4.2f -- %4.2f' % (float(np.std(niters)), float(np.var(niters)))
110 f.write(out + '\n')
111 f.write(out + '\n')
112 print(out)
114 f.write('\n')
115 print()
117 assert err < 3.686e-05, 'ERROR: error is too high for sweeper %s, got %s' % (sweeper.__name__, err)
118 assert (
119 np.mean(niters) == 7.5 or np.mean(niters) == 4.0
120 ), 'ERROR: mean number of iterations not as expected, got %s' % np.mean(niters)
122 f.close()
124 results = dict()
125 results['interval'] = problem_params['interval']
126 results['xvalues'] = np.array([(i + 1 - (P.nvars + 1) / 2) * P.dx for i in range(P.nvars)])
127 results['uinit'] = uinit
128 results['uend'] = uend
129 results['uex'] = uex
131 # write out for later visualization
132 file = open('data/parallelSDC_results_graphs.pkl', 'wb')
133 pickle.dump(results, file)
135 assert os.path.isfile('data/parallelSDC_results_graphs.pkl'), 'ERROR: pickle did not create file'
138def plot_graphs():
139 """
140 Helper function to plot graphs of initial and final values
141 """
143 file = open('data/parallelSDC_results_graphs.pkl', 'rb')
144 results = pickle.load(file)
146 interval = results['interval']
147 xvalues = results['xvalues']
148 uinit = results['uinit']
149 uend = results['uend']
150 uex = results['uex']
152 plt_helper.setup_mpl()
154 # set up figure
155 plt_helper.newfig(textwidth=338.0, scale=1.0)
157 plt_helper.plt.xlabel('x')
158 plt_helper.plt.ylabel('f(x)')
159 plt_helper.plt.xlim((interval[0] - 0.01, interval[1] + 0.01))
160 plt_helper.plt.ylim((-0.1, 1.1))
161 plt_helper.plt.grid()
163 # plot
164 plt_helper.plt.plot(xvalues, uinit, 'r--', lw=1, label='initial')
165 plt_helper.plt.plot(xvalues, uend, 'bs', lw=1, markeredgecolor='k', label='computed')
166 plt_helper.plt.plot(xvalues, uex, 'g-', lw=1, label='exact')
168 plt_helper.plt.legend(loc=2, ncol=1)
170 # save plot as PDF, beautify
171 fname = 'data/parallelSDC_fisher'
172 plt_helper.savefig(fname)
174 assert os.path.isfile(fname + '.pdf'), 'ERROR: plotting did not create PDF file'
175 # assert os.path.isfile(fname + '.pgf'), 'ERROR: plotting did not create PGF file'
176 assert os.path.isfile(fname + '.png'), 'ERROR: plotting did not create PNG file'
179if __name__ == "__main__":
180 # main()
181 plot_graphs()