📄 calc_surf_energy_bal.c
字号:
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 + -