Coverage for pySDC/projects/parallelSDC_reloaded/scripts/fig05_allenCahn.py: 100%
76 statements
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-15 06:23 +0000
« prev ^ index » next coverage.py v7.16.0, created at 2026-09-15 06:23 +0000
1#!/usr/bin/env python3
2# -*- coding: utf-8 -*-
3"""
4Created on Thu Jan 11 11:14:01 2024
6Figures with experiments on the Allen-Cahn problem
7"""
9import os
10import numpy as np
12from pySDC.projects.parallelSDC_reloaded.utils import solutionExact, getParamsSDC, solutionSDC, getParamsRK, plt
13from pySDC.helpers.testing import DataChecker
15data = DataChecker(__file__)
17PATH = '/' + os.path.join(*__file__.split('/')[:-1])
18SCRIPT = __file__.split('/')[-1].split('.')[0]
20symList = ['o', '^', 's', '>', '*', '<', 'p', '>'] * 10
22# SDC parameters
23nNodes = 4
24quadType = 'RADAU-RIGHT'
25nodeType = 'LEGENDRE'
26parEfficiency = 0.8 # 1/nNodes
27nSweeps = 4
29# Problem parameters
30pName = "ALLEN-CAHN"
31tEnd = 50
32pParams = {
33 "periodic": False,
34 "nvars": 2**11 - 1,
35 "epsilon": 0.04,
36}
38# -----------------------------------------------------------------------------
39# Trajectories (reference solution)
40# -----------------------------------------------------------------------------
41uExact = solutionExact(tEnd, 1, pName, **pParams)
42x = np.linspace(-0.5, 0.5, 2**11 + 1)[1:-1]
44figName = f"{SCRIPT}_solution"
45plt.figure(figName)
46plt.plot(x, uExact[0, :], '-', label="$u(0)$")
47plt.plot(x, uExact[-1, :], '--', label="$u(T)$")
49plt.legend()
50plt.xlabel("$x$")
51plt.ylabel("Solution")
52plt.gcf().set_size_inches(12, 3)
53plt.tight_layout()
54plt.savefig(f"{PATH}/{figName}.pdf")
56# -----------------------------------------------------------------------------
57# %% Convergence and error VS cost plots
58# -----------------------------------------------------------------------------
59nStepsList = np.array([1, 2, 5, 10, 20, 50, 100, 200, 500])
60dtVals = tEnd / nStepsList
63def getError(uNum, uRef):
64 if uNum is None:
65 return np.inf
66 return np.linalg.norm(uRef[-1, :] - uNum[-1, :], ord=2)
69def getCost(counters):
70 nNewton, nRHS, tComp = counters
71 return 2 * nNewton + nRHS
74minPrec = ["MIN-SR-NS", "MIN-SR-S", "MIN-SR-FLEX"]
76symList = ['^', '>', '<', 'o', 's', '*', 'p']
77config = [
78 (*minPrec, "VDHS", "ESDIRK43", "LU"),
79]
82# The reference solution depends only on nSteps, so compute it once per nSteps
83# instead of once per (qDelta, nSteps).
84uRefs = {nSteps: solutionExact(tEnd, nSteps, pName, **pParams) for nSteps in nStepsList}
86i = 0
87for qDeltaList in config:
88 figNameConv = f"{SCRIPT}_conv_{i}"
89 figNameCost = f"{SCRIPT}_cost_{i}"
90 i += 1
92 for qDelta, sym in zip(qDeltaList, symList, strict=False):
93 try:
94 params = getParamsRK(qDelta)
95 except KeyError:
96 params = getParamsSDC(
97 quadType=quadType, numNodes=nNodes, nodeType=nodeType, qDeltaI=qDelta, nSweeps=nSweeps
98 )
100 errors = []
101 costs = []
103 for nSteps in nStepsList:
104 uRef = uRefs[nSteps]
106 uSDC, counters, parallel = solutionSDC(tEnd, nSteps, params, pName, **pParams)
108 err = getError(uSDC, uRef)
109 errors.append(err)
111 cost = getCost(counters)
112 if parallel:
113 cost /= nNodes * parEfficiency
114 costs.append(cost)
116 ls = '-' if qDelta.startswith("MIN-SR-") else "--"
118 plt.figure(figNameConv)
119 plt.loglog(dtVals, errors, sym + ls, label=qDelta)
120 data.storeAndCheck(f"{figNameConv}_{qDelta}", errors, atol=1e-4, rtol=1e-4)
122 plt.figure(figNameCost)
123 plt.loglog(costs, errors, sym + ls, label=qDelta)
125 for figName in [figNameConv, figNameCost]:
126 plt.figure(figName)
127 plt.gca().set(
128 xlabel="Cost" if "cost" in figName else r"$\Delta {t}$",
129 ylabel=r"$L_2$ error at $T$",
130 )
131 plt.legend()
132 plt.grid(True)
133 plt.tight_layout()
134 plt.savefig(f"{PATH}/{figName}.pdf")
136data.writeToJSON()