00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00022
00023
00024 #include <stdio.h>
00025 #include <stdlib.h>
00026 #include <math.h>
00027 #include <string.h>
00028
00029
00030 #include "sundials_types.h"
00031 #include "nvector_serial.h"
00032
00033
00034 #include "pihm.h"
00035 #include "calib.h"
00036
00037
00038 realtype satD_CALIB;
00039 realtype br_CALIB;
00040 realtype poros_CALIB;
00041 realtype icsat_CALIB;
00042 realtype rivEle_CALIB;
00043
00044 int lbool;
00046
00047
00048
00049 void initialize(char *filename, Model_Data DS, Control_Data *CS, N_Vector CV_Y)
00051
00056 {
00057 int i,j,counterMin, counterMax, MINCONST, domcounter;
00058 realtype a_x, a_y, b_x, b_y, c_x, c_y, MAXCONST;
00059 realtype a_zmin, a_zmax, b_zmin, b_zmax, c_zmin, c_zmax;
00060 realtype tempvalue;
00061 FILE *int_file;
00062 char *fn;
00063
00064 realtype *zmin_cor;
00065
00066
00067 satD_CALIB = setsatD_CALIB();
00068 br_CALIB = setbr_CALIB();
00069 poros_CALIB = setporos_CALIB();
00070 icsat_CALIB = seticsat_CALIB();
00071 rivEle_CALIB = setrivEle_CALIB();
00072
00073 zmin_cor=(realtype *)malloc(DS->NumEle*sizeof(realtype));
00074
00075 printf("\nInitializing data structure ... ");
00076
00077 for(i=0; i<DS->NumEle; i++)
00078 {
00079 a_x = DS->Node[DS->Ele[i].node[0]-1].x;
00080 b_x = DS->Node[DS->Ele[i].node[1]-1].x;
00081 c_x = DS->Node[DS->Ele[i].node[2]-1].x;
00082 a_y = DS->Node[DS->Ele[i].node[0]-1].y;
00083 b_y = DS->Node[DS->Ele[i].node[1]-1].y;
00084 c_y = DS->Node[DS->Ele[i].node[2]-1].y;
00085
00086 a_zmin = DS->Node[DS->Ele[i].node[0]-1].zmin;
00087 b_zmin = DS->Node[DS->Ele[i].node[1]-1].zmin;
00088 c_zmin = DS->Node[DS->Ele[i].node[2]-1].zmin;
00089 a_zmax = DS->Node[DS->Ele[i].node[0]-1].zmax;
00090 b_zmax = DS->Node[DS->Ele[i].node[1]-1].zmax;
00091 c_zmax = DS->Node[DS->Ele[i].node[2]-1].zmax;
00092
00093
00094 MINCONST = 10000000;
00095 MAXCONST = -1000000;
00096 for(j=0; j<3; j++)
00097 {
00098 if(DS->Node[DS->Ele[i].node[j]-1].zmin<MINCONST)
00099 {
00100 MINCONST=DS->Node[DS->Ele[i].node[j]-1].zmin;
00101 counterMin=j;
00102 }
00103 if(DS->Node[DS->Ele[i].node[j]-1].zmax>MAXCONST)
00104 {
00105 MAXCONST=DS->Node[DS->Ele[i].node[j]-1].zmax;
00106 counterMax=j;
00107 }
00108 }
00109 DS->Ele[i].NodeZmin= DS->Node[DS->Ele[i].node[counterMin]-1].zmin;
00110 DS->Ele[i].NodeZmax= DS->Node[DS->Ele[i].node[counterMax]-1].zmax;
00111 DS->Ele[i].NodeDist= sqrt(pow(DS->Node[DS->Ele[i].node[counterMin]-1].x-DS->Node[DS->Ele[i].node[counterMax]-1].x,2)+pow(DS->Node[DS->Ele[i].node[counterMin]-1].y-DS->Node[DS->Ele[i].node[counterMax]-1].y,2));
00112
00113 DS->Ele[i].area = 0.5*((b_x - a_x)*(c_y - a_y) - (b_y - a_y)*(c_x - a_x));
00114
00115 DS->Ele[i].zmax = (a_zmax + b_zmax + c_zmax)/3.0;
00116 DS->Ele[i].zmin = (a_zmin + b_zmin + c_zmin)/3.0;
00117
00118
00119
00120
00121
00122 DS->Ele[i].x = (a_x + b_x + c_x)/3.0;
00123 DS->Ele[i].y = (a_y + b_y + c_y)/3.0;
00124
00125
00126
00127 DS->Ele[i].edge[0] = pow((b_x - c_x), 2) + pow((b_y - c_y), 2);
00128 DS->Ele[i].edge[1] = pow((c_x - a_x), 2) + pow((c_y - a_y), 2);
00129 DS->Ele[i].edge[2] = pow((a_x - b_x), 2) + pow((a_y - b_y), 2);
00130
00131
00132
00133
00134
00135
00136 DS->Ele[i].edge[0] = sqrt(DS->Ele[i].edge[0]);
00137 DS->Ele[i].edge[1] = sqrt(DS->Ele[i].edge[1]);
00138 DS->Ele[i].edge[2] = sqrt(DS->Ele[i].edge[2]);
00139
00140
00141 DS->Ele[i].windH = DS->WindH[DS->Ele[i].WindVel - 1];
00142
00143
00144 }
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164 DS->FluxSurf = (realtype **)malloc(DS->NumEle*sizeof(realtype));
00165 DS->FluxSub = (realtype **)malloc(DS->NumEle*sizeof(realtype));
00166 DS->FluxRiv = (realtype **)malloc(DS->NumRiv*sizeof(realtype));
00167 DS->EleET = (realtype **)malloc(DS->NumEle*sizeof(realtype));
00168
00169 for(i=0; i<DS->NumEle; i++)
00170 {
00171 DS->FluxSurf[i] = (realtype *)malloc(3*sizeof(realtype));
00172 DS->FluxSub[i] = (realtype *)malloc(3*sizeof(realtype));
00173 DS->EleET[i] = (realtype *)malloc(4*sizeof(realtype));
00174 }
00175
00176 for(i=0; i<DS->NumRiv; i++)
00177 {
00178 DS->FluxRiv[i] = (realtype *)malloc(6*sizeof(realtype));
00179 }
00180
00181 DS->ElePrep = (realtype *)malloc(DS->NumEle*sizeof(realtype));
00182 DS->EleVic = (realtype *)malloc(DS->NumEle*sizeof(realtype));
00183 DS->Recharge = (realtype *)malloc(DS->NumEle*sizeof(realtype));
00184 DS->EleIS = (realtype *)malloc(DS->NumEle*sizeof(realtype));
00185 DS->EleISmax = (realtype *)malloc(DS->NumEle*sizeof(realtype));
00186 DS->EleSnow = (realtype *)malloc(DS->NumEle*sizeof(realtype));
00187 DS->EleTF = (realtype *)malloc(DS->NumEle*sizeof(realtype));
00188 DS->Ele2IS = (realtype *)malloc(DS->NumEle*sizeof(realtype));
00189 DS->EleNetPrep = (realtype *)malloc(DS->NumEle*sizeof(realtype));
00190
00191 for(i=0; i<DS->NumEle; i++)
00192 {
00193 DS->Ele[i].Ksat = DS->Soil[(DS->Ele[i].soil-1)].Ksat;
00194 DS->Ele[i].Porosity = DS->Soil[(DS->Ele[i].soil-1)].SitaS -
00195 DS->Soil[(DS->Ele[i].soil-1)].SitaR;
00196 DS->Ele[i].Porosity = poros_CALIB*DS->Ele[i].Porosity;
00197 DS->Ele[i].Alpha = DS->Soil[(DS->Ele[i].soil-1)].Alpha;
00198 DS->Ele[i].Beta = DS->Soil[(DS->Ele[i].soil-1)].Beta;
00199 DS->Ele[i].Sf = DS->Soil[(DS->Ele[i].soil-1)].Sf;
00200 DS->Ele[i].RzD=DS->Soil[DS->Ele[i].soil-1].RzD>(DS->Ele[i].zmax-DS->Ele[i].zmin)?0.5*(DS->Ele[i].zmax-DS->Ele[i].zmin):DS->Soil[DS->Ele[i].soil-1].RzD;
00201
00202 DS->Ele[i].LAImax = DS->LandC[DS->Ele[i].LC-1].LAImax;
00203 DS->Ele[i].Rmin = DS->LandC[DS->Ele[i].LC-1].Rmin;
00204 DS->Ele[i].Rs_ref = DS->LandC[DS->Ele[i].LC-1].Rs_ref;
00205 DS->Ele[i].Albedo = DS->LandC[DS->Ele[i].LC-1].Albedo;
00206 DS->Ele[i].VegFrac = DS->LandC[DS->Ele[i].LC-1].VegFrac;
00207 DS->Ele[i].Rough = DS->LandC[DS->Ele[i].LC-1].Rough;
00208 }
00209
00210 for(i=0; i<DS->NumRiv; i++)
00211 {
00212 DS->Riv[i].x = (DS->Node[DS->Riv[i].FromNode-1].x +
00213 DS->Node[DS->Riv[i].ToNode-1].x)/2;
00214 DS->Riv[i].y = (DS->Node[DS->Riv[i].FromNode-1].y +
00215 DS->Node[DS->Riv[i].ToNode-1].y)/2;
00216 DS->Riv[i].zmax = (DS->Node[DS->Riv[i].FromNode-1].zmax + DS->Node[DS->Riv[i].ToNode-1].zmax)/2;
00217
00218 DS->Riv[i].depth = DS->Riv_Shape[DS->Riv[i].shape-1].depth;
00219 DS->Riv[i].zmin = DS->Riv[i].zmax - DS->Riv[i].depth;
00220
00221 DS->Riv[i].Length = sqrt(pow(DS->Node[DS->Riv[i].FromNode-1].x -
00222 DS->Node[DS->Riv[i].ToNode-1].x, 2) +
00223 pow(DS->Node[DS->Riv[i].FromNode-1].y -
00224 DS->Node[DS->Riv[i].ToNode-1].y, 2));
00225 }
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244 if (CS->int_type == 0)
00245 {
00246 for(i=0; i<DS->NumEle; i++)
00247 {
00248 DS->EleIS[i] = 0;
00249 NV_Ith_S(CV_Y, i) = 0;
00250 NV_Ith_S(CV_Y, i + DS->NumEle) = (1/DS->Ele[i].Alpha)*(1-exp(-DS->Ele[i].Alpha*(0.1+0.05)));
00251
00252 NV_Ith_S(CV_Y, i + 2*DS->NumEle) = DS->Ele[i].zmax - DS->Ele[i].zmin - 0.1;
00253
00254 }
00255
00256 for(i=0; i<DS->NumRiv; i++)
00257 {
00258 NV_Ith_S(CV_Y, i + 3*DS->NumEle) = 0;
00259 }
00260 }
00261
00262 else if (CS->int_type == 1)
00263 {
00264 if(DS->UnsatMode ==1)
00265 {
00266 for(i=0; i<DS->NumEle; i++)
00267 {
00268 DS->EleIS[i] = DS->Ele_IC[i].interception;
00269 DS->EleSnow[i]=DS->Ele_IC[i].snow;
00270 NV_Ith_S(CV_Y, i) = DS->Ele_IC[i].surf;
00271 NV_Ith_S(CV_Y, i + DS->NumEle) = DS->Ele_IC[i].sat;
00272 }
00273
00274 for(i=0; i<DS->NumRiv; i++)
00275 {
00276 NV_Ith_S(CV_Y, i + 2*DS->NumEle) = DS->Riv_IC[DS->Riv[i].IC-1].value;
00277
00278 }
00279 }
00280 if(DS->UnsatMode ==2)
00281 {
00282 for(i=0; i<DS->NumEle; i++)
00283 {
00284
00285
00286 DS->Ele_IC[i].sat= (DS->Ele[i].zmax-(br_CALIB*(1.0-icsat_CALIB)))>DS->Ele[i].zmin?(DS->Ele[i].zmax-DS->Ele[i].zmin-(br_CALIB*(1.0-icsat_CALIB))):(DS->Ele[i].zmax-DS->Ele[i].zmin)/2.0;
00287 DS->EleIS[i] = DS->Ele_IC[i].interception;
00288 NV_Ith_S(CV_Y, i) = DS->Ele_IC[i].surf;
00289
00290 DS->Ele_IC[i].sat=(DS->Ele[i].zmax - DS->Ele[i].zmin)-(DS->Ele_IC[i].sat+satD_CALIB)>0?((DS->Ele_IC[i].sat+satD_CALIB)<0?0.0:(DS->Ele_IC[i].sat+satD_CALIB)):(DS->Ele[i].zmax - DS->Ele[i].zmin)-0.01;
00291
00292 NV_Ith_S(CV_Y, i + DS->NumEle) = DS->Ele_IC[i].unsat+(1-exp(-1.0*DS->Ele[i].Alpha*((DS->Ele[i].zmax - DS->Ele[i].zmin)-DS->Ele_IC[i].sat)))/DS->Ele[i].Alpha;
00293
00294 NV_Ith_S(CV_Y, i + 2*DS->NumEle) = DS->Ele_IC[i].sat;
00295
00296
00297 if ((NV_Ith_S(CV_Y, i + DS->NumEle) + NV_Ith_S(CV_Y, i + 2*DS->NumEle)) >= (DS->Ele[i].zmax - DS->Ele[i].zmin))
00298 {
00299 NV_Ith_S(CV_Y, i + DS->NumEle) = ((DS->Ele[i].zmax - DS->Ele[i].zmin) - NV_Ith_S(CV_Y, i + 2*DS->NumEle))*0.9;
00300
00301 if (NV_Ith_S(CV_Y, i + DS->NumEle) < 0)
00302 {
00303 NV_Ith_S(CV_Y, i + DS->NumEle) = 0;
00304 }
00305 }
00306 }
00307
00308 for(i=0; i<DS->NumRiv; i++)
00309 {
00310 NV_Ith_S(CV_Y, i + 3*DS->NumEle) = DS->Riv_IC[DS->Riv[i].IC-1].value;
00311
00312
00313
00314
00315 }
00316 }
00317 }
00318
00319 else if(CS->int_type == 2)
00320 {
00321 fn = (char *)malloc((strlen(filename)+4)*sizeof(char));
00322 strcpy(fn, filename);
00323 int_file = fopen(strcat(fn, ".int"), "r");
00324
00325 if(int_file == NULL)
00326 {
00327 printf("\n Fatal Error: %s.int is in use or does not exist!\n", filename);
00328 exit(1);
00329 }
00330 else
00331 {
00332 for(i=0; i<DS->NumEle; i++)
00333 {
00334 fscanf(int_file, "%lf", &tempvalue);
00335 if(tempvalue <= 0) {tempvalue = 0.01;}
00336 NV_Ith_S(CV_Y, i + DS->NumEle) = tempvalue;
00337 }
00338
00339 for(i=0; i<DS->NumEle; i++)
00340 {
00341 fscanf(int_file, "%lf", &tempvalue);
00342 if(tempvalue <= 0) {tempvalue = 0.01;}
00343 if(tempvalue >= (DS->Ele[i].zmax - DS->Ele[i].zmin)) {tempvalue = (DS->Ele[i].zmax - DS->Ele[i].zmin) - 0.01;}
00344 NV_Ith_S(CV_Y, i + 2*DS->NumEle) = tempvalue;
00345 }
00346
00347 for(i=0; i<DS->NumEle; i++)
00348 {
00349 DS->EleIS[i] = 0;
00350 NV_Ith_S(CV_Y, i) = 0;
00351 }
00352
00353 for(i=0; i<DS->NumRiv; i++)
00354 {
00355 NV_Ith_S(CV_Y, i + 3*DS->NumEle) = 0;
00356 }
00357 }
00358 fclose(int_file);
00359 }
00360
00361
00362
00363
00364 else if(CS->int_type == 3)
00365 {
00366
00367 fn = (char *)malloc((strlen(filename)+5)*sizeof(char));
00368 strcpy(fn, filename);
00369 int_file = fopen(strcat(fn, ".init"), "r");
00370
00371 if(int_file == NULL)
00372 {
00373 printf("\n Fatal Error: %s.int is in use or does not exist!\n", filename);
00374 exit(1);
00375 }
00376 else
00377 {
00378 fscanf(int_file, "%lf", &tempvalue);
00379
00380 if(tempvalue != CS->StartTime){
00381 printf("\n Fatal Error: Initial time in .init file does not match start time\n");
00382 exit(1);
00383 }
00384
00385 if(DS->UnsatMode == 1)
00386 {
00387 for(i=0; i<DS->NumEle; i++)
00388 {
00389 fscanf(int_file, "%lf", &tempvalue);
00390 DS->EleIS[i] = tempvalue;
00391 fscanf(int_file, "%lf", &tempvalue);
00392 DS->EleSnow[i]=tempvalue;
00393 fscanf(int_file, "%lf", &tempvalue);
00394 NV_Ith_S(CV_Y, i) = tempvalue;
00395
00396 fscanf(int_file, "%lf", &tempvalue);
00397 NV_Ith_S(CV_Y, i + DS->NumEle) = tempvalue;
00398 }
00399
00400 for(i=0; i<DS->NumRiv; i++)
00401 {
00402 fscanf(int_file, "%lf", &tempvalue);
00403 NV_Ith_S(CV_Y, i + 2*DS->NumEle) = tempvalue;
00404 }
00405 }
00406 if(DS->UnsatMode == 2)
00407 {
00408 for(i=0; i<DS->NumEle; i++)
00409 {
00410 fscanf(int_file, "%lf", &tempvalue);
00411 DS->EleIS[i] = tempvalue;
00412 fscanf(int_file, "%lf", &tempvalue);
00413 DS->EleSnow[i]=tempvalue;
00414 fscanf(int_file, "%lf", &tempvalue);
00415 NV_Ith_S(CV_Y, i) = tempvalue;
00416 fscanf(int_file, "%lf", &tempvalue);
00417 NV_Ith_S(CV_Y, i + DS->NumEle) = tempvalue;
00418 fscanf(int_file, "%lf", &tempvalue);
00419 NV_Ith_S(CV_Y, i + 2*DS->NumEle) = tempvalue;
00420 }
00421
00422 for(i=0; i<DS->NumRiv; i++)
00423 {
00424 fscanf(int_file, "%lf", &tempvalue);
00425 NV_Ith_S(CV_Y, i + 3*DS->NumEle) = tempvalue;
00426 }
00427 }
00428 }
00429 }
00430
00431 printf("done.\n");
00432 }
00433