Main Page   Compound List   File List   Compound Members   File Members  

LiveFuelMoist.c

Go to the documentation of this file.
00001 
00025 #include "LiveFuelMoist.h"
00026 
00027 int GetLiveFuelMoistFIXEDFromProps(ChHashTable * proptbl, int year, int month, int day,
00028                                             unsigned int row, unsigned int col, 
00029                                             double * lhfm, double * lwfm)   {
00030     /* static variables used to store state across function calls */
00031     static int syear                = -1;
00032     static int smonth               = 0;
00033     static int sday                 = 0;
00034     static int slh_srec             = 0;
00035     static int slw_srec             = 0;
00036     static double slhfm             = 0.0;
00037     static double slwfm             = 0.0;
00038     static DblTwoDArray * slhfm_tbl = NULL;
00039     static DblTwoDArray * slwfm_tbl = NULL;
00040     /* stack variables */
00041     KeyVal * entry                  = NULL;             /* key/val instances from table */
00042     FILE * fstream                  = NULL;             /* file stream */
00043     
00044     if ( (smonth != month) || (sday != day) )   {
00045         /* new live herbaceous fuel moisture table needed */
00046         if ( slhfm_tbl == NULL )    {
00047             /* lh annual mean only needs to be initialized once */
00048             if ( ChHashTableRetrieve(proptbl, GetFireProp(PROP_LFMHFILE), (void *)&entry) ) {
00049                 ERR_ERROR("Unable to retrieve LIVE_FUEL_MOIST_HERB_FILE property. \n", ERR_EINVAL);
00050                 }
00051             /* open file */
00052             if ( (fstream = fopen((char *) entry->val, "r")) == NULL )  {
00053                 ERR_ERROR("Unable to open file containing live herbaceous fuel moistures. \n", ERR_EIOFAIL);
00054                 }       
00055             /* create the table of values */
00056             if ( (slhfm_tbl = GetDblTwoDArrayTableFStreamIO(fstream, 
00057                     LIVE_FUEL_MOIST_SEP_CHARS, LIVE_FUEL_MOIST_COMMENT_CHAR)) == NULL ) {
00058                 fclose(fstream);
00059                 ERR_ERROR("Unable to initialize historical Live Fuel Moisture table. \n", ERR_EFAILED);
00060                 }
00061             fclose(fstream);
00062             }
00063         /* new live woody fuel moisture table needed */
00064         if ( slwfm_tbl == NULL )    {
00065             /* lw annual stdev only needs to be initialized once */
00066             if ( ChHashTableRetrieve(proptbl, GetFireProp(PROP_LFMWFILE), (void *)&entry) ) {
00067                 ERR_ERROR("Unable to retrieve LIVE_FUEL_MOIST_WOOD_FILE property. \n", ERR_EINVAL);
00068                 }
00069             /* open file */
00070             if ( (fstream = fopen((char *) entry->val, "r")) == NULL )  {
00071                 ERR_ERROR("Unable to open file containing live woody fuel moistures. \n", ERR_EIOFAIL);
00072                 }
00073             /* create the table of values */
00074             if ( (slwfm_tbl = GetDblTwoDArrayTableFStreamIO(fstream, 
00075                     LIVE_FUEL_MOIST_SEP_CHARS, LIVE_FUEL_MOIST_COMMENT_CHAR)) == NULL ) {
00076                 fclose(fstream);
00077                 ERR_ERROR("Unable to initialize historical Live Fuel Moisture table. \n", ERR_EFAILED);
00078                 }
00079             fclose(fstream);                    
00080             }       
00081         
00082         /* start new year */
00083         if ( syear != year )    {
00084             /* set current record numbers */
00085             slh_srec = 0;
00086             slw_srec = 0;
00087             /* advance to current date in table */
00088             if ( AdvanceRecToDate(slhfm_tbl, month, day, &slh_srec) 
00089                 || AdvanceRecToDate(slwfm_tbl, month, day, &slw_srec) ) {
00090                 ERR_ERROR("Unable to find current date in data table. \n", ERR_EBADFUNC);
00091                 }
00092             /* get first live herb */
00093             slhfm = DBLTWODARRAY_GET_DATA(slhfm_tbl, slh_srec, LIVE_FUEL_MOIST_FIXED_VAL_TBL_INDEX);
00094             slhfm /= 100.0;
00095             slh_srec++;         
00096             /* get first live woody */
00097             slwfm = DBLTWODARRAY_GET_DATA(slwfm_tbl, slw_srec, LIVE_FUEL_MOIST_FIXED_VAL_TBL_INDEX);
00098             slwfm /= 100.0;
00099             slw_srec++;         
00100             /* set year */
00101             syear = year;
00102             /* WA: stop warnings from unused vars */
00103             row = col = 0;              
00104             }
00105         
00106         /* see if live herb table contains value for this day */
00107         if ( (slh_srec < DBLTWODARRAY_SIZE_ROW(slhfm_tbl))
00108                 && (month == DBLTWODARRAY_GET_DATA(slhfm_tbl, slh_srec, LIVE_FUEL_MOIST_MO_TBL_INDEX))
00109                 && (day == DBLTWODARRAY_GET_DATA(slhfm_tbl, slh_srec, LIVE_FUEL_MOIST_DY_TBL_INDEX)) )  {
00110             slhfm = DBLTWODARRAY_GET_DATA(slhfm_tbl, slh_srec, LIVE_FUEL_MOIST_FIXED_VAL_TBL_INDEX);
00111             slhfm /= 100.0;
00112             slh_srec++;
00113             }
00114 
00115         /* see if live woody table contains value for this day */
00116         if ( (slw_srec < DBLTWODARRAY_SIZE_ROW(slwfm_tbl))
00117                 && (month == DBLTWODARRAY_GET_DATA(slwfm_tbl, slw_srec, LIVE_FUEL_MOIST_MO_TBL_INDEX))
00118                 && (day == DBLTWODARRAY_GET_DATA(slwfm_tbl, slw_srec, LIVE_FUEL_MOIST_DY_TBL_INDEX)) )  {
00119             slwfm = DBLTWODARRAY_GET_DATA(slwfm_tbl, slw_srec, LIVE_FUEL_MOIST_FIXED_VAL_TBL_INDEX);
00120             slwfm /= 100.0;
00121             slw_srec++;
00122             }
00123                     
00124         /* set {month, day} for future calls */
00125         smonth = month;
00126         sday = day;
00127         }
00128 
00129     *lhfm = slhfm;
00130     *lwfm = slwfm;
00131         
00132     return ERR_SUCCESS;
00133     }
00134                                                                                     
00135 int GetLiveFuelMoistRANDHFromProps(ChHashTable * proptbl, int year, int month, int day,
00136                                             unsigned int row, unsigned int col,
00137                                             double * lhfm, double * lwfm)   {
00138     /* static variables used to store state across function calls */
00139     static int syear                = -1;
00140     static int smonth               = 0;
00141     static int sday                 = 0;
00142     static int slh_srec             = 0;
00143     static int slw_srec             = 0;
00144     static double slhfm             = 0.0;
00145     static double slwfm             = 0.0;
00146     static DblTwoDArray * slhfm_tbl = NULL;
00147     static DblTwoDArray * slwfm_tbl = NULL;
00148     static double slh_amean         = -1.0;
00149     static double slh_asdev         = -1.0;
00150     static double slw_amean         = -1.0;
00151     static double slw_asdev         = -1.0; 
00152     static double slh_Z             = -1.0;
00153     static double slw_Z             = -1.0;
00154     /* stack variables */
00155     KeyVal * entry                  = NULL;             /* key/val instances from table */
00156     char * val                      = NULL;             /* val associated with keywords in file */
00157     FILE * fstream                  = NULL;             /* file stream */
00158     
00159     if ( (smonth != month) || (sday != day) )   {
00160         /* new live herbaceous fuel moisture table needed */
00161         if ( slhfm_tbl == NULL )    {
00162             /* lh annual mean only needs to be initialized once */
00163             if ( ChHashTableRetrieve(proptbl, GetFireProp(PROP_LFMHFILE), (void *)&entry) ) {
00164                 ERR_ERROR("Unable to retrieve LIVE_FUEL_MOIST_HERB_FILE property. \n", ERR_EINVAL);
00165                 }
00166             /* open file */
00167             if ( (fstream = fopen((char *) entry->val, "r")) == NULL )  {
00168                 ERR_ERROR("Unable to open file containing live herbaceous fuel moistures. \n", ERR_EIOFAIL);
00169                 }
00170             /* retrieve string mean stored in */
00171             val = GetValFromKeyStringFStreamIO(fstream, LIVE_FUEL_MOIST_KEYWORD_ANNMEAN, 
00172                                     LIVE_FUEL_MOIST_SEP_CHARS, LIVE_FUEL_MOIST_COMMENT_CHAR);
00173             slh_amean = atof(val);
00174             free(val);
00175             /* retrieve string stdev stored in */
00176             val = GetValFromKeyStringFStreamIO(fstream, LIVE_FUEL_MOIST_KEYWORD_ANNSTDEV, 
00177                                     LIVE_FUEL_MOIST_SEP_CHARS, LIVE_FUEL_MOIST_COMMENT_CHAR);
00178             slh_asdev = atof(val);
00179             free(val);
00180             /* create the table of values */
00181             if ( (slhfm_tbl = GetDblTwoDArrayTableFStreamIO(fstream, 
00182                     LIVE_FUEL_MOIST_SEP_CHARS, LIVE_FUEL_MOIST_COMMENT_CHAR)) == NULL ) {
00183                 fclose(fstream);
00184                 ERR_ERROR("Unable to initialize historical Live Fuel Moisture table. \n", ERR_EFAILED);
00185                 }
00186             fclose(fstream);
00187             }
00188         /* new live woody fuel moisture table needed */
00189         if ( slwfm_tbl == NULL )    {
00190             /* lw annual mean only needs to be initialized once */
00191             if ( ChHashTableRetrieve(proptbl, GetFireProp(PROP_LFMWFILE), (void *)&entry) ) {
00192                 ERR_ERROR("Unable to retrieve LIVE_FUEL_MOIST_WOOD_FILE property. \n", ERR_EINVAL);
00193                 }
00194             /* open file */
00195             if ( (fstream = fopen((char *) entry->val, "r")) == NULL )  {
00196                 ERR_ERROR("Unable to open file containing live woody fuel moistures. \n", ERR_EIOFAIL);
00197                 }
00198             /* retrieve string mean stored in */
00199             val = GetValFromKeyStringFStreamIO(fstream, LIVE_FUEL_MOIST_KEYWORD_ANNMEAN, 
00200                                     LIVE_FUEL_MOIST_SEP_CHARS, LIVE_FUEL_MOIST_COMMENT_CHAR);
00201             slw_amean = atof(val);
00202             free(val);
00203             /* retrieve string stdev stored in */
00204             val = GetValFromKeyStringFStreamIO(fstream, LIVE_FUEL_MOIST_KEYWORD_ANNSTDEV, 
00205                                     LIVE_FUEL_MOIST_SEP_CHARS, LIVE_FUEL_MOIST_COMMENT_CHAR);
00206             slw_asdev = atof(val);
00207             free(val);
00208             /* create the table of values */
00209             if ( (slwfm_tbl = GetDblTwoDArrayTableFStreamIO(fstream, 
00210                     LIVE_FUEL_MOIST_SEP_CHARS, LIVE_FUEL_MOIST_COMMENT_CHAR)) == NULL ) {
00211                 fclose(fstream);
00212                 ERR_ERROR("Unable to initialize historical Live Fuel Moisture table. \n", ERR_EFAILED);
00213                 }
00214             fclose(fstream);                    
00215             }       
00216         
00217         /* start new year */
00218         if ( syear != year )    {
00219             /* set annual normalization factors */
00220             slh_Z = (randg(slh_amean, slh_asdev) - slh_amean) / slh_asdev;
00221             slw_Z = (randg(slw_amean, slw_asdev) - slw_amean) / slw_asdev;
00222             /* set current record numbers */
00223             slh_srec = 0;
00224             slw_srec = 0;
00225             /* advance to current date in table */
00226             if ( AdvanceRecToDate(slhfm_tbl, month, day, &slh_srec) 
00227                 || AdvanceRecToDate(slwfm_tbl, month, day, &slw_srec) ) {
00228                 ERR_ERROR("Unable to find current date in data table. \n", ERR_EBADFUNC);
00229                 }
00230             /* get first live herb */
00231             slhfm = (slh_Z * DBLTWODARRAY_GET_DATA(slhfm_tbl, slh_srec, LIVE_FUEL_MOIST_STDEV_TBL_INDEX)) +
00232                     DBLTWODARRAY_GET_DATA(slhfm_tbl, slh_srec, LIVE_FUEL_MOIST_MEAN_TBL_INDEX);
00233             slhfm /= 100.0;
00234             slh_srec++;         
00235             /* get first live woody */
00236             slwfm = (slw_Z * DBLTWODARRAY_GET_DATA(slwfm_tbl, slw_srec, LIVE_FUEL_MOIST_STDEV_TBL_INDEX)) +
00237                     DBLTWODARRAY_GET_DATA(slwfm_tbl, slw_srec, LIVE_FUEL_MOIST_MEAN_TBL_INDEX);
00238             slwfm /= 100.0;
00239             slw_srec++;                     
00240             /* set year */          
00241             syear = year;
00242             /* WA: stop warnings from unused vars */
00243             row = col = 0;              
00244             }
00245         
00246         /* see if live herb table contains value for this day */
00247         if ( (slh_srec < DBLTWODARRAY_SIZE_ROW(slhfm_tbl))
00248                 && (month == DBLTWODARRAY_GET_DATA(slhfm_tbl, slh_srec, LIVE_FUEL_MOIST_MO_TBL_INDEX))
00249                 && (day == DBLTWODARRAY_GET_DATA(slhfm_tbl, slh_srec, LIVE_FUEL_MOIST_DY_TBL_INDEX)) )  {
00250             slhfm = (slh_Z * DBLTWODARRAY_GET_DATA(slhfm_tbl, slh_srec, LIVE_FUEL_MOIST_STDEV_TBL_INDEX)) +
00251                     DBLTWODARRAY_GET_DATA(slhfm_tbl, slh_srec, LIVE_FUEL_MOIST_MEAN_TBL_INDEX);
00252             slhfm /= 100.0;
00253             slh_srec++;
00254             }
00255 
00256         /* see if live woody table contains value for this day */
00257         if ( (slw_srec < DBLTWODARRAY_SIZE_ROW(slwfm_tbl))
00258                 && (month == DBLTWODARRAY_GET_DATA(slwfm_tbl, slw_srec, LIVE_FUEL_MOIST_MO_TBL_INDEX))
00259                 && (day == DBLTWODARRAY_GET_DATA(slwfm_tbl, slw_srec, LIVE_FUEL_MOIST_DY_TBL_INDEX)) )  {
00260             slwfm = (slw_Z * DBLTWODARRAY_GET_DATA(slwfm_tbl, slw_srec, LIVE_FUEL_MOIST_STDEV_TBL_INDEX)) +
00261                     DBLTWODARRAY_GET_DATA(slwfm_tbl, slw_srec, LIVE_FUEL_MOIST_MEAN_TBL_INDEX);
00262             slwfm /= 100.0;
00263             slw_srec++;
00264             }
00265                     
00266         /* set {month, day} for future calls */
00267         smonth = month;
00268         sday = day;
00269         }
00270 
00271     *lhfm = slhfm;
00272     *lwfm = slwfm;
00273         
00274     return ERR_SUCCESS;
00275     }                       
00276 
00277 int GetLiveFuelMoistSPATIALFromProps(ChHashTable * proptbl, int year, int month, int day,
00278                                             unsigned int row, unsigned int col,
00279                                             double * lhfm, double * lwfm)   {
00280     /* WA: stop warnings from unused vars */    
00281     year = month = day = row = col = 0;
00282     *lhfm = *lwfm = 0.0;    
00283     if ( proptbl == NULL )  
00284         ERR_ERROR("Simulation properties table not initialized. \n", ERR_EINVAL);
00285     ERR_ERROR("SPATIAL option for LIVE_FUEL_MOIST_TYPE not yet implemented. \n", ERR_EUNIMPL);
00286     }
00287     
00288 int AdvanceRecToDate(DblTwoDArray * da, int month, int day, int * rec)  {
00289     int found = 0;
00290     
00291     /*check args */
00292     if ( da == NULL || DBLTWODARRAY_SIZE_ROW(da) < 1 )  {
00293         ERR_ERROR("Table of array values not initialized, unable to advance to current date in table. \n", ERR_EINVAL);
00294         }
00295     
00296     /* increment records until day and month is found */
00297     while ( *rec < DBLTWODARRAY_SIZE_ROW(da) )  {
00298         /* identical match found */
00299         if ( month == DBLTWODARRAY_GET_DATA(da, *rec, LIVE_FUEL_MOIST_MO_TBL_INDEX)
00300             && day == DBLTWODARRAY_GET_DATA(da, *rec, LIVE_FUEL_MOIST_DY_TBL_INDEX) )   {
00301             found = 1;
00302             break;
00303             }
00304         /* no identical match, if possible get previous record in table */
00305         if ( month <= DBLTWODARRAY_GET_DATA(da, *rec, LIVE_FUEL_MOIST_MO_TBL_INDEX)
00306             && day <= DBLTWODARRAY_GET_DATA(da, *rec, LIVE_FUEL_MOIST_DY_TBL_INDEX) )   {
00307             if ( *rec != 0 )    {
00308                 *rec = *rec - 1;
00309                 }
00310             found = 1;
00311             break;
00312             }   
00313         *rec = *rec + 1;
00314         }
00315         
00316     /* if day and month were not found, assign last date in file */
00317     if ( found == 0 )   {
00318         *rec = DBLTWODARRAY_SIZE_ROW(da) - 1;
00319         }
00320         
00321     return ERR_SUCCESS;
00322     }                       
00323                                              
00324 /* end of LiveFuelMoist.c */

Generated at Fri Jun 22 00:46:51 2001 for HFire by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000