📄 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 + -