@@ -9,6 +9,8 @@ extern "C" {
99#include <math.h>
1010
1111#define CHECKSTATUS (res ) do {if (res != SUCCESS) return res;} while (0)
12+ #define rtol 1.e-5
13+ #define atol 1.e-8
1214
1315#ifdef DOUBLE_COORD_VARIABLES
1416typedef double type_coord ;
@@ -56,6 +58,44 @@ typedef enum
5658 RECTILINEAR_Z_GRID = 0 , RECTILINEAR_S_GRID = 1 , CURVILINEAR_Z_GRID = 2 , CURVILINEAR_S_GRID = 3
5759 } GridCode ;
5860
61+ // equal/closeness comparison that is equal to numpy (double)
62+ static inline bool is_close_dbl (double a , double b ) {
63+ return (fabs (a - b ) <= (atol + rtol * fabs (b )));
64+ }
65+
66+ // customisable equal/closeness comparison (double)
67+ static inline bool is_close_dbl_tol (double a , double b , double tolerance ) {
68+ return (fabs (a - b ) <= (tolerance + fabs (b )));
69+ }
70+
71+ // numerically accurate equal/closeness comparison (double)
72+ static inline bool is_equal_dbl (double a , double b ) {
73+ return (fabs (a - b ) <= (DBL_EPSILON * fabs (b )));
74+ }
75+
76+ // customisable equal/closeness comparison (float)
77+ static inline bool is_close_flt_tol (float a , float b , float tolerance ) {
78+ return (fabs (a - b ) <= (tolerance + fabs (b )));
79+ }
80+
81+ // equal/closeness comparison that is equal to numpy (float)
82+ static inline bool is_close_flt (float a , float b ) {
83+ return (fabs (a - b ) <= ((float )(atol ) + (float )(rtol ) * fabs (b )));
84+ }
85+
86+ // numerically accurate equal/closeness comparison (float)
87+ static inline bool is_equal_flt (float a , float b ) {
88+ return (fabs (a - b ) <= (FLT_EPSILON * fabs (b )));
89+ }
90+
91+ static inline bool is_zero_dbl (double a ) {
92+ return (fabs (a ) <= DBL_EPSILON * fabs (a ));
93+ }
94+
95+ static inline bool is_zero_flt (float a ) {
96+ return (fabs (a ) <= FLT_EPSILON * fabs (a ));
97+ }
98+
5999static inline StatusCode search_indices_vertical_z (type_coord z , int zdim , float * zvals , int * zi , double * zeta , int gridindexingtype )
60100{
61101 if (zvals [zdim - 1 ] > zvals [0 ]){
@@ -260,6 +300,13 @@ static inline StatusCode search_indices_rectilinear(type_coord x, type_coord y,
260300 else
261301 * zeta = 0 ;
262302
303+ if ( (* xsi < 0 ) && (is_zero_dbl (* xsi )) ) {* xsi = 0. ;}
304+ if ( (* xsi > 1 ) && (is_close_dbl (* xsi , 1. )) ) {* xsi = 1. ;}
305+ if ( (* eta < 0 ) && (is_zero_dbl (* eta )) ) {* eta = 0. ;}
306+ if ( (* eta > 1 ) && (is_close_dbl (* eta , 1. )) ) {* eta = 1. ;}
307+ if ( (* zeta < 0 ) && (is_zero_dbl (* zeta )) ) {* zeta = 0. ;}
308+ if ( (* zeta > 1 ) && (is_close_dbl (* zeta , 1. )) ) {* zeta = 1. ;}
309+
263310 if ( (* xsi < 0 ) || (* xsi > 1 ) ) return ERROR_INTERPOLATION ;
264311 if ( (* eta < 0 ) || (* eta > 1 ) ) return ERROR_INTERPOLATION ;
265312 if ( (* zeta < 0 ) || (* zeta > 1 ) ) return ERROR_INTERPOLATION ;
0 commit comments