⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 read_soilparam_arc.c

📁 超强的大尺度水文模拟工具
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -