From ebd899f4c89a25bea951c65059517edb2149059f Mon Sep 17 00:00:00 2001 From: ishaandesai Date: Tue, 3 Dec 2019 14:59:07 +0100 Subject: [PATCH 1/7] Initial commit --- .gitignore | 2 +- error_handling.py | 15 +++++++++++++++ precice.pyx | 1 + 3 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 error_handling.py diff --git a/.gitignore b/.gitignore index 2d49aa5c..ba2c237b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ # The following files are ignored by Git -.idea # Pycharm related file +.idea/ # Pycharm related folder diff --git a/error_handling.py b/error_handling.py new file mode 100644 index 00000000..e4e0cc6a --- /dev/null +++ b/error_handling.py @@ -0,0 +1,15 @@ +""" +Functions to check the type of input argument against what is expected +and raise an Exception if mismatch found +""" + + +def check1D(func_name, usr_input, true_val): + if usr_input != true_val: + raise Exception("Function {} received position of type {} but expects a 1D numpy \ + array with {} values as position input".format(func_name, usr_input, true_val)) + +def check2D(func_name, usr_input, true_val): + if usr_input != true_val: + raise Exception("Function {} received positions of dimension {}expects a numpy array of dimensions \ + [no. of vertices x {}] as positions input".format(func_name, usr_input, true_val)) \ No newline at end of file diff --git a/precice.pyx b/precice.pyx index 07573077..3b5c28df 100644 --- a/precice.pyx +++ b/precice.pyx @@ -9,6 +9,7 @@ import numpy as np cimport numpy as np cimport cython from mpi4py import MPI +from error_handling import check1D, check2D from cpython.version cimport PY_MAJOR_VERSION # important for determining python version in order to properly normalize string input. See http://docs.cython.org/en/latest/src/tutorial/strings.html#general-notes-about-c-strings and https://github.com/precice/precice/issues/68 . From 7b6414aae5b066792348849bbc2e1942e8ab2f5e Mon Sep 17 00:00:00 2001 From: BenjaminRueth Date: Tue, 11 Feb 2020 18:47:48 +0100 Subject: [PATCH 2/7] Apply changes from https://github.com/precice/precice/pull/547 --- precice.pyx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/precice.pyx b/precice.pyx index 6ae028b8..af525fa7 100644 --- a/precice.pyx +++ b/precice.pyx @@ -448,7 +448,7 @@ cdef class Interface: if not isinstance(position, np.ndarray): position = np.asarray(position) dimensions = position.size - assert(dimensions == self.get_dimensions()) + check1D("set_mesh_vertex", dimensions, self.get_dimensions()) cdef np.ndarray[double, ndim=1] _position = np.ascontiguousarray(position, dtype=np.double) vertex_id = self.thisptr.setMeshVertex(mesh_id, _position.data) return vertex_id @@ -518,7 +518,7 @@ cdef class Interface: if not isinstance(positions, np.ndarray): positions = np.asarray(positions) size, dimensions = positions.shape - assert(dimensions == self.get_dimensions()) + check2D("set_mesh_vertices", dimensions, self.get_dimensions()) cdef np.ndarray[double, ndim=1] _positions = np.ascontiguousarray(positions.flatten(), dtype=np.double) cdef np.ndarray[int, ndim=1] vertex_ids = np.empty(size, dtype=np.int32) self.thisptr.setMeshVertices (mesh_id, size, _positions.data, vertex_ids.data) @@ -618,7 +618,7 @@ cdef class Interface: if not isinstance(positions, np.ndarray): positions = np.asarray(positions) size, dimensions = positions.shape - assert(dimensions == self.get_dimensions()) + check2D("get_mesh_vertex_ids_from_positions", dimensions, self.get_dimensions()) cdef np.ndarray[double, ndim=1] _positions = np.ascontiguousarray(positions.flatten(), dtype=np.double) cdef np.ndarray[int, ndim=1] vertex_ids = np.empty(int(size), dtype=np.int32) self.thisptr.getMeshVertexIDsFromPositions (mesh_id, size, _positions.data, vertex_ids.data) @@ -861,10 +861,10 @@ cdef class Interface: if not isinstance(values, np.ndarray): values = np.asarray(values) size, dimensions = values.shape - assert(dimensions == self.get_dimensions()) + check2D("write_block_vector_data", dimensions, self.get_dimensions()) cdef np.ndarray[int, ndim=1] _vertex_ids = np.ascontiguousarray(vertex_ids, dtype=np.int32) cdef np.ndarray[double, ndim=1] _values = np.ascontiguousarray(values.flatten(), dtype=np.double) - assert(size == _vertex_ids.size) + assert(size == _value_indices.size, "Function write_block_vector_data expects that number of columns in numpy array values is equal to number of value_indices provided") self.thisptr.writeBlockVectorData (data_id, size, _vertex_ids.data, _values.data) def write_vector_data (self, data_id, vertex_id, value): @@ -906,7 +906,7 @@ cdef class Interface: if not isinstance(value, np.ndarray): value = np.asarray(value) dimensions = value.size - assert(dimensions == self.get_dimensions()) + check1D("write_vector_data", dimensions, self.get_dimensions()) cdef np.ndarray[np.double_t, ndim=1] _value = np.ascontiguousarray(value, dtype=np.double) self.thisptr.writeVectorData (data_id, vertex_id, _value.data) @@ -940,7 +940,7 @@ cdef class Interface: """ cdef np.ndarray[int, ndim=1] _vertex_ids = np.ascontiguousarray(vertex_ids, dtype=np.int32) cdef np.ndarray[double, ndim=1] _values = np.ascontiguousarray(values, dtype=np.double) - assert(_values.size == _vertex_ids.size) + check2D("write_block_scalar_data", _values.size, _vertex_ids.size) size = vertex_ids.size self.thisptr.writeBlockScalarData (data_id, size, _vertex_ids.data, _values.data) From 8cd7c38da7527fd66159f525ee961a11c11defd7 Mon Sep 17 00:00:00 2001 From: BenjaminRueth Date: Wed, 12 Feb 2020 10:24:45 +0100 Subject: [PATCH 3/7] fix typo --- precice.pyx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/precice.pyx b/precice.pyx index af525fa7..5faf4c17 100644 --- a/precice.pyx +++ b/precice.pyx @@ -864,7 +864,7 @@ cdef class Interface: check2D("write_block_vector_data", dimensions, self.get_dimensions()) cdef np.ndarray[int, ndim=1] _vertex_ids = np.ascontiguousarray(vertex_ids, dtype=np.int32) cdef np.ndarray[double, ndim=1] _values = np.ascontiguousarray(values.flatten(), dtype=np.double) - assert(size == _value_indices.size, "Function write_block_vector_data expects that number of columns in numpy array values is equal to number of value_indices provided") + assert(size == _vertex_ids.size, "Function write_block_vector_data expects that number of columns in numpy array values is equal to number of value_indices provided") self.thisptr.writeBlockVectorData (data_id, size, _vertex_ids.data, _values.data) def write_vector_data (self, data_id, vertex_id, value): From 55cc1bdf67be15de6aad10981494d334e18e2829 Mon Sep 17 00:00:00 2001 From: Ishaan Desai Date: Tue, 23 Mar 2021 09:36:49 +0100 Subject: [PATCH 4/7] Adding error messages to check dimensions --- cyprecice/cyprecice.pyx | 10 +++++----- error_handling.py | 15 --------------- 2 files changed, 5 insertions(+), 20 deletions(-) delete mode 100644 error_handling.py diff --git a/cyprecice/cyprecice.pyx b/cyprecice/cyprecice.pyx index 9535eded..b55a5a01 100644 --- a/cyprecice/cyprecice.pyx +++ b/cyprecice/cyprecice.pyx @@ -454,7 +454,7 @@ cdef class Interface: if len(position) > 0: dimensions = len(position) - assert(dimensions == self.get_dimensions()) + assert dimensions == self.get_dimensions(), "Dimensions of vertex coordinate in set_mesh_vertex does not match with dimensions in problem definition" elif len(position) == 0: dimensions = self.get_dimensions() @@ -531,7 +531,7 @@ cdef class Interface: if len(positions) > 0: size, dimensions = positions.shape - assert(dimensions == self.get_dimensions()) + assert dimensions == self.get_dimensions(), "Dimensions of vertex coordinates in set_mesh_vertices does not match with dimensions in problem definition" elif len(positions) == 0: size = positions.shape[0] dimensions = self.get_dimensions() @@ -641,7 +641,7 @@ cdef class Interface: if len(positions) > 0: size, dimensions = positions.shape - assert(dimensions == self.get_dimensions()) + assert dimensions == self.get_dimensions(), "Dimensions of position coordinates in get_mesh_vertex_ids_from_positions does not match with dimensions in problem definition" elif len(positions) == 0: size = positions.shape[0] dimensions = self.get_dimensions() @@ -893,7 +893,7 @@ cdef class Interface: if len(values) > 0: size, dimensions = values.shape - assert(dimensions == self.get_dimensions()) + assert dimensions == self.get_dimensions(), "Dimensions of vector data in write_block_vector_data does not match with dimensions in problem definition" if len(values) == 0: size = 0 @@ -946,7 +946,7 @@ cdef class Interface: assert(len(value) > 0) dimensions = len(value) - assert(dimensions == self.get_dimensions()) + assert dimensions == self.get_dimensions(), "Dimensions of vector data in write_vector_data does not match with dimensions in problem definition" cdef np.ndarray[np.double_t, ndim=1] _value = np.ascontiguousarray(value, dtype=np.double) self.thisptr.writeVectorData (data_id, vertex_id, _value.data) diff --git a/error_handling.py b/error_handling.py deleted file mode 100644 index e4e0cc6a..00000000 --- a/error_handling.py +++ /dev/null @@ -1,15 +0,0 @@ -""" -Functions to check the type of input argument against what is expected -and raise an Exception if mismatch found -""" - - -def check1D(func_name, usr_input, true_val): - if usr_input != true_val: - raise Exception("Function {} received position of type {} but expects a 1D numpy \ - array with {} values as position input".format(func_name, usr_input, true_val)) - -def check2D(func_name, usr_input, true_val): - if usr_input != true_val: - raise Exception("Function {} received positions of dimension {}expects a numpy array of dimensions \ - [no. of vertices x {}] as positions input".format(func_name, usr_input, true_val)) \ No newline at end of file From 4e6299b7a02274eef96cd76910fee567467e5eb8 Mon Sep 17 00:00:00 2001 From: Ishaan Desai Date: Tue, 23 Mar 2021 09:40:27 +0100 Subject: [PATCH 5/7] Remove old import statement --- cyprecice/cyprecice.pyx | 1 - 1 file changed, 1 deletion(-) diff --git a/cyprecice/cyprecice.pyx b/cyprecice/cyprecice.pyx index b55a5a01..855c5b41 100644 --- a/cyprecice/cyprecice.pyx +++ b/cyprecice/cyprecice.pyx @@ -8,7 +8,6 @@ The python module precice offers python language bindings to the C++ coupling li cimport cyprecice import numpy as np from mpi4py import MPI -from error_handling import check1D, check2D from cpython.version cimport PY_MAJOR_VERSION # important for determining python version in order to properly normalize string input. See http://docs.cython.org/en/latest/src/tutorial/strings.html#general-notes-about-c-strings and https://github.com/precice/precice/issues/68 . From fbd90473f5bd95953c305e2827c02bf5e1b28a80 Mon Sep 17 00:00:00 2001 From: Ishaan Desai Date: Tue, 23 Mar 2021 10:31:30 +0100 Subject: [PATCH 6/7] Adding error messages to check length of values and vertex id arrays provided for write commands --- cyprecice/cyprecice.pyx | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/cyprecice/cyprecice.pyx b/cyprecice/cyprecice.pyx index 855c5b41..4395a37f 100644 --- a/cyprecice/cyprecice.pyx +++ b/cyprecice/cyprecice.pyx @@ -899,8 +899,8 @@ cdef class Interface: cdef np.ndarray[int, ndim=1] _vertex_ids = np.ascontiguousarray(vertex_ids, dtype=np.int32) cdef np.ndarray[double, ndim=1] _values = np.ascontiguousarray(values.flatten(), dtype=np.double) - assert(_values.size == size * self.get_dimensions()) - assert(_vertex_ids.size == size) + assert _values.size == size * self.get_dimensions(), "Vector data is not provided for all vertices in write_block_vector_data. Check length of input data provided." + assert _vertex_ids.size == size, "Vertex IDs are of incorrect length in write_block_vector_data. Check length of vertex ids input" self.thisptr.writeBlockVectorData (data_id, size, _vertex_ids.data, _values.data) @@ -941,12 +941,14 @@ cdef class Interface: >>> interface.write_vector_data(data_id, vertex_id, value) """ check_array_like(value, "value", "write_vector_data") - - assert(len(value) > 0) + assert len(value) > 0, "Input vector data is empty in write_vector_data" dimensions = len(value) + assert dimensions == self.get_dimensions(), "Dimensions of vector data in write_vector_data does not match with dimensions in problem definition" + cdef np.ndarray[np.double_t, ndim=1] _value = np.ascontiguousarray(value, dtype=np.double) + self.thisptr.writeVectorData (data_id, vertex_id, _value.data) def write_block_scalar_data (self, data_id, vertex_ids, values): @@ -986,12 +988,11 @@ cdef class Interface: if len(values) == 0: size = 0 - cdef np.ndarray[int, ndim=1] _vertex_ids = np.ascontiguousarray(vertex_ids, dtype=np.int32) cdef np.ndarray[double, ndim=1] _values = np.ascontiguousarray(values, dtype=np.double) - assert(_values.size == size) - assert(_vertex_ids.size == size) + assert _values.size == size, "Scalar data is not provided for all vertices in write_block_scalar_data. Check length of input data provided" + assert _vertex_ids.size == size, "Vertex IDs are of incorrect length in write_block_scalar_data. Check length of vertex ids input" self.thisptr.writeBlockScalarData (data_id, size, _vertex_ids.data, _values.data) From d52ca11eee8dde7ad36825dd34c3dae607157d38 Mon Sep 17 00:00:00 2001 From: Ishaan Desai Date: Tue, 23 Mar 2021 17:12:28 +0100 Subject: [PATCH 7/7] Adding provided and expected values in assertion statements --- cyprecice/cyprecice.pyx | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/cyprecice/cyprecice.pyx b/cyprecice/cyprecice.pyx index 4395a37f..0c48fd88 100644 --- a/cyprecice/cyprecice.pyx +++ b/cyprecice/cyprecice.pyx @@ -453,7 +453,7 @@ cdef class Interface: if len(position) > 0: dimensions = len(position) - assert dimensions == self.get_dimensions(), "Dimensions of vertex coordinate in set_mesh_vertex does not match with dimensions in problem definition" + assert dimensions == self.get_dimensions(), "Dimensions of vertex coordinate in set_mesh_vertex does not match with dimensions in problem definition. Provided dimensions: {}, expected dimensions: {}".format(dimensions, self.get_dimensions()) elif len(position) == 0: dimensions = self.get_dimensions() @@ -530,7 +530,7 @@ cdef class Interface: if len(positions) > 0: size, dimensions = positions.shape - assert dimensions == self.get_dimensions(), "Dimensions of vertex coordinates in set_mesh_vertices does not match with dimensions in problem definition" + assert dimensions == self.get_dimensions(), "Dimensions of vertex coordinates in set_mesh_vertices does not match with dimensions in problem definition. Provided dimensions: {}, expected dimensions: {}".format(dimensions, self.get_dimensions()) elif len(positions) == 0: size = positions.shape[0] dimensions = self.get_dimensions() @@ -640,7 +640,7 @@ cdef class Interface: if len(positions) > 0: size, dimensions = positions.shape - assert dimensions == self.get_dimensions(), "Dimensions of position coordinates in get_mesh_vertex_ids_from_positions does not match with dimensions in problem definition" + assert dimensions == self.get_dimensions(), "Dimensions of position coordinates in get_mesh_vertex_ids_from_positions does not match with dimensions in problem definition. Provided dimensions: {}, expected dimensions: {}".format(dimensions, self.get_dimensions()) elif len(positions) == 0: size = positions.shape[0] dimensions = self.get_dimensions() @@ -892,15 +892,15 @@ cdef class Interface: if len(values) > 0: size, dimensions = values.shape - assert dimensions == self.get_dimensions(), "Dimensions of vector data in write_block_vector_data does not match with dimensions in problem definition" + assert dimensions == self.get_dimensions(), "Dimensions of vector data in write_block_vector_data does not match with dimensions in problem definition. Provided dimensions: {}, expected dimensions: {}".format(dimensions, self.get_dimensions()) if len(values) == 0: size = 0 cdef np.ndarray[int, ndim=1] _vertex_ids = np.ascontiguousarray(vertex_ids, dtype=np.int32) cdef np.ndarray[double, ndim=1] _values = np.ascontiguousarray(values.flatten(), dtype=np.double) - assert _values.size == size * self.get_dimensions(), "Vector data is not provided for all vertices in write_block_vector_data. Check length of input data provided." - assert _vertex_ids.size == size, "Vertex IDs are of incorrect length in write_block_vector_data. Check length of vertex ids input" + assert _values.size == size * self.get_dimensions(), "Vector data is not provided for all vertices in write_block_vector_data. Check length of input data provided. Provided size: {}, expected size: {}".format(_values.size, size * self.get_dimensions()) + assert _vertex_ids.size == size, "Vertex IDs are of incorrect length in write_block_vector_data. Check length of vertex ids input. Provided size: {}, expected size: {}".format(_vertex_ids.size, size) self.thisptr.writeBlockVectorData (data_id, size, _vertex_ids.data, _values.data) @@ -944,8 +944,8 @@ cdef class Interface: assert len(value) > 0, "Input vector data is empty in write_vector_data" dimensions = len(value) - - assert dimensions == self.get_dimensions(), "Dimensions of vector data in write_vector_data does not match with dimensions in problem definition" + + assert dimensions == self.get_dimensions(), "Dimensions of vector data in write_vector_data does not match with dimensions in problem definition. Provided dimensions: {}, expected dimensions: {}".format(dimensions, self.get_dimensions()) cdef np.ndarray[np.double_t, ndim=1] _value = np.ascontiguousarray(value, dtype=np.double) @@ -991,9 +991,8 @@ cdef class Interface: cdef np.ndarray[int, ndim=1] _vertex_ids = np.ascontiguousarray(vertex_ids, dtype=np.int32) cdef np.ndarray[double, ndim=1] _values = np.ascontiguousarray(values, dtype=np.double) - assert _values.size == size, "Scalar data is not provided for all vertices in write_block_scalar_data. Check length of input data provided" - assert _vertex_ids.size == size, "Vertex IDs are of incorrect length in write_block_scalar_data. Check length of vertex ids input" - + assert _values.size == size, "Scalar data is not provided for all vertices in write_block_scalar_data. Check size of input data provided. Provided size: {}, expected size: {}".format(_values.size, size) + assert _vertex_ids.size == size, "Vertex IDs are of incorrect length in write_block_scalar_data. Check size of vertex ids input. Provided size: {}, expected size: {}".format(_vertex_ids.size, size) self.thisptr.writeBlockScalarData (data_id, size, _vertex_ids.data, _values.data) def write_scalar_data (self, data_id, vertex_id, double value):