def test_io(self): prm1 = Parameters() prm1.write() prm2 = Parameters() prm2.read() for name in prm1.trait_names(): with self.subTest(name=name): self.assertEqual(getattr(prm1, name), getattr(prm2, name))
def test_validate_mesh(self): from xcompact3d_toolbox.parameters import possible_mesh, possible_mesh_p prm = Parameters() # To small grid for dim in "x y z".split(): with self.subTest(dim=dim): with self.assertRaises(traitlets.TraitError): setattr(prm, f"n{dim}", 8) # Invalid grid not periodic for dim in "x y z".split(): for i in range(possible_mesh[-1]): with self.subTest(dim=dim, i=i): if i not in possible_mesh: with self.assertRaises(traitlets.TraitError): setattr(prm, f"n{dim}", i) # Invalid grid Periodic for dim in "x y z".split(): setattr(prm, f"ncl{dim}1", 0) for i in range(possible_mesh_p[-1]): with self.subTest(dim=dim, i=i): if i not in possible_mesh_p: with self.assertRaises(traitlets.TraitError): setattr(prm, f"n{dim}", i)
def test_observe_resolution_and_BC(self): prm = Parameters() for dim in "x y z".split(): with self.subTest(dim=dim): # Default Values self.assertEqual(getattr(prm, f"n{dim}"), 17) self.assertEqual(getattr(prm, f"d{dim}"), 0.0625) self.assertEqual(getattr(prm, f"{dim}l{dim}"), 1.0) # New nx should change just dx setattr(prm, f"n{dim}", 201) self.assertEqual(getattr(prm, f"n{dim}"), 201) self.assertEqual(getattr(prm, f"d{dim}"), 0.005) self.assertEqual(getattr(prm, f"{dim}l{dim}"), 1.0) # New xlx should change just dx setattr(prm, f"{dim}l{dim}", 5.0) self.assertEqual(getattr(prm, f"n{dim}"), 201) self.assertEqual(getattr(prm, f"d{dim}"), 0.025) self.assertEqual(getattr(prm, f"{dim}l{dim}"), 5.0) # New dx should change just xlx setattr(prm, f"d{dim}", 0.005) self.assertEqual(getattr(prm, f"n{dim}"), 201) self.assertEqual(getattr(prm, f"d{dim}"), 0.005) self.assertEqual(getattr(prm, f"{dim}l{dim}"), 1.0) # One side to periodic setattr(prm, f"ncl{dim}1", 0) self.assertEqual(getattr(prm, f"ncl{dim}1"), 0) self.assertEqual(getattr(prm, f"ncl{dim}n"), 0) self.assertEqual(getattr(prm, f"_ncl{dim}"), True) self.assertEqual(getattr(prm, f"n{dim}"), 200) self.assertEqual(getattr(prm, f"d{dim}"), 0.005) self.assertEqual(getattr(prm, f"{dim}l{dim}"), 1.0) # End back setattr(prm, f"ncl{dim}1", 1) self.assertEqual(getattr(prm, f"ncl{dim}1"), 1) self.assertEqual(getattr(prm, f"ncl{dim}n"), 1) self.assertEqual(getattr(prm, f"_ncl{dim}"), False) self.assertEqual(getattr(prm, f"n{dim}"), 201) self.assertEqual(getattr(prm, f"d{dim}"), 0.005) self.assertEqual(getattr(prm, f"{dim}l{dim}"), 1.0) # Other side to periodic setattr(prm, f"ncl{dim}n", 0) self.assertEqual(getattr(prm, f"ncl{dim}1"), 0) self.assertEqual(getattr(prm, f"ncl{dim}n"), 0) self.assertEqual(getattr(prm, f"_ncl{dim}"), True) self.assertEqual(getattr(prm, f"n{dim}"), 200) self.assertEqual(getattr(prm, f"d{dim}"), 0.005) self.assertEqual(getattr(prm, f"{dim}l{dim}"), 1.0) # End back setattr(prm, f"ncl{dim}n", 2) self.assertEqual(getattr(prm, f"ncl{dim}1"), 2) self.assertEqual(getattr(prm, f"ncl{dim}n"), 2) self.assertEqual(getattr(prm, f"_ncl{dim}"), False) self.assertEqual(getattr(prm, f"n{dim}"), 201) self.assertEqual(getattr(prm, f"d{dim}"), 0.005) self.assertEqual(getattr(prm, f"{dim}l{dim}"), 1.0)
def test_mesh_stretching(self): """In order to test the stretched mesh, three values for istret: * ``istret = 1``; * ``istret = 2``; * ``istret = 3``; where combined with two values for beta: * ``beta = 0.75``; * ``beta = 1``; * ``beta = 4``. Xcompact3d wrote the coordinate y to the disc (all with ``ny=55``), the six files where saved as: * ``./test/unit/data/yp/yp_<istret>_<beta>_.dat``, so now we can compare and validate the python implementation. """ filenames = glob.glob( os.path.join("tests", "unit", "data", "yp", "*.dat")) prm = Parameters() for file in filenames: with self.subTest(file=file): yp = np.loadtxt(file) prm.istret = int(file.split("_")[1]) prm.beta = float(file.split("_")[2]) prm.ny = yp.size mesh = prm.get_mesh self.assertTrue(np.allclose(mesh["y"], yp))
def test_io(self): # prm1 = Parameters(nx=31, ny=9, nz=19, numscalar=3, ilast=1000, ioutput=200) prm2 = Parameters( nx=9, ny=19, nz=31, numscalar=5, ilast=1000, ioutput=200, filenamedigits=1, ifilenameformat="(I4.4)", ) # np.random.seed(seed=67) for i, (prm, fileformat) in enumerate(zip([prm1, prm2], [".bin", ""])): with self.subTest(parameters=i): # coords = prm.get_mesh coords["t"] = prm.dt * np.arange(0, prm.ilast, prm.ioutput) coords["n"] = range(prm.numscalar) # Init dataset ds_out = xr.Dataset( dict( ux=( ["x", "y", "z"], np.random.random((prm.nx, prm.ny, prm.nz)), dict(file_name="ux"), ), uy=( ["t", "x", "y", "z"], np.random.random( (coords["t"].size, prm.nx, prm.ny, prm.nz)), dict(file_name="uy"), ), uz=( ["t", "x", "y"], np.random.random( (coords["t"].size, prm.nx, prm.ny)), dict(file_name="uz"), ), phi=( ["n", "t", "x", "y", "z"], np.random.random(( prm.numscalar, coords["t"].size, prm.nx, prm.ny, prm.nz, )), dict(file_name="phi"), ), ), coords=coords, ) i1, i2 = prm.ifilenameformat[2:-1].split(".") # Writes ds_out.x3d.write(prm, fileformat=fileformat) # Reads ds_in = prm.read_field(f"ux{fileformat}", name="ux").to_dataset() ds_in["uy"] = prm.read_all_fields( f"uy-{'?'*int(i1)}{fileformat}") coords = prm.get_mesh del coords["z"] ds_in["uz"] = prm.read_all_fields( f"uz-{'?'*int(i1)}{fileformat}", coords=coords) ds_in["phi"] = xr.concat( [ prm.read_all_fields( f"phi{n+1}-{'?'*int(i1)}{fileformat}") for n in range(prm.numscalar) ], "n", ).assign_coords(n=("n", range(prm.numscalar))) # Compares for var in ds_out.keys(): with self.subTest(variable=var): self.assertTrue(np.allclose(ds_out[var], ds_in[var]))
def test_derivative(self): prm = Parameters(ny=129, yly=2.0 * np.pi, nclx1=1, nclxn=1, nclz1=1, nclzn=1) for istret in [0, 1, 2, 3]: for beta in [0.75, 1.0, 4.0]: # for BC in "00 11 22".split(): for BC in "00 11 12 21 22".split(): if istret == 3 and BC == "00": continue with self.subTest(istret=istret, beta=beta, BC=BC): tol = 1e-1 prm.istret = istret prm.beta = beta prm.ncly1 = int(BC[0]) prm.nclyn = int(BC[1]) ds = init_dataset(prm).isel(x=0, z=0) # Cos - Symmetric ds["ux"] += np.cos(ds.y) self.assertTrue( np.allclose( ds.ux.x3d.first_derivative("y").values, -np.sin(ds.y.values), atol=tol, rtol=tol, )) self.assertTrue( np.allclose( ds.ux.x3d.second_derivative("y").values, -np.cos(ds.y.values), atol=tol, rtol=tol, )) # Sin - Antisymmetric ds["uy"] += np.sin(ds.y) self.assertTrue( np.allclose( ds.uy.x3d.first_derivative("y").values, np.cos(ds.y.values), atol=tol, rtol=tol, )) self.assertTrue( np.allclose( ds.uy.x3d.second_derivative("y").values, -np.sin(ds.y.values), atol=tol, rtol=tol, ))