亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? frozen_soil.c

?? 本人獨自開發的土壤計算及分析工具
?? C
字號:
#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <vicNl.h>

#define MAXIT 1000

static char vcid[] = "$Id: frozen_soil.c,v 4.2.2.3 2004/09/22 00:40:33 vicadmin Exp $";

void setup_frozen_soil(soil_con_struct   *soil_con,
		       layer_data_struct *layer_wet,
		       layer_data_struct *layer_dry,
		       layer_data_struct *layer,
		       energy_bal_struct  energy,
		       int                rec,
		       int                veg,
		       int                Nnodes,
		       double             mu,
		       double            *kappa,
		       double            *Cs,
		       double            *moist) {
/**********************************************************************
  setup_frozen_soil	Keith Cherkauer		July 27, 1998

  This subroutine prepares the data arrays needed to solve the soil
  thermal fluxes through all soil thermal nodes.

  soil_con_struct    soil_con   soil parameter structure
  layer_data_struct *layer_wet  soil variables for wet fraction
  layer_data_struct *layer_dry  soil variables for dry fraction
  layer_data_struct *layer      average soil variables
  energy_bal_struct  energy     energy balance structure
  int                rec        record number
  int                veg        vegetation type number
  int                Nnodes     number of soil thermal nodes 
  double             mu         fraction of grid cell that received precip
  double            *kappa      soil layer thermal conductivity (W/m/K)
  double            *Cs         soil layer heat capacity (J/m^3/K)
  double            *moist      soil layer moisture (mm)
  
  Modifications
  04-Jun-04 Added descriptive error message to beginning of screen dump
	    in error_print_solve_T_profile.			TJB
  21-Sep-04 Added ErrorString to store error messages from
	    root_brent.						TJB

**********************************************************************/
  extern option_struct options;
#if LINK_DEBUG
  extern debug_struct  debug;
#endif

  int nidx;

  for(nidx=0;nidx<Nnodes;nidx++) {
    moist[nidx] = energy.moist[nidx];
    kappa[nidx] = energy.kappa_node[nidx];
    Cs[nidx]    = energy.Cs_node[nidx];
  }

}

void finish_frozen_soil_calcs(energy_bal_struct *energy,
			      layer_data_struct *layer_wet,
			      layer_data_struct *layer_dry,
			      layer_data_struct *layer,
			      soil_con_struct   *soil_con,
			      int                Nnodes,
			      int                veg,
			      double             mu,
			      double            *T,
			      double            *kappa,
			      double            *Cs,
			      double            *moist) {
/******************************************************************
  finish_frozen_soil_calcs      Keith Cherkauer      July 27, 1998

  This subroutine redistributes soil properties based on the 
  thermal solutions found for the current time step.

  Modifications:
  3-12-03 Modified so that soil layer ice content is only 
          calculated if the frozen soil algorithm is implemented 
          and active in the current grid cell.               KAC

******************************************************************/

  extern option_struct options;
#if LINK_DEBUG
  extern debug_struct  debug;
#endif

  char    ErrorString[MAXSTRING];
  int     i, j;
  int     index;
  double  fdepth;
  double  tdepth;
  double  unfrozen;
  double  frozen;
  double  old_fdepth[MAX_LAYERS];
  double  old_tdepth[MAX_LAYERS];
  double *tmp_ptr;

  find_0_degree_fronts(energy, soil_con->dz_node, T, Nnodes);

  /** Store Layer Temperature Values **/
  for(i=0;i<Nnodes;i++) energy->T[i] = T[i];

  if(energy->Nfrost>0) energy->frozen = TRUE;
  else energy->frozen = FALSE;

  /** Redistribute Soil Properties for New Frozen Soil Layer Size **/
  if(soil_con->FS_ACTIVE && options.FROZEN_SOIL)
    estimate_layer_ice_content(layer_wet, soil_con->dz_node, energy->T,
			       soil_con->max_moist_node, 
#if QUICK_FS
			       soil_con->ufwc_table_node,
#else
			       soil_con->expt_node, soil_con->bubble_node, 
#endif
			       soil_con->depth, soil_con->max_moist, 
#if QUICK_FS
			       soil_con->ufwc_table_layer,
#else
			       soil_con->expt, soil_con->bubble, 
#endif
			       soil_con->bulk_density,
			       soil_con->soil_density, soil_con->quartz,
			       soil_con->layer_node_fract, Nnodes, 
			       options.Nlayer, soil_con->FS_ACTIVE);
  if(options.DIST_PRCP && soil_con->FS_ACTIVE && options.FROZEN_SOIL)
    estimate_layer_ice_content(layer_dry, soil_con->dz_node, energy->T,
			       soil_con->max_moist_node, 
#if QUICK_FS
			       soil_con->ufwc_table_node,
#else
			       soil_con->expt_node, soil_con->bubble_node, 
#endif
			       soil_con->depth, soil_con->max_moist, 
#if QUICK_FS
			       soil_con->ufwc_table_layer,
#else
			       soil_con->expt, soil_con->bubble, 
#endif
			       soil_con->bulk_density, soil_con->soil_density, 
			       soil_con->quartz, soil_con->layer_node_fract, 
			       Nnodes, options.Nlayer, soil_con->FS_ACTIVE);

#if LINK_DEBUG
  if(debug.PRT_BALANCE && debug.DEBUG) {
    printf("After Moisture Redistribution\n");
    write_layer(layer,veg,options.Nlayer,soil_con->depth);
  } 
#endif
  
}

void solve_T_profile(double *T,
		     double *T0,
		     double *dz,
		     double *kappa,
		     double *Cs,
		     double *moist,
		     double  deltat,
		     double *max_moist,
		     double *bubble,
		     double *expt,
		     double *ice,
		     double *alpha,
		     double *beta,
		     double *gamma,
#if QUICK_FS
		     double ***ufwc_table_node,
#endif
		     int     Nnodes,
		     char   *FIRST_SOLN,
		     char    FIRST_TIME, 
		     int     FS_ACTIVE) {
/**********************************************************************
  This subroutine was written to iteratively solve the soil temperature
  profile using a numerical difference equation.  The solution equation
  is second order in space, and first order in time.
**********************************************************************/

  extern option_struct options;
#if LINK_DEBUG
  extern debug_struct  debug;
#endif
  
  static double A[MAX_NODES];
  static double B[MAX_NODES];
  static double C[MAX_NODES];
  static double D[MAX_NODES];
  static double E[MAX_NODES];

  double *aa, *bb, *cc, *dd, *ee;

  char   Error;
  int    try;
  double maxdiff, diff;
  double oldT;
  double fprime;
  int    j, Done, ItCount;

  if(FIRST_SOLN[0]) {
    FIRST_SOLN[0] = FALSE;
    for(j=1;j<Nnodes-1;j++) {
      A[j] = beta[j-1]*deltat*(kappa[j+1]-kappa[j-1]);
      B[j] = 2.*alpha[j-1]*alpha[j-1]*deltat*kappa[j];
      C[j] = alpha[j-1]*alpha[j-1]*beta[j-1]*Cs[j]*T0[j];
      D[j] = alpha[j-1]*alpha[j-1]*beta[j-1]*ice_density*Lf;
      E[j] = alpha[j-1]*alpha[j-1]*beta[j-1]*Cs[j] 
	+ 4.*kappa[j]*alpha[j-1]*alpha[j-1]*deltat;
    }
    if(options.NOFLUX) {
      j = Nnodes-1;
      A[j] = beta[j-1]*deltat*(kappa[j]-kappa[j-1]);
      B[j] = 2.*alpha[j-1]*alpha[j-1]*deltat*kappa[j];
      C[j] = alpha[j-1]*alpha[j-1]*beta[j-1]*Cs[j]*T0[j];
      D[j] = alpha[j-1]*alpha[j-1]*beta[j-1]*ice_density*Lf;
      E[j] = alpha[j-1]*alpha[j-1]*beta[j-1]*Cs[j] 
	+ 4.*kappa[j]*alpha[j-1]*alpha[j-1]*deltat;
    }
  }
    
  aa = &A[0];
  bb = &B[0];
  cc = &C[0];
  dd = &D[0];
  ee = &E[0];

  for(j=0;j<Nnodes;j++) T[j]=T0[j];

#if QUICK_FS
  Error = calc_soil_thermal_fluxes(Nnodes, T, T0, moist, max_moist, ice, 
				   bubble, expt, alpha, gamma, aa, bb, cc, 
				   dd, ee, ufwc_table_node, FS_ACTIVE);
#else
  Error = calc_soil_thermal_fluxes(Nnodes, T, T0, moist, max_moist, ice, 
				   bubble, expt, alpha, gamma, aa, bb, cc, 
				   dd, ee, FS_ACTIVE);
#endif
  
}
  

int calc_soil_thermal_fluxes(int     Nnodes,
			     double *T,
			     double *T0,
			     double *moist,
			     double *max_moist,
			     double *ice,
			     double *bubble,
			     double *expt,
			     double *alpha,
			     double *gamma,
			     double *A, 
			     double *B, 
			     double *C, 
			     double *D, 
			     double *E,
#if QUICK_FS
			     double ***ufwc_table_node,
#endif
			     char    FS_ACTIVE) {
  
  /** Eventually the nodal ice contents will also have to be updated **/

  extern option_struct options;

  int    Error;
  char   Done;
  int    j;
  int    ItCount;
  double threshold = 1.e-2;	/* temperature profile iteration threshold */
  double maxdiff;
  double diff;
  double oldT;
  double fprime;
  char ErrorString[MAXSTRING];

  Error = 0;
  Done = FALSE;
  ItCount = 0;
  
  while(!Done && Error==0 && ItCount<MAXIT) {
    ItCount++;
    maxdiff=threshold;
    for(j=1;j<Nnodes-1;j++) {
      oldT=T[j];
      
      /**	2nd order variable kappa equation **/
      fprime = (T[j+1]-T[j-1])/alpha[j-1];
      
      if(T[j] >= 0 || !FS_ACTIVE || !options.FROZEN_SOIL) {
	T[j] = (A[j]*(T[j+1]-T[j-1])
		+ B[j]*(T[j+1]+T[j-1]-gamma[j-1]*fprime)
		+ C[j] + D[j]*(0.-ice[j])) / (E[j]);
      }
      else {
#if QUICK_FS
	T[j] = root_brent(T0[j]-(SOIL_DT), T0[j]+(SOIL_DT),
			  ErrorString, soil_thermal_eqn, 
			  T[j+1], T[j-1], T0[j], moist[j], max_moist[j], 
			  ufwc_table_node[j], ice[j], gamma[j-1], fprime, 
			  A[j], B[j], C[j], D[j], E[j]);
#else
	T[j] = root_brent(T0[j]-(SOIL_DT), T0[j]+(SOIL_DT),
			  ErrorString, soil_thermal_eqn, 
			  T[j+1], T[j-1], T0[j], moist[j], max_moist[j], 
			  bubble[j], expt[j], ice[j], gamma[j-1], fprime, 
			  A[j], B[j], C[j], D[j], E[j]);
#endif
	
	if(T[j] <= -9998) 
	  error_solve_T_profile(T[j], T[j+1], T[j-1], T0[j], moist[j], 
				max_moist[j], bubble[j], expt[j], ice[j], 
				gamma[j-1], fprime, A[j], B[j], C[j], D[j], 
				E[j], ErrorString);
      }
      
      diff=fabs(oldT-T[j]);
      if(diff > maxdiff) maxdiff=diff;
    }
    
    if(options.NOFLUX) { 
      /** Solve for bottom temperature if using no flux lower boundary **/
      oldT=T[Nnodes-1];
      
      fprime = (T[Nnodes-1]-T[Nnodes-2])/alpha[Nnodes-2];
      
      j = Nnodes-1;
      
      if(T[j] >= 0 || !FS_ACTIVE || !options.FROZEN_SOIL) {
	T[j] = (A[j]*(T[j]-T[j-1]) + B[j]*(T[j] + T[j-1] - gamma[j-1]*fprime)
		+ C[j] + D[j]*(0.-ice[j])) / E[j];
      }
      else {
#if QUICK_FS
	T[Nnodes-1] = root_brent(T0[Nnodes-1]-SOIL_DT,T0[Nnodes-1]+SOIL_DT,
				 ErrorString, soil_thermal_eqn, T[Nnodes-1],
				 T[Nnodes-2], T0[Nnodes-1], 
				 moist[Nnodes-1], max_moist[Nnodes-1], 
				 ufwc_table_node[Nnodes-1], 
				 ice[Nnodes-1], 
				 gamma[Nnodes-2], fprime, 
				 A[j], B[j], C[j], D[j], E[j]);
#else
	T[Nnodes-1] = root_brent(T0[Nnodes-1]-SOIL_DT,T0[Nnodes-1]+SOIL_DT,
				 ErrorString, soil_thermal_eqn, T[Nnodes-1],
				 T[Nnodes-2], T0[Nnodes-1], 
				 moist[Nnodes-1], max_moist[Nnodes-1], 
				 bubble[j], expt[Nnodes-1], ice[Nnodes-1], 
				 gamma[Nnodes-2], fprime, 
				 A[j], B[j], C[j], D[j], E[j]);
#endif
	
	if(T[j] <= -9998) 
	  error_solve_T_profile(T[Nnodes-1], T[Nnodes-1],
				T[Nnodes-2], T0[Nnodes-1], 
				moist[Nnodes-1], max_moist[Nnodes-1], 
				bubble[Nnodes-1], 
				expt[Nnodes-1], ice[Nnodes-1], 
				gamma[Nnodes-2], fprime, 
				A[j], B[j], C[j], D[j], E[j], ErrorString);
      }
      
      diff=fabs(oldT-T[Nnodes-1]);
      if(diff>maxdiff) maxdiff=diff;
    }
    
    if(maxdiff <= threshold) Done=TRUE;
    
  }
  
  if(!Done && !Error) {
    fprintf(stderr,"ERROR: Temperature Profile Unable to Converge!!!\n");
    fprintf(stderr,"Dumping Profile Temperatures (last, new).\n");
    for(j=0;j<Nnodes;j++) fprintf(stderr,"%f\t%f\n",T0[j],T[j]);
    vicerror("ERROR: Cannot solve temperature profile:\n\tToo Many Iterations in solve_T_profile");
  }

  return (Error);

}

double error_solve_T_profile (double Tj, ...) {

  va_list ap;

  double error;

  va_start(ap,Tj);
  error = error_print_solve_T_profile(Tj, ap);
  va_end(ap);

  return error;

}

double error_print_solve_T_profile(double T, va_list ap) {

  double TL;
  double TU;
  double T0;
  double moist;
  double max_moist;
  double bubble;
  double expt;
  double ice0;
  double gamma;
  double fprime;
  double A;
  double B;
  double C;
  double D;
  double E;
  char *ErrorString;

  TL        = (double) va_arg(ap, double);
  TU        = (double) va_arg(ap, double);
  T0        = (double) va_arg(ap, double);
  moist     = (double) va_arg(ap, double);
  max_moist = (double) va_arg(ap, double);
  bubble    = (double) va_arg(ap, double);
  expt      = (double) va_arg(ap, double);
  ice0      = (double) va_arg(ap, double);
  gamma     = (double) va_arg(ap, double);
  fprime    = (double) va_arg(ap, double);
  A         = (double) va_arg(ap, double);
  B         = (double) va_arg(ap, double);
  C         = (double) va_arg(ap, double);
  D         = (double) va_arg(ap, double);
  E         = (double) va_arg(ap, double);
  ErrorString = (char*) va_arg(ap, char *);
  
  fprintf(stderr, "%s", ErrorString);
  fprintf(stderr, "ERROR: solve_T_profile failed to converge to a solution in root_brent.  Variable values will be dumped to the screen, check for invalid values.\n");

  fprintf(stderr,"TL\t%f\n",TL);
  fprintf(stderr,"TU\t%f\n",TU);
  fprintf(stderr,"T0\t%f\n",T0);
  fprintf(stderr,"moist\t%f\n",moist);
  fprintf(stderr,"max_moist\t%f\n",max_moist);
  fprintf(stderr,"bubble\t%f\n",bubble);
  fprintf(stderr,"expt\t%f\n",expt);
  fprintf(stderr,"ice0\t%f\n",ice0);
  fprintf(stderr,"gamma\t%f\n",gamma);
  fprintf(stderr,"fprime\t%f\n",fprime);
  fprintf(stderr,"A\t%f\n",A);
  fprintf(stderr,"B\t%f\n",B);
  fprintf(stderr,"C\t%f\n",C);
  fprintf(stderr,"D\t%f\n",D);
  fprintf(stderr,"E\t%f\n",E);

  vicerror("Finished dumping values for solve_T_profile.\nTry increasing SOIL_DT to get model to complete cell.\nThen check output for instabilities.\n");
  
  return(0.0);

}

#undef MAXIT

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品国产亚洲高清剧情介绍 | 久久久噜噜噜久久中文字幕色伊伊 | 国产一区二区0| 色综合久久天天| 777奇米四色成人影色区| 中文字幕二三区不卡| 日日摸夜夜添夜夜添亚洲女人| 国产精华液一区二区三区| 欧美日韩国产中文| 国产精品美女久久福利网站 | 91丨九色丨黑人外教| 亚洲精品一区二区三区四区高清| 一区二区三区欧美亚洲| 高清shemale亚洲人妖| 欧美一区二区三区白人| 一区二区三区免费网站| 国产999精品久久久久久绿帽| 欧美一区二区三区四区五区| 樱花影视一区二区| 99精品视频一区二区三区| 久久综合久久鬼色| 精品亚洲欧美一区| 91麻豆精品久久久久蜜臀| 亚洲综合成人在线视频| 91亚洲国产成人精品一区二区三| 久久午夜老司机| 人人精品人人爱| 欧美精品一二三| 午夜不卡av免费| 欧美日韩国产综合草草| 亚洲国产裸拍裸体视频在线观看乱了 | 欧美一区二区福利视频| 亚洲成人午夜电影| 欧美怡红院视频| 一区二区三区欧美| 久久久噜噜噜久噜久久综合| 青草av.久久免费一区| 欧美一二三四区在线| 日韩在线a电影| 欧美日韩国产欧美日美国产精品| 亚洲国产视频在线| 欧美日韩不卡在线| 奇米精品一区二区三区在线观看 | 欧美性三三影院| 亚洲一级片在线观看| 欧美最猛黑人xxxxx猛交| 一区二区三区不卡在线观看| 欧美在线观看一二区| 亚洲电影第三页| 日韩午夜av电影| 国产美女一区二区| 国产女人水真多18毛片18精品视频 | 国产精品无人区| 94-欧美-setu| 亚洲一区二区三区国产| 欧美精品日韩一区| 激情综合五月婷婷| 久久精品人人做| 91丨porny丨在线| 一区二区三区.www| 91精品国产综合久久久久久| 国模一区二区三区白浆| 国产精品每日更新| 欧美日韩一级二级三级| 久久99国产精品尤物| 国产精品久久久久久一区二区三区| 91色九色蝌蚪| 毛片av中文字幕一区二区| 国产视频一区在线观看| 色天天综合久久久久综合片| 日本网站在线观看一区二区三区| 精品国产伦一区二区三区观看体验| 高清视频一区二区| 亚洲国产精品一区二区久久| 26uuu久久天堂性欧美| 91蜜桃免费观看视频| 爽爽淫人综合网网站| 中文字幕国产一区二区| 7777精品伊人久久久大香线蕉完整版| 国内精品伊人久久久久av影院| 国产精品福利一区二区三区| 欧美日韩在线直播| 粉嫩一区二区三区性色av| 午夜精品久久久久久久蜜桃app| 久久久久久久久久久黄色| 欧美日免费三级在线| 成人免费视频国产在线观看| 日日夜夜精品视频免费| 亚洲欧美日韩国产综合在线 | 在线观看视频91| 国产a区久久久| 日本va欧美va欧美va精品| 亚洲日本在线看| 国产日韩欧美精品综合| 欧美一级二级三级乱码| 在线一区二区三区四区五区| 国产成人综合网| 久久国产精品一区二区| 亚洲成人午夜电影| 亚洲日本va在线观看| 国产午夜亚洲精品午夜鲁丝片| 91麻豆精品国产自产在线观看一区| 色综合久久久久| 成人av中文字幕| 国产成人精品1024| 国产在线精品一区在线观看麻豆| 婷婷国产v国产偷v亚洲高清| 亚洲综合色区另类av| 自拍偷拍亚洲欧美日韩| 亚洲国产精品激情在线观看| 精品精品国产高清a毛片牛牛 | 欧美日韩精品福利| 亚洲激情综合网| 中日韩av电影| 国产婷婷色一区二区三区在线| 精品91自产拍在线观看一区| 日韩一区二区三区高清免费看看 | 久久99精品久久久久久国产越南 | 国产精品久99| 欧美日韩久久一区| 成人午夜精品一区二区三区| 亚洲成人1区2区| 亚洲国产精品成人综合色在线婷婷| 色哦色哦哦色天天综合| 国产自产v一区二区三区c| 亚洲欧美色图小说| 精品盗摄一区二区三区| 欧美亚洲综合久久| 成人成人成人在线视频| 久久精品72免费观看| 亚洲综合色成人| 国产精品美女久久久久久久网站| 69堂国产成人免费视频| 99热在这里有精品免费| 狠狠色丁香婷婷综合| 午夜精品影院在线观看| 亚洲日本丝袜连裤袜办公室| 久久精品亚洲乱码伦伦中文| 91精品婷婷国产综合久久性色| 99久久免费精品高清特色大片| 精品一区精品二区高清| 日韩专区欧美专区| 亚洲欧美日韩久久精品| 国产精品乱人伦| 久久婷婷色综合| 日韩免费性生活视频播放| 欧美三日本三级三级在线播放| 成人涩涩免费视频| 国产成人在线影院| 国精产品一区一区三区mba视频 | 精品少妇一区二区三区视频免付费| 日本道在线观看一区二区| 97久久人人超碰| 91首页免费视频| 91女人视频在线观看| a美女胸又www黄视频久久| 成人一区在线观看| 国v精品久久久网| 大胆亚洲人体视频| 成人国产免费视频| 99久久国产综合精品麻豆 | 国产精品美女久久久久aⅴ| 国产亚洲欧洲一区高清在线观看| 欧美一级免费大片| 精品久久久久久无| 国产偷国产偷精品高清尤物| 日本一区二区久久| 自拍偷拍亚洲欧美日韩| 亚洲欧美另类小说| 亚洲一区中文日韩| 日本午夜精品一区二区三区电影| 免费成人在线影院| 韩国中文字幕2020精品| 国产成人精品综合在线观看| 99久久99久久精品国产片果冻| 91久久精品日日躁夜夜躁欧美| 91精品办公室少妇高潮对白| 欧美三级日韩三级| 欧美xingq一区二区| 欧美国产精品v| 一区二区三区在线视频免费观看| 亚洲一区二区三区三| 轻轻草成人在线| 国产成人综合网站| 日本韩国精品在线| 精品国偷自产国产一区| 国产精品免费久久| 亚洲成人资源网| 国产成人自拍网| 欧美视频精品在线观看| 久久久精品蜜桃| 亚洲精选视频免费看| 免费在线观看视频一区| 成人动漫一区二区| 欧美一级二级三级蜜桃| 中文字幕色av一区二区三区| 三级一区在线视频先锋| av亚洲精华国产精华| 日韩一区二区电影网| 亚洲天堂中文字幕|