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

📄 calc_surf_energy_bal.c

📁 能量分析的完美工具
💻 C
📖 第 1 页 / 共 2 页
字号:
				emissivity, kappa1, kappa2, Cs1, Cs2, D1, D2, 
				dp, delta_t, Le, Ls, Vapor, moist, ice0, 
				max_moist, bubble, expt, snow_depth, 
				snow_density, Tsnow_surf, 
				snow_cover_fraction, surf_atten, U, 
				displacement, roughness, ref_height, 
				(double)soil_con->elevation, 
				soil_con->b_infilt, soil_con->max_infil, 
				(double)dt, atmos->vpd[hour], snow_energy, mu, 
				rainfall, Wdew, &energy->grnd_flux, 
				&T1, &energy->latent, &energy->sensible, 
				&energy->deltaH, &energy->snow_flux, 
				&energy->error, soil_con->depth, 
				soil_con->Wcr, soil_con->Wpwp, 
				soil_con->resid_moist, T_node, 
				Tnew_node, dz_node, kappa_node, Cs_node, 
				moist_node, bubble_node, expt_node, 
				max_moist_node, ice_node, alpha, beta, gamma, 
				root, layer_wet, layer_dry, veg_var_wet, 
				veg_var_dry, VEG, 
				veg_class, dmy->month, Nnodes, FIRST_SOLN, 
				snow->snow, soil_con->FS_ACTIVE);
#endif
  
  energy->error = error;

  /***************************************************
    Recalculate Soil Moisture and Thermal Properties
  ***************************************************/
  if(options.GRND_FLUX) {
    if(options.QUICK_FLUX) {
      
      energy->T[0] = Tsurf;
      energy->T[1] = T1;
      
    }
    else {
      
      finish_frozen_soil_calcs(energy, layer_wet, layer_dry, layer, soil_con, 
			       Nnodes, iveg, mu, Tnew_node, kappa_node, 
			       Cs_node, moist_node);
      
    }
    
  }
  else {

    energy->T[0] = Tsurf;

  }

  /** Store precipitation that reaches the surface */
  if(!snow->snow) {
    if(iveg!=Nveg) {
      if(veg_lib[veg_class].LAI[dmy->month-1] <= 0.0) { 
	veg_var_wet->throughfall = rainfall[WET];
	if(options.DIST_PRCP) veg_var_dry->throughfall = rainfall[DRY];
	ppt[WET] = veg_var_wet->throughfall;
	if(options.DIST_PRCP) ppt[DRY] = veg_var_dry->throughfall;
      }
      else {
	ppt[WET] = veg_var_wet->throughfall;
	if(options.DIST_PRCP) ppt[DRY] = veg_var_dry->throughfall;
      }
    }
    else {
      ppt[WET] = rainfall[WET];
      if(options.DIST_PRCP) ppt[DRY] = rainfall[DRY];
    }
  }
   
  /** Store net longwave radiation **/
  if(hour < 24)
    energy->longwave = longwave 
      - STEFAN_B * (Tsurf+KELVIN) * (Tsurf+KELVIN) 
		    * (Tsurf+KELVIN) * (Tsurf+KELVIN);
  else energy->longwave = longwave;

  /** Store surface albedo **/
  energy->albedo = bare_albedo;

  /** Store net shortwave radiation **/
  energy->shortwave = (1. - energy->albedo) * shortwave;

  /** Return soil surface temperature **/
  return (Tsurf);
    
}

double solve_surf_energy_bal(double Tsurf, ...) {

  va_list ap;

  double error;

  va_start(ap, Tsurf);
  error = func_surf_energy_bal(Tsurf, ap);
  va_end(ap);

  return error;

}

double error_calc_surf_energy_bal(double Tsurf, ...) {

  va_list ap;

  double error;

  va_start(ap, Tsurf);
  error = error_print_surf_energy_bal(Tsurf, ap);
  va_end(ap);

  return error;

}

double error_print_surf_energy_bal(double Ts, va_list ap) {

  extern option_struct options;

  /** Thermal Properties **/
  double             T2; 
  double             Ts_old; 
  double             T1_old; 
  double             Tair; 
  double             ra; 
  double             atmos_density; 
  double             shortwave;
  double             longwave;
  double             albedo;
  double             emissivity;
  double             kappa1; 
  double             kappa2; 
  double             Cs1; 
  double             Cs2; 
  double             D1; 
  double             D2; 
  double             dp; 
  double             delta_t;
  double             Le; 
  double             Ls; 
  double             Vapor; 
  double             moist; 
  double             ice0; 
  double             max_moist; 
  double             bubble; 
  double             expt;
  double             snow_depth;
  double             snow_density;
  double             Tsnow_surf;
  double             snow_cover_fraction;
  double             surf_atten;
  double             wind;
  double             displacement;
  double             roughness;
  double             ref_height;
  double             elevation;
  double             b_infilt;
  double             max_infil;
  double             dt;
  double             vpd;
  double             snow_energy;
  double             mu;
  double            *rainfall;
  double            *Wdew;
  double            *grnd_flux;
  double            *T1;
  double            *latent_heat;
  double            *sensible_heat;
  double            *deltaH;
  double            *snow_flux;
  double            *store_error;
  double            *depth;
  double            *Wcr;
  double            *Wpwp;
  double            *resid_moist;
  double            *T_node;
  double            *Tnew_node;
  double            *dz_node;
  double            *kappa_node;
  double            *Cs_node;
  double            *moist_node;
  double            *bubble_node;
  double            *expt_node;
  double            *max_moist_node;
  double            *ice_node;
  double            *alpha;
  double            *beta;
  double            *gamma;
#if QUICK_FS
  double           **ufwc_table_layer;
  double          ***ufwc_table_node;
#endif
  float             *root;
  layer_data_struct *layer_wet;
  layer_data_struct *layer_dry;
  veg_var_struct    *veg_var_wet;
  veg_var_struct    *veg_var_dry;
  int                VEG;
  int                veg_class;
  int                month;
  int                iveg;
  int                Nnodes;
  char              *FIRST_SOLN;
  int                SNOWING;
  int                FS_ACTIVE;
  char              *ErrorString;

  int                i;

  /* Initialize Variables */
  T2                  = (double) va_arg(ap, double);
  Ts_old              = (double) va_arg(ap, double);
  T1_old              = (double) va_arg(ap, double);
  Tair                = (double) va_arg(ap, double);
  ra                  = (double) va_arg(ap, double);
  atmos_density       = (double) va_arg(ap, double);
  shortwave           = (double) va_arg(ap, double);
  longwave            = (double) va_arg(ap, double);
  albedo              = (double) va_arg(ap, double);
  emissivity          = (double) va_arg(ap, double);
  kappa1              = (double) va_arg(ap, double);
  kappa2              = (double) va_arg(ap, double);
  Cs1                 = (double) va_arg(ap, double);
  Cs2                 = (double) va_arg(ap, double);
  D1                  = (double) va_arg(ap, double);
  D2                  = (double) va_arg(ap, double);
  dp                  = (double) va_arg(ap, double);
  delta_t             = (double) va_arg(ap, double);
  Le                  = (double) va_arg(ap, double);
  Ls                  = (double) va_arg(ap, double);
  Vapor               = (double) va_arg(ap, double);
  moist               = (double) va_arg(ap, double);
  ice0                = (double) va_arg(ap, double);
  max_moist           = (double) va_arg(ap, double);
  bubble              = (double) va_arg(ap, double);
  expt                = (double) va_arg(ap, double);
  snow_depth          = (double) va_arg(ap, double);
  snow_density        = (double) va_arg(ap, double);
  Tsnow_surf          = (double) va_arg(ap, double);
  snow_cover_fraction = (double) va_arg(ap, double);
  surf_atten          = (double) va_arg(ap, double);
  wind                = (double) va_arg(ap, double);
  displacement        = (double) va_arg(ap, double);
  roughness           = (double) va_arg(ap, double);
  ref_height          = (double) va_arg(ap, double);
  elevation           = (double) va_arg(ap, double);
  b_infilt            = (double) va_arg(ap, double);
  max_infil           = (double) va_arg(ap, double);
  dt                  = (double) va_arg(ap, double);
  vpd                 = (double) va_arg(ap, double);
  snow_energy         = (double) va_arg(ap, double);
  mu                  = (double) va_arg(ap, double);
  rainfall            = (double *) va_arg(ap, double *);
  Wdew                = (double *) va_arg(ap, double *);
  grnd_flux           = (double *) va_arg(ap, double *);
  T1                  = (double *) va_arg(ap, double *);
  latent_heat         = (double *) va_arg(ap, double *);
  sensible_heat       = (double *) va_arg(ap, double *);
  deltaH              = (double *) va_arg(ap, double *);
  snow_flux           = (double *) va_arg(ap, double *);
  store_error         = (double *) va_arg(ap, double *);
  depth               = (double *) va_arg(ap, double *);
  Wcr                 = (double *) va_arg(ap, double *);
  Wpwp                = (double *) va_arg(ap, double *);
  resid_moist         = (double *) va_arg(ap, double *);
  T_node              = (double *) va_arg(ap, double *);
  Tnew_node           = (double *) va_arg(ap, double *);
  dz_node             = (double *) va_arg(ap, double *);
  kappa_node          = (double *) va_arg(ap, double *);
  Cs_node             = (double *) va_arg(ap, double *);
  moist_node          = (double *) va_arg(ap, double *);
  bubble_node         = (double *) va_arg(ap, double *);
  expt_node           = (double *) va_arg(ap, double *);
  max_moist_node      = (double *) va_arg(ap, double *);
  ice_node            = (double *) va_arg(ap, double *);
  alpha               = (double *) va_arg(ap, double *);
  beta                = (double *) va_arg(ap, double *);
  gamma               = (double *) va_arg(ap, double *);
#if QUICK_FS
  ufwc_table_layer    = (double **) va_arg(ap, double **);
  ufwc_table_node     = (double ***) va_arg(ap, double ***);
#endif
  root                = (float  *) va_arg(ap, float  *);
  layer_wet           = (layer_data_struct *) va_arg(ap, layer_data_struct *);
  layer_dry           = (layer_data_struct *) va_arg(ap, layer_data_struct *);
  veg_var_wet         = (veg_var_struct *) va_arg(ap, veg_var_struct *);
  veg_var_dry         = (veg_var_struct *) va_arg(ap, veg_var_struct *);
  VEG                 = (int) va_arg(ap, int);
  veg_class           = (int) va_arg(ap, int);
  month               = (int) va_arg(ap, int);
  iveg                = (int) va_arg(ap, int);
  Nnodes              = (int) va_arg(ap, int);
  FIRST_SOLN          = (char *) va_arg(ap, char *);
  SNOWING             = (int) va_arg(ap, int);
  FS_ACTIVE           = (int) va_arg(ap, int);
  ErrorString         = (char *) va_arg(ap, char *);

  /* Print Variables */
  fprintf(stderr, "%s", ErrorString);
  fprintf(stderr, "ERROR: calc_surf_energy_bal failed to converge to a solution in root_brent.  Variable values will be dumped to the screen, check for invalid values.\n");

  fprintf(stderr,"T2 = %f\n",T2);
  fprintf(stderr,"Ts_old = %f\n",Ts_old);
  fprintf(stderr,"T1_old = %f\n",T1_old);
  fprintf(stderr,"Tair = %f\n",Tair);
  fprintf(stderr,"ra = %f\n",ra);
  fprintf(stderr,"atmos_density = %f\n",atmos_density);
  fprintf(stderr,"shortwave = %f\n",shortwave);
  fprintf(stderr,"longwave = %f\n",longwave);
  fprintf(stderr,"albedo = %f\n",albedo);
  fprintf(stderr,"emissivity = %f\n",emissivity);
  fprintf(stderr,"kappa1 = %f\n",kappa1);
  fprintf(stderr,"kappa2 = %f\n",kappa2);
  fprintf(stderr,"Cs1 = %f\n",Cs1);
  fprintf(stderr,"Cs2 = %f\n",Cs2);
  fprintf(stderr,"D1 = %f\n",D1);
  fprintf(stderr,"D2 = %f\n",D2);
  fprintf(stderr,"dp = %f\n",dp);
  fprintf(stderr,"delta_t = %f\n",delta_t);
  fprintf(stderr,"Le = %f\n",Le);
  fprintf(stderr,"Ls = %f\n",Ls);
  fprintf(stderr,"Vapor = %f\n",Vapor);
  fprintf(stderr,"moist = %f\n",moist);
  fprintf(stderr,"ice0 = %f\n",ice0);
  fprintf(stderr,"max_moist = %f\n",max_moist);
  fprintf(stderr,"bubble = %f\n",bubble);
  fprintf(stderr,"expt = %f\n",expt);
  fprintf(stderr,"surf_atten = %f\n",surf_atten);
  fprintf(stderr,"wind = %f\n",wind);
  fprintf(stderr,"displacement = %f\n",displacement);
  fprintf(stderr,"roughness = %f\n",roughness);
  fprintf(stderr,"ref_height = %f\n",ref_height);
  fprintf(stderr,"elevation = %f\n",elevation);
  fprintf(stderr,"b_infilt = %f\n",b_infilt);
  fprintf(stderr,"max_infil = %f\n",max_infil);
  fprintf(stderr,"dt = %f\n",dt);
  fprintf(stderr,"vpd = %f\n",vpd);
  fprintf(stderr,"snow_energy = %f\n",snow_energy);
  fprintf(stderr,"mu = %f\n",mu);
  fprintf(stderr,"rainfall = %f\n",rainfall[0]);
  fprintf(stderr,"Wdew = %f\n",Wdew[0]);
  fprintf(stderr,"grnd_flux = %f\n",grnd_flux[0]);
  fprintf(stderr,"T1 = %f\n",T1[0]);
  fprintf(stderr,"latent_heat = %f\n",latent_heat[0]);
  fprintf(stderr,"sensible_heat = %f\n",sensible_heat[0]);
  fprintf(stderr,"deltaH = %f\n",deltaH[0]);
  fprintf(stderr,"store_error = %f\n",store_error[0]);
  fprintf(stderr,"depth = %f\n",depth[0]);
  fprintf(stderr,"Wcr = %f\n",Wcr[0]);
  fprintf(stderr,"Wpwp = %f\n",Wpwp[0]);
  fprintf(stderr,"Residual Moisture = %f\n",resid_moist[0]);
  fprintf(stderr,"VEG = %i\n",VEG);
  fprintf(stderr,"veg_class = %i\n",veg_class);
  fprintf(stderr,"month = %i\n",month);
  write_layer(layer_wet,iveg,options.Nlayer,depth);
  if(options.DIST_PRCP) 
    write_layer(layer_dry,iveg,options.Nlayer,depth);
  write_vegvar(&(veg_var_wet[0]),iveg);
  if(options.DIST_PRCP) 
    write_vegvar(&(veg_var_dry[0]),iveg);

  if(!options.QUICK_FLUX) {
    fprintf(stderr,"Node\tT\tTnew\tdz\tkappa\tCs\tmoist\tbubble\texpt\tmax_moist\tice\n");
    for(i=0;i<Nnodes;i++) 
      fprintf(stderr,"%i\t%.4f\t%.4f\t%.4f\t%.4f\t%.4f\t%.4f\t%.4f\t%.4f\t%.4f\t%.4f\n",
	      i, T_node[i], Tnew_node[i], dz_node[i], kappa_node[i], 
	      Cs_node[i], moist_node[i], bubble_node[i], expt_node[i], 
	      max_moist_node[i], ice_node[i]);
  }

  vicerror("Finished writing calc_surf_energy_bal variables.\nTry increasing SURF_DT to get model to complete cell.\nThen check output for instabilities.\n");

  return(0.0);
    
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -