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

Fix convergence operator with custom field for previous values

parent 4d609aed
No related branches found
No related tags found
2 merge requests!24Resolve "Add python3.x support",!15WIP: Resolve "HySoP with tasks"
...@@ -29,12 +29,11 @@ class PythonConvergence(ConvergenceBase, HostOperator): ...@@ -29,12 +29,11 @@ class PythonConvergence(ConvergenceBase, HostOperator):
dtype=self.convergence.dtype) dtype=self.convergence.dtype)
self._tmp_reduce = npw.zeros((1+self.field.nb_components), self._tmp_reduce = npw.zeros((1+self.field.nb_components),
dtype=self.convergence.dtype) dtype=self.convergence.dtype)
old = [npw.zeros(_.shape) for _ in self.field_buffers]
self.dField_old = tuple(old)
self.__compute_error_absolute = lambda ui, ui_old: npw.max(npw.abs(ui - ui_old)) self.__compute_error_absolute = \
self.__compute_error_relative = lambda ui, ui_old, max_ui: npw.max( lambda ui, ui_old: npw.max(npw.abs(ui - ui_old))
npw.abs(ui - ui_old))/max_ui self.__compute_error_relative = \
lambda ui, ui_old, max_ui: npw.max(npw.abs(ui - ui_old))/max_ui
if self._residual_computation == ResidualError.ABSOLUTE: if self._residual_computation == ResidualError.ABSOLUTE:
self.__compute_error = self.__compute_error_absolute self.__compute_error = self.__compute_error_absolute
elif self._residual_computation == ResidualError.RELATIVE: elif self._residual_computation == ResidualError.RELATIVE:
...@@ -47,7 +46,7 @@ class PythonConvergence(ConvergenceBase, HostOperator): ...@@ -47,7 +46,7 @@ class PythonConvergence(ConvergenceBase, HostOperator):
@op_apply @op_apply
def apply(self, **kwds): def apply(self, **kwds):
u = self.field_buffers u = self.dField.compute_buffers
u_old = self.dField_old u_old = self.dField_old
self._tmp_convergence[...] = 0. self._tmp_convergence[...] = 0.
......
from abc import ABCMeta from abc import ABCMeta
import numpy as np import numpy as np
from hysop.tools.types import check_instance, first_not_None, InstanceOf from hysop.tools.types import check_instance, first_not_None, InstanceOf
from hysop.tools.decorators import debug from hysop.tools.decorators import debug
from hysop.fields.continuous_field import Field from hysop.fields.continuous_field import Field
from hysop.parameters.tensor_parameter import TensorParameter from hysop.parameters.tensor_parameter import TensorParameter
from hysop.topology.cartesian_descriptor import CartesianTopologyDescriptors from hysop.topology.cartesian_descriptor import CartesianTopologyDescriptors
from hysop.core.memory.memory_request import MemoryRequest from hysop.core.memory.memory_request import MemoryRequest
from hysop.constants import ResidualError from hysop.constants import ResidualError
from hysop.tools.numpywrappers import npw
class ConvergenceBase(object): class ConvergenceBase(object):
"""Common implementation interface for Convergence operator""" """Common implementation interface for Convergence operator"""
...@@ -25,6 +27,7 @@ class ConvergenceBase(object): ...@@ -25,6 +27,7 @@ class ConvergenceBase(object):
dm = super(ConvergenceBase, cls).default_method() dm = super(ConvergenceBase, cls).default_method()
dm.update(cls.__default_method) dm.update(cls.__default_method)
return dm return dm
@classmethod @classmethod
def available_methods(cls): def available_methods(cls):
am = super(ConvergenceBase, cls).available_methods() am = super(ConvergenceBase, cls).available_methods()
...@@ -32,11 +35,12 @@ class ConvergenceBase(object): ...@@ -32,11 +35,12 @@ class ConvergenceBase(object):
return am return am
@debug @debug
def __init__(self, variables, convergence=None, def __init__(self, variables, convergence=None, u_old=None,
implementation=None, **kwds): implementation=None, **kwds):
""" """
variables: dict variables: dict
dictionary of fields as keys and topologies as values. dictionary of fields as keys and topologies as values.
convergence: TensorParameter (optional) convergence: TensorParameter (optional)
Parameter to store the components of ||u-u_old||_\infty or ||u-u_old||_\infty/||u||_\infty Parameter to store the components of ||u-u_old||_\infty or ||u-u_old||_\infty/||u||_\infty
implementation: Implementation, optional, defaults to None implementation: Implementation, optional, defaults to None
...@@ -48,19 +52,24 @@ class ConvergenceBase(object): ...@@ -48,19 +52,24 @@ class ConvergenceBase(object):
""" """
check_instance(convergence, TensorParameter, allow_none=True) check_instance(convergence, TensorParameter, allow_none=True)
check_instance(variables, dict, keys=Field, values=CartesianTopologyDescriptors) check_instance(variables, dict, keys=Field, values=CartesianTopologyDescriptors)
check_instance(u_old, Field, allow_none=True)
field = variables.keys()[0] field = variables.keys()[0]
if convergence is None: if convergence is None:
convergence = TensorParameter(name="|residual|", dtype=field.dtype, convergence = TensorParameter(name="|residual|", dtype=field.dtype,
shape=(field.nb_components, ), shape=(field.nb_components, ),
is_read_only=False, quiet=False, is_read_only=False, quiet=False,
initial_value=np.asarray([np.finfo(field.dtype).max,]*field.nb_components)) initial_value=np.asarray([np.finfo(field.dtype).max, ]*field.nb_components))
input_fields = {field: variables[field]} input_fields = {field: variables[field]}
output_params = {convergence.name: convergence} output_params = {convergence.name: convergence}
self.field = field self.field = field
self.convergence = convergence self.convergence = convergence
self.u_old = u_old
if not u_old is None:
input_fields.update({u_old: variables[u_old]})
super(ConvergenceBase, self).__init__(input_fields=input_fields, super(ConvergenceBase, self).__init__(input_fields=input_fields,
output_params=output_params, **kwds) output_params=output_params, **kwds)
...@@ -76,3 +85,11 @@ class ConvergenceBase(object): ...@@ -76,3 +85,11 @@ class ConvergenceBase(object):
return return
super(ConvergenceBase, self).discretize() super(ConvergenceBase, self).discretize()
self.dField = self.get_input_discrete_field(self.field) self.dField = self.get_input_discrete_field(self.field)
if not self.u_old is None:
self.dField_old = self.get_input_discrete_field(self.u_old).compute_buffers
@debug
def setup(self, work):
super(ConvergenceBase, self).setup(work)
if self.u_old is None:
self.dField_old = tuple([npw.zeros(_.shape) for _ in self.dField.compute_buffers])
...@@ -3,14 +3,15 @@ ...@@ -3,14 +3,15 @@
Convergence operator. Convergence operator.
""" """
from hysop.tools.decorators import debug from hysop.tools.decorators import debug
from hysop.constants import Implementation from hysop.constants import Implementation
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
from hysop.parameters.tensor_parameter import TensorParameter from hysop.parameters.tensor_parameter import TensorParameter
from hysop.topology.cartesian_descriptor import CartesianTopologyDescriptors from hysop.topology.cartesian_descriptor import CartesianTopologyDescriptors
from hysop.core.graph.computational_node_frontend import ComputationalGraphNodeFrontend from hysop.core.graph.computational_node_frontend import ComputationalGraphNodeFrontend
class Convergence(ComputationalGraphNodeFrontend): class Convergence(ComputationalGraphNodeFrontend):
""" """
Computes the convergence citeria for a given field. Computes the convergence citeria for a given field.
...@@ -24,7 +25,7 @@ class Convergence(ComputationalGraphNodeFrontend): ...@@ -24,7 +25,7 @@ class Convergence(ComputationalGraphNodeFrontend):
def implementations(cls): def implementations(cls):
from hysop.backend.host.python.operator.convergence import PythonConvergence from hysop.backend.host.python.operator.convergence import PythonConvergence
implementations = { implementations = {
Implementation.PYTHON: PythonConvergence Implementation.PYTHON: PythonConvergence
} }
return implementations return implementations
...@@ -33,7 +34,7 @@ class Convergence(ComputationalGraphNodeFrontend): ...@@ -33,7 +34,7 @@ class Convergence(ComputationalGraphNodeFrontend):
return Implementation.PYTHON return Implementation.PYTHON
@debug @debug
def __init__(self, variables, error=None, convergence=None, def __init__(self, variables, u_old=None, convergence=None,
implementation=None, **kwds): implementation=None, **kwds):
"""Initialize a convergence operator. """Initialize a convergence operator.
...@@ -43,8 +44,8 @@ class Convergence(ComputationalGraphNodeFrontend): ...@@ -43,8 +44,8 @@ class Convergence(ComputationalGraphNodeFrontend):
variables: dict variables: dict
dictionary of fields as keys and topologies as values. dictionary of fields as keys and topologies as values.
error: Field (optional) u_old: Field (optional)
Field to compute u-u_old. This field is created if not given. Field to store u_old. This field is created if not given.
convergence: TensorParameter (optional) convergence: TensorParameter (optional)
Parameter to store the components of ||u-u_old||_\infty or ||u-u_old||_\infty/||u||_\infty Parameter to store the components of ||u-u_old||_\infty or ||u-u_old||_\infty/||u||_\infty
implementation: Implementation, optional, defaults to None implementation: Implementation, optional, defaults to None
...@@ -54,11 +55,11 @@ class Convergence(ComputationalGraphNodeFrontend): ...@@ -54,11 +55,11 @@ class Convergence(ComputationalGraphNodeFrontend):
Extra keywords arguments that will be passed towards implementation Extra keywords arguments that will be passed towards implementation
enstrophy operator __init__. enstrophy operator __init__.
""" """
check_instance(error, Field, allow_none=True) check_instance(u_old, Field, allow_none=True)
check_instance(convergence, TensorParameter, allow_none=True) check_instance(convergence, TensorParameter, allow_none=True)
check_instance(variables, dict, keys=Field, values=CartesianTopologyDescriptors) check_instance(variables, dict, keys=Field, values=CartesianTopologyDescriptors)
super(Convergence, self).__init__( super(Convergence, self).__init__(
error=error, convergence=convergence, u_old=u_old, convergence=convergence,
variables=variables, variables=variables,
implementation=implementation, **kwds) implementation=implementation, **kwds)
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