Coverage for pySDC / projects / parallelSDC_reloaded / nilpotency.py: 100%
46 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-02-12 11:13 +0000
« prev ^ index » next coverage.py v7.13.4, created at 2026-02-12 11:13 +0000
1#!/usr/bin/env python3
2# -*- coding: utf-8 -*-
3"""
4Created on Fri Dec 22 17:17:14 2023
6Evaluate the nilpotency of diagonal preconditioners MIN-SR-S and MIN-SR-NS
7with increasing number of nodes.
8"""
10import numpy as np
11import matplotlib.pyplot as plt
13from pySDC.core.sweeper import Sweeper
15quadType = "LOBATTO"
16nodeType = "LEGENDRE"
19def nilpotencyS(d, Q):
20 if quadType in ['LOBATTO', 'RADAU-LEFT']:
21 d = d[1:]
22 Q = Q[1:, 1:]
23 M = d.size
24 D = np.diag(1 / d)
25 K = np.eye(M) - D @ Q
26 return np.linalg.norm(np.linalg.matrix_power(K, M), ord=np.inf)
29def nilpotencyNS(d, Q):
30 M = d.size
31 D = np.diag(d)
32 K = D - Q
33 return np.linalg.norm(np.linalg.matrix_power(K, M), ord=np.inf)
36nil_MIN_SR_S = []
37nil_MIN_SR_NS = []
38nNodes = range(2, 20)
39for m in nNodes:
40 s = Sweeper({"num_nodes": m, "quad_type": quadType, "node_type": nodeType}, None)
41 Q = s.coll.Qmat[1:, 1:]
42 nodes = s.coll.nodes
44 qDelta = s.get_Qdelta_implicit(qd_type="MIN-SR-S")
45 d = np.diag(qDelta)[1:]
46 nil_MIN_SR_S.append([nilpotencyS(d, Q), nilpotencyNS(d, Q)])
48 qDelta = s.get_Qdelta_implicit(qd_type="MIN-SR-NS")
49 d = np.diag(qDelta)[1:]
50 nil_MIN_SR_NS.append([nilpotencyS(d, Q), nilpotencyNS(d, Q)])
52nil_MIN_SR_NS = np.array(nil_MIN_SR_NS).T
53nil_MIN_SR_S = np.array(nil_MIN_SR_S).T
55fig = plt.figure("nilpotency")
56nNodes = np.array(nNodes, np.float128)
57plt.semilogy(nNodes, nil_MIN_SR_NS[0], 'o-', label="MIN-SR-NS (nill. stiff)")
58plt.semilogy(nNodes, nil_MIN_SR_NS[1], 'o--', label="MIN-SR-NS (nill. non-stiff)")
59plt.semilogy(nNodes, nil_MIN_SR_S[0], 's-', label="MIN-SR-S (nill. stiff)")
60plt.semilogy(nNodes, nil_MIN_SR_S[1], 's--', label="MIN-SR-S (nill. non-stiff)")
61plt.legend()
62plt.semilogy(nNodes, 14**nNodes * 1e-17, ':', c="gray")
63plt.grid(True)
64plt.xlabel("M")
65plt.ylabel("nilpotency")
66fig.set_size_inches(8.65, 5.33)
67plt.tight_layout()