32 lines
1.6 KiB
Python
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()
|