diff --git a/examples/cpu_plane_jet/cpu_planejet.py b/examples/cpu_plane_jet/cpu_planejet.py new file mode 100644 index 0000000000000000000000000000000000000000..4ba17a6a7034f75e3dbc53642b093aa11dd87daf --- /dev/null +++ b/examples/cpu_plane_jet/cpu_planejet.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python + +import hysop + +from hysop.methods_keys import TimeIntegrator, Interpolation, Remesh,\ + Support, Splitting, MultiScale, MultiScale, SpaceDiscretisation, \ + GhostUpdate, Scales, dtCrit, ExtraArgs + +from hysop.problem.simulation import Simulation +from hysop.fields.variable_parameter import VariableParameter + +from hysop.numerics.odesolvers import RK2 as RK2 +from hysop.numerics.odesolvers import RK3 as RK3 +from hysop.numerics.odesolvers import RK4 as RK4 + +from hysop.numerics.finite_differences import FD_C_4 +from hysop.numerics.remeshing import L6_4 as remesh_formula +from hysop.numerics.remeshing import Linear + +from hysop.operator.advection import Advection +from hysop.operator.diffusion import Diffusion +from hysop.operator.stretching import Stretching +from hysop.operator.poisson import Poisson +from hysop.operator.adapt_timestep import AdaptTimeStep + +from hysop.operator.redistribute_inter import RedistributeInter +from hysop.operator.redistribute_intra import RedistributeIntra + +from hysop.gpu.gpu_transfer import DataTransfer +from hysop.operator.hdf_io import HDF_Writer + +import utilities as utils + + +## Simulation parameters +dim = 3 +N = 1<<8 + 1 +nb_elems = [N]*dim + +## Physical parameters: +# Flow viscosity +viscosity = 1e-4 + +## I/O parameters +dt_output = IOParams(frequency=out_freq, filename='cpu_dt.dat', fileformat=ASCII) +velo_output = IOParams(frequency=out_freq, filename='cpu_velo.dat', fileformat=HDF5) +vorti_output = IOParams(frequency=out_freq, filename='cpu_vorti.dat', fileformat=HDF5) + + +# Domain +box = hysop.Box(length=[1.0]*dim, + origin=[0.0]*dim, + bc=PERIODIC) + +# Fields +velo = hysop.Field(domain=box, formula=utils.initialize_velocity, + name='Velocity', is_vector=True) +vorti = hysop.Field(domain=box, + name='Vorticity', is_vector=True) + +# Discretizations +d_uw = Discretization(nb_elems) + +# Topologies +topo_uw = box.create_topology(d_uw, dim=1) + +# Adaptative timestep simulation +dt = VariableParameter({'dt': 0.001}) +simu = Simulation(start=0.0, end=5.0, time_step=0.001, max_iter=10000) + + +## Operators +ops = {} + +# CPU operators +ops['advec_w'] = Advection(velo, + discretization=topo_uw, + variables={vorti: topo_uw}, + method={Scales: 'p_64', MultiScale: 'L4_4'}) +ops['stretching'] = Stretching(velo, vorti, discretization=d_uw) +ops['diffusion'] = Diffusion(variables={vorti: d_uw}, viscosity=viscosity) +ops['poisson'] = Poisson(velo, vorti, discretization=d_uw) + + +# other operators +ops['dt_adapt'] = AdaptTimeStep(velo, vorti, + simulation=simu, + time_range=[0, np.infty], + discretization=d_uw, + method={TimeIntegrator: RK3, + SpaceDiscretisation: FD_C_4, + dtCrit: ['gradU', 'cfl']}, + lcfl=0.15, + cfl=1.5, + io_params=dt_output) + +ops['velo_io'] = HDF_Writer(variables={velo : topo_uw}, io_params=velo_output) +ops['vorti_io'] = HDF_Writer(variables={vorti: topo_uw}, io_params=vorti_output) + +for op in ops: + op.discretize() + + diff --git a/examples/cpu_plane_jet/create_random_arrays.py b/examples/cpu_plane_jet/create_random_arrays.py new file mode 100644 index 0000000000000000000000000000000000000000..de7322631e99cba53ce5e92b837ad3074bf21349 --- /dev/null +++ b/examples/cpu_plane_jet/create_random_arrays.py @@ -0,0 +1,39 @@ +import os +import numpy as np +from hysop.constants import HYSOP_REAL, ORDER + + +def random_init(shape, mpi_comm): + # Create a folder to store all random arrays + d = 'rand_init' + if mpi_comm.Get_rank() == 0: + if not os.path.exists(d): + os.makedirs(d) + mpi_comm.Barrier() + file_name = "{0}_{1}_{2}".format(*shape) + file_name += "_{0}p_{1}.dat".format(mpi_comm.Get_size(), + mpi_comm.Get_rank()) + try: + randX = np.asarray( + np.reshape(np.fromfile(os.path.join(d, 'randX_' + file_name)), + shape), + dtype=HYSOP_REAL, order=ORDER) + randY = np.asarray( + np.reshape(np.fromfile(os.path.join(d, 'randY_' + file_name)), + shape), + dtype=HYSOP_REAL, order=ORDER) + randZ = np.asarray( + np.reshape(np.fromfile(os.path.join(d, 'randZ_' + file_name)), + shape), + dtype=HYSOP_REAL, order=ORDER) + except IOError: + randX = np.asarray(np.random.random(shape), + dtype=HYSOP_REAL, order=ORDER) - 0.5 + randY = np.asarray(np.random.random(shape), + dtype=HYSOP_REAL, order=ORDER) - 0.5 + randZ = np.asarray(np.random.random(shape), + dtype=HYSOP_REAL, order=ORDER) - 0.5 + randX.tofile(os.path.join(d, 'randX_' + file_name)) + randY.tofile(os.path.join(d, 'randY_' + file_name)) + randZ.tofile(os.path.join(d, 'randZ_' + file_name)) + return randX, randY, randZ diff --git a/examples/cpu_plane_jet/utilities.py b/examples/cpu_plane_jet/utilities.py new file mode 100644 index 0000000000000000000000000000000000000000..f09774fe55ee70b011436fc66e40577a4b1e474c --- /dev/null +++ b/examples/cpu_plane_jet/utilities.py @@ -0,0 +1,27 @@ + +import numpy as np + +width = 0.01 +ampl1 = 0.05 +ampl3 = 0.3 + + +def initialize_velocity(res, x, y, z, t, rand_init=False): + yy = np.abs(y - 0.5) + aux = (0.1 - 2.0 * yy) / (4.0 * width) + strg = np.exp(np.abs(aux**2)) + if rand_init: + from create_random_arrays import random_init + randX, randY, randZ = random_init(res[0].shape, box.comm_task) + strg1 = strg * randX + strg2 = strg * randY + strg3 = strg * randZ + res[0][...] = 0.5 * (1.0 + np.tanh(aux)) * (1.0 + ampl3 * np.sin(8.0 * np.pi * x)) * (1.0 + ampl1 * strg1) + res[1][...] = ampl1 * strg2 + res[2][...] = ampl1 * strg3 + else: + res[0][...] = 0.5 * (1.0 + np.tanh(aux)) * (1.0 + ampl3 * np.sin(8.0 * np.pi * x)) + res[1][...] = 0.0 + res[2][...] = 0.0 + return res +