Files
CelerisLab/tests/validation/experimental_full9/check_linear_strip.py
T

32 lines
1.6 KiB
Python

"""Bounded fixed-parameter linear comparison; no nonlinear flow or GPU run."""
import json
from pathlib import Path
import numpy as np
from scipy.linalg import eigvals
cx=np.array([0,1,-1,0,0,1,-1,1,-1]);cy=np.array([0,0,0,1,-1,1,-1,-1,1]);w=np.array([4/9]+[1/9]*4+[1/36]*4)
U=.0028664576821029186;omega=1/.524;cu=cx*U
base=w*(1+3*cu+4.5*cu**2-1.5*U**2)
E=w[:,None]*((1+3*cu+4.5*cu**2-1.5*U*U)[:,None]+(3*cx+9*cu*cx-3*U)[:,None]*(cx-U)[None,:]+(3*cy+9*cu*cy)[:,None]*cy[None,:])
C=(1-omega)*np.eye(9)+omega*E
r=np.array([1,0,2,1,1,0,2,0,2])/(1-U);I=np.eye(9)
B=I.copy();B[1]=I[2]+2/3*U*r;B[5]=I[6]+.5*(I[4]-I[3])+U/6*r;B[7]=I[8]+.5*(I[3]-I[4])+U/6*r
T=np.array([[0,0,2,0,0,0,2,0,2],[0,0,0,1,1,0,2,0,2],[0,0,0,0,0,0,2,0,-2]])
R=w[:,None]*np.array([4.5*(cx*cx-1/3),4.5*(cy*cy-1/3),9*cx*cy]).T
Bfull=base[:,None]*r+R@T@(I-base[:,None]*r)
assert np.max(abs(Bfull[:,[1,5,7]]))<1e-15
assert np.max(abs(np.array([np.ones(9),cx,cy])@Bfull-np.array([r,U*r,np.zeros(9)])))<1e-14
def radius(n,k,b):
A=np.zeros((9*n,9*n),complex)
for x in range(n):
local=C@b if x==0 else C
for q in range(9):
donor=x-int(cx[q])
if 0<=donor<n:A[9*x:9*x+9,9*donor+q]+=local[:,q]*np.exp(-1j*k*cy[q])
return float(np.max(abs(eigvals(A,check_finite=False))))
def main():
rows=[dict(k_over_pi=k/np.pi,zou_he=radius(32,k,B),experimental_full9=radius(32,k,Bfull)) for k in [0,np.pi/4,np.pi/2,3*np.pi/4,np.pi]]
print(json.dumps(dict(scope='Width32, zero incoming far perturbation, five original fixed k samples; negative samples do not prove stability',U=U,tau=.524,rows=rows),indent=2,allow_nan=False))
if __name__=='__main__':main()