Skip to content
24 changes: 12 additions & 12 deletions pyfms/__init__.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
from .py_data_override.py_data_override import pyDataOverride
from .py_diag_manager.pyfms_diag_manager import DiagManager
from .cfms import cFMS
from .py_data_override.py_data_override import data_override
from .py_diag_manager.py_diag_manager import diag_manager
from .pyfms import fms
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
from .py_mpp.py_mpp_domains import (
pyDomain,
pyDomainData,
pyFMS_mpp_domains,
pyNestDomain,
)
from .pyfms import pyFMS
from .py_horiz_interp.py_horiz_interp import horiz_interp
from .py_mpp.py_mpp import mpp
from .py_mpp.py_mpp_domains import mpp_domains
from .pyfms_utils import data_handling
from .pyfms_utils.grid_utils import GridUtils
from .pyfms_utils.grid_utils import grid_utils



cFMS.init()
34 changes: 34 additions & 0 deletions pyfms/cfms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import ctypes
import os
import pyfms

class cFMS():

__libpath: str = os.path.dirname(__file__) + "/../cFMS/cLIBFMS/lib/libcFMS.so"
__lib: ctypes.CDLL = ctypes.CDLL(__libpath)

@classmethod
def init(cls):
pyfms.data_override.setlib(cls.libpath, cls.lib)
pyfms.fms.setlib(cls.libpath, cls.lib)
pyfms.diag_manager.setlib(cls.libpath, cls.lib)
pyfms.grid_utils.setlib(cls.libpath, cls.lib)
pyfms.horiz_interp.setlib(cls.libpath, cls.lib)
pyfms.mpp.setlib(cls.libpath, cls.lib)
pyfms.mpp_domains.setlib(cls.libpath, cls.lib)

@classmethod
def changelib(cls, libpath):
cls.__libpath = libpath
cls.__lib = ctypes.CDLL(cls.__libpath)
cls.init()

@classmethod
@property
def lib(cls):
return cls.__lib

@classmethod
@property
def libpath(cls):
return cls.__libpath
48 changes: 34 additions & 14 deletions pyfms/py_data_override/py_data_override.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,31 @@
import numpy as np
import numpy.typing as npt

import pyfms

class pyDataOverride:
class data_override:

def __init__(self, cFMS: ctypes.CDLL = None):
self.cfms = cFMS
__libpath: str = None
__lib: ctypes.CDLL = None

@classmethod
def setlib(cls, libpath, lib):
cls.__libpath = libpath
cls.__lib = lib

@classmethod
@property
def lib(cls):
return cls.__lib

@classmethod
@property
def libpath(cls):
return cls.__libpath

@classmethod
def init(
self,
cls,
atm_domain_id: int = None,
ocn_domain_id: int = None,
ice_domain_id: int = None,
Expand All @@ -20,7 +37,7 @@ def init(
mode: int = None,
):

_data_override_init = self.cfms.cFMS_data_override_init
_data_override_init = cls.lib.cFMS_data_override_init

atm_domain_id_t = ctypes.c_int
ocn_domain_id_t = ctypes.c_int
Expand Down Expand Up @@ -67,8 +84,9 @@ def init(
mode_c,
)

@classmethod
def set_time(
self,
cls,
year: int = None,
month: int = None,
day: int = None,
Expand All @@ -78,7 +96,7 @@ def set_time(
tick: int = None,
):

_data_override_set_time = self.cfms.cFMS_data_override_set_time
_data_override_set_time = cls.lib.cFMS_data_override_set_time

year_t = ctypes.c_int
month_t = ctypes.c_int
Expand Down Expand Up @@ -114,15 +132,16 @@ def set_time(
year_c, month_c, day_c, hour_c, minute_c, second_c, tick_c, err_msg_c
)

@classmethod
def override_scalar(
self,
cls,
gridname: str,
fieldname: str,
data_type: Any,
data_index: int = None,
) -> np.float32 | np.float64:

_data_override_scalar = self.cfms.cFMS_data_override_0d_cdouble
_data_override_scalar = cls.lib.cFMS_data_override_0d_cdouble
gridname_t = ctypes.c_char_p
fieldname_t = ctypes.c_char_p
data_t = ctypes.c_float if data_type is np.float32 else ctypes.c_double
Expand All @@ -149,8 +168,9 @@ def override_scalar(
# TODO: add check for override
return data_c.value

@classmethod
def override(
self,
cls,
gridname: str,
fieldname: str,
data_shape: list[int],
Expand All @@ -165,14 +185,14 @@ def override(

if data_type is np.float32:
if nshape == 2:
_data_override = self.cfms.cFMS_data_override_2d_cfloat
_data_override = cls.lib.cFMS_data_override_2d_cfloat
if nshape == 3:
_data_override = self.cfms.cFMS_data_override_3d_cfloat
_data_override = cls.lib.cFMS_data_override_3d_cfloat
elif data_type is np.float64:
if nshape == 2:
_data_override = self.cfms.cFMS_data_override_2d_cdouble
_data_override = cls.lib.cFMS_data_override_2d_cdouble
if nshape == 3:
_data_override = self.cfms.cFMS_data_override_3d_cdouble
_data_override = cls.lib.cFMS_data_override_3d_cdouble
else:
# add cFMS_end
raise RuntimeError("Data_override, datatype not supported")
Expand Down
Loading
Loading