PISM, A Parallel Ice Sheet Model  stable v0.5
src/base/rheology/flowlaws.cc
Go to the documentation of this file.
00001 // Copyright (C) 2004-2012 Jed Brown, Ed Bueler, and Constantine Khroulev
00002 //
00003 // This file is part of PISM.
00004 //
00005 // PISM is free software; you can redistribute it and/or modify it under the
00006 // terms of the GNU General Public License as published by the Free Software
00007 // Foundation; either version 2 of the License, or (at your option) any later
00008 // version.
00009 //
00010 // PISM is distributed in the hope that it will be useful, but WITHOUT ANY
00011 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
00012 // FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
00013 // details.
00014 //
00015 // You should have received a copy of the GNU General Public License
00016 // along with PISM; if not, write to the Free Software
00017 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
00018 
00019 #include "flowlaws.hh"
00020 #include "pism_const.hh"
00021 #include "enthalpyConverter.hh"
00022 #include "pism_options.hh"
00023 
00024 #include "NCVariable.hh"
00025 
00026 PetscBool IceFlowLawUsesGrainSize(IceFlowLaw *flow_law) {
00027   static const PetscReal gs[] = {1e-4, 1e-3, 1e-2, 1}, s=1e4, E=500000, p=1e6;
00028   PetscReal ref = flow_law->flow(s, E, p, gs[0]);
00029   for (int i=1; i<4; i++) {
00030     if (flow_law->flow(s, E, p, gs[i]) != ref) return PETSC_TRUE;
00031   }
00032   return PETSC_FALSE;
00033 }
00034 
00035 // Rather than make this part of the base class, we just check at some reference values.
00036 PetscBool IceFlowLawIsPatersonBuddCold(IceFlowLaw *flow_law, const NCConfigVariable &config,
00037                                        EnthalpyConverter *EC) {
00038   static const struct {PetscReal s, E, p, gs;} v[] = {
00039     {1e3, 223, 1e6, 1e-3}, {450000, 475000, 500000, 525000}, {5e4, 268, 5e6, 3e-3}, {1e5, 273, 8e6, 5e-3}};
00040   ThermoGlenArrIce cpb(PETSC_COMM_SELF, NULL, config, EC); // This is unmodified cold Paterson-Budd
00041   for (int i=0; i<4; i++) {
00042     const PetscReal left  = flow_law->flow(v[i].s, v[i].E, v[i].p, v[i].gs),
00043                     right =  cpb.flow(v[i].s, v[i].E, v[i].p, v[i].gs);
00044     if (PetscAbs((left - right)/left)>1.0e-15) {
00045       return PETSC_FALSE;
00046     }
00047   }
00048   return PETSC_TRUE;
00049 }
00050 
00051 IceFlowLaw::IceFlowLaw(MPI_Comm c, const char pre[], const NCConfigVariable &config,
00052                        EnthalpyConverter *my_EC) : EC(my_EC), e(1), com(c) {
00053   PetscMemzero(prefix, sizeof(prefix));
00054   if (pre) PetscStrncpy(prefix, pre, sizeof(prefix));
00055 
00056   standard_gravity   = config.get("standard_gravity");
00057   ideal_gas_constant = config.get("ideal_gas_constant");
00058 
00059   rho          = config.get("ice_density");
00060   beta_CC_grad = config.get("beta_CC") * rho * standard_gravity;
00061   melting_point_temp = config.get("water_melting_point_temperature");
00062   n            = config.get("Glen_exponent");
00063   if (strlen(prefix) > 0)
00064     e          = config.get(string(prefix) + "enhancement_factor");
00065 
00066   A_cold = config.get("Paterson-Budd_A_cold");
00067   A_warm = config.get("Paterson-Budd_A_warm");
00068   Q_cold = config.get("Paterson-Budd_Q_cold");
00069   Q_warm = config.get("Paterson-Budd_Q_warm");
00070   crit_temp = config.get("Paterson-Budd_critical_temperature");
00071   schoofLen = config.get("Schoof_regularizing_length", "km", "m"); // convert to meters
00072   schoofVel = config.get("Schoof_regularizing_velocity", "m/year", "m/s"); // convert to m/s
00073   schoofReg = PetscSqr(schoofVel/schoofLen);
00074 }
00075 
00076 PetscErrorCode IceFlowLaw::setFromOptions() {
00077   return 0;
00078 }
00079 
00081 PetscReal IceFlowLaw::effective_viscosity(PetscReal hardness,
00082                                          PetscReal u_x, PetscReal u_y,
00083                                          PetscReal v_x, PetscReal v_y) const {
00084   const PetscReal alpha = secondInvariant(u_x, u_y, v_x, v_y);
00085   return 0.5 * hardness * pow(schoofReg + alpha, (1-n)/(2*n));
00086 }
00087 
00090 void IceFlowLaw::effective_viscosity_with_derivative(PetscReal hardness, const PetscReal Du[],
00091                                                     PetscReal *nu, PetscReal *dnu) const {
00092 
00093   const PetscReal alpha = secondInvariantDu(Du),
00094     power = (1-n)/(2*n),
00095     my_nu = 0.5 * hardness * pow(schoofReg + alpha, power),
00096     my_dnu = power * my_nu / (schoofReg + alpha);
00097 
00098   if (nu)   *nu = my_nu;
00099   if (dnu) *dnu = my_dnu;
00100 }
00101 
00103 
00104 PetscReal IceFlowLaw::softness_parameter_paterson_budd(PetscReal T_pa) const {
00105   if (T_pa < crit_temp) {
00106     return A_cold * exp(-Q_cold/(ideal_gas_constant * T_pa));
00107   }
00108   return A_warm * exp(-Q_warm/(ideal_gas_constant * T_pa));
00109 }
00110 
00112 PetscReal IceFlowLaw::flow(PetscReal stress, PetscReal enthalpy,
00113                            PetscReal pressure, PetscReal /* gs */) const {
00114   return softness_parameter(enthalpy, pressure) * pow(stress, n-1);
00115 }
00116 
00117 PetscReal IceFlowLaw::hardness_parameter(PetscReal E, PetscReal p) const {
00118   return pow(softness_parameter(E, p), -1.0/n);
00119 }
00120 
00123 
00124 PetscReal IceFlowLaw::averaged_hardness(PetscReal thickness, PetscInt kbelowH,
00125                                                  const PetscReal *zlevels,
00126                                                  const PetscReal *enthalpy) const {
00127   PetscReal B = 0;
00128 
00129   // Use trapezoidal rule to integrate from 0 to zlevels[kbelowH]:
00130   if (kbelowH > 0) {
00131     PetscReal
00132       p0 = EC->getPressureFromDepth(thickness),
00133       E0 = enthalpy[0],
00134       h0 = hardness_parameter(E0, p0); // ice hardness at the left endpoint
00135 
00136     for (int i = 1; i <= kbelowH; ++i) { // note the "1" and the "<="
00137       const PetscReal
00138         p1 = EC->getPressureFromDepth(thickness - zlevels[i]), // pressure at the right endpoint
00139         E1 = enthalpy[i], // enthalpy at the right endpoint
00140         h1 = hardness_parameter(E1, p1); // ice hardness at the right endpoint
00141 
00142       // The midpoint rule sans the "1/2":
00143       B += (zlevels[i] - zlevels[i-1]) * (h0 + h1);
00144 
00145       h0 = h1;
00146     }
00147   }
00148 
00149   // Add the "1/2":
00150   B *= 0.5;
00151 
00152   // use the "rectangle method" to integrate from
00153   // zlevels[kbelowH] to thickness:
00154   PetscReal
00155     depth = thickness - zlevels[kbelowH],
00156     p = EC->getPressureFromDepth(depth);
00157 
00158   B += depth * hardness_parameter(enthalpy[kbelowH], p);
00159 
00160   // Now B is an integral of ice hardness; next, compute the average:
00161   if (thickness > 0)
00162     B = B / thickness;
00163   else
00164     B = 0;
00165 
00166   return B;
00167 }
00168 
00169 
00174 GPBLDIce::GPBLDIce(MPI_Comm c, const char pre[],
00175                    const NCConfigVariable &config, EnthalpyConverter *my_EC)
00176   : IceFlowLaw(c, pre, config, my_EC) {
00177   T_0              = config.get("water_melting_point_temperature");    // K
00178   water_frac_coeff = config.get("gpbld_water_frac_coeff");
00179   water_frac_observed_limit
00180                    = config.get("gpbld_water_frac_observed_limit");
00181 }
00182 
00183 PetscErrorCode GPBLDIce::setFromOptions() {
00184   PetscErrorCode ierr;
00185   bool flag;
00186 
00187   ierr = IceFlowLaw::setFromOptions(); CHKERRQ(ierr);
00188 
00189   ierr = PetscOptionsBegin(com, prefix, "GPBLDIce options", NULL); CHKERRQ(ierr);
00190   {
00191     ierr = PISMOptionsReal("-ice_gpbld_water_frac_coeff",
00192                            "coefficient of softness factor in temperate ice, "
00193                            " as function of liquid water fraction; no units",
00194                            water_frac_coeff, flag); CHKERRQ(ierr);
00195     ierr = PISMOptionsReal("-ice_gpbld_water_frac_observed_limit",
00196                            "maximum value of liquid water fraction 'omega' for"
00197                            " which softness values are parameterized by Lliboutry and"
00198                            " Duval (1985); no units",
00199                            water_frac_observed_limit, flag); CHKERRQ(ierr);
00200   }
00201   ierr = PetscOptionsEnd(); CHKERRQ(ierr);
00202   return 0;
00203 }
00204 
00206 
00213 PetscReal GPBLDIce::softness_parameter(
00214                 PetscReal enthalpy, PetscReal pressure) const {
00215   PetscErrorCode ierr;
00216 
00217   if (EC == NULL) {
00218     PetscErrorPrintf("EC is NULL in GPBLDIce::softness_parameter()\n");
00219     endPrintRank();
00220   }
00221   PetscReal E_s, E_l;
00222   EC->getEnthalpyInterval(pressure, E_s, E_l);
00223   if (enthalpy < E_s) {       // cold ice
00224     PetscReal T_pa;
00225     ierr = EC->getPATemp(enthalpy, pressure, T_pa);
00226     if (ierr) {
00227       PetscErrorPrintf(
00228         "getPATemp() returned ierr>0 in GPBLDIce::softness_parameter()\n");
00229       endPrintRank();
00230     }
00231     return softness_parameter_paterson_budd( T_pa );
00232   } else { // temperate ice
00233     PetscReal omega;
00234     ierr = EC->getWaterFraction(enthalpy, pressure, omega);
00235     // as stated in \ref AschwandenBuelerBlatter, cap omega at max of observations:
00236     omega = PetscMin(omega, water_frac_observed_limit);
00237     // next line implements eqn (23) in \ref AschwandenBlatter2009
00238     return softness_parameter_paterson_budd(T_0) * (1.0 + water_frac_coeff * omega);
00239   }
00240 }
00241 
00242 // ThermoGlenIce
00243 
00245 PetscReal ThermoGlenIce::softness_parameter(PetscReal E, PetscReal pressure) const {
00246   PetscReal T_pa;
00247   EC->getPATemp(E, pressure, T_pa);
00248   return softness_parameter_from_temp(T_pa);
00249 }
00250 
00252 PetscReal ThermoGlenIce::flow(PetscReal stress, PetscReal E,
00253                                         PetscReal pressure, PetscReal gs) const {
00254   PetscReal temp;
00255   EC->getAbsTemp(E, pressure, temp);
00256   return flow_from_temp(stress, temp, pressure, gs);
00257 }
00258 
00260 PetscReal ThermoGlenIce::flow_from_temp(PetscReal stress, PetscReal temp,
00261                                         PetscReal pressure, PetscReal /*gs*/) const {
00262   // pressure-adjusted temperature:
00263   const PetscReal T_pa = temp + (beta_CC_grad / (rho * standard_gravity)) * pressure;
00264   return softness_parameter_from_temp(T_pa) * pow(stress, n-1);
00265 }
00266 
00267 // IsothermalGlenIce
00268 
00269 IsothermalGlenIce::IsothermalGlenIce(MPI_Comm c, const char pre[],
00270                                      const NCConfigVariable &config, EnthalpyConverter *my_EC)
00271   : ThermoGlenIce(c, pre, config, my_EC) {
00272   softness_A = config.get("ice_softness");
00273   hardness_B = pow(softness_A, -1/n);
00274 }
00275 
00276 // HookeIce
00277 
00278 HookeIce::HookeIce(MPI_Comm c, const char pre[],
00279                    const NCConfigVariable &config, EnthalpyConverter *my_EC)
00280   : ThermoGlenIce(c, pre, config, my_EC) {
00281   Q_Hooke  = config.get("Hooke_Q");
00282   A_Hooke  = config.get("Hooke_A");
00283   C_Hooke  = config.get("Hooke_C");
00284   K_Hooke  = config.get("Hooke_k");
00285   Tr_Hooke = config.get("Hooke_Tr");
00286 }
00287 
00288 PetscReal HookeIce::softness_parameter_from_temp(PetscReal T_pa) const {
00289   return A_Hooke * exp( -Q_Hooke/(ideal_gas_constant * T_pa)
00290                         + 3.0 * C_Hooke * pow(Tr_Hooke - T_pa, -K_Hooke));
00291 }
00292 
00293 // Goldsby-Kohlstedt (forward) ice flow law
00294 
00295 GoldsbyKohlstedtIce::GoldsbyKohlstedtIce(MPI_Comm c, const char pre[],
00296                      const NCConfigVariable &config, EnthalpyConverter *my_EC)
00297   : IceFlowLaw(c, pre, config, my_EC) {
00298 
00299   V_act_vol    = -13.e-6;  // m^3/mol
00300   d_grain_size = 1.0e-3;   // m  (see p. ?? of G&K paper)
00301   //--- dislocation creep ---
00302   disl_crit_temp=258.0,    // Kelvin
00303   //disl_A_cold=4.0e5,                  // MPa^{-4.0} s^{-1}
00304   //disl_A_warm=6.0e28,                 // MPa^{-4.0} s^{-1}
00305   disl_A_cold=4.0e-19,     // Pa^{-4.0} s^{-1}
00306   disl_A_warm=6.0e4,       // Pa^{-4.0} s^{-1} (GK)
00307   disl_n=4.0,              // stress exponent
00308   disl_Q_cold=60.e3,       // J/mol Activation energy
00309   disl_Q_warm=180.e3;      // J/mol Activation energy (GK)
00310   //--- grain boundary sliding ---
00311   gbs_crit_temp=255.0,     // Kelvin
00312   //gbs_A_cold=3.9e-3,                  // MPa^{-1.8} m^{1.4} s^{-1}
00313   //gbs_A_warm=3.e26,                   // MPa^{-1.8} m^{1.4} s^{-1}
00314   gbs_A_cold=6.1811e-14,   // Pa^{-1.8} m^{1.4} s^{-1}
00315   gbs_A_warm=4.7547e15,    // Pa^{-1.8} m^{1.4} s^{-1}
00316   gbs_n=1.8,               // stress exponent
00317   gbs_Q_cold=49.e3,        // J/mol Activation energy
00318   gbs_Q_warm=192.e3,       // J/mol Activation energy
00319   p_grain_sz_exp=1.4;      // from Peltier
00320   //--- easy slip (basal) ---
00321   //basal_A=5.5e7,                      // MPa^{-2.4} s^{-1}
00322   basal_A=2.1896e-7,       // Pa^{-2.4} s^{-1}
00323   basal_n=2.4,             // stress exponent
00324   basal_Q=60.e3;           // J/mol Activation energy
00325   //--- diffusional flow ---
00326   diff_crit_temp=258.0,    // when to use enhancement factor
00327   diff_V_m=1.97e-5,        // Molar volume (m^3/mol)
00328   diff_D_0v=9.10e-4,       // Preexponential volume diffusion (m^2/s)
00329   diff_Q_v=59.4e3,         // activation energy, vol. diff. (J/mol)
00330   diff_D_0b=5.8e-4,        // preexponential grain boundary coeff.
00331   diff_Q_b=49.e3,          // activation energy, g.b. (J/mol)
00332   diff_delta=9.04e-10;     // grain boundary width (m)
00333 }
00334 
00335 PetscReal GoldsbyKohlstedtIce::flow(PetscReal stress, PetscReal E,
00336                                     PetscReal pressure, PetscReal grainsize) const {
00337   PetscReal temp;
00338   EC->getAbsTemp(E, pressure, temp);
00339   return flow_from_temp(stress, temp, pressure, grainsize);
00340 }
00341 
00342 PetscReal GoldsbyKohlstedtIce::effective_viscosity(PetscReal,
00343                                                    PetscReal , PetscReal ,
00344                                                    PetscReal , PetscReal ) const {
00345   PetscPrintf(com, "ERROR: GoldsbyKohlstedtIce::effective_viscosity is not implemented\n");
00346   PISMEnd();
00347   return 0;
00348 }
00349 
00350 void GoldsbyKohlstedtIce::effective_viscosity_with_derivative(PetscReal, const PetscReal [],
00351                                                               PetscReal *, PetscReal *) const {
00352   PetscPrintf(com, "ERROR: GoldsbyKohlstedtIce::effective_viscosity_with_derivative is not implemented\n");
00353   PISMEnd();
00354 }
00355 
00356 PetscReal GoldsbyKohlstedtIce::averaged_hardness(PetscReal,
00357                                                  PetscInt,
00358                                                  const PetscReal *,
00359                                                  const PetscReal *) const {
00360   PetscPrintf(com, "ERROR: GoldsbyKohlstedtIce::averaged_hardness is not implemented\n");
00361   PISMEnd();
00362   return 0;
00363 }
00364 
00365 PetscReal GoldsbyKohlstedtIce::hardness_parameter(PetscReal enthalpy, PetscReal pressure) const {
00366   double softness, T_pa;
00367 
00368   // FIXME: The following is a re-implementation of the Paterson-Budd relation
00369   // for the hardness parameter. This should not be here, but we currently need
00370   // ice hardness to compute the strain heating. See SIAFD::compute_sigma().
00371   EC->getPATemp(enthalpy, pressure, T_pa);
00372 
00373   if (T_pa < crit_temp) {
00374     softness = A_cold * exp(-Q_cold/(ideal_gas_constant * T_pa));
00375   } else {
00376     softness = A_warm * exp(-Q_warm/(ideal_gas_constant * T_pa));
00377   }
00378 
00379   return pow(softness, -1.0/n);
00380 }
00381 
00382 PetscReal GoldsbyKohlstedtIce::softness_parameter(PetscReal , PetscReal ) const {
00383   PetscPrintf(com, "ERROR: GoldsbyKohlstedtIce::softness_parameter is not implemented\n");
00384   PISMEnd();
00385   return 0;
00386 }
00387 
00393 PetscReal GoldsbyKohlstedtIce::flow_from_temp(PetscReal stress, PetscReal temp,
00394                                     PetscReal pressure, PetscReal gs) const {
00395   PetscReal eps_diff, eps_disl, eps_basal, eps_gbs, diff_D_b;
00396 
00397   if (PetscAbs(stress) < 1e-10) return 0;
00398   const PetscReal T = temp + (beta_CC_grad / (rho * standard_gravity)) * pressure;
00399   const PetscReal pV = pressure * V_act_vol;
00400   const PetscReal RT = ideal_gas_constant * T;
00401   // Diffusional Flow
00402   const PetscReal diff_D_v = diff_D_0v * exp(-diff_Q_v/RT);
00403   diff_D_b = diff_D_0b * exp(-diff_Q_b/RT);
00404   if (T > diff_crit_temp) diff_D_b *= 1000; // Coble creep scaling
00405   eps_diff = 14 * diff_V_m *
00406     (diff_D_v + M_PI * diff_delta * diff_D_b / gs) / (RT*PetscSqr(gs));
00407   // Dislocation Creep
00408   if (T > disl_crit_temp)
00409     eps_disl = disl_A_warm * pow(stress, disl_n-1) * exp(-(disl_Q_warm + pV)/RT);
00410   else
00411     eps_disl = disl_A_cold * pow(stress, disl_n-1) * exp(-(disl_Q_cold + pV)/RT);
00412   // Basal Slip
00413   eps_basal = basal_A * pow(stress, basal_n-1) * exp(-(basal_Q + pV)/RT);
00414   // Grain Boundary Sliding
00415   if (T > gbs_crit_temp)
00416     eps_gbs = gbs_A_warm * (pow(stress, gbs_n-1) / pow(gs, p_grain_sz_exp)) *
00417       exp(-(gbs_Q_warm + pV)/RT);
00418   else
00419     eps_gbs = gbs_A_cold * (pow(stress, gbs_n-1) / pow(gs, p_grain_sz_exp)) *
00420       exp(-(gbs_Q_cold + pV)/RT);
00421 
00422   return eps_diff + eps_disl + (eps_basal * eps_gbs) / (eps_basal + eps_gbs);
00423 }
00424 
00425 
00426 /*****************
00427 THE NEXT PROCEDURE REPEATS CODE; INTENDED ONLY FOR DEBUGGING
00428 *****************/
00429 GKparts GoldsbyKohlstedtIce::flowParts(PetscReal stress, PetscReal temp, PetscReal pressure) const {
00430   PetscReal gs, eps_diff, eps_disl, eps_basal, eps_gbs, diff_D_b;
00431   GKparts p;
00432 
00433   if (PetscAbs(stress) < 1e-10) {
00434     p.eps_total=0.0;
00435     p.eps_diff=0.0; p.eps_disl=0.0; p.eps_gbs=0.0; p.eps_basal=0.0;
00436     return p;
00437   }
00438   const PetscReal T = temp + (beta_CC_grad / (rho * standard_gravity)) * pressure;
00439   const PetscReal pV = pressure * V_act_vol;
00440   const PetscReal RT = ideal_gas_constant * T;
00441   // Diffusional Flow
00442   const PetscReal diff_D_v = diff_D_0v * exp(-diff_Q_v/RT);
00443   diff_D_b = diff_D_0b * exp(-diff_Q_b/RT);
00444   if (T > diff_crit_temp) diff_D_b *= 1000; // Coble creep scaling
00445   gs = d_grain_size;
00446   eps_diff = 14 * diff_V_m *
00447     (diff_D_v + M_PI * diff_delta * diff_D_b / gs) / (RT*PetscSqr(gs));
00448   // Dislocation Creep
00449   if (T > disl_crit_temp)
00450     eps_disl = disl_A_warm * pow(stress, disl_n-1) * exp(-(disl_Q_warm + pV)/RT);
00451   else
00452     eps_disl = disl_A_cold * pow(stress, disl_n-1) * exp(-(disl_Q_cold + pV)/RT);
00453   // Basal Slip
00454   eps_basal = basal_A * pow(stress, basal_n-1) * exp(-(basal_Q + pV)/RT);
00455   // Grain Boundary Sliding
00456   if (T > gbs_crit_temp)
00457     eps_gbs = gbs_A_warm * (pow(stress, gbs_n-1) / pow(gs, p_grain_sz_exp)) *
00458       exp(-(gbs_Q_warm + pV)/RT);
00459   else
00460     eps_gbs = gbs_A_cold * (pow(stress, gbs_n-1) / pow(gs, p_grain_sz_exp)) *
00461       exp(-(gbs_Q_cold + pV)/RT);
00462 
00463   p.eps_diff=eps_diff;
00464   p.eps_disl=eps_disl;
00465   p.eps_basal=eps_basal;
00466   p.eps_gbs=eps_gbs;
00467   p.eps_total=eps_diff + eps_disl + (eps_basal * eps_gbs) / (eps_basal + eps_gbs);
00468   return p;
00469 }
00470 /*****************/
00471 
00472 GoldsbyKohlstedtIceStripped::GoldsbyKohlstedtIceStripped(MPI_Comm c, const char pre[],
00473                                      const NCConfigVariable &config, EnthalpyConverter *my_EC)
00474   : GoldsbyKohlstedtIce(c, pre, config, my_EC) {
00475   d_grain_size_stripped = 3.0e-3;  // m; = 3mm  (see Peltier et al 2000 paper)
00476 }
00477 
00478 
00479 PetscReal GoldsbyKohlstedtIceStripped::flow_from_temp(PetscReal stress, PetscReal temp, PetscReal pressure, PetscReal) const {
00480   // note value of gs is ignored
00481   // note pressure only effects the temperature; the "P V" term is dropped
00482   // note no diffusional flow
00483   PetscReal eps_disl, eps_basal, eps_gbs;
00484 
00485   if (PetscAbs(stress) < 1e-10) return 0;
00486   const PetscReal T = temp + (beta_CC_grad / (rho * standard_gravity)) * pressure;
00487   const PetscReal RT = ideal_gas_constant * T;
00488   // NO Diffusional Flow
00489   // Dislocation Creep
00490   if (T > disl_crit_temp)
00491     eps_disl = disl_A_warm * pow(stress, disl_n-1) * exp(-disl_Q_warm/RT);
00492   else
00493     eps_disl = disl_A_cold * pow(stress, disl_n-1) * exp(-disl_Q_cold/RT);
00494   // Basal Slip
00495   eps_basal = basal_A * pow(stress, basal_n-1) * exp(-basal_Q/RT);
00496   // Grain Boundary Sliding
00497   if (T > gbs_crit_temp)
00498     eps_gbs = gbs_A_warm *
00499               (pow(stress, gbs_n-1) / pow(d_grain_size_stripped, p_grain_sz_exp)) *
00500               exp(-gbs_Q_warm/RT);
00501   else
00502     eps_gbs = gbs_A_cold *
00503               (pow(stress, gbs_n-1) / pow(d_grain_size_stripped, p_grain_sz_exp)) *
00504               exp(-gbs_Q_cold/RT);
00505 
00506   return eps_disl + (eps_basal * eps_gbs) / (eps_basal + eps_gbs);
00507 }
 All Classes Namespaces Files Functions Variables Typedefs Friends Defines