<html><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; ">Dear All,&nbsp;<div>The original author of this gribmap patch is no longer receiving email as this address (he's also been unsubscribed from the list due to excessive bounces).&nbsp;Can anyone provide me with COSMO data samples that exploit the TU=13 and TU=14 features (for 15min and 30min output) so I can test this patch?&nbsp;</div><div>--Jennifer</div><div><br></div><div><br></div><div><br><div><div>On Mar 29, 2010, at 8:20 AM, Gomez Breogan wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">Dear GrADS users and developers:<br><br>My name is Breogan &nbsp;Gomez and I am working for the German Weather Service (DWD) in the data assimilation department. DWD's COSMO model (also used by other National Weather Services) has a peculiar time unit specification in their Grib output files. That are TimeUnit=13 and TimeUnit=14 to represent 15min output and 30min output. This is not WMO standard but is generally used by the German Weather Service and all the Centers within the COSMO community (<a href="http://www.cosmo-model.org/">http://www.cosmo-model.org/</a>).<br><br>GrADS is perfectly able to read COSMO model output (using "gribmap") when the TU is speciffied in any WMO standard unit, but when TU-13 or TU-14 are used he is not able to find the correct time records in the grib file.<br><br>I recently I have performed a minor modification to "gribmap" code (at "gagmap.c") to include the support for this TU-13 and TU-14. This modification is fully compatible with other TU and &nbsp;does not introduce any limitation in the application. I was was wondering if could be possible to introduce this modification in the standard GrADS release. This would help to expand GrADS use to a bigger set of scientists that are working with this high frecuency COSMO simulations.<br><br>Attached I include the modified gagmap.c source file (version: 2.0.a7.1 has been used for this purpose). Just search for "DWD", only four lines had been added to the original file.<br><br>I hope you find this useful,<br><br>All the best,<br><br>Breogan Gomez<br><br>Ps: Similar improvements have been performed on "wgrib" and "grib2ctl.pl" applications and had been sent to Wesley Ebisuzaki, we are waiting for reply.<br><br><br>/* &nbsp;Copyright (C) 1988-2008 by Brian Doty and the <br> &nbsp;&nbsp;&nbsp;Institute of Global Environment and Society (IGES). &nbsp;<br> &nbsp;&nbsp;&nbsp;See file COPYRIGHT for more information. &nbsp;&nbsp;*/<br><br>/* &nbsp;Values output into the grib1 map file:<br> &nbsp;&nbsp;&nbsp;&nbsp;Header:<br> &nbsp;&nbsp;&nbsp;&nbsp;hipnt info: 0 - version number (1)<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 - number of times in file<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2 - number of records per time<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3 - Grid type<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;255 - user defined grid. &nbsp;descriptor<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;describes grid exactly; one record<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;per grid.<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;29 - Predefined grid set 29 and 30.<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Two records per grid.<br> &nbsp;&nbsp;&nbsp;&nbsp;hfpnt info: &nbsp;None<br> &nbsp;&nbsp;&nbsp;&nbsp;Info:<br> &nbsp;&nbsp;&nbsp;&nbsp;intpnt info (for each mapped grib record) :<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0 - position of start of data in file<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 - position of start of bit map in file<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2 - number of bits per data element<br> &nbsp;&nbsp;&nbsp;&nbsp;fltpnt info :<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0 - decimal scale factor for this record<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1 - binary scale factor<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2 - reference value<br>*/<br><br>#ifdef HAVE_CONFIG_H<br>#include "config.h"<br><br>#ifdef HAVE_MALLOC_H<br>#include &lt;malloc.h&gt;<br>#endif<br>#else /* undef HAVE_CONFIG_H */<br>#include &lt;malloc.h&gt;<br>#endif /* HAVE_CONFIG_H */<br><br>#include &lt;errno.h&gt;<br>#include &lt;limits.h&gt;<br>#include &lt;math.h&gt;<br>#include &lt;stdio.h&gt;<br>#include &lt;stdlib.h&gt;<br>#include &lt;stddef.h&gt;<br>#include &lt;string.h&gt;<br>#include &lt;unistd.h&gt;<br>#include &lt;sys/types.h&gt;<br>#include "grads.h"<br>#include "gagmap.h"<br>#if GRIB2<br>#include "grib2.h"<br>#endif<br><br><br>/* global variables */<br>extern struct gamfcmn mfcmn;<br>struct dt rtime; &nbsp;&nbsp;/* time based on input map */<br>struct dt ftime; &nbsp;&nbsp;/* time based on dd file */<br>static off_t flen;<br>gaint ng1elems=3;<br>gaint ng2elems=2;<br><br>/* &nbsp;Routine to scan a grib1 or grib2 file and output an index (map) file. */<br><br>gaint gribmap (void) {<br><br>#if GRIB2<br> unsigned char *cgrib=NULL;<br> g2int &nbsp;listsec0[3],listsec1[13],numlocal,numfields,n;<br> g2int &nbsp;unpack,expand,lskip,lgrib,iseek;<br> gribfield &nbsp;*gfld;<br> char *ptr;<br> size_t &nbsp;lengrib;<br> struct gag2indx *g2indx;<br>#endif<br> char *ch=NULL;<br> gaint ret,ierr,flag,rcgr,record;<br> gaint rc,i,e,tmin=0,tmax=0,told,tcur,fnum,didmatch=0;<br> gaint sp,ioff,eoff,it,write_map;<br> struct gafile *pfi;<br> struct dt dtim,dtimi;<br> struct gaens *ens;<br><br>#if GRIB2<br> unpack=0;<br> expand=0;<br>#endif<br> mfile=NULL;<br> write_map=1;<br><br> /* Get the descriptor file name */<br> if (ifile==NULL) {<br> &nbsp;&nbsp;printf ("\n");<br> &nbsp;&nbsp;cnt = nxtcmd (cmd,"Enter name of Data Descriptor file: ");<br> &nbsp;&nbsp;if (cnt==0) return(1);<br> &nbsp;&nbsp;getwrd(crec,cmd,250);<br> &nbsp;&nbsp;ifile = crec;<br> }<br><br> /* Allocate memory for gafile structure */<br> pfi = getpfi();<br> if (pfi==NULL) {<br> &nbsp;&nbsp;printf ("gribmap error: unable to allocate memory for gafile structure\n");<br> &nbsp;&nbsp;return(1);<br> }<br><br> /* Parse the descriptor file */<br> rc = gaddes (ifile, pfi, 0);<br> if (rc) return(1);<br><br> /* Check index flags */<br> if (pfi-&gt;idxflg!=1 &amp;&amp; pfi-&gt;idxflg!=2) {<br> &nbsp;&nbsp;printf ("gribmap error: data descriptor file is not for GRIB data\n");<br> &nbsp;&nbsp;return(1);<br> } <br><br> /* * GRIB1 * */<br> else if (pfi-&gt;idxflg==1) {<br><br> &nbsp;&nbsp;/* Allocate memory for gaindx structure */<br> &nbsp;&nbsp;pindx = (struct gaindx *)galloc(sizeof(struct gaindx),"pindxgm");<br> &nbsp;&nbsp;if (pindx==NULL) {<br> &nbsp;&nbsp;&nbsp;&nbsp;printf ("grib1map error: unable to allocate memory for pindx\n");<br> &nbsp;&nbsp;&nbsp;&nbsp;return(1);<br> &nbsp;&nbsp;}<br><br> &nbsp;&nbsp;/* Save the initial time from the descriptor file for the tau0 option and the map file */<br> &nbsp;&nbsp;btimdd.yr = *(pfi-&gt;abvals[3]);<br> &nbsp;&nbsp;btimdd.mo = *(pfi-&gt;abvals[3]+1);<br> &nbsp;&nbsp;btimdd.dy = *(pfi-&gt;abvals[3]+2);<br> &nbsp;&nbsp;btimdd.hr = *(pfi-&gt;abvals[3]+3);<br> &nbsp;&nbsp;btimdd.mn = *(pfi-&gt;abvals[3]+4);<br> &nbsp;&nbsp;if (no_min) btimdd.mn = 0;<br><br> &nbsp;&nbsp;/* Set up for this grid type */<br> &nbsp;&nbsp;if (pfi-&gt;grbgrd&lt;-900 || pfi-&gt;grbgrd==255) {<br> &nbsp;&nbsp;&nbsp;&nbsp;nrec = 1;<br> &nbsp;&nbsp;&nbsp;&nbsp;gtype[0] = 255;<br> &nbsp;&nbsp;} else if (pfi-&gt;grbgrd&gt;-1 &amp;&amp; pfi-&gt;ppflag) {<br> &nbsp;&nbsp;&nbsp;&nbsp;nrec=1;<br> &nbsp;&nbsp;&nbsp;&nbsp;gtype[0] = pfi-&gt;grbgrd;<br> &nbsp;&nbsp;} else if (pfi-&gt;grbgrd==29) {<br> &nbsp;&nbsp;&nbsp;&nbsp;nrec = 2;<br> &nbsp;&nbsp;&nbsp;&nbsp;gtype[0] = 29;<br> &nbsp;&nbsp;&nbsp;&nbsp;gtype[1] = 30;<br> &nbsp;&nbsp;&nbsp;&nbsp;if (pfi-&gt;dnum[0]!=144 || pfi-&gt;dnum[1]!=73 ||<br><span class="Apple-tab-span" style="white-space:pre">        </span> pfi-&gt;linear[0]!=1 || pfi-&gt;linear[1]!=1 ||<br><span class="Apple-tab-span" style="white-space:pre">        </span> *(pfi-&gt;grvals[0])!= 2.5 || *(pfi-&gt;grvals[0]+1) != -2.5 ||<br><span class="Apple-tab-span" style="white-space:pre">        </span> *(pfi-&gt;grvals[1])!= 2.5 || *(pfi-&gt;grvals[1]+1) != -92.5 ) {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("grib1map error: grid specification for GRIB grid type 29/30.\n");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;grid scaling must indicate a 2.5 x 2.5 grid\n");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;grid size must be 144 x 73\n");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;grid must go from 0 to 357.5 and -90 to 90\n");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(1);<br> &nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;} else {<br> &nbsp;&nbsp;&nbsp;&nbsp;nrec = 1;<br> &nbsp;&nbsp;&nbsp;&nbsp;gtype[0] = pfi-&gt;grbgrd;<br> &nbsp;&nbsp;}<br><br> &nbsp;&nbsp;/* Set up grib1 index and initialize values */<br> &nbsp;&nbsp;pindx-&gt;type &nbsp;&nbsp;= g1ver;<br> &nbsp;&nbsp;pindx-&gt;hinum &nbsp;= 4;<br> &nbsp;&nbsp;pindx-&gt;hfnum &nbsp;= 0;<br> &nbsp;&nbsp;pindx-&gt;intnum = nrec * ng1elems * pfi-&gt;trecs * pfi-&gt;dnum[3] * pfi-&gt;dnum[4];<br> &nbsp;&nbsp;pindx-&gt;fltnum = nrec * ng1elems * pfi-&gt;trecs * pfi-&gt;dnum[3] * pfi-&gt;dnum[4];<br> &nbsp;&nbsp;pindx-&gt;hipnt &nbsp;= (gaint *)galloc(sizeof(gaint)*pindx-&gt;hinum,"hipntgm");<br> &nbsp;&nbsp;pindx-&gt;intpnt = (gaint *)galloc(sizeof(gaint)*pindx-&gt;intnum,"intpntgm");<br> &nbsp;&nbsp;pindx-&gt;fltpnt = (gafloat *)galloc(sizeof(gafloat)*pindx-&gt;fltnum,"fltpntgm");<br> &nbsp;&nbsp;if (pindx-&gt;hipnt==NULL || pindx-&gt;intpnt==NULL || pindx-&gt;fltpnt==NULL) {<br> &nbsp;&nbsp;&nbsp;&nbsp;printf ("grib1map error: unable to allocate memory for index pointers\n");<br> &nbsp;&nbsp;&nbsp;&nbsp;return(1);<br> &nbsp;&nbsp;}<br> &nbsp;&nbsp;for (i=0; i&lt;pindx-&gt;intnum; i++) *(pindx-&gt;intpnt+i) = -999;<br> &nbsp;&nbsp;for (i=0; i&lt;pindx-&gt;fltnum; i++) *(pindx-&gt;fltpnt+i) = -999; <br> &nbsp;&nbsp;*(pindx-&gt;hipnt+0) = g1ver;<br> &nbsp;&nbsp;*(pindx-&gt;hipnt+1) = pfi-&gt;dnum[3];<br> &nbsp;&nbsp;*(pindx-&gt;hipnt+2) = pfi-&gt;trecs;<br> &nbsp;&nbsp;*(pindx-&gt;hipnt+3) = pfi-&gt;grbgrd;<br> &nbsp;&nbsp;if (pfi-&gt;grbgrd&lt;-900) *(pindx-&gt;hipnt+3) = 255;<br><br> &nbsp;&nbsp;/* Loop over all files in the data set */<br> &nbsp;&nbsp;gfile = NULL;<br> &nbsp;&nbsp;for (e=1,ens=pfi-&gt;ens1; e&lt;=pfi-&gt;dnum[4]; e++,ens++) {<br> &nbsp;&nbsp;&nbsp;&nbsp;tcur = 0;<br> &nbsp;&nbsp;&nbsp;&nbsp;while (1) { &nbsp;&nbsp;&nbsp;/* loop over all times for this ensemble */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (pfi-&gt;tmplat) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> /* make sure no file is open */<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (gfile!=NULL) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;fclose(gfile);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;gfile=NULL;<br><span class="Apple-tab-span" style="white-space:pre">        </span> }<br><span class="Apple-tab-span" style="white-space:pre">        </span> /* advance to first valid time step for this ensemble */<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (tcur==0) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;told = 0;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;tcur = 1;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;while (pfi-&gt;fnums[(e-1)*pfi-&gt;dnum[3]+tcur-1] == -1) tcur++; &nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> }<br><span class="Apple-tab-span" style="white-space:pre">        </span> else { &nbsp;/* tcur!=0 */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;told = pfi-&gt;fnums[(e-1)*pfi-&gt;dnum[3]+tcur-1];<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;/* increment time step until fnums changes */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;while (told==pfi-&gt;fnums[(e-1)*pfi-&gt;dnum[3]+tcur-1] &amp;&amp; tcur&lt;=pfi-&gt;dnum[3]) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;tcur++;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;}<br><span class="Apple-tab-span" style="white-space:pre">        </span> }<br><br><span class="Apple-tab-span" style="white-space:pre">        </span> /* make sure we haven't advanced past end of time axis */<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (tcur&gt;pfi-&gt;dnum[3]) break;<br><br><span class="Apple-tab-span" style="white-space:pre">        </span> /* check if we're past all valid time steps for this ensemble */<br><span class="Apple-tab-span" style="white-space:pre">        </span> if ((told != -1) &amp;&amp; (pfi-&gt;fnums[(e-1)*pfi-&gt;dnum[3]+tcur-1] == -1)) break;<br><br><span class="Apple-tab-span" style="white-space:pre">        </span> /* Find the range of t indexes that have the same fnums value.<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;These are the times that are contained in this particular file */<br><span class="Apple-tab-span" style="white-space:pre">        </span> tmin = tcur;<br><span class="Apple-tab-span" style="white-space:pre">        </span> tmax = tcur-1;<br><span class="Apple-tab-span" style="white-space:pre">        </span> fnum = pfi-&gt;fnums[(e-1)*pfi-&gt;dnum[3]+tcur-1];<br><br><span class="Apple-tab-span" style="white-space:pre">        </span> if (fnum != -1) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;while (fnum == pfi-&gt;fnums[(e-1)*pfi-&gt;dnum[3]+tmax]) tmax++;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;gr2t(pfi-&gt;grvals[3], (gadouble)tcur, &amp;dtim); <br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;gr2t(pfi-&gt;grvals[3], ens-&gt;gt, &amp;dtimi);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;ch = gafndt(pfi-&gt;name, &amp;dtim, &amp;dtimi, pfi-&gt;abvals[3], pfi-&gt;pchsub1, pfi-&gt;ens1,tcur,e,&amp;flag);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;if (ch==NULL) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;printf(" grib1map error: couldn't determine data file name for e=%d t=%d\n",e,tcur);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;return(1);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;}<br><span class="Apple-tab-span" style="white-space:pre">        </span> }<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else { <br><span class="Apple-tab-span" style="white-space:pre">        </span> /* Data set is not templated */<br><span class="Apple-tab-span" style="white-space:pre">        </span> ch = pfi-&gt;name;<br><span class="Apple-tab-span" style="white-space:pre">        </span> tmin = 1;<br><span class="Apple-tab-span" style="white-space:pre">        </span> tmax = pfi-&gt;dnum[3];<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Open this GRIB file and position to start of first record */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!quiet) printf(" grib1map: &nbsp;opening GRIB file: %s \n",ch);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gfile = fopen(ch,"rb");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (gfile==NULL) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (pfi-&gt;tmplat) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;if (!quiet) printf (" grib1map warning: could not open GRIB file: %s\n",ch);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;continue;<br><span class="Apple-tab-span" style="white-space:pre">        </span> } else {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;printf (" grib1map error: could not open GRIB file: %s\n",ch);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;return(1);<br><span class="Apple-tab-span" style="white-space:pre">        </span> }<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (pfi-&gt;tmplat) gree(ch,"312");<br><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Get file size */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fseeko(gfile,0L,2);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flen = ftello(gfile);<br><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Set up to skip appropriate amount and position */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (skip &gt; -1) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> fpos = skip;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br><span class="Apple-tab-span" style="white-space:pre">        </span> fseeko (gfile,0,0);<br><span class="Apple-tab-span" style="white-space:pre">        </span> rc = fread (rec,1,100,gfile);<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (rc&lt;100) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;printf (" grib1map error: I/O error reading header\n");<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;return(1);<br><span class="Apple-tab-span" style="white-space:pre">        </span> }<br><span class="Apple-tab-span" style="white-space:pre">        </span> len = gagby(rec,88,4);<br><span class="Apple-tab-span" style="white-space:pre">        </span> fpos = len*2 + 100;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Main Loop */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;irec=1;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (1) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> /* read a grib record */<br><span class="Apple-tab-span" style="white-space:pre">        </span> rc = gribhdr(&amp;ghdr); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (rc) break;<br><span class="Apple-tab-span" style="white-space:pre">        </span> /* compare to each 2-d variable in the 5-D data volume<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;defined by the descriptor file for a match */<br><span class="Apple-tab-span" style="white-space:pre">        </span> rcgr = gribrec(&amp;ghdr,pfi,pindx,tmin,tmax,e);<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (rcgr==0) didmatch=1;<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (rcgr&gt;=100) didmatch=rcgr;<br><span class="Apple-tab-span" style="white-space:pre">        </span> irec++;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* see how we did */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (rc==50) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> printf (" grib1map error: I/O error reading GRIB file\n");<br><span class="Apple-tab-span" style="white-space:pre">        </span> printf (" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;possible cause is premature EOF\n");<br><span class="Apple-tab-span" style="white-space:pre">        </span> break;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (rc&gt;1 &amp;&amp; rc!=98) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> printf (" grib1map error: GRIB file format error (rc = %i)\n",rc);<br><span class="Apple-tab-span" style="white-space:pre">        </span> return(rc);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* break out if not templating */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!pfi-&gt;tmplat) break;<br><br> &nbsp;&nbsp;&nbsp;&nbsp;} /* end of while (1) loop */<br> &nbsp;&nbsp;} /* end of for (e=1; e&lt;=pfi-&gt;dnum[4]; e++) loop */<br><br> &nbsp;&nbsp;if (!quiet) printf (" grib1map: &nbsp;reached end of files\n");<br><br> &nbsp;&nbsp;/* check if file closed already for case where template was set,<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;but it was not templated and the template code above closed it. */<br> &nbsp;&nbsp;if (gfile!=NULL) {<br> &nbsp;&nbsp;&nbsp;&nbsp;fclose (gfile);<br> &nbsp;&nbsp;&nbsp;&nbsp;gfile=NULL;<br> &nbsp;&nbsp;}<br><br> &nbsp;&nbsp;/* open the map file */<br> &nbsp;&nbsp;if (write_map) {<br> &nbsp;&nbsp;&nbsp;&nbsp;mfile = fopen(pfi-&gt;mnam,"wb");<br> &nbsp;&nbsp;&nbsp;&nbsp;if (mfile==NULL) {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf (" grib1map error: could not open index file: %s\n",pfi-&gt;mnam);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(1);<br> &nbsp;&nbsp;&nbsp;&nbsp;} <br> &nbsp;&nbsp;&nbsp;&nbsp;else {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!quiet) printf(" grib1map: &nbsp;writing the map...\n\n");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* output the map depending on version # */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (g1ver==1) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> fwrite (pindx,sizeof(struct gaindx),1,mfile);<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (pindx-&gt;hinum&gt;0) &nbsp;fwrite(pindx-&gt;hipnt,sizeof(gaint),pindx-&gt;hinum,mfile);<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (pindx-&gt;hfnum&gt;0) &nbsp;fwrite(pindx-&gt;hfpnt,sizeof(gafloat),pindx-&gt;hfnum,mfile);<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (pindx-&gt;intnum&gt;0) fwrite(pindx-&gt;intpnt,sizeof(gaint),pindx-&gt;intnum,mfile);<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (pindx-&gt;fltnum&gt;0) fwrite(pindx-&gt;fltpnt,sizeof(gafloat),pindx-&gt;fltnum,mfile);<br><span class="Apple-tab-span" style="white-space:pre">        </span> fclose (mfile);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br><span class="Apple-tab-span" style="white-space:pre">        </span> rc = wtgmap();<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (rc == 601) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;printf(" grib1map error: overflow in float -&gt; IBM float conversion\n");<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;fclose (mfile);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;return (601); <br><span class="Apple-tab-span" style="white-space:pre">        </span> }<br><span class="Apple-tab-span" style="white-space:pre">        </span> fclose (mfile);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;}<br> &nbsp;&nbsp;return (didmatch);<br> }<br><br>#if GRIB2<br> else /* GRIB2 */ {<br><br> &nbsp;&nbsp;/* Set up g2index and initialize values */<br> &nbsp;&nbsp;g2indx = (struct gag2indx *)malloc(sizeof(struct gag2indx));<br> &nbsp;&nbsp;if (g2indx==NULL) {<br> &nbsp;&nbsp;&nbsp;&nbsp;printf ("grib2map error: unable to allocate memory for g2indx\n");<br> &nbsp;&nbsp;&nbsp;&nbsp;return(1);<br> &nbsp;&nbsp;}<br> &nbsp;&nbsp;g2indx-&gt;version = 1; <br> &nbsp;&nbsp;g2indx-&gt;g2intnum = ng2elems * pfi-&gt;trecs * pfi-&gt;dnum[3] * pfi-&gt;dnum[4];<br> &nbsp;&nbsp;g2indx-&gt;g2intpnt = (gaint *)malloc(sizeof(gaint)*g2indx-&gt;g2intnum);<br> &nbsp;&nbsp;if (g2indx-&gt;g2intpnt==NULL) {<br> &nbsp;&nbsp;&nbsp;&nbsp;printf ("grib2map error: unable to allocate memory for g2indx-&gt;g2intpnt\n");<br> &nbsp;&nbsp;&nbsp;&nbsp;goto err;<br> &nbsp;&nbsp;}<br> &nbsp;&nbsp;for (i=0; i&lt;g2indx-&gt;g2intnum; i++) g2indx-&gt;g2intpnt[i] = -999;<br><br> &nbsp;&nbsp;/* Break out point for case with E&gt;1 but data files are only templated over T */<br> &nbsp;&nbsp;if (pfi-&gt;dnum[4]&gt;1 &amp;&amp; pfi-&gt;tmplat==1) {<br> &nbsp;&nbsp;&nbsp;&nbsp;/* Loop over all files in the data set */ <br> &nbsp;&nbsp;&nbsp;&nbsp;gfile=NULL;<br> &nbsp;&nbsp;&nbsp;&nbsp;e=1;<br> &nbsp;&nbsp;&nbsp;&nbsp;ens=pfi-&gt;ens1; <br> &nbsp;&nbsp;&nbsp;&nbsp;tcur = 0;<br> &nbsp;&nbsp;&nbsp;&nbsp;while (1) { &nbsp;/* loop over all times */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* make sure no file is open */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (gfile!=NULL) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> fclose(gfile);<br><span class="Apple-tab-span" style="white-space:pre">        </span> gfile=NULL;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (tcur==0) { /* first time step */<br><span class="Apple-tab-span" style="white-space:pre">        </span> told = 0;<br><span class="Apple-tab-span" style="white-space:pre">        </span> tcur = 1;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else { &nbsp;/* tcur!=0 */<br><span class="Apple-tab-span" style="white-space:pre">        </span> told = pfi-&gt;fnums[(e-1)*pfi-&gt;dnum[3]+tcur-1];<br><span class="Apple-tab-span" style="white-space:pre">        </span> /* increment time step until fnums changes */<br><span class="Apple-tab-span" style="white-space:pre">        </span> while (told==pfi-&gt;fnums[(e-1)*pfi-&gt;dnum[3]+tcur-1] &amp;&amp; tcur&lt;=pfi-&gt;dnum[3]) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;tcur++;<br><span class="Apple-tab-span" style="white-space:pre">        </span> }<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* make sure we haven't advanced past end of time axis */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (tcur&gt;pfi-&gt;dnum[3]) break;<br><br><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Find the range of t indexes that have the same fnums value.<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;These are the times that are contained in this particular file */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmin = tcur;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmax = tcur-1;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fnum = pfi-&gt;fnums[(e-1)*pfi-&gt;dnum[3]+tcur-1];<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (fnum != -1) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> while (fnum == pfi-&gt;fnums[(e-1)*pfi-&gt;dnum[3]+tmax]) tmax++;<br><span class="Apple-tab-span" style="white-space:pre">        </span> gr2t(pfi-&gt;grvals[3], (gadouble)tcur, &amp;dtim); <br><span class="Apple-tab-span" style="white-space:pre">        </span> gr2t(pfi-&gt;grvals[3], ens-&gt;gt, &amp;dtimi);<br><span class="Apple-tab-span" style="white-space:pre">        </span> ch = gafndt(pfi-&gt;name, &amp;dtim, &amp;dtimi, pfi-&gt;abvals[3], pfi-&gt;pchsub1, pfi-&gt;ens1,tcur,e,&amp;flag);<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (ch==NULL) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;printf("grib2map error: couldn't determine data file name for e=%d t=%d\n",e,tcur);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;goto err;<br><span class="Apple-tab-span" style="white-space:pre">        </span> }<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Open this GRIB file and position to start of first record (s/b subroutine) */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!quiet) printf("grib2map: scanning GRIB2 file: %s \n",ch);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fflush(stdout);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gfile = fopen(ch,"rb");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (gfile==NULL) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (!quiet) printf ("grib2map warning: could not open GRIB file: %s\n",ch);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fflush(stdout);<br><span class="Apple-tab-span" style="white-space:pre">        </span> continue;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gree(ch,"f311a");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Loop over fields in the grib file and find matches */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iseek=0;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record=1;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (1) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> /* move to next grib message in file */<br><span class="Apple-tab-span" style="white-space:pre">        </span> seekgb(gfile,iseek,32000,&amp;lskip,&amp;lgrib);<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (lgrib == 0) break; &nbsp;&nbsp;&nbsp;/* end loop at EOF or problem */<br><span class="Apple-tab-span" style="white-space:pre">        </span> <br><span class="Apple-tab-span" style="white-space:pre">        </span> /* read the message into memory */<br><span class="Apple-tab-span" style="white-space:pre">        </span> cgrib = (unsigned char *)galloc(lgrib,"cgrib2");<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (cgrib == NULL) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;printf("grib2map error: unable to allocate memory for record %d at byte %ld\n",record,iseek); <br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;goto err;<br><span class="Apple-tab-span" style="white-space:pre">        </span> }<br><span class="Apple-tab-span" style="white-space:pre">        </span> ret = fseek(gfile,lskip,SEEK_SET);<br><span class="Apple-tab-span" style="white-space:pre">        </span> lengrib = fread(cgrib,sizeof(unsigned char),lgrib,gfile);<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (lengrib &lt; lgrib) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;printf("grib2map error: unable to read record %d at byte %ld\n",record,iseek); goto err;<br><span class="Apple-tab-span" style="white-space:pre">        </span> }<br><span class="Apple-tab-span" style="white-space:pre">        </span> <br><span class="Apple-tab-span" style="white-space:pre">        </span> /* Get info about grib2 message */<br><span class="Apple-tab-span" style="white-space:pre">        </span> ierr = 0;<br><span class="Apple-tab-span" style="white-space:pre">        </span> ierr = g2_info(cgrib,listsec0,listsec1,&amp;numfields,&amp;numlocal);<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (ierr) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;printf("grib2map error: g2_info failed: ierr=%d\n",ierr); goto err;<br><span class="Apple-tab-span" style="white-space:pre">        </span> }<br><span class="Apple-tab-span" style="white-space:pre">        </span> for (n=0; n&lt;numfields; n++) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;ierr = 0;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;ierr = g2_getfld(cgrib,n+1,unpack,expand,&amp;gfld);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;if (ierr) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;printf("grib2map error: g2_getfld failed: ierr=%d\n",ierr); goto err;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;}<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;/* get statistical process type from grib field */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;sp = g2sp(gfld);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;/* print out useful codes from grib2 field */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;if (verb) g2prnt(gfld,record,n+1,sp);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;/* Check grid properties */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;rc = g2grid_check(gfld,pfi,record,n+1);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;if (rc) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;if (verb) printf("\n");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fflush(stdout);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;g2_free(gfld); &nbsp;&nbsp;<span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;break; <br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;}<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;/* Check time values in grib field */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;it = g2time_check(gfld,listsec1,pfi,record,n+1,tmin,tmax);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;if (it==-99) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;if (verb) printf("\n");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fflush(stdout);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;g2_free(gfld); &nbsp;&nbsp;<span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;break;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;}<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;it = (it-1)*pfi-&gt;trecs; &nbsp;/* number of records per time */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;/* Check if the variable is a match */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;ioff = g2var_match(gfld,pfi,sp);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;if (ioff==-999) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;if (verb) printf("\n");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fflush(stdout);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;g2_free(gfld); &nbsp;&nbsp;<span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;break;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;}<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;/* check if ensemble codes match */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;e = g2ens_match(gfld,pfi);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;if (e==-999) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;if (verb) printf("\n");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fflush(stdout);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;g2_free(gfld); &nbsp;&nbsp;<span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;break;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;}<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;eoff = (e-1)*pfi-&gt;dnum[3]*pfi-&gt;trecs; &nbsp;/* number of records per ensemble */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;/* fill in the gribmap entry */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;if (verb) printf(" &nbsp;MATCH \n");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fflush(stdout);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;g2fill (eoff,it+ioff,ng2elems,iseek,n+1,g2indx);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;g2_free(gfld); <br><span class="Apple-tab-span" style="white-space:pre">        </span> }<br><span class="Apple-tab-span" style="white-space:pre">        </span> /* free memory containing grib record */<br><span class="Apple-tab-span" style="white-space:pre">        </span> gree(cgrib,"f310");<br><span class="Apple-tab-span" style="white-space:pre">        </span> cgrib=NULL;<br><span class="Apple-tab-span" style="white-space:pre">        </span> record++; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* increment grib record counter */<br><span class="Apple-tab-span" style="white-space:pre">        </span> iseek = lskip+lgrib; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* increment byte offset to next grib msg in file */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;/* end of while(1) loop over all fields in the grib message*/<br> &nbsp;&nbsp;&nbsp;&nbsp;} /* end of while loop over all times */<br><br> &nbsp;&nbsp;}<br> &nbsp;&nbsp;else {<br> &nbsp;&nbsp;/* All data sets except those that have E&gt;1 but are templated only over T */<br><br> &nbsp;&nbsp;/* Loop over all files in the data set */ <br> &nbsp;&nbsp;gfile=NULL;<br> &nbsp;&nbsp;for (e=1,ens=pfi-&gt;ens1; e&lt;=pfi-&gt;dnum[4]; e++,ens++) {<br> &nbsp;&nbsp;&nbsp;&nbsp;tcur = 0;<br> &nbsp;&nbsp;&nbsp;&nbsp;while (1) { &nbsp;/* loop over all times for this ensemble */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (pfi-&gt;tmplat) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> /* make sure no file is open */<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (gfile!=NULL) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;fclose(gfile);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;gfile=NULL;<br><span class="Apple-tab-span" style="white-space:pre">        </span> }<br><span class="Apple-tab-span" style="white-space:pre">        </span> /* advance to first valid time step for this ensemble */<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (tcur==0) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;told = 0;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;tcur = 1;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;while (pfi-&gt;fnums[(e-1)*pfi-&gt;dnum[3]+tcur-1] == -1) tcur++; &nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> }<br><span class="Apple-tab-span" style="white-space:pre">        </span> else { &nbsp;/* tcur!=0 */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;told = pfi-&gt;fnums[(e-1)*pfi-&gt;dnum[3]+tcur-1];<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;/* increment time step until fnums changes */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;while (told==pfi-&gt;fnums[(e-1)*pfi-&gt;dnum[3]+tcur-1] &amp;&amp; tcur&lt;=pfi-&gt;dnum[3]) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;tcur++;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;}<br><span class="Apple-tab-span" style="white-space:pre">        </span> }<br><span class="Apple-tab-span" style="white-space:pre">        </span> <br><span class="Apple-tab-span" style="white-space:pre">        </span> /* make sure we haven't advanced past end of time axis */<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (tcur&gt;pfi-&gt;dnum[3]) break;<br><span class="Apple-tab-span" style="white-space:pre">        </span> <br><span class="Apple-tab-span" style="white-space:pre">        </span> /* check if we're past all valid time steps for this ensemble */<br><span class="Apple-tab-span" style="white-space:pre">        </span> if ((told != -1) &amp;&amp; (pfi-&gt;fnums[(e-1)*pfi-&gt;dnum[3]+tcur-1] == -1)) break;<br><span class="Apple-tab-span" style="white-space:pre">        </span> <br><span class="Apple-tab-span" style="white-space:pre">        </span> /* Find the range of t indexes that have the same fnums value.<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;These are the times that are contained in this particular file */<br><span class="Apple-tab-span" style="white-space:pre">        </span> tmin = tcur;<br><span class="Apple-tab-span" style="white-space:pre">        </span> tmax = tcur-1;<br><span class="Apple-tab-span" style="white-space:pre">        </span> fnum = pfi-&gt;fnums[(e-1)*pfi-&gt;dnum[3]+tcur-1];<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (fnum != -1) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;while (fnum == pfi-&gt;fnums[(e-1)*pfi-&gt;dnum[3]+tmax]) tmax++;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;gr2t(pfi-&gt;grvals[3], (gadouble)tcur, &amp;dtim); <br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;gr2t(pfi-&gt;grvals[3], ens-&gt;gt, &amp;dtimi);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;ch = gafndt(pfi-&gt;name, &amp;dtim, &amp;dtimi, pfi-&gt;abvals[3], pfi-&gt;pchsub1, pfi-&gt;ens1,tcur,e,&amp;flag);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;if (ch==NULL) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;printf("grib2map error: couldn't determine data file name for e=%d t=%d\n",e,tcur);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fflush(stdout);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;goto err;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;}<br><span class="Apple-tab-span" style="white-space:pre">        </span> }<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else { &nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> /* only one data file to open */<br><span class="Apple-tab-span" style="white-space:pre">        </span> ch = pfi-&gt;name;<br><span class="Apple-tab-span" style="white-space:pre">        </span> tmin = 1;<br><span class="Apple-tab-span" style="white-space:pre">        </span> tmax = pfi-&gt;dnum[3];<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Open this GRIB file and position to start of first record (s/b subroutine) */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!quiet) printf("grib2map: scanning GRIB2 file: %s \n",ch);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fflush(stdout);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gfile = fopen(ch,"rb");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (gfile==NULL) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (pfi-&gt;tmplat) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;if (!quiet) printf ("grib2map warning: could not open GRIB file: %s\n",ch);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fflush(stdout);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;continue;<br><span class="Apple-tab-span" style="white-space:pre">        </span> }<br><span class="Apple-tab-span" style="white-space:pre">        </span> else {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;printf ("grib2map error: could not open GRIB file: %s\n",ch);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;goto err;<br><span class="Apple-tab-span" style="white-space:pre">        </span> }<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (pfi-&gt;tmplat) gree(ch,"f311");<br><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Loop over fields in the grib file and find matches */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iseek=0;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;record=1;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while (1) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> /* move to next grib message in file */<br><span class="Apple-tab-span" style="white-space:pre">        </span> seekgb(gfile,iseek,32000,&amp;lskip,&amp;lgrib);<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (lgrib == 0) break; &nbsp;&nbsp;&nbsp;/* end loop at EOF or problem */<br><span class="Apple-tab-span" style="white-space:pre">        </span> <br><span class="Apple-tab-span" style="white-space:pre">        </span> /* read the message into memory */<br><span class="Apple-tab-span" style="white-space:pre">        </span> cgrib = (unsigned char *)galloc(lgrib,"cgrib2");<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (cgrib == NULL) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;printf("grib2map error: unable to allocate memory for record %d at byte %ld\n",record,iseek); <br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;goto err;<br><span class="Apple-tab-span" style="white-space:pre">        </span> }<br><span class="Apple-tab-span" style="white-space:pre">        </span> ret = fseek(gfile,lskip,SEEK_SET);<br><span class="Apple-tab-span" style="white-space:pre">        </span> lengrib = fread(cgrib,sizeof(unsigned char),lgrib,gfile);<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (lengrib &lt; lgrib) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;printf("grib2map error: unable to read record %d at byte %ld\n",record,iseek); goto err;<br><span class="Apple-tab-span" style="white-space:pre">        </span> }<br><span class="Apple-tab-span" style="white-space:pre">        </span> <br><span class="Apple-tab-span" style="white-space:pre">        </span> /* Get info about grib2 message */<br><span class="Apple-tab-span" style="white-space:pre">        </span> ierr = 0;<br><span class="Apple-tab-span" style="white-space:pre">        </span> ierr = g2_info(cgrib,listsec0,listsec1,&amp;numfields,&amp;numlocal);<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (ierr) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;printf("grib2map error: g2_info failed: ierr=%d\n",ierr); goto err;<br><span class="Apple-tab-span" style="white-space:pre">        </span> }<br><span class="Apple-tab-span" style="white-space:pre">        </span> for (n=0; n&lt;numfields; n++) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;ierr = 0;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;ierr = g2_getfld(cgrib,n+1,unpack,expand,&amp;gfld);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;if (ierr) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;printf("grib2map error: g2_getfld failed: ierr=%d\n",ierr); goto err;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;}<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;/* get statistical process type from grib field */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;sp = g2sp(gfld);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;/* print out useful codes from grib2 field */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;if (verb) g2prnt(gfld,record,n+1,sp);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;/* Check grid properties */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;rc = g2grid_check(gfld,pfi,record,n+1);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;if (rc) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;if (verb) printf("\n");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fflush(stdout);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;g2_free(gfld); &nbsp;&nbsp;<span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;break; <br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;}<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;/* Check time values in grib field */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;it = g2time_check(gfld,listsec1,pfi,record,n+1,tmin,tmax);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;if (it==-99) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;if (verb) printf("\n");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fflush(stdout);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;g2_free(gfld); &nbsp;&nbsp;<span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;break;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;}<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;it = (it-1)*pfi-&gt;trecs; &nbsp;/* number of records per time */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;/* Check if the variable is a match */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;ioff = g2var_match(gfld,pfi,sp);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;if (ioff==-999) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;if (verb) printf("\n");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fflush(stdout);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;g2_free(gfld); &nbsp;&nbsp;<span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;break;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;}<br><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;if (pfi-&gt;tmplat) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;/* make sure grib codes match for this ensemble */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;rc = g2ens_check(ens,gfld);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;if (rc==1) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (verb) printf("\n");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fflush(stdout);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2_free(gfld); &nbsp;&nbsp;<span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;}<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;} <br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;else {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;/* check if ensemble codes match */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;e = g2ens_match(gfld,pfi);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;if (e==-999) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (verb) printf("\n");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fflush(stdout);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;g2_free(gfld); &nbsp;&nbsp;<span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;}<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;}<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;eoff = (e-1)*pfi-&gt;dnum[3]*pfi-&gt;trecs; &nbsp;/* number of records per ensemble */<br><br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;/* fill in the gribmap entry */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;if (verb) printf(" &nbsp;MATCH \n");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fflush(stdout);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;g2fill (eoff,it+ioff,ng2elems,iseek,n+1,g2indx);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;g2_free(gfld); <br><br><span class="Apple-tab-span" style="white-space:pre">        </span> }<br><span class="Apple-tab-span" style="white-space:pre">        </span> /* free memory containing grib record */<br><span class="Apple-tab-span" style="white-space:pre">        </span> gree(cgrib,"f310");<br> <span class="Apple-tab-span" style="white-space:pre">        </span> cgrib=NULL;<br><span class="Apple-tab-span" style="white-space:pre">        </span> record++; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* increment grib record counter */<br><span class="Apple-tab-span" style="white-space:pre">        </span> iseek = lskip+lgrib; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* increment byte offset to next grib msg in file */<br><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;/* end of while(1) loop over all fields in the grib message*/<br><br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* break out if not templating -- only need to scan one grib file */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!pfi-&gt;tmplat) goto done;<br><br> &nbsp;&nbsp;&nbsp;&nbsp;} /* end of while(1) loop over all grib files for a given ensemble member*/<br> &nbsp;&nbsp;} /* end of loop over ensemble members: for (e=1,ens=pfi-&gt;ens1; e&lt;=pfi-&gt;dnum[4]; e++,ens++) */<br> &nbsp;&nbsp;} /* end of else statement for if (pfi-&gt;dnum[4]&gt;1 &amp;&amp; pfi-&gt;tmplat==1) &nbsp;*/<br><br> &nbsp;&nbsp;if (!quiet) printf ("grib2map: reached end of files\n");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fflush(stdout);<br><br><br>done: &nbsp;&nbsp;<br> &nbsp;&nbsp;/* check if file not closed */<br> &nbsp;&nbsp;if (gfile!=NULL) {<br> &nbsp;&nbsp;&nbsp;&nbsp;fclose (gfile);<br> &nbsp;&nbsp;&nbsp;&nbsp;gfile=NULL;<br> &nbsp;&nbsp;}<br><br> &nbsp;&nbsp;/* Write out the index file */<br> &nbsp;&nbsp;if (write_map) {<br> &nbsp;&nbsp;&nbsp;&nbsp;rc=wtg2map(pfi,g2indx);<br> &nbsp;&nbsp;&nbsp;&nbsp;if (rc) return (rc);<br> &nbsp;&nbsp;}<br> &nbsp;&nbsp;return(0);<br><br>err: <br> &nbsp;&nbsp;if (g2indx-&gt;g2intpnt) gree(g2indx-&gt;g2intpnt,"f314");<br> &nbsp;&nbsp;if (g2indx) gree(g2indx,"f315");<br> &nbsp;&nbsp;if (cgrib) gree(cgrib,"f316");<br> &nbsp;&nbsp;return(1);<br> }<br><br>#endif &nbsp;/* matches #if GRIB2 */<br><br>}<br><br><br><br>/* Routine to read a GRIB header and process info */<br><br>gaint gribhdr (struct grhdr *ghdr) {<br> struct dt atim;<br> unsigned char rec[50000],*ch,*gds;<br> gaint i,len ,rc,sign,mant;<br> off_t cpos;<br><br> if (fpos+50&gt;=flen) return(1);<br><br> /* look for data between records BY DEFAULT */ <br> i = 0;<br> fpos += i;<br> rc = fseek(gfile,fpos,0);<br> if (rc) return(50);<br> ch=&amp;rec[0];<br> rc = fread(ch,sizeof(char),4,gfile);<br> while ((fpos &lt; flen-4) &amp;&amp; (i &lt; scanlim) &amp;&amp; <br><span class="Apple-tab-span" style="white-space:pre">        </span>!(*(ch+0)=='G' &amp;&amp; <br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;*(ch+1)=='R' &amp;&amp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;*(ch+2)=='I' &amp;&amp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;*(ch+3)=='B')) {<br> &nbsp;&nbsp;fpos++;<br> &nbsp;&nbsp;i++;<br> &nbsp;&nbsp;rc = fseeko(gfile,fpos,0);<br> &nbsp;&nbsp;if (rc) return(50);<br> &nbsp;&nbsp;rc = fread(ch,sizeof(char),4,gfile);<br> &nbsp;&nbsp;if (rc&lt;4) return(50);<br> } <br><br> if (i == scanlim) {<br> &nbsp;&nbsp;printf("grib1map error: GRIB header not found in scanning between records\n");<br> &nbsp;&nbsp;printf(" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try increasing the value of the -s argument\n");<br><br> &nbsp;&nbsp;if (scaneof) return(98);<br> &nbsp;&nbsp;if (scanEOF) return(0);<br> &nbsp;&nbsp;return(52);<br> } <br> else if (fpos == flen-4) {<br> &nbsp;&nbsp;if (scaneof) return(98);<br> &nbsp;&nbsp;if (scanEOF) return(0);<br> &nbsp;&nbsp;return (53);<br> }<br><br> /* SUCCESS redo the initial read */ &nbsp;&nbsp;&nbsp;<br> rc = fseek(gfile,fpos,0);<br> if (rc) return(50);<br> rc = fread(rec,1,8,gfile);<br> if (rc&lt;8) {<br> &nbsp;&nbsp;if (fpos+8 &gt;= flen) return(61);<br> &nbsp;&nbsp;else return(62);<br> }<br><br> cpos = fpos;<br> ghdr-&gt;vers = gagby(rec,7,1);<br> if (ghdr-&gt;vers&gt;1) {<br> &nbsp;&nbsp;printf ("grib1map error: file is not GRIB version 0 or 1, version number is %i\n",ghdr-&gt;vers);<br> &nbsp;&nbsp;if (scaneof) return(98);<br> &nbsp;&nbsp;return (99);<br> }<br><br> if (ghdr-&gt;vers==0) {<br> &nbsp;&nbsp;cpos += 4;<br> &nbsp;&nbsp;rc = fseek(gfile,cpos,0);<br> &nbsp;&nbsp;if (rc) return(50);<br> } else {<br> &nbsp;&nbsp;ghdr-&gt;len = gagby(rec,4,3);<br> &nbsp;&nbsp;cpos = cpos + 8;<br> &nbsp;&nbsp;rc = fseeko(gfile,cpos,0);<br> &nbsp;&nbsp;if (rc) return(50);<br> }<br><br> /* Get PDS length, read rest of PDS */<br> rc = fread(rec,1,3,gfile);<br> if (rc&lt;3) return(50);<br> len = gagby(rec,0,3);<br> ghdr-&gt;pdslen = len;<br> cpos = cpos + len;<br> rc = fread(rec+3,1,len-3,gfile);<br> if (rc&lt;len-3) return(50);<br><br> /* Get info from PDS */<br> ghdr-&gt;id = gagby(rec,6,1);<br> ghdr-&gt;gdsflg = gagbb(rec+7,0,1);<br> ghdr-&gt;bmsflg = gagbb(rec+7,1,1);<br> ghdr-&gt;parm = gagby(rec,8,1);<br> ghdr-&gt;ltyp = gagby(rec,9,1);<br> ghdr-&gt;level = gagby(rec,10,2);<br> ghdr-&gt;l1 = gagby(rec,10,1);<br> ghdr-&gt;l2 = gagby(rec,11,1);<br> if (mpiflg) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br> &nbsp;&nbsp;/* use initial time from the descriptor file instead of base time from grib header */<br> &nbsp;&nbsp;ghdr-&gt;btim.yr = *(pfi-&gt;abvals[3]);<br> &nbsp;&nbsp;ghdr-&gt;btim.mo = *(pfi-&gt;abvals[3]+1);<br> &nbsp;&nbsp;ghdr-&gt;btim.dy = *(pfi-&gt;abvals[3]+2);<br> &nbsp;&nbsp;ghdr-&gt;btim.hr = *(pfi-&gt;abvals[3]+3);<br> &nbsp;&nbsp;ghdr-&gt;btim.mn = *(pfi-&gt;abvals[3]+4);<br> &nbsp;&nbsp;if (no_min) ghdr-&gt;btim.mn = 0;<br> } else {<br> &nbsp;&nbsp;ghdr-&gt;btim.yr = gagby(rec,12,1);<br> &nbsp;&nbsp;ghdr-&gt;btim.mo = gagby(rec,13,1);<br> &nbsp;&nbsp;ghdr-&gt;btim.dy = gagby(rec,14,1);<br> &nbsp;&nbsp;ghdr-&gt;btim.hr = gagby(rec,15,1);<br> &nbsp;&nbsp;ghdr-&gt;btim.mn = gagby(rec,16,1);<br> &nbsp;&nbsp;if (no_min) ghdr-&gt;btim.mn = 0;<br> }<br> if (ghdr-&gt;btim.hr&gt;23) ghdr-&gt;btim.hr = 0; &nbsp;/* Special for NCAR */<br> if (len&gt;24) {<br> &nbsp;&nbsp;ghdr-&gt;cent = gagby(rec,24,1);<br> &nbsp;&nbsp;ghdr-&gt;btim.yr = ghdr-&gt;btim.yr + (ghdr-&gt;cent-1)*100;<br> } else {<br> &nbsp;&nbsp;ghdr-&gt;cent = -999;<br> &nbsp;&nbsp;if (!(mpiflg) || !(mfcmn.fullyear)) {<br> &nbsp;&nbsp;&nbsp;&nbsp;if (ghdr-&gt;btim.yr&gt;49) ghdr-&gt;btim.yr += 1900;<br> &nbsp;&nbsp;&nbsp;&nbsp;if (ghdr-&gt;btim.yr&lt;50) ghdr-&gt;btim.yr += 2000;<br> &nbsp;&nbsp;}<br> }<br> ghdr-&gt;ftu = gagby(rec,17,1);<br> ghdr-&gt;tri = gagby(rec,20,1);<br> if (ghdr-&gt;tri==10) {<br> &nbsp;&nbsp;ghdr-&gt;p1 = gagby(rec,18,2);<br> &nbsp;&nbsp;ghdr-&gt;p2 = 0;<br> } else {<br> &nbsp;&nbsp;ghdr-&gt;p1 = gagby(rec,18,1);<br> &nbsp;&nbsp;ghdr-&gt;p2 = gagby(rec,19,1);<br> }<br><br> ghdr-&gt;fcstt = ghdr-&gt;p1;<br> if (ghdr-&gt;tri&gt;1 &amp;&amp; ghdr-&gt;tri&lt;6) <br> &nbsp;&nbsp;ghdr-&gt;fcstt=ghdr-&gt;p2;<br> if ((tauave) &amp;&amp; ghdr-&gt;tri==3) <br> &nbsp;&nbsp;ghdr-&gt;fcstt=ghdr-&gt;p1;<br> atim.yr=0; atim.mo=0; atim.dy=0; atim.hr=0; atim.mn=0;<br> if &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ghdr-&gt;ftu== 0) atim.mn = ghdr-&gt;fcstt;<br> else if (ghdr-&gt;ftu==13) atim.mn = ghdr-&gt;fcstt*15; /*DWD*/<br> else if (ghdr-&gt;ftu==14) atim.mn = ghdr-&gt;fcstt*30; /*DWD*/<br> else if (ghdr-&gt;ftu== 1) atim.hr = ghdr-&gt;fcstt;<br> else if (ghdr-&gt;ftu==10) atim.hr = ghdr-&gt;fcstt*3; &nbsp;&nbsp;/* added 3Hr incr */<br> else if (ghdr-&gt;ftu==11) atim.hr = ghdr-&gt;fcstt*6; &nbsp;&nbsp;/* added 6Hr incr */ &nbsp;<br> else if (ghdr-&gt;ftu==12) atim.hr = ghdr-&gt;fcstt*12; &nbsp;/* added 12Hr incr */<br> else if (ghdr-&gt;ftu== 2) atim.dy = ghdr-&gt;fcstt;<br> else if (ghdr-&gt;ftu== 3) atim.mo = ghdr-&gt;fcstt;<br> else if (ghdr-&gt;ftu== 4) atim.yr = ghdr-&gt;fcstt;<br> else ghdr-&gt;fcstt = -999;<br><br> /* &nbsp;if notau != 0 then FORCE the valid DTG to be the base DTG */ <br> if (notau) ghdr-&gt;fcstt = -999 ;<br><br> /* &nbsp;add the forecast time to the time of this grib field */<br> if (ghdr-&gt;fcstt&gt;-900) {<br> &nbsp;&nbsp;timadd(&amp;(ghdr-&gt;btim),&amp;atim);<br> &nbsp;&nbsp;ghdr-&gt;dtim.yr = atim.yr;<br> &nbsp;&nbsp;ghdr-&gt;dtim.mo = atim.mo;<br> &nbsp;&nbsp;ghdr-&gt;dtim.dy = atim.dy;<br> &nbsp;&nbsp;ghdr-&gt;dtim.hr = atim.hr;<br> &nbsp;&nbsp;ghdr-&gt;dtim.mn = atim.mn;<br> } else {<br> &nbsp;&nbsp;ghdr-&gt;dtim.yr = ghdr-&gt;btim.yr;<br> &nbsp;&nbsp;ghdr-&gt;dtim.mo = ghdr-&gt;btim.mo;<br> &nbsp;&nbsp;ghdr-&gt;dtim.dy = ghdr-&gt;btim.dy;<br> &nbsp;&nbsp;ghdr-&gt;dtim.hr = ghdr-&gt;btim.hr;<br> &nbsp;&nbsp;ghdr-&gt;dtim.mn = ghdr-&gt;btim.mn;<br> }<br> if (len&gt;25) {<br> &nbsp;&nbsp;ghdr-&gt;dsf = (gafloat)gagbb(rec+26,1,15);<br> &nbsp;&nbsp;i = gagbb(rec+26,0,1);<br> &nbsp;&nbsp;if (i) ghdr-&gt;dsf = -1.0*ghdr-&gt;dsf;<br> &nbsp;&nbsp;ghdr-&gt;dsf = pow(10.0,ghdr-&gt;dsf);<br> } else ghdr-&gt;dsf = 1.0;<br><br> /* If it is there, get info from GDS */<br> if (ghdr-&gt;gdsflg) {<br> &nbsp;&nbsp;rc = fread(rec,1,3,gfile);<br> &nbsp;&nbsp;if (rc&lt;3) return(50);<br> &nbsp;&nbsp;len = gagby(rec,0,3);<br> &nbsp;&nbsp;ghdr-&gt;gdslen = len;<br> &nbsp;&nbsp;cpos = cpos + len;<br><br> &nbsp;&nbsp;/* handle generic grid where the lon/lats are coded from the GDS */<br> &nbsp;&nbsp;gds = (unsigned char *)malloc(len+3);<br> &nbsp;&nbsp;if (gds==NULL) return(51);<br> &nbsp;&nbsp;rc = fread(gds+3,1,len-3,gfile);<br> &nbsp;&nbsp;if (rc&lt;len-3) return(50);<br> &nbsp;&nbsp;ghdr-&gt;gtyp &nbsp;= gagby(gds,4,1);<br> &nbsp;&nbsp;ghdr-&gt;gicnt = gagby(gds,6,2);<br> &nbsp;&nbsp;ghdr-&gt;gjcnt = gagby(gds,8,2);<br> &nbsp;&nbsp;ghdr-&gt;gsf1 &nbsp;= gagbb(gds+27,0,1);<br> &nbsp;&nbsp;ghdr-&gt;gsf2 &nbsp;= gagbb(gds+27,1,1);<br> &nbsp;&nbsp;ghdr-&gt;gsf3 &nbsp;= gagbb(gds+27,2,1);<br> &nbsp;&nbsp;free(gds);<br> } <br> else ghdr-&gt;gdslen = 0;<br><br> /* Get necessary info about BMS if it is there */<br> if (ghdr-&gt;bmsflg) {<br> &nbsp;&nbsp;rc = fread(rec,1,6,gfile);<br> &nbsp;&nbsp;if (rc&lt;6) return(50);<br> &nbsp;&nbsp;len = gagby(rec,0,3);<br> &nbsp;&nbsp;ghdr-&gt;bmsflg = len;<br> &nbsp;&nbsp;ghdr-&gt;bnumr = gagby(rec,4,2);<br> &nbsp;&nbsp;ghdr-&gt;bpos = cpos+6;<br> &nbsp;&nbsp;cpos = cpos + len;<br> &nbsp;&nbsp;rc = fseeko(gfile,cpos,0);<br> } <br> else ghdr-&gt;bmslen = 0;<br><br> /* Get necessary info from data header */<br> rc = fread(rec,1,11,gfile);<br> if (rc&lt;11) return(50);<br> len = gagby(rec,0,3);<br> ghdr-&gt;bdslen = len;<br> ghdr-&gt;iflg = gagbb(rec+3,0,2);<br> i = gagby(rec,4,2);<br> if (i&gt;32767) i = 32768-i;<br> ghdr-&gt;bsf = pow(2.0,(gafloat)i);<br><br> i = gagby(rec,6,1);<br> sign = 0;<br> if (i&gt;127) {<br> &nbsp;&nbsp;sign = 1;<br> &nbsp;&nbsp;i = i - 128;<br> }<br> mant = gagby(rec,7,3);<br> if (sign) mant = -mant;<br> ghdr-&gt;ref = (gafloat)mant * pow(16.0,(gafloat)(i-70));<br><br> ghdr-&gt;bnum = gagby(rec,10,1);<br> ghdr-&gt;dpos = cpos+11;<br><br> if (ghdr-&gt;vers==0) {<br> &nbsp;&nbsp;fpos = fpos + 8 + ghdr-&gt;pdslen + ghdr-&gt;gdslen +<br> &nbsp;&nbsp;&nbsp;&nbsp;ghdr-&gt;bmslen + ghdr-&gt;bdslen;<br> } <br> else fpos = fpos + ghdr-&gt;len;<br><br> return(0);<br><br>}<br><br>/* Routine to determine the location of the GRIB record in terms of the GrADS data set<br> &nbsp;&nbsp;and fill in the proper values at the proper slot location. */<br><br>gaint gribrec (struct grhdr *ghdr, struct gafile *pfi, struct gaindx *pindx, <br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;gaint tmin, gaint tmax, gaint e) {<br> gadouble (*conv) (gadouble *, gadouble);<br> gadouble z,t;<br> struct gavar *pvar;<br> gaint i,ioff,iz,it,joff,nsiz,flag,eoff;<br><br> /* Verify that we are looking at the proper grid type */<br> joff =0;<br> nsiz = nrec * ng1elems ;<br> if (ghdr-&gt;iflg) {<br> &nbsp;&nbsp;if (verb) {<br> &nbsp;&nbsp;&nbsp;&nbsp;printf ("GRIB record contains harmonic or complex packing\n");<br> &nbsp;&nbsp;&nbsp;&nbsp;printf (" &nbsp;Record is skipped.\n");<br> &nbsp;&nbsp;&nbsp;&nbsp;printf (" &nbsp;Variable is %i\n",ghdr-&gt;parm);<br> &nbsp;&nbsp;}<br> &nbsp;&nbsp;return(10);<br> }<br> if (pfi-&gt;grbgrd==255 || pfi-&gt;grbgrd&lt;-900) {<br> &nbsp;&nbsp;if (!ghdr-&gt;gdsflg) {<br> &nbsp;&nbsp;&nbsp;&nbsp;if (verb) {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf ("GRIB record contains pre-defined grid type: "); <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf ("GrADS descriptor specifies type 255\n");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gribpr(ghdr);<br> &nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;return(20);<br> &nbsp;&nbsp;} <br> &nbsp;&nbsp;if ( pfi-&gt;ppflag) {<br> &nbsp;&nbsp;&nbsp;&nbsp;if ( ghdr-&gt;gicnt != 65535 &amp;&amp; <br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;((ghdr-&gt;gicnt != pfi-&gt;ppisiz) || (ghdr-&gt;gjcnt != pfi-&gt;ppjsiz)) ) {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (verb) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> printf ("GRIB grid size does not match descriptor: "); <br><span class="Apple-tab-span" style="white-space:pre">        </span> gribpr(ghdr);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(300);<br> &nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;} else {<br> &nbsp;&nbsp;&nbsp;&nbsp;if (ghdr-&gt;gicnt != 65535 &amp;&amp; <br><span class="Apple-tab-span" style="white-space:pre">        </span> ((ghdr-&gt;gicnt != pfi-&gt;dnum[0]) || (ghdr-&gt;gjcnt != pfi-&gt;dnum[1]))) {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (verb) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> printf ("GRIB grid size does not match descriptor:");<br><span class="Apple-tab-span" style="white-space:pre">        </span> gribpr(ghdr);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(301);<br> &nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;}<br> } <br> else {<br> &nbsp;&nbsp;/* special case for GRIB grid number (dtype grib NNN) == 29 */<br> &nbsp;&nbsp;if (pfi-&gt;grbgrd==29) {<br> &nbsp;&nbsp;&nbsp;&nbsp;if (ghdr-&gt;id!=29 &amp;&amp; ghdr-&gt;id!=30) {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (verb) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> printf("Record has wrong GRIB grid type: ") ; <br><span class="Apple-tab-span" style="white-space:pre">        </span> gribpr(ghdr);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(400); &nbsp;&nbsp;&nbsp;&nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;if (ghdr-&gt;id==29) joff = ng1elems;<br> &nbsp;&nbsp;&nbsp;&nbsp;nsiz = 2 * ng1elems ;<br> &nbsp;&nbsp;} else {<br> &nbsp;&nbsp;&nbsp;&nbsp;if (ghdr-&gt;id != pfi-&gt;grbgrd) {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (verb) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> printf("%s","Record has wrong GRIB grid type: "); <br><span class="Apple-tab-span" style="white-space:pre">        </span> gribpr(ghdr);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(401); &nbsp;&nbsp;&nbsp;&nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;}<br> }<br><br> /* Calculate the grid time for this record. &nbsp;<br> &nbsp;&nbsp;&nbsp;If it is non-integer or if it is out of bounds, just return. */<br><br> /* Check for given forecast time, tauoff (the -fhr switch) */<br> if (tauflg &amp;&amp; (ghdr-&gt;ftu==1 &amp;&amp; ghdr-&gt;fcstt!=tauoff)) {<br> &nbsp;&nbsp;if (verb) {<br> &nbsp;&nbsp;&nbsp;&nbsp;printf("%s %d","--f-- Forecast Time does not match : ",tauoff);<br> &nbsp;&nbsp;&nbsp;&nbsp;gribpr(ghdr);<br> &nbsp;&nbsp;}<br> &nbsp;&nbsp;return(32);<br> }<br><br> /* Check if base time in grib record matches initial time in descriptor file (the -t0 switch) */<br> if (tau0 &amp;&amp;<br> &nbsp;&nbsp;&nbsp;&nbsp;((ghdr-&gt;btim.yr != btimdd.yr) ||<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ghdr-&gt;btim.mo != btimdd.mo) ||<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ghdr-&gt;btim.dy != btimdd.dy) ||<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ghdr-&gt;btim.hr != btimdd.hr) ||<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ghdr-&gt;btim.mn != btimdd.mn))) {<br> &nbsp;&nbsp;if (verb) {<br> &nbsp;&nbsp;&nbsp;&nbsp;printf("%s","--b-- Base Time does not match Initial Time in DD: "); <br> &nbsp;&nbsp;&nbsp;&nbsp;gribpr(ghdr);<br> &nbsp;&nbsp;}<br> &nbsp;&nbsp;return(34);<br> }<br><br> /* Check if valid time is within grid time limits */<br> t = t2gr(pfi-&gt;abvals[3],&amp;(ghdr-&gt;dtim));<br> if (t&lt;0.99 || t&gt;((gafloat)(pfi-&gt;dnum[3])+0.01)) {<br> &nbsp;&nbsp;if (verb) {<br> &nbsp;&nbsp;&nbsp;&nbsp;printf("%s","----- Time out of bounds: "); <br> &nbsp;&nbsp;&nbsp;&nbsp;gribpr(ghdr);<br> &nbsp;&nbsp;}<br> &nbsp;&nbsp;return(36);<br> }<br><br> /* Check if valid time is an integer */<br> it = (gaint)(t+0.01);<br> if (fabs((gafloat)it - t)&gt;0.01) {<br> &nbsp;&nbsp;if (verb) {<br> &nbsp;&nbsp;&nbsp;&nbsp;printf("----- Time non-integral. %g %g: ",(gafloat)it,t); &nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;gribpr(ghdr);<br> &nbsp;&nbsp;}<br> &nbsp;&nbsp;return(38);<br> }<br><br> /* Check if valid time matches range of times for this file &nbsp;*/<br> if (it&lt;tmin || it&gt;tmax) {<br> &nbsp;&nbsp;if (verb) {<br> &nbsp;&nbsp;&nbsp;&nbsp;printf("----- Time out of file limits: "); &nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;gribpr(ghdr);<br> &nbsp;&nbsp;}<br> &nbsp;&nbsp;return(39);<br> }<br> it = (it-1)*pfi-&gt;trecs;<br> eoff = (e-1)*pfi-&gt;dnum[3]*pfi-&gt;trecs; &nbsp;/* number of records per ensemble */<br><br> /* See if we can match up this grid with a variable in the data descriptor file */<br> pvar = pfi-&gt;pvar1;<br> i = 0;<br> flag=0;<br> while (i&lt;pfi-&gt;vnum) {<br> &nbsp;&nbsp;if (pvar-&gt;levels&gt;0) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* multi level data */<br> &nbsp;&nbsp;&nbsp;&nbsp;if (dequal(pvar-&gt;units[0],ghdr-&gt;parm,1e-8)==0 &amp;&amp; <br><span class="Apple-tab-span" style="white-space:pre">        </span> dequal(pvar-&gt;units[8],ghdr-&gt;ltyp,1e-8)==0) {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* look for time range indicator match */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (pvar-&gt;units[10] &lt; -900 || dequal(pvar-&gt;units[10],ghdr-&gt;tri,1e-8)==0) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> conv = pfi-&gt;ab2gr[2];<br><span class="Apple-tab-span" style="white-space:pre">        </span> z = conv(pfi-&gt;abvals[2],ghdr-&gt;level);<br><span class="Apple-tab-span" style="white-space:pre">        </span> if (z&gt;0.99 &amp;&amp; z&lt;((gafloat)(pvar-&gt;levels)+0.01)) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;iz = (gaint)(z+0.5);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;/* check if levels match */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;if (fabs(z-(gafloat)iz) &lt; 0.01) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;iz = (gaint)(z+0.5);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;ioff = pvar-&gt;recoff + iz - 1;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;gribfill (eoff,it+ioff,joff,nsiz,ghdr,pindx);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;flag=1;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;i = pfi-&gt;vnum + 1; &nbsp;&nbsp;/* Force loop to stop */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;}<br><span class="Apple-tab-span" style="white-space:pre">        </span> }<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;} <br> &nbsp;&nbsp;else { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* sfc data */<br> &nbsp;&nbsp;&nbsp;&nbsp;if (dequal(pvar-&gt;units[0],ghdr-&gt;parm,1e-8)==0 &amp;&amp; dequal(pvar-&gt;units[8],ghdr-&gt;ltyp,1e-8)==0) {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((pvar-&gt;units[10] &lt; -900 &amp;&amp; <br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;dequal(pvar-&gt;units[9],ghdr-&gt;level,1e-8)==0) ||<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;(pvar-&gt;units[10] &gt; -900 &amp;&amp; <br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;dequal(pvar-&gt;units[9],ghdr-&gt;l1,1e-8)==0 &amp;&amp; dequal(pvar-&gt;units[10],ghdr-&gt;l2,1e-8)==0) || <br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;(dequal(pvar-&gt;units[10],ghdr-&gt;tri,1e-8)==0 &amp;&amp; dequal(pvar-&gt;units[9],ghdr-&gt;level,1e-8)==0)) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> ioff = pvar-&gt;recoff;<br><span class="Apple-tab-span" style="white-space:pre">        </span> gribfill (eoff,it+ioff,joff,nsiz,ghdr,pindx);<br><span class="Apple-tab-span" style="white-space:pre">        </span> i = pfi-&gt;vnum+1; &nbsp;/* Force loop to stop */<br><span class="Apple-tab-span" style="white-space:pre">        </span> flag=1;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;}<br> &nbsp;&nbsp;pvar++; i++;<br> }<br><br> if (flag &amp;&amp; verb) printf("!!!!! MATCH: "); <br> if (!flag &amp;&amp; verb) printf("..... NOOOO: "); <br> if (verb) gribpr(ghdr); <br><br> return (flag ? 0 : 1);<br><br>}<br><br><br>/* Routine to fill in values for this record, now that we have found how it matches. &nbsp;<br> &nbsp;&nbsp;We are not handling the time aspect as yet */<br><br>void gribfill (gaint eoff, gaint ioff, gaint joff, gaint nsiz, struct grhdr *ghdr, struct gaindx *pindx) {<br> &nbsp;ioff = nsiz*(eoff+ioff) + joff;<br> &nbsp;*(pindx-&gt;intpnt+ioff) = ghdr-&gt;dpos;<br> &nbsp;if (ghdr-&gt;bmsflg) *(pindx-&gt;intpnt+ioff+1) = ghdr-&gt;bpos;<br> &nbsp;*(pindx-&gt;intpnt+ioff+2) = ghdr-&gt;bnum;<br> &nbsp;*(pindx-&gt;fltpnt+ioff) &nbsp;&nbsp;= ghdr-&gt;dsf;<br> &nbsp;*(pindx-&gt;fltpnt+ioff+1) = ghdr-&gt;bsf;<br> &nbsp;*(pindx-&gt;fltpnt+ioff+2) = ghdr-&gt;ref;<br>}<br><br><br>/* Routine to print out fields from the grib header */<br><br>void gribpr(struct grhdr *ghdr) {<br> &nbsp;printf ("% 5i % 10ld % 3i % 1i % 5i % 4i % 4i %-5i % 10i % 10i % 3i ",<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;irec,fpos,ghdr-&gt;id,ghdr-&gt;gdsflg,ghdr-&gt;bmsflg,ghdr-&gt;parm,ghdr-&gt;ltyp,<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;ghdr-&gt;level,ghdr-&gt;dpos,ghdr-&gt;bpos,ghdr-&gt;bnum);<br> &nbsp;printf ("btim: %04i%02i%02i%02i:%02i ",ghdr-&gt;btim.yr,<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;ghdr-&gt;btim.mo,ghdr-&gt;btim.dy,ghdr-&gt;btim.hr,ghdr-&gt;btim.mn);<br> &nbsp;printf ("tau: % 6i ",ghdr-&gt;fcstt);<br> &nbsp;printf ("dtim: %04i%02i%02i%02i:%02i ",ghdr-&gt;dtim.yr,<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;ghdr-&gt;dtim.mo,ghdr-&gt;dtim.dy,ghdr-&gt;dtim.hr,ghdr-&gt;dtim.mn);<br> &nbsp;printf("\n");<br>}<br><br><br>/* Routine to write out machine independent grib1 map file */<br><br>gaint wtgmap(void) {<br>gaint i,nb,bcnt,idum;<br>gafloat fdum;<br>unsigned char *map;<br>unsigned char ibmfloat[4];<br><br> /* calculate the size of the version==1 index file */<br> nb = 2 + (4*4) + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* version in byte 2, then 4 ints with number of each data type */<br> &nbsp;&nbsp;pindx-&gt;hinum*sizeof(gaint) +<br> &nbsp;&nbsp;pindx-&gt;hfnum*sizeof(gaint) +<br> &nbsp;&nbsp;pindx-&gt;intnum*sizeof(gaint) +<br> &nbsp;&nbsp;pindx-&gt;fltnum*sizeof(gafloat) ;<br><br> /* add additional info */<br> if (g1ver==2) {<br> &nbsp;&nbsp;nb=nb+7; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* base time (+ sec) &nbsp;for compatibility with earlier version 2 maps */<br> &nbsp;&nbsp;nb=nb+8*4; &nbsp;&nbsp;&nbsp;/* grvals for time &lt;-&gt; grid conversion */<br> }<br><br> /* allocate space for the map */<br> map = (unsigned char *)malloc(nb);<br> if (map == NULL) {<br> &nbsp;&nbsp;fprintf(stderr,"grib1map error: memory allocation error creating the map\n");<br> &nbsp;&nbsp;return(60);<br> }<br><br> /* write out the version number and the sizes of the header and index arrays */<br> bcnt=0;<br> gapby(0,map,bcnt,1); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bcnt++ &nbsp;; &nbsp;&nbsp;/* set the first byte to 0 */<br> gapby(g1ver,map,bcnt,1); &nbsp;bcnt++ &nbsp;; &nbsp;&nbsp;/* set the second byte to the version number */<br> putint(pindx-&gt;hinum,map,&amp;bcnt); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* # ints in header &nbsp;&nbsp;*/<br> putint(pindx-&gt;hfnum,map,&amp;bcnt); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* # floats in header &nbsp;&nbsp;*/<br> putint(pindx-&gt;intnum,map,&amp;bcnt); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* # index ints &nbsp;&nbsp;*/<br> putint(pindx-&gt;fltnum,map,&amp;bcnt); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* # index floats &nbsp;&nbsp;*/<br><br> if (g1ver==2) {<br> &nbsp;&nbsp;/* write out base time for consistency with earlier version 2 maps */<br> &nbsp;&nbsp;/* base time not needed for version 3 */<br> &nbsp;&nbsp;gapby(btimdd.yr,map,bcnt,2); &nbsp;bcnt+=2 ; &nbsp;&nbsp;/* initial year */<br> &nbsp;&nbsp;gapby(btimdd.mo,map,bcnt,1); &nbsp;bcnt++ &nbsp;; &nbsp;&nbsp;/* initial month */ <br> &nbsp;&nbsp;gapby(btimdd.dy,map,bcnt,1); &nbsp;bcnt++ &nbsp;; &nbsp;&nbsp;/* initial day */<br> &nbsp;&nbsp;gapby(btimdd.hr,map,bcnt,1); &nbsp;bcnt++ &nbsp;; &nbsp;&nbsp;/* initial hour */<br> &nbsp;&nbsp;gapby(btimdd.mn,map,bcnt,1); &nbsp;bcnt++ &nbsp;; &nbsp;&nbsp;/* initial minute */<br> &nbsp;&nbsp;gapby(0,map,bcnt,1); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bcnt++ &nbsp;; &nbsp;&nbsp;/* initial second */<br> } <br><br> /* write the header */<br> if (pindx-&gt;hinum) {<br> &nbsp;&nbsp;for (i=0;i&lt;pindx-&gt;hinum;i++) {<br> &nbsp;&nbsp;&nbsp;&nbsp;idum=*(pindx-&gt;hipnt+i);<br> &nbsp;&nbsp;&nbsp;&nbsp;putint(idum,map,&amp;bcnt);<br> &nbsp;&nbsp;}<br> }<br><br> /* write the indices */<br> for (i=0;i&lt;pindx-&gt;intnum;i++) {<br> &nbsp;&nbsp;idum=*(pindx-&gt;intpnt+i);<br> &nbsp;&nbsp;putint(idum,map,&amp;bcnt);<br> }<br> for (i=0;i&lt;pindx-&gt;fltnum;i++) {<br> &nbsp;&nbsp;fdum=*(pindx-&gt;fltpnt+i);<br> &nbsp;&nbsp;rc=flt2ibm(fdum, ibmfloat); <br> &nbsp;&nbsp;if (rc&lt;0) return(601);<br> &nbsp;&nbsp;memcpy(&amp;map[bcnt],ibmfloat,4); bcnt+=4;<br> }<br><br> if (g1ver==2) {<br> &nbsp;&nbsp;/* write out the factors for converting from grid to absolute time */ <br> &nbsp;&nbsp;/* the conversion vals are not needed for version 3 */<br> &nbsp;&nbsp;for (i=0;i&lt;8;i++) {<br> &nbsp;&nbsp;&nbsp;&nbsp;fdum=*(pfi-&gt;grvals[3]+i);<br> &nbsp;&nbsp;&nbsp;&nbsp;rc=flt2ibm(fdum, ibmfloat); <br> &nbsp;&nbsp;&nbsp;&nbsp;if (rc&lt;0) return(601);<br> &nbsp;&nbsp;&nbsp;&nbsp;memcpy(&amp;map[bcnt],ibmfloat,4); bcnt+=4;<br> &nbsp;&nbsp;}<br> } <br><br> /* write to the map file */<br> fwrite(map,1,bcnt,mfile);<br> free(map);<br> return(0);<br><br>}<br><br>/* Routine to dump a 4 byte int into a character stream */<br><br>void putint(gaint dum, unsigned char *buf, gaint *off) {<br> gaint offset;<br><br> offset=*off;<br> if (dum &lt; 0) {<br> &nbsp;&nbsp;dum=-dum;<br> &nbsp;&nbsp;gapby(dum,buf,offset,4);<br> &nbsp;&nbsp;gapbb(1,buf+offset,0,1);<br> } else {<br> &nbsp;&nbsp;gapby(dum,buf,offset,4);<br> }<br> offset+=4;<br> *off=offset;<br><br>}<br><br><br>#if GRIB2<br><br>/* Routine to fill in values for grib2 record, now that we know it matches. */<br>void g2fill (gaint eoff, gaint ioff, gaint ng2elems, g2int iseek, g2int fldnum, <br><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span>struct gag2indx *g2indx) {<br> &nbsp;ioff = ng2elems*(eoff+ioff);<br> &nbsp;*(g2indx-&gt;g2intpnt+ioff+0) = iseek;<br> &nbsp;*(g2indx-&gt;g2intpnt+ioff+1) = fldnum;<br>}<br><br>/* Routine to write out grib2 index file <br><br> &nbsp;&nbsp;&nbsp;&nbsp;g2ver=1 : machine dependent. contains the version number, followed by <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the array size N, followed by the array of N numbers. <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;All are 4-byte integers (type gaint). <br><br> &nbsp;&nbsp;&nbsp;&nbsp;A test to see if byte-swapping is required<span class="Apple-tab-span" style="white-space:pre">        </span>to read the index file is done<br> &nbsp;&nbsp;&nbsp;&nbsp;in gaddes.c, when the data descriptor file is opened. <br>*/<br><br><br>gaint wtg2map(struct gafile *pfi, struct gag2indx *g2indx) {<br> &nbsp;FILE *mfile;<br> &nbsp;gaint rc;<br><br> &nbsp;/* open the index file */<br> &nbsp;mfile = fopen(pfi-&gt;mnam,"wb");<br> &nbsp;if (mfile==NULL) {<br> &nbsp;&nbsp;&nbsp;printf ("error: Unable to open index file: %s\n",pfi-&gt;mnam);<br> &nbsp;&nbsp;&nbsp;return(1);<br> &nbsp;} <br><br> &nbsp;printf("grib2map: Writing out the index file \n");<br> &nbsp;/* write the version number */<br> &nbsp;rc = fwrite(&amp;g2indx-&gt;version, sizeof(gaint),1,mfile);<br> &nbsp;if (rc!=1) {<br> &nbsp;&nbsp;&nbsp;printf("error: Unable to write version number to index file, rc=%d \n",rc);<br> &nbsp;&nbsp;&nbsp;return(1);<br> &nbsp;} &nbsp;<br> &nbsp;/* write the array size */<br> &nbsp;rc = fwrite(&amp;g2indx-&gt;g2intnum,sizeof(gaint),1,mfile);<br> &nbsp;if (rc!=1) {<br> &nbsp;&nbsp;&nbsp;printf("error: Unable to write g2intnum to index file, rc=%d \n",rc);<br> &nbsp;&nbsp;&nbsp;return(1);<br> &nbsp;} &nbsp;<br> &nbsp;/* writhe the array of index values */<br> &nbsp;rc = fwrite(g2indx-&gt;g2intpnt,sizeof(gaint),g2indx-&gt;g2intnum,mfile);<br> &nbsp;if (rc!=g2indx-&gt;g2intnum) {<br> &nbsp;&nbsp;&nbsp;printf("error: Unable to write g2intpnt to index file, rc=%d \n",rc);<br> &nbsp;&nbsp;&nbsp;return(1);<br> &nbsp;} &nbsp;<br> &nbsp;fclose(mfile);<br> &nbsp;return(0);<br><br>}<br><br>/* Checks grid properties for a grib2 field. <br> &nbsp;&nbsp;Returns 0 if ok, 1 if doesn't match descriptor */<br><br>gaint g2grid_check (gribfield *gfld, struct gafile *pfi, gaint r, gaint f) {<br>gaint xsize=0,ysize=0;<br><br> &nbsp;/* Check total number of grid points */<br> &nbsp;if (pfi-&gt;grbgrd==255 || pfi-&gt;grbgrd&lt;-900) {<br> &nbsp;&nbsp;&nbsp;if (((pfi-&gt;ppflag) &amp;&amp; (gfld-&gt;ngrdpts != pfi-&gt;ppisiz * pfi-&gt;ppjsiz)) ||<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((pfi-&gt;ppflag==0) &amp;&amp; (gfld-&gt;ngrdpts != pfi-&gt;dnum[0] * pfi-&gt;dnum[1]))) {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (verb) printf ("number of grid points does not match descriptor ");<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(1);<br> &nbsp;&nbsp;&nbsp;}<br> &nbsp;} <br> &nbsp;/* Check nx and ny for Lat/Lon, Polar Stereographic, and Lambert Conformal grids */<br> &nbsp;if (pfi-&gt;ppflag) {<br> &nbsp;&nbsp;&nbsp;xsize = pfi-&gt;ppisiz;<br> &nbsp;&nbsp;&nbsp;ysize = pfi-&gt;ppjsiz;<br> &nbsp;} else {<br> &nbsp;&nbsp;&nbsp;xsize = pfi-&gt;dnum[0];<br> &nbsp;&nbsp;&nbsp;ysize = pfi-&gt;dnum[1];<br> &nbsp;}<br> &nbsp;if (gfld-&gt;igdtmpl[7] != -1) {<br> &nbsp;&nbsp;&nbsp;if (gfld-&gt;igdtnum==0 || gfld-&gt;igdtnum==40 || gfld-&gt;igdtnum==20 || gfld-&gt;igdtnum==30) {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (gfld-&gt;igdtmpl[7] != xsize) {<br><span class="Apple-tab-span" style="white-space:pre">        </span>if (verb) printf ("x dimensions are not equal: nx=%d xsize=%d",gfld-&gt;igdtmpl[7],xsize); <br><span class="Apple-tab-span" style="white-space:pre">        </span>return(1);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (gfld-&gt;igdtmpl[8] != ysize) {<br><span class="Apple-tab-span" style="white-space:pre">        </span>if (verb) printf ("y dimensions are not equal: nx=%d xsize=%d",gfld-&gt;igdtmpl[8],ysize); <br><span class="Apple-tab-span" style="white-space:pre">        </span>return(1);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;}<br> &nbsp;}<br> &nbsp;return(0);<br>}<br><br>/* Checks time metadata in grib2 message. <br> &nbsp;&nbsp;Returns integer value of time axis index if ok, -99 if not */<br>gaint g2time_check (gribfield *gfld, g2int *listsec1, struct gafile *pfi, <br><span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;gaint r, gaint f, gaint tmin, gaint tmax) {<br> &nbsp;struct dt tref,tfld,tvalid;<br> &nbsp;gaint it,tfield;<br> &nbsp;gafloat t;<br><br> &nbsp;/* Get reference time from Section 1 of GRIB message */<br> &nbsp;tref.yr = listsec1[5];<br> &nbsp;tref.mo = listsec1[6];<br> &nbsp;tref.dy = listsec1[7];<br> &nbsp;tref.hr = listsec1[8];<br> &nbsp;tref.mn = listsec1[9];<br> &nbsp;tfield = tfld.yr = tfld.mo = tfld.dy = tfld.hr = tfld.mn = 0; &nbsp;/* initialize */<br> <span class="Apple-tab-span" style="white-space:pre">        </span> <br> &nbsp;if (notau) {<br> &nbsp;&nbsp;&nbsp;/* use reference time as valid time */<br> &nbsp;&nbsp;&nbsp;tvalid.yr = tref.yr;<br> &nbsp;&nbsp;&nbsp;tvalid.mo = tref.mo;<br> &nbsp;&nbsp;&nbsp;tvalid.dy = tref.dy;<br> &nbsp;&nbsp;&nbsp;tvalid.hr = tref.hr;<br> &nbsp;&nbsp;&nbsp;tvalid.mn = tref.mn;<br> &nbsp;}<br> &nbsp;else {<br> &nbsp;&nbsp;&nbsp;/* For fields at a point in time (PDT&lt;8) */<br> &nbsp;&nbsp;&nbsp;if (gfld-&gt;ipdtnum &lt; 8) {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(gfld-&gt;ipdtmpl[7]== 0) tfld.mn = gfld-&gt;ipdtmpl[8]; &nbsp;&nbsp;&nbsp;&nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (gfld-&gt;ipdtmpl[7]== 13)tfld.mn = gfld-&gt;ipdtmpl[8]*15; &nbsp;&nbsp;/*DWD*/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (gfld-&gt;ipdtmpl[7]== 14)tfld.mn = gfld-&gt;ipdtmpl[8]*30; &nbsp;&nbsp;/*DWD*/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (gfld-&gt;ipdtmpl[7]== 1) tfld.hr = gfld-&gt;ipdtmpl[8];<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (gfld-&gt;ipdtmpl[7]== 2) tfld.dy = gfld-&gt;ipdtmpl[8];<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (gfld-&gt;ipdtmpl[7]== 3) tfld.mo = gfld-&gt;ipdtmpl[8];<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (gfld-&gt;ipdtmpl[7]== 4) tfld.yr = gfld-&gt;ipdtmpl[8];<span class="Apple-tab-span" style="white-space:pre">        </span> <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (gfld-&gt;ipdtmpl[7]==10) tfld.hr = gfld-&gt;ipdtmpl[8]*3; &nbsp;&nbsp;/* 3Hr incr */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (gfld-&gt;ipdtmpl[7]==11) tfld.hr = gfld-&gt;ipdtmpl[8]*6; &nbsp;&nbsp;/* 6Hr incr */ &nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (gfld-&gt;ipdtmpl[7]==12) tfld.hr = gfld-&gt;ipdtmpl[8]*12; &nbsp;/* 2Hr incr */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else tfield=-99;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (tfield==-99) {<br><span class="Apple-tab-span" style="white-space:pre">        </span>/* use reference time as valid time */<br><span class="Apple-tab-span" style="white-space:pre">        </span>tvalid.yr = tref.yr;<br><span class="Apple-tab-span" style="white-space:pre">        </span>tvalid.mo = tref.mo;<br><span class="Apple-tab-span" style="white-space:pre">        </span>tvalid.dy = tref.dy;<br><span class="Apple-tab-span" style="white-space:pre">        </span>tvalid.hr = tref.hr;<br><span class="Apple-tab-span" style="white-space:pre">        </span>tvalid.mn = tref.mn;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else {<br><span class="Apple-tab-span" style="white-space:pre">        </span>/* add forecast time to reference time to get valid time */<br><span class="Apple-tab-span" style="white-space:pre">        </span>timadd(&amp;tref,&amp;tfld);<br><span class="Apple-tab-span" style="white-space:pre">        </span>tvalid.yr = tfld.yr;<br><span class="Apple-tab-span" style="white-space:pre">        </span>tvalid.mo = tfld.mo;<br><span class="Apple-tab-span" style="white-space:pre">        </span>tvalid.dy = tfld.dy;<br><span class="Apple-tab-span" style="white-space:pre">        </span>tvalid.hr = tfld.hr;<br><span class="Apple-tab-span" style="white-space:pre">        </span>tvalid.mn = tfld.mn;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;/* For fields that are statistically processed over a time interval <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.g. averages, accumulations, extremes, et al. (8&lt;=PDT&lt;15) <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;valid time is the end of the overall time interval */<br> &nbsp;&nbsp;&nbsp;else if (gfld-&gt;ipdtnum == 8) {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvalid.yr = gfld-&gt;ipdtmpl[15];<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvalid.mo = gfld-&gt;ipdtmpl[16];<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvalid.dy = gfld-&gt;ipdtmpl[17];<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvalid.hr = gfld-&gt;ipdtmpl[18];<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvalid.mn = gfld-&gt;ipdtmpl[19];<br> &nbsp;&nbsp;&nbsp;}<br>/* &nbsp;&nbsp;&nbsp;&nbsp;else if (gfld-&gt;ipdtnum == 9) { */<br>/* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvalid.yr = gfld-&gt;ipdtmpl[22]; */<br>/* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvalid.mo = gfld-&gt;ipdtmpl[23]; */<br>/* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvalid.dy = gfld-&gt;ipdtmpl[24]; */<br>/* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvalid.hr = gfld-&gt;ipdtmpl[25]; */<br>/* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvalid.mn = gfld-&gt;ipdtmpl[26]; */<br>/* &nbsp;&nbsp;&nbsp;&nbsp;} */<br>/* &nbsp;&nbsp;&nbsp;&nbsp;else if (gfld-&gt;ipdtnum == 10) { */<br>/* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvalid.yr = gfld-&gt;ipdtmpl[16]; */<br>/* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvalid.mo = gfld-&gt;ipdtmpl[17]; */<br>/* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvalid.dy = gfld-&gt;ipdtmpl[18]; */<br>/* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvalid.hr = gfld-&gt;ipdtmpl[19]; */<br>/* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvalid.mn = gfld-&gt;ipdtmpl[20]; */<br>/* &nbsp;&nbsp;&nbsp;&nbsp;} */<br> &nbsp;&nbsp;&nbsp;else if (gfld-&gt;ipdtnum == 11) {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvalid.yr = gfld-&gt;ipdtmpl[18];<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvalid.mo = gfld-&gt;ipdtmpl[19];<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvalid.dy = gfld-&gt;ipdtmpl[20];<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvalid.hr = gfld-&gt;ipdtmpl[21];<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvalid.mn = gfld-&gt;ipdtmpl[22];<br> &nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;else if (gfld-&gt;ipdtnum == 12) {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvalid.yr = gfld-&gt;ipdtmpl[17];<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvalid.mo = gfld-&gt;ipdtmpl[18];<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvalid.dy = gfld-&gt;ipdtmpl[19];<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvalid.hr = gfld-&gt;ipdtmpl[20];<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tvalid.mn = gfld-&gt;ipdtmpl[21];<br> &nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;/* &nbsp;&nbsp;else if (gfld-&gt;ipdtnum == 13) { */<br> &nbsp;&nbsp;&nbsp;/* &nbsp;&nbsp;&nbsp;&nbsp;tvalid.yr = gfld-&gt;ipdtmpl[31]; */<br> &nbsp;&nbsp;&nbsp;/* &nbsp;&nbsp;&nbsp;&nbsp;tvalid.mo = gfld-&gt;ipdtmpl[32]; */<br> &nbsp;&nbsp;&nbsp;/* &nbsp;&nbsp;&nbsp;&nbsp;tvalid.dy = gfld-&gt;ipdtmpl[33]; */<br> &nbsp;&nbsp;&nbsp;/* &nbsp;&nbsp;&nbsp;&nbsp;tvalid.hr = gfld-&gt;ipdtmpl[34]; */<br> &nbsp;&nbsp;&nbsp;/* &nbsp;&nbsp;&nbsp;&nbsp;tvalid.mn = gfld-&gt;ipdtmpl[35]; */<br> &nbsp;&nbsp;&nbsp;/* &nbsp;&nbsp;} */<br> &nbsp;&nbsp;&nbsp;/* &nbsp;&nbsp;else if (gfld-&gt;ipdtnum == 14) { */<br> &nbsp;&nbsp;&nbsp;/* &nbsp;&nbsp;&nbsp;&nbsp;tvalid.yr = gfld-&gt;ipdtmpl[30]; */<br> &nbsp;&nbsp;&nbsp;/* &nbsp;&nbsp;&nbsp;&nbsp;tvalid.mo = gfld-&gt;ipdtmpl[31]; */<br> &nbsp;&nbsp;&nbsp;/* &nbsp;&nbsp;&nbsp;&nbsp;tvalid.dy = gfld-&gt;ipdtmpl[32]; */<br> &nbsp;&nbsp;&nbsp;/* &nbsp;&nbsp;&nbsp;&nbsp;tvalid.hr = gfld-&gt;ipdtmpl[33]; */<br> &nbsp;&nbsp;&nbsp;/* &nbsp;&nbsp;&nbsp;&nbsp;tvalid.mn = gfld-&gt;ipdtmpl[34]; */<br> &nbsp;&nbsp;&nbsp;/* &nbsp;&nbsp;} */<br> &nbsp;&nbsp;&nbsp;else {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Product Definition Template %ld not handled \n",gfld-&gt;ipdtnum);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return(-99);<br> &nbsp;&nbsp;&nbsp;} &nbsp;<br> &nbsp;}<br> &nbsp;/* Check if valid time is within grid limits */<br> &nbsp;t = t2gr(pfi-&gt;abvals[3],&amp;tvalid);<br> &nbsp;if (t&lt;0.99 || t&gt;((gafloat)(pfi-&gt;dnum[3])+0.01)) {<br> &nbsp;&nbsp;&nbsp;if (verb) printf("valid time %4d%02d%02d%02d:%02d (t=%g) is outside grid limits",<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;tvalid.yr,tvalid.mo,tvalid.dy,tvalid.hr,tvalid.mn,t);<br> &nbsp;&nbsp;&nbsp;return(-99);<br> &nbsp;}<br> &nbsp;/* Check if valid time is an integer */<br> &nbsp;it = (gaint)(t+0.01);<br> &nbsp;if (fabs((gafloat)it - t)&gt;0.01) {<br> &nbsp;&nbsp;&nbsp;if (verb) printf("valid time %4d%02d%02d%02d:%02d (t=%g) has non-integer grid index",<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;tvalid.yr,tvalid.mo,tvalid.dy,tvalid.hr,tvalid.mn,t);<br> &nbsp;&nbsp;&nbsp;return(-99);<br> &nbsp;}<br> &nbsp;/* Check if valid time matches range of times for this file &nbsp;*/<br> &nbsp;if (it&lt;tmin || it&gt;tmax) {<br> &nbsp;&nbsp;&nbsp;if (verb) printf("valid time %4d%02d%02d%02d:%02d (it=%d) is outside file limits (%d-%d)",<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;tvalid.yr,tvalid.mo,tvalid.dy,tvalid.hr,tvalid.mn,it,tmin,tmax);<br> &nbsp;&nbsp;&nbsp;return(-99);<br> &nbsp;}<br> &nbsp;return (it);<br>}<br><br>/* Loops over variables in descriptor file, looking for match to current grib2 field. <br> &nbsp;&nbsp;If variables match, returns offset, if not, returns -999 */<br><br>gaint g2var_match (gribfield *gfld, struct gafile *pfi, gaint sp) {<br> &nbsp;struct gavar *pvar;<br> &nbsp;gadouble lev1,lev2,z;<br> &nbsp;gadouble (*conv) (gadouble *, gadouble);<br> &nbsp;gaint rc1,rc2,rc3,rc4,rc5;<br> &nbsp;gaint i,ioff,iz;<br><br> &nbsp;/* Get level values from grib field */<br> &nbsp;lev1 = scaled2dbl(gfld-&gt;ipdtmpl[10],gfld-&gt;ipdtmpl[11]);<br> &nbsp;/* Check if we've got info on 2nd level */<br> &nbsp;if (gfld-&gt;ipdtmpl[12] != 255) <br> &nbsp;&nbsp;&nbsp;lev2 = scaled2dbl(gfld-&gt;ipdtmpl[13],gfld-&gt;ipdtmpl[14]);<br> &nbsp;else <br> &nbsp;&nbsp;&nbsp;lev2 = -999;<br><br> &nbsp;/* See if we match any variables in the descriptor file */<br> &nbsp;pvar = pfi-&gt;pvar1;<br> &nbsp;ioff = -999;<br> &nbsp;i = 0;<br> &nbsp;while (i&lt;pfi-&gt;vnum) {<br> &nbsp;&nbsp;&nbsp;if (pvar-&gt;levels&gt;0) { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* Z-varying data */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc1 = dequal(pvar-&gt;units[0],(gadouble)gfld-&gt;discipline,1e-8); /* discipline */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc2 = dequal(pvar-&gt;units[1],(gadouble)gfld-&gt;ipdtmpl[0],1e-8); /* category &nbsp;&nbsp;*/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc3 = dequal(pvar-&gt;units[2],(gadouble)gfld-&gt;ipdtmpl[1],1e-8); /* number &nbsp;&nbsp;&nbsp;&nbsp;*/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc4 = dequal(pvar-&gt;units[3],(gadouble)sp,1e-8);<span class="Apple-tab-span" style="white-space:pre">        </span><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;/* SP &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc5 = dequal(pvar-&gt;units[8],(gadouble)gfld-&gt;ipdtmpl[9],1e-8); /* LTYPE1 &nbsp;&nbsp;&nbsp;&nbsp;*/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (rc1==0 &amp;&amp; rc2==0 &amp;&amp; rc3==0 &amp;&amp; rc4==0 &amp;&amp; rc5==0) { &nbsp;&nbsp;/* all the above match */<br><span class="Apple-tab-span" style="white-space:pre">        </span><br><span class="Apple-tab-span" style="white-space:pre">        </span>/* get a Z value for level 1 */<br><span class="Apple-tab-span" style="white-space:pre">        </span>conv = pfi-&gt;ab2gr[2];<br><span class="Apple-tab-span" style="white-space:pre">        </span>z = conv(pfi-&gt;abvals[2],lev1);<br><span class="Apple-tab-span" style="white-space:pre">        </span>if (z&gt;0.99 &amp;&amp; z&lt;((gadouble)(pvar-&gt;levels)+0.01)) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;iz = (gaint)(z+0.5);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;/* make sure Z value for level 1 is an integer */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;if (fabs(z-(gadouble)iz) &lt; 0.01) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;ioff = pvar-&gt;recoff + iz - 1;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;return(ioff); <br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;}<br><span class="Apple-tab-span" style="white-space:pre">        </span>}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;else { &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* non-Z-varying data */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc1 = dequal(pvar-&gt;units[0],(gadouble)gfld-&gt;discipline,1e-8); /* discipline */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc2 = dequal(pvar-&gt;units[1],(gadouble)gfld-&gt;ipdtmpl[0],1e-8); /* category &nbsp;&nbsp;*/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc3 = dequal(pvar-&gt;units[2],(gadouble)gfld-&gt;ipdtmpl[1],1e-8); /* number &nbsp;&nbsp;&nbsp;&nbsp;*/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc4 = dequal(pvar-&gt;units[3],(gadouble)sp,1e-8); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* SP &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rc5 = dequal(pvar-&gt;units[8],(gadouble)gfld-&gt;ipdtmpl[9],1e-8); /* LTYPE1 &nbsp;&nbsp;&nbsp;&nbsp;*/<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (rc1==0 &amp;&amp; rc2==0 &amp;&amp; rc3==0 &amp;&amp; rc4==0 &amp;&amp; rc5==0) { &nbsp;&nbsp;/* all the above match */<br><span class="Apple-tab-span" style="white-space:pre">        </span><br><span class="Apple-tab-span" style="white-space:pre">        </span>/* check if level value(s) match those given in descriptor file */<br><span class="Apple-tab-span" style="white-space:pre">        </span>if (<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;(pvar-&gt;units[9] &lt; -900) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* LVAL not given */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;|| &nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;(pvar-&gt;units[10] &lt; -900 &amp;&amp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* LVAL2 not given */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;dequal(pvar-&gt;units[9],lev1,1e-8)==0) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* and LVAL1 matches */ <br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;|| &nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;(pvar-&gt;units[10] &gt; -900 &amp;&amp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* LVAL2 is given */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;dequal(pvar-&gt;units[9],lev1,1e-8)==0 &amp;&amp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* and LVAL1 matches */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;dequal(pvar-&gt;units[10],lev2,1e-8)==0) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* and LVAL2 matches */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;||<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;(pvar-&gt;units[10] &gt; -900 &amp;&amp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* LVAL2 is given */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;pvar-&gt;units[11] &gt; -900 &amp;&amp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* LTYPE2 is given */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;dequal(pvar-&gt;units[9],lev1,1e-8)==0 &amp;&amp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* and LVAL1 matches */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;dequal(pvar-&gt;units[10],lev2,1e-8)==0 &amp;&amp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* and LVAL2 matches */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;dequal(pvar-&gt;units[11],gfld-&gt;ipdtmpl[12],1e-8)==0) &nbsp;&nbsp;/* and LTYPE2 matches */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;) { <br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;ioff = pvar-&gt;recoff;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;return(ioff);<br><span class="Apple-tab-span" style="white-space:pre">        </span>}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;pvar++; i++;<br> &nbsp;} &nbsp;/* end of loop over variables in descriptor file */<br> &nbsp;return(ioff);<br>}<br><br>/* Loops over ensembles to see if ensemble codes match current grib2 field <br> &nbsp;&nbsp;If size of ensemble dimension is 1, no checks are done, returns e=1.<br> &nbsp;&nbsp;Returns ensemble index e if codes are present and match, -999 otherwise */<br>gaint g2ens_match (gribfield *gfld, struct gafile *pfi) {<br> &nbsp;struct gaens *ens;<br> &nbsp;gaint e;<br> &nbsp;e=1;<br> &nbsp;if (pfi-&gt;dnum[4]==1) {<br> &nbsp;&nbsp;&nbsp;e=1;<br> &nbsp;&nbsp;&nbsp;return(e); <br> &nbsp;}<br> &nbsp;else {<br> &nbsp;&nbsp;&nbsp;for (e=1,ens=pfi-&gt;ens1; e&lt;=pfi-&gt;dnum[4]; e++,ens++) {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* PDT 0 or 8 and no grib codes */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (ens-&gt;grbcode[0]==-999 &amp;&amp; ens-&gt;grbcode[1]==-999 &amp;&amp; <br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;(gfld-&gt;ipdtnum==0 || gfld-&gt;ipdtnum==8)) { &nbsp;&nbsp;&nbsp;<br><span class="Apple-tab-span" style="white-space:pre">        </span>if (verb) printf("pdt=%d ",gfld-&gt;ipdtnum);<br><span class="Apple-tab-span" style="white-space:pre">        </span>return(e);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (ens-&gt;grbcode[0]&gt;-900) {<br><span class="Apple-tab-span" style="white-space:pre">        </span>if (ens-&gt;grbcode[1]&gt;-900) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;/* PDT 1 or 11 */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;if ((gfld-&gt;ipdtnum==1 || gfld-&gt;ipdtnum==11) &amp;&amp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((ens-&gt;grbcode[0] == gfld-&gt;ipdtmpl[15]) &amp;&amp; <br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ens-&gt;grbcode[1] == gfld-&gt;ipdtmpl[16]))) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;if (verb) printf("pdt=%d ens=%d,%d ",gfld-&gt;ipdtnum,ens-&gt;grbcode[0],ens-&gt;grbcode[1]);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;return(e);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;}<br><span class="Apple-tab-span" style="white-space:pre">        </span>}<br><span class="Apple-tab-span" style="white-space:pre">        </span>else {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;/* PDT 2 or 12 */<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;if ((gfld-&gt;ipdtnum==2 || gfld-&gt;ipdtnum==12) &amp;&amp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(ens-&gt;grbcode[0] == gfld-&gt;ipdtmpl[15])) {<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;if (verb) printf("pdt=%d ens=%d ",gfld-&gt;ipdtnum,ens-&gt;grbcode[0]);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;&nbsp;return(e);<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;}<br><span class="Apple-tab-span" style="white-space:pre">        </span>}<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;if (verb) {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("pdt=%d ",gfld-&gt;ipdtnum);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (gfld-&gt;ipdtnum==1 || gfld-&gt;ipdtnum==11) <br><span class="Apple-tab-span" style="white-space:pre">        </span>printf("ens=%d,%d ",gfld-&gt;ipdtmpl[15],gfld-&gt;ipdtmpl[16]);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (gfld-&gt;ipdtnum==2 || gfld-&gt;ipdtnum==12) <br><span class="Apple-tab-span" style="white-space:pre">        </span>printf("ens=%d ",gfld-&gt;ipdtmpl[15]);<br> &nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;return(-999);<br> &nbsp;}<br>}<br><br>/* Checks ensemble codes, if provided in descriptor file. <br> &nbsp;&nbsp;Returns 0 if ok or not provided, 1 if codes don't match. */<br>gaint g2ens_check (struct gaens *ens, gribfield *gfld) {<br> &nbsp;/* print out ensemble info */<br> &nbsp;if (verb) {<br> &nbsp;&nbsp;&nbsp;printf("pdt=%d ",gfld-&gt;ipdtnum);<br> &nbsp;&nbsp;&nbsp;if (gfld-&gt;ipdtnum==1 || gfld-&gt;ipdtnum==11) <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("ens=%d,%d ",gfld-&gt;ipdtmpl[15],gfld-&gt;ipdtmpl[16]);<br> &nbsp;&nbsp;&nbsp;if (gfld-&gt;ipdtnum==2 || gfld-&gt;ipdtnum==12) <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("ens=%d ",gfld-&gt;ipdtmpl[15]);<br> &nbsp;}<br> &nbsp;if (ens-&gt;grbcode[0]&gt;-900) {<br> &nbsp;&nbsp;&nbsp;if (ens-&gt;grbcode[1]&gt;-900) {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* PDT 1 or 11 */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((gfld-&gt;ipdtnum==1 || gfld-&gt;ipdtnum==11) &amp;&amp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;((ens-&gt;grbcode[0] == gfld-&gt;ipdtmpl[15]) &amp;&amp; <br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;&nbsp;(ens-&gt;grbcode[1] == gfld-&gt;ipdtmpl[16]))) return(0);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else return(1);<br> &nbsp;&nbsp;&nbsp;}<br> &nbsp;&nbsp;&nbsp;else {<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* PDT 2 or 12 */<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((gfld-&gt;ipdtnum==2 || gfld-&gt;ipdtnum==12) &amp;&amp;<br><span class="Apple-tab-span" style="white-space:pre">        </span> &nbsp;(ens-&gt;grbcode[0] == gfld-&gt;ipdtmpl[15])) return(0);<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else return(1);<br> &nbsp;&nbsp;&nbsp;}<br> &nbsp;}<br> &nbsp;/* PDT 0 or 8 and no grib codes */<br> &nbsp;if (ens-&gt;grbcode[0]==-999 &amp;&amp; ens-&gt;grbcode[1]==-999 &amp;&amp;<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(gfld-&gt;ipdtnum==0 || gfld-&gt;ipdtnum==8)) return(0);<br> &nbsp;else return(1);<br>}<br><br>/* Gets the statistical process used to derive a variable.<br> &nbsp;&nbsp;returns -999 for variables "at a point in time" */<br>gaint g2sp (gribfield *gfld) {<br> &nbsp;gaint sp;<br> &nbsp;sp = -999;<br> &nbsp;if (gfld-&gt;ipdtnum == &nbsp;8) sp = gfld-&gt;ipdtmpl[23];<br> &nbsp;if (gfld-&gt;ipdtnum == &nbsp;9) sp = gfld-&gt;ipdtmpl[30];<br> &nbsp;if (gfld-&gt;ipdtnum == 10) sp = gfld-&gt;ipdtmpl[24];<br> &nbsp;if (gfld-&gt;ipdtnum == 11) sp = gfld-&gt;ipdtmpl[26];<br> &nbsp;if (gfld-&gt;ipdtnum == 12) sp = gfld-&gt;ipdtmpl[25];<br> &nbsp;if (sp==255) sp = -999;<br> &nbsp;return(sp);<br>}<br><br>/* prints out relevant info from a grib2 record */<br>void g2prnt (gribfield *gfld, gaint r, g2int f, gaint sp) {<br> &nbsp;/* print record/field number */<br> &nbsp;printf("%d.%ld: ",r,f);<br> &nbsp;/* print level info */<br> &nbsp;if (gfld-&gt;ipdtmpl[10]==-127) <br> &nbsp;&nbsp;&nbsp;printf("lev1=%ld ",gfld-&gt;ipdtmpl[9]); /* just print the level1 type */<br> &nbsp;else<br> &nbsp;&nbsp;&nbsp;printf("lev1=%ld,%g ",gfld-&gt;ipdtmpl[9],scaled2dbl(gfld-&gt;ipdtmpl[10],gfld-&gt;ipdtmpl[11]));<br><br> &nbsp;if (gfld-&gt;ipdtmpl[12]&lt;255) {<br> &nbsp;&nbsp;&nbsp;if (gfld-&gt;ipdtmpl[13]==-127) <br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("lev1=%ld ",gfld-&gt;ipdtmpl[12]); /* just print the level2 type */<br> &nbsp;&nbsp;&nbsp;else<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("lev2=%ld,%g ",gfld-&gt;ipdtmpl[12],scaled2dbl(gfld-&gt;ipdtmpl[13],gfld-&gt;ipdtmpl[14])); <br> &nbsp;}<br> &nbsp;/* print variable info */<br> &nbsp;if (sp==-999)<br> &nbsp;&nbsp;&nbsp;printf("var=%ld,%ld,%ld ",gfld-&gt;discipline,gfld-&gt;ipdtmpl[0],gfld-&gt;ipdtmpl[1]);<br> &nbsp;else<br> &nbsp;&nbsp;&nbsp;printf("var=%ld,%ld,%ld,%d ",gfld-&gt;discipline,gfld-&gt;ipdtmpl[0], gfld-&gt;ipdtmpl[1],sp);<br>}<br><br><br>#endif &nbsp;/* matches #if GRIB2 */<br><br><br><br>_______________________________________________<br>gradsusr mailing list<br><a href="mailto:gradsusr@gradsusr.org">gradsusr@gradsusr.org</a><br>http://gradsusr.org/mailman/listinfo/gradsusr<br></blockquote></div><br><div apple-content-edited="true"> <span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><div style="word-wrap: break-word; -khtml-nbsp-mode: space; -khtml-line-break: after-white-space; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><span class="Apple-style-span" style="border-collapse: separate; border-spacing: 0px 0px; color: rgb(0, 0, 0); font-family: Helvetica; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; text-align: auto; -khtml-text-decorations-in-effect: none; text-indent: 0px; -apple-text-size-adjust: auto; text-transform: none; orphans: 2; white-space: normal; widows: 2; word-spacing: 0px; "><div>--</div><div>Jennifer M. Adams</div><div>IGES/COLA</div><div>4041 Powder Mill Road, Suite 302</div><div>Calverton, MD 20705</div><div><a href="mailto:jma@cola.iges.org">jma@cola.iges.org</a></div><div><br class="khtml-block-placeholder"></div><br class="Apple-interchange-newline"></span></span></div></span> </div><br></div></body></html>