From cb51be4987d4dab8a6e0d1f52a18718af7963f8a Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Wed, 5 Mar 2025 11:28:39 -0500 Subject: [PATCH 01/27] Added pyfms_diag_manager --- pyfms/diag_manager/pyfms_diag_manager.py | 73 ++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 pyfms/diag_manager/pyfms_diag_manager.py diff --git a/pyfms/diag_manager/pyfms_diag_manager.py b/pyfms/diag_manager/pyfms_diag_manager.py new file mode 100644 index 0000000..eca0814 --- /dev/null +++ b/pyfms/diag_manager/pyfms_diag_manager.py @@ -0,0 +1,73 @@ +import ctypes +from typing import Optional + +import numpy as np +from numpy.typing import NDArray + +from pyfms.pyfms_data_handling import( + setarray_Cint32, + setscalar_Cint32, + set_Cchar, +) + +class pyFMS_diag_manager: + + def __init__(self, clibFMS: ctypes.CDLL = None): + self.clibFMS = clibFMS + + def diag_init( + self, + diag_model_subset: Optional[int] = None, + time_init: Optional[NDArray] = None, + calendar_type: Optional[int] = None, + ) -> str: + err_msg = "" + + _cfms_diag_init = self.clibFMS.cFMS_diag_init + + diag_model_subset_c, diag_model_subset_t = setscalar_Cint32(diag_model_subset) + time_init_p, time_init_t = setarray_Cint32(time_init) + calendar_type_c, calendar_type_t = setscalar_Cint32(calendar_type) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_init.argtypes = [ + diag_model_subset_t, + time_init_t, + calendar_type_t, + err_msg_t, + ] + _cfms_diag_init.restype = None + + _cfms_diag_init( + diag_model_subset_c, + time_init_p, + calendar_type_c, + err_msg_c + ) + + return err_msg_c.value.decode('utf-8') + + def diag_set_field_init_time( + self, + seconds: Optional[int] = None, + days: Optional[int] = None, + ticks: Optional[int] = None, + ): + _cfms_diag_set_field_init_time = self.clibFMS.cFMS_diag_set_field_init_time + + seconds_c, seconds_t = setscalar_Cint32(seconds) + days_c, days_t = setscalar_Cint32(days) + ticks_c, ticks_t = setscalar_Cint32(ticks) + + _cfms_diag_set_field_init_time.argtypes = [ + seconds_t, + days_t, + ticks_t, + ] + _cfms_diag_set_field_init_time.restype = None + + _cfms_diag_set_field_init_time( + seconds_c, + days_t, + ticks_t + ) From dea232f6c165dde5afe034fb5b250061ae912870 Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Thu, 6 Mar 2025 14:27:43 -0500 Subject: [PATCH 02/27] Added public level diag_manager methods as of 14:27 6 March 2025 --- pyfms/diag_manager/pyfms_diag_manager.py | 169 +++++++++++++++++++++-- 1 file changed, 155 insertions(+), 14 deletions(-) diff --git a/pyfms/diag_manager/pyfms_diag_manager.py b/pyfms/diag_manager/pyfms_diag_manager.py index eca0814..27e06d2 100644 --- a/pyfms/diag_manager/pyfms_diag_manager.py +++ b/pyfms/diag_manager/pyfms_diag_manager.py @@ -47,27 +47,168 @@ def diag_init( return err_msg_c.value.decode('utf-8') + def diag_send_complete( + self, + diag_field_id: int, + ) -> str: + err_msg = "" + + _cfms_diag_send_complete = self.clibFMS.CFMS_diag_send_complete + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_complete.argtypes = [ + diag_field_id_t, + err_msg_t + ] + _cfms_diag_send_complete.restype = None + + _cfms_diag_send_complete(diag_field_id_c, err_msg_c) + + return err_msg_c.value.decode('utf-8') + def diag_set_field_init_time( - self, - seconds: Optional[int] = None, - days: Optional[int] = None, - ticks: Optional[int] = None, - ): + self, + year: int, + month: int, + day: int, + hour: int, + minute: int, + second: Optional[int], + tick: Optional[int], + ) -> str: + err_msg = "" + _cfms_diag_set_field_init_time = self.clibFMS.cFMS_diag_set_field_init_time - seconds_c, seconds_t = setscalar_Cint32(seconds) - days_c, days_t = setscalar_Cint32(days) - ticks_c, ticks_t = setscalar_Cint32(ticks) + year_c, year_t = setscalar_Cint32(year) + month_c, month_t = setscalar_Cint32(month) + day_c, day_t = setscalar_Cint32(day) + hour_c, hour_t = setscalar_Cint32(hour) + minute_c, minute_t = setscalar_Cint32(minute) + second_c, second_t = setscalar_Cint32(second) + tick_c, tick_t = setscalar_Cint32(tick) + err_msg_c, err_msg_t = set_Cchar(err_msg) _cfms_diag_set_field_init_time.argtypes = [ - seconds_t, - days_t, - ticks_t, + year_t, + month_t, + day_t, + hour_t, + minute_t, + second_t, + tick_t, + err_msg_t, ] _cfms_diag_set_field_init_time.restype = None _cfms_diag_set_field_init_time( - seconds_c, - days_t, - ticks_t + year_c, + month_c, + day_c, + hour_c, + minute_c, + second_c, + tick_c, + err_msg_c ) + + return err_msg_c.value.decode('utf-8') + + def diag_set_field_timestep( + self, + diag_field_id: int, + dseconds: int, + ddays: Optional[int], + dticks: Optional[int], + ) -> str: + + err_msg = "" + + _cfms_diag_set_field_timestep = self.clibFMS.cFMS_diag_set_field_timestep + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + dseconds_c, dseconds_t = setscalar_Cint32(dseconds) + ddays_c, ddays_t = setscalar_Cint32(ddays) + dticks_c, dticks_t = setscalar_Cint32(dticks) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_set_field_timestep.argtypes = [ + diag_field_id_t, + dseconds_t, + ddays_t, + dticks_t, + err_msg_t, + ] + _cfms_diag_set_field_timestep.restype = None + + _cfms_diag_set_field_timestep( + diag_field_id_c, + dseconds_c, + ddays_c, + dticks_c, + err_msg_c + ) + + return err_msg_c.value.decode('utf-8') + + def diag_advance_field_time( + self, + diag_field_id: int, + ): + _cfms_diag_advance_field_time = self.clibFMS.cFMS_diag_advance_field_time + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + + _cfms_diag_advance_field_time.argtypes = [diag_field_id_t] + _cfms_diag_advance_field_time.restype = None + + _cfms_diag_advance_field_time(diag_field_id_c) + + def diag_set_time_end( + self, + year: Optional[int], + month: Optional[int], + day: Optional[int], + hour: Optional[int], + minute: Optional[int], + second: Optional[int], + tick: Optional[int], + err_msg: Optional[str], + ): + _cfms_set_time_end = self.clibFMS.diag_set_time_end + + year_c, year_t = setscalar_Cint32(year) + month_c, month_t = setscalar_Cint32(month) + day_c, day_t = setscalar_Cint32(day) + hour_c, hour_t = setscalar_Cint32(hour) + minute_c, minute_t = setscalar_Cint32(minute) + second_c, second_t = setscalar_Cint32(second) + tick_c, tick_t = setscalar_Cint32(tick) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_set_time_end.argtypes = [ + year_t, + month_t, + day_t, + hour_t, + minute_t, + second_t, + tick_t, + err_msg_t, + ] + _cfms_set_time_end.restype = None + + _cfms_set_time_end( + year_c, + month_c, + day_c, + hour_c, + minute_c, + second_c, + tick_c, + err_msg_c, + ) + + From 452151fe3cdccff9a284fab9f1efb29fcbb46325 Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Wed, 12 Mar 2025 10:59:59 -0400 Subject: [PATCH 03/27] Added in most recent additions to cFMS and cFMS/c_diag_manager --- cFMS | 2 +- pyfms/diag_manager/pyfms_diag_manager.py | 841 +++++++++++++++++++++-- 2 files changed, 775 insertions(+), 68 deletions(-) diff --git a/cFMS b/cFMS index d272fb0..754d12d 160000 --- a/cFMS +++ b/cFMS @@ -1 +1 @@ -Subproject commit d272fb0050666c32292ac8ca40e6ee00b70cd0ec +Subproject commit 754d12de9f07e786b2429fe17b23bb6213943bd3 diff --git a/pyfms/diag_manager/pyfms_diag_manager.py b/pyfms/diag_manager/pyfms_diag_manager.py index 27e06d2..870915d 100644 --- a/pyfms/diag_manager/pyfms_diag_manager.py +++ b/pyfms/diag_manager/pyfms_diag_manager.py @@ -1,25 +1,167 @@ import ctypes from typing import Optional -import numpy as np from numpy.typing import NDArray -from pyfms.pyfms_data_handling import( +from pyfms.pyfms_data_handling import ( + set_Cchar, + setarray_Cdouble, + setarray_Cfloat, setarray_Cint32, + setscalar_Cbool, + setscalar_Cdouble, + setscalar_Cfloat, setscalar_Cint32, - set_Cchar, ) + class pyFMS_diag_manager: - + def __init__(self, clibFMS: ctypes.CDLL = None): self.clibFMS = clibFMS + def diag_axis_init_cdouble( + self, + name: str, + naxis_data: int, + axis_data: NDArray, + units: str, + cart_name: str, + long_name: Optional[str] = None, + set_name: Optional[str] = None, + direction: Optional[int] = None, + edges: Optional[int] = None, + aux: Optional[str] = None, + req: Optional[str] = None, + tile_count: Optional[int] = None, + domain_position: Optional[int] = None, + ) -> int: + _cfms_diag_axis_init_cdouble = self.clibFMS.cFMS_diag_axis_init_cdouble + + name_c, name_t = set_Cchar(name) + naxis_data_c, naxis_data_t = setscalar_Cint32(naxis_data) + axis_data_p, axis_data_t = setarray_Cdouble(axis_data) + units_c, units_t = set_Cchar(units) + cart_name_c, cart_name_t = set_Cchar(cart_name) + long_name_c, long_name_t = set_Cchar(long_name) + set_name_c, set_name_t = set_Cchar(set_name) + direction_c, direction_t = setscalar_Cint32(direction) + edges_c, edges_t = setscalar_Cint32(edges) + aux_c, aux_t = set_Cchar(aux) + req_c, req_t = set_Cchar(req) + tile_count_c, tile_count_t = setscalar_Cint32(tile_count) + domain_position_c, domain_position_t = setscalar_Cint32(domain_position) + + _cfms_diag_axis_init_cdouble.argtypes = [ + name_t, + naxis_data_t, + axis_data_t, + units_t, + cart_name_t, + long_name_t, + set_name_t, + direction_t, + edges_t, + aux_t, + req_t, + tile_count_t, + domain_position_t, + ] + _cfms_diag_axis_init_cdouble.restype = ctypes.c_int + + return _cfms_diag_axis_init_cdouble( + name_c, + naxis_data_c, + axis_data_p, + units_c, + cart_name_c, + long_name_c, + set_name_c, + direction_c, + edges_c, + aux_c, + req_c, + tile_count_c, + domain_position_c, + ) + + def diag_axis_init_cfloat( + self, + name: str, + naxis_data: int, + axis_data: NDArray, + units: str, + cart_name: str, + long_name: Optional[str] = None, + set_name: Optional[str] = None, + direction: Optional[int] = None, + edges: Optional[int] = None, + aux: Optional[str] = None, + req: Optional[str] = None, + tile_count: Optional[int] = None, + domain_position: Optional[int] = None, + ) -> int: + _cfms_diag_axis_init_cfloat = self.clibFMS.cFMS_diag_axis_init_cfloat + + name_c, name_t = set_Cchar(name) + naxis_data_c, naxis_data_t = setscalar_Cint32(naxis_data) + axis_data_p, axis_data_t = setarray_Cfloat(axis_data) + units_c, units_t = set_Cchar(units) + cart_name_c, cart_name_t = set_Cchar(cart_name) + long_name_c, long_name_t = set_Cchar(long_name) + set_name_c, set_name_t = set_Cchar(set_name) + direction_c, direction_t = setscalar_Cint32(direction) + edges_c, edges_t = setscalar_Cint32(edges) + aux_c, aux_t = set_Cchar(aux) + req_c, req_t = set_Cchar(req) + tile_count_c, tile_count_t = setscalar_Cint32(tile_count) + domain_position_c, domain_position_t = setscalar_Cint32(domain_position) + + _cfms_diag_axis_init_cfloat.argtypes = [ + name_t, + naxis_data_t, + axis_data_t, + units_t, + cart_name_t, + long_name_t, + set_name_t, + direction_t, + edges_t, + aux_t, + req_t, + tile_count_t, + domain_position_t, + ] + _cfms_diag_axis_init_cfloat.restype = ctypes.c_int + + return _cfms_diag_axis_init_cfloat( + name_c, + naxis_data_c, + axis_data_p, + units_c, + cart_name_c, + long_name_c, + set_name_c, + direction_c, + edges_c, + aux_c, + req_c, + tile_count_c, + domain_position_c, + ) + + def diag_end(self): + _cfms_diag_end = self.clibFMS.cFMS_diag_end + + _cfms_diag_end.restype = None + + _cfms_diag_end() + def diag_init( - self, - diag_model_subset: Optional[int] = None, - time_init: Optional[NDArray] = None, - calendar_type: Optional[int] = None, + self, + diag_model_subset: Optional[int] = None, + time_init: Optional[NDArray] = None, + calendar_type: Optional[int] = None, ) -> str: err_msg = "" @@ -38,18 +180,13 @@ def diag_init( ] _cfms_diag_init.restype = None - _cfms_diag_init( - diag_model_subset_c, - time_init_p, - calendar_type_c, - err_msg_c - ) + _cfms_diag_init(diag_model_subset_c, time_init_p, calendar_type_c, err_msg_c) + + return err_msg_c.value.decode("utf-8") - return err_msg_c.value.decode('utf-8') - def diag_send_complete( - self, - diag_field_id: int, + self, + diag_field_id: int, ) -> str: err_msg = "" @@ -58,25 +195,54 @@ def diag_send_complete( diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) err_msg_c, err_msg_t = set_Cchar(err_msg) - _cfms_diag_send_complete.argtypes = [ - diag_field_id_t, - err_msg_t - ] + _cfms_diag_send_complete.argtypes = [diag_field_id_t, err_msg_t] _cfms_diag_send_complete.restype = None _cfms_diag_send_complete(diag_field_id_c, err_msg_c) - return err_msg_c.value.decode('utf-8') - + return err_msg_c.value.decode("utf-8") + + def diag_send_data_2d_cfloat( + self, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, + err_msg: Optional[str] = None, + ) -> bool: + + err_msg = err_msg[:128] + + _cfms_diag_send_data_2d_cfloat = self.clibFMS.cFMS_diag_send_data_2d_cfloat + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_p, field_t = setarray_Cfloat(field) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_data_2d_cfloat.argtypes = [ + diag_field_id_t, + field_shape_t, + field_t, + err_msg_t, + ] + _cfms_diag_send_data_2d_cfloat.restype = ctypes.c_bool + + return _cfms_diag_send_data_2d_cfloat( + diag_field_id_c, + field_shape_p, + field_p, + err_msg_c, + ) + def diag_set_field_init_time( - self, - year: int, - month: int, - day: int, - hour: int, - minute: int, - second: Optional[int], - tick: Optional[int], + self, + year: int, + month: int, + day: int, + hour: int, + minute: int, + second: Optional[int] = None, + tick: Optional[int] = None, ) -> str: err_msg = "" @@ -104,26 +270,19 @@ def diag_set_field_init_time( _cfms_diag_set_field_init_time.restype = None _cfms_diag_set_field_init_time( - year_c, - month_c, - day_c, - hour_c, - minute_c, - second_c, - tick_c, - err_msg_c + year_c, month_c, day_c, hour_c, minute_c, second_c, tick_c, err_msg_c ) - return err_msg_c.value.decode('utf-8') - + return err_msg_c.value.decode("utf-8") + def diag_set_field_timestep( - self, - diag_field_id: int, - dseconds: int, - ddays: Optional[int], - dticks: Optional[int], + self, + diag_field_id: int, + dseconds: int, + ddays: Optional[int], + dticks: Optional[int], ) -> str: - + err_msg = "" _cfms_diag_set_field_timestep = self.clibFMS.cFMS_diag_set_field_timestep @@ -144,18 +303,14 @@ def diag_set_field_timestep( _cfms_diag_set_field_timestep.restype = None _cfms_diag_set_field_timestep( - diag_field_id_c, - dseconds_c, - ddays_c, - dticks_c, - err_msg_c + diag_field_id_c, dseconds_c, ddays_c, dticks_c, err_msg_c ) - return err_msg_c.value.decode('utf-8') - + return err_msg_c.value.decode("utf-8") + def diag_advance_field_time( - self, - diag_field_id: int, + self, + diag_field_id: int, ): _cfms_diag_advance_field_time = self.clibFMS.cFMS_diag_advance_field_time @@ -167,16 +322,18 @@ def diag_advance_field_time( _cfms_diag_advance_field_time(diag_field_id_c) def diag_set_time_end( - self, - year: Optional[int], - month: Optional[int], - day: Optional[int], - hour: Optional[int], - minute: Optional[int], - second: Optional[int], - tick: Optional[int], - err_msg: Optional[str], + self, + year: Optional[int], + month: Optional[int], + day: Optional[int], + hour: Optional[int], + minute: Optional[int], + second: Optional[int], + tick: Optional[int], + err_msg: Optional[str], ): + err_msg = err_msg[:128] + _cfms_set_time_end = self.clibFMS.diag_set_time_end year_c, year_t = setscalar_Cint32(year) @@ -211,4 +368,554 @@ def diag_set_time_end( err_msg_c, ) - + def register_diag_field_array_cint( + self, + module_name: str, + field_name: str, + axes: Optional[NDArray] = None, + long_name: Optional[str] = None, + units: Optional[str] = None, + missing_value: Optional[int] = None, + range: Optional[NDArray] = None, + mask_variant: Optional[bool] = None, + standard_name: Optional[str] = None, + verbose: Optional[bool] = None, + do_not_log: Optional[bool] = None, + err_msg: Optional[str] = None, + interp_method: Optional[str] = None, + tile_count: Optional[int] = None, + area: Optional[int] = None, + volume: Optional[int] = None, + realm: Optional[str] = None, + multiple_send_data: Optional[bool] = None, + ) -> int: + + module_name = module_name[:64] + field_name = field_name[:64] + if long_name is not None: + long_name = long_name[:64] + if units is not None: + units = units[:64] + if standard_name is not None: + standard_name = standard_name[:64] + if err_msg is not None: + err_msg = err_msg[:64] + if interp_method is not None: + interp_method = interp_method[:64] + if realm is not None: + realm = realm[:64] + + _cfms_register_diag_field_array_cint = ( + self.clibFMS.cFMS_register_diag_field_array_cint + ) + + module_name_c, module_name_t = set_Cchar(module_name) + field_name_c, field_name_t = set_Cchar(field_name) + axes_p, axes_t = setarray_Cint32(axes) + long_name_c, long_name_t = set_Cchar(long_name) + units_c, units_t = set_Cchar(units) + missing_value_c, missing_value_t = setscalar_Cint32(missing_value) + range_p, range_t = setarray_Cint32(range) + mask_variant_c, mask_variant_t = setscalar_Cbool(mask_variant) + standard_name_c, standard_name_t = set_Cchar(standard_name) + verbose_c, verbose_t = setscalar_Cbool(verbose) + do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) + err_msg_c, err_msg_t = set_Cchar(err_msg) + interp_method_c, interp_method_t = set_Cchar(interp_method) + tile_count_c, tile_count_t = setscalar_Cint32(tile_count) + area_c, area_t = setscalar_Cint32(area) + volume_c, volume_t = setscalar_Cint32(volume) + realm_c, realm_t = set_Cchar(realm) + multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) + + _cfms_register_diag_field_array_cint.argtypes = [ + module_name_t, + field_name_t, + axes_t, + long_name_t, + units_t, + missing_value_t, + range_t, + mask_variant_t, + standard_name_t, + verbose_t, + do_not_log_t, + err_msg_t, + interp_method_t, + tile_count_t, + area_t, + volume_t, + realm_t, + multiple_send_data_t, + ] + _cfms_register_diag_field_array_cint.restype = ctypes.c_int + + return _cfms_register_diag_field_array_cint( + module_name_c, + field_name_c, + axes_p, + long_name_c, + units_c, + missing_value_c, + range_p, + mask_variant_c, + standard_name_c, + verbose_c, + do_not_log_c, + err_msg_c, + interp_method_c, + tile_count_c, + area_c, + volume_c, + realm_c, + multiple_send_data_c, + ) + + def register_diag_field_array_cdouble( + self, + module_name: str, + field_name: str, + axes: Optional[NDArray] = None, + long_name: Optional[str] = None, + units: Optional[str] = None, + missing_value: Optional[float] = None, + range: Optional[NDArray] = None, + mask_variant: Optional[bool] = None, + standard_name: Optional[str] = None, + verbose: Optional[bool] = None, + do_not_log: Optional[bool] = None, + err_msg: Optional[str] = None, + interp_method: Optional[str] = None, + tile_count: Optional[int] = None, + area: Optional[int] = None, + volume: Optional[int] = None, + realm: Optional[str] = None, + multiple_send_data: Optional[bool] = None, + ) -> int: + + module_name = module_name[:64] + field_name = field_name[:64] + if long_name is not None: + long_name = long_name[:64] + if units is not None: + units = units[:64] + if standard_name is not None: + standard_name = standard_name[:64] + if err_msg is not None: + err_msg = err_msg[:64] + if interp_method is not None: + interp_method = interp_method[:64] + if realm is not None: + realm = realm[:64] + + _cfms_register_diag_field_array_cdouble = ( + self.clibFMS.cFMS_register_diag_field_array_cdouble + ) + + module_name_c, module_name_t = set_Cchar(module_name) + field_name_c, field_name_t = set_Cchar(field_name) + axes_p, axes_t = setarray_Cint32(axes) + long_name_c, long_name_t = set_Cchar(long_name) + units_c, units_t = set_Cchar(units) + missing_value_c, missing_value_t = setscalar_Cdouble(missing_value) + range_p, range_t = setarray_Cdouble(range) + mask_variant_c, mask_variant_t = setscalar_Cbool(mask_variant) + standard_name_c, standard_name_t = set_Cchar(standard_name) + verbose_c, verbose_t = setscalar_Cbool(verbose) + do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) + err_msg_c, err_msg_t = set_Cchar(err_msg) + interp_method_c, interp_method_t = set_Cchar(interp_method) + tile_count_c, tile_count_t = setscalar_Cint32(tile_count) + area_c, area_t = setscalar_Cint32(area) + volume_c, volume_t = setscalar_Cint32(volume) + realm_c, realm_t = set_Cchar(realm) + multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) + + _cfms_register_diag_field_array_cdouble.argtypes = [ + module_name_t, + field_name_t, + axes_t, + long_name_t, + units_t, + missing_value_t, + range_t, + mask_variant_t, + standard_name_t, + verbose_t, + do_not_log_t, + err_msg_t, + interp_method_t, + tile_count_t, + area_t, + volume_t, + realm_t, + multiple_send_data_t, + ] + _cfms_register_diag_field_array_cdouble.restype = ctypes.c_int + + return _cfms_register_diag_field_array_cdouble( + module_name_c, + field_name_c, + axes_p, + long_name_c, + units_c, + missing_value_c, + range_p, + mask_variant_c, + standard_name_c, + verbose_c, + do_not_log_c, + err_msg_c, + interp_method_c, + tile_count_c, + area_c, + volume_c, + realm_c, + multiple_send_data_c, + ) + + def register_diag_field_array_cfloat( + self, + module_name: str, + field_name: str, + axes: Optional[NDArray] = None, + long_name: Optional[str] = None, + units: Optional[str] = None, + missing_value: Optional[float] = None, + range: Optional[NDArray] = None, + mask_variant: Optional[bool] = None, + standard_name: Optional[str] = None, + verbose: Optional[bool] = None, + do_not_log: Optional[bool] = None, + err_msg: Optional[str] = None, + interp_method: Optional[str] = None, + tile_count: Optional[int] = None, + area: Optional[int] = None, + volume: Optional[int] = None, + realm: Optional[str] = None, + multiple_send_data: Optional[bool] = None, + ) -> int: + + module_name = module_name[:64] + field_name = field_name[:64] + if long_name is not None: + long_name = long_name[:64] + if units is not None: + units = units[:64] + if standard_name is not None: + standard_name = standard_name[:64] + if err_msg is not None: + err_msg = err_msg[:64] + if interp_method is not None: + interp_method = interp_method[:64] + if realm is not None: + realm = realm[:64] + + _cfms_register_diag_field_array_cfloat = ( + self.clibFMS.cFMS_register_diag_field_array_cfloat + ) + + module_name_c, module_name_t = set_Cchar(module_name) + field_name_c, field_name_t = set_Cchar(field_name) + axes_p, axes_t = setarray_Cint32(axes) + long_name_c, long_name_t = set_Cchar(long_name) + units_c, units_t = set_Cchar(units) + missing_value_c, missing_value_t = setscalar_Cfloat(missing_value) + range_p, range_t = setarray_Cfloat(range) + mask_variant_c, mask_variant_t = setscalar_Cbool(mask_variant) + standard_name_c, standard_name_t = set_Cchar(standard_name) + verbose_c, verbose_t = setscalar_Cbool(verbose) + do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) + err_msg_c, err_msg_t = set_Cchar(err_msg) + interp_method_c, interp_method_t = set_Cchar(interp_method) + tile_count_c, tile_count_t = setscalar_Cint32(tile_count) + area_c, area_t = setscalar_Cint32(area) + volume_c, volume_t = setscalar_Cint32(volume) + realm_c, realm_t = set_Cchar(realm) + multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) + + _cfms_register_diag_field_array_cfloat.argtypes = [ + module_name_t, + field_name_t, + axes_t, + long_name_t, + units_t, + missing_value_t, + range_t, + mask_variant_t, + standard_name_t, + verbose_t, + do_not_log_t, + err_msg_t, + interp_method_t, + tile_count_t, + area_t, + volume_t, + realm_t, + multiple_send_data_t, + ] + _cfms_register_diag_field_array_cfloat.restype = ctypes.c_int + + return _cfms_register_diag_field_array_cfloat( + module_name_c, + field_name_c, + axes_p, + long_name_c, + units_c, + missing_value_c, + range_p, + mask_variant_c, + standard_name_c, + verbose_c, + do_not_log_c, + err_msg_c, + interp_method_c, + tile_count_c, + area_c, + volume_c, + realm_c, + multiple_send_data_c, + ) + + def register_diag_field_scalar_cint( + self, + module_name: str, + field_name: str, + long_name: Optional[str] = None, + units: Optional[str] = None, + standard_name: Optional[str] = None, + missing_value: Optional[int] = None, + range: Optional[NDArray] = None, + do_not_log: Optional[bool] = None, + err_msg: Optional[str] = None, + area: Optional[int] = None, + volume: Optional[int] = None, + realm: Optional[str] = None, + multiple_send_data: Optional[bool] = None, + ) -> int: + + module_name = module_name[:64] + field_name = field_name[:64] + if long_name is not None: + long_name = long_name[:64] + if units is not None: + units = units[:64] + if standard_name is not None: + standard_name = standard_name[:64] + if err_msg is not None: + err_msg = err_msg[:64] + if realm is not None: + realm = realm[:64] + + _cfms_register_diag_field_scalar_cint = ( + self.clibFMS.cFMS_register_diag_field_scalar_cint + ) + + module_name_c, module_name_t = set_Cchar(module_name) + field_name_c, field_name_t = set_Cchar(field_name) + long_name_c, long_name_t = set_Cchar(long_name) + units_c, units_t = set_Cchar(units) + standard_name_c, standard_name_t = set_Cchar(standard_name) + missing_value_c, missing_value_t = setscalar_Cint32(missing_value) + range_p, range_t = setarray_Cint32(range) + do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) + err_msg_c, err_msg_t = set_Cchar(err_msg) + area_c, area_t = setscalar_Cint32(area) + volume_c, volume_t = setscalar_Cint32(volume) + realm_c, realm_t = set_Cchar(realm) + multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) + + _cfms_register_diag_field_scalar_cint.argtypes = [ + module_name_t, + field_name_t, + long_name_t, + units_t, + standard_name_t, + missing_value_t, + range_t, + do_not_log_t, + err_msg_t, + area_t, + volume_t, + realm_t, + multiple_send_data_t, + ] + _cfms_register_diag_field_scalar_cint.restype = ctypes.c_int + + return _cfms_register_diag_field_scalar_cint( + module_name_c, + field_name_c, + long_name_c, + units_c, + standard_name_c, + missing_value_c, + range_p, + do_not_log_c, + err_msg_c, + area_c, + volume_c, + realm_c, + multiple_send_data_c, + ) + + def register_diag_field_scalar_cfloat( + self, + module_name: str, + field_name: str, + long_name: Optional[str] = None, + units: Optional[str] = None, + standard_name: Optional[str] = None, + missing_value: Optional[float] = None, + range: Optional[NDArray] = None, + do_not_log: Optional[bool] = None, + err_msg: Optional[str] = None, + area: Optional[int] = None, + volume: Optional[int] = None, + realm: Optional[str] = None, + multiple_send_data: Optional[bool] = None, + ) -> int: + + module_name = module_name[:64] + field_name = field_name[:64] + if long_name is not None: + long_name = long_name[:64] + if units is not None: + units = units[:64] + if standard_name is not None: + standard_name = standard_name[:64] + if err_msg is not None: + err_msg = err_msg[:64] + if realm is not None: + realm = realm[:64] + + _cfms_register_diag_field_scalar_cfloat = ( + self.clibFMS.cFMS_register_diag_field_scalar_cfloat + ) + + module_name_c, module_name_t = set_Cchar(module_name) + field_name_c, field_name_t = set_Cchar(field_name) + long_name_c, long_name_t = set_Cchar(long_name) + units_c, units_t = set_Cchar(units) + standard_name_c, standard_name_t = set_Cchar(standard_name) + missing_value_c, missing_value_t = setscalar_Cfloat(missing_value) + range_p, range_t = setarray_Cfloat(range) + do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) + err_msg_c, err_msg_t = set_Cchar(err_msg) + area_c, area_t = setscalar_Cint32(area) + volume_c, volume_t = setscalar_Cint32(volume) + realm_c, realm_t = set_Cchar(realm) + multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) + + _cfms_register_diag_field_scalar_cfloat.argtypes = [ + module_name_t, + field_name_t, + long_name_t, + units_t, + standard_name_t, + missing_value_t, + range_t, + do_not_log_t, + err_msg_t, + area_t, + volume_t, + realm_t, + multiple_send_data_t, + ] + _cfms_register_diag_field_scalar_cfloat.restype = ctypes.c_int + + return _cfms_register_diag_field_scalar_cfloat( + module_name_c, + field_name_c, + long_name_c, + units_c, + standard_name_c, + missing_value_c, + range_p, + do_not_log_c, + err_msg_c, + area_c, + volume_c, + realm_c, + multiple_send_data_c, + ) + + def register_diag_field_scalar_cdouble( + self, + module_name: str, + field_name: str, + long_name: Optional[str] = None, + units: Optional[str] = None, + standard_name: Optional[str] = None, + missing_value: Optional[float] = None, + range: Optional[NDArray] = None, + do_not_log: Optional[bool] = None, + err_msg: Optional[str] = None, + area: Optional[int] = None, + volume: Optional[int] = None, + realm: Optional[str] = None, + multiple_send_data: Optional[bool] = None, + ) -> int: + + module_name = module_name[:64] + field_name = field_name[:64] + if long_name is not None: + long_name = long_name[:64] + if units is not None: + units = units[:64] + if standard_name is not None: + standard_name = standard_name[:64] + if err_msg is not None: + err_msg = err_msg[:64] + if realm is not None: + realm = realm[:64] + + _cfms_register_diag_field_scalar_cdouble = ( + self.clibFMS.cFMS_register_diag_field_scalar_cdouble + ) + + module_name_c, module_name_t = set_Cchar(module_name) + field_name_c, field_name_t = set_Cchar(field_name) + long_name_c, long_name_t = set_Cchar(long_name) + units_c, units_t = set_Cchar(units) + standard_name_c, standard_name_t = set_Cchar(standard_name) + missing_value_c, missing_value_t = setscalar_Cdouble(missing_value) + range_p, range_t = setarray_Cdouble(range) + do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) + err_msg_c, err_msg_t = set_Cchar(err_msg) + area_c, area_t = setscalar_Cint32(area) + volume_c, volume_t = setscalar_Cint32(volume) + realm_c, realm_t = set_Cchar(realm) + multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) + + _cfms_register_diag_field_scalar_cdouble.argtypes = [ + module_name_t, + field_name_t, + long_name_t, + units_t, + standard_name_t, + missing_value_t, + range_t, + do_not_log_t, + err_msg_t, + area_t, + volume_t, + realm_t, + multiple_send_data_t, + ] + _cfms_register_diag_field_scalar_cdouble.restype = ctypes.c_int + + return _cfms_register_diag_field_scalar_cdouble( + module_name_c, + field_name_c, + long_name_c, + units_c, + standard_name_c, + missing_value_c, + range_p, + do_not_log_c, + err_msg_c, + area_c, + volume_c, + realm_c, + multiple_send_data_c, + ) From 1df933341688075907847246f0c5062dd3256be4 Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Tue, 18 Mar 2025 10:27:24 -0400 Subject: [PATCH 04/27] Adding latest additions to diag_manager methods to match PR 10 in cFMS --- cFMS | 2 +- pyfms/diag_manager/pyfms_diag_axis_init.py | 163 ++++ pyfms/diag_manager/pyfms_diag_manager.py | 725 +----------------- .../diag_manager/pyfms_register_diag_field.py | 572 ++++++++++++++ pyfms/diag_manager/pyfms_send_data.py | 416 ++++++++++ 5 files changed, 1153 insertions(+), 725 deletions(-) create mode 100644 pyfms/diag_manager/pyfms_diag_axis_init.py create mode 100644 pyfms/diag_manager/pyfms_register_diag_field.py create mode 100644 pyfms/diag_manager/pyfms_send_data.py diff --git a/cFMS b/cFMS index 754d12d..85748f7 160000 --- a/cFMS +++ b/cFMS @@ -1 +1 @@ -Subproject commit 754d12de9f07e786b2429fe17b23bb6213943bd3 +Subproject commit 85748f7e62729c876b24d7a910c8dc6bb5335cb9 diff --git a/pyfms/diag_manager/pyfms_diag_axis_init.py b/pyfms/diag_manager/pyfms_diag_axis_init.py new file mode 100644 index 0000000..a06fcf7 --- /dev/null +++ b/pyfms/diag_manager/pyfms_diag_axis_init.py @@ -0,0 +1,163 @@ +import ctypes +from typing import Optional + +from numpy.typing import NDArray + +from pyfms.pyfms_data_handling import ( + set_Cchar, + setarray_Cdouble, + setarray_Cfloat, + setscalar_Cint32, + setscalar_Cbool, +) + +class pyFMS_diag_axis_init: + + def __init__(self, clibFMS: ctypes.CDLL = None): + self.clibFMS = clibFMS + + def diag_axis_init_cdouble( + self, + name: str, + naxis_data: int, + axis_data: NDArray, + units: str, + cart_name: str, + long_name: Optional[str] = None, + set_name: Optional[str] = None, + direction: Optional[int] = None, + edges: Optional[int] = None, + aux: Optional[str] = None, + req: Optional[str] = None, + tile_count: Optional[int] = None, + domain_position: Optional[int] = None, + not_xy: Optional[bool] = None, + ) -> int: + _cfms_diag_axis_init_cdouble = self.clibFMS.cFMS_diag_axis_init_cdouble + + long_name = long_name[:64] + set_name = set_name[:64] + + name_c, name_t = set_Cchar(name) + naxis_data_c, naxis_data_t = setscalar_Cint32(naxis_data) + axis_data_p, axis_data_t = setarray_Cdouble(axis_data) + units_c, units_t = set_Cchar(units) + cart_name_c, cart_name_t = set_Cchar(cart_name) + long_name_c, long_name_t = set_Cchar(long_name) + set_name_c, set_name_t = set_Cchar(set_name) + direction_c, direction_t = setscalar_Cint32(direction) + edges_c, edges_t = setscalar_Cint32(edges) + aux_c, aux_t = set_Cchar(aux) + req_c, req_t = set_Cchar(req) + tile_count_c, tile_count_t = setscalar_Cint32(tile_count) + domain_position_c, domain_position_t = setscalar_Cint32(domain_position) + not_xy_c, not_xy_t = setscalar_Cbool[not_xy] + + _cfms_diag_axis_init_cdouble.argtypes = [ + name_t, + naxis_data_t, + axis_data_t, + units_t, + cart_name_t, + long_name_t, + set_name_t, + direction_t, + edges_t, + aux_t, + req_t, + tile_count_t, + domain_position_t, + not_xy_t, + ] + _cfms_diag_axis_init_cdouble.restype = ctypes.c_int + + return _cfms_diag_axis_init_cdouble( + name_c, + naxis_data_c, + axis_data_p, + units_c, + cart_name_c, + long_name_c, + set_name_c, + direction_c, + edges_c, + aux_c, + req_c, + tile_count_c, + domain_position_c, + not_xy_c, + ) + + def diag_axis_init_cfloat( + self, + name: str, + naxis_data: int, + axis_data: NDArray, + units: str, + cart_name: str, + long_name: Optional[str] = None, + set_name: Optional[str] = None, + direction: Optional[int] = None, + edges: Optional[int] = None, + aux: Optional[str] = None, + req: Optional[str] = None, + tile_count: Optional[int] = None, + domain_position: Optional[int] = None, + not_xy: Optional[bool] = None, + ) -> int: + _cfms_diag_axis_init_cfloat = self.clibFMS.cFMS_diag_axis_init_cfloat + + if long_name is not None: + long_name = long_name[:64] + if set_name is not None: + set_name = set_name[:64] + + name_c, name_t = set_Cchar(name) + naxis_data_c, naxis_data_t = setscalar_Cint32(naxis_data) + axis_data_p, axis_data_t = setarray_Cfloat(axis_data) + units_c, units_t = set_Cchar(units) + cart_name_c, cart_name_t = set_Cchar(cart_name) + long_name_c, long_name_t = set_Cchar(long_name) + set_name_c, set_name_t = set_Cchar(set_name) + direction_c, direction_t = setscalar_Cint32(direction) + edges_c, edges_t = setscalar_Cint32(edges) + aux_c, aux_t = set_Cchar(aux) + req_c, req_t = set_Cchar(req) + tile_count_c, tile_count_t = setscalar_Cint32(tile_count) + domain_position_c, domain_position_t = setscalar_Cint32(domain_position) + not_xy_c, not_xy_t = setscalar_Cbool(not_xy) + + _cfms_diag_axis_init_cfloat.argtypes = [ + name_t, + naxis_data_t, + axis_data_t, + units_t, + cart_name_t, + long_name_t, + set_name_t, + direction_t, + edges_t, + aux_t, + req_t, + tile_count_t, + domain_position_t, + not_xy_t, + ] + _cfms_diag_axis_init_cfloat.restype = ctypes.c_int + + return _cfms_diag_axis_init_cfloat( + name_c, + naxis_data_c, + axis_data_p, + units_c, + cart_name_c, + long_name_c, + set_name_c, + direction_c, + edges_c, + aux_c, + req_c, + tile_count_c, + domain_position_c, + not_xy_c, + ) diff --git a/pyfms/diag_manager/pyfms_diag_manager.py b/pyfms/diag_manager/pyfms_diag_manager.py index 870915d..7bb96a9 100644 --- a/pyfms/diag_manager/pyfms_diag_manager.py +++ b/pyfms/diag_manager/pyfms_diag_manager.py @@ -3,16 +3,7 @@ from numpy.typing import NDArray -from pyfms.pyfms_data_handling import ( - set_Cchar, - setarray_Cdouble, - setarray_Cfloat, - setarray_Cint32, - setscalar_Cbool, - setscalar_Cdouble, - setscalar_Cfloat, - setscalar_Cint32, -) +from pyfms.pyfms_data_handling import set_Cchar, setarray_Cint32, setscalar_Cint32 class pyFMS_diag_manager: @@ -20,136 +11,6 @@ class pyFMS_diag_manager: def __init__(self, clibFMS: ctypes.CDLL = None): self.clibFMS = clibFMS - def diag_axis_init_cdouble( - self, - name: str, - naxis_data: int, - axis_data: NDArray, - units: str, - cart_name: str, - long_name: Optional[str] = None, - set_name: Optional[str] = None, - direction: Optional[int] = None, - edges: Optional[int] = None, - aux: Optional[str] = None, - req: Optional[str] = None, - tile_count: Optional[int] = None, - domain_position: Optional[int] = None, - ) -> int: - _cfms_diag_axis_init_cdouble = self.clibFMS.cFMS_diag_axis_init_cdouble - - name_c, name_t = set_Cchar(name) - naxis_data_c, naxis_data_t = setscalar_Cint32(naxis_data) - axis_data_p, axis_data_t = setarray_Cdouble(axis_data) - units_c, units_t = set_Cchar(units) - cart_name_c, cart_name_t = set_Cchar(cart_name) - long_name_c, long_name_t = set_Cchar(long_name) - set_name_c, set_name_t = set_Cchar(set_name) - direction_c, direction_t = setscalar_Cint32(direction) - edges_c, edges_t = setscalar_Cint32(edges) - aux_c, aux_t = set_Cchar(aux) - req_c, req_t = set_Cchar(req) - tile_count_c, tile_count_t = setscalar_Cint32(tile_count) - domain_position_c, domain_position_t = setscalar_Cint32(domain_position) - - _cfms_diag_axis_init_cdouble.argtypes = [ - name_t, - naxis_data_t, - axis_data_t, - units_t, - cart_name_t, - long_name_t, - set_name_t, - direction_t, - edges_t, - aux_t, - req_t, - tile_count_t, - domain_position_t, - ] - _cfms_diag_axis_init_cdouble.restype = ctypes.c_int - - return _cfms_diag_axis_init_cdouble( - name_c, - naxis_data_c, - axis_data_p, - units_c, - cart_name_c, - long_name_c, - set_name_c, - direction_c, - edges_c, - aux_c, - req_c, - tile_count_c, - domain_position_c, - ) - - def diag_axis_init_cfloat( - self, - name: str, - naxis_data: int, - axis_data: NDArray, - units: str, - cart_name: str, - long_name: Optional[str] = None, - set_name: Optional[str] = None, - direction: Optional[int] = None, - edges: Optional[int] = None, - aux: Optional[str] = None, - req: Optional[str] = None, - tile_count: Optional[int] = None, - domain_position: Optional[int] = None, - ) -> int: - _cfms_diag_axis_init_cfloat = self.clibFMS.cFMS_diag_axis_init_cfloat - - name_c, name_t = set_Cchar(name) - naxis_data_c, naxis_data_t = setscalar_Cint32(naxis_data) - axis_data_p, axis_data_t = setarray_Cfloat(axis_data) - units_c, units_t = set_Cchar(units) - cart_name_c, cart_name_t = set_Cchar(cart_name) - long_name_c, long_name_t = set_Cchar(long_name) - set_name_c, set_name_t = set_Cchar(set_name) - direction_c, direction_t = setscalar_Cint32(direction) - edges_c, edges_t = setscalar_Cint32(edges) - aux_c, aux_t = set_Cchar(aux) - req_c, req_t = set_Cchar(req) - tile_count_c, tile_count_t = setscalar_Cint32(tile_count) - domain_position_c, domain_position_t = setscalar_Cint32(domain_position) - - _cfms_diag_axis_init_cfloat.argtypes = [ - name_t, - naxis_data_t, - axis_data_t, - units_t, - cart_name_t, - long_name_t, - set_name_t, - direction_t, - edges_t, - aux_t, - req_t, - tile_count_t, - domain_position_t, - ] - _cfms_diag_axis_init_cfloat.restype = ctypes.c_int - - return _cfms_diag_axis_init_cfloat( - name_c, - naxis_data_c, - axis_data_p, - units_c, - cart_name_c, - long_name_c, - set_name_c, - direction_c, - edges_c, - aux_c, - req_c, - tile_count_c, - domain_position_c, - ) - def diag_end(self): _cfms_diag_end = self.clibFMS.cFMS_diag_end @@ -202,38 +63,6 @@ def diag_send_complete( return err_msg_c.value.decode("utf-8") - def diag_send_data_2d_cfloat( - self, - diag_field_id: int, - field_shape: NDArray, - field: NDArray, - err_msg: Optional[str] = None, - ) -> bool: - - err_msg = err_msg[:128] - - _cfms_diag_send_data_2d_cfloat = self.clibFMS.cFMS_diag_send_data_2d_cfloat - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = setarray_Cfloat(field) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_data_2d_cfloat.argtypes = [ - diag_field_id_t, - field_shape_t, - field_t, - err_msg_t, - ] - _cfms_diag_send_data_2d_cfloat.restype = ctypes.c_bool - - return _cfms_diag_send_data_2d_cfloat( - diag_field_id_c, - field_shape_p, - field_p, - err_msg_c, - ) - def diag_set_field_init_time( self, year: int, @@ -367,555 +196,3 @@ def diag_set_time_end( tick_c, err_msg_c, ) - - def register_diag_field_array_cint( - self, - module_name: str, - field_name: str, - axes: Optional[NDArray] = None, - long_name: Optional[str] = None, - units: Optional[str] = None, - missing_value: Optional[int] = None, - range: Optional[NDArray] = None, - mask_variant: Optional[bool] = None, - standard_name: Optional[str] = None, - verbose: Optional[bool] = None, - do_not_log: Optional[bool] = None, - err_msg: Optional[str] = None, - interp_method: Optional[str] = None, - tile_count: Optional[int] = None, - area: Optional[int] = None, - volume: Optional[int] = None, - realm: Optional[str] = None, - multiple_send_data: Optional[bool] = None, - ) -> int: - - module_name = module_name[:64] - field_name = field_name[:64] - if long_name is not None: - long_name = long_name[:64] - if units is not None: - units = units[:64] - if standard_name is not None: - standard_name = standard_name[:64] - if err_msg is not None: - err_msg = err_msg[:64] - if interp_method is not None: - interp_method = interp_method[:64] - if realm is not None: - realm = realm[:64] - - _cfms_register_diag_field_array_cint = ( - self.clibFMS.cFMS_register_diag_field_array_cint - ) - - module_name_c, module_name_t = set_Cchar(module_name) - field_name_c, field_name_t = set_Cchar(field_name) - axes_p, axes_t = setarray_Cint32(axes) - long_name_c, long_name_t = set_Cchar(long_name) - units_c, units_t = set_Cchar(units) - missing_value_c, missing_value_t = setscalar_Cint32(missing_value) - range_p, range_t = setarray_Cint32(range) - mask_variant_c, mask_variant_t = setscalar_Cbool(mask_variant) - standard_name_c, standard_name_t = set_Cchar(standard_name) - verbose_c, verbose_t = setscalar_Cbool(verbose) - do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) - err_msg_c, err_msg_t = set_Cchar(err_msg) - interp_method_c, interp_method_t = set_Cchar(interp_method) - tile_count_c, tile_count_t = setscalar_Cint32(tile_count) - area_c, area_t = setscalar_Cint32(area) - volume_c, volume_t = setscalar_Cint32(volume) - realm_c, realm_t = set_Cchar(realm) - multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) - - _cfms_register_diag_field_array_cint.argtypes = [ - module_name_t, - field_name_t, - axes_t, - long_name_t, - units_t, - missing_value_t, - range_t, - mask_variant_t, - standard_name_t, - verbose_t, - do_not_log_t, - err_msg_t, - interp_method_t, - tile_count_t, - area_t, - volume_t, - realm_t, - multiple_send_data_t, - ] - _cfms_register_diag_field_array_cint.restype = ctypes.c_int - - return _cfms_register_diag_field_array_cint( - module_name_c, - field_name_c, - axes_p, - long_name_c, - units_c, - missing_value_c, - range_p, - mask_variant_c, - standard_name_c, - verbose_c, - do_not_log_c, - err_msg_c, - interp_method_c, - tile_count_c, - area_c, - volume_c, - realm_c, - multiple_send_data_c, - ) - - def register_diag_field_array_cdouble( - self, - module_name: str, - field_name: str, - axes: Optional[NDArray] = None, - long_name: Optional[str] = None, - units: Optional[str] = None, - missing_value: Optional[float] = None, - range: Optional[NDArray] = None, - mask_variant: Optional[bool] = None, - standard_name: Optional[str] = None, - verbose: Optional[bool] = None, - do_not_log: Optional[bool] = None, - err_msg: Optional[str] = None, - interp_method: Optional[str] = None, - tile_count: Optional[int] = None, - area: Optional[int] = None, - volume: Optional[int] = None, - realm: Optional[str] = None, - multiple_send_data: Optional[bool] = None, - ) -> int: - - module_name = module_name[:64] - field_name = field_name[:64] - if long_name is not None: - long_name = long_name[:64] - if units is not None: - units = units[:64] - if standard_name is not None: - standard_name = standard_name[:64] - if err_msg is not None: - err_msg = err_msg[:64] - if interp_method is not None: - interp_method = interp_method[:64] - if realm is not None: - realm = realm[:64] - - _cfms_register_diag_field_array_cdouble = ( - self.clibFMS.cFMS_register_diag_field_array_cdouble - ) - - module_name_c, module_name_t = set_Cchar(module_name) - field_name_c, field_name_t = set_Cchar(field_name) - axes_p, axes_t = setarray_Cint32(axes) - long_name_c, long_name_t = set_Cchar(long_name) - units_c, units_t = set_Cchar(units) - missing_value_c, missing_value_t = setscalar_Cdouble(missing_value) - range_p, range_t = setarray_Cdouble(range) - mask_variant_c, mask_variant_t = setscalar_Cbool(mask_variant) - standard_name_c, standard_name_t = set_Cchar(standard_name) - verbose_c, verbose_t = setscalar_Cbool(verbose) - do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) - err_msg_c, err_msg_t = set_Cchar(err_msg) - interp_method_c, interp_method_t = set_Cchar(interp_method) - tile_count_c, tile_count_t = setscalar_Cint32(tile_count) - area_c, area_t = setscalar_Cint32(area) - volume_c, volume_t = setscalar_Cint32(volume) - realm_c, realm_t = set_Cchar(realm) - multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) - - _cfms_register_diag_field_array_cdouble.argtypes = [ - module_name_t, - field_name_t, - axes_t, - long_name_t, - units_t, - missing_value_t, - range_t, - mask_variant_t, - standard_name_t, - verbose_t, - do_not_log_t, - err_msg_t, - interp_method_t, - tile_count_t, - area_t, - volume_t, - realm_t, - multiple_send_data_t, - ] - _cfms_register_diag_field_array_cdouble.restype = ctypes.c_int - - return _cfms_register_diag_field_array_cdouble( - module_name_c, - field_name_c, - axes_p, - long_name_c, - units_c, - missing_value_c, - range_p, - mask_variant_c, - standard_name_c, - verbose_c, - do_not_log_c, - err_msg_c, - interp_method_c, - tile_count_c, - area_c, - volume_c, - realm_c, - multiple_send_data_c, - ) - - def register_diag_field_array_cfloat( - self, - module_name: str, - field_name: str, - axes: Optional[NDArray] = None, - long_name: Optional[str] = None, - units: Optional[str] = None, - missing_value: Optional[float] = None, - range: Optional[NDArray] = None, - mask_variant: Optional[bool] = None, - standard_name: Optional[str] = None, - verbose: Optional[bool] = None, - do_not_log: Optional[bool] = None, - err_msg: Optional[str] = None, - interp_method: Optional[str] = None, - tile_count: Optional[int] = None, - area: Optional[int] = None, - volume: Optional[int] = None, - realm: Optional[str] = None, - multiple_send_data: Optional[bool] = None, - ) -> int: - - module_name = module_name[:64] - field_name = field_name[:64] - if long_name is not None: - long_name = long_name[:64] - if units is not None: - units = units[:64] - if standard_name is not None: - standard_name = standard_name[:64] - if err_msg is not None: - err_msg = err_msg[:64] - if interp_method is not None: - interp_method = interp_method[:64] - if realm is not None: - realm = realm[:64] - - _cfms_register_diag_field_array_cfloat = ( - self.clibFMS.cFMS_register_diag_field_array_cfloat - ) - - module_name_c, module_name_t = set_Cchar(module_name) - field_name_c, field_name_t = set_Cchar(field_name) - axes_p, axes_t = setarray_Cint32(axes) - long_name_c, long_name_t = set_Cchar(long_name) - units_c, units_t = set_Cchar(units) - missing_value_c, missing_value_t = setscalar_Cfloat(missing_value) - range_p, range_t = setarray_Cfloat(range) - mask_variant_c, mask_variant_t = setscalar_Cbool(mask_variant) - standard_name_c, standard_name_t = set_Cchar(standard_name) - verbose_c, verbose_t = setscalar_Cbool(verbose) - do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) - err_msg_c, err_msg_t = set_Cchar(err_msg) - interp_method_c, interp_method_t = set_Cchar(interp_method) - tile_count_c, tile_count_t = setscalar_Cint32(tile_count) - area_c, area_t = setscalar_Cint32(area) - volume_c, volume_t = setscalar_Cint32(volume) - realm_c, realm_t = set_Cchar(realm) - multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) - - _cfms_register_diag_field_array_cfloat.argtypes = [ - module_name_t, - field_name_t, - axes_t, - long_name_t, - units_t, - missing_value_t, - range_t, - mask_variant_t, - standard_name_t, - verbose_t, - do_not_log_t, - err_msg_t, - interp_method_t, - tile_count_t, - area_t, - volume_t, - realm_t, - multiple_send_data_t, - ] - _cfms_register_diag_field_array_cfloat.restype = ctypes.c_int - - return _cfms_register_diag_field_array_cfloat( - module_name_c, - field_name_c, - axes_p, - long_name_c, - units_c, - missing_value_c, - range_p, - mask_variant_c, - standard_name_c, - verbose_c, - do_not_log_c, - err_msg_c, - interp_method_c, - tile_count_c, - area_c, - volume_c, - realm_c, - multiple_send_data_c, - ) - - def register_diag_field_scalar_cint( - self, - module_name: str, - field_name: str, - long_name: Optional[str] = None, - units: Optional[str] = None, - standard_name: Optional[str] = None, - missing_value: Optional[int] = None, - range: Optional[NDArray] = None, - do_not_log: Optional[bool] = None, - err_msg: Optional[str] = None, - area: Optional[int] = None, - volume: Optional[int] = None, - realm: Optional[str] = None, - multiple_send_data: Optional[bool] = None, - ) -> int: - - module_name = module_name[:64] - field_name = field_name[:64] - if long_name is not None: - long_name = long_name[:64] - if units is not None: - units = units[:64] - if standard_name is not None: - standard_name = standard_name[:64] - if err_msg is not None: - err_msg = err_msg[:64] - if realm is not None: - realm = realm[:64] - - _cfms_register_diag_field_scalar_cint = ( - self.clibFMS.cFMS_register_diag_field_scalar_cint - ) - - module_name_c, module_name_t = set_Cchar(module_name) - field_name_c, field_name_t = set_Cchar(field_name) - long_name_c, long_name_t = set_Cchar(long_name) - units_c, units_t = set_Cchar(units) - standard_name_c, standard_name_t = set_Cchar(standard_name) - missing_value_c, missing_value_t = setscalar_Cint32(missing_value) - range_p, range_t = setarray_Cint32(range) - do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) - err_msg_c, err_msg_t = set_Cchar(err_msg) - area_c, area_t = setscalar_Cint32(area) - volume_c, volume_t = setscalar_Cint32(volume) - realm_c, realm_t = set_Cchar(realm) - multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) - - _cfms_register_diag_field_scalar_cint.argtypes = [ - module_name_t, - field_name_t, - long_name_t, - units_t, - standard_name_t, - missing_value_t, - range_t, - do_not_log_t, - err_msg_t, - area_t, - volume_t, - realm_t, - multiple_send_data_t, - ] - _cfms_register_diag_field_scalar_cint.restype = ctypes.c_int - - return _cfms_register_diag_field_scalar_cint( - module_name_c, - field_name_c, - long_name_c, - units_c, - standard_name_c, - missing_value_c, - range_p, - do_not_log_c, - err_msg_c, - area_c, - volume_c, - realm_c, - multiple_send_data_c, - ) - - def register_diag_field_scalar_cfloat( - self, - module_name: str, - field_name: str, - long_name: Optional[str] = None, - units: Optional[str] = None, - standard_name: Optional[str] = None, - missing_value: Optional[float] = None, - range: Optional[NDArray] = None, - do_not_log: Optional[bool] = None, - err_msg: Optional[str] = None, - area: Optional[int] = None, - volume: Optional[int] = None, - realm: Optional[str] = None, - multiple_send_data: Optional[bool] = None, - ) -> int: - - module_name = module_name[:64] - field_name = field_name[:64] - if long_name is not None: - long_name = long_name[:64] - if units is not None: - units = units[:64] - if standard_name is not None: - standard_name = standard_name[:64] - if err_msg is not None: - err_msg = err_msg[:64] - if realm is not None: - realm = realm[:64] - - _cfms_register_diag_field_scalar_cfloat = ( - self.clibFMS.cFMS_register_diag_field_scalar_cfloat - ) - - module_name_c, module_name_t = set_Cchar(module_name) - field_name_c, field_name_t = set_Cchar(field_name) - long_name_c, long_name_t = set_Cchar(long_name) - units_c, units_t = set_Cchar(units) - standard_name_c, standard_name_t = set_Cchar(standard_name) - missing_value_c, missing_value_t = setscalar_Cfloat(missing_value) - range_p, range_t = setarray_Cfloat(range) - do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) - err_msg_c, err_msg_t = set_Cchar(err_msg) - area_c, area_t = setscalar_Cint32(area) - volume_c, volume_t = setscalar_Cint32(volume) - realm_c, realm_t = set_Cchar(realm) - multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) - - _cfms_register_diag_field_scalar_cfloat.argtypes = [ - module_name_t, - field_name_t, - long_name_t, - units_t, - standard_name_t, - missing_value_t, - range_t, - do_not_log_t, - err_msg_t, - area_t, - volume_t, - realm_t, - multiple_send_data_t, - ] - _cfms_register_diag_field_scalar_cfloat.restype = ctypes.c_int - - return _cfms_register_diag_field_scalar_cfloat( - module_name_c, - field_name_c, - long_name_c, - units_c, - standard_name_c, - missing_value_c, - range_p, - do_not_log_c, - err_msg_c, - area_c, - volume_c, - realm_c, - multiple_send_data_c, - ) - - def register_diag_field_scalar_cdouble( - self, - module_name: str, - field_name: str, - long_name: Optional[str] = None, - units: Optional[str] = None, - standard_name: Optional[str] = None, - missing_value: Optional[float] = None, - range: Optional[NDArray] = None, - do_not_log: Optional[bool] = None, - err_msg: Optional[str] = None, - area: Optional[int] = None, - volume: Optional[int] = None, - realm: Optional[str] = None, - multiple_send_data: Optional[bool] = None, - ) -> int: - - module_name = module_name[:64] - field_name = field_name[:64] - if long_name is not None: - long_name = long_name[:64] - if units is not None: - units = units[:64] - if standard_name is not None: - standard_name = standard_name[:64] - if err_msg is not None: - err_msg = err_msg[:64] - if realm is not None: - realm = realm[:64] - - _cfms_register_diag_field_scalar_cdouble = ( - self.clibFMS.cFMS_register_diag_field_scalar_cdouble - ) - - module_name_c, module_name_t = set_Cchar(module_name) - field_name_c, field_name_t = set_Cchar(field_name) - long_name_c, long_name_t = set_Cchar(long_name) - units_c, units_t = set_Cchar(units) - standard_name_c, standard_name_t = set_Cchar(standard_name) - missing_value_c, missing_value_t = setscalar_Cdouble(missing_value) - range_p, range_t = setarray_Cdouble(range) - do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) - err_msg_c, err_msg_t = set_Cchar(err_msg) - area_c, area_t = setscalar_Cint32(area) - volume_c, volume_t = setscalar_Cint32(volume) - realm_c, realm_t = set_Cchar(realm) - multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) - - _cfms_register_diag_field_scalar_cdouble.argtypes = [ - module_name_t, - field_name_t, - long_name_t, - units_t, - standard_name_t, - missing_value_t, - range_t, - do_not_log_t, - err_msg_t, - area_t, - volume_t, - realm_t, - multiple_send_data_t, - ] - _cfms_register_diag_field_scalar_cdouble.restype = ctypes.c_int - - return _cfms_register_diag_field_scalar_cdouble( - module_name_c, - field_name_c, - long_name_c, - units_c, - standard_name_c, - missing_value_c, - range_p, - do_not_log_c, - err_msg_c, - area_c, - volume_c, - realm_c, - multiple_send_data_c, - ) diff --git a/pyfms/diag_manager/pyfms_register_diag_field.py b/pyfms/diag_manager/pyfms_register_diag_field.py new file mode 100644 index 0000000..f1863ee --- /dev/null +++ b/pyfms/diag_manager/pyfms_register_diag_field.py @@ -0,0 +1,572 @@ +import ctypes +from typing import Optional + +from numpy.typing import NDArray + +from pyfms.pyfms_data_handling import ( + set_Cchar, + setarray_Cdouble, + setarray_Cfloat, + setarray_Cint32, + setscalar_Cbool, + setscalar_Cdouble, + setscalar_Cfloat, + setscalar_Cint32, +) + +class pyFMS_register_diag_field: + + def __init__(self, clibFMS: ctypes.CDLL = None): + self.clibFMS = clibFMS + + def register_diag_field_array_cint( + self, + module_name: str, + field_name: str, + axes: Optional[NDArray] = None, + long_name: Optional[str] = None, + units: Optional[str] = None, + missing_value: Optional[int] = None, + range: Optional[NDArray] = None, + mask_variant: Optional[bool] = None, + standard_name: Optional[str] = None, + verbose: Optional[bool] = None, + do_not_log: Optional[bool] = None, + err_msg: Optional[str] = None, + interp_method: Optional[str] = None, + tile_count: Optional[int] = None, + area: Optional[int] = None, + volume: Optional[int] = None, + realm: Optional[str] = None, + multiple_send_data: Optional[bool] = None, + ) -> int: + + module_name = module_name[:64] + field_name = field_name[:64] + if long_name is not None: + long_name = long_name[:64] + if units is not None: + units = units[:64] + if standard_name is not None: + standard_name = standard_name[:64] + if err_msg is not None: + err_msg = err_msg[:64] + if interp_method is not None: + interp_method = interp_method[:64] + if realm is not None: + realm = realm[:64] + + _cfms_register_diag_field_array_cint = ( + self.clibFMS.cFMS_register_diag_field_array_cint + ) + + module_name_c, module_name_t = set_Cchar(module_name) + field_name_c, field_name_t = set_Cchar(field_name) + axes_p, axes_t = setarray_Cint32(axes) + long_name_c, long_name_t = set_Cchar(long_name) + units_c, units_t = set_Cchar(units) + missing_value_c, missing_value_t = setscalar_Cint32(missing_value) + range_p, range_t = setarray_Cint32(range) + mask_variant_c, mask_variant_t = setscalar_Cbool(mask_variant) + standard_name_c, standard_name_t = set_Cchar(standard_name) + verbose_c, verbose_t = setscalar_Cbool(verbose) + do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) + err_msg_c, err_msg_t = set_Cchar(err_msg) + interp_method_c, interp_method_t = set_Cchar(interp_method) + tile_count_c, tile_count_t = setscalar_Cint32(tile_count) + area_c, area_t = setscalar_Cint32(area) + volume_c, volume_t = setscalar_Cint32(volume) + realm_c, realm_t = set_Cchar(realm) + multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) + + _cfms_register_diag_field_array_cint.argtypes = [ + module_name_t, + field_name_t, + axes_t, + long_name_t, + units_t, + missing_value_t, + range_t, + mask_variant_t, + standard_name_t, + verbose_t, + do_not_log_t, + err_msg_t, + interp_method_t, + tile_count_t, + area_t, + volume_t, + realm_t, + multiple_send_data_t, + ] + _cfms_register_diag_field_array_cint.restype = ctypes.c_int + + return _cfms_register_diag_field_array_cint( + module_name_c, + field_name_c, + axes_p, + long_name_c, + units_c, + missing_value_c, + range_p, + mask_variant_c, + standard_name_c, + verbose_c, + do_not_log_c, + err_msg_c, + interp_method_c, + tile_count_c, + area_c, + volume_c, + realm_c, + multiple_send_data_c, + ) + + def register_diag_field_array_cdouble( + self, + module_name: str, + field_name: str, + axes: Optional[NDArray] = None, + long_name: Optional[str] = None, + units: Optional[str] = None, + missing_value: Optional[float] = None, + range: Optional[NDArray] = None, + mask_variant: Optional[bool] = None, + standard_name: Optional[str] = None, + verbose: Optional[bool] = None, + do_not_log: Optional[bool] = None, + err_msg: Optional[str] = None, + interp_method: Optional[str] = None, + tile_count: Optional[int] = None, + area: Optional[int] = None, + volume: Optional[int] = None, + realm: Optional[str] = None, + multiple_send_data: Optional[bool] = None, + ) -> int: + + module_name = module_name[:64] + field_name = field_name[:64] + if long_name is not None: + long_name = long_name[:64] + if units is not None: + units = units[:64] + if standard_name is not None: + standard_name = standard_name[:64] + if err_msg is not None: + err_msg = err_msg[:64] + if interp_method is not None: + interp_method = interp_method[:64] + if realm is not None: + realm = realm[:64] + + _cfms_register_diag_field_array_cdouble = ( + self.clibFMS.cFMS_register_diag_field_array_cdouble + ) + + module_name_c, module_name_t = set_Cchar(module_name) + field_name_c, field_name_t = set_Cchar(field_name) + axes_p, axes_t = setarray_Cint32(axes) + long_name_c, long_name_t = set_Cchar(long_name) + units_c, units_t = set_Cchar(units) + missing_value_c, missing_value_t = setscalar_Cdouble(missing_value) + range_p, range_t = setarray_Cdouble(range) + mask_variant_c, mask_variant_t = setscalar_Cbool(mask_variant) + standard_name_c, standard_name_t = set_Cchar(standard_name) + verbose_c, verbose_t = setscalar_Cbool(verbose) + do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) + err_msg_c, err_msg_t = set_Cchar(err_msg) + interp_method_c, interp_method_t = set_Cchar(interp_method) + tile_count_c, tile_count_t = setscalar_Cint32(tile_count) + area_c, area_t = setscalar_Cint32(area) + volume_c, volume_t = setscalar_Cint32(volume) + realm_c, realm_t = set_Cchar(realm) + multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) + + _cfms_register_diag_field_array_cdouble.argtypes = [ + module_name_t, + field_name_t, + axes_t, + long_name_t, + units_t, + missing_value_t, + range_t, + mask_variant_t, + standard_name_t, + verbose_t, + do_not_log_t, + err_msg_t, + interp_method_t, + tile_count_t, + area_t, + volume_t, + realm_t, + multiple_send_data_t, + ] + _cfms_register_diag_field_array_cdouble.restype = ctypes.c_int + + return _cfms_register_diag_field_array_cdouble( + module_name_c, + field_name_c, + axes_p, + long_name_c, + units_c, + missing_value_c, + range_p, + mask_variant_c, + standard_name_c, + verbose_c, + do_not_log_c, + err_msg_c, + interp_method_c, + tile_count_c, + area_c, + volume_c, + realm_c, + multiple_send_data_c, + ) + + def register_diag_field_array_cfloat( + self, + module_name: str, + field_name: str, + axes: Optional[NDArray] = None, + long_name: Optional[str] = None, + units: Optional[str] = None, + missing_value: Optional[float] = None, + range: Optional[NDArray] = None, + mask_variant: Optional[bool] = None, + standard_name: Optional[str] = None, + verbose: Optional[bool] = None, + do_not_log: Optional[bool] = None, + err_msg: Optional[str] = None, + interp_method: Optional[str] = None, + tile_count: Optional[int] = None, + area: Optional[int] = None, + volume: Optional[int] = None, + realm: Optional[str] = None, + multiple_send_data: Optional[bool] = None, + ) -> int: + + module_name = module_name[:64] + field_name = field_name[:64] + if long_name is not None: + long_name = long_name[:64] + if units is not None: + units = units[:64] + if standard_name is not None: + standard_name = standard_name[:64] + if err_msg is not None: + err_msg = err_msg[:64] + if interp_method is not None: + interp_method = interp_method[:64] + if realm is not None: + realm = realm[:64] + + _cfms_register_diag_field_array_cfloat = ( + self.clibFMS.cFMS_register_diag_field_array_cfloat + ) + + module_name_c, module_name_t = set_Cchar(module_name) + field_name_c, field_name_t = set_Cchar(field_name) + axes_p, axes_t = setarray_Cint32(axes) + long_name_c, long_name_t = set_Cchar(long_name) + units_c, units_t = set_Cchar(units) + missing_value_c, missing_value_t = setscalar_Cfloat(missing_value) + range_p, range_t = setarray_Cfloat(range) + mask_variant_c, mask_variant_t = setscalar_Cbool(mask_variant) + standard_name_c, standard_name_t = set_Cchar(standard_name) + verbose_c, verbose_t = setscalar_Cbool(verbose) + do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) + err_msg_c, err_msg_t = set_Cchar(err_msg) + interp_method_c, interp_method_t = set_Cchar(interp_method) + tile_count_c, tile_count_t = setscalar_Cint32(tile_count) + area_c, area_t = setscalar_Cint32(area) + volume_c, volume_t = setscalar_Cint32(volume) + realm_c, realm_t = set_Cchar(realm) + multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) + + _cfms_register_diag_field_array_cfloat.argtypes = [ + module_name_t, + field_name_t, + axes_t, + long_name_t, + units_t, + missing_value_t, + range_t, + mask_variant_t, + standard_name_t, + verbose_t, + do_not_log_t, + err_msg_t, + interp_method_t, + tile_count_t, + area_t, + volume_t, + realm_t, + multiple_send_data_t, + ] + _cfms_register_diag_field_array_cfloat.restype = ctypes.c_int + + return _cfms_register_diag_field_array_cfloat( + module_name_c, + field_name_c, + axes_p, + long_name_c, + units_c, + missing_value_c, + range_p, + mask_variant_c, + standard_name_c, + verbose_c, + do_not_log_c, + err_msg_c, + interp_method_c, + tile_count_c, + area_c, + volume_c, + realm_c, + multiple_send_data_c, + ) + + def register_diag_field_scalar_cint( + self, + module_name: str, + field_name: str, + long_name: Optional[str] = None, + units: Optional[str] = None, + standard_name: Optional[str] = None, + missing_value: Optional[int] = None, + range: Optional[NDArray] = None, + do_not_log: Optional[bool] = None, + err_msg: Optional[str] = None, + area: Optional[int] = None, + volume: Optional[int] = None, + realm: Optional[str] = None, + multiple_send_data: Optional[bool] = None, + ) -> int: + + module_name = module_name[:64] + field_name = field_name[:64] + if long_name is not None: + long_name = long_name[:64] + if units is not None: + units = units[:64] + if standard_name is not None: + standard_name = standard_name[:64] + if err_msg is not None: + err_msg = err_msg[:64] + if realm is not None: + realm = realm[:64] + + _cfms_register_diag_field_scalar_cint = ( + self.clibFMS.cFMS_register_diag_field_scalar_cint + ) + + module_name_c, module_name_t = set_Cchar(module_name) + field_name_c, field_name_t = set_Cchar(field_name) + long_name_c, long_name_t = set_Cchar(long_name) + units_c, units_t = set_Cchar(units) + standard_name_c, standard_name_t = set_Cchar(standard_name) + missing_value_c, missing_value_t = setscalar_Cint32(missing_value) + range_p, range_t = setarray_Cint32(range) + do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) + err_msg_c, err_msg_t = set_Cchar(err_msg) + area_c, area_t = setscalar_Cint32(area) + volume_c, volume_t = setscalar_Cint32(volume) + realm_c, realm_t = set_Cchar(realm) + multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) + + _cfms_register_diag_field_scalar_cint.argtypes = [ + module_name_t, + field_name_t, + long_name_t, + units_t, + standard_name_t, + missing_value_t, + range_t, + do_not_log_t, + err_msg_t, + area_t, + volume_t, + realm_t, + multiple_send_data_t, + ] + _cfms_register_diag_field_scalar_cint.restype = ctypes.c_int + + return _cfms_register_diag_field_scalar_cint( + module_name_c, + field_name_c, + long_name_c, + units_c, + standard_name_c, + missing_value_c, + range_p, + do_not_log_c, + err_msg_c, + area_c, + volume_c, + realm_c, + multiple_send_data_c, + ) + + def register_diag_field_scalar_cdouble( + self, + module_name: str, + field_name: str, + long_name: Optional[str] = None, + units: Optional[str] = None, + standard_name: Optional[str] = None, + missing_value: Optional[float] = None, + range: Optional[NDArray] = None, + do_not_log: Optional[bool] = None, + err_msg: Optional[str] = None, + area: Optional[int] = None, + volume: Optional[int] = None, + realm: Optional[str] = None, + multiple_send_data: Optional[bool] = None, + ) -> int: + + module_name = module_name[:64] + field_name = field_name[:64] + if long_name is not None: + long_name = long_name[:64] + if units is not None: + units = units[:64] + if standard_name is not None: + standard_name = standard_name[:64] + if err_msg is not None: + err_msg = err_msg[:64] + if realm is not None: + realm = realm[:64] + + _cfms_register_diag_field_scalar_cdouble = ( + self.clibFMS.cFMS_register_diag_field_scalar_cdouble + ) + + module_name_c, module_name_t = set_Cchar(module_name) + field_name_c, field_name_t = set_Cchar(field_name) + long_name_c, long_name_t = set_Cchar(long_name) + units_c, units_t = set_Cchar(units) + standard_name_c, standard_name_t = set_Cchar(standard_name) + missing_value_c, missing_value_t = setscalar_Cdouble(missing_value) + range_p, range_t = setarray_Cdouble(range) + do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) + err_msg_c, err_msg_t = set_Cchar(err_msg) + area_c, area_t = setscalar_Cint32(area) + volume_c, volume_t = setscalar_Cint32(volume) + realm_c, realm_t = set_Cchar(realm) + multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) + + _cfms_register_diag_field_scalar_cdouble.argtypes = [ + module_name_t, + field_name_t, + long_name_t, + units_t, + standard_name_t, + missing_value_t, + range_t, + do_not_log_t, + err_msg_t, + area_t, + volume_t, + realm_t, + multiple_send_data_t, + ] + _cfms_register_diag_field_scalar_cdouble.restype = ctypes.c_int + + return _cfms_register_diag_field_scalar_cdouble( + module_name_c, + field_name_c, + long_name_c, + units_c, + standard_name_c, + missing_value_c, + range_p, + do_not_log_c, + err_msg_c, + area_c, + volume_c, + realm_c, + multiple_send_data_c, + ) + + def register_diag_field_scalar_cfloat( + self, + module_name: str, + field_name: str, + long_name: Optional[str] = None, + units: Optional[str] = None, + standard_name: Optional[str] = None, + missing_value: Optional[float] = None, + range: Optional[NDArray] = None, + do_not_log: Optional[bool] = None, + err_msg: Optional[str] = None, + area: Optional[int] = None, + volume: Optional[int] = None, + realm: Optional[str] = None, + multiple_send_data: Optional[bool] = None, + ) -> int: + + module_name = module_name[:64] + field_name = field_name[:64] + if long_name is not None: + long_name = long_name[:64] + if units is not None: + units = units[:64] + if standard_name is not None: + standard_name = standard_name[:64] + if err_msg is not None: + err_msg = err_msg[:64] + if realm is not None: + realm = realm[:64] + + _cfms_register_diag_field_scalar_cfloat = ( + self.clibFMS.cFMS_register_diag_field_scalar_cfloat + ) + + module_name_c, module_name_t = set_Cchar(module_name) + field_name_c, field_name_t = set_Cchar(field_name) + long_name_c, long_name_t = set_Cchar(long_name) + units_c, units_t = set_Cchar(units) + standard_name_c, standard_name_t = set_Cchar(standard_name) + missing_value_c, missing_value_t = setscalar_Cfloat(missing_value) + range_p, range_t = setarray_Cfloat(range) + do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) + err_msg_c, err_msg_t = set_Cchar(err_msg) + area_c, area_t = setscalar_Cint32(area) + volume_c, volume_t = setscalar_Cint32(volume) + realm_c, realm_t = set_Cchar(realm) + multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) + + _cfms_register_diag_field_scalar_cfloat.argtypes = [ + module_name_t, + field_name_t, + long_name_t, + units_t, + standard_name_t, + missing_value_t, + range_t, + do_not_log_t, + err_msg_t, + area_t, + volume_t, + realm_t, + multiple_send_data_t, + ] + _cfms_register_diag_field_scalar_cfloat.restype = ctypes.c_int + + return _cfms_register_diag_field_scalar_cfloat( + module_name_c, + field_name_c, + long_name_c, + units_c, + standard_name_c, + missing_value_c, + range_p, + do_not_log_c, + err_msg_c, + area_c, + volume_c, + realm_c, + multiple_send_data_c, + ) \ No newline at end of file diff --git a/pyfms/diag_manager/pyfms_send_data.py b/pyfms/diag_manager/pyfms_send_data.py new file mode 100644 index 0000000..735eb1b --- /dev/null +++ b/pyfms/diag_manager/pyfms_send_data.py @@ -0,0 +1,416 @@ +import ctypes +from typing import Optional + +from numpy.typing import NDArray + +from pyfms.pyfms_data_handling import ( + set_Cchar, + setarray_Cint32, + set_multipointer, + setscalar_Cint32, +) + +class pyFMS_send_data: + + def __init__(self, clibFMS: ctypes.CDLL = None): + self.clibFMS = clibFMS + + """ + 2d send data wrappers + """ + + def diag_send_data_2d_cint( + self, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, + err_msg: Optional[str] = None, + ) -> bool: + + err_msg = err_msg[:128] + + _cfms_diag_send_data_2d_cint = self.clibFMS.cFMS_diag_send_data_2d_cint + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_p, field_t = set_multipointer(field) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_data_2d_cint.argtypes = [ + diag_field_id_t, + field_shape_t, + field_t, + err_msg_t, + ] + _cfms_diag_send_data_2d_cint.restype = ctypes.c_bool + + return _cfms_diag_send_data_2d_cint( + diag_field_id_c, + field_shape_p, + field_p, + err_msg_c, + ) + + def diag_send_data_2d_cdouble( + self, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, + err_msg: Optional[str] = None, + ) -> bool: + + err_msg = err_msg[:128] + + _cfms_diag_send_data_2d_cdouble = self.clibFMS.cFMS_diag_send_data_2d_cdouble + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_p, field_t = set_multipointer(field) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_data_2d_cdouble.argtypes = [ + diag_field_id_t, + field_shape_t, + field_t, + err_msg_t, + ] + _cfms_diag_send_data_2d_cdouble.restype = ctypes.c_bool + + return _cfms_diag_send_data_2d_cdouble( + diag_field_id_c, + field_shape_p, + field_p, + err_msg_c, + ) + + def diag_send_data_2d_cfloat( + self, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, + err_msg: Optional[str] = None, + ) -> bool: + + err_msg = err_msg[:128] + + _cfms_diag_send_data_2d_cfloat = self.clibFMS.cFMS_diag_send_data_2d_cfloat + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_p, field_t = set_multipointer(field) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_data_2d_cfloat.argtypes = [ + diag_field_id_t, + field_shape_t, + field_t, + err_msg_t, + ] + _cfms_diag_send_data_2d_cfloat.restype = ctypes.c_bool + + return _cfms_diag_send_data_2d_cfloat( + diag_field_id_c, + field_shape_p, + field_p, + err_msg_c, + ) + + """ + 3d send data wrappers + """ + + def diag_send_data_3d_cint( + self, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, + err_msg: Optional[str] = None, + ) -> bool: + + err_msg = err_msg[:128] + + _cfms_diag_send_data_3d_cint = self.clibFMS.cFMS_diag_send_data_3d_cint + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_p, field_t = set_multipointer(field) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_data_3d_cint.argtypes = [ + diag_field_id_t, + field_shape_t, + field_t, + err_msg_t, + ] + _cfms_diag_send_data_3d_cint.restype = ctypes.c_bool + + return _cfms_diag_send_data_3d_cint( + diag_field_id_c, + field_shape_p, + field_p, + err_msg_c, + ) + + def diag_send_data_3d_cdouble( + self, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, + err_msg: Optional[str] = None, + ) -> bool: + + err_msg = err_msg[:128] + + _cfms_diag_send_data_3d_cdouble = self.clibFMS.cFMS_diag_send_data_3d_cdouble + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_p, field_t = set_multipointer(field) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_data_3d_cdouble.argtypes = [ + diag_field_id_t, + field_shape_t, + field_t, + err_msg_t, + ] + _cfms_diag_send_data_3d_cdouble.restype = ctypes.c_bool + + return _cfms_diag_send_data_3d_cdouble( + diag_field_id_c, + field_shape_p, + field_p, + err_msg_c, + ) + + def diag_send_data_3d_cfloat( + self, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, + err_msg: Optional[str] = None, + ) -> bool: + + err_msg = err_msg[:128] + + _cfms_diag_send_data_3d_cfloat = self.clibFMS.cFMS_diag_send_data_3d_cfloat + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_p, field_t = set_multipointer(field) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_data_3d_cfloat.argtypes = [ + diag_field_id_t, + field_shape_t, + field_t, + err_msg_t, + ] + _cfms_diag_send_data_3d_cfloat.restype = ctypes.c_bool + + return _cfms_diag_send_data_3d_cfloat( + diag_field_id_c, + field_shape_p, + field_p, + err_msg_c, + ) + + """ + 4d send data wrappers + """ + + def diag_send_data_4d_cint( + self, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, + err_msg: Optional[str] = None, + ) -> bool: + + err_msg = err_msg[:128] + + _cfms_diag_send_data_4d_cint = self.clibFMS.cFMS_diag_send_data_4d_cint + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_p, field_t = set_multipointer(field) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_data_4d_cint.argtypes = [ + diag_field_id_t, + field_shape_t, + field_t, + err_msg_t, + ] + _cfms_diag_send_data_4d_cint.restype = ctypes.c_bool + + return _cfms_diag_send_data_4d_cint( + diag_field_id_c, + field_shape_p, + field_p, + err_msg_c, + ) + + def diag_send_data_4d_cdouble( + self, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, + err_msg: Optional[str] = None, + ) -> bool: + + err_msg = err_msg[:128] + + _cfms_diag_send_data_4d_cdouble = self.clibFMS.cFMS_diag_send_data_4d_cdouble + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_p, field_t = set_multipointer(field) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_data_4d_cdouble.argtypes = [ + diag_field_id_t, + field_shape_t, + field_t, + err_msg_t, + ] + _cfms_diag_send_data_4d_cdouble.restype = ctypes.c_bool + + return _cfms_diag_send_data_4d_cdouble( + diag_field_id_c, + field_shape_p, + field_p, + err_msg_c, + ) + + def diag_send_data_4d_cfloat( + self, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, + err_msg: Optional[str] = None, + ) -> bool: + + err_msg = err_msg[:128] + + _cfms_diag_send_data_4d_cfloat = self.clibFMS.cFMS_diag_send_data_4d_cfloat + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_p, field_t = set_multipointer(field) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_data_4d_cfloat.argtypes = [ + diag_field_id_t, + field_shape_t, + field_t, + err_msg_t, + ] + _cfms_diag_send_data_4d_cfloat.restype = ctypes.c_bool + + return _cfms_diag_send_data_4d_cfloat( + diag_field_id_c, + field_shape_p, + field_p, + err_msg_c, + ) + + """ + 5d send data wrappers + """ + + def diag_send_data_5d_cint( + self, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, + err_msg: Optional[str] = None, + ) -> bool: + + err_msg = err_msg[:128] + + _cfms_diag_send_data_5d_cint = self.clibFMS.cFMS_diag_send_data_5d_cint + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_p, field_t = set_multipointer(field) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_data_5d_cint.argtypes = [ + diag_field_id_t, + field_shape_t, + field_t, + err_msg_t, + ] + _cfms_diag_send_data_5d_cint.restype = ctypes.c_bool + + return _cfms_diag_send_data_5d_cint( + diag_field_id_c, + field_shape_p, + field_p, + err_msg_c, + ) + + def diag_send_data_5d_cdouble( + self, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, + err_msg: Optional[str] = None, + ) -> bool: + + err_msg = err_msg[:128] + + _cfms_diag_send_data_5d_cdouble = self.clibFMS.cFMS_diag_send_data_5d_cdouble + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_p, field_t = set_multipointer(field) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_data_5d_cdouble.argtypes = [ + diag_field_id_t, + field_shape_t, + field_t, + err_msg_t, + ] + _cfms_diag_send_data_5d_cdouble.restype = ctypes.c_bool + + return _cfms_diag_send_data_5d_cdouble( + diag_field_id_c, + field_shape_p, + field_p, + err_msg_c, + ) + + def diag_send_data_5d_cfloat( + self, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, + err_msg: Optional[str] = None, + ) -> bool: + + err_msg = err_msg[:128] + + _cfms_diag_send_data_5d_cfloat = self.clibFMS.cFMS_diag_send_data_5d_cfloat + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_p, field_t = set_multipointer(field) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_data_5d_cfloat.argtypes = [ + diag_field_id_t, + field_shape_t, + field_t, + err_msg_t, + ] + _cfms_diag_send_data_5d_cfloat.restype = ctypes.c_bool + + return _cfms_diag_send_data_5d_cfloat( + diag_field_id_c, + field_shape_p, + field_p, + err_msg_c, + ) \ No newline at end of file From e90c1470950c1f0e9f7733b949802ea8c03fce13 Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Tue, 18 Mar 2025 12:39:35 -0400 Subject: [PATCH 05/27] Adding pre-lim version of diag_manager test --- pyfms/__init__.py | 4 + pyfms/diag_manager/pyfms_diag_axis_init.py | 5 +- pyfms/diag_manager/pyfms_diag_manager.py | 4 +- .../diag_manager/pyfms_register_diag_field.py | 5 +- pyfms/diag_manager/pyfms_send_data.py | 47 ++-- tests/diag_manager/test_diag_manager.py | 233 ++++++++++++++++++ 6 files changed, 270 insertions(+), 28 deletions(-) create mode 100644 tests/diag_manager/test_diag_manager.py diff --git a/pyfms/__init__.py b/pyfms/__init__.py index ff6cf37..f3ccc9a 100644 --- a/pyfms/__init__.py +++ b/pyfms/__init__.py @@ -1,3 +1,7 @@ +from .diag_manager.pyfms_diag_axis_init import pyFMS_diag_axis_init +from .diag_manager.pyfms_diag_manager import pyFMS_diag_manager +from .diag_manager.pyfms_register_diag_field import pyFMS_register_diag_field +from .diag_manager.pyfms_send_data import pyFMS_send_data from .horiz_interp import HorizInterp from .mpp.pyfms_mpp import pyFMS_mpp from .mpp.pyfms_mpp_domains import ( diff --git a/pyfms/diag_manager/pyfms_diag_axis_init.py b/pyfms/diag_manager/pyfms_diag_axis_init.py index a06fcf7..d3b5d04 100644 --- a/pyfms/diag_manager/pyfms_diag_axis_init.py +++ b/pyfms/diag_manager/pyfms_diag_axis_init.py @@ -7,10 +7,11 @@ set_Cchar, setarray_Cdouble, setarray_Cfloat, - setscalar_Cint32, setscalar_Cbool, + setscalar_Cint32, ) + class pyFMS_diag_axis_init: def __init__(self, clibFMS: ctypes.CDLL = None): @@ -51,7 +52,7 @@ def diag_axis_init_cdouble( req_c, req_t = set_Cchar(req) tile_count_c, tile_count_t = setscalar_Cint32(tile_count) domain_position_c, domain_position_t = setscalar_Cint32(domain_position) - not_xy_c, not_xy_t = setscalar_Cbool[not_xy] + not_xy_c, not_xy_t = setscalar_Cbool(not_xy) _cfms_diag_axis_init_cdouble.argtypes = [ name_t, diff --git a/pyfms/diag_manager/pyfms_diag_manager.py b/pyfms/diag_manager/pyfms_diag_manager.py index 7bb96a9..bfa1e39 100644 --- a/pyfms/diag_manager/pyfms_diag_manager.py +++ b/pyfms/diag_manager/pyfms_diag_manager.py @@ -23,8 +23,10 @@ def diag_init( diag_model_subset: Optional[int] = None, time_init: Optional[NDArray] = None, calendar_type: Optional[int] = None, + err_msg: Optional[str] = None, ) -> str: - err_msg = "" + if err_msg is not None: + err_msg = err_msg[:128] _cfms_diag_init = self.clibFMS.cFMS_diag_init diff --git a/pyfms/diag_manager/pyfms_register_diag_field.py b/pyfms/diag_manager/pyfms_register_diag_field.py index f1863ee..1f91b9d 100644 --- a/pyfms/diag_manager/pyfms_register_diag_field.py +++ b/pyfms/diag_manager/pyfms_register_diag_field.py @@ -14,6 +14,7 @@ setscalar_Cint32, ) + class pyFMS_register_diag_field: def __init__(self, clibFMS: ctypes.CDLL = None): @@ -489,7 +490,7 @@ def register_diag_field_scalar_cdouble( realm_c, multiple_send_data_c, ) - + def register_diag_field_scalar_cfloat( self, module_name: str, @@ -569,4 +570,4 @@ def register_diag_field_scalar_cfloat( volume_c, realm_c, multiple_send_data_c, - ) \ No newline at end of file + ) diff --git a/pyfms/diag_manager/pyfms_send_data.py b/pyfms/diag_manager/pyfms_send_data.py index 735eb1b..89538cc 100644 --- a/pyfms/diag_manager/pyfms_send_data.py +++ b/pyfms/diag_manager/pyfms_send_data.py @@ -5,11 +5,12 @@ from pyfms.pyfms_data_handling import ( set_Cchar, - setarray_Cint32, set_multipointer, + setarray_Cint32, setscalar_Cint32, ) + class pyFMS_send_data: def __init__(self, clibFMS: ctypes.CDLL = None): @@ -33,7 +34,7 @@ def diag_send_data_2d_cint( diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = set_multipointer(field) + field_p, field_t = set_multipointer(arg=field, num_ptr=2) err_msg_c, err_msg_t = set_Cchar(err_msg) _cfms_diag_send_data_2d_cint.argtypes = [ @@ -50,7 +51,7 @@ def diag_send_data_2d_cint( field_p, err_msg_c, ) - + def diag_send_data_2d_cdouble( self, diag_field_id: int, @@ -65,7 +66,7 @@ def diag_send_data_2d_cdouble( diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = set_multipointer(field) + field_p, field_t = set_multipointer(arg=field, num_ptr=2) err_msg_c, err_msg_t = set_Cchar(err_msg) _cfms_diag_send_data_2d_cdouble.argtypes = [ @@ -82,7 +83,7 @@ def diag_send_data_2d_cdouble( field_p, err_msg_c, ) - + def diag_send_data_2d_cfloat( self, diag_field_id: int, @@ -97,7 +98,7 @@ def diag_send_data_2d_cfloat( diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = set_multipointer(field) + field_p, field_t = set_multipointer(arg=field, num_ptr=2) err_msg_c, err_msg_t = set_Cchar(err_msg) _cfms_diag_send_data_2d_cfloat.argtypes = [ @@ -114,7 +115,7 @@ def diag_send_data_2d_cfloat( field_p, err_msg_c, ) - + """ 3d send data wrappers """ @@ -133,7 +134,7 @@ def diag_send_data_3d_cint( diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = set_multipointer(field) + field_p, field_t = set_multipointer(arg=field, num_ptr=3) err_msg_c, err_msg_t = set_Cchar(err_msg) _cfms_diag_send_data_3d_cint.argtypes = [ @@ -150,7 +151,7 @@ def diag_send_data_3d_cint( field_p, err_msg_c, ) - + def diag_send_data_3d_cdouble( self, diag_field_id: int, @@ -165,7 +166,7 @@ def diag_send_data_3d_cdouble( diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = set_multipointer(field) + field_p, field_t = set_multipointer(arg=field, num_ptr=3) err_msg_c, err_msg_t = set_Cchar(err_msg) _cfms_diag_send_data_3d_cdouble.argtypes = [ @@ -182,7 +183,7 @@ def diag_send_data_3d_cdouble( field_p, err_msg_c, ) - + def diag_send_data_3d_cfloat( self, diag_field_id: int, @@ -197,7 +198,7 @@ def diag_send_data_3d_cfloat( diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = set_multipointer(field) + field_p, field_t = set_multipointer(arg=field, num_ptr=3) err_msg_c, err_msg_t = set_Cchar(err_msg) _cfms_diag_send_data_3d_cfloat.argtypes = [ @@ -233,7 +234,7 @@ def diag_send_data_4d_cint( diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = set_multipointer(field) + field_p, field_t = set_multipointer(arg=field, num_ptr=4) err_msg_c, err_msg_t = set_Cchar(err_msg) _cfms_diag_send_data_4d_cint.argtypes = [ @@ -250,7 +251,7 @@ def diag_send_data_4d_cint( field_p, err_msg_c, ) - + def diag_send_data_4d_cdouble( self, diag_field_id: int, @@ -265,7 +266,7 @@ def diag_send_data_4d_cdouble( diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = set_multipointer(field) + field_p, field_t = set_multipointer(arg=field, num_ptr=4) err_msg_c, err_msg_t = set_Cchar(err_msg) _cfms_diag_send_data_4d_cdouble.argtypes = [ @@ -282,7 +283,7 @@ def diag_send_data_4d_cdouble( field_p, err_msg_c, ) - + def diag_send_data_4d_cfloat( self, diag_field_id: int, @@ -297,7 +298,7 @@ def diag_send_data_4d_cfloat( diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = set_multipointer(field) + field_p, field_t = set_multipointer(arg=field, num_ptr=4) err_msg_c, err_msg_t = set_Cchar(err_msg) _cfms_diag_send_data_4d_cfloat.argtypes = [ @@ -333,7 +334,7 @@ def diag_send_data_5d_cint( diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = set_multipointer(field) + field_p, field_t = set_multipointer(arg=field, num_ptr=5) err_msg_c, err_msg_t = set_Cchar(err_msg) _cfms_diag_send_data_5d_cint.argtypes = [ @@ -350,7 +351,7 @@ def diag_send_data_5d_cint( field_p, err_msg_c, ) - + def diag_send_data_5d_cdouble( self, diag_field_id: int, @@ -365,7 +366,7 @@ def diag_send_data_5d_cdouble( diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = set_multipointer(field) + field_p, field_t = set_multipointer(arg=field, num_ptr=5) err_msg_c, err_msg_t = set_Cchar(err_msg) _cfms_diag_send_data_5d_cdouble.argtypes = [ @@ -382,7 +383,7 @@ def diag_send_data_5d_cdouble( field_p, err_msg_c, ) - + def diag_send_data_5d_cfloat( self, diag_field_id: int, @@ -397,7 +398,7 @@ def diag_send_data_5d_cfloat( diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = set_multipointer(field) + field_p, field_t = set_multipointer(arg=field, num_ptr=5) err_msg_c, err_msg_t = set_Cchar(err_msg) _cfms_diag_send_data_5d_cfloat.argtypes = [ @@ -413,4 +414,4 @@ def diag_send_data_5d_cfloat( field_shape_p, field_p, err_msg_c, - ) \ No newline at end of file + ) diff --git a/tests/diag_manager/test_diag_manager.py b/tests/diag_manager/test_diag_manager.py new file mode 100644 index 0000000..62d593d --- /dev/null +++ b/tests/diag_manager/test_diag_manager.py @@ -0,0 +1,233 @@ +import numpy as np + +from pyfms import ( + pyFMS, + pyFMS_mpp_domains, + pyFMS_diag_manager, + pyFMS_diag_axis_init, + pyFMS_register_diag_field, + pyFMS_send_data, +) + + +def test_send_data(): + + NX = 8 + NY = 8 + NZ = 2 + domain_id = 0 + var3_shape = np.array([NX, NY, NZ], dtype=np.int32, order="C") + var3 = np.empty(shape=NX*NY*NZ, dtype=np.float32, order="C") + ijk = 0 + + for i in range(NX): + for j in range(NY): + for k in range(NZ): + ijk += 1 + var3[ijk] = i*100 + j*10 + k*1 + + pyfms = pyFMS(clibFMS_path="./cFMS/libcFMS/.libs/libcFMS.so") + mpp_domains = pyFMS_mpp_domains(clibFMS=pyfms.clibFMS) + + global_indices = np.array([0, NX-1, 0, NY-1], dtype=np.int32, order="C") + layout = np.array([1,1], dtype=np.int32, order="C") + io_layout = np.array([1,1], dtype=np.int32, order="C") + + mpp_domains.define_domains( + domain_id=domain_id, + global_indices=global_indices, + layout=layout, + ) + mpp_domains.define_io_domain( + domain_id=domain_id, + io_layout=io_layout, + ) + + """ + diag manager init + """ + + diag_model_subset = 2 + time_init = np.empty(shape=6, dtype=np.int32, order="C") + calendar_type = 4 + err_msg = "None" + + diag_manager = pyFMS_diag_manager(clibFMS=pyfms.clibFMS) + diag_manager.diag_init( + diag_model_subset=diag_model_subset, + time_init=time_init, + calendar_type=calendar_type, + err_msg=err_msg + ) + + mpp_domains.set_current_domain(domain_id=domain_id) + + diag_axis = pyFMS_diag_axis_init(clibFMS=pyfms.clibFMS) + + """ + diag axis init x + """ + x = np.array([NX], dtype=np.float64, order="C") + + for i in range(NX): + x[i] = i + + id_x = diag_axis.diag_axis_init_cdouble( + name="x", + naxis_data=NX, + axis_data=x, + units="point_E", + cart_name="x", + long_name="point_E", + set_name="atm", + direction=0, + edges=0, + aux="", + req="", + tile_count=0, + domain_position=0 + ) + + """ + diag axis init y + """ + y = np.array([NY], dtype=np.float64, order="C") + + for j in range(NY): + y[j] = j + + id_y = diag_axis.diag_axis_init_cdouble( + name="y", + naxis_data=NY, + axis_data=y, + units="point_N", + cart_name="y", + long_name="point_N", + set_name="atm", + direction=0, + edges=0, + aux="", + req="", + tile_count=0, + domain_position=0, + ) + + """ + diag axis init z + """ + + z = np.array([NZ], dtype=np.float64, order="C") + + for k in range(NZ): + z[k] = k + + id_z = diag_axis.diag_axis_init_cdouble( + name="z", + naxis_data=NZ, + axis_data=z, + units="point_Z", + cart_name="z", + long_name="point_Z", + set_name="atm", + direction=0, + edges=0, + aux="", + req="", + tile_count=0, + domain_position=0, + not_xy=True, + ) + + """ + register diag field var3 + """ + + register = pyFMS_register_diag_field(clibFMS=pyfms.clibFMS) + + axes = np.array([id_x, id_y, id_z, 0, 0], dtype=np.int32, order="C") + range = np.array([-1000., 1000.], dtype=np.float32, order="C") + + diag_manager.diag_set_field_init_time( + year=2, + month=1, + day=1, + hour=1, + minute=1, + second=1, + tick=0, + ) + + id_var3 = register.register_diag_field_array_cfloat( + module_name="atm_mod", + field_name="var_3d", + axes=axes, + long_name="Var in a lon/lat domain", + units="muntin", + missing_value=-99.99, + range=range, + mask_variant=False, + standard_name="", + verbose=False, + do_not_log=False, + interp_method="", + tile_count=0, + area=0, + volume=0, + realm="", + multiple_send_data=False, + ) + + diag_manager.diag_set_field_timestep( + diag_field_id=id_var3, + dseconds=60*60, + ddays=0, + dticks=0 + ) + + """ + diag set time end + """ + + diag_manager.diag_set_time_end( + year=2, + month=1, + day=2, + hour=1, + minute=1, + second=1, + tick=0, + ) + + """ + send data + """ + + data_sender = pyFMS_send_data(clibFMS=pyfms.clibFMS) + + data_sender.diag_send_data_3d_cfloat( + diag_field_id=id_var3, + field_shape=var3_shape, + field=var3, + ) + + for itime in range(24): + ijk = 0 + for i in range(NX): + for j in range(NY): + for k in range(NZ): + var3[ijk] = -1.0 * var3[ijk] + ijk += 1 + diag_manager.diag_advance_field_time(diag_field_id=id_var3) + data_sender.diag_send_data_3d_cfloat( + diag_field_id=id_var3, + field_shape=var3_shape, + field=var3, + ) + diag_manager.diag_send_complete(diag_field_id=id_var3) + + diag_manager.diag_end() + + pyfms.pyfms_end() + + + \ No newline at end of file From f250c11da4118f0a116de6fe4911bb0252377fa3 Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Tue, 18 Mar 2025 13:14:24 -0400 Subject: [PATCH 06/27] Linting --- tests/diag_manager/test_diag_manager.py | 32 ++++++++++--------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/tests/diag_manager/test_diag_manager.py b/tests/diag_manager/test_diag_manager.py index 62d593d..48a49e1 100644 --- a/tests/diag_manager/test_diag_manager.py +++ b/tests/diag_manager/test_diag_manager.py @@ -2,9 +2,9 @@ from pyfms import ( pyFMS, - pyFMS_mpp_domains, - pyFMS_diag_manager, pyFMS_diag_axis_init, + pyFMS_diag_manager, + pyFMS_mpp_domains, pyFMS_register_diag_field, pyFMS_send_data, ) @@ -17,21 +17,21 @@ def test_send_data(): NZ = 2 domain_id = 0 var3_shape = np.array([NX, NY, NZ], dtype=np.int32, order="C") - var3 = np.empty(shape=NX*NY*NZ, dtype=np.float32, order="C") + var3 = np.empty(shape=NX * NY * NZ, dtype=np.float32, order="C") ijk = 0 for i in range(NX): for j in range(NY): for k in range(NZ): ijk += 1 - var3[ijk] = i*100 + j*10 + k*1 + var3[ijk] = i * 100 + j * 10 + k * 1 pyfms = pyFMS(clibFMS_path="./cFMS/libcFMS/.libs/libcFMS.so") mpp_domains = pyFMS_mpp_domains(clibFMS=pyfms.clibFMS) - global_indices = np.array([0, NX-1, 0, NY-1], dtype=np.int32, order="C") - layout = np.array([1,1], dtype=np.int32, order="C") - io_layout = np.array([1,1], dtype=np.int32, order="C") + global_indices = np.array([0, NX - 1, 0, NY - 1], dtype=np.int32, order="C") + layout = np.array([1, 1], dtype=np.int32, order="C") + io_layout = np.array([1, 1], dtype=np.int32, order="C") mpp_domains.define_domains( domain_id=domain_id, @@ -57,7 +57,7 @@ def test_send_data(): diag_model_subset=diag_model_subset, time_init=time_init, calendar_type=calendar_type, - err_msg=err_msg + err_msg=err_msg, ) mpp_domains.set_current_domain(domain_id=domain_id) @@ -85,7 +85,7 @@ def test_send_data(): aux="", req="", tile_count=0, - domain_position=0 + domain_position=0, ) """ @@ -141,11 +141,11 @@ def test_send_data(): """ register diag field var3 """ - + register = pyFMS_register_diag_field(clibFMS=pyfms.clibFMS) axes = np.array([id_x, id_y, id_z, 0, 0], dtype=np.int32, order="C") - range = np.array([-1000., 1000.], dtype=np.float32, order="C") + range_var = np.array([-1000.0, 1000.0], dtype=np.float32, order="C") diag_manager.diag_set_field_init_time( year=2, @@ -164,7 +164,7 @@ def test_send_data(): long_name="Var in a lon/lat domain", units="muntin", missing_value=-99.99, - range=range, + range=range_var, mask_variant=False, standard_name="", verbose=False, @@ -178,10 +178,7 @@ def test_send_data(): ) diag_manager.diag_set_field_timestep( - diag_field_id=id_var3, - dseconds=60*60, - ddays=0, - dticks=0 + diag_field_id=id_var3, dseconds=60 * 60, ddays=0, dticks=0 ) """ @@ -228,6 +225,3 @@ def test_send_data(): diag_manager.diag_end() pyfms.pyfms_end() - - - \ No newline at end of file From 87d98cb9bfb73a1cb2b0731b0e1ed8f2a0940993 Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Fri, 21 Mar 2025 15:51:19 -0400 Subject: [PATCH 07/27] Updated diag_manager methods to match cFMS --- pyfms/diag_manager/pyfms_diag_manager.py | 37 ++++++----- tests/diag_manager/test_diag_manager.py | 80 +++++++++++++++++++----- 2 files changed, 86 insertions(+), 31 deletions(-) diff --git a/pyfms/diag_manager/pyfms_diag_manager.py b/pyfms/diag_manager/pyfms_diag_manager.py index bfa1e39..e6da6ef 100644 --- a/pyfms/diag_manager/pyfms_diag_manager.py +++ b/pyfms/diag_manager/pyfms_diag_manager.py @@ -50,8 +50,11 @@ def diag_init( def diag_send_complete( self, diag_field_id: int, + err_msg: Optional[str] = None, ) -> str: - err_msg = "" + + if err_msg is not None: + err_msg = err_msg[:128] _cfms_diag_send_complete = self.clibFMS.CFMS_diag_send_complete @@ -74,8 +77,11 @@ def diag_set_field_init_time( minute: int, second: Optional[int] = None, tick: Optional[int] = None, + err_msg: Optional[str] = None, ) -> str: - err_msg = "" + + if err_msg is not None: + err_msg = err_msg[:128] _cfms_diag_set_field_init_time = self.clibFMS.cFMS_diag_set_field_init_time @@ -110,11 +116,13 @@ def diag_set_field_timestep( self, diag_field_id: int, dseconds: int, - ddays: Optional[int], - dticks: Optional[int], + ddays: Optional[int] = None, + dticks: Optional[int] = None, + err_msg: Optional[str] = None, ) -> str: - err_msg = "" + if err_msg is not None: + err_msg = err_msg[:128] _cfms_diag_set_field_timestep = self.clibFMS.cFMS_diag_set_field_timestep @@ -154,16 +162,17 @@ def diag_advance_field_time( def diag_set_time_end( self, - year: Optional[int], - month: Optional[int], - day: Optional[int], - hour: Optional[int], - minute: Optional[int], - second: Optional[int], - tick: Optional[int], - err_msg: Optional[str], + year: Optional[int] = None, + month: Optional[int] = None, + day: Optional[int] = None, + hour: Optional[int] = None, + minute: Optional[int] = None, + second: Optional[int] = None, + tick: Optional[int] = None, + err_msg: Optional[str] = None, ): - err_msg = err_msg[:128] + if err_msg is not None: + err_msg = err_msg[:128] _cfms_set_time_end = self.clibFMS.diag_set_time_end diff --git a/tests/diag_manager/test_diag_manager.py b/tests/diag_manager/test_diag_manager.py index 48a49e1..a1b7a58 100644 --- a/tests/diag_manager/test_diag_manager.py +++ b/tests/diag_manager/test_diag_manager.py @@ -15,16 +15,27 @@ def test_send_data(): NX = 8 NY = 8 NZ = 2 + domain_id = 0 + + var2_shape = np.array([NX, NY], dtype=np.int32, order="C") + var2 = np.empty(shape=NX * NY, dtype=np.float32, order="C") + var3_shape = np.array([NX, NY, NZ], dtype=np.int32, order="C") var3 = np.empty(shape=NX * NY * NZ, dtype=np.float32, order="C") - ijk = 0 + ijk = 0 for i in range(NX): for j in range(NY): for k in range(NZ): - ijk += 1 var3[ijk] = i * 100 + j * 10 + k * 1 + ijk += 1 + + ij = 0 + for i in range(NX): + for j in range(NY): + var2[ij] = i * 10.0 + j * 1.0 + ij += 1 pyfms = pyFMS(clibFMS_path="./cFMS/libcFMS/.libs/libcFMS.so") mpp_domains = pyFMS_mpp_domains(clibFMS=pyfms.clibFMS) @@ -144,8 +155,8 @@ def test_send_data(): register = pyFMS_register_diag_field(clibFMS=pyfms.clibFMS) - axes = np.array([id_x, id_y, id_z, 0, 0], dtype=np.int32, order="C") - range_var = np.array([-1000.0, 1000.0], dtype=np.float32, order="C") + axes_3d = np.array([id_x, id_y, id_z, 0, 0], dtype=np.int32, order="C") + range_3d = np.array([-1000.0, 1000.0], dtype=np.float32, order="C") diag_manager.diag_set_field_init_time( year=2, @@ -154,33 +165,55 @@ def test_send_data(): hour=1, minute=1, second=1, - tick=0, ) id_var3 = register.register_diag_field_array_cfloat( module_name="atm_mod", field_name="var_3d", - axes=axes, + axes=axes_3d, long_name="Var in a lon/lat domain", units="muntin", missing_value=-99.99, - range=range_var, - mask_variant=False, - standard_name="", - verbose=False, - do_not_log=False, - interp_method="", - tile_count=0, - area=0, - volume=0, - realm="", - multiple_send_data=False, + range=range_3d, ) diag_manager.diag_set_field_timestep( diag_field_id=id_var3, dseconds=60 * 60, ddays=0, dticks=0 ) + """ + register diag_field var 2 + """ + + axes_2d = np.array([id_x, id_y, 0, 0, 0], dtype=np.int32, order="C") + range_2d = np.array([-1000.0, 1000.0], dtype=np.float32, order="C") + + diag_manager.diag_set_field_init_time( + year=2, + month=1, + day=1, + hour=1, + minute=1, + second=1, + ) + + id_var2 = register.register_diag_field_array_cfloat( + module_name="atm_mod", + field_name="var_2d", + axes=axes_2d, + long_name="Var in a lon/lat domain", + units="muntin", + missing_value=-99.99, + range=range_2d, + ) + + diag_manager.diag_set_field_timestep( + diag_field_id=id_var2, + dseconds=60 * 60, + ddays=0, + dticks=0, + ) + """ diag set time end """ @@ -222,6 +255,19 @@ def test_send_data(): ) diag_manager.diag_send_complete(diag_field_id=id_var3) + ij = 0 + for i in range(NX): + for j in range(NY): + var2[ij] = -1.0 * var2[ij] + ij += 1 + diag_manager.diag_advance_field_time(diag_field_id=id_var2) + data_sender.diag_send_data_2d_cfloat( + diag_field_id=id_var2, + field_shape=var2_shape, + field=var2, + ) + diag_manager.diag_send_complete(diag_field_id=id_var2) + diag_manager.diag_end() pyfms.pyfms_end() From 52a1ca5144ff4083cf190602eb519715c41b8a65 Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Tue, 25 Mar 2025 12:51:21 -0400 Subject: [PATCH 08/27] Switching to main --- tests/diag_manager/test_diag_manager.py | 287 ++++++++++++++---------- 1 file changed, 164 insertions(+), 123 deletions(-) diff --git a/tests/diag_manager/test_diag_manager.py b/tests/diag_manager/test_diag_manager.py index a1b7a58..17614d2 100644 --- a/tests/diag_manager/test_diag_manager.py +++ b/tests/diag_manager/test_diag_manager.py @@ -1,3 +1,4 @@ +import os import numpy as np from pyfms import ( @@ -16,6 +17,41 @@ def test_send_data(): NY = 8 NZ = 2 + input_file = "input.nml" + diag_table = "diag_table.yaml" + + input_text = """ +&diag_manager_nml + use_modern_diag = .true. +/""" + + diag_text = """ +title: test_diag_manager +base_date: 2 1 1 1 1 1 + +diag_files: +- file_name: test_send_data + freq: 1 hours + time_units: hours + unlimdim: time + varlist: + - module: atm_mod + var_name: var_3d + reduction: average + kind: r4 + output_name: var3_avg + - module: atm_mod + var_name: var_2d + reduction: average + kind: r4 + output_name: var2_avg + """ + + with open(input_file, "w") as file1: + file1.write(input_text) + with open(diag_table, "w") as file2: + file2.write(diag_text) + domain_id = 0 var2_shape = np.array([NX, NY], dtype=np.int32, order="C") @@ -59,14 +95,13 @@ def test_send_data(): """ diag_model_subset = 2 - time_init = np.empty(shape=6, dtype=np.int32, order="C") + # time_init = np.empty(shape=6, dtype=np.int32, order="C") calendar_type = 4 err_msg = "None" diag_manager = pyFMS_diag_manager(clibFMS=pyfms.clibFMS) diag_manager.diag_init( diag_model_subset=diag_model_subset, - time_init=time_init, calendar_type=calendar_type, err_msg=err_msg, ) @@ -78,7 +113,7 @@ def test_send_data(): """ diag axis init x """ - x = np.array([NX], dtype=np.float64, order="C") + x = np.empty(shape=NX, dtype=np.float64, order="C") for i in range(NX): x[i] = i @@ -102,7 +137,7 @@ def test_send_data(): """ diag axis init y """ - y = np.array([NY], dtype=np.float64, order="C") + y = np.empty(shape=NY, dtype=np.float64, order="C") for j in range(NY): y[j] = j @@ -127,7 +162,7 @@ def test_send_data(): diag axis init z """ - z = np.array([NZ], dtype=np.float64, order="C") + z = np.empty(shape=NZ, dtype=np.float64, order="C") for k in range(NZ): z[k] = k @@ -149,125 +184,131 @@ def test_send_data(): not_xy=True, ) - """ - register diag field var3 - """ - - register = pyFMS_register_diag_field(clibFMS=pyfms.clibFMS) - - axes_3d = np.array([id_x, id_y, id_z, 0, 0], dtype=np.int32, order="C") - range_3d = np.array([-1000.0, 1000.0], dtype=np.float32, order="C") - - diag_manager.diag_set_field_init_time( - year=2, - month=1, - day=1, - hour=1, - minute=1, - second=1, - ) - - id_var3 = register.register_diag_field_array_cfloat( - module_name="atm_mod", - field_name="var_3d", - axes=axes_3d, - long_name="Var in a lon/lat domain", - units="muntin", - missing_value=-99.99, - range=range_3d, - ) - - diag_manager.diag_set_field_timestep( - diag_field_id=id_var3, dseconds=60 * 60, ddays=0, dticks=0 - ) - - """ - register diag_field var 2 - """ - - axes_2d = np.array([id_x, id_y, 0, 0, 0], dtype=np.int32, order="C") - range_2d = np.array([-1000.0, 1000.0], dtype=np.float32, order="C") - - diag_manager.diag_set_field_init_time( - year=2, - month=1, - day=1, - hour=1, - minute=1, - second=1, - ) - - id_var2 = register.register_diag_field_array_cfloat( - module_name="atm_mod", - field_name="var_2d", - axes=axes_2d, - long_name="Var in a lon/lat domain", - units="muntin", - missing_value=-99.99, - range=range_2d, - ) - - diag_manager.diag_set_field_timestep( - diag_field_id=id_var2, - dseconds=60 * 60, - ddays=0, - dticks=0, - ) - - """ - diag set time end - """ - - diag_manager.diag_set_time_end( - year=2, - month=1, - day=2, - hour=1, - minute=1, - second=1, - tick=0, - ) - - """ - send data - """ - - data_sender = pyFMS_send_data(clibFMS=pyfms.clibFMS) - - data_sender.diag_send_data_3d_cfloat( - diag_field_id=id_var3, - field_shape=var3_shape, - field=var3, - ) - - for itime in range(24): - ijk = 0 - for i in range(NX): - for j in range(NY): - for k in range(NZ): - var3[ijk] = -1.0 * var3[ijk] - ijk += 1 - diag_manager.diag_advance_field_time(diag_field_id=id_var3) - data_sender.diag_send_data_3d_cfloat( - diag_field_id=id_var3, - field_shape=var3_shape, - field=var3, - ) - diag_manager.diag_send_complete(diag_field_id=id_var3) - - ij = 0 - for i in range(NX): - for j in range(NY): - var2[ij] = -1.0 * var2[ij] - ij += 1 - diag_manager.diag_advance_field_time(diag_field_id=id_var2) - data_sender.diag_send_data_2d_cfloat( - diag_field_id=id_var2, - field_shape=var2_shape, - field=var2, - ) - diag_manager.diag_send_complete(diag_field_id=id_var2) + # """ + # register diag field var3 + # """ + + # register = pyFMS_register_diag_field(clibFMS=pyfms.clibFMS) + + # axes_3d = np.array([id_x, id_y, id_z, 0, 0], dtype=np.int32, order="C") + # range_3d = np.array([-1000.0, 1000.0], dtype=np.float32, order="C") + + # diag_manager.diag_set_field_init_time( + # year=2, + # month=1, + # day=1, + # hour=1, + # minute=1, + # second=1, + # ) + + # id_var3 = register.register_diag_field_array_cfloat( + # module_name="atm_mod", + # field_name="var_3d", + # axes=axes_3d, + # long_name="Var in a lon/lat domain", + # units="muntin", + # missing_value=-99.99, + # range=range_3d, + # ) + + # diag_manager.diag_set_field_timestep( + # diag_field_id=id_var3, dseconds=60 * 60, ddays=0, dticks=0 + # ) + + # """ + # register diag_field var 2 + # """ + + # axes_2d = np.array([id_x, id_y, 0, 0, 0], dtype=np.int32, order="C") + # range_2d = np.array([-1000.0, 1000.0], dtype=np.float32, order="C") + + # diag_manager.diag_set_field_init_time( + # year=2, + # month=1, + # day=1, + # hour=1, + # minute=1, + # second=1, + # ) + + # id_var2 = register.register_diag_field_array_cfloat( + # module_name="atm_mod", + # field_name="var_2d", + # axes=axes_2d, + # long_name="Var in a lon/lat domain", + # units="muntin", + # missing_value=-99.99, + # range=range_2d, + # ) + + # diag_manager.diag_set_field_timestep( + # diag_field_id=id_var2, + # dseconds=60 * 60, + # ddays=0, + # dticks=0, + # ) + + # """ + # diag set time end + # """ + + # diag_manager.diag_set_time_end( + # year=2, + # month=1, + # day=2, + # hour=1, + # minute=1, + # second=1, + # tick=0, + # ) + + # """ + # send data + # """ + + # data_sender = pyFMS_send_data(clibFMS=pyfms.clibFMS) + + # data_sender.diag_send_data_3d_cfloat( + # diag_field_id=id_var3, + # field_shape=var3_shape, + # field=var3, + # ) + + # for itime in range(24): + # ijk = 0 + # for i in range(NX): + # for j in range(NY): + # for k in range(NZ): + # var3[ijk] = -1.0 * var3[ijk] + # ijk += 1 + # diag_manager.diag_advance_field_time(diag_field_id=id_var3) + # data_sender.diag_send_data_3d_cfloat( + # diag_field_id=id_var3, + # field_shape=var3_shape, + # field=var3, + # ) + # diag_manager.diag_send_complete(diag_field_id=id_var3) + + # ij = 0 + # for i in range(NX): + # for j in range(NY): + # var2[ij] = -1.0 * var2[ij] + # ij += 1 + # diag_manager.diag_advance_field_time(diag_field_id=id_var2) + # data_sender.diag_send_data_2d_cfloat( + # diag_field_id=id_var2, + # field_shape=var2_shape, + # field=var2, + # ) + # diag_manager.diag_send_complete(diag_field_id=id_var2) diag_manager.diag_end() pyfms.pyfms_end() + + # os.remove(input_file) + # os.remove(diag_table) + +if __name__ == "__main__": + test_send_data() From 816b6da6a3c3305de333813f33983d9a5f3147bc Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Wed, 26 Mar 2025 13:29:26 -0400 Subject: [PATCH 09/27] Removed multipointer, updated files using it, linting --- pyfms/__init__.py | 3 +- pyfms/diag_manager/pyfms_diag_axis_init.py | 164 -- pyfms/diag_manager/pyfms_diag_manager.py | 209 --- .../diag_manager/pyfms_register_diag_field.py | 573 ------- pyfms/diag_manager/pyfms_send_data.py | 417 ------ pyfms/py_diag_manager/pyfms_diag_manager.py | 1313 +++++++++++++++++ pyfms/py_horiz_interp/py_horiz_interp.py | 2 +- pyfms/py_mpp/py_mpp_domains.py | 8 +- pyfms/pyfms_utils/data_handling.py | 102 -- tests/diag_manager/test_diag_manager.py | 314 ---- tests/py_diag_manager/test_diag_manager.py | 302 ++++ .../test_horiz_interp.py | 0 tests/py_mpp/test_define_domains.py | 6 +- 13 files changed, 1629 insertions(+), 1784 deletions(-) delete mode 100644 pyfms/diag_manager/pyfms_diag_axis_init.py delete mode 100644 pyfms/diag_manager/pyfms_diag_manager.py delete mode 100644 pyfms/diag_manager/pyfms_register_diag_field.py delete mode 100644 pyfms/diag_manager/pyfms_send_data.py create mode 100644 pyfms/py_diag_manager/pyfms_diag_manager.py delete mode 100644 tests/diag_manager/test_diag_manager.py create mode 100644 tests/py_diag_manager/test_diag_manager.py rename tests/{horiz_interp => py_horiz_interp}/test_horiz_interp.py (100%) diff --git a/pyfms/__init__.py b/pyfms/__init__.py index 3514b98..8e488b5 100644 --- a/pyfms/__init__.py +++ b/pyfms/__init__.py @@ -1,6 +1,7 @@ from .py_data_override.py_data_override import pyDataOverride +from .py_diag_manager.pyfms_diag_manager import pyFMS_diag_manager from .py_field_manager.py_field_manager import FieldTable -from .py_horiz_interp.py_horiz_interp import HorizInterp +from .py_horiz_interp.py_horiz_interp import pyHorizInterp from .py_mpp.py_mpp import pyFMS_mpp from .py_mpp.py_mpp_domains import ( pyDomain, diff --git a/pyfms/diag_manager/pyfms_diag_axis_init.py b/pyfms/diag_manager/pyfms_diag_axis_init.py deleted file mode 100644 index d3b5d04..0000000 --- a/pyfms/diag_manager/pyfms_diag_axis_init.py +++ /dev/null @@ -1,164 +0,0 @@ -import ctypes -from typing import Optional - -from numpy.typing import NDArray - -from pyfms.pyfms_data_handling import ( - set_Cchar, - setarray_Cdouble, - setarray_Cfloat, - setscalar_Cbool, - setscalar_Cint32, -) - - -class pyFMS_diag_axis_init: - - def __init__(self, clibFMS: ctypes.CDLL = None): - self.clibFMS = clibFMS - - def diag_axis_init_cdouble( - self, - name: str, - naxis_data: int, - axis_data: NDArray, - units: str, - cart_name: str, - long_name: Optional[str] = None, - set_name: Optional[str] = None, - direction: Optional[int] = None, - edges: Optional[int] = None, - aux: Optional[str] = None, - req: Optional[str] = None, - tile_count: Optional[int] = None, - domain_position: Optional[int] = None, - not_xy: Optional[bool] = None, - ) -> int: - _cfms_diag_axis_init_cdouble = self.clibFMS.cFMS_diag_axis_init_cdouble - - long_name = long_name[:64] - set_name = set_name[:64] - - name_c, name_t = set_Cchar(name) - naxis_data_c, naxis_data_t = setscalar_Cint32(naxis_data) - axis_data_p, axis_data_t = setarray_Cdouble(axis_data) - units_c, units_t = set_Cchar(units) - cart_name_c, cart_name_t = set_Cchar(cart_name) - long_name_c, long_name_t = set_Cchar(long_name) - set_name_c, set_name_t = set_Cchar(set_name) - direction_c, direction_t = setscalar_Cint32(direction) - edges_c, edges_t = setscalar_Cint32(edges) - aux_c, aux_t = set_Cchar(aux) - req_c, req_t = set_Cchar(req) - tile_count_c, tile_count_t = setscalar_Cint32(tile_count) - domain_position_c, domain_position_t = setscalar_Cint32(domain_position) - not_xy_c, not_xy_t = setscalar_Cbool(not_xy) - - _cfms_diag_axis_init_cdouble.argtypes = [ - name_t, - naxis_data_t, - axis_data_t, - units_t, - cart_name_t, - long_name_t, - set_name_t, - direction_t, - edges_t, - aux_t, - req_t, - tile_count_t, - domain_position_t, - not_xy_t, - ] - _cfms_diag_axis_init_cdouble.restype = ctypes.c_int - - return _cfms_diag_axis_init_cdouble( - name_c, - naxis_data_c, - axis_data_p, - units_c, - cart_name_c, - long_name_c, - set_name_c, - direction_c, - edges_c, - aux_c, - req_c, - tile_count_c, - domain_position_c, - not_xy_c, - ) - - def diag_axis_init_cfloat( - self, - name: str, - naxis_data: int, - axis_data: NDArray, - units: str, - cart_name: str, - long_name: Optional[str] = None, - set_name: Optional[str] = None, - direction: Optional[int] = None, - edges: Optional[int] = None, - aux: Optional[str] = None, - req: Optional[str] = None, - tile_count: Optional[int] = None, - domain_position: Optional[int] = None, - not_xy: Optional[bool] = None, - ) -> int: - _cfms_diag_axis_init_cfloat = self.clibFMS.cFMS_diag_axis_init_cfloat - - if long_name is not None: - long_name = long_name[:64] - if set_name is not None: - set_name = set_name[:64] - - name_c, name_t = set_Cchar(name) - naxis_data_c, naxis_data_t = setscalar_Cint32(naxis_data) - axis_data_p, axis_data_t = setarray_Cfloat(axis_data) - units_c, units_t = set_Cchar(units) - cart_name_c, cart_name_t = set_Cchar(cart_name) - long_name_c, long_name_t = set_Cchar(long_name) - set_name_c, set_name_t = set_Cchar(set_name) - direction_c, direction_t = setscalar_Cint32(direction) - edges_c, edges_t = setscalar_Cint32(edges) - aux_c, aux_t = set_Cchar(aux) - req_c, req_t = set_Cchar(req) - tile_count_c, tile_count_t = setscalar_Cint32(tile_count) - domain_position_c, domain_position_t = setscalar_Cint32(domain_position) - not_xy_c, not_xy_t = setscalar_Cbool(not_xy) - - _cfms_diag_axis_init_cfloat.argtypes = [ - name_t, - naxis_data_t, - axis_data_t, - units_t, - cart_name_t, - long_name_t, - set_name_t, - direction_t, - edges_t, - aux_t, - req_t, - tile_count_t, - domain_position_t, - not_xy_t, - ] - _cfms_diag_axis_init_cfloat.restype = ctypes.c_int - - return _cfms_diag_axis_init_cfloat( - name_c, - naxis_data_c, - axis_data_p, - units_c, - cart_name_c, - long_name_c, - set_name_c, - direction_c, - edges_c, - aux_c, - req_c, - tile_count_c, - domain_position_c, - not_xy_c, - ) diff --git a/pyfms/diag_manager/pyfms_diag_manager.py b/pyfms/diag_manager/pyfms_diag_manager.py deleted file mode 100644 index e6da6ef..0000000 --- a/pyfms/diag_manager/pyfms_diag_manager.py +++ /dev/null @@ -1,209 +0,0 @@ -import ctypes -from typing import Optional - -from numpy.typing import NDArray - -from pyfms.pyfms_data_handling import set_Cchar, setarray_Cint32, setscalar_Cint32 - - -class pyFMS_diag_manager: - - def __init__(self, clibFMS: ctypes.CDLL = None): - self.clibFMS = clibFMS - - def diag_end(self): - _cfms_diag_end = self.clibFMS.cFMS_diag_end - - _cfms_diag_end.restype = None - - _cfms_diag_end() - - def diag_init( - self, - diag_model_subset: Optional[int] = None, - time_init: Optional[NDArray] = None, - calendar_type: Optional[int] = None, - err_msg: Optional[str] = None, - ) -> str: - if err_msg is not None: - err_msg = err_msg[:128] - - _cfms_diag_init = self.clibFMS.cFMS_diag_init - - diag_model_subset_c, diag_model_subset_t = setscalar_Cint32(diag_model_subset) - time_init_p, time_init_t = setarray_Cint32(time_init) - calendar_type_c, calendar_type_t = setscalar_Cint32(calendar_type) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_init.argtypes = [ - diag_model_subset_t, - time_init_t, - calendar_type_t, - err_msg_t, - ] - _cfms_diag_init.restype = None - - _cfms_diag_init(diag_model_subset_c, time_init_p, calendar_type_c, err_msg_c) - - return err_msg_c.value.decode("utf-8") - - def diag_send_complete( - self, - diag_field_id: int, - err_msg: Optional[str] = None, - ) -> str: - - if err_msg is not None: - err_msg = err_msg[:128] - - _cfms_diag_send_complete = self.clibFMS.CFMS_diag_send_complete - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_complete.argtypes = [diag_field_id_t, err_msg_t] - _cfms_diag_send_complete.restype = None - - _cfms_diag_send_complete(diag_field_id_c, err_msg_c) - - return err_msg_c.value.decode("utf-8") - - def diag_set_field_init_time( - self, - year: int, - month: int, - day: int, - hour: int, - minute: int, - second: Optional[int] = None, - tick: Optional[int] = None, - err_msg: Optional[str] = None, - ) -> str: - - if err_msg is not None: - err_msg = err_msg[:128] - - _cfms_diag_set_field_init_time = self.clibFMS.cFMS_diag_set_field_init_time - - year_c, year_t = setscalar_Cint32(year) - month_c, month_t = setscalar_Cint32(month) - day_c, day_t = setscalar_Cint32(day) - hour_c, hour_t = setscalar_Cint32(hour) - minute_c, minute_t = setscalar_Cint32(minute) - second_c, second_t = setscalar_Cint32(second) - tick_c, tick_t = setscalar_Cint32(tick) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_set_field_init_time.argtypes = [ - year_t, - month_t, - day_t, - hour_t, - minute_t, - second_t, - tick_t, - err_msg_t, - ] - _cfms_diag_set_field_init_time.restype = None - - _cfms_diag_set_field_init_time( - year_c, month_c, day_c, hour_c, minute_c, second_c, tick_c, err_msg_c - ) - - return err_msg_c.value.decode("utf-8") - - def diag_set_field_timestep( - self, - diag_field_id: int, - dseconds: int, - ddays: Optional[int] = None, - dticks: Optional[int] = None, - err_msg: Optional[str] = None, - ) -> str: - - if err_msg is not None: - err_msg = err_msg[:128] - - _cfms_diag_set_field_timestep = self.clibFMS.cFMS_diag_set_field_timestep - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - dseconds_c, dseconds_t = setscalar_Cint32(dseconds) - ddays_c, ddays_t = setscalar_Cint32(ddays) - dticks_c, dticks_t = setscalar_Cint32(dticks) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_set_field_timestep.argtypes = [ - diag_field_id_t, - dseconds_t, - ddays_t, - dticks_t, - err_msg_t, - ] - _cfms_diag_set_field_timestep.restype = None - - _cfms_diag_set_field_timestep( - diag_field_id_c, dseconds_c, ddays_c, dticks_c, err_msg_c - ) - - return err_msg_c.value.decode("utf-8") - - def diag_advance_field_time( - self, - diag_field_id: int, - ): - _cfms_diag_advance_field_time = self.clibFMS.cFMS_diag_advance_field_time - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - - _cfms_diag_advance_field_time.argtypes = [diag_field_id_t] - _cfms_diag_advance_field_time.restype = None - - _cfms_diag_advance_field_time(diag_field_id_c) - - def diag_set_time_end( - self, - year: Optional[int] = None, - month: Optional[int] = None, - day: Optional[int] = None, - hour: Optional[int] = None, - minute: Optional[int] = None, - second: Optional[int] = None, - tick: Optional[int] = None, - err_msg: Optional[str] = None, - ): - if err_msg is not None: - err_msg = err_msg[:128] - - _cfms_set_time_end = self.clibFMS.diag_set_time_end - - year_c, year_t = setscalar_Cint32(year) - month_c, month_t = setscalar_Cint32(month) - day_c, day_t = setscalar_Cint32(day) - hour_c, hour_t = setscalar_Cint32(hour) - minute_c, minute_t = setscalar_Cint32(minute) - second_c, second_t = setscalar_Cint32(second) - tick_c, tick_t = setscalar_Cint32(tick) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_set_time_end.argtypes = [ - year_t, - month_t, - day_t, - hour_t, - minute_t, - second_t, - tick_t, - err_msg_t, - ] - _cfms_set_time_end.restype = None - - _cfms_set_time_end( - year_c, - month_c, - day_c, - hour_c, - minute_c, - second_c, - tick_c, - err_msg_c, - ) diff --git a/pyfms/diag_manager/pyfms_register_diag_field.py b/pyfms/diag_manager/pyfms_register_diag_field.py deleted file mode 100644 index 1f91b9d..0000000 --- a/pyfms/diag_manager/pyfms_register_diag_field.py +++ /dev/null @@ -1,573 +0,0 @@ -import ctypes -from typing import Optional - -from numpy.typing import NDArray - -from pyfms.pyfms_data_handling import ( - set_Cchar, - setarray_Cdouble, - setarray_Cfloat, - setarray_Cint32, - setscalar_Cbool, - setscalar_Cdouble, - setscalar_Cfloat, - setscalar_Cint32, -) - - -class pyFMS_register_diag_field: - - def __init__(self, clibFMS: ctypes.CDLL = None): - self.clibFMS = clibFMS - - def register_diag_field_array_cint( - self, - module_name: str, - field_name: str, - axes: Optional[NDArray] = None, - long_name: Optional[str] = None, - units: Optional[str] = None, - missing_value: Optional[int] = None, - range: Optional[NDArray] = None, - mask_variant: Optional[bool] = None, - standard_name: Optional[str] = None, - verbose: Optional[bool] = None, - do_not_log: Optional[bool] = None, - err_msg: Optional[str] = None, - interp_method: Optional[str] = None, - tile_count: Optional[int] = None, - area: Optional[int] = None, - volume: Optional[int] = None, - realm: Optional[str] = None, - multiple_send_data: Optional[bool] = None, - ) -> int: - - module_name = module_name[:64] - field_name = field_name[:64] - if long_name is not None: - long_name = long_name[:64] - if units is not None: - units = units[:64] - if standard_name is not None: - standard_name = standard_name[:64] - if err_msg is not None: - err_msg = err_msg[:64] - if interp_method is not None: - interp_method = interp_method[:64] - if realm is not None: - realm = realm[:64] - - _cfms_register_diag_field_array_cint = ( - self.clibFMS.cFMS_register_diag_field_array_cint - ) - - module_name_c, module_name_t = set_Cchar(module_name) - field_name_c, field_name_t = set_Cchar(field_name) - axes_p, axes_t = setarray_Cint32(axes) - long_name_c, long_name_t = set_Cchar(long_name) - units_c, units_t = set_Cchar(units) - missing_value_c, missing_value_t = setscalar_Cint32(missing_value) - range_p, range_t = setarray_Cint32(range) - mask_variant_c, mask_variant_t = setscalar_Cbool(mask_variant) - standard_name_c, standard_name_t = set_Cchar(standard_name) - verbose_c, verbose_t = setscalar_Cbool(verbose) - do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) - err_msg_c, err_msg_t = set_Cchar(err_msg) - interp_method_c, interp_method_t = set_Cchar(interp_method) - tile_count_c, tile_count_t = setscalar_Cint32(tile_count) - area_c, area_t = setscalar_Cint32(area) - volume_c, volume_t = setscalar_Cint32(volume) - realm_c, realm_t = set_Cchar(realm) - multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) - - _cfms_register_diag_field_array_cint.argtypes = [ - module_name_t, - field_name_t, - axes_t, - long_name_t, - units_t, - missing_value_t, - range_t, - mask_variant_t, - standard_name_t, - verbose_t, - do_not_log_t, - err_msg_t, - interp_method_t, - tile_count_t, - area_t, - volume_t, - realm_t, - multiple_send_data_t, - ] - _cfms_register_diag_field_array_cint.restype = ctypes.c_int - - return _cfms_register_diag_field_array_cint( - module_name_c, - field_name_c, - axes_p, - long_name_c, - units_c, - missing_value_c, - range_p, - mask_variant_c, - standard_name_c, - verbose_c, - do_not_log_c, - err_msg_c, - interp_method_c, - tile_count_c, - area_c, - volume_c, - realm_c, - multiple_send_data_c, - ) - - def register_diag_field_array_cdouble( - self, - module_name: str, - field_name: str, - axes: Optional[NDArray] = None, - long_name: Optional[str] = None, - units: Optional[str] = None, - missing_value: Optional[float] = None, - range: Optional[NDArray] = None, - mask_variant: Optional[bool] = None, - standard_name: Optional[str] = None, - verbose: Optional[bool] = None, - do_not_log: Optional[bool] = None, - err_msg: Optional[str] = None, - interp_method: Optional[str] = None, - tile_count: Optional[int] = None, - area: Optional[int] = None, - volume: Optional[int] = None, - realm: Optional[str] = None, - multiple_send_data: Optional[bool] = None, - ) -> int: - - module_name = module_name[:64] - field_name = field_name[:64] - if long_name is not None: - long_name = long_name[:64] - if units is not None: - units = units[:64] - if standard_name is not None: - standard_name = standard_name[:64] - if err_msg is not None: - err_msg = err_msg[:64] - if interp_method is not None: - interp_method = interp_method[:64] - if realm is not None: - realm = realm[:64] - - _cfms_register_diag_field_array_cdouble = ( - self.clibFMS.cFMS_register_diag_field_array_cdouble - ) - - module_name_c, module_name_t = set_Cchar(module_name) - field_name_c, field_name_t = set_Cchar(field_name) - axes_p, axes_t = setarray_Cint32(axes) - long_name_c, long_name_t = set_Cchar(long_name) - units_c, units_t = set_Cchar(units) - missing_value_c, missing_value_t = setscalar_Cdouble(missing_value) - range_p, range_t = setarray_Cdouble(range) - mask_variant_c, mask_variant_t = setscalar_Cbool(mask_variant) - standard_name_c, standard_name_t = set_Cchar(standard_name) - verbose_c, verbose_t = setscalar_Cbool(verbose) - do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) - err_msg_c, err_msg_t = set_Cchar(err_msg) - interp_method_c, interp_method_t = set_Cchar(interp_method) - tile_count_c, tile_count_t = setscalar_Cint32(tile_count) - area_c, area_t = setscalar_Cint32(area) - volume_c, volume_t = setscalar_Cint32(volume) - realm_c, realm_t = set_Cchar(realm) - multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) - - _cfms_register_diag_field_array_cdouble.argtypes = [ - module_name_t, - field_name_t, - axes_t, - long_name_t, - units_t, - missing_value_t, - range_t, - mask_variant_t, - standard_name_t, - verbose_t, - do_not_log_t, - err_msg_t, - interp_method_t, - tile_count_t, - area_t, - volume_t, - realm_t, - multiple_send_data_t, - ] - _cfms_register_diag_field_array_cdouble.restype = ctypes.c_int - - return _cfms_register_diag_field_array_cdouble( - module_name_c, - field_name_c, - axes_p, - long_name_c, - units_c, - missing_value_c, - range_p, - mask_variant_c, - standard_name_c, - verbose_c, - do_not_log_c, - err_msg_c, - interp_method_c, - tile_count_c, - area_c, - volume_c, - realm_c, - multiple_send_data_c, - ) - - def register_diag_field_array_cfloat( - self, - module_name: str, - field_name: str, - axes: Optional[NDArray] = None, - long_name: Optional[str] = None, - units: Optional[str] = None, - missing_value: Optional[float] = None, - range: Optional[NDArray] = None, - mask_variant: Optional[bool] = None, - standard_name: Optional[str] = None, - verbose: Optional[bool] = None, - do_not_log: Optional[bool] = None, - err_msg: Optional[str] = None, - interp_method: Optional[str] = None, - tile_count: Optional[int] = None, - area: Optional[int] = None, - volume: Optional[int] = None, - realm: Optional[str] = None, - multiple_send_data: Optional[bool] = None, - ) -> int: - - module_name = module_name[:64] - field_name = field_name[:64] - if long_name is not None: - long_name = long_name[:64] - if units is not None: - units = units[:64] - if standard_name is not None: - standard_name = standard_name[:64] - if err_msg is not None: - err_msg = err_msg[:64] - if interp_method is not None: - interp_method = interp_method[:64] - if realm is not None: - realm = realm[:64] - - _cfms_register_diag_field_array_cfloat = ( - self.clibFMS.cFMS_register_diag_field_array_cfloat - ) - - module_name_c, module_name_t = set_Cchar(module_name) - field_name_c, field_name_t = set_Cchar(field_name) - axes_p, axes_t = setarray_Cint32(axes) - long_name_c, long_name_t = set_Cchar(long_name) - units_c, units_t = set_Cchar(units) - missing_value_c, missing_value_t = setscalar_Cfloat(missing_value) - range_p, range_t = setarray_Cfloat(range) - mask_variant_c, mask_variant_t = setscalar_Cbool(mask_variant) - standard_name_c, standard_name_t = set_Cchar(standard_name) - verbose_c, verbose_t = setscalar_Cbool(verbose) - do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) - err_msg_c, err_msg_t = set_Cchar(err_msg) - interp_method_c, interp_method_t = set_Cchar(interp_method) - tile_count_c, tile_count_t = setscalar_Cint32(tile_count) - area_c, area_t = setscalar_Cint32(area) - volume_c, volume_t = setscalar_Cint32(volume) - realm_c, realm_t = set_Cchar(realm) - multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) - - _cfms_register_diag_field_array_cfloat.argtypes = [ - module_name_t, - field_name_t, - axes_t, - long_name_t, - units_t, - missing_value_t, - range_t, - mask_variant_t, - standard_name_t, - verbose_t, - do_not_log_t, - err_msg_t, - interp_method_t, - tile_count_t, - area_t, - volume_t, - realm_t, - multiple_send_data_t, - ] - _cfms_register_diag_field_array_cfloat.restype = ctypes.c_int - - return _cfms_register_diag_field_array_cfloat( - module_name_c, - field_name_c, - axes_p, - long_name_c, - units_c, - missing_value_c, - range_p, - mask_variant_c, - standard_name_c, - verbose_c, - do_not_log_c, - err_msg_c, - interp_method_c, - tile_count_c, - area_c, - volume_c, - realm_c, - multiple_send_data_c, - ) - - def register_diag_field_scalar_cint( - self, - module_name: str, - field_name: str, - long_name: Optional[str] = None, - units: Optional[str] = None, - standard_name: Optional[str] = None, - missing_value: Optional[int] = None, - range: Optional[NDArray] = None, - do_not_log: Optional[bool] = None, - err_msg: Optional[str] = None, - area: Optional[int] = None, - volume: Optional[int] = None, - realm: Optional[str] = None, - multiple_send_data: Optional[bool] = None, - ) -> int: - - module_name = module_name[:64] - field_name = field_name[:64] - if long_name is not None: - long_name = long_name[:64] - if units is not None: - units = units[:64] - if standard_name is not None: - standard_name = standard_name[:64] - if err_msg is not None: - err_msg = err_msg[:64] - if realm is not None: - realm = realm[:64] - - _cfms_register_diag_field_scalar_cint = ( - self.clibFMS.cFMS_register_diag_field_scalar_cint - ) - - module_name_c, module_name_t = set_Cchar(module_name) - field_name_c, field_name_t = set_Cchar(field_name) - long_name_c, long_name_t = set_Cchar(long_name) - units_c, units_t = set_Cchar(units) - standard_name_c, standard_name_t = set_Cchar(standard_name) - missing_value_c, missing_value_t = setscalar_Cint32(missing_value) - range_p, range_t = setarray_Cint32(range) - do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) - err_msg_c, err_msg_t = set_Cchar(err_msg) - area_c, area_t = setscalar_Cint32(area) - volume_c, volume_t = setscalar_Cint32(volume) - realm_c, realm_t = set_Cchar(realm) - multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) - - _cfms_register_diag_field_scalar_cint.argtypes = [ - module_name_t, - field_name_t, - long_name_t, - units_t, - standard_name_t, - missing_value_t, - range_t, - do_not_log_t, - err_msg_t, - area_t, - volume_t, - realm_t, - multiple_send_data_t, - ] - _cfms_register_diag_field_scalar_cint.restype = ctypes.c_int - - return _cfms_register_diag_field_scalar_cint( - module_name_c, - field_name_c, - long_name_c, - units_c, - standard_name_c, - missing_value_c, - range_p, - do_not_log_c, - err_msg_c, - area_c, - volume_c, - realm_c, - multiple_send_data_c, - ) - - def register_diag_field_scalar_cdouble( - self, - module_name: str, - field_name: str, - long_name: Optional[str] = None, - units: Optional[str] = None, - standard_name: Optional[str] = None, - missing_value: Optional[float] = None, - range: Optional[NDArray] = None, - do_not_log: Optional[bool] = None, - err_msg: Optional[str] = None, - area: Optional[int] = None, - volume: Optional[int] = None, - realm: Optional[str] = None, - multiple_send_data: Optional[bool] = None, - ) -> int: - - module_name = module_name[:64] - field_name = field_name[:64] - if long_name is not None: - long_name = long_name[:64] - if units is not None: - units = units[:64] - if standard_name is not None: - standard_name = standard_name[:64] - if err_msg is not None: - err_msg = err_msg[:64] - if realm is not None: - realm = realm[:64] - - _cfms_register_diag_field_scalar_cdouble = ( - self.clibFMS.cFMS_register_diag_field_scalar_cdouble - ) - - module_name_c, module_name_t = set_Cchar(module_name) - field_name_c, field_name_t = set_Cchar(field_name) - long_name_c, long_name_t = set_Cchar(long_name) - units_c, units_t = set_Cchar(units) - standard_name_c, standard_name_t = set_Cchar(standard_name) - missing_value_c, missing_value_t = setscalar_Cdouble(missing_value) - range_p, range_t = setarray_Cdouble(range) - do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) - err_msg_c, err_msg_t = set_Cchar(err_msg) - area_c, area_t = setscalar_Cint32(area) - volume_c, volume_t = setscalar_Cint32(volume) - realm_c, realm_t = set_Cchar(realm) - multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) - - _cfms_register_diag_field_scalar_cdouble.argtypes = [ - module_name_t, - field_name_t, - long_name_t, - units_t, - standard_name_t, - missing_value_t, - range_t, - do_not_log_t, - err_msg_t, - area_t, - volume_t, - realm_t, - multiple_send_data_t, - ] - _cfms_register_diag_field_scalar_cdouble.restype = ctypes.c_int - - return _cfms_register_diag_field_scalar_cdouble( - module_name_c, - field_name_c, - long_name_c, - units_c, - standard_name_c, - missing_value_c, - range_p, - do_not_log_c, - err_msg_c, - area_c, - volume_c, - realm_c, - multiple_send_data_c, - ) - - def register_diag_field_scalar_cfloat( - self, - module_name: str, - field_name: str, - long_name: Optional[str] = None, - units: Optional[str] = None, - standard_name: Optional[str] = None, - missing_value: Optional[float] = None, - range: Optional[NDArray] = None, - do_not_log: Optional[bool] = None, - err_msg: Optional[str] = None, - area: Optional[int] = None, - volume: Optional[int] = None, - realm: Optional[str] = None, - multiple_send_data: Optional[bool] = None, - ) -> int: - - module_name = module_name[:64] - field_name = field_name[:64] - if long_name is not None: - long_name = long_name[:64] - if units is not None: - units = units[:64] - if standard_name is not None: - standard_name = standard_name[:64] - if err_msg is not None: - err_msg = err_msg[:64] - if realm is not None: - realm = realm[:64] - - _cfms_register_diag_field_scalar_cfloat = ( - self.clibFMS.cFMS_register_diag_field_scalar_cfloat - ) - - module_name_c, module_name_t = set_Cchar(module_name) - field_name_c, field_name_t = set_Cchar(field_name) - long_name_c, long_name_t = set_Cchar(long_name) - units_c, units_t = set_Cchar(units) - standard_name_c, standard_name_t = set_Cchar(standard_name) - missing_value_c, missing_value_t = setscalar_Cfloat(missing_value) - range_p, range_t = setarray_Cfloat(range) - do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) - err_msg_c, err_msg_t = set_Cchar(err_msg) - area_c, area_t = setscalar_Cint32(area) - volume_c, volume_t = setscalar_Cint32(volume) - realm_c, realm_t = set_Cchar(realm) - multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) - - _cfms_register_diag_field_scalar_cfloat.argtypes = [ - module_name_t, - field_name_t, - long_name_t, - units_t, - standard_name_t, - missing_value_t, - range_t, - do_not_log_t, - err_msg_t, - area_t, - volume_t, - realm_t, - multiple_send_data_t, - ] - _cfms_register_diag_field_scalar_cfloat.restype = ctypes.c_int - - return _cfms_register_diag_field_scalar_cfloat( - module_name_c, - field_name_c, - long_name_c, - units_c, - standard_name_c, - missing_value_c, - range_p, - do_not_log_c, - err_msg_c, - area_c, - volume_c, - realm_c, - multiple_send_data_c, - ) diff --git a/pyfms/diag_manager/pyfms_send_data.py b/pyfms/diag_manager/pyfms_send_data.py deleted file mode 100644 index 89538cc..0000000 --- a/pyfms/diag_manager/pyfms_send_data.py +++ /dev/null @@ -1,417 +0,0 @@ -import ctypes -from typing import Optional - -from numpy.typing import NDArray - -from pyfms.pyfms_data_handling import ( - set_Cchar, - set_multipointer, - setarray_Cint32, - setscalar_Cint32, -) - - -class pyFMS_send_data: - - def __init__(self, clibFMS: ctypes.CDLL = None): - self.clibFMS = clibFMS - - """ - 2d send data wrappers - """ - - def diag_send_data_2d_cint( - self, - diag_field_id: int, - field_shape: NDArray, - field: NDArray, - err_msg: Optional[str] = None, - ) -> bool: - - err_msg = err_msg[:128] - - _cfms_diag_send_data_2d_cint = self.clibFMS.cFMS_diag_send_data_2d_cint - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = set_multipointer(arg=field, num_ptr=2) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_data_2d_cint.argtypes = [ - diag_field_id_t, - field_shape_t, - field_t, - err_msg_t, - ] - _cfms_diag_send_data_2d_cint.restype = ctypes.c_bool - - return _cfms_diag_send_data_2d_cint( - diag_field_id_c, - field_shape_p, - field_p, - err_msg_c, - ) - - def diag_send_data_2d_cdouble( - self, - diag_field_id: int, - field_shape: NDArray, - field: NDArray, - err_msg: Optional[str] = None, - ) -> bool: - - err_msg = err_msg[:128] - - _cfms_diag_send_data_2d_cdouble = self.clibFMS.cFMS_diag_send_data_2d_cdouble - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = set_multipointer(arg=field, num_ptr=2) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_data_2d_cdouble.argtypes = [ - diag_field_id_t, - field_shape_t, - field_t, - err_msg_t, - ] - _cfms_diag_send_data_2d_cdouble.restype = ctypes.c_bool - - return _cfms_diag_send_data_2d_cdouble( - diag_field_id_c, - field_shape_p, - field_p, - err_msg_c, - ) - - def diag_send_data_2d_cfloat( - self, - diag_field_id: int, - field_shape: NDArray, - field: NDArray, - err_msg: Optional[str] = None, - ) -> bool: - - err_msg = err_msg[:128] - - _cfms_diag_send_data_2d_cfloat = self.clibFMS.cFMS_diag_send_data_2d_cfloat - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = set_multipointer(arg=field, num_ptr=2) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_data_2d_cfloat.argtypes = [ - diag_field_id_t, - field_shape_t, - field_t, - err_msg_t, - ] - _cfms_diag_send_data_2d_cfloat.restype = ctypes.c_bool - - return _cfms_diag_send_data_2d_cfloat( - diag_field_id_c, - field_shape_p, - field_p, - err_msg_c, - ) - - """ - 3d send data wrappers - """ - - def diag_send_data_3d_cint( - self, - diag_field_id: int, - field_shape: NDArray, - field: NDArray, - err_msg: Optional[str] = None, - ) -> bool: - - err_msg = err_msg[:128] - - _cfms_diag_send_data_3d_cint = self.clibFMS.cFMS_diag_send_data_3d_cint - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = set_multipointer(arg=field, num_ptr=3) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_data_3d_cint.argtypes = [ - diag_field_id_t, - field_shape_t, - field_t, - err_msg_t, - ] - _cfms_diag_send_data_3d_cint.restype = ctypes.c_bool - - return _cfms_diag_send_data_3d_cint( - diag_field_id_c, - field_shape_p, - field_p, - err_msg_c, - ) - - def diag_send_data_3d_cdouble( - self, - diag_field_id: int, - field_shape: NDArray, - field: NDArray, - err_msg: Optional[str] = None, - ) -> bool: - - err_msg = err_msg[:128] - - _cfms_diag_send_data_3d_cdouble = self.clibFMS.cFMS_diag_send_data_3d_cdouble - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = set_multipointer(arg=field, num_ptr=3) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_data_3d_cdouble.argtypes = [ - diag_field_id_t, - field_shape_t, - field_t, - err_msg_t, - ] - _cfms_diag_send_data_3d_cdouble.restype = ctypes.c_bool - - return _cfms_diag_send_data_3d_cdouble( - diag_field_id_c, - field_shape_p, - field_p, - err_msg_c, - ) - - def diag_send_data_3d_cfloat( - self, - diag_field_id: int, - field_shape: NDArray, - field: NDArray, - err_msg: Optional[str] = None, - ) -> bool: - - err_msg = err_msg[:128] - - _cfms_diag_send_data_3d_cfloat = self.clibFMS.cFMS_diag_send_data_3d_cfloat - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = set_multipointer(arg=field, num_ptr=3) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_data_3d_cfloat.argtypes = [ - diag_field_id_t, - field_shape_t, - field_t, - err_msg_t, - ] - _cfms_diag_send_data_3d_cfloat.restype = ctypes.c_bool - - return _cfms_diag_send_data_3d_cfloat( - diag_field_id_c, - field_shape_p, - field_p, - err_msg_c, - ) - - """ - 4d send data wrappers - """ - - def diag_send_data_4d_cint( - self, - diag_field_id: int, - field_shape: NDArray, - field: NDArray, - err_msg: Optional[str] = None, - ) -> bool: - - err_msg = err_msg[:128] - - _cfms_diag_send_data_4d_cint = self.clibFMS.cFMS_diag_send_data_4d_cint - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = set_multipointer(arg=field, num_ptr=4) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_data_4d_cint.argtypes = [ - diag_field_id_t, - field_shape_t, - field_t, - err_msg_t, - ] - _cfms_diag_send_data_4d_cint.restype = ctypes.c_bool - - return _cfms_diag_send_data_4d_cint( - diag_field_id_c, - field_shape_p, - field_p, - err_msg_c, - ) - - def diag_send_data_4d_cdouble( - self, - diag_field_id: int, - field_shape: NDArray, - field: NDArray, - err_msg: Optional[str] = None, - ) -> bool: - - err_msg = err_msg[:128] - - _cfms_diag_send_data_4d_cdouble = self.clibFMS.cFMS_diag_send_data_4d_cdouble - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = set_multipointer(arg=field, num_ptr=4) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_data_4d_cdouble.argtypes = [ - diag_field_id_t, - field_shape_t, - field_t, - err_msg_t, - ] - _cfms_diag_send_data_4d_cdouble.restype = ctypes.c_bool - - return _cfms_diag_send_data_4d_cdouble( - diag_field_id_c, - field_shape_p, - field_p, - err_msg_c, - ) - - def diag_send_data_4d_cfloat( - self, - diag_field_id: int, - field_shape: NDArray, - field: NDArray, - err_msg: Optional[str] = None, - ) -> bool: - - err_msg = err_msg[:128] - - _cfms_diag_send_data_4d_cfloat = self.clibFMS.cFMS_diag_send_data_4d_cfloat - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = set_multipointer(arg=field, num_ptr=4) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_data_4d_cfloat.argtypes = [ - diag_field_id_t, - field_shape_t, - field_t, - err_msg_t, - ] - _cfms_diag_send_data_4d_cfloat.restype = ctypes.c_bool - - return _cfms_diag_send_data_4d_cfloat( - diag_field_id_c, - field_shape_p, - field_p, - err_msg_c, - ) - - """ - 5d send data wrappers - """ - - def diag_send_data_5d_cint( - self, - diag_field_id: int, - field_shape: NDArray, - field: NDArray, - err_msg: Optional[str] = None, - ) -> bool: - - err_msg = err_msg[:128] - - _cfms_diag_send_data_5d_cint = self.clibFMS.cFMS_diag_send_data_5d_cint - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = set_multipointer(arg=field, num_ptr=5) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_data_5d_cint.argtypes = [ - diag_field_id_t, - field_shape_t, - field_t, - err_msg_t, - ] - _cfms_diag_send_data_5d_cint.restype = ctypes.c_bool - - return _cfms_diag_send_data_5d_cint( - diag_field_id_c, - field_shape_p, - field_p, - err_msg_c, - ) - - def diag_send_data_5d_cdouble( - self, - diag_field_id: int, - field_shape: NDArray, - field: NDArray, - err_msg: Optional[str] = None, - ) -> bool: - - err_msg = err_msg[:128] - - _cfms_diag_send_data_5d_cdouble = self.clibFMS.cFMS_diag_send_data_5d_cdouble - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = set_multipointer(arg=field, num_ptr=5) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_data_5d_cdouble.argtypes = [ - diag_field_id_t, - field_shape_t, - field_t, - err_msg_t, - ] - _cfms_diag_send_data_5d_cdouble.restype = ctypes.c_bool - - return _cfms_diag_send_data_5d_cdouble( - diag_field_id_c, - field_shape_p, - field_p, - err_msg_c, - ) - - def diag_send_data_5d_cfloat( - self, - diag_field_id: int, - field_shape: NDArray, - field: NDArray, - err_msg: Optional[str] = None, - ) -> bool: - - err_msg = err_msg[:128] - - _cfms_diag_send_data_5d_cfloat = self.clibFMS.cFMS_diag_send_data_5d_cfloat - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = set_multipointer(arg=field, num_ptr=5) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_data_5d_cfloat.argtypes = [ - diag_field_id_t, - field_shape_t, - field_t, - err_msg_t, - ] - _cfms_diag_send_data_5d_cfloat.restype = ctypes.c_bool - - return _cfms_diag_send_data_5d_cfloat( - diag_field_id_c, - field_shape_p, - field_p, - err_msg_c, - ) diff --git a/pyfms/py_diag_manager/pyfms_diag_manager.py b/pyfms/py_diag_manager/pyfms_diag_manager.py new file mode 100644 index 0000000..b729c87 --- /dev/null +++ b/pyfms/py_diag_manager/pyfms_diag_manager.py @@ -0,0 +1,1313 @@ +import ctypes +from typing import Optional + +from numpy.typing import NDArray + +from pyfms.pyfms_utils.data_handling import ( + set_Cchar, + setarray_Cdouble, + setarray_Cfloat, + setarray_Cint32, + setscalar_Cbool, + setscalar_Cdouble, + setscalar_Cfloat, + setscalar_Cint32, +) + + +class pyFMS_diag_manager: + + def __init__(self, clibFMS: ctypes.CDLL = None): + self.clibFMS = clibFMS + + def diag_end(self): + _cfms_diag_end = self.clibFMS.cFMS_diag_end + + _cfms_diag_end.restype = None + + _cfms_diag_end() + + def diag_init( + self, + diag_model_subset: Optional[int] = None, + time_init: Optional[NDArray] = None, + err_msg: Optional[str] = None, + ) -> str: + if err_msg is not None: + err_msg = err_msg[:128] + + _cfms_diag_init = self.clibFMS.cFMS_diag_init + + diag_model_subset_c, diag_model_subset_t = setscalar_Cint32(diag_model_subset) + time_init_p, time_init_t = setarray_Cint32(time_init) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_init.argtypes = [ + diag_model_subset_t, + time_init_t, + err_msg_t, + ] + _cfms_diag_init.restype = None + + _cfms_diag_init(diag_model_subset_c, time_init_p, err_msg_c) + + return err_msg_c.value.decode("utf-8") + + def diag_send_complete( + self, + diag_field_id: int, + err_msg: Optional[str] = None, + ) -> str: + + if err_msg is not None: + err_msg = err_msg[:128] + + _cfms_diag_send_complete = self.clibFMS.CFMS_diag_send_complete + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_complete.argtypes = [diag_field_id_t, err_msg_t] + _cfms_diag_send_complete.restype = None + + _cfms_diag_send_complete(diag_field_id_c, err_msg_c) + + return err_msg_c.value.decode("utf-8") + + def diag_set_field_init_time( + self, + year: int, + month: int, + day: int, + hour: int, + minute: int, + second: Optional[int] = None, + tick: Optional[int] = None, + err_msg: Optional[str] = None, + ) -> str: + + if err_msg is not None: + err_msg = err_msg[:128] + + _cfms_diag_set_field_init_time = self.clibFMS.cFMS_diag_set_field_init_time + + year_c, year_t = setscalar_Cint32(year) + month_c, month_t = setscalar_Cint32(month) + day_c, day_t = setscalar_Cint32(day) + hour_c, hour_t = setscalar_Cint32(hour) + minute_c, minute_t = setscalar_Cint32(minute) + second_c, second_t = setscalar_Cint32(second) + tick_c, tick_t = setscalar_Cint32(tick) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_set_field_init_time.argtypes = [ + year_t, + month_t, + day_t, + hour_t, + minute_t, + second_t, + tick_t, + err_msg_t, + ] + _cfms_diag_set_field_init_time.restype = None + + _cfms_diag_set_field_init_time( + year_c, month_c, day_c, hour_c, minute_c, second_c, tick_c, err_msg_c + ) + + return err_msg_c.value.decode("utf-8") + + def diag_set_field_timestep( + self, + diag_field_id: int, + dseconds: int, + ddays: Optional[int] = None, + dticks: Optional[int] = None, + err_msg: Optional[str] = None, + ) -> str: + + if err_msg is not None: + err_msg = err_msg[:128] + + _cfms_diag_set_field_timestep = self.clibFMS.cFMS_diag_set_field_timestep + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + dseconds_c, dseconds_t = setscalar_Cint32(dseconds) + ddays_c, ddays_t = setscalar_Cint32(ddays) + dticks_c, dticks_t = setscalar_Cint32(dticks) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_set_field_timestep.argtypes = [ + diag_field_id_t, + dseconds_t, + ddays_t, + dticks_t, + err_msg_t, + ] + _cfms_diag_set_field_timestep.restype = None + + _cfms_diag_set_field_timestep( + diag_field_id_c, dseconds_c, ddays_c, dticks_c, err_msg_c + ) + + return err_msg_c.value.decode("utf-8") + + def diag_advance_field_time( + self, + diag_field_id: int, + ): + _cfms_diag_advance_field_time = self.clibFMS.cFMS_diag_advance_field_time + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + + _cfms_diag_advance_field_time.argtypes = [diag_field_id_t] + _cfms_diag_advance_field_time.restype = None + + _cfms_diag_advance_field_time(diag_field_id_c) + + def diag_set_time_end( + self, + year: Optional[int] = None, + month: Optional[int] = None, + day: Optional[int] = None, + hour: Optional[int] = None, + minute: Optional[int] = None, + second: Optional[int] = None, + tick: Optional[int] = None, + err_msg: Optional[str] = None, + ): + if err_msg is not None: + err_msg = err_msg[:128] + + _cfms_set_time_end = self.clibFMS.diag_set_time_end + + year_c, year_t = setscalar_Cint32(year) + month_c, month_t = setscalar_Cint32(month) + day_c, day_t = setscalar_Cint32(day) + hour_c, hour_t = setscalar_Cint32(hour) + minute_c, minute_t = setscalar_Cint32(minute) + second_c, second_t = setscalar_Cint32(second) + tick_c, tick_t = setscalar_Cint32(tick) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_set_time_end.argtypes = [ + year_t, + month_t, + day_t, + hour_t, + minute_t, + second_t, + tick_t, + err_msg_t, + ] + _cfms_set_time_end.restype = None + + _cfms_set_time_end( + year_c, + month_c, + day_c, + hour_c, + minute_c, + second_c, + tick_c, + err_msg_c, + ) + + def diag_axis_init_cdouble( + self, + name: str, + naxis_data: int, + axis_data: NDArray, + units: str, + cart_name: str, + long_name: Optional[str] = None, + set_name: Optional[str] = None, + direction: Optional[int] = None, + edges: Optional[int] = None, + aux: Optional[str] = None, + req: Optional[str] = None, + tile_count: Optional[int] = None, + domain_position: Optional[int] = None, + not_xy: Optional[bool] = None, + ) -> int: + _cfms_diag_axis_init_cdouble = self.clibFMS.cFMS_diag_axis_init_cdouble + + long_name = long_name[:64] + set_name = set_name[:64] + + name_c, name_t = set_Cchar(name) + naxis_data_c, naxis_data_t = setscalar_Cint32(naxis_data) + axis_data_p, axis_data_t = setarray_Cdouble(axis_data) + units_c, units_t = set_Cchar(units) + cart_name_c, cart_name_t = set_Cchar(cart_name) + long_name_c, long_name_t = set_Cchar(long_name) + set_name_c, set_name_t = set_Cchar(set_name) + direction_c, direction_t = setscalar_Cint32(direction) + edges_c, edges_t = setscalar_Cint32(edges) + aux_c, aux_t = set_Cchar(aux) + req_c, req_t = set_Cchar(req) + tile_count_c, tile_count_t = setscalar_Cint32(tile_count) + domain_position_c, domain_position_t = setscalar_Cint32(domain_position) + not_xy_c, not_xy_t = setscalar_Cbool(not_xy) + + _cfms_diag_axis_init_cdouble.argtypes = [ + name_t, + naxis_data_t, + axis_data_t, + units_t, + cart_name_t, + long_name_t, + set_name_t, + direction_t, + edges_t, + aux_t, + req_t, + tile_count_t, + domain_position_t, + not_xy_t, + ] + _cfms_diag_axis_init_cdouble.restype = ctypes.c_int + + return _cfms_diag_axis_init_cdouble( + name_c, + naxis_data_c, + axis_data_p, + units_c, + cart_name_c, + long_name_c, + set_name_c, + direction_c, + edges_c, + aux_c, + req_c, + tile_count_c, + domain_position_c, + not_xy_c, + ) + + def diag_axis_init_cfloat( + self, + name: str, + naxis_data: int, + axis_data: NDArray, + units: str, + cart_name: str, + long_name: Optional[str] = None, + set_name: Optional[str] = None, + direction: Optional[int] = None, + edges: Optional[int] = None, + aux: Optional[str] = None, + req: Optional[str] = None, + tile_count: Optional[int] = None, + domain_position: Optional[int] = None, + not_xy: Optional[bool] = None, + ) -> int: + _cfms_diag_axis_init_cfloat = self.clibFMS.cFMS_diag_axis_init_cfloat + + if long_name is not None: + long_name = long_name[:64] + if set_name is not None: + set_name = set_name[:64] + + name_c, name_t = set_Cchar(name) + naxis_data_c, naxis_data_t = setscalar_Cint32(naxis_data) + axis_data_p, axis_data_t = setarray_Cfloat(axis_data) + units_c, units_t = set_Cchar(units) + cart_name_c, cart_name_t = set_Cchar(cart_name) + long_name_c, long_name_t = set_Cchar(long_name) + set_name_c, set_name_t = set_Cchar(set_name) + direction_c, direction_t = setscalar_Cint32(direction) + edges_c, edges_t = setscalar_Cint32(edges) + aux_c, aux_t = set_Cchar(aux) + req_c, req_t = set_Cchar(req) + tile_count_c, tile_count_t = setscalar_Cint32(tile_count) + domain_position_c, domain_position_t = setscalar_Cint32(domain_position) + not_xy_c, not_xy_t = setscalar_Cbool(not_xy) + + _cfms_diag_axis_init_cfloat.argtypes = [ + name_t, + naxis_data_t, + axis_data_t, + units_t, + cart_name_t, + long_name_t, + set_name_t, + direction_t, + edges_t, + aux_t, + req_t, + tile_count_t, + domain_position_t, + not_xy_t, + ] + _cfms_diag_axis_init_cfloat.restype = ctypes.c_int + + return _cfms_diag_axis_init_cfloat( + name_c, + naxis_data_c, + axis_data_p, + units_c, + cart_name_c, + long_name_c, + set_name_c, + direction_c, + edges_c, + aux_c, + req_c, + tile_count_c, + domain_position_c, + not_xy_c, + ) + + def register_diag_field_array_cint( + self, + module_name: str, + field_name: str, + axes: Optional[NDArray] = None, + long_name: Optional[str] = None, + units: Optional[str] = None, + missing_value: Optional[int] = None, + range: Optional[NDArray] = None, + mask_variant: Optional[bool] = None, + standard_name: Optional[str] = None, + verbose: Optional[bool] = None, + do_not_log: Optional[bool] = None, + err_msg: Optional[str] = None, + interp_method: Optional[str] = None, + tile_count: Optional[int] = None, + area: Optional[int] = None, + volume: Optional[int] = None, + realm: Optional[str] = None, + multiple_send_data: Optional[bool] = None, + ) -> int: + + module_name = module_name[:64] + field_name = field_name[:64] + if long_name is not None: + long_name = long_name[:64] + if units is not None: + units = units[:64] + if standard_name is not None: + standard_name = standard_name[:64] + if err_msg is not None: + err_msg = err_msg[:64] + if interp_method is not None: + interp_method = interp_method[:64] + if realm is not None: + realm = realm[:64] + + _cfms_register_diag_field_array_cint = ( + self.clibFMS.cFMS_register_diag_field_array_cint + ) + + module_name_c, module_name_t = set_Cchar(module_name) + field_name_c, field_name_t = set_Cchar(field_name) + axes_p, axes_t = setarray_Cint32(axes) + long_name_c, long_name_t = set_Cchar(long_name) + units_c, units_t = set_Cchar(units) + missing_value_c, missing_value_t = setscalar_Cint32(missing_value) + range_p, range_t = setarray_Cint32(range) + mask_variant_c, mask_variant_t = setscalar_Cbool(mask_variant) + standard_name_c, standard_name_t = set_Cchar(standard_name) + verbose_c, verbose_t = setscalar_Cbool(verbose) + do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) + err_msg_c, err_msg_t = set_Cchar(err_msg) + interp_method_c, interp_method_t = set_Cchar(interp_method) + tile_count_c, tile_count_t = setscalar_Cint32(tile_count) + area_c, area_t = setscalar_Cint32(area) + volume_c, volume_t = setscalar_Cint32(volume) + realm_c, realm_t = set_Cchar(realm) + multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) + + _cfms_register_diag_field_array_cint.argtypes = [ + module_name_t, + field_name_t, + axes_t, + long_name_t, + units_t, + missing_value_t, + range_t, + mask_variant_t, + standard_name_t, + verbose_t, + do_not_log_t, + err_msg_t, + interp_method_t, + tile_count_t, + area_t, + volume_t, + realm_t, + multiple_send_data_t, + ] + _cfms_register_diag_field_array_cint.restype = ctypes.c_int + + return _cfms_register_diag_field_array_cint( + module_name_c, + field_name_c, + axes_p, + long_name_c, + units_c, + missing_value_c, + range_p, + mask_variant_c, + standard_name_c, + verbose_c, + do_not_log_c, + err_msg_c, + interp_method_c, + tile_count_c, + area_c, + volume_c, + realm_c, + multiple_send_data_c, + ) + + def register_diag_field_array_cdouble( + self, + module_name: str, + field_name: str, + axes: Optional[NDArray] = None, + long_name: Optional[str] = None, + units: Optional[str] = None, + missing_value: Optional[float] = None, + range: Optional[NDArray] = None, + mask_variant: Optional[bool] = None, + standard_name: Optional[str] = None, + verbose: Optional[bool] = None, + do_not_log: Optional[bool] = None, + err_msg: Optional[str] = None, + interp_method: Optional[str] = None, + tile_count: Optional[int] = None, + area: Optional[int] = None, + volume: Optional[int] = None, + realm: Optional[str] = None, + multiple_send_data: Optional[bool] = None, + ) -> int: + + module_name = module_name[:64] + field_name = field_name[:64] + if long_name is not None: + long_name = long_name[:64] + if units is not None: + units = units[:64] + if standard_name is not None: + standard_name = standard_name[:64] + if err_msg is not None: + err_msg = err_msg[:64] + if interp_method is not None: + interp_method = interp_method[:64] + if realm is not None: + realm = realm[:64] + + _cfms_register_diag_field_array_cdouble = ( + self.clibFMS.cFMS_register_diag_field_array_cdouble + ) + + module_name_c, module_name_t = set_Cchar(module_name) + field_name_c, field_name_t = set_Cchar(field_name) + axes_p, axes_t = setarray_Cint32(axes) + long_name_c, long_name_t = set_Cchar(long_name) + units_c, units_t = set_Cchar(units) + missing_value_c, missing_value_t = setscalar_Cdouble(missing_value) + range_p, range_t = setarray_Cdouble(range) + mask_variant_c, mask_variant_t = setscalar_Cbool(mask_variant) + standard_name_c, standard_name_t = set_Cchar(standard_name) + verbose_c, verbose_t = setscalar_Cbool(verbose) + do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) + err_msg_c, err_msg_t = set_Cchar(err_msg) + interp_method_c, interp_method_t = set_Cchar(interp_method) + tile_count_c, tile_count_t = setscalar_Cint32(tile_count) + area_c, area_t = setscalar_Cint32(area) + volume_c, volume_t = setscalar_Cint32(volume) + realm_c, realm_t = set_Cchar(realm) + multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) + + _cfms_register_diag_field_array_cdouble.argtypes = [ + module_name_t, + field_name_t, + axes_t, + long_name_t, + units_t, + missing_value_t, + range_t, + mask_variant_t, + standard_name_t, + verbose_t, + do_not_log_t, + err_msg_t, + interp_method_t, + tile_count_t, + area_t, + volume_t, + realm_t, + multiple_send_data_t, + ] + _cfms_register_diag_field_array_cdouble.restype = ctypes.c_int + + return _cfms_register_diag_field_array_cdouble( + module_name_c, + field_name_c, + axes_p, + long_name_c, + units_c, + missing_value_c, + range_p, + mask_variant_c, + standard_name_c, + verbose_c, + do_not_log_c, + err_msg_c, + interp_method_c, + tile_count_c, + area_c, + volume_c, + realm_c, + multiple_send_data_c, + ) + + def register_diag_field_array_cfloat( + self, + module_name: str, + field_name: str, + axes: Optional[NDArray] = None, + long_name: Optional[str] = None, + units: Optional[str] = None, + missing_value: Optional[float] = None, + range: Optional[NDArray] = None, + mask_variant: Optional[bool] = None, + standard_name: Optional[str] = None, + verbose: Optional[bool] = None, + do_not_log: Optional[bool] = None, + err_msg: Optional[str] = None, + interp_method: Optional[str] = None, + tile_count: Optional[int] = None, + area: Optional[int] = None, + volume: Optional[int] = None, + realm: Optional[str] = None, + multiple_send_data: Optional[bool] = None, + ) -> int: + + module_name = module_name[:64] + field_name = field_name[:64] + if long_name is not None: + long_name = long_name[:64] + if units is not None: + units = units[:64] + if standard_name is not None: + standard_name = standard_name[:64] + if err_msg is not None: + err_msg = err_msg[:64] + if interp_method is not None: + interp_method = interp_method[:64] + if realm is not None: + realm = realm[:64] + + _cfms_register_diag_field_array_cfloat = ( + self.clibFMS.cFMS_register_diag_field_array_cfloat + ) + + module_name_c, module_name_t = set_Cchar(module_name) + field_name_c, field_name_t = set_Cchar(field_name) + axes_p, axes_t = setarray_Cint32(axes) + long_name_c, long_name_t = set_Cchar(long_name) + units_c, units_t = set_Cchar(units) + missing_value_c, missing_value_t = setscalar_Cfloat(missing_value) + range_p, range_t = setarray_Cfloat(range) + mask_variant_c, mask_variant_t = setscalar_Cbool(mask_variant) + standard_name_c, standard_name_t = set_Cchar(standard_name) + verbose_c, verbose_t = setscalar_Cbool(verbose) + do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) + err_msg_c, err_msg_t = set_Cchar(err_msg) + interp_method_c, interp_method_t = set_Cchar(interp_method) + tile_count_c, tile_count_t = setscalar_Cint32(tile_count) + area_c, area_t = setscalar_Cint32(area) + volume_c, volume_t = setscalar_Cint32(volume) + realm_c, realm_t = set_Cchar(realm) + multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) + + _cfms_register_diag_field_array_cfloat.argtypes = [ + module_name_t, + field_name_t, + axes_t, + long_name_t, + units_t, + missing_value_t, + range_t, + mask_variant_t, + standard_name_t, + verbose_t, + do_not_log_t, + err_msg_t, + interp_method_t, + tile_count_t, + area_t, + volume_t, + realm_t, + multiple_send_data_t, + ] + _cfms_register_diag_field_array_cfloat.restype = ctypes.c_int + + return _cfms_register_diag_field_array_cfloat( + module_name_c, + field_name_c, + axes_p, + long_name_c, + units_c, + missing_value_c, + range_p, + mask_variant_c, + standard_name_c, + verbose_c, + do_not_log_c, + err_msg_c, + interp_method_c, + tile_count_c, + area_c, + volume_c, + realm_c, + multiple_send_data_c, + ) + + def register_diag_field_scalar_cint( + self, + module_name: str, + field_name: str, + long_name: Optional[str] = None, + units: Optional[str] = None, + standard_name: Optional[str] = None, + missing_value: Optional[int] = None, + range: Optional[NDArray] = None, + do_not_log: Optional[bool] = None, + err_msg: Optional[str] = None, + area: Optional[int] = None, + volume: Optional[int] = None, + realm: Optional[str] = None, + multiple_send_data: Optional[bool] = None, + ) -> int: + + module_name = module_name[:64] + field_name = field_name[:64] + if long_name is not None: + long_name = long_name[:64] + if units is not None: + units = units[:64] + if standard_name is not None: + standard_name = standard_name[:64] + if err_msg is not None: + err_msg = err_msg[:64] + if realm is not None: + realm = realm[:64] + + _cfms_register_diag_field_scalar_cint = ( + self.clibFMS.cFMS_register_diag_field_scalar_cint + ) + + module_name_c, module_name_t = set_Cchar(module_name) + field_name_c, field_name_t = set_Cchar(field_name) + long_name_c, long_name_t = set_Cchar(long_name) + units_c, units_t = set_Cchar(units) + standard_name_c, standard_name_t = set_Cchar(standard_name) + missing_value_c, missing_value_t = setscalar_Cint32(missing_value) + range_p, range_t = setarray_Cint32(range) + do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) + err_msg_c, err_msg_t = set_Cchar(err_msg) + area_c, area_t = setscalar_Cint32(area) + volume_c, volume_t = setscalar_Cint32(volume) + realm_c, realm_t = set_Cchar(realm) + multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) + + _cfms_register_diag_field_scalar_cint.argtypes = [ + module_name_t, + field_name_t, + long_name_t, + units_t, + standard_name_t, + missing_value_t, + range_t, + do_not_log_t, + err_msg_t, + area_t, + volume_t, + realm_t, + multiple_send_data_t, + ] + _cfms_register_diag_field_scalar_cint.restype = ctypes.c_int + + return _cfms_register_diag_field_scalar_cint( + module_name_c, + field_name_c, + long_name_c, + units_c, + standard_name_c, + missing_value_c, + range_p, + do_not_log_c, + err_msg_c, + area_c, + volume_c, + realm_c, + multiple_send_data_c, + ) + + def register_diag_field_scalar_cdouble( + self, + module_name: str, + field_name: str, + long_name: Optional[str] = None, + units: Optional[str] = None, + standard_name: Optional[str] = None, + missing_value: Optional[float] = None, + range: Optional[NDArray] = None, + do_not_log: Optional[bool] = None, + err_msg: Optional[str] = None, + area: Optional[int] = None, + volume: Optional[int] = None, + realm: Optional[str] = None, + multiple_send_data: Optional[bool] = None, + ) -> int: + + module_name = module_name[:64] + field_name = field_name[:64] + if long_name is not None: + long_name = long_name[:64] + if units is not None: + units = units[:64] + if standard_name is not None: + standard_name = standard_name[:64] + if err_msg is not None: + err_msg = err_msg[:64] + if realm is not None: + realm = realm[:64] + + _cfms_register_diag_field_scalar_cdouble = ( + self.clibFMS.cFMS_register_diag_field_scalar_cdouble + ) + + module_name_c, module_name_t = set_Cchar(module_name) + field_name_c, field_name_t = set_Cchar(field_name) + long_name_c, long_name_t = set_Cchar(long_name) + units_c, units_t = set_Cchar(units) + standard_name_c, standard_name_t = set_Cchar(standard_name) + missing_value_c, missing_value_t = setscalar_Cdouble(missing_value) + range_p, range_t = setarray_Cdouble(range) + do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) + err_msg_c, err_msg_t = set_Cchar(err_msg) + area_c, area_t = setscalar_Cint32(area) + volume_c, volume_t = setscalar_Cint32(volume) + realm_c, realm_t = set_Cchar(realm) + multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) + + _cfms_register_diag_field_scalar_cdouble.argtypes = [ + module_name_t, + field_name_t, + long_name_t, + units_t, + standard_name_t, + missing_value_t, + range_t, + do_not_log_t, + err_msg_t, + area_t, + volume_t, + realm_t, + multiple_send_data_t, + ] + _cfms_register_diag_field_scalar_cdouble.restype = ctypes.c_int + + return _cfms_register_diag_field_scalar_cdouble( + module_name_c, + field_name_c, + long_name_c, + units_c, + standard_name_c, + missing_value_c, + range_p, + do_not_log_c, + err_msg_c, + area_c, + volume_c, + realm_c, + multiple_send_data_c, + ) + + def register_diag_field_scalar_cfloat( + self, + module_name: str, + field_name: str, + long_name: Optional[str] = None, + units: Optional[str] = None, + standard_name: Optional[str] = None, + missing_value: Optional[float] = None, + range: Optional[NDArray] = None, + do_not_log: Optional[bool] = None, + err_msg: Optional[str] = None, + area: Optional[int] = None, + volume: Optional[int] = None, + realm: Optional[str] = None, + multiple_send_data: Optional[bool] = None, + ) -> int: + + module_name = module_name[:64] + field_name = field_name[:64] + if long_name is not None: + long_name = long_name[:64] + if units is not None: + units = units[:64] + if standard_name is not None: + standard_name = standard_name[:64] + if err_msg is not None: + err_msg = err_msg[:64] + if realm is not None: + realm = realm[:64] + + _cfms_register_diag_field_scalar_cfloat = ( + self.clibFMS.cFMS_register_diag_field_scalar_cfloat + ) + + module_name_c, module_name_t = set_Cchar(module_name) + field_name_c, field_name_t = set_Cchar(field_name) + long_name_c, long_name_t = set_Cchar(long_name) + units_c, units_t = set_Cchar(units) + standard_name_c, standard_name_t = set_Cchar(standard_name) + missing_value_c, missing_value_t = setscalar_Cfloat(missing_value) + range_p, range_t = setarray_Cfloat(range) + do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) + err_msg_c, err_msg_t = set_Cchar(err_msg) + area_c, area_t = setscalar_Cint32(area) + volume_c, volume_t = setscalar_Cint32(volume) + realm_c, realm_t = set_Cchar(realm) + multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) + + _cfms_register_diag_field_scalar_cfloat.argtypes = [ + module_name_t, + field_name_t, + long_name_t, + units_t, + standard_name_t, + missing_value_t, + range_t, + do_not_log_t, + err_msg_t, + area_t, + volume_t, + realm_t, + multiple_send_data_t, + ] + _cfms_register_diag_field_scalar_cfloat.restype = ctypes.c_int + + return _cfms_register_diag_field_scalar_cfloat( + module_name_c, + field_name_c, + long_name_c, + units_c, + standard_name_c, + missing_value_c, + range_p, + do_not_log_c, + err_msg_c, + area_c, + volume_c, + realm_c, + multiple_send_data_c, + ) + + """ + 2d send data wrappers + """ + + def diag_send_data_2d_cint( + self, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, + err_msg: Optional[str] = None, + ) -> bool: + + err_msg = err_msg[:128] + + _cfms_diag_send_data_2d_cint = self.clibFMS.cFMS_diag_send_data_2d_cint + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_p, field_t = setarray_Cint32(field) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_data_2d_cint.argtypes = [ + diag_field_id_t, + field_shape_t, + field_t, + err_msg_t, + ] + _cfms_diag_send_data_2d_cint.restype = ctypes.c_bool + + return _cfms_diag_send_data_2d_cint( + diag_field_id_c, + field_shape_p, + field_p, + err_msg_c, + ) + + def diag_send_data_2d_cdouble( + self, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, + err_msg: Optional[str] = None, + ) -> bool: + + err_msg = err_msg[:128] + + _cfms_diag_send_data_2d_cdouble = self.clibFMS.cFMS_diag_send_data_2d_cdouble + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_p, field_t = setarray_Cdouble(field) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_data_2d_cdouble.argtypes = [ + diag_field_id_t, + field_shape_t, + field_t, + err_msg_t, + ] + _cfms_diag_send_data_2d_cdouble.restype = ctypes.c_bool + + return _cfms_diag_send_data_2d_cdouble( + diag_field_id_c, + field_shape_p, + field_p, + err_msg_c, + ) + + def diag_send_data_2d_cfloat( + self, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, + err_msg: Optional[str] = None, + ) -> bool: + + err_msg = err_msg[:128] + + _cfms_diag_send_data_2d_cfloat = self.clibFMS.cFMS_diag_send_data_2d_cfloat + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_p, field_t = setarray_Cfloat(field) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_data_2d_cfloat.argtypes = [ + diag_field_id_t, + field_shape_t, + field_t, + err_msg_t, + ] + _cfms_diag_send_data_2d_cfloat.restype = ctypes.c_bool + + return _cfms_diag_send_data_2d_cfloat( + diag_field_id_c, + field_shape_p, + field_p, + err_msg_c, + ) + + """ + 3d send data wrappers + """ + + def diag_send_data_3d_cint( + self, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, + err_msg: Optional[str] = None, + ) -> bool: + + err_msg = err_msg[:128] + + _cfms_diag_send_data_3d_cint = self.clibFMS.cFMS_diag_send_data_3d_cint + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_p, field_t = setarray_Cint32(field) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_data_3d_cint.argtypes = [ + diag_field_id_t, + field_shape_t, + field_t, + err_msg_t, + ] + _cfms_diag_send_data_3d_cint.restype = ctypes.c_bool + + return _cfms_diag_send_data_3d_cint( + diag_field_id_c, + field_shape_p, + field_p, + err_msg_c, + ) + + def diag_send_data_3d_cdouble( + self, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, + err_msg: Optional[str] = None, + ) -> bool: + + err_msg = err_msg[:128] + + _cfms_diag_send_data_3d_cdouble = self.clibFMS.cFMS_diag_send_data_3d_cdouble + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_p, field_t = setarray_Cdouble(field) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_data_3d_cdouble.argtypes = [ + diag_field_id_t, + field_shape_t, + field_t, + err_msg_t, + ] + _cfms_diag_send_data_3d_cdouble.restype = ctypes.c_bool + + return _cfms_diag_send_data_3d_cdouble( + diag_field_id_c, + field_shape_p, + field_p, + err_msg_c, + ) + + def diag_send_data_3d_cfloat( + self, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, + err_msg: Optional[str] = None, + ) -> bool: + + err_msg = err_msg[:128] + + _cfms_diag_send_data_3d_cfloat = self.clibFMS.cFMS_diag_send_data_3d_cfloat + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_p, field_t = setarray_Cfloat(arg=field) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_data_3d_cfloat.argtypes = [ + diag_field_id_t, + field_shape_t, + field_t, + err_msg_t, + ] + _cfms_diag_send_data_3d_cfloat.restype = ctypes.c_bool + + return _cfms_diag_send_data_3d_cfloat( + diag_field_id_c, + field_shape_p, + field_p, + err_msg_c, + ) + + """ + 4d send data wrappers + """ + + def diag_send_data_4d_cint( + self, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, + err_msg: Optional[str] = None, + ) -> bool: + + err_msg = err_msg[:128] + + _cfms_diag_send_data_4d_cint = self.clibFMS.cFMS_diag_send_data_4d_cint + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_p, field_t = setarray_Cint32(field) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_data_4d_cint.argtypes = [ + diag_field_id_t, + field_shape_t, + field_t, + err_msg_t, + ] + _cfms_diag_send_data_4d_cint.restype = ctypes.c_bool + + return _cfms_diag_send_data_4d_cint( + diag_field_id_c, + field_shape_p, + field_p, + err_msg_c, + ) + + def diag_send_data_4d_cdouble( + self, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, + err_msg: Optional[str] = None, + ) -> bool: + + err_msg = err_msg[:128] + + _cfms_diag_send_data_4d_cdouble = self.clibFMS.cFMS_diag_send_data_4d_cdouble + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_p, field_t = setarray_Cdouble(field) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_data_4d_cdouble.argtypes = [ + diag_field_id_t, + field_shape_t, + field_t, + err_msg_t, + ] + _cfms_diag_send_data_4d_cdouble.restype = ctypes.c_bool + + return _cfms_diag_send_data_4d_cdouble( + diag_field_id_c, + field_shape_p, + field_p, + err_msg_c, + ) + + def diag_send_data_4d_cfloat( + self, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, + err_msg: Optional[str] = None, + ) -> bool: + + err_msg = err_msg[:128] + + _cfms_diag_send_data_4d_cfloat = self.clibFMS.cFMS_diag_send_data_4d_cfloat + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_p, field_t = setarray_Cfloat(field) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_data_4d_cfloat.argtypes = [ + diag_field_id_t, + field_shape_t, + field_t, + err_msg_t, + ] + _cfms_diag_send_data_4d_cfloat.restype = ctypes.c_bool + + return _cfms_diag_send_data_4d_cfloat( + diag_field_id_c, + field_shape_p, + field_p, + err_msg_c, + ) + + """ + 5d send data wrappers + """ + + def diag_send_data_5d_cint( + self, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, + err_msg: Optional[str] = None, + ) -> bool: + + err_msg = err_msg[:128] + + _cfms_diag_send_data_5d_cint = self.clibFMS.cFMS_diag_send_data_5d_cint + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_p, field_t = setarray_Cint32(field) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_data_5d_cint.argtypes = [ + diag_field_id_t, + field_shape_t, + field_t, + err_msg_t, + ] + _cfms_diag_send_data_5d_cint.restype = ctypes.c_bool + + return _cfms_diag_send_data_5d_cint( + diag_field_id_c, + field_shape_p, + field_p, + err_msg_c, + ) + + def diag_send_data_5d_cdouble( + self, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, + err_msg: Optional[str] = None, + ) -> bool: + + err_msg = err_msg[:128] + + _cfms_diag_send_data_5d_cdouble = self.clibFMS.cFMS_diag_send_data_5d_cdouble + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_p, field_t = setarray_Cdouble(field) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_data_5d_cdouble.argtypes = [ + diag_field_id_t, + field_shape_t, + field_t, + err_msg_t, + ] + _cfms_diag_send_data_5d_cdouble.restype = ctypes.c_bool + + return _cfms_diag_send_data_5d_cdouble( + diag_field_id_c, + field_shape_p, + field_p, + err_msg_c, + ) + + def diag_send_data_5d_cfloat( + self, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, + err_msg: Optional[str] = None, + ) -> bool: + + err_msg = err_msg[:128] + + _cfms_diag_send_data_5d_cfloat = self.clibFMS.cFMS_diag_send_data_5d_cfloat + + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_p, field_t = setarray_Cfloat(field) + err_msg_c, err_msg_t = set_Cchar(err_msg) + + _cfms_diag_send_data_5d_cfloat.argtypes = [ + diag_field_id_t, + field_shape_t, + field_t, + err_msg_t, + ] + _cfms_diag_send_data_5d_cfloat.restype = ctypes.c_bool + + return _cfms_diag_send_data_5d_cfloat( + diag_field_id_c, + field_shape_p, + field_p, + err_msg_c, + ) diff --git a/pyfms/py_horiz_interp/py_horiz_interp.py b/pyfms/py_horiz_interp/py_horiz_interp.py index b1ec680..b14fea9 100644 --- a/pyfms/py_horiz_interp/py_horiz_interp.py +++ b/pyfms/py_horiz_interp/py_horiz_interp.py @@ -4,7 +4,7 @@ import numpy.typing as npt -class HorizInterp: +class pyHorizInterp: def __init__(self, cfms: ctypes.CDLL): self.cfms = cfms diff --git a/pyfms/py_mpp/py_mpp_domains.py b/pyfms/py_mpp/py_mpp_domains.py index 3841b7c..587106e 100644 --- a/pyfms/py_mpp/py_mpp_domains.py +++ b/pyfms/py_mpp/py_mpp_domains.py @@ -6,7 +6,7 @@ from ..pyfms_utils.data_handling import ( set_Cchar, - set_multipointer, + setarray_Cbool, setarray_Cint32, setscalar_Cbool, setscalar_Cint32, @@ -70,6 +70,7 @@ def define_domains( xextent: Optional[NDArray] = None, yextent: Optional[NDArray] = None, maskmap: Optional[NDArray[np.bool_]] = None, + maskmap_shape: Optional[NDArray] = None, name: Optional[str] = None, symmetry: Optional[bool] = None, memory_size: Optional[NDArray] = None, @@ -97,7 +98,8 @@ def define_domains( yhalo_c, yhalo_t = setscalar_Cint32(yhalo) xextent_p, xextent_t = setarray_Cint32(xextent) yextent_p, yextent_t = setarray_Cint32(yextent) - maskmap_p, maskmap_t = set_multipointer(arg=maskmap, num_ptr=2) + maskmap_p, maskmap_t = setarray_Cbool(maskmap) + maskmap_shape_p, maskmap_shape_t = setarray_Cint32(maskmap_shape) name_c, name_t = set_Cchar(name) symmetry_c, symmetry_t = setscalar_Cbool(symmetry) memory_size_p, memory_size_t = setarray_Cint32(memory_size) @@ -124,6 +126,7 @@ def define_domains( xextent_t, yextent_t, maskmap_t, + maskmap_shape_t, name_t, symmetry_t, memory_size_t, @@ -153,6 +156,7 @@ def define_domains( xextent_p, yextent_p, maskmap_p, + maskmap_shape_p, name_c, symmetry_c, memory_size_p, diff --git a/pyfms/pyfms_utils/data_handling.py b/pyfms/pyfms_utils/data_handling.py index 5a6ad5d..90f03d7 100644 --- a/pyfms/pyfms_utils/data_handling.py +++ b/pyfms/pyfms_utils/data_handling.py @@ -98,108 +98,6 @@ def setarray_Cint32( return arg, set_ndpointer(arg) -""" -set_multipointer: - For converting NumPy arrays to pointer equivalent - This method is able to convert a Numpy array of - up to 5 dimensions to quintuple pointer (*****). - - If an array of <= 1 or > 5 dimensions is passed - as an argument, the method will default to the - returning the passed array and the result of a - pass to set_ndpointer. - - This method is expected to be slow, and when - possible avoided. -""" - - -def set_multipointer(arg: npt.NDArray, num_ptr: int) -> Tuple: - if arg is not None: - c_type = np.ctypeslib.as_ctypes_type(arg.dtype) - match num_ptr: - case 2: - if arg is not None: - arg_ptr = (ctypes.POINTER(c_type) * arg.shape[0])() - for i in range(arg.shape[0]): - arg_ptr[i] = arg[i].ctypes.data_as(ctypes.POINTER(c_type)) - return arg_ptr, ctypes.POINTER(ctypes.POINTER(c_type)) - else: - return arg, ctypes.POINTER(ctypes.POINTER(ctypes.c_int)) - case 3: - if arg is not None: - arg_ptr = (ctypes.POINTER(ctypes.POINTER(c_type)) * arg.shape[0])() - for i in range(arg.shape[0]): - arg_ptr[i] = (ctypes.POINTER(c_type) * arg.shape[1])() - for j in range(arg.shape[1]): - arg_ptr[i][j] = arg[i][j].ctypes.data_as(ctypes.POINTER(c_type)) - return arg_ptr, ctypes.POINTER(ctypes.POINTER(ctypes.POINTER(c_type))) - else: - return arg, ctypes.POINTER(ctypes.POINTER(ctypes.POINTER(ctypes.c_int))) - case 4: - if arg is not None: - arg_ptr = ( - ctypes.POINTER(ctypes.POINTER(ctypes.POINTER(c_type))) - * arg.shape[0] - )() - for i in range(arg.shape[0]): - arg_ptr[i] = ( - ctypes.POINTER(ctypes.POINTER(c_type)) * arg.shape[1] - )() - for j in range(arg.shape[1]): - arg_ptr[i][j] = (ctypes.POINTER(c_type) * arg.shape[2])() - for k in range(arg.shape[2]): - arg_ptr[i][j][k] = arg[i][j][k].ctypes.data_as( - ctypes.POINTER(c_type) - ) - return arg_ptr, ctypes.POINTER( - ctypes.POINTER(ctypes.POINTER(ctypes.POINTER(c_type))) - ) - else: - return arg, ctypes.POINTER( - ctypes.POINTER(ctypes.POINTER(ctypes.POINTER(ctypes.c_int))) - ) - case 5: - if arg is not None: - arg_ptr = ( - ctypes.POINTER( - ctypes.POINTER(ctypes.POINTER(ctypes.POINTER(c_type))) - ) - * arg.shape[0] - )() - for i in range(arg.shape[0]): - arg_ptr[i] = ( - ctypes.POINTER(ctypes.POINTER(ctypes.POINTER(c_type))) - * arg.shape[1] - )() - for j in range(arg.shape[1]): - arg_ptr[i][j] = ( - ctypes.POINTER(ctypes.POINTER(c_type)) * arg.shape[2] - )() - for k in range(arg.shape[2]): - arg_ptr[i][j][k] = (ctypes.POINTER(c_type) * arg.shape[3])() - for n in range(arg.shape[3]): - arg_ptr[i][j][k][n] = arg[i][j][k][n].ctypes.data_as( - ctypes.POINTER(c_type) - ) - return arg_ptr, ctypes.POINTER( - ctypes.POINTER( - ctypes.POINTER(ctypes.POINTER(ctypes.POINTER(c_type))) - ) - ) - else: - return arg, ctypes.POINTER( - ctypes.POINTER( - ctypes.POINTER(ctypes.POINTER(ctypes.POINTER(ctypes.c_int))) - ) - ) - case _: - if arg is not None: - return arg, set_ndpointer(arg) - else: - return arg, ctypes.POINTER(ctypes.c_int) - - """ Scalar setting methods """ diff --git a/tests/diag_manager/test_diag_manager.py b/tests/diag_manager/test_diag_manager.py deleted file mode 100644 index 17614d2..0000000 --- a/tests/diag_manager/test_diag_manager.py +++ /dev/null @@ -1,314 +0,0 @@ -import os -import numpy as np - -from pyfms import ( - pyFMS, - pyFMS_diag_axis_init, - pyFMS_diag_manager, - pyFMS_mpp_domains, - pyFMS_register_diag_field, - pyFMS_send_data, -) - - -def test_send_data(): - - NX = 8 - NY = 8 - NZ = 2 - - input_file = "input.nml" - diag_table = "diag_table.yaml" - - input_text = """ -&diag_manager_nml - use_modern_diag = .true. -/""" - - diag_text = """ -title: test_diag_manager -base_date: 2 1 1 1 1 1 - -diag_files: -- file_name: test_send_data - freq: 1 hours - time_units: hours - unlimdim: time - varlist: - - module: atm_mod - var_name: var_3d - reduction: average - kind: r4 - output_name: var3_avg - - module: atm_mod - var_name: var_2d - reduction: average - kind: r4 - output_name: var2_avg - """ - - with open(input_file, "w") as file1: - file1.write(input_text) - with open(diag_table, "w") as file2: - file2.write(diag_text) - - domain_id = 0 - - var2_shape = np.array([NX, NY], dtype=np.int32, order="C") - var2 = np.empty(shape=NX * NY, dtype=np.float32, order="C") - - var3_shape = np.array([NX, NY, NZ], dtype=np.int32, order="C") - var3 = np.empty(shape=NX * NY * NZ, dtype=np.float32, order="C") - - ijk = 0 - for i in range(NX): - for j in range(NY): - for k in range(NZ): - var3[ijk] = i * 100 + j * 10 + k * 1 - ijk += 1 - - ij = 0 - for i in range(NX): - for j in range(NY): - var2[ij] = i * 10.0 + j * 1.0 - ij += 1 - - pyfms = pyFMS(clibFMS_path="./cFMS/libcFMS/.libs/libcFMS.so") - mpp_domains = pyFMS_mpp_domains(clibFMS=pyfms.clibFMS) - - global_indices = np.array([0, NX - 1, 0, NY - 1], dtype=np.int32, order="C") - layout = np.array([1, 1], dtype=np.int32, order="C") - io_layout = np.array([1, 1], dtype=np.int32, order="C") - - mpp_domains.define_domains( - domain_id=domain_id, - global_indices=global_indices, - layout=layout, - ) - mpp_domains.define_io_domain( - domain_id=domain_id, - io_layout=io_layout, - ) - - """ - diag manager init - """ - - diag_model_subset = 2 - # time_init = np.empty(shape=6, dtype=np.int32, order="C") - calendar_type = 4 - err_msg = "None" - - diag_manager = pyFMS_diag_manager(clibFMS=pyfms.clibFMS) - diag_manager.diag_init( - diag_model_subset=diag_model_subset, - calendar_type=calendar_type, - err_msg=err_msg, - ) - - mpp_domains.set_current_domain(domain_id=domain_id) - - diag_axis = pyFMS_diag_axis_init(clibFMS=pyfms.clibFMS) - - """ - diag axis init x - """ - x = np.empty(shape=NX, dtype=np.float64, order="C") - - for i in range(NX): - x[i] = i - - id_x = diag_axis.diag_axis_init_cdouble( - name="x", - naxis_data=NX, - axis_data=x, - units="point_E", - cart_name="x", - long_name="point_E", - set_name="atm", - direction=0, - edges=0, - aux="", - req="", - tile_count=0, - domain_position=0, - ) - - """ - diag axis init y - """ - y = np.empty(shape=NY, dtype=np.float64, order="C") - - for j in range(NY): - y[j] = j - - id_y = diag_axis.diag_axis_init_cdouble( - name="y", - naxis_data=NY, - axis_data=y, - units="point_N", - cart_name="y", - long_name="point_N", - set_name="atm", - direction=0, - edges=0, - aux="", - req="", - tile_count=0, - domain_position=0, - ) - - """ - diag axis init z - """ - - z = np.empty(shape=NZ, dtype=np.float64, order="C") - - for k in range(NZ): - z[k] = k - - id_z = diag_axis.diag_axis_init_cdouble( - name="z", - naxis_data=NZ, - axis_data=z, - units="point_Z", - cart_name="z", - long_name="point_Z", - set_name="atm", - direction=0, - edges=0, - aux="", - req="", - tile_count=0, - domain_position=0, - not_xy=True, - ) - - # """ - # register diag field var3 - # """ - - # register = pyFMS_register_diag_field(clibFMS=pyfms.clibFMS) - - # axes_3d = np.array([id_x, id_y, id_z, 0, 0], dtype=np.int32, order="C") - # range_3d = np.array([-1000.0, 1000.0], dtype=np.float32, order="C") - - # diag_manager.diag_set_field_init_time( - # year=2, - # month=1, - # day=1, - # hour=1, - # minute=1, - # second=1, - # ) - - # id_var3 = register.register_diag_field_array_cfloat( - # module_name="atm_mod", - # field_name="var_3d", - # axes=axes_3d, - # long_name="Var in a lon/lat domain", - # units="muntin", - # missing_value=-99.99, - # range=range_3d, - # ) - - # diag_manager.diag_set_field_timestep( - # diag_field_id=id_var3, dseconds=60 * 60, ddays=0, dticks=0 - # ) - - # """ - # register diag_field var 2 - # """ - - # axes_2d = np.array([id_x, id_y, 0, 0, 0], dtype=np.int32, order="C") - # range_2d = np.array([-1000.0, 1000.0], dtype=np.float32, order="C") - - # diag_manager.diag_set_field_init_time( - # year=2, - # month=1, - # day=1, - # hour=1, - # minute=1, - # second=1, - # ) - - # id_var2 = register.register_diag_field_array_cfloat( - # module_name="atm_mod", - # field_name="var_2d", - # axes=axes_2d, - # long_name="Var in a lon/lat domain", - # units="muntin", - # missing_value=-99.99, - # range=range_2d, - # ) - - # diag_manager.diag_set_field_timestep( - # diag_field_id=id_var2, - # dseconds=60 * 60, - # ddays=0, - # dticks=0, - # ) - - # """ - # diag set time end - # """ - - # diag_manager.diag_set_time_end( - # year=2, - # month=1, - # day=2, - # hour=1, - # minute=1, - # second=1, - # tick=0, - # ) - - # """ - # send data - # """ - - # data_sender = pyFMS_send_data(clibFMS=pyfms.clibFMS) - - # data_sender.diag_send_data_3d_cfloat( - # diag_field_id=id_var3, - # field_shape=var3_shape, - # field=var3, - # ) - - # for itime in range(24): - # ijk = 0 - # for i in range(NX): - # for j in range(NY): - # for k in range(NZ): - # var3[ijk] = -1.0 * var3[ijk] - # ijk += 1 - # diag_manager.diag_advance_field_time(diag_field_id=id_var3) - # data_sender.diag_send_data_3d_cfloat( - # diag_field_id=id_var3, - # field_shape=var3_shape, - # field=var3, - # ) - # diag_manager.diag_send_complete(diag_field_id=id_var3) - - # ij = 0 - # for i in range(NX): - # for j in range(NY): - # var2[ij] = -1.0 * var2[ij] - # ij += 1 - # diag_manager.diag_advance_field_time(diag_field_id=id_var2) - # data_sender.diag_send_data_2d_cfloat( - # diag_field_id=id_var2, - # field_shape=var2_shape, - # field=var2, - # ) - # diag_manager.diag_send_complete(diag_field_id=id_var2) - - diag_manager.diag_end() - - pyfms.pyfms_end() - - # os.remove(input_file) - # os.remove(diag_table) - -if __name__ == "__main__": - test_send_data() diff --git a/tests/py_diag_manager/test_diag_manager.py b/tests/py_diag_manager/test_diag_manager.py new file mode 100644 index 0000000..565bc46 --- /dev/null +++ b/tests/py_diag_manager/test_diag_manager.py @@ -0,0 +1,302 @@ +import os + +import numpy as np + +from pyfms import pyFMS, pyFMS_diag_manager, pyFMS_mpp_domains + + +def test_send_data(): + + NX = 8 + NY = 8 + NZ = 2 + + input_file = "input.nml" + diag_table = "diag_table.yaml" + + input_text = """ +&diag_manager_nml + use_modern_diag = .true. +/""" + + diag_text = """ +title: test_diag_manager +base_date: 2 1 1 1 1 1 + +diag_files: +- file_name: test_send_data + freq: 1 hours + time_units: hours + unlimdim: time + varlist: + - module: atm_mod + var_name: var_3d + reduction: average + kind: r4 + output_name: var3_avg + - module: atm_mod + var_name: var_2d + reduction: average + kind: r4 + output_name: var2_avg + """ + + with open(input_file, "w") as file1: + file1.write(input_text) + with open(diag_table, "w") as file2: + file2.write(diag_text) + + domain_id = 0 + calendar_type = 4 + + var2_shape = np.array([NX, NY], dtype=np.int32, order="C") + var2 = np.empty(shape=NX * NY, dtype=np.float32, order="C") + + var3_shape = np.array([NX, NY, NZ], dtype=np.int32, order="C") + var3 = np.empty(shape=NX * NY * NZ, dtype=np.float32, order="C") + + ijk = 0 + for i in range(NX): + for j in range(NY): + for k in range(NZ): + var3[ijk] = i * 100 + j * 10 + k * 1 + ijk += 1 + + ij = 0 + for i in range(NX): + for j in range(NY): + var2[ij] = i * 10.0 + j * 1.0 + ij += 1 + + pyfms = pyFMS(calendar_type=calendar_type) + mpp_domains = pyFMS_mpp_domains(cFMS=pyfms.cFMS) + + global_indices = np.array([0, NX - 1, 0, NY - 1], dtype=np.int32, order="C") + layout = np.array([1, 1], dtype=np.int32, order="C") + io_layout = np.array([1, 1], dtype=np.int32, order="C") + + mpp_domains.define_domains( + domain_id=domain_id, + global_indices=global_indices, + layout=layout, + ) + mpp_domains.define_io_domain( + domain_id=domain_id, + io_layout=io_layout, + ) + + """ + diag manager init + """ + + diag_model_subset = 2 + err_msg = "None" + + diag_manager = pyFMS_diag_manager(clibFMS=pyfms.clibFMS) + diag_manager.diag_init( + diag_model_subset=diag_model_subset, + calendar_type=calendar_type, + err_msg=err_msg, + ) + + mpp_domains.set_current_domain(domain_id=domain_id) + + """ + diag axis init x + """ + x = np.empty(shape=NX, dtype=np.float64, order="C") + + for i in range(NX): + x[i] = i + + id_x = diag_manager.diag_axis_init_cdouble( + name="x", + naxis_data=NX, + axis_data=x, + units="point_E", + cart_name="x", + long_name="point_E", + set_name="atm", + direction=0, + edges=0, + aux="", + req="", + tile_count=0, + domain_position=0, + ) + + """ + diag axis init y + """ + y = np.empty(shape=NY, dtype=np.float64, order="C") + + for j in range(NY): + y[j] = j + + id_y = diag_manager.diag_axis_init_cdouble( + name="y", + naxis_data=NY, + axis_data=y, + units="point_N", + cart_name="y", + long_name="point_N", + set_name="atm", + direction=0, + edges=0, + aux="", + req="", + tile_count=0, + domain_position=0, + ) + + """ + diag axis init z + """ + + z = np.empty(shape=NZ, dtype=np.float64, order="C") + + for k in range(NZ): + z[k] = k + + id_z = diag_manager.diag_axis_init_cdouble( + name="z", + naxis_data=NZ, + axis_data=z, + units="point_Z", + cart_name="z", + long_name="point_Z", + set_name="atm", + direction=0, + edges=0, + aux="", + req="", + tile_count=0, + domain_position=0, + not_xy=True, + ) + + """ + register diag field var3 + """ + + axes_3d = np.array([id_x, id_y, id_z, 0, 0], dtype=np.int32, order="C") + range_3d = np.array([-1000.0, 1000.0], dtype=np.float32, order="C") + + diag_manager.diag_set_field_init_time( + year=2, + month=1, + day=1, + hour=1, + minute=1, + second=1, + ) + + id_var3 = diag_manager.register_diag_field_array_cfloat( + module_name="atm_mod", + field_name="var_3d", + axes=axes_3d, + long_name="Var in a lon/lat domain", + units="muntin", + missing_value=-99.99, + range=range_3d, + ) + + diag_manager.diag_set_field_timestep( + diag_field_id=id_var3, dseconds=60 * 60, ddays=0, dticks=0 + ) + + """ + register diag_field var 2 + """ + + axes_2d = np.array([id_x, id_y, 0, 0, 0], dtype=np.int32, order="C") + range_2d = np.array([-1000.0, 1000.0], dtype=np.float32, order="C") + + diag_manager.diag_set_field_init_time( + year=2, + month=1, + day=1, + hour=1, + minute=1, + second=1, + ) + + id_var2 = diag_manager.register_diag_field_array_cfloat( + module_name="atm_mod", + field_name="var_2d", + axes=axes_2d, + long_name="Var in a lon/lat domain", + units="muntin", + missing_value=-99.99, + range=range_2d, + ) + + diag_manager.diag_set_field_timestep( + diag_field_id=id_var2, + dseconds=60 * 60, + ddays=0, + dticks=0, + ) + + """ + diag set time end + """ + + diag_manager.diag_set_time_end( + year=2, + month=1, + day=2, + hour=1, + minute=1, + second=1, + tick=0, + ) + + """ + send data + """ + + diag_manager.diag_send_data_3d_cfloat( + diag_field_id=id_var3, + field_shape=var3_shape, + field=var3, + ) + + for itime in range(24): + ijk = 0 + for i in range(NX): + for j in range(NY): + for k in range(NZ): + var3[ijk] = -1.0 * var3[ijk] + ijk += 1 + diag_manager.diag_advance_field_time(diag_field_id=id_var3) + diag_manager.diag_send_data_3d_cfloat( + diag_field_id=id_var3, + field_shape=var3_shape, + field=var3, + ) + diag_manager.diag_send_complete(diag_field_id=id_var3) + + ij = 0 + for i in range(NX): + for j in range(NY): + var2[ij] = -1.0 * var2[ij] + ij += 1 + diag_manager.diag_advance_field_time(diag_field_id=id_var2) + diag_manager.diag_send_data_2d_cfloat( + diag_field_id=id_var2, + field_shape=var2_shape, + field=var2, + ) + diag_manager.diag_send_complete(diag_field_id=id_var2) + + diag_manager.diag_end() + + pyfms.pyfms_end() + + os.remove(input_file) + os.remove(diag_table) + + +if __name__ == "__main__": + test_send_data() diff --git a/tests/horiz_interp/test_horiz_interp.py b/tests/py_horiz_interp/test_horiz_interp.py similarity index 100% rename from tests/horiz_interp/test_horiz_interp.py rename to tests/py_horiz_interp/test_horiz_interp.py diff --git a/tests/py_mpp/test_define_domains.py b/tests/py_mpp/test_define_domains.py index 010babd..f71f528 100644 --- a/tests/py_mpp/test_define_domains.py +++ b/tests/py_mpp/test_define_domains.py @@ -70,7 +70,10 @@ def test_define_domains(): pyfms.set_pelist_npes(coarse_npes) mpp.set_current_pelist(coarse_pelist) name = "test coarse domain" - maskmap = np.full(shape=(2, 4), fill_value=True, dtype=np.bool_, order="C") + maskmap = np.full( + shape=(2, 4), fill_value=True, dtype=np.bool_, order="C" + ).flatten() + maskmap_shape = np.array([2, 4], dtype=np.int32, order="C") xextent = np.zeros(shape=2, dtype=np.int32, order="C") yextent = np.zeros(shape=2, dtype=np.int32, order="C") @@ -94,6 +97,7 @@ def test_define_domains(): xextent=xextent, yextent=yextent, maskmap=maskmap, + maskmap_shape=maskmap_shape, name=name, symmetry=symmetry, whalo=coarse_whalo, From 18155713aa00c1d8a5452541e4983d6ab33a3c8d Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Thu, 27 Mar 2025 11:23:45 -0400 Subject: [PATCH 10/27] Fixes for domains methods, getset and define, and their tests --- pyfms/py_diag_manager/pyfms_diag_manager.py | 7 +++-- pyfms/py_mpp/py_mpp_domains.py | 4 --- tests/py_mpp/test_define_domains.py | 29 ++++++++++----------- tests/py_mpp/test_getset_domains.py | 18 ++++++------- 4 files changed, 28 insertions(+), 30 deletions(-) diff --git a/pyfms/py_diag_manager/pyfms_diag_manager.py b/pyfms/py_diag_manager/pyfms_diag_manager.py index b729c87..f1697f9 100644 --- a/pyfms/py_diag_manager/pyfms_diag_manager.py +++ b/pyfms/py_diag_manager/pyfms_diag_manager.py @@ -116,7 +116,10 @@ def diag_set_field_init_time( year_c, month_c, day_c, hour_c, minute_c, second_c, tick_c, err_msg_c ) - return err_msg_c.value.decode("utf-8") + if err_msg is not None: + return err_msg_c.value.decode("utf-8") + else: + return err_msg def diag_set_field_timestep( self, @@ -180,7 +183,7 @@ def diag_set_time_end( if err_msg is not None: err_msg = err_msg[:128] - _cfms_set_time_end = self.clibFMS.diag_set_time_end + _cfms_set_time_end = self.clibFMS.cFMS_diag_set_time_end year_c, year_t = setscalar_Cint32(year) month_c, month_t = setscalar_Cint32(month) diff --git a/pyfms/py_mpp/py_mpp_domains.py b/pyfms/py_mpp/py_mpp_domains.py index 587106e..38fae54 100644 --- a/pyfms/py_mpp/py_mpp_domains.py +++ b/pyfms/py_mpp/py_mpp_domains.py @@ -70,7 +70,6 @@ def define_domains( xextent: Optional[NDArray] = None, yextent: Optional[NDArray] = None, maskmap: Optional[NDArray[np.bool_]] = None, - maskmap_shape: Optional[NDArray] = None, name: Optional[str] = None, symmetry: Optional[bool] = None, memory_size: Optional[NDArray] = None, @@ -99,7 +98,6 @@ def define_domains( xextent_p, xextent_t = setarray_Cint32(xextent) yextent_p, yextent_t = setarray_Cint32(yextent) maskmap_p, maskmap_t = setarray_Cbool(maskmap) - maskmap_shape_p, maskmap_shape_t = setarray_Cint32(maskmap_shape) name_c, name_t = set_Cchar(name) symmetry_c, symmetry_t = setscalar_Cbool(symmetry) memory_size_p, memory_size_t = setarray_Cint32(memory_size) @@ -126,7 +124,6 @@ def define_domains( xextent_t, yextent_t, maskmap_t, - maskmap_shape_t, name_t, symmetry_t, memory_size_t, @@ -156,7 +153,6 @@ def define_domains( xextent_p, yextent_p, maskmap_p, - maskmap_shape_p, name_c, symmetry_c, memory_size_p, diff --git a/tests/py_mpp/test_define_domains.py b/tests/py_mpp/test_define_domains.py index f71f528..f33e34a 100644 --- a/tests/py_mpp/test_define_domains.py +++ b/tests/py_mpp/test_define_domains.py @@ -1,3 +1,4 @@ +import os import numpy as np from pyfms import pyDomain, pyFMS, pyFMS_mpp, pyFMS_mpp_domains, pyNestDomain @@ -43,7 +44,12 @@ def test_define_domains(): fine_shalo = 2 fine_nhalo = 2 + cfms_path = "./cFMS/libcFMS/.libs/libcFMS.so" + + assert os.path.exists(cfms_path) + pyfms = pyFMS( + cFMS_path=cfms_path, ndomain=ndomain, nnest_domain=nnest_domain, ) @@ -52,13 +58,13 @@ def test_define_domains(): assert isinstance(pyfms, pyFMS) - # get global pelist + """get global pelist""" npes = mpp.npes() pyfms.set_pelist_npes(npes_in=npes) global_pelist = mpp.get_current_pelist() - # set coarse domain as tile=0 + """set coarse domain as tile=0""" for i in range(coarse_npes): coarse_pelist[i] = global_pelist[i] @@ -70,10 +76,7 @@ def test_define_domains(): pyfms.set_pelist_npes(coarse_npes) mpp.set_current_pelist(coarse_pelist) name = "test coarse domain" - maskmap = np.full( - shape=(2, 4), fill_value=True, dtype=np.bool_, order="C" - ).flatten() - maskmap_shape = np.array([2, 4], dtype=np.int32, order="C") + maskmap = np.full(shape=8, fill_value=True, order="C") xextent = np.zeros(shape=2, dtype=np.int32, order="C") yextent = np.zeros(shape=2, dtype=np.int32, order="C") @@ -86,10 +89,9 @@ def test_define_domains(): ndivs=ndivs, ) - domain = pyDomain( + mpp_domains.define_domains( global_indices=coarse_global_indices, layout=layout, - mpp_domains_obj=mpp_domains, domain_id=domain_id, pelist=coarse_pelist, xflags=coarse_xflags, @@ -97,7 +99,6 @@ def test_define_domains(): xextent=xextent, yextent=yextent, maskmap=maskmap, - maskmap_shape=maskmap_shape, name=name, symmetry=symmetry, whalo=coarse_whalo, @@ -110,7 +111,7 @@ def test_define_domains(): mpp.set_current_pelist() - # set fine domain as tile=1 + """set fine domain as tile=1""" name_fine = "test fine pelist" for i in range(fine_npes): @@ -130,10 +131,9 @@ def test_define_domains(): ndivs=ndivs, ) - domain = pyDomain( + mpp_domains.define_domains( global_indices=fine_global_indices, layout=layout, - mpp_domains_obj=mpp_domains, domain_id=domain_id, pelist=fine_pelist, name=name, @@ -150,7 +150,7 @@ def test_define_domains(): assert mpp_domains.domain_is_initialized(domain_id) - # set nest domain + """set nest domain""" name = "test nest domain" num_nest = 1 @@ -168,8 +168,7 @@ def test_define_domains(): nest_domain_id = nest_domain_id domain_id = domain_id - nest_domain = pyNestDomain( - mpp_domains_obj=mpp_domains, + mpp_domains.define_nest_domains( num_nest=num_nest, ntiles=ntiles, nest_level=nest_level, diff --git a/tests/py_mpp/test_getset_domains.py b/tests/py_mpp/test_getset_domains.py index 5d2e057..5272785 100644 --- a/tests/py_mpp/test_getset_domains.py +++ b/tests/py_mpp/test_getset_domains.py @@ -119,15 +119,6 @@ def test_getset_domains(): # get domain - assert domain.data_domain.xbegin.value == isd[pe] - assert domain.data_domain.xend.value == ied[pe] - assert domain.data_domain.ybegin.value == jsd[pe] - assert domain.data_domain.yend.value == jed[pe] - assert domain.data_domain.xsize.value == 6 - assert domain.data_domain.ysize.value == 6 - assert domain.data_domain.xmax_size.value == 6 - assert domain.data_domain.ymax_size.value == 6 - assert domain.compute_domain.xbegin.value == isc[pe] assert domain.compute_domain.xend.value == iec[pe] assert domain.compute_domain.ybegin.value == jsc[pe] @@ -139,6 +130,15 @@ def test_getset_domains(): assert domain.compute_domain.x_is_global.value is False assert domain.compute_domain.y_is_global.value is False + assert domain.data_domain.xbegin.value == isd[pe] + assert domain.data_domain.xend.value == ied[pe] + assert domain.data_domain.ybegin.value == jsd[pe] + assert domain.data_domain.yend.value == jed[pe] + assert domain.data_domain.xsize.value == 6 + assert domain.data_domain.ysize.value == 6 + assert domain.data_domain.xmax_size.value == 6 + assert domain.data_domain.ymax_size.value == 6 + pyfms.pyfms_end() From 714455141f9055f0c7834061db712f763ec4b142 Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Thu, 27 Mar 2025 11:28:48 -0400 Subject: [PATCH 11/27] linting --- tests/py_mpp/test_define_domains.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/py_mpp/test_define_domains.py b/tests/py_mpp/test_define_domains.py index f33e34a..4a554da 100644 --- a/tests/py_mpp/test_define_domains.py +++ b/tests/py_mpp/test_define_domains.py @@ -1,7 +1,8 @@ import os + import numpy as np -from pyfms import pyDomain, pyFMS, pyFMS_mpp, pyFMS_mpp_domains, pyNestDomain +from pyfms import pyFMS, pyFMS_mpp, pyFMS_mpp_domains def test_define_domains(): From 11f6e4b06ece4c0076f4fb3f4779cf49a8eb9c52 Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Thu, 27 Mar 2025 15:23:31 -0400 Subject: [PATCH 12/27] Non-functioning version of diag_manager test --- tests/py_diag_manager/test_diag_manager.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/py_diag_manager/test_diag_manager.py b/tests/py_diag_manager/test_diag_manager.py index 565bc46..d3545f4 100644 --- a/tests/py_diag_manager/test_diag_manager.py +++ b/tests/py_diag_manager/test_diag_manager.py @@ -68,7 +68,9 @@ def test_send_data(): var2[ij] = i * 10.0 + j * 1.0 ij += 1 - pyfms = pyFMS(calendar_type=calendar_type) + cfms_path = "./cFMS/libcFMS/.libs/libcFMS.so" + + pyfms = pyFMS(cFMS_path=cfms_path, calendar_type=calendar_type) mpp_domains = pyFMS_mpp_domains(cFMS=pyfms.cFMS) global_indices = np.array([0, NX - 1, 0, NY - 1], dtype=np.int32, order="C") @@ -92,10 +94,9 @@ def test_send_data(): diag_model_subset = 2 err_msg = "None" - diag_manager = pyFMS_diag_manager(clibFMS=pyfms.clibFMS) + diag_manager = pyFMS_diag_manager(clibFMS=pyfms.cFMS) diag_manager.diag_init( diag_model_subset=diag_model_subset, - calendar_type=calendar_type, err_msg=err_msg, ) From 0faebd88aafee8553bec27d39b6686eb04b0c139 Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Thu, 27 Mar 2025 19:47:26 -0400 Subject: [PATCH 13/27] Selecting for dimension and datatype in diag_manager --- pyfms/py_diag_manager/pyfms_diag_manager.py | 975 +++----------------- 1 file changed, 122 insertions(+), 853 deletions(-) diff --git a/pyfms/py_diag_manager/pyfms_diag_manager.py b/pyfms/py_diag_manager/pyfms_diag_manager.py index f1697f9..c7c1524 100644 --- a/pyfms/py_diag_manager/pyfms_diag_manager.py +++ b/pyfms/py_diag_manager/pyfms_diag_manager.py @@ -1,6 +1,7 @@ import ctypes -from typing import Optional +from typing import Any, Optional +import numpy as np from numpy.typing import NDArray from pyfms.pyfms_utils.data_handling import ( @@ -217,7 +218,7 @@ def diag_set_time_end( err_msg_c, ) - def diag_axis_init_cdouble( + def diag_axis_init( self, name: str, naxis_data: int, @@ -234,14 +235,12 @@ def diag_axis_init_cdouble( domain_position: Optional[int] = None, not_xy: Optional[bool] = None, ) -> int: - _cfms_diag_axis_init_cdouble = self.clibFMS.cFMS_diag_axis_init_cdouble long_name = long_name[:64] set_name = set_name[:64] name_c, name_t = set_Cchar(name) naxis_data_c, naxis_data_t = setscalar_Cint32(naxis_data) - axis_data_p, axis_data_t = setarray_Cdouble(axis_data) units_c, units_t = set_Cchar(units) cart_name_c, cart_name_t = set_Cchar(cart_name) long_name_c, long_name_t = set_Cchar(long_name) @@ -254,81 +253,16 @@ def diag_axis_init_cdouble( domain_position_c, domain_position_t = setscalar_Cint32(domain_position) not_xy_c, not_xy_t = setscalar_Cbool(not_xy) - _cfms_diag_axis_init_cdouble.argtypes = [ - name_t, - naxis_data_t, - axis_data_t, - units_t, - cart_name_t, - long_name_t, - set_name_t, - direction_t, - edges_t, - aux_t, - req_t, - tile_count_t, - domain_position_t, - not_xy_t, - ] - _cfms_diag_axis_init_cdouble.restype = ctypes.c_int - - return _cfms_diag_axis_init_cdouble( - name_c, - naxis_data_c, - axis_data_p, - units_c, - cart_name_c, - long_name_c, - set_name_c, - direction_c, - edges_c, - aux_c, - req_c, - tile_count_c, - domain_position_c, - not_xy_c, - ) - - def diag_axis_init_cfloat( - self, - name: str, - naxis_data: int, - axis_data: NDArray, - units: str, - cart_name: str, - long_name: Optional[str] = None, - set_name: Optional[str] = None, - direction: Optional[int] = None, - edges: Optional[int] = None, - aux: Optional[str] = None, - req: Optional[str] = None, - tile_count: Optional[int] = None, - domain_position: Optional[int] = None, - not_xy: Optional[bool] = None, - ) -> int: - _cfms_diag_axis_init_cfloat = self.clibFMS.cFMS_diag_axis_init_cfloat - - if long_name is not None: - long_name = long_name[:64] - if set_name is not None: - set_name = set_name[:64] - - name_c, name_t = set_Cchar(name) - naxis_data_c, naxis_data_t = setscalar_Cint32(naxis_data) - axis_data_p, axis_data_t = setarray_Cfloat(axis_data) - units_c, units_t = set_Cchar(units) - cart_name_c, cart_name_t = set_Cchar(cart_name) - long_name_c, long_name_t = set_Cchar(long_name) - set_name_c, set_name_t = set_Cchar(set_name) - direction_c, direction_t = setscalar_Cint32(direction) - edges_c, edges_t = setscalar_Cint32(edges) - aux_c, aux_t = set_Cchar(aux) - req_c, req_t = set_Cchar(req) - tile_count_c, tile_count_t = setscalar_Cint32(tile_count) - domain_position_c, domain_position_t = setscalar_Cint32(domain_position) - not_xy_c, not_xy_t = setscalar_Cbool(not_xy) + if axis_data.dtype == np.float64: + _cfms_diag_axis_init_ = self.clibFMS.cFMS_diag_axis_init_cdouble + axis_data_p, axis_data_t = setarray_Cdouble(axis_data) + elif axis_data.dtype == np.float32: + _cfms_diag_axis_init_ = self.clibFMS.cFMS_diag_axis_init_cfloat + axis_data_p, axis_data_t = setarray_Cfloat(axis_data) + else: + raise RuntimeError("diag_axis_init datatype not supported") - _cfms_diag_axis_init_cfloat.argtypes = [ + _cfms_diag_axis_init_.argtypes = [ name_t, naxis_data_t, axis_data_t, @@ -344,9 +278,9 @@ def diag_axis_init_cfloat( domain_position_t, not_xy_t, ] - _cfms_diag_axis_init_cfloat.restype = ctypes.c_int + _cfms_diag_axis_init_.restype = ctypes.c_int - return _cfms_diag_axis_init_cfloat( + return _cfms_diag_axis_init_( name_c, naxis_data_c, axis_data_p, @@ -363,10 +297,11 @@ def diag_axis_init_cfloat( not_xy_c, ) - def register_diag_field_array_cint( + def register_diag_field_array( self, module_name: str, field_name: str, + datatype: Any, axes: Optional[NDArray] = None, long_name: Optional[str] = None, units: Optional[str] = None, @@ -400,17 +335,11 @@ def register_diag_field_array_cint( if realm is not None: realm = realm[:64] - _cfms_register_diag_field_array_cint = ( - self.clibFMS.cFMS_register_diag_field_array_cint - ) - module_name_c, module_name_t = set_Cchar(module_name) field_name_c, field_name_t = set_Cchar(field_name) axes_p, axes_t = setarray_Cint32(axes) long_name_c, long_name_t = set_Cchar(long_name) units_c, units_t = set_Cchar(units) - missing_value_c, missing_value_t = setscalar_Cint32(missing_value) - range_p, range_t = setarray_Cint32(range) mask_variant_c, mask_variant_t = setscalar_Cbool(mask_variant) standard_name_c, standard_name_t = set_Cchar(standard_name) verbose_c, verbose_t = setscalar_Cbool(verbose) @@ -423,110 +352,22 @@ def register_diag_field_array_cint( realm_c, realm_t = set_Cchar(realm) multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) - _cfms_register_diag_field_array_cint.argtypes = [ - module_name_t, - field_name_t, - axes_t, - long_name_t, - units_t, - missing_value_t, - range_t, - mask_variant_t, - standard_name_t, - verbose_t, - do_not_log_t, - err_msg_t, - interp_method_t, - tile_count_t, - area_t, - volume_t, - realm_t, - multiple_send_data_t, - ] - _cfms_register_diag_field_array_cint.restype = ctypes.c_int - - return _cfms_register_diag_field_array_cint( - module_name_c, - field_name_c, - axes_p, - long_name_c, - units_c, - missing_value_c, - range_p, - mask_variant_c, - standard_name_c, - verbose_c, - do_not_log_c, - err_msg_c, - interp_method_c, - tile_count_c, - area_c, - volume_c, - realm_c, - multiple_send_data_c, - ) - - def register_diag_field_array_cdouble( - self, - module_name: str, - field_name: str, - axes: Optional[NDArray] = None, - long_name: Optional[str] = None, - units: Optional[str] = None, - missing_value: Optional[float] = None, - range: Optional[NDArray] = None, - mask_variant: Optional[bool] = None, - standard_name: Optional[str] = None, - verbose: Optional[bool] = None, - do_not_log: Optional[bool] = None, - err_msg: Optional[str] = None, - interp_method: Optional[str] = None, - tile_count: Optional[int] = None, - area: Optional[int] = None, - volume: Optional[int] = None, - realm: Optional[str] = None, - multiple_send_data: Optional[bool] = None, - ) -> int: - - module_name = module_name[:64] - field_name = field_name[:64] - if long_name is not None: - long_name = long_name[:64] - if units is not None: - units = units[:64] - if standard_name is not None: - standard_name = standard_name[:64] - if err_msg is not None: - err_msg = err_msg[:64] - if interp_method is not None: - interp_method = interp_method[:64] - if realm is not None: - realm = realm[:64] - - _cfms_register_diag_field_array_cdouble = ( - self.clibFMS.cFMS_register_diag_field_array_cdouble - ) - - module_name_c, module_name_t = set_Cchar(module_name) - field_name_c, field_name_t = set_Cchar(field_name) - axes_p, axes_t = setarray_Cint32(axes) - long_name_c, long_name_t = set_Cchar(long_name) - units_c, units_t = set_Cchar(units) - missing_value_c, missing_value_t = setscalar_Cdouble(missing_value) - range_p, range_t = setarray_Cdouble(range) - mask_variant_c, mask_variant_t = setscalar_Cbool(mask_variant) - standard_name_c, standard_name_t = set_Cchar(standard_name) - verbose_c, verbose_t = setscalar_Cbool(verbose) - do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) - err_msg_c, err_msg_t = set_Cchar(err_msg) - interp_method_c, interp_method_t = set_Cchar(interp_method) - tile_count_c, tile_count_t = setscalar_Cint32(tile_count) - area_c, area_t = setscalar_Cint32(area) - volume_c, volume_t = setscalar_Cint32(volume) - realm_c, realm_t = set_Cchar(realm) - multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) + if datatype == np.int32: + _cfms_register_diag_field_array_ = self.clibFMS.cFMS_register_diag_field_array_cint + range_p, range_t = setarray_Cint32(range) + missing_value_c, missing_value_t = setscalar_Cint32(missing_value) + elif datatype == np.float64: + _cfms_register_diag_field_array_ = self.clibFMS.cFMS_register_diag_field_array_cdouble + range_p, range_t = setarray_Cdouble(range) + missing_value_c, missing_value_t = setscalar_Cdouble(missing_value) + elif datatype == np.float32: + _cfms_register_diag_field_array_ = self.clibFMS.cFMS_register_diag_field_array_cfloat + range_p, range_t = setarray_Cfloat(range) + missing_value_c, missing_value_t = setscalar_Cfloat(missing_value) + else: + raise RuntimeError("register diag field array range datatype not supported") - _cfms_register_diag_field_array_cdouble.argtypes = [ + _cfms_register_diag_field_array_.argtypes = [ module_name_t, field_name_t, axes_t, @@ -546,9 +387,9 @@ def register_diag_field_array_cdouble( realm_t, multiple_send_data_t, ] - _cfms_register_diag_field_array_cdouble.restype = ctypes.c_int + _cfms_register_diag_field_array_.restype = ctypes.c_int - return _cfms_register_diag_field_array_cdouble( + return _cfms_register_diag_field_array_( module_name_c, field_name_c, axes_p, @@ -569,22 +410,19 @@ def register_diag_field_array_cdouble( multiple_send_data_c, ) - def register_diag_field_array_cfloat( + + def register_diag_field_scalar( self, module_name: str, field_name: str, - axes: Optional[NDArray] = None, + datatype: Any, long_name: Optional[str] = None, units: Optional[str] = None, - missing_value: Optional[float] = None, - range: Optional[NDArray] = None, - mask_variant: Optional[bool] = None, standard_name: Optional[str] = None, - verbose: Optional[bool] = None, + missing_value: Optional[int] = None, + range: Optional[NDArray] = None, do_not_log: Optional[bool] = None, err_msg: Optional[str] = None, - interp_method: Optional[str] = None, - tile_count: Optional[int] = None, area: Optional[int] = None, volume: Optional[int] = None, realm: Optional[str] = None, @@ -601,714 +439,145 @@ def register_diag_field_array_cfloat( standard_name = standard_name[:64] if err_msg is not None: err_msg = err_msg[:64] - if interp_method is not None: - interp_method = interp_method[:64] if realm is not None: realm = realm[:64] - _cfms_register_diag_field_array_cfloat = ( - self.clibFMS.cFMS_register_diag_field_array_cfloat - ) - module_name_c, module_name_t = set_Cchar(module_name) field_name_c, field_name_t = set_Cchar(field_name) - axes_p, axes_t = setarray_Cint32(axes) long_name_c, long_name_t = set_Cchar(long_name) units_c, units_t = set_Cchar(units) - missing_value_c, missing_value_t = setscalar_Cfloat(missing_value) - range_p, range_t = setarray_Cfloat(range) - mask_variant_c, mask_variant_t = setscalar_Cbool(mask_variant) standard_name_c, standard_name_t = set_Cchar(standard_name) - verbose_c, verbose_t = setscalar_Cbool(verbose) do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) err_msg_c, err_msg_t = set_Cchar(err_msg) - interp_method_c, interp_method_t = set_Cchar(interp_method) - tile_count_c, tile_count_t = setscalar_Cint32(tile_count) area_c, area_t = setscalar_Cint32(area) volume_c, volume_t = setscalar_Cint32(volume) realm_c, realm_t = set_Cchar(realm) multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) - _cfms_register_diag_field_array_cfloat.argtypes = [ + + if datatype == np.int32: + _cfms_register_diag_field_scalar_ = self.clibFMS.cFMS_register_diag_field_array_cint + range_p, range_t = setarray_Cint32(range) + missing_value_c, missing_value_t = setscalar_Cint32(missing_value) + elif datatype == np.float64: + _cfms_register_diag_field_scalar_ = self.clibFMS.cFMS_register_diag_field_array_cdouble + range_p, range_t = setarray_Cdouble(range) + missing_value_c, missing_value_t = setscalar_Cdouble(missing_value) + elif datatype == np.float32: + _cfms_register_diag_field_scalar_ = self.clibFMS.cFMS_register_diag_field_array_cfloat + range_p, range_t = setarray_Cfloat(range) + missing_value_c, missing_value_t = setscalar_Cfloat(missing_value) + else: + raise RuntimeError("register diag field array range datatype not supported") + + _cfms_register_diag_field_scalar_.argtypes = [ module_name_t, field_name_t, - axes_t, long_name_t, units_t, + standard_name_t, missing_value_t, range_t, - mask_variant_t, - standard_name_t, - verbose_t, do_not_log_t, err_msg_t, - interp_method_t, - tile_count_t, area_t, volume_t, realm_t, multiple_send_data_t, ] - _cfms_register_diag_field_array_cfloat.restype = ctypes.c_int + _cfms_register_diag_field_scalar_.restype = ctypes.c_int - return _cfms_register_diag_field_array_cfloat( + return _cfms_register_diag_field_scalar_( module_name_c, field_name_c, - axes_p, long_name_c, units_c, + standard_name_c, missing_value_c, range_p, - mask_variant_c, - standard_name_c, - verbose_c, do_not_log_c, err_msg_c, - interp_method_c, - tile_count_c, area_c, volume_c, realm_c, multiple_send_data_c, ) - def register_diag_field_scalar_cint( + + def diag_send_data( self, - module_name: str, - field_name: str, - long_name: Optional[str] = None, - units: Optional[str] = None, - standard_name: Optional[str] = None, - missing_value: Optional[int] = None, - range: Optional[NDArray] = None, - do_not_log: Optional[bool] = None, + diag_field_id: int, + field_shape: NDArray, + field: NDArray, err_msg: Optional[str] = None, - area: Optional[int] = None, - volume: Optional[int] = None, - realm: Optional[str] = None, - multiple_send_data: Optional[bool] = None, - ) -> int: - - module_name = module_name[:64] - field_name = field_name[:64] - if long_name is not None: - long_name = long_name[:64] - if units is not None: - units = units[:64] - if standard_name is not None: - standard_name = standard_name[:64] - if err_msg is not None: - err_msg = err_msg[:64] - if realm is not None: - realm = realm[:64] + ) -> bool: - _cfms_register_diag_field_scalar_cint = ( - self.clibFMS.cFMS_register_diag_field_scalar_cint - ) + err_msg = err_msg[:128] - module_name_c, module_name_t = set_Cchar(module_name) - field_name_c, field_name_t = set_Cchar(field_name) - long_name_c, long_name_t = set_Cchar(long_name) - units_c, units_t = set_Cchar(units) - standard_name_c, standard_name_t = set_Cchar(standard_name) - missing_value_c, missing_value_t = setscalar_Cint32(missing_value) - range_p, range_t = setarray_Cint32(range) - do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) + diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) + field_shape_p, field_shape_t = setarray_Cint32(field_shape) err_msg_c, err_msg_t = set_Cchar(err_msg) - area_c, area_t = setscalar_Cint32(area) - volume_c, volume_t = setscalar_Cint32(volume) - realm_c, realm_t = set_Cchar(realm) - multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) - - _cfms_register_diag_field_scalar_cint.argtypes = [ - module_name_t, - field_name_t, - long_name_t, - units_t, - standard_name_t, - missing_value_t, - range_t, - do_not_log_t, - err_msg_t, - area_t, - volume_t, - realm_t, - multiple_send_data_t, - ] - _cfms_register_diag_field_scalar_cint.restype = ctypes.c_int - return _cfms_register_diag_field_scalar_cint( - module_name_c, - field_name_c, - long_name_c, - units_c, - standard_name_c, - missing_value_c, - range_p, - do_not_log_c, - err_msg_c, - area_c, - volume_c, - realm_c, - multiple_send_data_c, - ) - - def register_diag_field_scalar_cdouble( - self, - module_name: str, - field_name: str, - long_name: Optional[str] = None, - units: Optional[str] = None, - standard_name: Optional[str] = None, - missing_value: Optional[float] = None, - range: Optional[NDArray] = None, - do_not_log: Optional[bool] = None, - err_msg: Optional[str] = None, - area: Optional[int] = None, - volume: Optional[int] = None, - realm: Optional[str] = None, - multiple_send_data: Optional[bool] = None, - ) -> int: - - module_name = module_name[:64] - field_name = field_name[:64] - if long_name is not None: - long_name = long_name[:64] - if units is not None: - units = units[:64] - if standard_name is not None: - standard_name = standard_name[:64] - if err_msg is not None: - err_msg = err_msg[:64] - if realm is not None: - realm = realm[:64] - - _cfms_register_diag_field_scalar_cdouble = ( - self.clibFMS.cFMS_register_diag_field_scalar_cdouble - ) - - module_name_c, module_name_t = set_Cchar(module_name) - field_name_c, field_name_t = set_Cchar(field_name) - long_name_c, long_name_t = set_Cchar(long_name) - units_c, units_t = set_Cchar(units) - standard_name_c, standard_name_t = set_Cchar(standard_name) - missing_value_c, missing_value_t = setscalar_Cdouble(missing_value) - range_p, range_t = setarray_Cdouble(range) - do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) - err_msg_c, err_msg_t = set_Cchar(err_msg) - area_c, area_t = setscalar_Cint32(area) - volume_c, volume_t = setscalar_Cint32(volume) - realm_c, realm_t = set_Cchar(realm) - multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) - - _cfms_register_diag_field_scalar_cdouble.argtypes = [ - module_name_t, - field_name_t, - long_name_t, - units_t, - standard_name_t, - missing_value_t, - range_t, - do_not_log_t, - err_msg_t, - area_t, - volume_t, - realm_t, - multiple_send_data_t, - ] - _cfms_register_diag_field_scalar_cdouble.restype = ctypes.c_int - - return _cfms_register_diag_field_scalar_cdouble( - module_name_c, - field_name_c, - long_name_c, - units_c, - standard_name_c, - missing_value_c, - range_p, - do_not_log_c, - err_msg_c, - area_c, - volume_c, - realm_c, - multiple_send_data_c, - ) - - def register_diag_field_scalar_cfloat( - self, - module_name: str, - field_name: str, - long_name: Optional[str] = None, - units: Optional[str] = None, - standard_name: Optional[str] = None, - missing_value: Optional[float] = None, - range: Optional[NDArray] = None, - do_not_log: Optional[bool] = None, - err_msg: Optional[str] = None, - area: Optional[int] = None, - volume: Optional[int] = None, - realm: Optional[str] = None, - multiple_send_data: Optional[bool] = None, - ) -> int: - - module_name = module_name[:64] - field_name = field_name[:64] - if long_name is not None: - long_name = long_name[:64] - if units is not None: - units = units[:64] - if standard_name is not None: - standard_name = standard_name[:64] - if err_msg is not None: - err_msg = err_msg[:64] - if realm is not None: - realm = realm[:64] - - _cfms_register_diag_field_scalar_cfloat = ( - self.clibFMS.cFMS_register_diag_field_scalar_cfloat - ) - - module_name_c, module_name_t = set_Cchar(module_name) - field_name_c, field_name_t = set_Cchar(field_name) - long_name_c, long_name_t = set_Cchar(long_name) - units_c, units_t = set_Cchar(units) - standard_name_c, standard_name_t = set_Cchar(standard_name) - missing_value_c, missing_value_t = setscalar_Cfloat(missing_value) - range_p, range_t = setarray_Cfloat(range) - do_not_log_c, do_not_log_t = setscalar_Cbool(do_not_log) - err_msg_c, err_msg_t = set_Cchar(err_msg) - area_c, area_t = setscalar_Cint32(area) - volume_c, volume_t = setscalar_Cint32(volume) - realm_c, realm_t = set_Cchar(realm) - multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) - - _cfms_register_diag_field_scalar_cfloat.argtypes = [ - module_name_t, - field_name_t, - long_name_t, - units_t, - standard_name_t, - missing_value_t, - range_t, - do_not_log_t, - err_msg_t, - area_t, - volume_t, - realm_t, - multiple_send_data_t, - ] - _cfms_register_diag_field_scalar_cfloat.restype = ctypes.c_int - - return _cfms_register_diag_field_scalar_cfloat( - module_name_c, - field_name_c, - long_name_c, - units_c, - standard_name_c, - missing_value_c, - range_p, - do_not_log_c, - err_msg_c, - area_c, - volume_c, - realm_c, - multiple_send_data_c, - ) - - """ - 2d send data wrappers - """ - - def diag_send_data_2d_cint( - self, - diag_field_id: int, - field_shape: NDArray, - field: NDArray, - err_msg: Optional[str] = None, - ) -> bool: - - err_msg = err_msg[:128] - - _cfms_diag_send_data_2d_cint = self.clibFMS.cFMS_diag_send_data_2d_cint - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = setarray_Cint32(field) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_data_2d_cint.argtypes = [ - diag_field_id_t, - field_shape_t, - field_t, - err_msg_t, - ] - _cfms_diag_send_data_2d_cint.restype = ctypes.c_bool - - return _cfms_diag_send_data_2d_cint( - diag_field_id_c, - field_shape_p, - field_p, - err_msg_c, - ) - - def diag_send_data_2d_cdouble( - self, - diag_field_id: int, - field_shape: NDArray, - field: NDArray, - err_msg: Optional[str] = None, - ) -> bool: - - err_msg = err_msg[:128] - - _cfms_diag_send_data_2d_cdouble = self.clibFMS.cFMS_diag_send_data_2d_cdouble - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = setarray_Cdouble(field) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_data_2d_cdouble.argtypes = [ - diag_field_id_t, - field_shape_t, - field_t, - err_msg_t, - ] - _cfms_diag_send_data_2d_cdouble.restype = ctypes.c_bool - - return _cfms_diag_send_data_2d_cdouble( - diag_field_id_c, - field_shape_p, - field_p, - err_msg_c, - ) - - def diag_send_data_2d_cfloat( - self, - diag_field_id: int, - field_shape: NDArray, - field: NDArray, - err_msg: Optional[str] = None, - ) -> bool: - - err_msg = err_msg[:128] - - _cfms_diag_send_data_2d_cfloat = self.clibFMS.cFMS_diag_send_data_2d_cfloat - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = setarray_Cfloat(field) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_data_2d_cfloat.argtypes = [ - diag_field_id_t, - field_shape_t, - field_t, - err_msg_t, - ] - _cfms_diag_send_data_2d_cfloat.restype = ctypes.c_bool - - return _cfms_diag_send_data_2d_cfloat( - diag_field_id_c, - field_shape_p, - field_p, - err_msg_c, - ) - - """ - 3d send data wrappers - """ - - def diag_send_data_3d_cint( - self, - diag_field_id: int, - field_shape: NDArray, - field: NDArray, - err_msg: Optional[str] = None, - ) -> bool: - - err_msg = err_msg[:128] - - _cfms_diag_send_data_3d_cint = self.clibFMS.cFMS_diag_send_data_3d_cint - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = setarray_Cint32(field) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_data_3d_cint.argtypes = [ - diag_field_id_t, - field_shape_t, - field_t, - err_msg_t, - ] - _cfms_diag_send_data_3d_cint.restype = ctypes.c_bool - - return _cfms_diag_send_data_3d_cint( - diag_field_id_c, - field_shape_p, - field_p, - err_msg_c, - ) - - def diag_send_data_3d_cdouble( - self, - diag_field_id: int, - field_shape: NDArray, - field: NDArray, - err_msg: Optional[str] = None, - ) -> bool: - - err_msg = err_msg[:128] - - _cfms_diag_send_data_3d_cdouble = self.clibFMS.cFMS_diag_send_data_3d_cdouble - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = setarray_Cdouble(field) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_data_3d_cdouble.argtypes = [ - diag_field_id_t, - field_shape_t, - field_t, - err_msg_t, - ] - _cfms_diag_send_data_3d_cdouble.restype = ctypes.c_bool - - return _cfms_diag_send_data_3d_cdouble( - diag_field_id_c, - field_shape_p, - field_p, - err_msg_c, - ) - - def diag_send_data_3d_cfloat( - self, - diag_field_id: int, - field_shape: NDArray, - field: NDArray, - err_msg: Optional[str] = None, - ) -> bool: - - err_msg = err_msg[:128] - - _cfms_diag_send_data_3d_cfloat = self.clibFMS.cFMS_diag_send_data_3d_cfloat - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = setarray_Cfloat(arg=field) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_data_3d_cfloat.argtypes = [ - diag_field_id_t, - field_shape_t, - field_t, - err_msg_t, - ] - _cfms_diag_send_data_3d_cfloat.restype = ctypes.c_bool - - return _cfms_diag_send_data_3d_cfloat( - diag_field_id_c, - field_shape_p, - field_p, - err_msg_c, - ) - - """ - 4d send data wrappers - """ - - def diag_send_data_4d_cint( - self, - diag_field_id: int, - field_shape: NDArray, - field: NDArray, - err_msg: Optional[str] = None, - ) -> bool: - - err_msg = err_msg[:128] - - _cfms_diag_send_data_4d_cint = self.clibFMS.cFMS_diag_send_data_4d_cint - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = setarray_Cint32(field) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_data_4d_cint.argtypes = [ - diag_field_id_t, - field_shape_t, - field_t, - err_msg_t, - ] - _cfms_diag_send_data_4d_cint.restype = ctypes.c_bool - - return _cfms_diag_send_data_4d_cint( - diag_field_id_c, - field_shape_p, - field_p, - err_msg_c, - ) - - def diag_send_data_4d_cdouble( - self, - diag_field_id: int, - field_shape: NDArray, - field: NDArray, - err_msg: Optional[str] = None, - ) -> bool: - - err_msg = err_msg[:128] - - _cfms_diag_send_data_4d_cdouble = self.clibFMS.cFMS_diag_send_data_4d_cdouble - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = setarray_Cdouble(field) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_data_4d_cdouble.argtypes = [ - diag_field_id_t, - field_shape_t, - field_t, - err_msg_t, - ] - _cfms_diag_send_data_4d_cdouble.restype = ctypes.c_bool - - return _cfms_diag_send_data_4d_cdouble( - diag_field_id_c, - field_shape_p, - field_p, - err_msg_c, - ) - - def diag_send_data_4d_cfloat( - self, - diag_field_id: int, - field_shape: NDArray, - field: NDArray, - err_msg: Optional[str] = None, - ) -> bool: - - err_msg = err_msg[:128] - - _cfms_diag_send_data_4d_cfloat = self.clibFMS.cFMS_diag_send_data_4d_cfloat - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = setarray_Cfloat(field) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_data_4d_cfloat.argtypes = [ - diag_field_id_t, - field_shape_t, - field_t, - err_msg_t, - ] - _cfms_diag_send_data_4d_cfloat.restype = ctypes.c_bool - - return _cfms_diag_send_data_4d_cfloat( - diag_field_id_c, - field_shape_p, - field_p, - err_msg_c, - ) - - """ - 5d send data wrappers - """ - - def diag_send_data_5d_cint( - self, - diag_field_id: int, - field_shape: NDArray, - field: NDArray, - err_msg: Optional[str] = None, - ) -> bool: - - err_msg = err_msg[:128] - - _cfms_diag_send_data_5d_cint = self.clibFMS.cFMS_diag_send_data_5d_cint - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = setarray_Cint32(field) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_data_5d_cint.argtypes = [ - diag_field_id_t, - field_shape_t, - field_t, - err_msg_t, - ] - _cfms_diag_send_data_5d_cint.restype = ctypes.c_bool - - return _cfms_diag_send_data_5d_cint( - diag_field_id_c, - field_shape_p, - field_p, - err_msg_c, - ) - - def diag_send_data_5d_cdouble( - self, - diag_field_id: int, - field_shape: NDArray, - field: NDArray, - err_msg: Optional[str] = None, - ) -> bool: - - err_msg = err_msg[:128] - - _cfms_diag_send_data_5d_cdouble = self.clibFMS.cFMS_diag_send_data_5d_cdouble - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = setarray_Cdouble(field) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_data_5d_cdouble.argtypes = [ - diag_field_id_t, - field_shape_t, - field_t, - err_msg_t, - ] - _cfms_diag_send_data_5d_cdouble.restype = ctypes.c_bool - - return _cfms_diag_send_data_5d_cdouble( - diag_field_id_c, - field_shape_p, - field_p, - err_msg_c, - ) - - def diag_send_data_5d_cfloat( - self, - diag_field_id: int, - field_shape: NDArray, - field: NDArray, - err_msg: Optional[str] = None, - ) -> bool: - - err_msg = err_msg[:128] - - _cfms_diag_send_data_5d_cfloat = self.clibFMS.cFMS_diag_send_data_5d_cfloat - - diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) - field_p, field_t = setarray_Cfloat(field) - err_msg_c, err_msg_t = set_Cchar(err_msg) - - _cfms_diag_send_data_5d_cfloat.argtypes = [ + if field_shape.size == 2: + if field.dtype == np.int32: + _cfms_diag_send_data_ = self.clibFMS.cFMS_diag_send_data_2d_cint + field_p, field_t = setarray_Cint32(field) + elif field.dtype == np.float64: + _cfms_diag_send_data_ = self.clibFMS.cFMS_diag_send_data_2d_cdouble + field_p, field_t = setarray_Cdouble(field) + elif field.dtype == np.float32: + _cfms_diag_send_data_ = self.clibFMS.cFMS_diag_send_data_2d_cfloat + field_p, field_t = setarray_Cfloat(field) + else: + raise RuntimeError(f"diag_send_data {field.dtype} unsupported") + elif field_shape.size == 3: + if field.dtype == np.int32: + _cfms_diag_send_data_ = self.clibFMS.cFMS_diag_send_data_3d_cint + field_p, field_t = setarray_Cint32(field) + elif field.dtype == np.float64: + _cfms_diag_send_data_ = self.clibFMS.cFMS_diag_send_data_3d_cdouble + field_p, field_t = setarray_Cdouble(field) + elif field.dtype == np.float32: + _cfms_diag_send_data_ = self.clibFMS.cFMS_diag_send_data_3d_cfloat + field_p, field_t = setarray_Cfloat(field) + else: + raise RuntimeError(f"diag_send_data {field.dtype} unsupported") + elif field_shape.size == 4: + if field.dtype == np.int32: + _cfms_diag_send_data_ = self.clibFMS.cFMS_diag_send_data_4d_cint + field_p, field_t = setarray_Cint32(field) + elif field.dtype == np.float64: + _cfms_diag_send_data_ = self.clibFMS.cFMS_diag_send_data_4d_cdouble + field_p, field_t = setarray_Cdouble(field) + elif field.dtype == np.float32: + _cfms_diag_send_data_ = self.clibFMS.cFMS_diag_send_data_4d_cfloat + field_p, field_t = setarray_Cfloat(field) + else: + raise RuntimeError(f"diag_send_data {field.dtype} unsupported") + elif field_shape.size == 5: + if field.dtype == np.int32: + _cfms_diag_send_data_ = self.clibFMS.cFMS_diag_send_data_5d_cint + field_p, field_t = setarray_Cint32(field) + elif field.dtype == np.float64: + _cfms_diag_send_data_ = self.clibFMS.cFMS_diag_send_data_5d_cdouble + field_p, field_t = setarray_Cdouble(field) + elif field.dtype == np.float32: + _cfms_diag_send_data_ = self.clibFMS.cFMS_diag_send_data_5d_cfloat + field_p, field_t = setarray_Cfloat(field) + else: + raise RuntimeError(f"diag_send_data {field.dtype} unsupported") + else: + raise RuntimeError(f"diag_send_data {field_shape.size} dimensions unsupported") + + _cfms_diag_send_data_.argtypes = [ diag_field_id_t, field_shape_t, field_t, err_msg_t, ] - _cfms_diag_send_data_5d_cfloat.restype = ctypes.c_bool + _cfms_diag_send_data_.restype = ctypes.c_bool - return _cfms_diag_send_data_5d_cfloat( + return _cfms_diag_send_data_( diag_field_id_c, field_shape_p, field_p, From a6ace6801e8606b1a2df147ae6c8a78256e7ec3f Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Thu, 27 Mar 2025 19:48:39 -0400 Subject: [PATCH 14/27] linting --- pyfms/py_diag_manager/pyfms_diag_manager.py | 61 ++++++++++++--------- 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/pyfms/py_diag_manager/pyfms_diag_manager.py b/pyfms/py_diag_manager/pyfms_diag_manager.py index c7c1524..5374754 100644 --- a/pyfms/py_diag_manager/pyfms_diag_manager.py +++ b/pyfms/py_diag_manager/pyfms_diag_manager.py @@ -353,19 +353,25 @@ def register_diag_field_array( multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) if datatype == np.int32: - _cfms_register_diag_field_array_ = self.clibFMS.cFMS_register_diag_field_array_cint - range_p, range_t = setarray_Cint32(range) - missing_value_c, missing_value_t = setscalar_Cint32(missing_value) + _cfms_register_diag_field_array_ = ( + self.clibFMS.cFMS_register_diag_field_array_cint + ) + range_p, range_t = setarray_Cint32(range) + missing_value_c, missing_value_t = setscalar_Cint32(missing_value) elif datatype == np.float64: - _cfms_register_diag_field_array_ = self.clibFMS.cFMS_register_diag_field_array_cdouble - range_p, range_t = setarray_Cdouble(range) - missing_value_c, missing_value_t = setscalar_Cdouble(missing_value) + _cfms_register_diag_field_array_ = ( + self.clibFMS.cFMS_register_diag_field_array_cdouble + ) + range_p, range_t = setarray_Cdouble(range) + missing_value_c, missing_value_t = setscalar_Cdouble(missing_value) elif datatype == np.float32: - _cfms_register_diag_field_array_ = self.clibFMS.cFMS_register_diag_field_array_cfloat - range_p, range_t = setarray_Cfloat(range) - missing_value_c, missing_value_t = setscalar_Cfloat(missing_value) + _cfms_register_diag_field_array_ = ( + self.clibFMS.cFMS_register_diag_field_array_cfloat + ) + range_p, range_t = setarray_Cfloat(range) + missing_value_c, missing_value_t = setscalar_Cfloat(missing_value) else: - raise RuntimeError("register diag field array range datatype not supported") + raise RuntimeError("register diag field array range datatype not supported") _cfms_register_diag_field_array_.argtypes = [ module_name_t, @@ -410,7 +416,6 @@ def register_diag_field_array( multiple_send_data_c, ) - def register_diag_field_scalar( self, module_name: str, @@ -454,21 +459,26 @@ def register_diag_field_scalar( realm_c, realm_t = set_Cchar(realm) multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) - if datatype == np.int32: - _cfms_register_diag_field_scalar_ = self.clibFMS.cFMS_register_diag_field_array_cint - range_p, range_t = setarray_Cint32(range) - missing_value_c, missing_value_t = setscalar_Cint32(missing_value) + _cfms_register_diag_field_scalar_ = ( + self.clibFMS.cFMS_register_diag_field_array_cint + ) + range_p, range_t = setarray_Cint32(range) + missing_value_c, missing_value_t = setscalar_Cint32(missing_value) elif datatype == np.float64: - _cfms_register_diag_field_scalar_ = self.clibFMS.cFMS_register_diag_field_array_cdouble - range_p, range_t = setarray_Cdouble(range) - missing_value_c, missing_value_t = setscalar_Cdouble(missing_value) + _cfms_register_diag_field_scalar_ = ( + self.clibFMS.cFMS_register_diag_field_array_cdouble + ) + range_p, range_t = setarray_Cdouble(range) + missing_value_c, missing_value_t = setscalar_Cdouble(missing_value) elif datatype == np.float32: - _cfms_register_diag_field_scalar_ = self.clibFMS.cFMS_register_diag_field_array_cfloat - range_p, range_t = setarray_Cfloat(range) - missing_value_c, missing_value_t = setscalar_Cfloat(missing_value) + _cfms_register_diag_field_scalar_ = ( + self.clibFMS.cFMS_register_diag_field_array_cfloat + ) + range_p, range_t = setarray_Cfloat(range) + missing_value_c, missing_value_t = setscalar_Cfloat(missing_value) else: - raise RuntimeError("register diag field array range datatype not supported") + raise RuntimeError("register diag field array range datatype not supported") _cfms_register_diag_field_scalar_.argtypes = [ module_name_t, @@ -503,7 +513,6 @@ def register_diag_field_scalar( multiple_send_data_c, ) - def diag_send_data( self, diag_field_id: int, @@ -567,8 +576,10 @@ def diag_send_data( else: raise RuntimeError(f"diag_send_data {field.dtype} unsupported") else: - raise RuntimeError(f"diag_send_data {field_shape.size} dimensions unsupported") - + raise RuntimeError( + f"diag_send_data {field_shape.size} dimensions unsupported" + ) + _cfms_diag_send_data_.argtypes = [ diag_field_id_t, field_shape_t, From 676ccf782cdf9eb5394dd6c1970f3f0b70dd89dd Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Fri, 28 Mar 2025 11:47:13 -0400 Subject: [PATCH 15/27] Switching to main --- pyfms/py_horiz_interp/py_horiz_interp.py | 84 +++++++++++++++++++++++- 1 file changed, 82 insertions(+), 2 deletions(-) diff --git a/pyfms/py_horiz_interp/py_horiz_interp.py b/pyfms/py_horiz_interp/py_horiz_interp.py index b14fea9..7d8f655 100644 --- a/pyfms/py_horiz_interp/py_horiz_interp.py +++ b/pyfms/py_horiz_interp/py_horiz_interp.py @@ -1,5 +1,7 @@ import ctypes +from typing import Any + import numpy as np import numpy.typing as npt @@ -129,9 +131,87 @@ def create_xgrid_2dx2d_order1( "xarea": xarea[:nxgrid], } - def horiz_interp_init(self): + def horiz_interp_init(self, ninterp: int = None): _cfms_horiz_interp_init = self.cfms.cFMS_horiz_interp_init + ninterp_c, ninterp_t = ctypes.c_int(ninterp), ctypes.POINTER(ctypes.c_int) + + _cfms_horiz_interp_init.argtypes = [ninterp_t] _cfms_horiz_interp_init.restype = None - _cfms_horiz_interp_init() + _cfms_horiz_interp_init(ctypes.byref(ninterp_c)) + + def set_current_interp(self, interp_id: int = None): + _cfms_set_current_interp = self.cfms.cFMS_set_current_interp + + interp_id_c, interp_id_t = ctypes.c_int(interp_id), ctypes.POINTER(ctypes.c_int) + + _cfms_set_current_interp.argtypes = [interp_id_t] + _cfms_set_current_interp.restype = None + + _cfms_set_current_interp(ctypes.byref(interp_id_c)) + + def get_interp( + self, + datatype: Any, + interp_id: int = None, + nxgrid: int = None, + ilon_ptr: npt.NDArray = None, + ilon_shape: list[int] = None, + jlat_ptr: npt.NDArray = None, + jlat_shape: list[int] = None, + i_lon_ptr: npt.NDArray = None, + i_lon_shape: list[int] = None, + j_lat_ptr: npt.NDArray = None, + j_lat_shape: list[int] = None, + found_neighbors_ptr: npt.NDArray = None, + found_neighbors_shape: list[int] = None, + num_found_ptr: npt.NDArray = None, + num_found_shape: list[int] = None, + nlon_src: int = None, + nlat_src: int = None, + nlon_dst: int = None, + nlat_dst: int = None, + interp_method: int = None, + I_am_initialized: bool = None, + version: int = None, + i_src_ptr: npt.NDArray = None, + i_src_shape: list[int] = None, + j_src_ptr: npt.NDArray = None, + j_src_shape: list[int] = None, + i_dst_ptr: npt.NDArray = None, + i_dst_shape: int = None, + j_dst_ptr: npt.NDArray = None, + j_dst_shape: int = None, + faci_ptr: npt.NDArray = None, + faci_shape: npt.NDArray = None, + facj_ptr: npt.NDArray = None, + facj_shape: npt.NDArray = None, + area_src_ptr: npt.NDArray = None, + area_src_shape: npt.NDArray = None, + area_dst_ptr: npt.NDArray = None, + area_dst_shape: npt.NDArray = None, + wti_ptr: npt.NDArray = None, + wti_shape: npt.NDArray = None, + wtj_ptr: npt.NDArray = None, + wtj_shape: npt.NDArray = None, + src_dist_ptr: npt.NDArray = None, + src_dist_shape: npt.NDArray = None, + rat_x_ptr: npt.NDArray = None, + rat_x_shape: npt.NDArray = None, + rat_y_ptr: npt.NDArray = None, + rat_y_shape: npt.NDArray = None, + lon_in_ptr: npt.NDArray = None, + lon_in_shape: int = None, + lat_in_ptr: npt.NDArray = None, + lat_in_shape: int = None, + area_frac_dst_ptr: npt.NDArray = None, + area_frac_dst_shape: int = None, + mask_in_ptr: npt.NDArray = None, + mask_in_shape: npt.NDArray = None, + max_src_dist: float = None, + is_allocated: bool = None, + ): + if datatype is np.float64: + _cfms_get_interp = self.cfms.cFMS_get_interp_cdouble + faci_t = np.ctypeslib.ndpointer(dtype=np.float64, ndim=) From 2c692c43ab566b4486c29a8360b8e4d793050ab0 Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Fri, 28 Mar 2025 12:23:49 -0400 Subject: [PATCH 16/27] Switching to main --- pyfms/py_diag_manager/pyfms_diag_manager.py | 2 +- tests/py_diag_manager/test_diag_manager.py | 22 ++++++++------------- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/pyfms/py_diag_manager/pyfms_diag_manager.py b/pyfms/py_diag_manager/pyfms_diag_manager.py index 5374754..f7acd86 100644 --- a/pyfms/py_diag_manager/pyfms_diag_manager.py +++ b/pyfms/py_diag_manager/pyfms_diag_manager.py @@ -269,8 +269,8 @@ def diag_axis_init( units_t, cart_name_t, long_name_t, - set_name_t, direction_t, + set_name_t, edges_t, aux_t, req_t, diff --git a/tests/py_diag_manager/test_diag_manager.py b/tests/py_diag_manager/test_diag_manager.py index d3545f4..1fe10aa 100644 --- a/tests/py_diag_manager/test_diag_manager.py +++ b/tests/py_diag_manager/test_diag_manager.py @@ -110,7 +110,7 @@ def test_send_data(): for i in range(NX): x[i] = i - id_x = diag_manager.diag_axis_init_cdouble( + id_x = diag_manager.diag_axis_init( name="x", naxis_data=NX, axis_data=x, @@ -134,7 +134,7 @@ def test_send_data(): for j in range(NY): y[j] = j - id_y = diag_manager.diag_axis_init_cdouble( + id_y = diag_manager.diag_axis_init( name="y", naxis_data=NY, axis_data=y, @@ -142,12 +142,6 @@ def test_send_data(): cart_name="y", long_name="point_N", set_name="atm", - direction=0, - edges=0, - aux="", - req="", - tile_count=0, - domain_position=0, ) """ @@ -159,7 +153,7 @@ def test_send_data(): for k in range(NZ): z[k] = k - id_z = diag_manager.diag_axis_init_cdouble( + id_z = diag_manager.diag_axis_init( name="z", naxis_data=NZ, axis_data=z, @@ -192,7 +186,7 @@ def test_send_data(): second=1, ) - id_var3 = diag_manager.register_diag_field_array_cfloat( + id_var3 = diag_manager.register_diag_field_array( module_name="atm_mod", field_name="var_3d", axes=axes_3d, @@ -222,7 +216,7 @@ def test_send_data(): second=1, ) - id_var2 = diag_manager.register_diag_field_array_cfloat( + id_var2 = diag_manager.register_diag_field_array( module_name="atm_mod", field_name="var_2d", axes=axes_2d, @@ -257,7 +251,7 @@ def test_send_data(): send data """ - diag_manager.diag_send_data_3d_cfloat( + diag_manager.diag_send_data( diag_field_id=id_var3, field_shape=var3_shape, field=var3, @@ -271,7 +265,7 @@ def test_send_data(): var3[ijk] = -1.0 * var3[ijk] ijk += 1 diag_manager.diag_advance_field_time(diag_field_id=id_var3) - diag_manager.diag_send_data_3d_cfloat( + diag_manager.diag_send_data( diag_field_id=id_var3, field_shape=var3_shape, field=var3, @@ -284,7 +278,7 @@ def test_send_data(): var2[ij] = -1.0 * var2[ij] ij += 1 diag_manager.diag_advance_field_time(diag_field_id=id_var2) - diag_manager.diag_send_data_2d_cfloat( + diag_manager.diag_send_data( diag_field_id=id_var2, field_shape=var2_shape, field=var2, From 67d06f254fa8def3dd68f6a189edd219f113be56 Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Fri, 28 Mar 2025 13:03:43 -0400 Subject: [PATCH 17/27] Updating testing methods --- pyfms/py_diag_manager/pyfms_diag_manager.py | 132 ++++++++++---------- run_tests.sh | 4 + tests/py_diag_manager/test_diag_manager.py | 17 +-- tests/py_horiz_interp/test_horiz_interp.py | 2 +- 4 files changed, 76 insertions(+), 79 deletions(-) diff --git a/pyfms/py_diag_manager/pyfms_diag_manager.py b/pyfms/py_diag_manager/pyfms_diag_manager.py index f7acd86..b4ecbdd 100644 --- a/pyfms/py_diag_manager/pyfms_diag_manager.py +++ b/pyfms/py_diag_manager/pyfms_diag_manager.py @@ -1,5 +1,5 @@ import ctypes -from typing import Any, Optional +from typing import Any import numpy as np from numpy.typing import NDArray @@ -30,9 +30,9 @@ def diag_end(self): def diag_init( self, - diag_model_subset: Optional[int] = None, - time_init: Optional[NDArray] = None, - err_msg: Optional[str] = None, + diag_model_subset: int = None, + time_init: NDArray = None, + err_msg: str = None, ) -> str: if err_msg is not None: err_msg = err_msg[:128] @@ -57,13 +57,13 @@ def diag_init( def diag_send_complete( self, diag_field_id: int, - err_msg: Optional[str] = None, + err_msg: str = None, ) -> str: if err_msg is not None: err_msg = err_msg[:128] - _cfms_diag_send_complete = self.clibFMS.CFMS_diag_send_complete + _cfms_diag_send_complete = self.clibFMS.cFMS_diag_send_complete diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) err_msg_c, err_msg_t = set_Cchar(err_msg) @@ -73,7 +73,10 @@ def diag_send_complete( _cfms_diag_send_complete(diag_field_id_c, err_msg_c) - return err_msg_c.value.decode("utf-8") + if err_msg is not None: + return err_msg_c.value.decode("utf-8") + else: + return err_msg def diag_set_field_init_time( self, @@ -82,9 +85,9 @@ def diag_set_field_init_time( day: int, hour: int, minute: int, - second: Optional[int] = None, - tick: Optional[int] = None, - err_msg: Optional[str] = None, + second: int = None, + tick: int = None, + err_msg: str = None, ) -> str: if err_msg is not None: @@ -126,9 +129,9 @@ def diag_set_field_timestep( self, diag_field_id: int, dseconds: int, - ddays: Optional[int] = None, - dticks: Optional[int] = None, - err_msg: Optional[str] = None, + ddays: int = None, + dticks: int = None, + err_msg: str = None, ) -> str: if err_msg is not None: @@ -155,7 +158,10 @@ def diag_set_field_timestep( diag_field_id_c, dseconds_c, ddays_c, dticks_c, err_msg_c ) - return err_msg_c.value.decode("utf-8") + if err_msg is not None: + return err_msg_c.value.decode("utf-8") + else: + return err_msg def diag_advance_field_time( self, @@ -172,14 +178,14 @@ def diag_advance_field_time( def diag_set_time_end( self, - year: Optional[int] = None, - month: Optional[int] = None, - day: Optional[int] = None, - hour: Optional[int] = None, - minute: Optional[int] = None, - second: Optional[int] = None, - tick: Optional[int] = None, - err_msg: Optional[str] = None, + year: int = None, + month: int = None, + day: int = None, + hour: int = None, + minute: int = None, + second: int = None, + tick: int = None, + err_msg: str = None, ): if err_msg is not None: err_msg = err_msg[:128] @@ -221,26 +227,25 @@ def diag_set_time_end( def diag_axis_init( self, name: str, - naxis_data: int, axis_data: NDArray, units: str, cart_name: str, - long_name: Optional[str] = None, - set_name: Optional[str] = None, - direction: Optional[int] = None, - edges: Optional[int] = None, - aux: Optional[str] = None, - req: Optional[str] = None, - tile_count: Optional[int] = None, - domain_position: Optional[int] = None, - not_xy: Optional[bool] = None, + long_name: str = None, + set_name: str = None, + direction: int = None, + edges: int = None, + aux: str = None, + req: str = None, + tile_count: int = None, + domain_position: int = None, + not_xy: bool = None, ) -> int: long_name = long_name[:64] set_name = set_name[:64] name_c, name_t = set_Cchar(name) - naxis_data_c, naxis_data_t = setscalar_Cint32(naxis_data) + naxis_data_c, naxis_data_t = setscalar_Cint32(axis_data.size) units_c, units_t = set_Cchar(units) cart_name_c, cart_name_t = set_Cchar(cart_name) long_name_c, long_name_t = set_Cchar(long_name) @@ -287,8 +292,8 @@ def diag_axis_init( units_c, cart_name_c, long_name_c, - set_name_c, direction_c, + set_name_c, edges_c, aux_c, req_c, @@ -302,22 +307,22 @@ def register_diag_field_array( module_name: str, field_name: str, datatype: Any, - axes: Optional[NDArray] = None, - long_name: Optional[str] = None, - units: Optional[str] = None, - missing_value: Optional[int] = None, - range: Optional[NDArray] = None, - mask_variant: Optional[bool] = None, - standard_name: Optional[str] = None, - verbose: Optional[bool] = None, - do_not_log: Optional[bool] = None, - err_msg: Optional[str] = None, - interp_method: Optional[str] = None, - tile_count: Optional[int] = None, - area: Optional[int] = None, - volume: Optional[int] = None, - realm: Optional[str] = None, - multiple_send_data: Optional[bool] = None, + axes: NDArray = None, + long_name: str = None, + units: str = None, + missing_value: int = None, + range: NDArray = None, + mask_variant: bool = None, + standard_name: str = None, + verbose: bool = None, + do_not_log: bool = None, + err_msg: str = None, + interp_method: str = None, + tile_count: int = None, + area: int = None, + volume: int = None, + realm: str = None, + multiple_send_data: bool = None, ) -> int: module_name = module_name[:64] @@ -421,17 +426,17 @@ def register_diag_field_scalar( module_name: str, field_name: str, datatype: Any, - long_name: Optional[str] = None, - units: Optional[str] = None, - standard_name: Optional[str] = None, - missing_value: Optional[int] = None, - range: Optional[NDArray] = None, - do_not_log: Optional[bool] = None, - err_msg: Optional[str] = None, - area: Optional[int] = None, - volume: Optional[int] = None, - realm: Optional[str] = None, - multiple_send_data: Optional[bool] = None, + long_name: str = None, + units: str = None, + standard_name: str = None, + missing_value: int = None, + range: NDArray = None, + do_not_log: bool = None, + err_msg: str = None, + area: int = None, + volume: int = None, + realm: str = None, + multiple_send_data: bool = None, ) -> int: module_name = module_name[:64] @@ -518,10 +523,11 @@ def diag_send_data( diag_field_id: int, field_shape: NDArray, field: NDArray, - err_msg: Optional[str] = None, + err_msg: str = None, ) -> bool: - err_msg = err_msg[:128] + if err_msg is not None: + err_msg = err_msg[:128] diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) field_shape_p, field_shape_t = setarray_Cint32(field_shape) diff --git a/run_tests.sh b/run_tests.sh index 53aa06e..a02a022 100755 --- a/run_tests.sh +++ b/run_tests.sh @@ -37,4 +37,8 @@ run_test "pytest tests/py_data_override/test_generate_files.py" run_test "mpirun -n 6 python -m pytest -m 'parallel' tests/py_data_override/test_data_override.py" remove_input "tests/py_data_override/test_data_override.py" +run_test "pytest tests/py_diag_manager/test_generate_files.py" +run_test "mpirun -n 1 python -m pytest tests/py_diag_manager/test_diag_manager.py" +remove_input "tests/py_diag_manager/test_diag_manager.py + rm -rf INPUT *logfile* *warnfile* diff --git a/tests/py_diag_manager/test_diag_manager.py b/tests/py_diag_manager/test_diag_manager.py index 1fe10aa..4a8f1c8 100644 --- a/tests/py_diag_manager/test_diag_manager.py +++ b/tests/py_diag_manager/test_diag_manager.py @@ -112,18 +112,11 @@ def test_send_data(): id_x = diag_manager.diag_axis_init( name="x", - naxis_data=NX, axis_data=x, units="point_E", cart_name="x", long_name="point_E", set_name="atm", - direction=0, - edges=0, - aux="", - req="", - tile_count=0, - domain_position=0, ) """ @@ -136,7 +129,6 @@ def test_send_data(): id_y = diag_manager.diag_axis_init( name="y", - naxis_data=NY, axis_data=y, units="point_N", cart_name="y", @@ -155,18 +147,11 @@ def test_send_data(): id_z = diag_manager.diag_axis_init( name="z", - naxis_data=NZ, axis_data=z, units="point_Z", cart_name="z", long_name="point_Z", set_name="atm", - direction=0, - edges=0, - aux="", - req="", - tile_count=0, - domain_position=0, not_xy=True, ) @@ -189,6 +174,7 @@ def test_send_data(): id_var3 = diag_manager.register_diag_field_array( module_name="atm_mod", field_name="var_3d", + datatype=np.float32, axes=axes_3d, long_name="Var in a lon/lat domain", units="muntin", @@ -219,6 +205,7 @@ def test_send_data(): id_var2 = diag_manager.register_diag_field_array( module_name="atm_mod", field_name="var_2d", + datatype=np.float32, axes=axes_2d, long_name="Var in a lon/lat domain", units="muntin", diff --git a/tests/py_horiz_interp/test_horiz_interp.py b/tests/py_horiz_interp/test_horiz_interp.py index 67cbecf..93a52f6 100755 --- a/tests/py_horiz_interp/test_horiz_interp.py +++ b/tests/py_horiz_interp/test_horiz_interp.py @@ -17,7 +17,7 @@ def test_create_input_nml(): def test_create_xgrid(): cfms = pyfms.pyFMS(cFMS_path=cfms_path).cFMS - create_xgrid = pyfms.HorizInterp(cfms=cfms).create_xgrid_2dx2d_order1 + create_xgrid = pyfms.pyHorizInterp(cfms=cfms).create_xgrid_2dx2d_order1 refine = 1 lon_init = 0.0 From b45703dba9065eed7d9a1afa0b312e0bcf9b4949 Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Fri, 28 Mar 2025 13:10:16 -0400 Subject: [PATCH 18/27] Changing the name of pyFMS_horiz_interp --- pyfms/__init__.py | 2 +- pyfms/py_horiz_interp/py_horiz_interp.py | 2 +- tests/py_horiz_interp/test_horiz_interp.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pyfms/__init__.py b/pyfms/__init__.py index 0b1d7c0..1ca4f04 100644 --- a/pyfms/__init__.py +++ b/pyfms/__init__.py @@ -1,7 +1,7 @@ from .py_data_override.py_data_override import pyDataOverride from .py_diag_manager.pyfms_diag_manager import pyFMS_diag_manager from .py_field_manager.py_field_manager import FieldTable -from .py_horiz_interp.py_horiz_interp import pyHorizInterp +from .py_horiz_interp.py_horiz_interp import pyFMS_horiz_interp from .py_mpp.py_mpp import pyFMS_mpp from .py_mpp.py_mpp_domains import ( pyDomain, diff --git a/pyfms/py_horiz_interp/py_horiz_interp.py b/pyfms/py_horiz_interp/py_horiz_interp.py index b14fea9..1cc800b 100644 --- a/pyfms/py_horiz_interp/py_horiz_interp.py +++ b/pyfms/py_horiz_interp/py_horiz_interp.py @@ -4,7 +4,7 @@ import numpy.typing as npt -class pyHorizInterp: +class pyFMS_horiz_interp: def __init__(self, cfms: ctypes.CDLL): self.cfms = cfms diff --git a/tests/py_horiz_interp/test_horiz_interp.py b/tests/py_horiz_interp/test_horiz_interp.py index 93a52f6..0a81a22 100755 --- a/tests/py_horiz_interp/test_horiz_interp.py +++ b/tests/py_horiz_interp/test_horiz_interp.py @@ -17,7 +17,7 @@ def test_create_input_nml(): def test_create_xgrid(): cfms = pyfms.pyFMS(cFMS_path=cfms_path).cFMS - create_xgrid = pyfms.pyHorizInterp(cfms=cfms).create_xgrid_2dx2d_order1 + create_xgrid = pyfms.pyFMS_horiz_interp(cfms=cfms).create_xgrid_2dx2d_order1 refine = 1 lon_init = 0.0 From a8e2a677b4ae7380ae6ef977f579c3cafd7ed903 Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Fri, 28 Mar 2025 13:57:09 -0400 Subject: [PATCH 19/27] Switching to feature/diag_manager --- pyfms/py_horiz_interp/py_horiz_interp.py | 81 +++++++++++++----------- 1 file changed, 45 insertions(+), 36 deletions(-) diff --git a/pyfms/py_horiz_interp/py_horiz_interp.py b/pyfms/py_horiz_interp/py_horiz_interp.py index cf35dca..22674c3 100644 --- a/pyfms/py_horiz_interp/py_horiz_interp.py +++ b/pyfms/py_horiz_interp/py_horiz_interp.py @@ -156,17 +156,17 @@ def get_interp( datatype: Any, interp_id: int = None, nxgrid: int = None, - ilon_ptr: npt.NDArray = None, + ilon: npt.NDArray = None, ilon_shape: list[int] = None, - jlat_ptr: npt.NDArray = None, + jlat: npt.NDArray = None, jlat_shape: list[int] = None, - i_lon_ptr: npt.NDArray = None, + i_lon: npt.NDArray = None, i_lon_shape: list[int] = None, - j_lat_ptr: npt.NDArray = None, + j_lat: npt.NDArray = None, j_lat_shape: list[int] = None, - found_neighbors_ptr: npt.NDArray = None, + found_neighbors: npt.NDArray = None, found_neighbors_shape: list[int] = None, - num_found_ptr: npt.NDArray = None, + num_found: npt.NDArray = None, num_found_shape: list[int] = None, nlon_src: int = None, nlat_src: int = None, @@ -175,43 +175,52 @@ def get_interp( interp_method: int = None, I_am_initialized: bool = None, version: int = None, - i_src_ptr: npt.NDArray = None, - i_src_shape: list[int] = None, - j_src_ptr: npt.NDArray = None, - j_src_shape: list[int] = None, - i_dst_ptr: npt.NDArray = None, + i_src: npt.NDArray = None, + i_src_shape: int = None, + j_src: npt.NDArray = None, + j_src_shape: int = None, + i_dst: npt.NDArray = None, i_dst_shape: int = None, - j_dst_ptr: npt.NDArray = None, + j_dst: npt.NDArray = None, j_dst_shape: int = None, - faci_ptr: npt.NDArray = None, - faci_shape: npt.NDArray = None, - facj_ptr: npt.NDArray = None, - facj_shape: npt.NDArray = None, - area_src_ptr: npt.NDArray = None, - area_src_shape: npt.NDArray = None, - area_dst_ptr: npt.NDArray = None, - area_dst_shape: npt.NDArray = None, - wti_ptr: npt.NDArray = None, - wti_shape: npt.NDArray = None, - wtj_ptr: npt.NDArray = None, - wtj_shape: npt.NDArray = None, - src_dist_ptr: npt.NDArray = None, - src_dist_shape: npt.NDArray = None, - rat_x_ptr: npt.NDArray = None, - rat_x_shape: npt.NDArray = None, - rat_y_ptr: npt.NDArray = None, - rat_y_shape: npt.NDArray = None, - lon_in_ptr: npt.NDArray = None, + faci: npt.NDArray = None, + faci_shape: list[int] = None, + facj: npt.NDArray = None, + facj_shape: list[int] = None, + area_src: npt.NDArray = None, + area_src_shape: list[int] = None, + area_dst: npt.NDArray = None, + area_dst_shape: list[int] = None, + wti: npt.NDArray = None, + wti_shape: list[int] = None, + wtj: npt.NDArray = None, + wtj_shape: list[int] = None, + src_dist: npt.NDArray = None, + src_dist_shape: list[int] = None, + rat_x: npt.NDArray = None, + rat_x_shape: list[int] = None, + rat_y: npt.NDArray = None, + rat_y_shape: list[int] = None, + lon_in: npt.NDArray = None, lon_in_shape: int = None, - lat_in_ptr: npt.NDArray = None, + lat_in: npt.NDArray = None, lat_in_shape: int = None, - area_frac_dst_ptr: npt.NDArray = None, + area_frac_dst: npt.NDArray = None, area_frac_dst_shape: int = None, - mask_in_ptr: npt.NDArray = None, - mask_in_shape: npt.NDArray = None, + mask_in: npt.NDArray = None, + mask_in_shape: list[int] = None, max_src_dist: float = None, is_allocated: bool = None, ): if datatype is np.float64: _cfms_get_interp = self.cfms.cFMS_get_interp_cdouble - faci_t = np.ctypeslib.ndpointer(dtype=np.float64, ndim=) + faci_t = np.ctypeslib.ndpointer(dtype=np.float64, ndim=2, shape=faci_shape) + facj_t = np.ctypeslib.ndpointer(dtype=np.float64, ndim=2, shape=facj_shape) + area_src_t = np.ctypeslib.ndpointer(dtype=np.float64, ndim=2, shape=area_src_shape) + area_dst_t = np.ctypeslib.ndpointer(dtype=np.float64, ndim=2, shape=area_dst_shape) + wti_t = np.ctypeslib.ndpointer(dtype=np.float64, ndim=3, shape=wti_shape) + wtj_t = np.ctypeslib.ndpointer(dtype=np.float64, ndim=3, shape=wtj_shape) + src_dist_t = np.ctypeslib.ndpointer(dtype=np.float64, ndim=3, shape=src_dist_shape) + rat_x_t = np.ctypeslib.ndpointer(dtype=np.float64, ndim=2, shape=rat_x_shape) + + From c880ca5fe33de1971730448a6b26c3c1497a7821 Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Fri, 28 Mar 2025 14:32:45 -0400 Subject: [PATCH 20/27] Addressing PR comments --- pyfms/__init__.py | 2 +- pyfms/py_diag_manager/pyfms_diag_manager.py | 7 +- pyfms/py_horiz_interp/py_horiz_interp.py | 139 ++++++++++--------- pyfms/py_mpp/py_mpp_domains.py | 31 +++-- tests/py_diag_manager/test_diag_manager.py | 86 +++--------- tests/py_diag_manager/test_generate_files.py | 40 ++++++ tests/py_horiz_interp/test_horiz_interp.py | 2 +- tests/py_mpp/test_define_domains.py | 8 +- tests/py_mpp/test_getset_domains.py | 2 +- 9 files changed, 162 insertions(+), 155 deletions(-) create mode 100644 tests/py_diag_manager/test_generate_files.py diff --git a/pyfms/__init__.py b/pyfms/__init__.py index 1ca4f04..c844ef6 100644 --- a/pyfms/__init__.py +++ b/pyfms/__init__.py @@ -1,7 +1,7 @@ from .py_data_override.py_data_override import pyDataOverride from .py_diag_manager.pyfms_diag_manager import pyFMS_diag_manager from .py_field_manager.py_field_manager import FieldTable -from .py_horiz_interp.py_horiz_interp import pyFMS_horiz_interp +from .py_horiz_interp.py_horiz_interp import HorizInterp from .py_mpp.py_mpp import pyFMS_mpp from .py_mpp.py_mpp_domains import ( pyDomain, diff --git a/pyfms/py_diag_manager/pyfms_diag_manager.py b/pyfms/py_diag_manager/pyfms_diag_manager.py index b4ecbdd..3a5dc2c 100644 --- a/pyfms/py_diag_manager/pyfms_diag_manager.py +++ b/pyfms/py_diag_manager/pyfms_diag_manager.py @@ -18,6 +18,8 @@ class pyFMS_diag_manager: + DIAG_ALL = 2 + def __init__(self, clibFMS: ctypes.CDLL = None): self.clibFMS = clibFMS @@ -52,7 +54,10 @@ def diag_init( _cfms_diag_init(diag_model_subset_c, time_init_p, err_msg_c) - return err_msg_c.value.decode("utf-8") + if err_msg is not None: + return err_msg_c.value.decode("utf-8") + else: + return err_msg def diag_send_complete( self, diff --git a/pyfms/py_horiz_interp/py_horiz_interp.py b/pyfms/py_horiz_interp/py_horiz_interp.py index 22674c3..28f7cef 100644 --- a/pyfms/py_horiz_interp/py_horiz_interp.py +++ b/pyfms/py_horiz_interp/py_horiz_interp.py @@ -1,12 +1,11 @@ import ctypes - from typing import Any import numpy as np import numpy.typing as npt -class pyFMS_horiz_interp: +class HorizInterp: def __init__(self, cfms: ctypes.CDLL): self.cfms = cfms @@ -152,75 +151,81 @@ def set_current_interp(self, interp_id: int = None): _cfms_set_current_interp(ctypes.byref(interp_id_c)) def get_interp( - self, - datatype: Any, - interp_id: int = None, - nxgrid: int = None, - ilon: npt.NDArray = None, - ilon_shape: list[int] = None, - jlat: npt.NDArray = None, - jlat_shape: list[int] = None, - i_lon: npt.NDArray = None, - i_lon_shape: list[int] = None, - j_lat: npt.NDArray = None, - j_lat_shape: list[int] = None, - found_neighbors: npt.NDArray = None, - found_neighbors_shape: list[int] = None, - num_found: npt.NDArray = None, - num_found_shape: list[int] = None, - nlon_src: int = None, - nlat_src: int = None, - nlon_dst: int = None, - nlat_dst: int = None, - interp_method: int = None, - I_am_initialized: bool = None, - version: int = None, - i_src: npt.NDArray = None, - i_src_shape: int = None, - j_src: npt.NDArray = None, - j_src_shape: int = None, - i_dst: npt.NDArray = None, - i_dst_shape: int = None, - j_dst: npt.NDArray = None, - j_dst_shape: int = None, - faci: npt.NDArray = None, - faci_shape: list[int] = None, - facj: npt.NDArray = None, - facj_shape: list[int] = None, - area_src: npt.NDArray = None, - area_src_shape: list[int] = None, - area_dst: npt.NDArray = None, - area_dst_shape: list[int] = None, - wti: npt.NDArray = None, - wti_shape: list[int] = None, - wtj: npt.NDArray = None, - wtj_shape: list[int] = None, - src_dist: npt.NDArray = None, - src_dist_shape: list[int] = None, - rat_x: npt.NDArray = None, - rat_x_shape: list[int] = None, - rat_y: npt.NDArray = None, - rat_y_shape: list[int] = None, - lon_in: npt.NDArray = None, - lon_in_shape: int = None, - lat_in: npt.NDArray = None, - lat_in_shape: int = None, - area_frac_dst: npt.NDArray = None, - area_frac_dst_shape: int = None, - mask_in: npt.NDArray = None, - mask_in_shape: list[int] = None, - max_src_dist: float = None, - is_allocated: bool = None, + self, + datatype: Any, + interp_id: int = None, + nxgrid: int = None, + ilon: npt.NDArray = None, + ilon_shape: list[int] = None, + jlat: npt.NDArray = None, + jlat_shape: list[int] = None, + i_lon: npt.NDArray = None, + i_lon_shape: list[int] = None, + j_lat: npt.NDArray = None, + j_lat_shape: list[int] = None, + found_neighbors: npt.NDArray = None, + found_neighbors_shape: list[int] = None, + num_found: npt.NDArray = None, + num_found_shape: list[int] = None, + nlon_src: int = None, + nlat_src: int = None, + nlon_dst: int = None, + nlat_dst: int = None, + interp_method: int = None, + I_am_initialized: bool = None, + version: int = None, + i_src: npt.NDArray = None, + i_src_shape: int = None, + j_src: npt.NDArray = None, + j_src_shape: int = None, + i_dst: npt.NDArray = None, + i_dst_shape: int = None, + j_dst: npt.NDArray = None, + j_dst_shape: int = None, + faci: npt.NDArray = None, + faci_shape: list[int] = None, + facj: npt.NDArray = None, + facj_shape: list[int] = None, + area_src: npt.NDArray = None, + area_src_shape: list[int] = None, + area_dst: npt.NDArray = None, + area_dst_shape: list[int] = None, + wti: npt.NDArray = None, + wti_shape: list[int] = None, + wtj: npt.NDArray = None, + wtj_shape: list[int] = None, + src_dist: npt.NDArray = None, + src_dist_shape: list[int] = None, + rat_x: npt.NDArray = None, + rat_x_shape: list[int] = None, + rat_y: npt.NDArray = None, + rat_y_shape: list[int] = None, + lon_in: npt.NDArray = None, + lon_in_shape: int = None, + lat_in: npt.NDArray = None, + lat_in_shape: int = None, + area_frac_dst: npt.NDArray = None, + area_frac_dst_shape: int = None, + mask_in: npt.NDArray = None, + mask_in_shape: list[int] = None, + max_src_dist: float = None, + is_allocated: bool = None, ): if datatype is np.float64: _cfms_get_interp = self.cfms.cFMS_get_interp_cdouble faci_t = np.ctypeslib.ndpointer(dtype=np.float64, ndim=2, shape=faci_shape) facj_t = np.ctypeslib.ndpointer(dtype=np.float64, ndim=2, shape=facj_shape) - area_src_t = np.ctypeslib.ndpointer(dtype=np.float64, ndim=2, shape=area_src_shape) - area_dst_t = np.ctypeslib.ndpointer(dtype=np.float64, ndim=2, shape=area_dst_shape) + area_src_t = np.ctypeslib.ndpointer( + dtype=np.float64, ndim=2, shape=area_src_shape + ) + area_dst_t = np.ctypeslib.ndpointer( + dtype=np.float64, ndim=2, shape=area_dst_shape + ) wti_t = np.ctypeslib.ndpointer(dtype=np.float64, ndim=3, shape=wti_shape) wtj_t = np.ctypeslib.ndpointer(dtype=np.float64, ndim=3, shape=wtj_shape) - src_dist_t = np.ctypeslib.ndpointer(dtype=np.float64, ndim=3, shape=src_dist_shape) - rat_x_t = np.ctypeslib.ndpointer(dtype=np.float64, ndim=2, shape=rat_x_shape) - - + src_dist_t = np.ctypeslib.ndpointer( + dtype=np.float64, ndim=3, shape=src_dist_shape + ) + rat_x_t = np.ctypeslib.ndpointer( + dtype=np.float64, ndim=2, shape=rat_x_shape + ) diff --git a/pyfms/py_mpp/py_mpp_domains.py b/pyfms/py_mpp/py_mpp_domains.py index 38fae54..dbf7ae3 100644 --- a/pyfms/py_mpp/py_mpp_domains.py +++ b/pyfms/py_mpp/py_mpp_domains.py @@ -59,8 +59,8 @@ def __init__(self, cFMS: ctypes.CDLL = None): def define_domains( self, - global_indices: NDArray, - layout: NDArray, + global_indices: list[int], + layout: list[int], domain_id: Optional[int] = None, pelist: Optional[NDArray] = None, xflags: Optional[int] = None, @@ -87,8 +87,11 @@ def define_domains( _cfms_define_domains = self.cFMS.cFMS_define_domains - global_indices_p, global_indices_t = setarray_Cint32(global_indices) - layout_p, layout_t = setarray_Cint32(layout) + global_indices_arr = np.array(global_indices, dtype=np.int32) + layout_arr = np.array(layout, dtype=np.int32) + + global_indices_p, global_indices_t = setarray_Cint32(global_indices_arr) + layout_p, layout_t = setarray_Cint32(layout_arr) domain_id_c, domain_id_t = setscalar_Cint32(domain_id) pelist_p, pelist_t = setarray_Cint32(pelist) xflags_c, xflags_t = setscalar_Cint32(xflags) @@ -176,10 +179,12 @@ def define_domains( Returns: No return """ - def define_io_domain(self, io_layout: NDArray, domain_id: Optional[int] = None): + def define_io_domain(self, io_layout: list[int], domain_id: Optional[int] = None): _cfms_define_io_domain = self.cFMS.cFMS_define_io_domain - io_layout_p, io_layout_t = setarray_Cint32(io_layout) + io_layout_arr = np.array(io_layout, dtype=np.int32) + + io_layout_p, io_layout_t = setarray_Cint32(io_layout_arr) domain_id_c, domain_id_t = setscalar_Cint32(domain_id) _cfms_define_io_domain.argtypes = [io_layout_t, domain_id_t] @@ -197,15 +202,17 @@ def define_io_domain(self, io_layout: NDArray, domain_id: Optional[int] = None): def define_layout( self, - global_indices: NDArray, + global_indices: list[int], ndivs: int, - ) -> NDArray: + ) -> list: layout = np.empty(shape=2, dtype=np.int32, order="C") + global_indices_arr = np.array(global_indices, dtype=np.int32) + _cfms_define_layout = self.cFMS.cFMS_define_layout - global_indices_p, global_indices_t = setarray_Cint32(global_indices) + global_indices_p, global_indices_t = setarray_Cint32(global_indices_arr) ndivs_c, ndivs_t = setscalar_Cint32(ndivs) layout_p, layout_t = setarray_Cint32(layout) @@ -214,7 +221,7 @@ def define_layout( _cfms_define_layout(global_indices_p, ndivs_c, layout_p) - return layout + return layout.tolist() """ Subroutine: define_nest_domains @@ -907,8 +914,8 @@ class pyDomain: def __init__( self, mpp_domains_obj: pyFMS_mpp_domains, - global_indices: NDArray, - layout: NDArray, + global_indices: list[int], + layout: list[int], domain_id: Optional[int] = None, pelist: Optional[NDArray] = None, xflags: Optional[int] = None, diff --git a/tests/py_diag_manager/test_diag_manager.py b/tests/py_diag_manager/test_diag_manager.py index 4a8f1c8..1ea870e 100644 --- a/tests/py_diag_manager/test_diag_manager.py +++ b/tests/py_diag_manager/test_diag_manager.py @@ -1,5 +1,3 @@ -import os - import numpy as np from pyfms import pyFMS, pyFMS_diag_manager, pyFMS_mpp_domains @@ -11,49 +9,14 @@ def test_send_data(): NY = 8 NZ = 2 - input_file = "input.nml" - diag_table = "diag_table.yaml" - - input_text = """ -&diag_manager_nml - use_modern_diag = .true. -/""" - - diag_text = """ -title: test_diag_manager -base_date: 2 1 1 1 1 1 - -diag_files: -- file_name: test_send_data - freq: 1 hours - time_units: hours - unlimdim: time - varlist: - - module: atm_mod - var_name: var_3d - reduction: average - kind: r4 - output_name: var3_avg - - module: atm_mod - var_name: var_2d - reduction: average - kind: r4 - output_name: var2_avg - """ - - with open(input_file, "w") as file1: - file1.write(input_text) - with open(diag_table, "w") as file2: - file2.write(diag_text) - domain_id = 0 calendar_type = 4 - var2_shape = np.array([NX, NY], dtype=np.int32, order="C") - var2 = np.empty(shape=NX * NY, dtype=np.float32, order="C") + var2_shape = np.array([NX, NY], dtype=np.int32) + var2 = np.empty(shape=NX * NY, dtype=np.float32) - var3_shape = np.array([NX, NY, NZ], dtype=np.int32, order="C") - var3 = np.empty(shape=NX * NY * NZ, dtype=np.float32, order="C") + var3_shape = np.array([NX, NY, NZ], dtype=np.int32) + var3 = np.empty(shape=NX * NY * NZ, dtype=np.float32) ijk = 0 for i in range(NX): @@ -73,9 +36,9 @@ def test_send_data(): pyfms = pyFMS(cFMS_path=cfms_path, calendar_type=calendar_type) mpp_domains = pyFMS_mpp_domains(cFMS=pyfms.cFMS) - global_indices = np.array([0, NX - 1, 0, NY - 1], dtype=np.int32, order="C") - layout = np.array([1, 1], dtype=np.int32, order="C") - io_layout = np.array([1, 1], dtype=np.int32, order="C") + global_indices = [0, (NX - 1), 0, (NY - 1)] + layout = [1, 1] + io_layout = [1, 1] mpp_domains.define_domains( domain_id=domain_id, @@ -91,21 +54,15 @@ def test_send_data(): diag manager init """ - diag_model_subset = 2 - err_msg = "None" - diag_manager = pyFMS_diag_manager(clibFMS=pyfms.cFMS) - diag_manager.diag_init( - diag_model_subset=diag_model_subset, - err_msg=err_msg, - ) + diag_manager.diag_init(diag_model_subset=diag_manager.DIAG_ALL) mpp_domains.set_current_domain(domain_id=domain_id) """ diag axis init x """ - x = np.empty(shape=NX, dtype=np.float64, order="C") + x = np.arange(NX, dtype=np.float64) for i in range(NX): x[i] = i @@ -122,7 +79,7 @@ def test_send_data(): """ diag axis init y """ - y = np.empty(shape=NY, dtype=np.float64, order="C") + y = np.arange(NY, dtype=np.float64) for j in range(NY): y[j] = j @@ -140,7 +97,7 @@ def test_send_data(): diag axis init z """ - z = np.empty(shape=NZ, dtype=np.float64, order="C") + z = np.arange(NZ, dtype=np.float64) for k in range(NZ): z[k] = k @@ -159,8 +116,8 @@ def test_send_data(): register diag field var3 """ - axes_3d = np.array([id_x, id_y, id_z, 0, 0], dtype=np.int32, order="C") - range_3d = np.array([-1000.0, 1000.0], dtype=np.float32, order="C") + axes_3d = np.array([id_x, id_y, id_z, 0, 0], dtype=np.int32) + range_3d = np.array([-1000.0, 1000.0], dtype=np.float32) diag_manager.diag_set_field_init_time( year=2, @@ -190,8 +147,8 @@ def test_send_data(): register diag_field var 2 """ - axes_2d = np.array([id_x, id_y, 0, 0, 0], dtype=np.int32, order="C") - range_2d = np.array([-1000.0, 1000.0], dtype=np.float32, order="C") + axes_2d = np.array([id_x, id_y, 0, 0, 0], dtype=np.int32) + range_2d = np.array([-1000.0, 1000.0], dtype=np.float32) diag_manager.diag_set_field_init_time( year=2, @@ -244,7 +201,8 @@ def test_send_data(): field=var3, ) - for itime in range(24): + ntime = 24 + for itime in range(ntime): ijk = 0 for i in range(NX): for j in range(NY): @@ -259,11 +217,8 @@ def test_send_data(): ) diag_manager.diag_send_complete(diag_field_id=id_var3) - ij = 0 - for i in range(NX): - for j in range(NY): - var2[ij] = -1.0 * var2[ij] - ij += 1 + var2 = -var2 + diag_manager.diag_advance_field_time(diag_field_id=id_var2) diag_manager.diag_send_data( diag_field_id=id_var2, @@ -276,9 +231,6 @@ def test_send_data(): pyfms.pyfms_end() - os.remove(input_file) - os.remove(diag_table) - if __name__ == "__main__": test_send_data() diff --git a/tests/py_diag_manager/test_generate_files.py b/tests/py_diag_manager/test_generate_files.py new file mode 100644 index 0000000..a525605 --- /dev/null +++ b/tests/py_diag_manager/test_generate_files.py @@ -0,0 +1,40 @@ +import yaml + + +def test_write_input_files(): + diag_table = yaml.load( + """ +title: test_diag_manager +base_date: 2 1 1 1 1 1 + +diag_files: +- file_name: test_send_data + freq: 1 hours + time_units: hours + unlimdim: time + varlist: + - module: atm_mod + var_name: var_3d + reduction: average + kind: r4 + output_name: var3_avg + - module: atm_mod + var_name: var_2d + reduction: average + kind: r4 + output_name: var2_avg +""", + Loader=yaml.Loader, + ) + + diag_table_yaml_file = open("diag_table.yaml", "w") + yaml.dump(diag_table, diag_table_yaml_file, sort_keys=False) + diag_table_yaml_file.close() + + input_nml = """ +&diag_manager_nml + use_modern_diag = .true. +/""" + input_nml_file = open("input.nml", "w") + input_nml_file.write(input_nml) + input_nml_file.close() diff --git a/tests/py_horiz_interp/test_horiz_interp.py b/tests/py_horiz_interp/test_horiz_interp.py index 0a81a22..67cbecf 100755 --- a/tests/py_horiz_interp/test_horiz_interp.py +++ b/tests/py_horiz_interp/test_horiz_interp.py @@ -17,7 +17,7 @@ def test_create_input_nml(): def test_create_xgrid(): cfms = pyfms.pyFMS(cFMS_path=cfms_path).cFMS - create_xgrid = pyfms.pyFMS_horiz_interp(cfms=cfms).create_xgrid_2dx2d_order1 + create_xgrid = pyfms.HorizInterp(cfms=cfms).create_xgrid_2dx2d_order1 refine = 1 lon_init = 0.0 diff --git a/tests/py_mpp/test_define_domains.py b/tests/py_mpp/test_define_domains.py index 658c2ad..da03782 100644 --- a/tests/py_mpp/test_define_domains.py +++ b/tests/py_mpp/test_define_domains.py @@ -30,7 +30,7 @@ def test_define_domains(): domain_id = 1 nest_domain_id = 1 - coarse_global_indices = np.array([0, NX - 1, 0, NY - 1], dtype=np.int32, order="C") + coarse_global_indices = [0, NX - 1, 0, NY - 1] coarse_npes = COARSE_NPES coarse_pelist = np.empty(shape=COARSE_NPES, dtype=np.int32, order="C") coarse_tile_id = 0 @@ -43,9 +43,7 @@ def test_define_domains(): is_mosaic = False symmetry = False - fine_global_indices = np.array( - [0, NX_FINE - 1, 0, NY_FINE - 1], dtype=np.int32, order="C" - ) + fine_global_indices = [0, NX_FINE - 1, 0, NY_FINE - 1] fine_npes = FINE_NPES fine_pelist = np.empty(shape=FINE_NPES, dtype=np.int32, order="C") fine_tile_id = 1 @@ -86,7 +84,7 @@ def test_define_domains(): pyfms.set_pelist_npes(coarse_npes) mpp.set_current_pelist(coarse_pelist) name = "test coarse domain" - maskmap = np.full(shape=8, fill_value=True, order="C") + maskmap = np.full(shape=(2, 4), fill_value=True, dtype=np.bool_, order="F") xextent = np.zeros(shape=2, dtype=np.int32, order="C") yextent = np.zeros(shape=2, dtype=np.int32, order="C") diff --git a/tests/py_mpp/test_getset_domains.py b/tests/py_mpp/test_getset_domains.py index 78074b5..8438371 100644 --- a/tests/py_mpp/test_getset_domains.py +++ b/tests/py_mpp/test_getset_domains.py @@ -28,7 +28,7 @@ def test_getset_domains(): """ domain_id = 0 ndiv = 4 - global_indices = np.array([0, 3, 0, 3], dtype=np.int32, order="C") + global_indices = [0, 3, 0, 3] whalo = 2 ehalo = 2 shalo = 2 From 3f5ae0997ffdb6b937593e32f86af1ffdb6cdd59 Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Fri, 28 Mar 2025 15:00:04 -0400 Subject: [PATCH 21/27] Pushed to wrong branch --- pyfms/py_horiz_interp/py_horiz_interp.py | 80 ------------------------ 1 file changed, 80 deletions(-) diff --git a/pyfms/py_horiz_interp/py_horiz_interp.py b/pyfms/py_horiz_interp/py_horiz_interp.py index 28f7cef..53e9671 100644 --- a/pyfms/py_horiz_interp/py_horiz_interp.py +++ b/pyfms/py_horiz_interp/py_horiz_interp.py @@ -149,83 +149,3 @@ def set_current_interp(self, interp_id: int = None): _cfms_set_current_interp.restype = None _cfms_set_current_interp(ctypes.byref(interp_id_c)) - - def get_interp( - self, - datatype: Any, - interp_id: int = None, - nxgrid: int = None, - ilon: npt.NDArray = None, - ilon_shape: list[int] = None, - jlat: npt.NDArray = None, - jlat_shape: list[int] = None, - i_lon: npt.NDArray = None, - i_lon_shape: list[int] = None, - j_lat: npt.NDArray = None, - j_lat_shape: list[int] = None, - found_neighbors: npt.NDArray = None, - found_neighbors_shape: list[int] = None, - num_found: npt.NDArray = None, - num_found_shape: list[int] = None, - nlon_src: int = None, - nlat_src: int = None, - nlon_dst: int = None, - nlat_dst: int = None, - interp_method: int = None, - I_am_initialized: bool = None, - version: int = None, - i_src: npt.NDArray = None, - i_src_shape: int = None, - j_src: npt.NDArray = None, - j_src_shape: int = None, - i_dst: npt.NDArray = None, - i_dst_shape: int = None, - j_dst: npt.NDArray = None, - j_dst_shape: int = None, - faci: npt.NDArray = None, - faci_shape: list[int] = None, - facj: npt.NDArray = None, - facj_shape: list[int] = None, - area_src: npt.NDArray = None, - area_src_shape: list[int] = None, - area_dst: npt.NDArray = None, - area_dst_shape: list[int] = None, - wti: npt.NDArray = None, - wti_shape: list[int] = None, - wtj: npt.NDArray = None, - wtj_shape: list[int] = None, - src_dist: npt.NDArray = None, - src_dist_shape: list[int] = None, - rat_x: npt.NDArray = None, - rat_x_shape: list[int] = None, - rat_y: npt.NDArray = None, - rat_y_shape: list[int] = None, - lon_in: npt.NDArray = None, - lon_in_shape: int = None, - lat_in: npt.NDArray = None, - lat_in_shape: int = None, - area_frac_dst: npt.NDArray = None, - area_frac_dst_shape: int = None, - mask_in: npt.NDArray = None, - mask_in_shape: list[int] = None, - max_src_dist: float = None, - is_allocated: bool = None, - ): - if datatype is np.float64: - _cfms_get_interp = self.cfms.cFMS_get_interp_cdouble - faci_t = np.ctypeslib.ndpointer(dtype=np.float64, ndim=2, shape=faci_shape) - facj_t = np.ctypeslib.ndpointer(dtype=np.float64, ndim=2, shape=facj_shape) - area_src_t = np.ctypeslib.ndpointer( - dtype=np.float64, ndim=2, shape=area_src_shape - ) - area_dst_t = np.ctypeslib.ndpointer( - dtype=np.float64, ndim=2, shape=area_dst_shape - ) - wti_t = np.ctypeslib.ndpointer(dtype=np.float64, ndim=3, shape=wti_shape) - wtj_t = np.ctypeslib.ndpointer(dtype=np.float64, ndim=3, shape=wtj_shape) - src_dist_t = np.ctypeslib.ndpointer( - dtype=np.float64, ndim=3, shape=src_dist_shape - ) - rat_x_t = np.ctypeslib.ndpointer( - dtype=np.float64, ndim=2, shape=rat_x_shape - ) From e6b88edf086929da90d4b2f2ba4f388bc4178619 Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Fri, 28 Mar 2025 15:41:29 -0400 Subject: [PATCH 22/27] Addressing missed comments --- pyfms/__init__.py | 2 +- pyfms/py_diag_manager/pyfms_diag_manager.py | 57 ++++++++------------- pyfms/py_horiz_interp/py_horiz_interp.py | 1 - tests/py_diag_manager/test_diag_manager.py | 44 ++++++++-------- 4 files changed, 44 insertions(+), 60 deletions(-) diff --git a/pyfms/__init__.py b/pyfms/__init__.py index c844ef6..8f12b9d 100644 --- a/pyfms/__init__.py +++ b/pyfms/__init__.py @@ -1,5 +1,5 @@ from .py_data_override.py_data_override import pyDataOverride -from .py_diag_manager.pyfms_diag_manager import pyFMS_diag_manager +from .py_diag_manager.pyfms_diag_manager import DiagManager from .py_field_manager.py_field_manager import FieldTable from .py_horiz_interp.py_horiz_interp import HorizInterp from .py_mpp.py_mpp import pyFMS_mpp diff --git a/pyfms/py_diag_manager/pyfms_diag_manager.py b/pyfms/py_diag_manager/pyfms_diag_manager.py index 3a5dc2c..61608c0 100644 --- a/pyfms/py_diag_manager/pyfms_diag_manager.py +++ b/pyfms/py_diag_manager/pyfms_diag_manager.py @@ -1,5 +1,4 @@ import ctypes -from typing import Any import numpy as np from numpy.typing import NDArray @@ -16,28 +15,26 @@ ) -class pyFMS_diag_manager: +class DiagManager: DIAG_ALL = 2 def __init__(self, clibFMS: ctypes.CDLL = None): self.clibFMS = clibFMS - def diag_end(self): + def end(self): _cfms_diag_end = self.clibFMS.cFMS_diag_end _cfms_diag_end.restype = None _cfms_diag_end() - def diag_init( + def init( self, diag_model_subset: int = None, time_init: NDArray = None, - err_msg: str = None, ) -> str: - if err_msg is not None: - err_msg = err_msg[:128] + err_msg = "" _cfms_diag_init = self.clibFMS.cFMS_diag_init @@ -54,12 +51,9 @@ def diag_init( _cfms_diag_init(diag_model_subset_c, time_init_p, err_msg_c) - if err_msg is not None: - return err_msg_c.value.decode("utf-8") - else: - return err_msg + return err_msg_c.value.decode("utf-8") - def diag_send_complete( + def send_complete( self, diag_field_id: int, err_msg: str = None, @@ -83,7 +77,7 @@ def diag_send_complete( else: return err_msg - def diag_set_field_init_time( + def set_field_init_time( self, year: int, month: int, @@ -92,11 +86,9 @@ def diag_set_field_init_time( minute: int, second: int = None, tick: int = None, - err_msg: str = None, ) -> str: - if err_msg is not None: - err_msg = err_msg[:128] + err_msg = "" _cfms_diag_set_field_init_time = self.clibFMS.cFMS_diag_set_field_init_time @@ -125,12 +117,9 @@ def diag_set_field_init_time( year_c, month_c, day_c, hour_c, minute_c, second_c, tick_c, err_msg_c ) - if err_msg is not None: - return err_msg_c.value.decode("utf-8") - else: - return err_msg + return err_msg_c.value.decode("utf-8") - def diag_set_field_timestep( + def set_field_timestep( self, diag_field_id: int, dseconds: int, @@ -168,7 +157,7 @@ def diag_set_field_timestep( else: return err_msg - def diag_advance_field_time( + def advance_field_time( self, diag_field_id: int, ): @@ -181,7 +170,7 @@ def diag_advance_field_time( _cfms_diag_advance_field_time(diag_field_id_c) - def diag_set_time_end( + def set_time_end( self, year: int = None, month: int = None, @@ -229,7 +218,7 @@ def diag_set_time_end( err_msg_c, ) - def diag_axis_init( + def axis_init( self, name: str, axis_data: NDArray, @@ -307,11 +296,10 @@ def diag_axis_init( not_xy_c, ) - def register_diag_field_array( + def register_field_array( self, module_name: str, field_name: str, - datatype: Any, axes: NDArray = None, long_name: str = None, units: str = None, @@ -362,19 +350,19 @@ def register_diag_field_array( realm_c, realm_t = set_Cchar(realm) multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) - if datatype == np.int32: + if range.dtype == np.int32: _cfms_register_diag_field_array_ = ( self.clibFMS.cFMS_register_diag_field_array_cint ) range_p, range_t = setarray_Cint32(range) missing_value_c, missing_value_t = setscalar_Cint32(missing_value) - elif datatype == np.float64: + elif range.dtype == np.float64: _cfms_register_diag_field_array_ = ( self.clibFMS.cFMS_register_diag_field_array_cdouble ) range_p, range_t = setarray_Cdouble(range) missing_value_c, missing_value_t = setscalar_Cdouble(missing_value) - elif datatype == np.float32: + elif range.dtype == np.float32: _cfms_register_diag_field_array_ = ( self.clibFMS.cFMS_register_diag_field_array_cfloat ) @@ -426,11 +414,10 @@ def register_diag_field_array( multiple_send_data_c, ) - def register_diag_field_scalar( + def register_field_scalar( self, module_name: str, field_name: str, - datatype: Any, long_name: str = None, units: str = None, standard_name: str = None, @@ -469,19 +456,19 @@ def register_diag_field_scalar( realm_c, realm_t = set_Cchar(realm) multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) - if datatype == np.int32: + if range.dtype == np.int32: _cfms_register_diag_field_scalar_ = ( self.clibFMS.cFMS_register_diag_field_array_cint ) range_p, range_t = setarray_Cint32(range) missing_value_c, missing_value_t = setscalar_Cint32(missing_value) - elif datatype == np.float64: + elif range.dtype == np.float64: _cfms_register_diag_field_scalar_ = ( self.clibFMS.cFMS_register_diag_field_array_cdouble ) range_p, range_t = setarray_Cdouble(range) missing_value_c, missing_value_t = setscalar_Cdouble(missing_value) - elif datatype == np.float32: + elif range.dtype == np.float32: _cfms_register_diag_field_scalar_ = ( self.clibFMS.cFMS_register_diag_field_array_cfloat ) @@ -523,7 +510,7 @@ def register_diag_field_scalar( multiple_send_data_c, ) - def diag_send_data( + def send_data( self, diag_field_id: int, field_shape: NDArray, diff --git a/pyfms/py_horiz_interp/py_horiz_interp.py b/pyfms/py_horiz_interp/py_horiz_interp.py index 53e9671..92caa2b 100644 --- a/pyfms/py_horiz_interp/py_horiz_interp.py +++ b/pyfms/py_horiz_interp/py_horiz_interp.py @@ -1,5 +1,4 @@ import ctypes -from typing import Any import numpy as np import numpy.typing as npt diff --git a/tests/py_diag_manager/test_diag_manager.py b/tests/py_diag_manager/test_diag_manager.py index 1ea870e..e0d8b7c 100644 --- a/tests/py_diag_manager/test_diag_manager.py +++ b/tests/py_diag_manager/test_diag_manager.py @@ -1,6 +1,6 @@ import numpy as np -from pyfms import pyFMS, pyFMS_diag_manager, pyFMS_mpp_domains +from pyfms import DiagManager, pyFMS, pyFMS_mpp_domains def test_send_data(): @@ -54,8 +54,8 @@ def test_send_data(): diag manager init """ - diag_manager = pyFMS_diag_manager(clibFMS=pyfms.cFMS) - diag_manager.diag_init(diag_model_subset=diag_manager.DIAG_ALL) + diag_manager = DiagManager(clibFMS=pyfms.cFMS) + diag_manager.init(diag_model_subset=diag_manager.DIAG_ALL) mpp_domains.set_current_domain(domain_id=domain_id) @@ -67,7 +67,7 @@ def test_send_data(): for i in range(NX): x[i] = i - id_x = diag_manager.diag_axis_init( + id_x = diag_manager.axis_init( name="x", axis_data=x, units="point_E", @@ -84,7 +84,7 @@ def test_send_data(): for j in range(NY): y[j] = j - id_y = diag_manager.diag_axis_init( + id_y = diag_manager.axis_init( name="y", axis_data=y, units="point_N", @@ -102,7 +102,7 @@ def test_send_data(): for k in range(NZ): z[k] = k - id_z = diag_manager.diag_axis_init( + id_z = diag_manager.axis_init( name="z", axis_data=z, units="point_Z", @@ -119,7 +119,7 @@ def test_send_data(): axes_3d = np.array([id_x, id_y, id_z, 0, 0], dtype=np.int32) range_3d = np.array([-1000.0, 1000.0], dtype=np.float32) - diag_manager.diag_set_field_init_time( + diag_manager.set_field_init_time( year=2, month=1, day=1, @@ -128,10 +128,9 @@ def test_send_data(): second=1, ) - id_var3 = diag_manager.register_diag_field_array( + id_var3 = diag_manager.register_field_array( module_name="atm_mod", field_name="var_3d", - datatype=np.float32, axes=axes_3d, long_name="Var in a lon/lat domain", units="muntin", @@ -139,7 +138,7 @@ def test_send_data(): range=range_3d, ) - diag_manager.diag_set_field_timestep( + diag_manager.set_field_timestep( diag_field_id=id_var3, dseconds=60 * 60, ddays=0, dticks=0 ) @@ -150,7 +149,7 @@ def test_send_data(): axes_2d = np.array([id_x, id_y, 0, 0, 0], dtype=np.int32) range_2d = np.array([-1000.0, 1000.0], dtype=np.float32) - diag_manager.diag_set_field_init_time( + diag_manager.set_field_init_time( year=2, month=1, day=1, @@ -159,10 +158,9 @@ def test_send_data(): second=1, ) - id_var2 = diag_manager.register_diag_field_array( + id_var2 = diag_manager.register_field_array( module_name="atm_mod", field_name="var_2d", - datatype=np.float32, axes=axes_2d, long_name="Var in a lon/lat domain", units="muntin", @@ -170,7 +168,7 @@ def test_send_data(): range=range_2d, ) - diag_manager.diag_set_field_timestep( + diag_manager.set_field_timestep( diag_field_id=id_var2, dseconds=60 * 60, ddays=0, @@ -181,7 +179,7 @@ def test_send_data(): diag set time end """ - diag_manager.diag_set_time_end( + diag_manager.set_time_end( year=2, month=1, day=2, @@ -195,7 +193,7 @@ def test_send_data(): send data """ - diag_manager.diag_send_data( + diag_manager.send_data( diag_field_id=id_var3, field_shape=var3_shape, field=var3, @@ -209,25 +207,25 @@ def test_send_data(): for k in range(NZ): var3[ijk] = -1.0 * var3[ijk] ijk += 1 - diag_manager.diag_advance_field_time(diag_field_id=id_var3) - diag_manager.diag_send_data( + diag_manager.advance_field_time(diag_field_id=id_var3) + diag_manager.send_data( diag_field_id=id_var3, field_shape=var3_shape, field=var3, ) - diag_manager.diag_send_complete(diag_field_id=id_var3) + diag_manager.send_complete(diag_field_id=id_var3) var2 = -var2 - diag_manager.diag_advance_field_time(diag_field_id=id_var2) - diag_manager.diag_send_data( + diag_manager.advance_field_time(diag_field_id=id_var2) + diag_manager.send_data( diag_field_id=id_var2, field_shape=var2_shape, field=var2, ) - diag_manager.diag_send_complete(diag_field_id=id_var2) + diag_manager.send_complete(diag_field_id=id_var2) - diag_manager.diag_end() + diag_manager.end() pyfms.pyfms_end() From ae81148ddf0acb450a44a57cf08a7d0b4e53b446 Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Mon, 31 Mar 2025 16:06:38 -0400 Subject: [PATCH 23/27] Using multidimensional array in test_diag_manager --- pyfms/py_diag_manager/pyfms_diag_manager.py | 47 +++++++++++---------- pyfms/pyfms_utils/data_handling.py | 2 +- tests/py_diag_manager/test_diag_manager.py | 39 +++++++---------- tests/py_mpp/test_define_domains.py | 4 +- 4 files changed, 44 insertions(+), 48 deletions(-) diff --git a/pyfms/py_diag_manager/pyfms_diag_manager.py b/pyfms/py_diag_manager/pyfms_diag_manager.py index 61608c0..ab76a4a 100644 --- a/pyfms/py_diag_manager/pyfms_diag_manager.py +++ b/pyfms/py_diag_manager/pyfms_diag_manager.py @@ -300,11 +300,12 @@ def register_field_array( self, module_name: str, field_name: str, + datatype, axes: NDArray = None, long_name: str = None, units: str = None, missing_value: int = None, - range: NDArray = None, + range_data: NDArray = None, mask_variant: bool = None, standard_name: str = None, verbose: bool = None, @@ -350,26 +351,26 @@ def register_field_array( realm_c, realm_t = set_Cchar(realm) multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) - if range.dtype == np.int32: + if datatype == np.int32: _cfms_register_diag_field_array_ = ( self.clibFMS.cFMS_register_diag_field_array_cint ) - range_p, range_t = setarray_Cint32(range) + range_data_p, range_data_t = setarray_Cint32(range_data) missing_value_c, missing_value_t = setscalar_Cint32(missing_value) - elif range.dtype == np.float64: + elif datatype == np.float64: _cfms_register_diag_field_array_ = ( self.clibFMS.cFMS_register_diag_field_array_cdouble ) - range_p, range_t = setarray_Cdouble(range) + range_data_p, range_data_t = setarray_Cdouble(range_data) missing_value_c, missing_value_t = setscalar_Cdouble(missing_value) - elif range.dtype == np.float32: + elif datatype == np.float32: _cfms_register_diag_field_array_ = ( self.clibFMS.cFMS_register_diag_field_array_cfloat ) - range_p, range_t = setarray_Cfloat(range) + range_data_p, range_data_t = setarray_Cfloat(range_data) missing_value_c, missing_value_t = setscalar_Cfloat(missing_value) else: - raise RuntimeError("register diag field array range datatype not supported") + raise RuntimeError("register diag field array range_data datatype not supported") _cfms_register_diag_field_array_.argtypes = [ module_name_t, @@ -378,7 +379,7 @@ def register_field_array( long_name_t, units_t, missing_value_t, - range_t, + range_data_t, mask_variant_t, standard_name_t, verbose_t, @@ -400,7 +401,7 @@ def register_field_array( long_name_c, units_c, missing_value_c, - range_p, + range_data_p, mask_variant_c, standard_name_c, verbose_c, @@ -418,11 +419,12 @@ def register_field_scalar( self, module_name: str, field_name: str, + datatype, long_name: str = None, units: str = None, standard_name: str = None, missing_value: int = None, - range: NDArray = None, + range_data: NDArray = None, do_not_log: bool = None, err_msg: str = None, area: int = None, @@ -456,26 +458,26 @@ def register_field_scalar( realm_c, realm_t = set_Cchar(realm) multiple_send_data_c, multiple_send_data_t = setscalar_Cbool(multiple_send_data) - if range.dtype == np.int32: + if datatype == np.int32: _cfms_register_diag_field_scalar_ = ( self.clibFMS.cFMS_register_diag_field_array_cint ) - range_p, range_t = setarray_Cint32(range) + range_data_p, range_data_t = setarray_Cint32(range_data) missing_value_c, missing_value_t = setscalar_Cint32(missing_value) - elif range.dtype == np.float64: + elif datatype == np.float64: _cfms_register_diag_field_scalar_ = ( self.clibFMS.cFMS_register_diag_field_array_cdouble ) - range_p, range_t = setarray_Cdouble(range) + range_data_p, range_data_t = setarray_Cdouble(range_data) missing_value_c, missing_value_t = setscalar_Cdouble(missing_value) - elif range.dtype == np.float32: + elif datatype == np.float32: _cfms_register_diag_field_scalar_ = ( self.clibFMS.cFMS_register_diag_field_array_cfloat ) - range_p, range_t = setarray_Cfloat(range) + range_data_p, range_data_t = setarray_Cfloat(range_data) missing_value_c, missing_value_t = setscalar_Cfloat(missing_value) else: - raise RuntimeError("register diag field array range datatype not supported") + raise RuntimeError("register diag field array range_data datatype not supported") _cfms_register_diag_field_scalar_.argtypes = [ module_name_t, @@ -484,7 +486,7 @@ def register_field_scalar( units_t, standard_name_t, missing_value_t, - range_t, + range_data_t, do_not_log_t, err_msg_t, area_t, @@ -501,7 +503,7 @@ def register_field_scalar( units_c, standard_name_c, missing_value_c, - range_p, + range_data_p, do_not_log_c, err_msg_c, area_c, @@ -513,7 +515,7 @@ def register_field_scalar( def send_data( self, diag_field_id: int, - field_shape: NDArray, + field_shape: list[int], field: NDArray, err_msg: str = None, ) -> bool: @@ -522,7 +524,8 @@ def send_data( err_msg = err_msg[:128] diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) - field_shape_p, field_shape_t = setarray_Cint32(field_shape) + field_shape_arr = np.array(field_shape, dtype=np.int32) + field_shape_p, field_shape_t = setarray_Cint32(field_shape_arr) err_msg_c, err_msg_t = set_Cchar(err_msg) if field_shape.size == 2: diff --git a/pyfms/pyfms_utils/data_handling.py b/pyfms/pyfms_utils/data_handling.py index 90f03d7..aac1ee5 100644 --- a/pyfms/pyfms_utils/data_handling.py +++ b/pyfms/pyfms_utils/data_handling.py @@ -59,7 +59,7 @@ def wrapper_func(py_scalar_obj: int, py_array_obj: npt.NDArray[int])-> int: def set_ndpointer(arg: npt.NDArray) -> np.ctypeslib.ndpointer: c_type = np.ctypeslib.as_ctypes_type(arg.dtype) return np.ctypeslib.ndpointer( - dtype=c_type, ndim=arg.ndim, shape=arg.shape, flags="FORTRAN" + dtype=c_type, ndim=arg.ndim, shape=arg.shape ) diff --git a/tests/py_diag_manager/test_diag_manager.py b/tests/py_diag_manager/test_diag_manager.py index e0d8b7c..482a456 100644 --- a/tests/py_diag_manager/test_diag_manager.py +++ b/tests/py_diag_manager/test_diag_manager.py @@ -13,23 +13,27 @@ def test_send_data(): calendar_type = 4 var2_shape = np.array([NX, NY], dtype=np.int32) - var2 = np.empty(shape=NX * NY, dtype=np.float32) + # var2 = np.empty(shape=NX * NY, dtype=np.float32) + var2 = np.empty(shape=(NX,NY), dtype=np.float32, order="F") var3_shape = np.array([NX, NY, NZ], dtype=np.int32) - var3 = np.empty(shape=NX * NY * NZ, dtype=np.float32) + # var3 = np.empty(shape=NX * NY * NZ, dtype=np.float32) + var3 = np.empty(shape=(NX, NY, NZ), dtype=np.float32, order="F") ijk = 0 for i in range(NX): for j in range(NY): for k in range(NZ): - var3[ijk] = i * 100 + j * 10 + k * 1 - ijk += 1 + # var3[ijk] = i * 100 + j * 10 + k * 1 + # ijk += 1 + var3[i][j][k] = i * 100 + j * 10 + k * 1 ij = 0 for i in range(NX): for j in range(NY): - var2[ij] = i * 10.0 + j * 1.0 - ij += 1 + # var2[ij] = i * 10.0 + j * 1.0 + # ij += 1 + var2[i][j] = i * 10.0 + j * 1.0 cfms_path = "./cFMS/libcFMS/.libs/libcFMS.so" @@ -64,9 +68,6 @@ def test_send_data(): """ x = np.arange(NX, dtype=np.float64) - for i in range(NX): - x[i] = i - id_x = diag_manager.axis_init( name="x", axis_data=x, @@ -81,9 +82,6 @@ def test_send_data(): """ y = np.arange(NY, dtype=np.float64) - for j in range(NY): - y[j] = j - id_y = diag_manager.axis_init( name="y", axis_data=y, @@ -99,9 +97,6 @@ def test_send_data(): z = np.arange(NZ, dtype=np.float64) - for k in range(NZ): - z[k] = k - id_z = diag_manager.axis_init( name="z", axis_data=z, @@ -131,11 +126,12 @@ def test_send_data(): id_var3 = diag_manager.register_field_array( module_name="atm_mod", field_name="var_3d", + datatype=np.float32, axes=axes_3d, long_name="Var in a lon/lat domain", units="muntin", missing_value=-99.99, - range=range_3d, + range_data=range_3d, ) diag_manager.set_field_timestep( @@ -161,11 +157,12 @@ def test_send_data(): id_var2 = diag_manager.register_field_array( module_name="atm_mod", field_name="var_2d", + datatype=np.float32, axes=axes_2d, long_name="Var in a lon/lat domain", units="muntin", missing_value=-99.99, - range=range_2d, + range_data=range_2d, ) diag_manager.set_field_timestep( @@ -201,12 +198,8 @@ def test_send_data(): ntime = 24 for itime in range(ntime): - ijk = 0 - for i in range(NX): - for j in range(NY): - for k in range(NZ): - var3[ijk] = -1.0 * var3[ijk] - ijk += 1 + var3 = -var3 + diag_manager.advance_field_time(diag_field_id=id_var3) diag_manager.send_data( diag_field_id=id_var3, diff --git a/tests/py_mpp/test_define_domains.py b/tests/py_mpp/test_define_domains.py index da03782..99d75ec 100644 --- a/tests/py_mpp/test_define_domains.py +++ b/tests/py_mpp/test_define_domains.py @@ -84,7 +84,7 @@ def test_define_domains(): pyfms.set_pelist_npes(coarse_npes) mpp.set_current_pelist(coarse_pelist) name = "test coarse domain" - maskmap = np.full(shape=(2, 4), fill_value=True, dtype=np.bool_, order="F") + maskmap = np.full(shape=(2, 4), fill_value=True, dtype=np.bool_) xextent = np.zeros(shape=2, dtype=np.int32, order="C") yextent = np.zeros(shape=2, dtype=np.int32, order="C") @@ -209,4 +209,4 @@ def test_remove_input_nml(): if __name__ == "__main__": - test_define_domains() + test_define_domains() \ No newline at end of file From 5653003969facc0148496767a47c02f0a49a4be7 Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Tue, 1 Apr 2025 11:52:25 -0400 Subject: [PATCH 24/27] Removing optional err_msg out from diag_manager functions --- pyfms/py_diag_manager/pyfms_diag_manager.py | 39 +++++++-------------- tests/py_diag_manager/test_diag_manager.py | 11 ++---- 2 files changed, 16 insertions(+), 34 deletions(-) diff --git a/pyfms/py_diag_manager/pyfms_diag_manager.py b/pyfms/py_diag_manager/pyfms_diag_manager.py index ab76a4a..722d607 100644 --- a/pyfms/py_diag_manager/pyfms_diag_manager.py +++ b/pyfms/py_diag_manager/pyfms_diag_manager.py @@ -17,6 +17,7 @@ class DiagManager: + # To be class var after refactor, accessed directly from cFMS DIAG_ALL = 2 def __init__(self, clibFMS: ctypes.CDLL = None): @@ -34,7 +35,7 @@ def init( diag_model_subset: int = None, time_init: NDArray = None, ) -> str: - err_msg = "" + err_msg = " " _cfms_diag_init = self.clibFMS.cFMS_diag_init @@ -56,11 +57,9 @@ def init( def send_complete( self, diag_field_id: int, - err_msg: str = None, ) -> str: - if err_msg is not None: - err_msg = err_msg[:128] + err_msg = " " _cfms_diag_send_complete = self.clibFMS.cFMS_diag_send_complete @@ -72,10 +71,7 @@ def send_complete( _cfms_diag_send_complete(diag_field_id_c, err_msg_c) - if err_msg is not None: - return err_msg_c.value.decode("utf-8") - else: - return err_msg + return err_msg_c.value.decode("utf-8") def set_field_init_time( self, @@ -88,7 +84,7 @@ def set_field_init_time( tick: int = None, ) -> str: - err_msg = "" + err_msg = " " _cfms_diag_set_field_init_time = self.clibFMS.cFMS_diag_set_field_init_time @@ -125,11 +121,9 @@ def set_field_timestep( dseconds: int, ddays: int = None, dticks: int = None, - err_msg: str = None, ) -> str: - if err_msg is not None: - err_msg = err_msg[:128] + err_msg = " " _cfms_diag_set_field_timestep = self.clibFMS.cFMS_diag_set_field_timestep @@ -152,10 +146,7 @@ def set_field_timestep( diag_field_id_c, dseconds_c, ddays_c, dticks_c, err_msg_c ) - if err_msg is not None: - return err_msg_c.value.decode("utf-8") - else: - return err_msg + return err_msg_c.value.decode("utf-8") def advance_field_time( self, @@ -310,7 +301,6 @@ def register_field_array( standard_name: str = None, verbose: bool = None, do_not_log: bool = None, - err_msg: str = None, interp_method: str = None, tile_count: int = None, area: int = None, @@ -318,7 +308,9 @@ def register_field_array( realm: str = None, multiple_send_data: bool = None, ) -> int: - + + err_msg = " " + module_name = module_name[:64] field_name = field_name[:64] if long_name is not None: @@ -327,8 +319,6 @@ def register_field_array( units = units[:64] if standard_name is not None: standard_name = standard_name[:64] - if err_msg is not None: - err_msg = err_msg[:64] if interp_method is not None: interp_method = interp_method[:64] if realm is not None: @@ -426,12 +416,13 @@ def register_field_scalar( missing_value: int = None, range_data: NDArray = None, do_not_log: bool = None, - err_msg: str = None, area: int = None, volume: int = None, realm: str = None, multiple_send_data: bool = None, ) -> int: + + err_msg = " " module_name = module_name[:64] field_name = field_name[:64] @@ -441,8 +432,6 @@ def register_field_scalar( units = units[:64] if standard_name is not None: standard_name = standard_name[:64] - if err_msg is not None: - err_msg = err_msg[:64] if realm is not None: realm = realm[:64] @@ -517,11 +506,9 @@ def send_data( diag_field_id: int, field_shape: list[int], field: NDArray, - err_msg: str = None, ) -> bool: - if err_msg is not None: - err_msg = err_msg[:128] + err_msg = " " diag_field_id_c, diag_field_id_t = setscalar_Cint32(diag_field_id) field_shape_arr = np.array(field_shape, dtype=np.int32) diff --git a/tests/py_diag_manager/test_diag_manager.py b/tests/py_diag_manager/test_diag_manager.py index 482a456..b69022e 100644 --- a/tests/py_diag_manager/test_diag_manager.py +++ b/tests/py_diag_manager/test_diag_manager.py @@ -1,5 +1,7 @@ import numpy as np +import pdb + from pyfms import DiagManager, pyFMS, pyFMS_mpp_domains @@ -13,26 +15,18 @@ def test_send_data(): calendar_type = 4 var2_shape = np.array([NX, NY], dtype=np.int32) - # var2 = np.empty(shape=NX * NY, dtype=np.float32) var2 = np.empty(shape=(NX,NY), dtype=np.float32, order="F") var3_shape = np.array([NX, NY, NZ], dtype=np.int32) - # var3 = np.empty(shape=NX * NY * NZ, dtype=np.float32) var3 = np.empty(shape=(NX, NY, NZ), dtype=np.float32, order="F") - ijk = 0 for i in range(NX): for j in range(NY): for k in range(NZ): - # var3[ijk] = i * 100 + j * 10 + k * 1 - # ijk += 1 var3[i][j][k] = i * 100 + j * 10 + k * 1 - ij = 0 for i in range(NX): for j in range(NY): - # var2[ij] = i * 10.0 + j * 1.0 - # ij += 1 var2[i][j] = i * 10.0 + j * 1.0 cfms_path = "./cFMS/libcFMS/.libs/libcFMS.so" @@ -198,6 +192,7 @@ def test_send_data(): ntime = 24 for itime in range(ntime): + var3 = -var3 diag_manager.advance_field_time(diag_field_id=id_var3) From ee744ea12e08bd7caac58c6d78c71bb958e8c9ec Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Tue, 1 Apr 2025 13:48:30 -0400 Subject: [PATCH 25/27] register_field_array axes as list now with appended 0's --- pyfms/py_diag_manager/pyfms_diag_manager.py | 12 ++++++++++-- tests/py_diag_manager/test_diag_manager.py | 6 ++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/pyfms/py_diag_manager/pyfms_diag_manager.py b/pyfms/py_diag_manager/pyfms_diag_manager.py index 722d607..60ea417 100644 --- a/pyfms/py_diag_manager/pyfms_diag_manager.py +++ b/pyfms/py_diag_manager/pyfms_diag_manager.py @@ -292,7 +292,7 @@ def register_field_array( module_name: str, field_name: str, datatype, - axes: NDArray = None, + axes: list[int] = None, long_name: str = None, units: str = None, missing_value: int = None, @@ -324,9 +324,17 @@ def register_field_array( if realm is not None: realm = realm[:64] + if axes is not None: + if len(axes) < 5: + for i in range(5-len(axes)): + axes.append(0) + axes_arr = np.array(axes, dtype=np.int32) + else: + axes_arr = None + module_name_c, module_name_t = set_Cchar(module_name) field_name_c, field_name_t = set_Cchar(field_name) - axes_p, axes_t = setarray_Cint32(axes) + axes_p, axes_t = setarray_Cint32(axes_arr) long_name_c, long_name_t = set_Cchar(long_name) units_c, units_t = set_Cchar(units) mask_variant_c, mask_variant_t = setscalar_Cbool(mask_variant) diff --git a/tests/py_diag_manager/test_diag_manager.py b/tests/py_diag_manager/test_diag_manager.py index b69022e..4eafba1 100644 --- a/tests/py_diag_manager/test_diag_manager.py +++ b/tests/py_diag_manager/test_diag_manager.py @@ -1,7 +1,5 @@ import numpy as np -import pdb - from pyfms import DiagManager, pyFMS, pyFMS_mpp_domains @@ -105,7 +103,7 @@ def test_send_data(): register diag field var3 """ - axes_3d = np.array([id_x, id_y, id_z, 0, 0], dtype=np.int32) + axes_3d = [id_x, id_y, id_z] range_3d = np.array([-1000.0, 1000.0], dtype=np.float32) diag_manager.set_field_init_time( @@ -136,7 +134,7 @@ def test_send_data(): register diag_field var 2 """ - axes_2d = np.array([id_x, id_y, 0, 0, 0], dtype=np.int32) + axes_2d = [id_x, id_y] range_2d = np.array([-1000.0, 1000.0], dtype=np.float32) diag_manager.set_field_init_time( From dcd3494e7d550072f324dde8de642e6c49a0ea8b Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Tue, 1 Apr 2025 13:56:29 -0400 Subject: [PATCH 26/27] Linting --- pyfms/py_diag_manager/pyfms_diag_manager.py | 24 ++++++++++++--------- pyfms/pyfms_utils/data_handling.py | 4 +--- tests/py_diag_manager/test_diag_manager.py | 8 +++---- tests/py_mpp/test_define_domains.py | 2 +- 4 files changed, 20 insertions(+), 18 deletions(-) diff --git a/pyfms/py_diag_manager/pyfms_diag_manager.py b/pyfms/py_diag_manager/pyfms_diag_manager.py index 60ea417..14ce772 100644 --- a/pyfms/py_diag_manager/pyfms_diag_manager.py +++ b/pyfms/py_diag_manager/pyfms_diag_manager.py @@ -308,9 +308,9 @@ def register_field_array( realm: str = None, multiple_send_data: bool = None, ) -> int: - + err_msg = " " - + module_name = module_name[:64] field_name = field_name[:64] if long_name is not None: @@ -326,7 +326,7 @@ def register_field_array( if axes is not None: if len(axes) < 5: - for i in range(5-len(axes)): + for i in range(5 - len(axes)): axes.append(0) axes_arr = np.array(axes, dtype=np.int32) else: @@ -368,7 +368,9 @@ def register_field_array( range_data_p, range_data_t = setarray_Cfloat(range_data) missing_value_c, missing_value_t = setscalar_Cfloat(missing_value) else: - raise RuntimeError("register diag field array range_data datatype not supported") + raise RuntimeError( + "register diag field array range_data datatype not supported" + ) _cfms_register_diag_field_array_.argtypes = [ module_name_t, @@ -429,7 +431,7 @@ def register_field_scalar( realm: str = None, multiple_send_data: bool = None, ) -> int: - + err_msg = " " module_name = module_name[:64] @@ -474,7 +476,9 @@ def register_field_scalar( range_data_p, range_data_t = setarray_Cfloat(range_data) missing_value_c, missing_value_t = setscalar_Cfloat(missing_value) else: - raise RuntimeError("register diag field array range_data datatype not supported") + raise RuntimeError( + "register diag field array range_data datatype not supported" + ) _cfms_register_diag_field_scalar_.argtypes = [ module_name_t, @@ -523,7 +527,7 @@ def send_data( field_shape_p, field_shape_t = setarray_Cint32(field_shape_arr) err_msg_c, err_msg_t = set_Cchar(err_msg) - if field_shape.size == 2: + if field_shape_arr.size == 2: if field.dtype == np.int32: _cfms_diag_send_data_ = self.clibFMS.cFMS_diag_send_data_2d_cint field_p, field_t = setarray_Cint32(field) @@ -535,7 +539,7 @@ def send_data( field_p, field_t = setarray_Cfloat(field) else: raise RuntimeError(f"diag_send_data {field.dtype} unsupported") - elif field_shape.size == 3: + elif field_shape_arr.size == 3: if field.dtype == np.int32: _cfms_diag_send_data_ = self.clibFMS.cFMS_diag_send_data_3d_cint field_p, field_t = setarray_Cint32(field) @@ -547,7 +551,7 @@ def send_data( field_p, field_t = setarray_Cfloat(field) else: raise RuntimeError(f"diag_send_data {field.dtype} unsupported") - elif field_shape.size == 4: + elif field_shape_arr.size == 4: if field.dtype == np.int32: _cfms_diag_send_data_ = self.clibFMS.cFMS_diag_send_data_4d_cint field_p, field_t = setarray_Cint32(field) @@ -559,7 +563,7 @@ def send_data( field_p, field_t = setarray_Cfloat(field) else: raise RuntimeError(f"diag_send_data {field.dtype} unsupported") - elif field_shape.size == 5: + elif field_shape_arr.size == 5: if field.dtype == np.int32: _cfms_diag_send_data_ = self.clibFMS.cFMS_diag_send_data_5d_cint field_p, field_t = setarray_Cint32(field) diff --git a/pyfms/pyfms_utils/data_handling.py b/pyfms/pyfms_utils/data_handling.py index aac1ee5..0d9a68c 100644 --- a/pyfms/pyfms_utils/data_handling.py +++ b/pyfms/pyfms_utils/data_handling.py @@ -58,9 +58,7 @@ def wrapper_func(py_scalar_obj: int, py_array_obj: npt.NDArray[int])-> int: def set_ndpointer(arg: npt.NDArray) -> np.ctypeslib.ndpointer: c_type = np.ctypeslib.as_ctypes_type(arg.dtype) - return np.ctypeslib.ndpointer( - dtype=c_type, ndim=arg.ndim, shape=arg.shape - ) + return np.ctypeslib.ndpointer(dtype=c_type, ndim=arg.ndim, shape=arg.shape) def setarray_Cbool( diff --git a/tests/py_diag_manager/test_diag_manager.py b/tests/py_diag_manager/test_diag_manager.py index 4eafba1..ce65291 100644 --- a/tests/py_diag_manager/test_diag_manager.py +++ b/tests/py_diag_manager/test_diag_manager.py @@ -12,11 +12,11 @@ def test_send_data(): domain_id = 0 calendar_type = 4 - var2_shape = np.array([NX, NY], dtype=np.int32) - var2 = np.empty(shape=(NX,NY), dtype=np.float32, order="F") + var2_shape = [NX, NY] + var2 = np.empty(shape=(NX, NY), dtype=np.float32) - var3_shape = np.array([NX, NY, NZ], dtype=np.int32) - var3 = np.empty(shape=(NX, NY, NZ), dtype=np.float32, order="F") + var3_shape = [NX, NY, NZ] + var3 = np.empty(shape=(NX, NY, NZ), dtype=np.float32) for i in range(NX): for j in range(NY): diff --git a/tests/py_mpp/test_define_domains.py b/tests/py_mpp/test_define_domains.py index 99d75ec..08c429f 100644 --- a/tests/py_mpp/test_define_domains.py +++ b/tests/py_mpp/test_define_domains.py @@ -209,4 +209,4 @@ def test_remove_input_nml(): if __name__ == "__main__": - test_define_domains() \ No newline at end of file + test_define_domains() From d28da3076e818134d3f00e5b2960521b1d91c4e1 Mon Sep 17 00:00:00 2001 From: Frank Malatino Date: Tue, 1 Apr 2025 16:11:00 -0400 Subject: [PATCH 27/27] More linting --- pyfms/py_diag_manager/pyfms_diag_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyfms/py_diag_manager/pyfms_diag_manager.py b/pyfms/py_diag_manager/pyfms_diag_manager.py index 14ce772..16449ac 100644 --- a/pyfms/py_diag_manager/pyfms_diag_manager.py +++ b/pyfms/py_diag_manager/pyfms_diag_manager.py @@ -577,7 +577,7 @@ def send_data( raise RuntimeError(f"diag_send_data {field.dtype} unsupported") else: raise RuntimeError( - f"diag_send_data {field_shape.size} dimensions unsupported" + f"diag_send_data {field_shape_arr.size} dimensions unsupported" ) _cfms_diag_send_data_.argtypes = [