diff --git a/examples/scalar_diffusion/scalar_diffusion.py b/examples/scalar_diffusion/scalar_diffusion.py index 9ed569c4638a3a9221c11cd7e1b2516079823d15..e1db7dabc16712c598cf87c4fa9c36d8c34a110a 100755 --- a/examples/scalar_diffusion/scalar_diffusion.py +++ b/examples/scalar_diffusion/scalar_diffusion.py @@ -15,15 +15,16 @@ def compute(args): from hysop.constants import Implementation, ComputeGranularity from hysop.operator.directional.diffusion_dir import DirectionalDiffusion + from hysop.operator.diffusion import Diffusion from hysop.methods import StrangOrder, TimeIntegrator, SpaceDiscretization from hysop.numerics.splitting.strang import StrangSplitting - + # Define domain dim = args.ndim npts = args.npts box = Box(origin=args.box_origin, length=args.box_length, dim=dim) - + # Get default MPI Parameters from domain (even for serial jobs) mpi_params = MPIParams(comm=box.task_comm, task_id=box.current_task()) @@ -32,75 +33,84 @@ def compute(args): dt = ScalarParameter('dt', dtype=args.dtype) nu = ScalarParameter('nu', initial_value=args.nu, const=True, dtype=args.dtype) scalar = Field(domain=box, name='S0', nb_components=1, dtype=args.dtype) - + # Diffusion operator discretization parameters - method = { + method = { ComputeGranularity: args.compute_granularity, SpaceDiscretization: args.fd_order, TimeIntegrator: args.time_integrator, } - + # Setup implementation specific variables impl = args.impl extra_op_kwds = { 'mpi_params': mpi_params } - if (impl is Implementation.PYTHON): - pass + + # Create the problem we want to solve and insert our + # directional splitting subgraph. + # Add a writer of input field at given frequency. + problem = Problem(method=method) + + if (impl is Implementation.FORTRAN): + # Build the directional diffusion operator + diffusion = Diffusion(implementation=impl, + name='diffusion', dt=dt, + Fin=scalar, nu=nu, + variables = {scalar: npts}, + **extra_op_kwds) + problem.insert(diffusion) elif (impl is Implementation.OPENCL): # For the OpenCL implementation we need to setup the compute device # and configure how the code is generated and compiled at runtime. - + # Create an explicit OpenCL context from user parameters from hysop.backend.device.opencl.opencl_tools import get_or_create_opencl_env - cl_env = get_or_create_opencl_env(mpi_params=mpi_params, platform_id=args.cl_platform_id, + cl_env = get_or_create_opencl_env(mpi_params=mpi_params, platform_id=args.cl_platform_id, device_id=args.cl_device_id) - + # Configure OpenCL kernel generation and tuning (already done by HysopArgParser) from hysop.methods import OpenClKernelConfig method[OpenClKernelConfig] = args.opencl_kernel_config - + # Setup opencl specific extra operator keyword arguments extra_op_kwds['cl_env'] = cl_env + + # Build the directional diffusion operator + diffusion = DirectionalDiffusion(implementation=impl, + name='diffusion', dt=dt, + fields=scalar, coeffs=nu, + variables = {scalar: npts}, + **extra_op_kwds) + + # Build the directional splitting operator graph + splitting = StrangSplitting(splitting_dim=dim, order=args.strang_order) + splitting.push_operators(diffusion) + + problem.insert(splitting) else: msg='Unknown implementation \'{}\'.'.format(impl) raise ValueError(msg) - - # Build the directional diffusion operator - diffusion = DirectionalDiffusion(implementation=impl, - name='diffusion', dt=dt, - fields=scalar, coeffs=nu, - variables = {scalar: npts}, - **extra_op_kwds) - - # Build the directional splitting operator graph - splitting = StrangSplitting(splitting_dim=dim, order=args.strang_order) - splitting.push_operators(diffusion) - - # Create the problem we want to solve and insert our - # directional splitting subgraph. - # Add a writer of input field at given frequency. - problem = Problem(method=method) - problem.insert(splitting) + problem.dump_inputs(fields=scalar, filename='S0', frequency=args.dump_freq, **extra_op_kwds) problem.build(args) - + # If a visu_rank was provided, and show_graph was set, # display the graph on the given process rank. if args.display_graph: problem.display(args.visu_rank) - + # Initialize discrete scalar field problem.initialize_field(scalar, formula=init_scalar) - - # Create a simulation and solve the problem + + # Create a simulation and solve the problem # (do not forget to specify the dt parameter here) - simu = Simulation(start=args.tstart, end=args.tend, + simu = Simulation(start=args.tstart, end=args.tend, nb_iter=args.nb_iter, max_iter=args.max_iter, times_of_interest=args.dump_times, dt=dt, dt0=args.dt) - - # Finally solve the problem + + # Finally solve the problem problem.solve(simu, dry_run=args.dry_run) - + # Finalize problem.finalize() @@ -117,7 +127,7 @@ if __name__=='__main__': description+='Diffuse a scalar with a given diffusion coefficient. ' description+='\n\nThe diffusion operator is directionally splitted resulting ' description+='in the use of one or more diffusion operators per direction.' - + super(ScalarDiffusionArgParser, self).__init__( prog_name=prog_name, description=description, @@ -136,8 +146,8 @@ if __name__=='__main__': parser = ScalarDiffusionArgParser() - parser.set_defaults(box_origin=(0.0,), box_length=(1.0,), - tstart=0.0, tend=1.0, nb_iter=500, + parser.set_defaults(box_origin=(0.0,), box_length=(1.0,), + tstart=0.0, tend=1.0, nb_iter=500, dump_freq=5, nu=0.01, impl='cl') parser.run(compute)