|
PISM, A Parallel Ice Sheet Model
stable v0.5
|
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 }
1.7.5.1