📄 read_soilparam_arc.c
字号:
#include <stdio.h>#include <stdlib.h>#include <vicNl.h>#include <string.h>static char vcid[] = "$Id: read_soilparam_arc.c,v 4.1.2.10 2004/07/08 01:46:02 tbohn Exp $";soil_con_struct read_soilparam_arc(FILE *soilparam, char *soilparamdir, int *Ncells, int *RUN, int cell)/********************************************************************** read_soilparam_arc Keith Cherkauer May 5, 1998 This routine reads soil parameters for each grid cell from an ASCII ARC/INFO output grid. Order of ARC/INFO Files: CELLNUM RUN ELEVATION B_INFILT Ds DsMax Ws c AVG_TEMP DP OFF_GMT Wcr_FRACT Wpwp_FRACT ROUGH SNOW_ROUGH SAND[] CLAY[] KSAT[] PHI_S[] INIT_MOIST[] DEPTH[] BULK_DENSITY[] POROSITY[] Parameters Read from File: TYPE NAME UNITS DESCRIPTION int gridcel; N/A grid cell number float lat; degrees grid cell central latitude float lng; degrees grid cell central longitude double b_infilt; N/A infiltration parameter double Ds; fract fraction of maximum subsurface flow rate double Dsmax; mm/day maximum subsurface flow rate double Ws; fract fraction of maximum soil moisture double c; N/A exponent double expt[MAX_LAYERS]; N/A pore-size distribution, HBH 5.15 double Ksat[MAX_LAYERS]; mm/day saturated hydraulic conductivity double phi_s[MAX_LAYERS]; mm/mm saturated matrix potential double init_moist[MAX_LAYERS]; mm initial layer moisture level float elevation; m grid cell elevation double depth[MAX_LAYERS]; m thickness of each layer double avg_temp; C average soil temperature double dp; m soil thermal damping depth double bubble; cm bubbling pressure, HBH 5.15 double quartz; fract quartz content of soil double bulk_density[MAX_LAYERS]; kg/m^3 soil bulk density double soil_density; kg/m^3 soil partical density double rough; m soil surface roughness double snow_rough; m snow surface roughness Parameters Computed from those in the File: TYPE NAME UNITS DESCRIPTION double max_moist[MAX_LAYERS]; mm maximum moisture content per layer double max_infil; N/A maximum infiltration rate double Wcr[MAX_LAYERS]; mm critical moisture level for soil layer, evaporation is no longer affected moisture stress in the soil double Wpwp[MAX_LAYERS]; mm soil moisture content at permanent wilting point float time_zone_lng; degrees central meridian of the time zone Modifications: 7-19-96 Modified to read through variable layers, and read soil depth and average temperature for full energy and frozen soil versions of the model. KAC 4-12-98 Modified to read all parameters from a single standard input file. KAC 07-May-04 Replaced rint(something) with (float)(int)(something + 0.5) to handle rounding without resorting to rint(). TJB 10-May-04 Modified to handle Arno parameters. TJB 11-May-04 Removed extraneous tmp variable. TJB 11-May-04 (fix by Chunmei Zhu and Alan Hamlet) Added check to make sure that wilting point is greater than residual moisture. TJB 04-Jun-04 Added print statement for current cell number. TJB 16-Jun-04 Added logic to look for average July air temperature if COMPUTE_TREELINE is TRUE. If July air temperature is not supplied, then it's calculated from forcing data as before. TJB 07-Jul-04 Changed lower limit on initial soil moisture to be residual moisture rather than wilting point. Also cleaned up validation statements. TJB 07-Jul-04 Validation of initial soil moisture is only performed if INIT_STATE = FALSE. TJB**********************************************************************/{ extern option_struct options;#if LINK_DEBUG extern debug_struct debug;#endif static double *lat; static double *lng; static int *cellnum; int layer; int cnt; soil_con_struct temp; double Wcr_FRACT[MAX_LAYERS]; double Wpwp_FRACT[MAX_LAYERS]; double off_gmt; double clay[MAX_LAYERS]; double sand[MAX_LAYERS]; double sum_depth; char ErrStr[MAXSTRING]; char namestr[MAXSTRING]; char tmpstr[MAXSTRING]; double tmp_bubble; tmp_bubble = 0; if(cell==0) { rewind(soilparam); cnt = 0; while(!feof(soilparam)) { fscanf(soilparam,"%s",tmpstr); cnt++; } if(cnt!=16+10*options.Nlayer) { sprintf(ErrStr,"Not the right number of soil parameter files in the ARC/INFO file list."); nrerror(ErrStr); } rewind(soilparam); fscanf(soilparam,"%s",tmpstr); strcpy(namestr,soilparamdir); strcat(namestr,tmpstr); Ncells[0] = read_arcinfo_info(namestr,&lat,&lng,&cellnum); } else { rewind(soilparam); fscanf(soilparam,"%s",tmpstr); } temp.gridcel = cellnum[cell]; temp.lat = lat[cell]; temp.lng = lng[cell]; /** Check if Grid Cell is Run in Model **/ fscanf(soilparam,"%s",tmpstr); strcpy(namestr,soilparamdir); strcat(namestr,tmpstr); *RUN = (int)read_arcinfo_value(namestr,temp.lat,temp.lng); if(RUN[0] > 0) {#if VERBOSE /* add print statements for grid cell number */ fprintf(stderr,"\ncell: %d, lat: %.4f, long: %.4f\n",temp.gridcel,temp.lat,temp.lng);#endif /** Get Average Grid Cell Elevation **/ fscanf(soilparam,"%s",tmpstr); strcpy(namestr,soilparamdir); strcat(namestr,tmpstr); temp.elevation = (float)read_arcinfo_value(namestr,temp.lat,temp.lng); /** Get Grid Cell Infiltration Parameter **/ fscanf(soilparam,"%s",tmpstr); strcpy(namestr,soilparamdir); strcat(namestr,tmpstr); temp.b_infilt = read_arcinfo_value(namestr,temp.lat,temp.lng); /** Get Maximum Baseflow Fraction **/ fscanf(soilparam,"%s",tmpstr); strcpy(namestr,soilparamdir); strcat(namestr,tmpstr); temp.Ds = read_arcinfo_value(namestr,temp.lat,temp.lng); /** Get Maximum Baseflow Velocity **/ fscanf(soilparam,"%s",tmpstr); strcpy(namestr,soilparamdir); strcat(namestr,tmpstr); temp.Dsmax = read_arcinfo_value(namestr,temp.lat,temp.lng); /** Get Maximum Soil Moisture Fraction **/ fscanf(soilparam,"%s",tmpstr); strcpy(namestr,soilparamdir); strcat(namestr,tmpstr); temp.Ws = read_arcinfo_value(namestr,temp.lat,temp.lng); /** Get Exponential **/ fscanf(soilparam,"%s",tmpstr); strcpy(namestr,soilparamdir); strcat(namestr,tmpstr); temp.c = read_arcinfo_value(namestr,temp.lat,temp.lng); /** Get Average Soil Temperature **/ fscanf(soilparam,"%s",tmpstr); strcpy(namestr,soilparamdir); strcat(namestr,tmpstr); temp.avg_temp = read_arcinfo_value(namestr,temp.lat,temp.lng); if(options.FULL_ENERGY && (temp.avg_temp>100. || temp.avg_temp<-50)) { fprintf(stderr,"Need valid average soil temperature in degrees C to run"); fprintf(stderr," Full Energy model, %f is not acceptable.\n", temp.avg_temp); exit(0); } /** Get Soil Thermal Damping Depth **/ fscanf(soilparam,"%s",tmpstr); strcpy(namestr,soilparamdir); strcat(namestr,tmpstr); temp.dp = read_arcinfo_value(namestr,temp.lat,temp.lng); /** Get Data Time Zone Offset from GMT **/ fscanf(soilparam,"%s",tmpstr); strcpy(namestr,soilparamdir); strcat(namestr,tmpstr); off_gmt = read_arcinfo_value(namestr,temp.lat,temp.lng); /** Get Critical Soil Moisture Fraction for each layer **/ for(layer = 0; layer < options.Nlayer; layer++) { fscanf(soilparam,"%s",tmpstr); strcpy(namestr,soilparamdir); strcat(namestr,tmpstr); Wcr_FRACT[layer] = read_arcinfo_value(namestr,temp.lat,temp.lng); } /** Get Wilting Point Soil Moisture Fraction for each layer **/ for(layer = 0; layer < options.Nlayer; layer++) { fscanf(soilparam,"%s",tmpstr); strcpy(namestr,soilparamdir); strcat(namestr,tmpstr); Wpwp_FRACT[layer] = read_arcinfo_value(namestr,temp.lat,temp.lng); } /** Get Bare Soil Roughness **/ fscanf(soilparam,"%s",tmpstr); strcpy(namestr,soilparamdir); strcat(namestr,tmpstr); temp.rough = read_arcinfo_value(namestr,temp.lat,temp.lng);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -