Coverage for pySDC / projects / parallelSDC_reloaded / vanderpol_accuracy.py: 100%
61 statements
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-23 17:16 +0000
« prev ^ index » next coverage.py v7.13.5, created at 2026-03-23 17:16 +0000
1#!/usr/bin/env python3
2# -*- coding: utf-8 -*-
3"""
4Created on Sun Nov 12 22:14:03 2023
6Script to investigate diagonal SDC on Van der Pol with different mu parameters,
7in particular with graphs such as :
9- error VS time-step
10- error VS computation cost
12Note : implementation in progress ...
13"""
15import numpy as np
16import matplotlib.pyplot as plt
18from pySDC.projects.parallelSDC_reloaded.utils import getParamsSDC, getParamsRK, solutionSDC, solutionExact
20muVals = [0.1, 2, 10]
21tEndVals = [6.3, 7.6, 18.9] # tEnd = 1 period for each mu
24def getError(uNum, uRef):
25 if uNum is None:
26 return np.inf
27 return np.linalg.norm(uRef[:, 0] - uNum[:, 0], np.inf)
30def getCost(counters):
31 nNewton, nRHS, tComp = counters
32 return nNewton + nRHS
35# Base variable parameters
36nNodes = 4
37quadType = 'RADAU-RIGHT'
38nodeType = 'LEGENDRE'
39parEfficiency = 1 / nNodes
41qDeltaList = [
42 'RK4',
43 'ESDIRK43',
44 'LU',
45 # 'IE', 'LU', 'IEpar', 'PIC',
46 'MIN-SR-NS',
47 'MIN-SR-S',
48 'MIN-SR-FLEX',
49]
50nStepsList = np.array([2, 5, 10, 20, 50, 100, 200])
51nSweepList = [1, 2, 3, 4, 5, 6]
54symList = ['o', '^', 's', '>', '*', '<', 'p', '>'] * 10
56# qDeltaList = ['LU']
57nSweepList = [4]
59fig, axs = plt.subplots(2, len(muVals))
61for j, (mu, tEnd) in enumerate(zip(muVals, tEndVals, strict=True)):
62 print("-" * 80)
63 print(f"mu={mu}")
64 print("-" * 80)
66 dtVals = tEnd / nStepsList
68 i = 0
69 for qDelta in qDeltaList:
70 for nSweeps in nSweepList:
71 sym = symList[i]
72 i += 1
74 name = f"{qDelta}({nSweeps})"
75 try:
76 params = getParamsRK(qDelta)
77 name = name[:-3]
78 except KeyError:
79 params = getParamsSDC(
80 quadType=quadType, numNodes=nNodes, nodeType=nodeType, qDeltaI=qDelta, nSweeps=nSweeps
81 )
82 print(f'computing for {name} ...')
84 errors = []
85 costs = []
87 for nSteps in nStepsList:
88 print(f' -- nSteps={nSteps} ...')
90 uRef = solutionExact(tEnd, nSteps, "VANDERPOL", mu=mu)
92 uSDC, counters, parallel = solutionSDC(tEnd, nSteps, params, "VANDERPOL", mu=mu)
94 err = getError(uSDC, uRef)
95 errors.append(err)
97 cost = getCost(counters)
98 if parallel:
99 cost /= nNodes * parEfficiency
100 costs.append(cost)
102 # error VS dt
103 axs[0, j].loglog(dtVals, errors, sym + '-', label=name)
104 # error VS cost
105 axs[1, j].loglog(costs, errors, sym + '-', label=name)
107 for i in range(2):
108 if i == 0:
109 axs[i, j].set_title(f"mu={mu}")
110 axs[i, j].set(
111 xlabel=r"$\Delta{t}$" if i == 0 else "cost",
112 ylabel=r"$L_\infty$ error",
113 ylim=(1e-11, 10),
114 )
115 axs[i, j].legend(loc="lower right" if i == 0 else "lower left")
116 axs[i, j].grid()
118fig.set_size_inches(18.2, 10.4)
119fig.tight_layout()