diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 66556df9d851d38dfb53906aef6a7c6df00d0a02..e04c5d3a291721f9c1648051d3226ef617b6815e 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -17,8 +17,8 @@ config:bionic: image: keckj/hysop:ubuntu_bionic stage: configure script: - - "sh ci/scripts/config.sh $CI_PROJECT_DIR/build/gcc-7 $CI_PROJECT_DIR/install/gcc-7 gcc-7 g++-7 gfortran-7" - - "sh ci/scripts/config.sh $CI_PROJECT_DIR/build/clang-6 $CI_PROJECT_DIR/install/clang-6 clang-6.0 clang++-6.0 gfortran-7" + - "bash ci/scripts/config.sh $CI_PROJECT_DIR/build/gcc-7 $CI_PROJECT_DIR/install/gcc-7 gcc-7 g++-7 gfortran-7" + - "bash ci/scripts/config.sh $CI_PROJECT_DIR/build/clang-6 $CI_PROJECT_DIR/install/clang-6 clang-6.0 clang++-6.0 gfortran-7" dependencies: - env:bionic artifacts: @@ -29,8 +29,8 @@ build:bionic: image: keckj/hysop:ubuntu_bionic stage: build script: - - "sh ci/scripts/build.sh $CI_PROJECT_DIR/build/gcc-7 gcc-7 g++-7 gfortran-7" - - "sh ci/scripts/build.sh $CI_PROJECT_DIR/build/clang-6 clang-6.0 clang++-6.0 gfortran-7" + - "bash ci/scripts/build.sh $CI_PROJECT_DIR/build/gcc-7 gcc-7 g++-7 gfortran-7" + - "bash ci/scripts/build.sh $CI_PROJECT_DIR/build/clang-6 clang-6.0 clang++-6.0 gfortran-7" dependencies: - config:bionic artifacts: @@ -41,7 +41,7 @@ install:bionic: image: keckj/hysop:ubuntu_bionic stage: install script: - - "sh ci/scripts/install.sh $CI_PROJECT_DIR/build/gcc-7 $CI_PROJECT_DIR/install/gcc-7" + - "bash ci/scripts/install.sh $CI_PROJECT_DIR/build/gcc-7 $CI_PROJECT_DIR/install/gcc-7" dependencies: - build:bionic artifacts: @@ -52,7 +52,7 @@ test:bionic: image: keckj/hysop:ubuntu_bionic stage: test script: - - "sh ci/scripts/test.sh $CI_PROJECT_DIR/install/gcc-7 $CI_PROJECT_DIR/hysop $CI_PROJECT_DIR/cache" + - "bash ci/scripts/test.sh $CI_PROJECT_DIR/install/gcc-7 $CI_PROJECT_DIR/hysop $CI_PROJECT_DIR/cache" dependencies: - install:bionic cache: diff --git a/examples/fixed_point/heat_equation.py b/examples/fixed_point/heat_equation.py index 43fddf9ed5e7bb12dfc653397991dff7920d3cc0..35ca2e65371458201621b93c55cecf9d68aaf666 100644 --- a/examples/fixed_point/heat_equation.py +++ b/examples/fixed_point/heat_equation.py @@ -1,4 +1,5 @@ -"""Example for fixed point iteration inside Simulation. +""" +Example for fixed point iteration inside Simulation. We consider steady state of heat equation with a varying source term. Each time step, the source terms are computed analytically and then an @@ -6,6 +7,7 @@ iterative method is used to compute steady state solution. """ import numpy as np +import sympy as sp from hysop import Box, Simulation, Problem, Field, MPIParams from hysop.constants import Implementation, HYSOP_REAL, Backend, ResidualError @@ -15,13 +17,12 @@ from hysop.operators import StrangSplitting, DirectionalDiffusion, \ from hysop.methods import StrangOrder from hysop.parameters.scalar_parameter import ScalarParameter from hysop.topology.cartesian_topology import CartesianTopology -from hysop.tools.parameters import Discretization +from hysop.tools.parameters import CartesianDiscretization from hysop.iterative_method import PseudoSimulation, IterativeMethod from hysop.symbolic.relational import Assignment from hysop.symbolic.misc import Select from hysop.symbolic.tmp import TmpScalar from hysop.simulation import eps -import sympy as sp # Define the domain @@ -45,7 +46,7 @@ pseudo_dt = ScalarParameter(name='pseudo_dt', dtype=HYSOP_REAL, min_value=eps, topo_nogh = CartesianTopology( domain=box, backend=Backend.HOST, - discretization=Discretization(npts, ghosts=(0, 0, 0)), + discretization=CartesianDiscretization(npts, ghosts=(0, 0, 0), default_boundaries=True), mpi_params=mpi_params) # Operator for setting iterative method diff --git a/examples/flow_around_sphere/flow_around_sphere.py b/examples/flow_around_sphere/flow_around_sphere.py index 78b4cfca9b7a50487edbf97325a7df8fda19d510..45f83a42d69ed948eeea91bb6a58d7256de31ff0 100644 --- a/examples/flow_around_sphere/flow_around_sphere.py +++ b/examples/flow_around_sphere/flow_around_sphere.py @@ -230,8 +230,8 @@ enstrophy_op = Enstrophy( implementation=Implementation.PYTHON, **extra_op_kwds) ### Adaptive timestep operator -#TODO:move advection to GRAD_U -#TODO:add stretching criteria, based on a gradient +#TODO: move advection to GRAD_U +#TODO: add stretching criteria, based on a gradient adapt_dt = AdaptiveTimeStep(dt, equivalent_CFL=True, start_time=10*dt0) # start adapting timestep at t=10*dt0 dt_cfl = adapt_dt.push_cfl_criteria(cfl=cfl, @@ -268,8 +268,8 @@ problem.insert( ) problem.build() -# # Create a simulation -# # (do not forget to specify the t and dt parameters here) +## Create a simulation +## (do not forget to specify the t and dt parameters here) simu = Simulation(start=0., end=10.0, dt0=dt0, t=t, dt=dt) simu.write_parameters(t, dt_cfl, dt_advec, dt, enstrophy, flowrate, diff --git a/hysop/core/graph/computational_graph.py b/hysop/core/graph/computational_graph.py index 192fb1dce4c4875e9a05c6b86d4fd14c02276a75..ecd91d0055a436e808576552331c19d5151cbded 100644 --- a/hysop/core/graph/computational_graph.py +++ b/hysop/core/graph/computational_graph.py @@ -95,9 +95,10 @@ class ComputationalGraph(ComputationalGraphNode): ghosts = u'{}<=ghosts<{}'.format(min_ghosts, max_ghosts) can_split=req.can_split.view(npw.int8) memory_order=u'{}'.format(req.memory_order) if req.memory_order else u'ANY' + can_split=u'[{}]'.format(u','.join('1' if cs else '0' for cs in req.can_split)) tstates=u'{}'.format(u','.join(str(ts) for ts in req.tstates)) \ if req.tstates else 'ANY' - sin.append( (opname, fname, discr, ghosts, memory_order, tstates) ) + sin.append( (opname, fname, discr, ghosts, memory_order, can_split, tstates) ) for field, mreqs in requirements.output_field_requirements.iteritems(): for td, reqs in mreqs.requirements.iteritems(): for req in reqs: @@ -114,19 +115,21 @@ class ComputationalGraph(ComputationalGraphNode): ghosts = u'{}<=ghosts<{}'.format(min_ghosts, max_ghosts) can_split=req.can_split.view(npw.int8) memory_order=u'{}'.format(req.memory_order) if req.memory_order else u'ANY' + can_split=u'[{}]'.format(u','.join('1' if cs else '0' for cs in req.can_split)) tstates=u'{}'.format(u','.join(str(ts) for ts in req.tstates)) \ if req.tstates else u'ANY' - sout.append( (opname, fname, discr, ghosts, memory_order, tstates) ) + sout.append( (opname, fname, discr, ghosts, memory_order, can_split, tstates) ) - titles = [[(u'OPERATOR', u'FIELD', u'DISCRETIZATION', u'GHOSTS', u'MEMORY ORDER', u'TSTATES')]] - name_size = max(len(s[0]) for ss in sinputs.values()+soutputs.values()+titles for s in ss) - field_size = max(len(s[1]) for ss in sinputs.values()+soutputs.values()+titles for s in ss) - discr_size = max(len(s[2]) for ss in sinputs.values()+soutputs.values()+titles for s in ss) - ghosts_size = max(len(s[3]) for ss in sinputs.values()+soutputs.values()+titles for s in ss) - order_size = max(len(s[4]) for ss in sinputs.values()+soutputs.values()+titles for s in ss) - tstates_size = max(len(s[5]) for ss in sinputs.values()+soutputs.values()+titles for s in ss) + titles = [[(u'OPERATOR', u'FIELD', u'DISCRETIZATION', u'GHOSTS', u'MEMORY ORDER', u'CAN_SPLIT', u'TSTATES')]] + name_size = max(len(s[0]) for ss in sinputs.values()+soutputs.values()+titles for s in ss) + field_size = max(len(s[1]) for ss in sinputs.values()+soutputs.values()+titles for s in ss) + discr_size = max(len(s[2]) for ss in sinputs.values()+soutputs.values()+titles for s in ss) + ghosts_size = max(len(s[3]) for ss in sinputs.values()+soutputs.values()+titles for s in ss) + order_size = max(len(s[4]) for ss in sinputs.values()+soutputs.values()+titles for s in ss) + cansplit_size = max(len(s[5]) for ss in sinputs.values()+soutputs.values()+titles for s in ss) + tstates_size = max(len(s[6]) for ss in sinputs.values()+soutputs.values()+titles for s in ss) - template = u'\n {:<{name_size}} {:^{field_size}} {:^{discr_size}} {:^{ghosts_size}} {:^{order_size}} {:^{tstates_size}}' + template = u'\n {:<{name_size}} {:^{field_size}} {:^{discr_size}} {:^{ghosts_size}} {:^{order_size}} {:^{cansplit_size}} {:^{tstates_size}}' ss= u'>INPUTS:' if sinputs: @@ -138,13 +141,15 @@ class ComputationalGraph(ComputationalGraphNode): ss+= template.format(*titles[0][0], name_size=name_size, field_size=field_size, discr_size=discr_size, ghosts_size=ghosts_size, - order_size=order_size, tstates_size=tstates_size) - for (opname, fname, discr, ghosts, order, tstates) in sreqs: + order_size=order_size, cansplit_size=cansplit_size, + tstates_size=tstates_size) + for (opname, fname, discr, ghosts, order, can_split, tstates) in sreqs: ss+=template.format( - opname, fname, discr, ghosts, order, tstates, + opname, fname, discr, ghosts, order, can_split, tstates, name_size=name_size, field_size=field_size, discr_size=discr_size, ghosts_size=ghosts_size, - order_size=order_size, tstates_size=tstates_size) + order_size=order_size, cansplit_size=cansplit_size, + tstates_size=tstates_size) else: ss+=u' None' ss+= u'\n>OUTPUTS:' @@ -157,13 +162,15 @@ class ComputationalGraph(ComputationalGraphNode): ss+= template.format(*titles[0][0], name_size=name_size, field_size=field_size, discr_size=discr_size, ghosts_size=ghosts_size, - order_size=order_size, tstates_size=tstates_size) - for (opname, fname, discr, ghosts, order, tstates) in sreqs: + order_size=order_size, cansplit_size=cansplit_size, + tstates_size=tstates_size) + for (opname, fname, discr, ghosts, order, can_split, tstates) in sreqs: ss+=template.format( - opname, fname, discr, ghosts, order, tstates, + opname, fname, discr, ghosts, order, can_split, tstates, name_size=name_size, field_size=field_size, discr_size=discr_size, ghosts_size=ghosts_size, - order_size=order_size, tstates_size=tstates_size) + order_size=order_size, cansplit_size=cansplit_size, + tstates_size=tstates_size) else: ss+=u' None' diff --git a/hysop/iterative_method.py b/hysop/iterative_method.py index 0774703cf7519e0553182bdb0093d5c304d0b38a..5b15040ff9656413408e5e0cf3640b00f792d89d 100644 --- a/hysop/iterative_method.py +++ b/hysop/iterative_method.py @@ -63,8 +63,6 @@ class PseudoSimulation(Simulation): vprint(msg.format(self.current_iteration, crit)) - - class IterativeMethod(Problem): """Overriding a Problem to enfoce a PseudoSimulation for iterative method loop. @@ -128,3 +126,6 @@ class IterativeMethod(Problem): loop.current_iteration, loop.stop_criteria.value)) self.it_num.value = loop.current_iteration loop.finalize() + + def get_preserved_input_fields(self): + return set() diff --git a/hysop/parameters/parameter.py b/hysop/parameters/parameter.py index 71024f313b43fe52609fb3e7cc7df8ee06e77aaa..85d75f19b92f6a7ad3947c302ac2dba26d74f021 100644 --- a/hysop/parameters/parameter.py +++ b/hysop/parameters/parameter.py @@ -126,8 +126,8 @@ class Parameter(TaggedObject, VariableTag): value = value._get_value() self._set_value_impl(value) if not self.quiet: - if __DEBUG__ or main_rank == 0: - msg='[{}]>Parameter {} set to {}.'.format( + if __DEBUG__ or (main_rank == 0): + msg='[{}] >Parameter {} set to {}.'.format( main_rank, self.pretty_name, value) vprint(msg)