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
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
00041 KeyVal * entry = NULL;
00042 FILE * fstream = NULL;
00043
00044 if ( (smonth != month) || (sday != day) ) {
00045
00046 if ( slhfm_tbl == NULL ) {
00047
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
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
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
00064 if ( slwfm_tbl == NULL ) {
00065
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
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
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
00083 if ( syear != year ) {
00084
00085 slh_srec = 0;
00086 slw_srec = 0;
00087
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
00093 slhfm = DBLTWODARRAY_GET_DATA(slhfm_tbl, slh_srec, LIVE_FUEL_MOIST_FIXED_VAL_TBL_INDEX);
00094 slhfm /= 100.0;
00095 slh_srec++;
00096
00097 slwfm = DBLTWODARRAY_GET_DATA(slwfm_tbl, slw_srec, LIVE_FUEL_MOIST_FIXED_VAL_TBL_INDEX);
00098 slwfm /= 100.0;
00099 slw_srec++;
00100
00101 syear = year;
00102
00103 row = col = 0;
00104 }
00105
00106
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
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
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
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
00155 KeyVal * entry = NULL;
00156 char * val = NULL;
00157 FILE * fstream = NULL;
00158
00159 if ( (smonth != month) || (sday != day) ) {
00160
00161 if ( slhfm_tbl == NULL ) {
00162
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
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
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
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
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
00189 if ( slwfm_tbl == NULL ) {
00190
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
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
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
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
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
00218 if ( syear != year ) {
00219
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
00223 slh_srec = 0;
00224 slw_srec = 0;
00225
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
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
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
00241 syear = year;
00242
00243 row = col = 0;
00244 }
00245
00246
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
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
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
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
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
00297 while ( *rec < DBLTWODARRAY_SIZE_ROW(da) ) {
00298
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
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
00317 if ( found == 0 ) {
00318 *rec = DBLTWODARRAY_SIZE_ROW(da) - 1;
00319 }
00320
00321 return ERR_SUCCESS;
00322 }
00323
00324