Skip to content
Snippets Groups Projects
Commit a549bb3f authored by EXT Jean-Matthieu Etancelin's avatar EXT Jean-Matthieu Etancelin
Browse files

Fix custom operator for vector fields. Improve imports of opencl operators on non-opencl machines

parent 76fcad2e
No related branches found
No related tags found
1 merge request!16MPI operators
from hysop.tools.decorators import debug from hysop.tools.decorators import debug
from hysop.tools.types import check_instance from hysop.tools.types import check_instance
from hysop.fields.continuous_field import Field from hysop.fields.continuous_field import Field, VectorField
from hysop.parameters.parameter import Parameter from hysop.parameters.parameter import Parameter
from hysop.topology.cartesian_descriptor import CartesianTopologyDescriptors from hysop.topology.cartesian_descriptor import CartesianTopologyDescriptors
from hysop.backend.host.host_operator import HostOperator from hysop.backend.host.host_operator import HostOperator
...@@ -50,20 +50,23 @@ class PythonCustomOperator(HostOperator): ...@@ -50,20 +50,23 @@ class PythonCustomOperator(HostOperator):
super(PythonCustomOperator, self).discretize() super(PythonCustomOperator, self).discretize()
dinvar, dinparam = [], [] dinvar, dinparam = [], []
doutvar, doutparam = [], [] doutvar, doutparam = [], []
idf, odf = self.input_discrete_fields, self.output_discrete_fields
self.ghost_exchanger = [] self.ghost_exchanger = []
if self.invars is not None: if self.invars is not None:
for v in self.invars: for v in self.invars:
if isinstance(v, Field): if isinstance(v, Field):
for vd in self.input_discrete_fields[v]: for _v in v if isinstance(v, VectorField) else (v, ):
dinvar.append(vd) for vd in idf[_v]:
dinvar.append(vd)
elif isinstance(v, Parameter): elif isinstance(v, Parameter):
dinparam.append(v) dinparam.append(v)
if self.outvars is not None: if self.outvars is not None:
for v in self.outvars: for v in self.outvars:
if isinstance(v, Field): if isinstance(v, Field):
for vd in self.output_discrete_fields[v]: for _v in v if isinstance(v, VectorField) else (v, ):
doutvar.append(vd) for vd in self.output_discrete_fields[_v]:
gh = self.output_discrete_fields[v].build_ghost_exchanger() doutvar.append(vd)
gh = self.output_discrete_fields[v].build_ghost_exchanger()
if gh is not None: if gh is not None:
self.ghost_exchanger.append(gh) self.ghost_exchanger.append(gh)
elif isinstance(v, Parameter): elif isinstance(v, Parameter):
......
...@@ -9,7 +9,7 @@ from hysop.topology.cartesian_descriptor import CartesianTopologyDescriptors ...@@ -9,7 +9,7 @@ from hysop.topology.cartesian_descriptor import CartesianTopologyDescriptors
class CustomOperator(ComputationalGraphNodeFrontend): class CustomOperator(ComputationalGraphNodeFrontend):
""" """
Function should take parameters in the following order: Function should take parameters in the following order:
1. all input fields 1. all input fields
2. all input parameters 2. all input parameters
3. all output fields 3. all output fields
...@@ -22,7 +22,7 @@ class CustomOperator(ComputationalGraphNodeFrontend): ...@@ -22,7 +22,7 @@ class CustomOperator(ComputationalGraphNodeFrontend):
from hysop.backend.host.python.operator.custom import PythonCustomOperator from hysop.backend.host.python.operator.custom import PythonCustomOperator
__implementations = { __implementations = {
Implementation.PYTHON: PythonCustomOperator, Implementation.PYTHON: PythonCustomOperator,
} }
return __implementations return __implementations
...@@ -36,25 +36,25 @@ class CustomOperator(ComputationalGraphNodeFrontend): ...@@ -36,25 +36,25 @@ class CustomOperator(ComputationalGraphNodeFrontend):
allow_none=True) allow_none=True)
check_instance(outvars, (tuple, list), values=(Field, Parameter), check_instance(outvars, (tuple, list), values=(Field, Parameter),
allow_none=True) allow_none=True)
from inspect import getargspec as signature # should be inspect.signature in python 3 from inspect import getargspec as signature # should be inspect.signature in python 3
nb_args = len(signature(func).args) nb_args = len(signature(func).args)
nb_in_f, nb_in_p, nb_out_f, nb_out_p = 0, 0, 0, 0 nb_in_f, nb_in_p, nb_out_f, nb_out_p = 0, 0, 0, 0
if invars is not None: if invars is not None:
for v in invars: for v in invars:
if isinstance(v, Field): if isinstance(v, Field):
nb_in_f += 1 nb_in_f += v.nb_components
elif isinstance(v, Parameter): elif isinstance(v, Parameter):
nb_in_p += 1 nb_in_p += 1
if outvars is not None: if outvars is not None:
for v in outvars: for v in outvars:
if isinstance(v, Field): if isinstance(v, Field):
nb_out_f += 1 nb_out_f += v.nb_components
elif isinstance(v, Parameter): elif isinstance(v, Parameter):
nb_out_p += 1 nb_out_p += 1
msg = "function arguments ({}) did not match given in/out ".format(signature(func)) msg = "function arguments ({}) did not match given in/out ".format(signature(func))
msg += "fields and parameters ({} input fields, {} input params,".format(nb_in_f, nb_in_p) msg += "fields and parameters ({} input fields, {} input params,".format(nb_in_f, nb_in_p)
msg += " {} output fields, {} output params).".format(nb_out_f, nb_out_p) msg += " {} output fields, {} output params).".format(nb_out_f, nb_out_p)
assert nb_args == nb_in_f + nb_in_p + nb_out_f + nb_out_p, msg assert nb_args == nb_in_f + nb_in_p + nb_out_f + nb_out_p, msg
super(CustomOperator, self).__init__( super(CustomOperator, self).__init__(
func=func, invars=invars, outvars=outvars, **kwds) func=func, invars=invars, outvars=outvars, **kwds)
...@@ -12,7 +12,10 @@ from hysop.parameters.scalar_parameter import ScalarParameter ...@@ -12,7 +12,10 @@ from hysop.parameters.scalar_parameter import ScalarParameter
from hysop.operator.base.spectral_operator import SpectralComputationalGraphNodeFrontend from hysop.operator.base.spectral_operator import SpectralComputationalGraphNodeFrontend
from hysop.backend.host.python.operator.diffusion import PythonDiffusion from hysop.backend.host.python.operator.diffusion import PythonDiffusion
from hysop.backend.device.opencl.operator.diffusion import OpenClDiffusion try:
from hysop.backend.device.opencl.operator.diffusion import OpenClDiffusion
except ImportError:
OpenClDiffusion = None
try: try:
from hysop.backend.host.fortran.operator.diffusion import DiffusionFFTW from hysop.backend.host.fortran.operator.diffusion import DiffusionFFTW
except ImportError: except ImportError:
......
...@@ -11,7 +11,10 @@ from hysop.topology.cartesian_descriptor import CartesianTopologyDescriptors ...@@ -11,7 +11,10 @@ from hysop.topology.cartesian_descriptor import CartesianTopologyDescriptors
from hysop.operator.base.spectral_operator import SpectralComputationalGraphNodeFrontend from hysop.operator.base.spectral_operator import SpectralComputationalGraphNodeFrontend
from hysop.backend.host.python.operator.poisson import PythonPoisson from hysop.backend.host.python.operator.poisson import PythonPoisson
from hysop.backend.device.opencl.operator.poisson import OpenClPoisson try:
from hysop.backend.device.opencl.operator.poisson import OpenClPoisson
except ImportError:
OpenClPoisson = None
try: try:
from hysop.backend.host.fortran.operator.poisson import PoissonFFTW from hysop.backend.host.fortran.operator.poisson import PoissonFFTW
except ImportError: except ImportError:
......
...@@ -11,7 +11,10 @@ from hysop.topology.cartesian_descriptor import CartesianTopologyDescriptors ...@@ -11,7 +11,10 @@ from hysop.topology.cartesian_descriptor import CartesianTopologyDescriptors
from hysop.operator.base.spectral_operator import SpectralComputationalGraphNodeFrontend from hysop.operator.base.spectral_operator import SpectralComputationalGraphNodeFrontend
from hysop.backend.host.python.operator.poisson_curl import PythonPoissonCurl from hysop.backend.host.python.operator.poisson_curl import PythonPoissonCurl
from hysop.backend.device.opencl.operator.poisson_curl import OpenClPoissonCurl try:
from hysop.backend.device.opencl.operator.poisson_curl import OpenClPoissonCurl
except ImportError:
OpenClPoissonCurl = None
try: try:
from hysop.backend.host.fortran.operator.poisson_curl import FortranPoissonCurl from hysop.backend.host.fortran.operator.poisson_curl import FortranPoissonCurl
except ImportError: except ImportError:
......
...@@ -5,52 +5,56 @@ Allows things like: ...@@ -5,52 +5,56 @@ Allows things like:
from hysop.operators import DirectionalAdvection from hysop.operators import DirectionalAdvection
""" """
from hysop.operator.poisson import Poisson from hysop.operator.poisson import Poisson
from hysop.operator.poisson_curl import PoissonCurl from hysop.operator.poisson_curl import PoissonCurl
from hysop.operator.diffusion import Diffusion # FFTW diffusion from hysop.operator.diffusion import Diffusion # FFTW diffusion
from hysop.operator.advection import Advection # Scales fortran advection from hysop.operator.advection import Advection # Scales fortran advection
from hysop.operator.penalization import PenalizeVorticity from hysop.operator.penalization import PenalizeVorticity
from hysop.operator.flowrate_correction import FlowRateCorrection from hysop.operator.flowrate_correction import FlowRateCorrection
from hysop.operator.vorticity_absorption import VorticityAbsorption from hysop.operator.vorticity_absorption import VorticityAbsorption
from hysop.operator.transpose import Transpose from hysop.operator.transpose import Transpose
from hysop.operator.misc import Noop, ForceTopologyState from hysop.operator.misc import Noop, ForceTopologyState
from hysop.operator.redistribute import Redistribute from hysop.operator.redistribute import Redistribute
from hysop.operator.analytic import AnalyticField from hysop.operator.analytic import AnalyticField
from hysop.operator.mean_field import ComputeMeanField from hysop.operator.mean_field import ComputeMeanField
from hysop.operator.enstrophy import Enstrophy from hysop.operator.enstrophy import Enstrophy
from hysop.operator.kinetic_energy import KineticEnergy from hysop.operator.kinetic_energy import KineticEnergy
from hysop.operator.adapt_timestep import AdaptiveTimeStep from hysop.operator.adapt_timestep import AdaptiveTimeStep
from hysop.operator.hdf_io import HDF_Writer, HDF_Reader from hysop.operator.hdf_io import HDF_Writer, HDF_Reader
from hysop.operator.custom_symbolic import CustomSymbolicOperator from hysop.operator.custom_symbolic import CustomSymbolicOperator
from hysop.operator.parameter_plotter import ParameterPlotter from hysop.operator.parameter_plotter import ParameterPlotter
from hysop.operator.integrate import Integrate from hysop.operator.integrate import Integrate
from hysop.operator.penalization import PenalizeVorticity from hysop.operator.penalization import PenalizeVorticity
from hysop.operator.flowrate_correction import FlowRateCorrection from hysop.operator.flowrate_correction import FlowRateCorrection
from hysop.operator.vorticity_absorption import VorticityAbsorption from hysop.operator.vorticity_absorption import VorticityAbsorption
from hysop.operator.dummy import Dummy from hysop.operator.dummy import Dummy
from hysop.operator.custom import CustomOperator from hysop.operator.custom import CustomOperator
from hysop.operator.convergence import Convergence from hysop.operator.convergence import Convergence
from hysop.operator.spatial_filtering import SpatialFilter from hysop.operator.spatial_filtering import SpatialFilter
from hysop.operator.derivative import SpaceDerivative, \ from hysop.operator.derivative import SpaceDerivative, \
SpectralSpaceDerivative, \ SpectralSpaceDerivative, \
FiniteDifferencesSpaceDerivative, \ FiniteDifferencesSpaceDerivative, \
MultiSpaceDerivatives MultiSpaceDerivatives
from hysop.operator.min_max import MinMaxFieldStatistics, \ from hysop.operator.min_max import MinMaxFieldStatistics, \
MinMaxFiniteDifferencesDerivativeStatistics, \ MinMaxFiniteDifferencesDerivativeStatistics, \
MinMaxSpectralDerivativeStatistics MinMaxSpectralDerivativeStatistics
from hysop.operator.gradient import Gradient, MinMaxGradientStatistics from hysop.operator.gradient import Gradient, MinMaxGradientStatistics
from hysop.operator.curl import Curl, SpectralCurl from hysop.operator.curl import Curl, SpectralCurl
from hysop.operator.external_force import SpectralExternalForce from hysop.operator.external_force import SpectralExternalForce
from hysop.backend.device.opencl.operator.external_force import SymbolicExternalForce try:
from hysop.backend.device.opencl.operator.external_force import SymbolicExternalForce
except ImportError:
SymbolicExternalForce = None
from hysop.operator.permeability import PermeabilityEstimate
from hysop.numerics.splitting.strang import StrangSplitting from hysop.numerics.splitting.strang import StrangSplitting
from hysop.operator.directional.symbolic_dir import DirectionalSymbolic from hysop.operator.directional.symbolic_dir import DirectionalSymbolic
from hysop.operator.directional.advection_dir import DirectionalAdvection from hysop.operator.directional.advection_dir import DirectionalAdvection
from hysop.operator.directional.diffusion_dir import DirectionalDiffusion from hysop.operator.directional.diffusion_dir import DirectionalDiffusion
from hysop.operator.directional.stretching_dir import DirectionalStretching from hysop.operator.directional.stretching_dir import DirectionalStretching
from hysop.operator.directional.stretching_dir import StaticDirectionalStretching from hysop.operator.directional.stretching_dir import StaticDirectionalStretching
from hysop.operator.directional.stretching_diffusion_dir import DirectionalStretchingDiffusion from hysop.operator.directional.stretching_diffusion_dir import DirectionalStretchingDiffusion
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment