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

📄 solve_snow.c

📁 超强的大尺度水文模拟工具
💻 C
📖 第 1 页 / 共 2 页
字号:
	    * (canopy_temp+KELVIN);	}	else {	  /** Compute Canopy Evaporation, if Canopy and No Snow **/	  tmp_Wdew[WET] = veg_var_wet->Wdew;	  if(options.DIST_PRCP) tmp_Wdew[DRY] = 0.;	  Evap[0] = canopy_evap(layer_wet, layer_dry, veg_var_wet, 				veg_var_dry, FALSE, veg_class, month, mu, 				tmp_Wdew, (double)dt, rad[0], vpd, 				net_short[0], air_temp, aero_resist[0], 				displacement, roughness, ref_height, 				(double)soil_con->elevation, rainfall, 				soil_con->depth, soil_con->Wcr, 				soil_con->Wpwp, root);	  /* Store throughfall from canopy */	  rainfall[WET] = veg_var_wet->throughfall;	  if(options.DIST_PRCP) 	    rainfall[DRY] = veg_var_dry->throughfall;	  /* Estimate longwave radiation from canopy */	  energy->longwave = (STEFAN_B * (air_temp+KELVIN) * (air_temp+KELVIN) 			      * (air_temp+KELVIN) * (air_temp+KELVIN));	}      }      else if(snowfall[0] > 0. && veg_var_wet->Wdew > 0.) {	/** If No Overstory, Empty Vegetation of Stored Water **/	tmp_rain = calc_rainonly(air_temp, veg_var_wet->Wdew,				 MAX_SNOW_TEMP, MIN_RAIN_TEMP, mu);	rainfall[WET]            += tmp_rain;	snowfall[WET]            += veg_var_wet->Wdew - tmp_rain;	veg_var_wet->throughfall  = rainfall[WET] + snowfall[WET];	veg_var_wet->Wdew         = 0.;	energy->longwave          = longwave;      }      else {	/** Precipitation "Passes Through" Vegetation which 	    is Under Snow (used only for accounting purposes)**/	veg_var_wet->throughfall = rainfall[WET] + snowfall[WET];	veg_var_dry->throughfall = rainfall[DRY] + snowfall[DRY];	energy->longwave         = longwave;      }    }    else energy->longwave = longwave;        old_swq = snow->swq;        if(snow->swq>0.0 || snowfall[0] > 0) {            /******************************	Snow Pack Present on Ground      ******************************/      // store snowfall reaching the ground for determining the albedo      store_snowfall            = snowfall[WET];      /** Age Snowpack **/      if( snowfall[WET] > 0 ) curr_snow = 1; // new snow - reset pack age      else curr_snow = snow->last_snow + 1; // age pack by one time step      if(overstory && snowfall[0] > 0.) {	/** recompute surface properties if overstory drops snow **/	snow->albedo    = NEW_SNOW_ALB;	energy->albedo  = snow->albedo;	snow->last_snow = 1;	(*out_short)    = energy->albedo * shortwave;	(*net_short)    = (1.0 - energy->albedo) * shortwave;	(*rad)          = (*net_short) + longwave - STEFAN_B 	  * (snow->surf_temp+KELVIN) * (snow->surf_temp+KELVIN) 	  * (snow->surf_temp+KELVIN) * (snow->surf_temp+KELVIN);      }          (*snow_inflow) += rainfall[WET] + snowfall[WET];      if(options.FULL_ENERGY || options.FROZEN_SOIL) grnd_temp = energy->T[0];      else grnd_temp = air_temp;      /** Call snow pack accumulation and ablation algorithm **/      snow_melt(soil_con, rec, iveg, wind_h+soil_con->snow_rough, 		aero_resist[2], Le[0], snow, (double)dt, 0.00, 		soil_con->snow_rough, surf_atten, rainfall[WET], 		snowfall[WET], tmp_wind[2], grnd_temp, air_temp, net_short[0], 		energy->longwave, density, pressure, vpd, vp, &melt, 		&energy->advection, &energy->deltaCC, &energy->grnd_flux, 		&energy->latent, &energy->sensible, &energy->error, 		&energy->refreeze_energy);      ppt[WET] += melt;      energy->albedo   = snow->albedo;      tmp_snow_energy[0] = energy->advection - energy->deltaCC 	+ energy->refreeze_energy;      (*Ls) = (677. - 0.07 * snow->surf_temp) * 4.1868 * 1000;            /** Compute Snow Parameters **/      if(snow->swq > 0.) {	/** Calculate Snow Density **/	if ( snow->surf_temp <= 0 )	  // snowpack present, compress and age density	  snow->density = snow_density(day_in_year, snowfall[WET], air_temp, 				       old_swq, snow->depth, snow->coldcontent, 				       (double)dt, snow->surf_temp);	else 	  // no snowpack present, start with new snow density	  if ( curr_snow == 1 ) 	    snow->density = new_snow_density(air_temp);	/** Calculate Snow Depth (H.B.H. 7.2.1) **/	snow->depth = 1000. * snow->swq / snow->density; 		/** Record if snowpack is melting this time step **/	if ( snow->coldcontent >= 0 && day_in_year > 60 // ~ March 1	     && day_in_year < 273 // ~ October 1	     ) snow->MELTING = TRUE;	else if ( snow->MELTING && snowfall[WET] > TraceSnow ) 	  snow->MELTING = FALSE;		/** Check for Thin Snowpack which only Partially Covers Grid Cell **/	if(snow->swq < MAX_FULL_COVERAGE_SWQ) {	  snow->coverage = 1.; /* 	  snow->coverage = 1. / MAX_FULL_COVERAGE_SWQ   *//* 	    * snow->swq;  *//* 	  if(snow_coverage <= snow->coverage) { *//* 	    energy->albedo = bare_albedo; *//* 	  } *//* 	  else { *//* 	    energy->albedo = (snow_coverage - snow->coverage)  *//* 	      / (1. - snow->coverage) * snow->albedo; *//* 	    energy->albedo += (1. - snow_coverage)  *//* 	      / (1. - snow->coverage) * bare_albedo; *//* 	  } */	}	else {	  snow->coverage = 1.;	}	/** Estimate net longwave at the snow surface */	energy->longwave -= (STEFAN_B * (snow->surf_temp+KELVIN) 			     * (snow->surf_temp+KELVIN) 			     * (snow->surf_temp+KELVIN) 			     * (snow->surf_temp+KELVIN));      }      else {	/** Reset Snow Pack Variables after Complete Melt **/	snow->density    = 0.;	snow->depth      = 0.;	snow->surf_water = 0;	snow->pack_water = 0;	snow->surf_temp  = 0;	snow->pack_temp  = 0;	snow->coverage   = 0;	snow->MELTING    = FALSE; 	energy->albedo = (snow_coverage - snow->coverage)   	  / (1. - snow->coverage) * snow->albedo;  	energy->albedo += (1. - snow_coverage)   	  / (1. - snow->coverage) * bare_albedo; 	      }    }    else {      /** Ground Snow not Present, and Falling Snow Does not Reach Ground **/      ppt[WET] += rainfall[WET];      tmp_snow_energy[0] = 0.;      curr_snow               = 0;      snow->MELTING           = FALSE;    }        if ( store_snowfall > TraceSnow || store_snowfall == 0 ) {      // reset snow albedo ago if new snow is sufficiently deep      snow->last_snow = curr_snow;    }    else {      snow->last_snow++;    }  }  else {        /*****************************      No Snow Present or Falling    *****************************/    /** Initialize variables **/    snow->snow         = FALSE;    tmp_snow_energy[0] = 0;    energy->albedo     = bare_albedo;    energy->longwave   = longwave;    /** Compute Radiation Balance for Bare Surface **/     out_short[0] = energy->albedo * shortwave;    net_short[0] = (1.0 - energy->albedo) * shortwave;    if(options.FULL_ENERGY || options.FROZEN_SOIL) {      rad[0]       = net_short[0] + longwave 	- STEFAN_B * (energy->T[0]+KELVIN) * (energy->T[0]+KELVIN) 	* (energy->T[0]+KELVIN) * (energy->T[0]+KELVIN);    }    else {      rad[0]       = net_short[0] + longwave 	- STEFAN_B * (air_temp+KELVIN) * (air_temp+KELVIN) 	* (air_temp+KELVIN) * (air_temp+KELVIN);    }    snow->MELTING        = FALSE;  }  energy->shortwave = (*net_short);  return(melt);}

⌨️ 快捷键说明

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