Skip to content

Commit

Permalink
Update g2clib.pyx
Browse files Browse the repository at this point in the history
Refactored grib2_addfield() and some associated minor changes to
_grib2io.py
  • Loading branch information
EricEngle-NOAA committed Feb 17, 2025
1 parent d6ba145 commit 3a89270
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 49 deletions.
75 changes: 34 additions & 41 deletions src/ext/g2clib.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -649,9 +649,15 @@ def grib2_addgrid(gribmsg,
return gribmsg, iret


def grib2_addfield(gribmsg,pdsnum,object pdstmpl,object coordlist,
drsnum,object drstmpl,object field,
ibitmap,object bitmap):
def grib2_addfield(gribmsg,
int pdsnum,
cnp.ndarray[cnp.int64_t, ndim=1] pdstmpl,
cnp.ndarray[cnp.float32_t, ndim=1] coordlist,
int drsnum,
cnp.ndarray[cnp.int64_t, ndim=1] drstmpl,
cnp.ndarray[cnp.float32_t, ndim=1] field,
int ibitmap,
cnp.ndarray[cnp.int64_t, ndim=1] bitmap):
"""
Packs up Sections 4 through 7 for a given field
and adds them to a GRIB2 message. They are Product Definition Section,
Expand Down Expand Up @@ -721,48 +727,35 @@ def grib2_addfield(gribmsg,pdsnum,object pdstmpl,object coordlist,
using DRT 5.51.
-10 = Error packing data field.
"""
cdef g2int iret,ipdsnum,numcoord,idrsnum
cdef g2int *ipdstmpl
cdef g2int *idrstmpl
cdef g2float *fld
cdef g2float *fcoordlist
cdef g2int *bmap
cdef g2int ngrdpts, ibmap
cdef void *pdtmpldat
cdef void *drtmpldat
cdef void *coordlistdat
cdef void *fielddat
cdef void *bitmapdat
cdef Py_ssize_t buflen
cdef unsigned char *cgrib
ipdsnum = <g2int>PyInt_AsLong(pdsnum)
PyObject_AsReadBuffer(pdstmpl, &pdtmpldat, &buflen)
ipdstmpl = <g2int *>pdtmpldat
idrsnum = <g2int>PyInt_AsLong(drsnum)
PyObject_AsReadBuffer(drstmpl, &drtmpldat, &buflen)
idrstmpl = <g2int *>drtmpldat
if coordlist is not None:
PyObject_AsReadBuffer(coordlist, &coordlistdat, &buflen)
fcoordlist = <g2float *>coordlistdat
numcoord = len(coordlist)
else:
fcoordlist = NULL
numcoord = 0
PyObject_AsReadBuffer(field, &fielddat, &buflen)
fld = <g2float *>fielddat
ibmap = <g2int>PyInt_AsLong(ibitmap)
ngrdpts = len(field)
if ibitmap == 0 or ibitmap == 254:
PyObject_AsReadBuffer(bitmap, &bitmapdat, &buflen)
bmap = <g2int *>bitmapdat
else:
bmap = NULL
gribmsg = gribmsg + 4*(len(drstmpl)+ngrdpts+4)*b" "
cdef g2int iret #,ipdsnum,numcoord,idrsnum
cdef g2int[:] pdstmpl_view = pdstmpl
cdef float[:] coordlist_view = coordlist
cdef g2int[:] drstmpl_view = drstmpl
cdef float[:] field_view = field
cdef g2int[:] bitmap_view = bitmap

iret = 0
gribmsg = gribmsg + 4*(len(drstmpl)+len(field)+4)*b" "
cgrib = <unsigned char *>PyBytes_AsString(gribmsg)
iret = g2_addfield(cgrib,ipdsnum,ipdstmpl,fcoordlist,numcoord,idrsnum,idrstmpl,fld,ngrdpts,ibmap,bmap)

iret = g2_addfield(
cgrib,
pdsnum,
<g2int *>&pdstmpl_view[0],
<float *>&coordlist_view[0],
<g2int>len(coordlist),
drsnum,
<g2int *>&drstmpl_view[0],
<float *>&field_view[0],
<g2int>len(field),
ibitmap,
<g2int *>&bitmap_view[0],
)
if iret < 0:
msg = "error in grib2_addfield, error code = %i" % iret
msg = f"Error in grib2_addfield, error code = {iret}"
raise RuntimeError(msg)

gribmsg = PyBytes_FromStringAndSize(<char *>cgrib, iret)
return gribmsg, iret

Expand Down
10 changes: 2 additions & 8 deletions src/grib2io/_grib2io.py
Original file line number Diff line number Diff line change
Expand Up @@ -731,7 +731,7 @@ class _Grib2Message:
def __post_init__(self):
"""Set some attributes after init."""
self._auto_nans = _AUTO_NANS
self._coordlist = None
self._coordlist = np.zeros((0), dtype=np.float32)
self._data = None
self._deflist = np.zeros((0), dtype=np.int64)
self._msgnum = -1
Expand Down Expand Up @@ -968,12 +968,6 @@ def pack(self):
else:
bmap = None

# Prepare optional coordinate list
if self._coordlist is not None:
crdlist = np.array(self._coordlist,'f')
else:
crdlist = None

# Prepare data for packing if nans are present
fld = np.ravel(fld)
if bitmapflag in {0,254}:
Expand All @@ -991,7 +985,7 @@ def pack(self):
# Add sections 4, 5, 6, and 7.
self._msg,self._pos = g2clib.grib2_addfield(self._msg,self.pdtn,
self.productDefinitionTemplate,
crdlist,
self._coordlist,
self.drtn,
self.dataRepresentationTemplate,
fld,
Expand Down

0 comments on commit 3a89270

Please sign in to comment.