79 lines
3.0 KiB
Python
79 lines
3.0 KiB
Python
|
|
"""Optional integration test: run with the recovered TOP Python environment.
|
||
|
|
|
||
|
|
Usage: python tests/serialize/top_reader.py build/tests/serialize/top_export_fixture
|
||
|
|
The compiled eq_poly_ester_gamma2 module must be available to top.load().
|
||
|
|
"""
|
||
|
|
import json
|
||
|
|
import os
|
||
|
|
from pathlib import Path
|
||
|
|
import subprocess
|
||
|
|
import sys
|
||
|
|
import tempfile
|
||
|
|
|
||
|
|
import numpy as np
|
||
|
|
import top
|
||
|
|
|
||
|
|
|
||
|
|
def read_model(directory):
|
||
|
|
dati = directory / 'dati'
|
||
|
|
dati.write_text('nt = 1\nlres = 40\niparity = 0\niCor = 1\n'
|
||
|
|
'dertype = CHEB\norderFD = 2\nmattype = FULL\n'
|
||
|
|
'nsol = 1\nshift = 0.6\nrootdir = ./\nm = 0\ntagdir = test\n')
|
||
|
|
os.chdir(directory)
|
||
|
|
solver = top.load('eq_poly_ester_gamma2')
|
||
|
|
solver.read_dati(str(dati))
|
||
|
|
model = solver.init_model(str(directory) + '/')
|
||
|
|
return solver, model
|
||
|
|
|
||
|
|
|
||
|
|
def verify(directory, deformed):
|
||
|
|
solver, model = read_model(directory)
|
||
|
|
radius, theta = solver.get_grid()
|
||
|
|
z = solver.get_zeta()[:, None]
|
||
|
|
mu = np.cos(theta)[None, :]
|
||
|
|
if deformed:
|
||
|
|
rs = 1.0 - 0.2 * mu**2
|
||
|
|
a = 0.5 * (5.0*z**3 - 3.0*z**5)
|
||
|
|
expected_radius = 0.8*z + a*(rs-0.8)
|
||
|
|
p2 = 0.5*(3.0*mu**2-1.0)
|
||
|
|
h = (1-z*z)*(1+0.1*z*z*p2)
|
||
|
|
hz = -2*z + 0.1*p2*(2*z-4*z**3)
|
||
|
|
hzz = -2 + 0.1*p2*(2-12*z*z)
|
||
|
|
else:
|
||
|
|
expected_radius = np.broadcast_to(z, radius.shape)
|
||
|
|
h = np.broadcast_to(np.sinc(z), radius.shape)
|
||
|
|
with np.errstate(divide='ignore', invalid='ignore'):
|
||
|
|
hz = np.pi*np.cos(np.pi*z)/(np.pi*z) - np.sin(np.pi*z)/(np.pi*z*z)
|
||
|
|
hzz = -np.pi*np.sin(np.pi*z)/z - 2*np.cos(np.pi*z)/(z*z) + 2*np.sin(np.pi*z)/(np.pi*z**3)
|
||
|
|
hz[0] = 0.0
|
||
|
|
hzz[0] = -np.pi**2/3
|
||
|
|
hz = np.broadcast_to(hz, radius.shape)
|
||
|
|
hzz = np.broadcast_to(hzz, radius.shape)
|
||
|
|
np.testing.assert_allclose(radius, expected_radius, rtol=0, atol=2e-12)
|
||
|
|
np.testing.assert_allclose(model['hh'], h, rtol=0, atol=3e-12)
|
||
|
|
np.testing.assert_allclose(model['hhz'], hz, rtol=0, atol=3e-9)
|
||
|
|
np.testing.assert_allclose(model['hhzz'], hzz, rtol=0, atol=2e-5)
|
||
|
|
np.testing.assert_allclose(model['lambda'], np.pi**2, rtol=3e-13)
|
||
|
|
np.testing.assert_allclose(model['omga'], 0.2/np.pi if deformed else 0.0, rtol=3e-13, atol=1e-15)
|
||
|
|
if not deformed:
|
||
|
|
result = solver.run_arncheb(0.6)
|
||
|
|
assert result.nsol == 1
|
||
|
|
np.testing.assert_allclose(result.valps[0], 0.6168010124, rtol=0, atol=2e-8)
|
||
|
|
return float(result.valps[0])
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == '__main__':
|
||
|
|
if len(sys.argv) != 2:
|
||
|
|
raise SystemExit(__doc__)
|
||
|
|
executable = Path(sys.argv[1]).resolve()
|
||
|
|
original_directory = Path.cwd()
|
||
|
|
try:
|
||
|
|
with tempfile.TemporaryDirectory(prefix='serif-top-reader-') as tmp:
|
||
|
|
directory = Path(tmp)
|
||
|
|
subprocess.run([str(executable), str(directory)], check=True)
|
||
|
|
frequency = verify(directory / 'spherical', False)
|
||
|
|
verify(directory / 'deformed', True)
|
||
|
|
print(json.dumps({'reader_checks': 'passed', 'radial_frequency_top_units': frequency}))
|
||
|
|
finally:
|
||
|
|
os.chdir(original_directory)
|