00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00026 
00027 
00028 #include <stdio.h>
00029 #include <stdlib.h>
00030 #include <math.h>
00031 #include <string.h>
00032 
00033 
00034 #include "sundials_types.h"
00035 #include "pihm.h"
00036 #include "calib.h"
00037 
00038 
00039 
00040 
00041 
00042 
00043 
00044 void read_alloc(char *filename, Model_Data DS, Control_Data *CS)
00046 
00050 {
00051     int i, j;
00052     int tempindex;
00053 
00054     int NumTout; 
00055     char *fn[8];
00056     char tempchar[5];
00057 
00058     FILE *mesh_file;                        
00059     FILE *att_file;                         
00060     FILE *forc_file;                        
00061     FILE *ibc_file;                         
00062     FILE *soil_file;                        
00063     FILE *lc_file;                          
00064     FILE *para_file;                        
00065     FILE *riv_file;                         
00066 
00067     
00068         realtype roughEle_CALIB;
00069         realtype roughRiv_CALIB;
00070         realtype rivCoeff_CALIB;
00071         realtype rivDepth_CALIB;
00072         realtype alpha_CALIB;
00073         realtype set_MP;
00074         realtype lai_CALIB;
00075         realtype vegfrac_CALIB;
00076     realtype albedo_CALIB;
00077 
00078     
00079     roughEle_CALIB=setroughEle_CALIB();
00080     roughRiv_CALIB=setroughRiv_CALIB();
00081     rivCoeff_CALIB=setrivCoeff_CALIB();
00082     rivDepth_CALIB=setrivDepth_CALIB();
00083     alpha_CALIB=setalpha_CALIB();
00084     set_MP=setset_MP();
00085     lai_CALIB=setlai_CALIB();
00086     vegfrac_CALIB=setvegfrac_CALIB();
00087     albedo_CALIB=setalbedo_CALIB();
00088 
00089 
00090     printf("\nStart reading in input files ... \n");
00091 
00092     
00093     
00094     
00095     printf("\n  1) reading %s.mesh ... ", filename);
00096     fn[0] = (char *)malloc((strlen(filename)+5)*sizeof(char));
00097     strcpy(fn[0], filename);
00098     mesh_file = fopen(strcat(fn[0], ".mesh"), "r");
00099 
00100     if(mesh_file == NULL)
00101     {
00102         printf("\n  Fatal Error: %s.mesh is in use or does not exist!\n", filename);
00103         exit(1);
00104     }
00105 
00106     
00107     fscanf(mesh_file,"%d %d", &DS->NumEle, &DS->NumNode);
00108 
00109     DS->Ele = (element *)malloc(DS->NumEle*sizeof(element));          
00110     DS->Node = (nodes *)malloc(DS->NumNode*sizeof(nodes));            
00111 
00112     
00113     for (i=0; i<DS->NumEle; i++)
00114     {
00115         fscanf(mesh_file, "%d", &(DS->Ele[i].index));
00116         fscanf(mesh_file, "%d %d %d", &(DS->Ele[i].node[0]), &(DS->Ele[i].node[1]), &(DS->Ele[i].node[2]));
00117         fscanf(mesh_file, "%d %d %d", &(DS->Ele[i].nabr[0]), &(DS->Ele[i].nabr[1]), &(DS->Ele[i].nabr[2]));
00118     }
00119 
00120     
00121     for (i=0; i<DS->NumNode; i++)
00122     {
00123         fscanf(mesh_file, "%d", &(DS->Node[i].index));
00124         fscanf(mesh_file, "%lf %lf", &(DS->Node[i].x), &(DS->Node[i].y));
00125         fscanf(mesh_file, "%lf %lf", &(DS->Node[i].zmin),&(DS->Node[i].zmax));
00126     }
00127 
00128     printf("done.\n");
00129 
00130     fclose(mesh_file);
00131     
00132 
00133     
00134     
00135     
00136     printf("\n  2) reading %s.att  ... ", filename);
00137     fn[1] = (char *)malloc((strlen(filename)+4)*sizeof(char));
00138     strcpy(fn[1], filename);
00139     att_file = fopen(strcat(fn[1], ".att"), "r");
00140 
00141     if(att_file == NULL)
00142     {
00143         printf("\n  Fatal Error: %s.att is in use or does not exist!\n", filename);
00144         exit(1);
00145     }
00146 
00147     
00148     DS->Ele_IC = (element_IC *)malloc(DS->NumEle*sizeof(element_IC));
00149 
00150     for (i=0; i<DS->NumEle; i++)
00151     {
00152         fscanf(att_file, "%d", &(tempindex));
00153         fscanf(att_file, "%d %d", &(DS->Ele[i].soil), &(DS->Ele[i].LC));            
00154         fscanf(att_file, "%lf %lf %lf %lf %lf",&(DS->Ele_IC[i].interception),&(DS->Ele_IC[i].snow),&(DS->Ele_IC[i].surf),&(DS->Ele_IC[i].unsat),&(DS->Ele_IC[i].sat));
00155                                                                                     
00156         fscanf(att_file, "%d", &(DS->Ele[i].BC));                                   
00157         
00158         fscanf(att_file, "%d %d", &(DS->Ele[i].prep), &(DS->Ele[i].temp));          
00159         fscanf(att_file, "%d %d", &(DS->Ele[i].humidity), &(DS->Ele[i].WindVel));   
00160         fscanf(att_file, "%d %d", &(DS->Ele[i].Rn), &(DS->Ele[i].G));               
00161         fscanf(att_file, "%d %d", &(DS->Ele[i].pressure), &(DS->Ele[i].source));    
00162     }
00163 
00164     printf("done.\n");
00165 
00166     fclose(att_file);
00167     
00168 
00169     
00170     
00171     
00172     printf("\n  3) reading %s.soil ... ", filename);
00173     fn[2] = (char *)malloc((strlen(filename)+5)*sizeof(char));
00174     strcpy(fn[2], filename);
00175     soil_file = fopen(strcat(fn[2], ".soil"), "r");
00176 
00177     if(soil_file == NULL)
00178     {
00179         printf("\n  Fatal Error: %s.soil is in use or does not exist!\n", filename);
00180         exit(1);
00181     }
00182 
00183     
00184     fscanf(soil_file, "%d", &DS->NumSoil);
00185 
00186     DS->Soil = (soils *)malloc(DS->NumSoil*sizeof(soils));
00187 
00188     for (i=0; i<DS->NumSoil; i++)
00189     {
00190         fscanf(soil_file, "%d", &(DS->Soil[i].index));
00191         fscanf(soil_file, "%lf", &(DS->Soil[i].Ksat));                                
00192         fscanf(soil_file, "%lf %lf", &(DS->Soil[i].SitaS), &(DS->Soil[i].SitaR));     
00193         fscanf(soil_file, "%lf %lf", &(DS->Soil[i].Alpha), &(DS->Soil[i].Beta));      
00194         fscanf(soil_file, "%d %lf %lf", &(DS->Soil[i].Macropore), &(DS->Soil[i].base), &(DS->Soil[i].gama));
00195                                                                                       
00196         fscanf(soil_file, "%lf", &(DS->Soil[i].Sf));                                  
00197         fscanf(soil_file, "%lf", &(DS->Soil[i].RzD));                                 
00198         fscanf(soil_file, "%d", &(DS->Soil[i].Inf));
00199 
00200         
00201         DS->Soil[i].Alpha=alpha_CALIB*DS->Soil[i].Alpha;
00202         DS->Soil[i].Macropore=set_MP;
00203     }
00204 
00205     fscanf(soil_file, "%d", &DS->NumInc);
00206 
00207     DS->TSD_Inc = (TSD *)malloc(DS->NumInc*sizeof(TSD));
00208 
00209     for(i=0; i<DS->NumInc; i++)
00210     {
00211         fscanf(soil_file, "%s %d %d", DS->TSD_Inc[i].name, &DS->TSD_Inc[i].index,
00212                                   &DS->TSD_Inc[i].length);
00213 
00214         DS->TSD_Inc[i].TS = (realtype **)malloc(DS->TSD_Inc[i].length*sizeof(realtype));
00215         for(j=0; j<DS->TSD_Inc[i].length; j++)
00216         {
00217             DS->TSD_Inc[i].TS[j] = (realtype *)malloc(2*sizeof(realtype));
00218         }
00219 
00220         for(j=0; j<DS->TSD_Inc[i].length; j++)
00221         {
00222             fscanf(soil_file, "%lf %lf", &DS->TSD_Inc[i].TS[j][0],
00223                                    &DS->TSD_Inc[i].TS[j][1]);
00224         }
00225     }
00226 
00227     fclose(soil_file);
00228     printf("done.\n");
00229     
00230 
00231 
00232     
00233     
00234     
00235     printf("\n  3) reading %s.lc ... ", filename);
00236     fn[3] = (char *)malloc((strlen(filename)+5)*sizeof(char));
00237     strcpy(fn[3], filename);
00238     lc_file = fopen(strcat(fn[3], ".lc"), "r");
00239 
00240     if(lc_file == NULL)
00241     {
00242         printf("\n  Fatal Error: %s.land cover is in use or does not exist!\n", filename);
00243         exit(1);
00244     }
00245 
00246     
00247     fscanf(lc_file, "%d", &DS->NumLC);                                                    
00248 
00249     DS->LandC = (LC *)malloc(DS->NumLC*sizeof(LC));
00250 
00251     for (i=0; i<DS->NumLC; i++)
00252     {
00253         fscanf(lc_file, "%d", &(DS->LandC[i].index));
00254         fscanf(lc_file, "%lf", &(DS->LandC[i].LAImax));                                   
00255         fscanf(lc_file, "%lf %lf", &(DS->LandC[i].Rmin), &(DS->LandC[i].Rs_ref));         
00256         fscanf(lc_file, "%lf %lf", &(DS->LandC[i].Albedo), &(DS->LandC[i].VegFrac));      
00257         fscanf(lc_file, "%lf", &(DS->LandC[i].Rough));                                    
00258 
00259         
00260         DS->LandC[i].VegFrac=vegfrac_CALIB*DS->LandC[i].VegFrac;
00261         DS->LandC[i].Albedo=albedo_CALIB*DS->LandC[i].Albedo>1.0?1.0:albedo_CALIB*DS->LandC[i].Albedo;
00262         DS->LandC[i].Rough=roughEle_CALIB*DS->LandC[i].Rough;
00263     }
00264 
00265     fclose(lc_file);
00266     printf("done.\n");
00267     
00268 
00269     
00270     
00271     
00272     printf("\n  4) reading %s.riv  ... ", filename);
00273     fn[4] = (char *)malloc((strlen(filename)+4)*sizeof(char));
00274     strcpy(fn[4], filename);
00275     riv_file =  fopen(strcat(fn[4], ".riv"), "r");
00276 
00277     if(riv_file == NULL)
00278     {
00279         printf("\n  Fatal Error: %s.riv is in use or does not exist!\n", filename);
00280         exit(1);
00281     }
00282 
00283     
00284     fscanf(riv_file, "%d", &DS->NumRiv);
00285 
00286     DS->Riv = (river_segment *)malloc(DS->NumRiv*sizeof(river_segment));
00287     DS->Riv_IC = (river_IC *)malloc(DS->NumRiv*sizeof(river_IC));
00288 
00289     for (i=0; i<DS->NumRiv; i++)
00290     {
00291         fscanf(riv_file, "%d", &(DS->Riv[i].index));
00292         fscanf(riv_file, "%d %d", &(DS->Riv[i].FromNode), &(DS->Riv[i].ToNode));         
00293         fscanf(riv_file, "%d", &(DS->Riv[i].down));                                      
00294         fscanf(riv_file, "%d %d", &(DS->Riv[i].LeftEle), &(DS->Riv[i].RightEle));        
00295         fscanf(riv_file, "%d %d", &(DS->Riv[i].shape), &(DS->Riv[i].material));          
00296         fscanf(riv_file, "%d %d", &(DS->Riv[i].IC), &(DS->Riv[i].BC));                   
00297         fscanf(riv_file, "%d", &(DS->Riv[i].reservoir));                                 
00298     }
00299 
00300     fscanf(riv_file, "%s %d", tempchar, &DS->NumRivShape);                               
00301     DS->Riv_Shape = (river_shape *)malloc(DS->NumRivShape*sizeof(river_shape));          
00302 
00303     for (i=0; i<DS->NumRivShape; i++)
00304     {
00305         fscanf(riv_file, "%d %lf", &DS->Riv_Shape[i].index, &DS->Riv_Shape[i].width);    
00306         fscanf(riv_file, "%lf %lf", &DS->Riv_Shape[i].depth, &DS->Riv_Shape[i].bed);     
00307         fscanf(riv_file, "%d %lf",&DS->Riv_Shape[i].interpOrd,&DS->Riv_Shape[i].coeff);  
00308 
00309         
00310         DS->Riv_Shape[i].depth = rivDepth_CALIB*DS->Riv_Shape[i].depth;
00311         DS->Riv_Shape[i].coeff = rivCoeff_CALIB*DS->Riv_Shape[i].coeff;
00312     }
00313 
00314     fscanf(riv_file, "%s %d", tempchar, &DS->NumRivMaterial);                            
00315     DS->Riv_Mat = (river_material *)malloc(DS->NumRivMaterial*sizeof(river_material));   
00316 
00317     for (i=0; i<DS->NumRivMaterial; i++)
00318     {
00319         fscanf(riv_file, "%d %lf %lf %lf", &DS->Riv_Mat[i].index, &DS->Riv_Mat[i].Rough, &DS->Riv_Mat[i].Cwr, &DS->Riv_Mat[i].Sf);
00320                                                               
00321 
00322         
00323         DS->Riv_Mat[i].Rough=roughRiv_CALIB*DS->Riv_Mat[i].Rough;
00324     }
00325 
00326     fscanf(riv_file, "%s %d", tempchar, &DS->NumRivIC);                                  
00327     DS->Riv_IC = (river_IC *)malloc(DS->NumRivIC*sizeof(river_IC));                      
00328 
00329     for (i=0; i<DS->NumRivIC; i++)
00330     {
00331         fscanf(riv_file, "%d %lf", &DS->Riv_IC[i].index, &DS->Riv_IC[i].value);          
00332     }
00333 
00334     fscanf(riv_file, "%s %d", tempchar, &DS->NumRivBC);                                  
00335     DS->TSD_Riv = (TSD *)malloc(DS->NumRivBC*sizeof(TSD));                               
00336 
00337     for(i=0; i<DS->NumRivBC; i++)
00338     {
00339         fscanf(riv_file, "%s %d %d", DS->TSD_Riv[i].name, &DS->TSD_Riv[i].index, &DS->TSD_Riv[i].length);
00340                                                                                          
00341 
00342         DS->TSD_Riv[i].TS = (realtype **)malloc((DS->TSD_Riv[i].length)*sizeof(realtype));    
00343         for(j=0; j<DS->TSD_Riv[i].length; j++)
00344         {
00345             DS->TSD_Riv[i].TS[j] = (realtype *)malloc(2*sizeof(realtype));                    
00346         }
00347 
00348         for(j=0; j<DS->TSD_Riv[i].length; j++)
00349         {
00350             fscanf(riv_file, "%lf %lf", &DS->TSD_Riv[i].TS[j][0], &DS->TSD_Riv[i].TS[j][1]);  
00351         }
00352     }
00353 
00354     
00355     fscanf(riv_file, "%s %d", tempchar, &DS->NumRes);
00356     if(DS->NumRes > 0)
00357     {
00358         
00359     }
00360     fclose(riv_file);
00361     printf("done.\n");
00362     
00363 
00364     
00365     
00366     
00367     printf("\n  5) reading %s.forc ... ", filename);
00368     fn[5] = (char *)malloc((strlen(filename)+5)*sizeof(char));
00369     strcpy(fn[5], filename);
00370     forc_file = fopen(strcat(fn[5], ".forc"), "r");
00371 
00372     if(forc_file == NULL)
00373     {
00374         printf("\n  Fatal Error: %s.forc is in use or does not exist!\n", filename);
00375         exit(1);
00376     }
00377 
00378     
00379     fscanf(forc_file, "%d %d", &DS->NumPrep, &DS->NumTemp);                
00380     fscanf(forc_file, "%d %d", &DS->NumHumidity, &DS->NumWindVel);         
00381     fscanf(forc_file, "%d %d", &DS->NumRn, &DS->NumG);                     
00382     fscanf(forc_file, "%d %d", &DS->NumP, &DS->NumLC);                     
00383     fscanf(forc_file, "%d", &DS->NumMeltF);                                
00384     fscanf(forc_file, "%d", &DS->NumSource);                               
00385 
00386     DS->TSD_Prep = (TSD *)malloc(DS->NumPrep*sizeof(TSD));                 
00387     DS->TSD_Temp = (TSD *)malloc(DS->NumTemp*sizeof(TSD));                 
00388     DS->TSD_Humidity = (TSD *)malloc(DS->NumHumidity*sizeof(TSD));         
00389     DS->TSD_WindVel = (TSD *)malloc(DS->NumWindVel*sizeof(TSD));           
00390     DS->TSD_Rn = (TSD *)malloc(DS->NumRn*sizeof(TSD));                     
00391     DS->TSD_G = (TSD *)malloc(DS->NumG*sizeof(TSD));                       
00392     DS->TSD_Pressure = (TSD *)malloc(DS->NumP*sizeof(TSD));                
00393     DS->TSD_LAI = (TSD *)malloc(DS->NumLC*sizeof(TSD));                    
00394     DS->TSD_DH = (TSD *)malloc(DS->NumLC*sizeof(TSD));                     
00395     DS->TSD_MeltF = (TSD *)malloc(DS->NumMeltF*sizeof(TSD));               
00396     DS->TSD_Source = (TSD *)malloc(DS->NumSource*sizeof(TSD));             
00397 
00398     DS->SIFactor = (realtype *)malloc(DS->NumLC*sizeof(realtype));         
00399     DS->WindH = (realtype *)malloc(DS->NumWindVel*sizeof(realtype));       
00400 
00401     
00402     for(i=0; i<DS->NumPrep; i++)
00403     {
00404         fscanf(forc_file, "%s %d %d", DS->TSD_Prep[i].name, &DS->TSD_Prep[i].index, &DS->TSD_Prep[i].length);
00405 
00406         DS->TSD_Prep[i].TS = (realtype **)malloc((DS->TSD_Prep[i].length)*sizeof(realtype));
00407 
00408         for(j=0; j<DS->TSD_Prep[i].length; j++)
00409         {
00410             DS->TSD_Prep[i].TS[j] = (realtype *)malloc(2*sizeof(realtype));
00411         }
00412 
00413         for(j=0; j<DS->TSD_Prep[i].length; j++)
00414         {
00415             fscanf(forc_file, "%lf %lf", &DS->TSD_Prep[i].TS[j][0], &DS->TSD_Prep[i].TS[j][1]);
00416         }
00417         DS->TSD_Prep[i].iCounter=0;
00418     }
00419 
00420     
00421     for(i=0; i<DS->NumTemp; i++)
00422     {
00423         fscanf(forc_file, "%s %d %d", DS->TSD_Temp[i].name, &DS->TSD_Temp[i].index, &DS->TSD_Temp[i].length);
00424 
00425         DS->TSD_Temp[i].TS = (realtype **)malloc((DS->TSD_Temp[i].length)*sizeof(realtype));
00426 
00427         for(j=0; j<DS->TSD_Temp[i].length; j++)
00428         {
00429             DS->TSD_Temp[i].TS[j] = (realtype *)malloc(2*sizeof(realtype));
00430         }
00431 
00432         for(j=0; j<DS->TSD_Temp[i].length; j++)
00433         {
00434             fscanf(forc_file, "%lf %lf", &DS->TSD_Temp[i].TS[j][0], &DS->TSD_Temp[i].TS[j][1]);
00435         }
00436         DS->TSD_Temp[i].iCounter=0;
00437     }
00438 
00439     
00440     for(i=0; i<DS->NumHumidity; i++)
00441     {
00442         fscanf(forc_file, "%s %d %d", DS->TSD_Humidity[i].name, &DS->TSD_Humidity[i].index, &DS->TSD_Humidity[i].length);
00443 
00444         DS->TSD_Humidity[i].TS = (realtype **)malloc((DS->TSD_Humidity[i].length)*sizeof(realtype));
00445 
00446         for(j=0; j<DS->TSD_Humidity[i].length; j++)
00447         {
00448             DS->TSD_Humidity[i].TS[j] = (realtype *)malloc(2*sizeof(realtype));
00449         }
00450 
00451         for(j=0; j<DS->TSD_Humidity[i].length; j++)
00452         {
00453             fscanf(forc_file, "%lf %lf", &DS->TSD_Humidity[i].TS[j][0], &DS->TSD_Humidity[i].TS[j][1]);
00454             DS->TSD_Humidity[i].TS[j][1] = (DS->TSD_Humidity[i].TS[j][1] > 1.0?1.0:DS->TSD_Humidity[i].TS[j][1]);
00455         }
00456         DS->TSD_Humidity[i].iCounter=0;
00457     }
00458 
00459     
00460     for(i=0; i<DS->NumWindVel; i++)
00461     {
00462         fscanf(forc_file, "%s %d %d %lf", DS->TSD_WindVel[i].name, &DS->TSD_WindVel[i].index, &DS->TSD_WindVel[i].length, &DS->WindH[i]);
00463 
00464         DS->TSD_WindVel[i].TS = (realtype **)malloc((DS->TSD_WindVel[i].length)*sizeof(realtype));
00465 
00466         for(j=0; j<DS->TSD_WindVel[i].length; j++)
00467         {
00468             DS->TSD_WindVel[i].TS[j] = (realtype *)malloc(2*sizeof(realtype));
00469         }
00470 
00471         for(j=0; j<DS->TSD_WindVel[i].length; j++)
00472         {
00473             fscanf(forc_file, "%lf %lf", &DS->TSD_WindVel[i].TS[j][0], &DS->TSD_WindVel[i].TS[j][1]);
00474         }
00475         DS->TSD_WindVel[i].iCounter=0;
00476     }
00477 
00478     
00479     for(i=0; i<DS->NumRn; i++)
00480     {
00481         fscanf(forc_file, "%s %d %d", DS->TSD_Rn[i].name, &DS->TSD_Rn[i].index, &DS->TSD_Rn[i].length);
00482 
00483         DS->TSD_Rn[i].TS = (realtype **)malloc((DS->TSD_Rn[i].length)*sizeof(realtype));
00484 
00485         for(j=0; j<DS->TSD_Rn[i].length; j++)
00486         {
00487             DS->TSD_Rn[i].TS[j] = (realtype *)malloc(2*sizeof(realtype));
00488         }
00489 
00490         for(j=0; j<DS->TSD_Rn[i].length; j++)
00491         {
00492             fscanf(forc_file, "%lf %lf", &DS->TSD_Rn[i].TS[j][0], &DS->TSD_Rn[i].TS[j][1]);
00493         }
00494         DS->TSD_Rn[i].iCounter=0;
00495     }
00496 
00497     
00498     for(i=0; i<DS->NumG; i++)
00499     {
00500         fscanf(forc_file, "%s %d %d", DS->TSD_G[i].name, &DS->TSD_G[i].index, &DS->TSD_G[i].length);
00501         DS->TSD_G[i].TS = (realtype **)malloc((DS->TSD_G[i].length)*sizeof(realtype));
00502         for(j=0; j<DS->TSD_G[i].length; j++)
00503         {
00504             DS->TSD_G[i].TS[j] = (realtype *)malloc(2*sizeof(realtype));
00505         }
00506 
00507         for(j=0; j<DS->TSD_G[i].length; j++)
00508         {
00509             fscanf(forc_file, "%lf %lf", &DS->TSD_G[i].TS[j][0], &DS->TSD_G[i].TS[j][1]);
00510         }
00511         DS->TSD_G[i].iCounter=0;
00512     }
00513 
00514     
00515     for(i=0; i<DS->NumP; i++)
00516     {
00517         fscanf(forc_file, "%s %d %d", DS->TSD_Pressure[i].name, &DS->TSD_Pressure[i].index, &DS->TSD_Pressure[i].length);
00518         DS->TSD_Pressure[i].TS = (realtype **)malloc((DS->TSD_Pressure[i].length)*sizeof(realtype));
00519         for(j=0; j<DS->TSD_Pressure[i].length; j++)
00520         {
00521             DS->TSD_Pressure[i].TS[j] = (realtype *)malloc(2*sizeof(realtype));
00522         }
00523 
00524         for(j=0; j<DS->TSD_Pressure[i].length; j++)
00525         {
00526             fscanf(forc_file, "%lf %lf", &DS->TSD_Pressure[i].TS[j][0], &DS->TSD_Pressure[i].TS[j][1]);
00527         }
00528         DS->TSD_Pressure[i].iCounter=0;
00529     }
00530 
00531     
00532     for(i=0; i<DS->NumLC; i++)
00533     {
00534         fscanf(forc_file, "%s %d %d %lf", DS->TSD_LAI[i].name, &DS->TSD_LAI[i].index, &DS->TSD_LAI[i].length, &DS->SIFactor[i]);
00535         DS->TSD_LAI[i].TS = (realtype **)malloc((DS->TSD_LAI[i].length)*sizeof(realtype));
00536 
00537         for(j=0; j<DS->TSD_LAI[i].length; j++)
00538         {
00539             DS->TSD_LAI[i].TS[j] = (realtype *)malloc(2*sizeof(realtype));
00540         }
00541 
00542         for(j=0; j<DS->TSD_LAI[i].length; j++)
00543         {
00544             fscanf(forc_file, "%lf %lf", &DS->TSD_LAI[i].TS[j][0], &DS->TSD_LAI[i].TS[j][1]);
00545 
00546             DS->TSD_LAI[i].TS[j][1]=lai_CALIB*DS->TSD_LAI[i].TS[j][1];
00547         }
00548         DS->TSD_LAI[i].iCounter=0;
00549     }
00550 
00551     
00552     for(i=0; i<DS->NumLC; i++)
00553     {
00554         fscanf(forc_file, "%s %d %d", DS->TSD_DH[i].name, &DS->TSD_DH[i].index, &DS->TSD_DH[i].length);
00555 
00556         DS->TSD_DH[i].TS = (realtype **)malloc((DS->TSD_DH[i].length)*sizeof(realtype));
00557 
00558         for(j=0; j<DS->TSD_DH[i].length; j++)
00559         {
00560             DS->TSD_DH[i].TS[j] = (realtype *)malloc(2*sizeof(realtype));
00561         }
00562         for(j=0; j<DS->TSD_DH[i].length; j++)
00563         {
00564             fscanf(forc_file, "%lf %lf", &DS->TSD_DH[i].TS[j][0], &DS->TSD_DH[i].TS[j][1]);
00565         }
00566         DS->TSD_DH[i].iCounter=0;
00567     }
00568 
00569     
00570     for(i=0; i<DS->NumMeltF; i++)
00571     {
00572         fscanf(forc_file, "%s %d %d", DS->TSD_MeltF[i].name, &DS->TSD_MeltF[i].index, &DS->TSD_MeltF[i].length);
00573         DS->TSD_MeltF[i].TS = (realtype **)malloc((DS->TSD_MeltF[i].length)*sizeof(realtype));
00574 
00575         for(j=0; j<DS->TSD_MeltF[i].length; j++)
00576         {
00577             DS->TSD_MeltF[i].TS[j] = (realtype *)malloc(2*sizeof(realtype));
00578         }
00579 
00580         for(j=0; j<DS->TSD_MeltF[i].length; j++)
00581         {
00582             fscanf(forc_file, "%lf %lf", &DS->TSD_MeltF[i].TS[j][0], &DS->TSD_MeltF[i].TS[j][1]);
00583         }
00584         DS->TSD_MeltF[i].iCounter=0;
00585     }
00586 
00587     
00588     for(i=0; i<DS->NumSource; i++)
00589     {
00590         fscanf(forc_file, "%s %d %d", DS->TSD_Source[i].name, &DS->TSD_Source[i].index, &DS->TSD_Source[i].length);
00591 
00592         DS->TSD_Source[i].TS = (realtype **)malloc((DS->TSD_Source[i].length)*sizeof(realtype));
00593 
00594         for(j=0; j<DS->TSD_Source[i].length; j++)
00595         {
00596             DS->TSD_Source[i].TS[j] = (realtype *)malloc(2*sizeof(realtype));
00597         }
00598 
00599         for(j=0; j<DS->TSD_Source[i].length; j++)
00600         {
00601             fscanf(forc_file, "%lf %lf", &DS->TSD_Source[i].TS[j][0], &DS->TSD_Source[i].TS[j][1]);
00602         }
00603 
00604         DS->TSD_Source[i].iCounter=0;
00605     }
00606 
00607     fclose(forc_file);
00608     printf("done.\n");
00609     
00610 
00611     
00612     
00613     
00614     printf("\n  6) reading %s.ibc  ... ", filename);
00615     fn[6] = (char *)malloc((strlen(filename)+4)*sizeof(char));
00616     strcpy(fn[6], filename);
00617     ibc_file =  fopen(strcat(fn[6], ".ibc"), "r");
00618 
00619     if(ibc_file == NULL)
00620     {
00621         printf("\n  Fatal Error: %s.ibc is in use or does not exist!\n", filename);
00622         exit(1);
00623     }
00624 
00625     
00626     fscanf(ibc_file, "%d %d", &DS->Num1BC, &DS->Num2BC);
00627 
00628     if(DS->Num1BC+DS->Num2BC > 0)
00629     {
00630         DS->TSD_EleBC = (TSD *)malloc((DS->Num1BC+DS->Num2BC)*sizeof(TSD));
00631     }
00632 
00633     if(DS->Num1BC>0)
00634     {    
00635         for(i=0; i<DS->Num1BC; i++)
00636         {
00637             fscanf(ibc_file, "%s %d %d", DS->TSD_EleBC[i].name, &DS->TSD_EleBC[i].index,
00638                                    &DS->TSD_EleBC[i].length);
00639 
00640             DS->TSD_EleBC[i].TS = (realtype **)malloc((DS->TSD_EleBC[i].length)*sizeof(realtype));
00641 
00642             for(j=0; j<DS->TSD_EleBC[i].length; j++)
00643             {
00644                 DS->TSD_EleBC[i].TS[j] = (realtype *)malloc(2*sizeof(realtype));
00645             }
00646 
00647             for(j=0; j<DS->TSD_EleBC[i].length; j++)
00648             {
00649                 fscanf(ibc_file, "%lf %lf", &DS->TSD_EleBC[i].TS[j][0],
00650                                    &DS->TSD_EleBC[i].TS[j][1]);
00651             }
00652             DS->TSD_EleBC[i].iCounter=0;
00653         }
00654     }
00655 
00656     if(DS->Num2BC>0)
00657     {    
00658         
00659         for(i=DS->Num1BC; i<DS->Num1BC+DS->Num2BC; i++)
00660         {
00661             fscanf(ibc_file, "%s %d %d", DS->TSD_EleBC[i].name, &DS->TSD_EleBC[i].index,
00662                                    &DS->TSD_EleBC[i].length);
00663 
00664             DS->TSD_EleBC[i].TS = (realtype **)malloc((DS->TSD_EleBC[i].length)*sizeof(realtype));
00665             for(j=0; j<DS->TSD_EleBC[i].length; j++)
00666             {
00667                 DS->TSD_EleBC[i].TS[j] = (realtype *)malloc(2*sizeof(realtype));
00668             }
00669             for(j=0; j<DS->TSD_EleBC[i].length; j++)
00670             {
00671                 fscanf(forc_file, "%lf %lf", &DS->TSD_EleBC[i].TS[j][0], &DS->TSD_EleBC[i].TS[j][1]);
00672             }
00673             DS->TSD_EleBC[i].iCounter=0;
00674         }
00675     }
00676     fscanf(ibc_file, "%d", &DS->NumEleIC);
00677     
00678 
00679 
00680 
00681 
00682 
00683 
00684 
00685 
00686 
00687 
00688     fclose(ibc_file);
00689     printf("done.\n");
00690     
00691 
00692     
00693     
00694     
00695     printf("\n  7) reading %s.para ... ", filename);
00696     fn[7] = (char *)malloc((strlen(filename)+5)*sizeof(char));
00697     strcpy(fn[7], filename);
00698     para_file = fopen(strcat(fn[7], ".para"), "r");
00699 
00700     if(para_file == NULL)
00701     {
00702         printf("\n  Fatal Error: %s.para is in use or does not exist!\n", filename);
00703         exit(1);
00704     }
00705 
00706     
00707     fscanf(para_file, "%d %d", &CS->Verbose, &CS->Debug);
00708     fscanf(para_file, "%d", &CS->int_type);
00709     fscanf(para_file, "%d %d %d %d", &CS->res_out, &CS->flux_out, &CS->q_out, &CS->etis_out);
00710     fscanf(para_file, "%d %d %d", &DS->UnsatMode, &DS->SurfMode, &DS->RivMode);
00711     fscanf(para_file, "%d", &CS->Solver);
00712     if(CS->Solver == 2)
00713     {
00714         fscanf(para_file, "%d %d %lf", &CS->GSType, &CS->MaxK, &CS->delt);
00715     }
00716     fscanf(para_file, "%lf %lf", &CS->abstol, &CS->reltol);
00717     fscanf(para_file, "%lf %lf %lf", &CS->InitStep, &CS->MaxStep, &CS->ETStep);
00718     fscanf(para_file, "%lf %lf %d", &CS->StartTime, &CS->EndTime, &CS->outtype);
00719     if(CS->outtype == 0)
00720     {
00721         fscanf(para_file, "%lf %lf", &CS->a, &CS->b);
00722     }
00723 
00724     if(CS->a != 1.0)
00725     {
00726         NumTout = (int)(log(1 - (CS->EndTime - CS->StartTime)*(1 -  CS->a)/CS->b)/log(CS->a));
00727     }
00728     else
00729     {
00730         if((CS->EndTime - CS->StartTime)/CS->b - ((int) (CS->EndTime - CS->StartTime)/CS->b) > 0)
00731         {
00732             NumTout = (int) ((CS->EndTime - CS->StartTime)/CS->b);
00733         }
00734         else
00735         {
00736             NumTout = (int) ((CS->EndTime - CS->StartTime)/CS->b - 1);
00737         }
00738     }
00739 
00740     CS->NumSteps = NumTout + 1;
00741 
00742     CS->Tout = (realtype *)malloc((CS->NumSteps + 1)*sizeof(realtype));
00743 
00744     for(i=0; i<CS->NumSteps+1; i++)
00745     {
00746         if(i == 0)
00747         {
00748             CS->Tout[i] = CS->StartTime;
00749         }
00750         else
00751         {
00752             CS->Tout[i] = CS->Tout[i-1] + pow(CS->a, i)*CS->b;
00753         }
00754     }
00755 
00756     if(CS->Tout[CS->NumSteps] < CS->EndTime)
00757     {
00758         CS->Tout[CS->NumSteps] = CS->EndTime;
00759     }
00760 
00761     fclose(para_file);
00762     printf("done.\n");
00763     
00764 
00765 }
00766