From a42b93da86db2b4a852af6500b976ceb1fd2e2ca Mon Sep 17 00:00:00 2001 From: Paolo Veglio <paolo.veglio@ssec.wisc.edu> Date: Wed, 24 Jan 2024 17:27:01 +0000 Subject: [PATCH] solve issue with fixed size of arrays that determine granule size --- mvcm/ancillary.pyx | 24 +++++++++++++----------- mvcm/c_tools/assign_geos_vals.c | 6 +++--- mvcm/c_tools/get_GEOS.c | 10 +++++----- mvcm/c_tools/get_NDVI_background.c | 6 +++--- mvcm/c_tools/get_Reynolds_SST.c | 6 +++--- mvcm/read_data.py | 6 ++++++ 6 files changed, 33 insertions(+), 25 deletions(-) diff --git a/mvcm/ancillary.pyx b/mvcm/ancillary.pyx index feebea2..7cd7f3c 100644 --- a/mvcm/ancillary.pyx +++ b/mvcm/ancillary.pyx @@ -1,10 +1,10 @@ # cython: language_level=3 # cython: c_string_Type=unicode, c_string_encoding=utf8 -cdef extern void get_Reynolds_SST(float *, float *, int, char *, char *, float *) -cdef extern void get_NDVI_background(float *, float *, int, char *, char *, float *) +cdef extern void get_Reynolds_SST(float *, float *, int, int, int, char *, char *, float *) +cdef extern void get_NDVI_background(float *, float *, int, int, int, char *, char *, float *) cdef extern void get_Olson_eco(float *, float *, int, int, int, char *, unsigned char *) -cdef extern void get_GEOS(float *, float *, int, char *, char *, char *, char *, char *, char *, char *, +cdef extern void get_GEOS(float *, float *, int, int, int, char *, char *, char *, char *, char *, char *, char *, float *, float *, float *, float *, float *, float *) cdef extern void snow_mask(char *, unsigned char) cdef extern float cithr(int, float, float) @@ -27,7 +27,8 @@ DTYPE = np.float32 @cython.wraparound(False) @cython.initializedcheck(False) def py_get_Reynolds_SST(np.ndarray[float, ndim=1] lat, - np.ndarray[float, ndim=1] lon, res, + np.ndarray[float, ndim=1] lon, + n_eles, n_lines, res, char *anc_dir, char *sst_file, sst): # cdef np.ndarray sst = np.zeros((3232*3200, ), order='C', dtype=np.float32) @@ -36,7 +37,7 @@ def py_get_Reynolds_SST(np.ndarray[float, ndim=1] lat, cdef float[::1] sst_mv = sst - get_Reynolds_SST(&lat[0], &lon[0], res, anc_dir, sst_file, &sst_mv[0]) + get_Reynolds_SST(&lat[0], &lon[0],n_eles, n_lines, res, anc_dir, sst_file, &sst_mv[0]) return sst @@ -45,7 +46,8 @@ def py_get_Reynolds_SST(np.ndarray[float, ndim=1] lat, @cython.wraparound(False) @cython.initializedcheck(False) def py_get_NDVI_background(np.ndarray[float, ndim=1] lat, - np.ndarray[float, ndim=1] lon, res, + np.ndarray[float, ndim=1] lon, + n_eles, n_lines, res, char *anc_dir, char *ndvi_file, ndvi): if not ndvi.flags['C_CONTIGUOUS']: @@ -53,7 +55,7 @@ def py_get_NDVI_background(np.ndarray[float, ndim=1] lat, cdef float[::1] ndvi_mv = ndvi - get_NDVI_background(&lat[0], &lon[0], res, anc_dir, ndvi_file, &ndvi_mv[0]) + get_NDVI_background(&lat[0], &lon[0], n_eles, n_lines, res, anc_dir, ndvi_file, &ndvi_mv[0]) return ndvi @@ -79,9 +81,9 @@ def py_get_Olson_eco(np.ndarray[float, ndim=1] lat, @cython.boundscheck(False) @cython.wraparound(False) @cython.initializedcheck(False) -def py_get_GEOS(np.ndarray[float, ndim=1] lat, np.ndarray[float, ndim=1] lon, int res, char *startTime, - char *anc_dir, char *geos1, char *geos2, char *geos_lnd, char *geos_ocn, char *geos_cnst, - geos_data): +def py_get_GEOS(np.ndarray[float, ndim=1] lat, np.ndarray[float, ndim=1] lon, int n_eles, int n_lines, int res, + char *startTime, char *anc_dir, char *geos1, char *geos2, + char *geos_lnd, char *geos_ocn, char *geos_cnst, geos_data): for v in geos_data: if not geos_data[v].flags['C_CONTIGUOUS']: @@ -94,7 +96,7 @@ def py_get_GEOS(np.ndarray[float, ndim=1] lat, np.ndarray[float, ndim=1] lon, in cdef float[::1] landicefr_mv = geos_data['land_ice_fraction'] cdef float[::1] sfct_mv = geos_data['surface_temperature'] - get_GEOS(&lat[0], &lon[0], res, startTime, anc_dir, geos1, geos2, geos_lnd, geos_ocn, geos_cnst, + get_GEOS(&lat[0], &lon[0], n_eles, n_lines, res, startTime, anc_dir, geos1, geos2, geos_lnd, geos_ocn, geos_cnst, &tpw_mv[0], &snowfr_mv[0], &icefr_mv[0], &ocnfr_mv[0], &landicefr_mv[0], &sfct_mv[0]) geos_dict = {'tpw': geos_data['tpw'], diff --git a/mvcm/c_tools/assign_geos_vals.c b/mvcm/c_tools/assign_geos_vals.c index 4648c19..8ceabd2 100644 --- a/mvcm/c_tools/assign_geos_vals.c +++ b/mvcm/c_tools/assign_geos_vals.c @@ -43,7 +43,7 @@ Calls: /******************************************************************************/ -int assign_geos_vals(float *lat, float *lon, int res) +int assign_geos_vals(float *lat, float *lon, int n_eles, int n_lines, int res) { @@ -53,8 +53,8 @@ int assign_geos_vals(float *lat, float *lon, int res) extern double fabs(double); - const int eles=3200*res; - const int lines=3232*res; + const int eles=n_eles*res; + const int lines=n_lines*res; int row, col; int i, j, ij, i1, i2, j1, j2, ic, jc; diff --git a/mvcm/c_tools/get_GEOS.c b/mvcm/c_tools/get_GEOS.c index 9f84b86..e1e8c57 100644 --- a/mvcm/c_tools/get_GEOS.c +++ b/mvcm/c_tools/get_GEOS.c @@ -56,7 +56,7 @@ Comments: /******************************************************************************/ -void get_GEOS(float *lat, float *lon, int res, char *granule_start_time, char *anc_dir, char *geos1, char *geos2, char *geos_lnd, +void get_GEOS(float *lat, float *lon, int n_eles, int n_lines, int res, char *granule_start_time, char *anc_dir, char *geos1, char *geos2, char *geos_lnd, char *geos_ocn, char *geos_cnst, float *tpw, float *snowfr, float *icefr, float *geos_ocnfr, float *landicefr, float *sfct) @@ -70,13 +70,13 @@ void get_GEOS(float *lat, float *lon, int res, char *granule_start_time, char *a extern int get_geos_times(char[64], char[64], int*, int*); extern int get_ti_weights(float, int, int, float*); extern int get_ti_vars(float); - extern int assign_geos_vals(float *, float *, int); + extern int assign_geos_vals(float *, float *, int, int, int); extern int read_GEOS(char[256], int); extern int read_GEOS_lndocn(char[256], char[256]); extern int read_GEOS_constants(char[256]); - const int eles=3200*res; - const int lines=3232*res; + const int eles=n_eles*res; + const int lines=n_lines*res; char geos1_wpath[256]; char geos2_wpath[256]; @@ -181,7 +181,7 @@ void get_GEOS(float *lat, float *lon, int res, char *granule_start_time, char *a // Assign GEOS variable values to each pixel location in the input L1b granule. // Also spatially interpolates GEOS values to pixel locations if desired. // Pointers to inputs and outputs are stored in ancillary.h. - irt = assign_geos_vals(lat, lon, res); + irt = assign_geos_vals(lat, lon, n_eles, n_lines, res); /******************************************************************************/ diff --git a/mvcm/c_tools/get_NDVI_background.c b/mvcm/c_tools/get_NDVI_background.c index 1a2b28b..5a0c054 100644 --- a/mvcm/c_tools/get_NDVI_background.c +++ b/mvcm/c_tools/get_NDVI_background.c @@ -44,7 +44,7 @@ Calls: /******************************************************************************/ -void get_NDVI_background(float *lat, float *lon, int res, char *anc_dir, char *NDVI_file, float *g_ndvi_background) +void get_NDVI_background(float *lat, float *lon, int n_eles, int n_lines, int res, char *anc_dir, char *NDVI_file, float *g_ndvi_background) { @@ -71,8 +71,8 @@ void get_NDVI_background(float *lat, float *lon, int res, char *anc_dir, char *N int16 *ndvi_arr; int fnday[23] = {1, 17, 33, 49, 65, 81, 97, 113, 129, 145, 161, 177, 193, 209, 225, 241, 257, 273, 289, 305, 321, 337, 353}; - const int eles=3200*res; - const int lines=3232*res; + const int eles=n_eles*res; + const int lines=n_lines*res; int return_code = 0; diff --git a/mvcm/c_tools/get_Reynolds_SST.c b/mvcm/c_tools/get_Reynolds_SST.c index b288e6f..5af9e8a 100644 --- a/mvcm/c_tools/get_Reynolds_SST.c +++ b/mvcm/c_tools/get_Reynolds_SST.c @@ -38,7 +38,7 @@ Calls: /******************************************************************************/ -void get_Reynolds_SST(float *lat, float *lon, int res, char *anc_dir, char *SST_file, float *sstInterp) +void get_Reynolds_SST(float *lat, float *lon, int n_eles, int n_lines, int res, char *anc_dir, char *SST_file, float *sstInterp) { @@ -70,8 +70,8 @@ void get_Reynolds_SST(float *lat, float *lon, int res, char *anc_dir, char *SST_ int i, j, xindx, yindx; int ok; - const int eles=3200*res; - const int lines=3232*res; + const int eles=n_eles*res; + const int lines=n_lines*res; FILE * sst_file_ptr; size_t bytes_read; diff --git a/mvcm/read_data.py b/mvcm/read_data.py index 9cd914f..3927307 100644 --- a/mvcm/read_data.py +++ b/mvcm/read_data.py @@ -589,6 +589,8 @@ class ReadAncillary(CollectInputs): sst = anc.py_get_Reynolds_SST( self.latitude.ravel(), self.longitude.ravel(), + self.latitude.shape[0], + self.latitude.shape[1], self.resolution, self.ancillary_dir, self.sst_file, @@ -615,6 +617,8 @@ class ReadAncillary(CollectInputs): ndvi = anc.py_get_NDVI_background( self.latitude.ravel(), self.longitude.ravel(), + self.latitude.shape[0], + self.latitude.shape[1], self.resolution, self.ancillary_dir, self.ndvi_file, @@ -687,6 +691,8 @@ class ReadAncillary(CollectInputs): geos_data = anc.py_get_GEOS( self.latitude.ravel(), self.longitude.ravel(), + self.latitude.shape[0], + self.latitude.shape[1], self.resolution, self.get_granule_time(), self.ancillary_dir, -- GitLab