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)
示例#4
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))
示例#5
0
 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]))
示例#6
0
    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,
                            ))