Changeset 21729 for issm/trunk/src/c/classes/Materials/Matestar.cpp
- Timestamp:
- 05/19/17 14:48:02 (8 years ago)
- Location:
- issm/trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk
-
issm/trunk/src
- Property svn:mergeinfo changed
-
issm/trunk/src/c/classes/Materials/Matestar.cpp
r21341 r21729 134 134 /*}}}*/ 135 135 IssmDouble Matestar::GetA(){/*{{{*/ 136 _error_("not implemented yet"); 136 /* 137 * A = 1/B^n 138 */ 139 140 IssmDouble B,n; 141 142 element->inputs->GetInputAverage(&B,MaterialsRheologyBEnum); 143 n=this->GetN(); 144 145 return pow(B,-n); 137 146 } 138 147 /*}}}*/ 139 148 IssmDouble Matestar::GetAbar(){/*{{{*/ 140 _error_("not implemented yet"); 149 /* 150 * A = 1/B^n 151 */ 152 153 IssmDouble B,n; 154 155 element->inputs->GetInputAverage(&B,MaterialsRheologyBbarEnum); 156 n=this->GetN(); 157 158 return pow(B,-n); 141 159 } 142 160 /*}}}*/ 143 161 IssmDouble Matestar::GetB(){/*{{{*/ 144 _error_("not implemented yet"); 162 163 /*Output*/ 164 IssmDouble B; 165 166 element->inputs->GetInputAverage(&B,MaterialsRheologyBEnum); 167 return B; 145 168 } 146 169 /*}}}*/ 147 170 IssmDouble Matestar::GetBbar(){/*{{{*/ 148 171 149 _error_("not implemented yet"); 172 /*Output*/ 173 IssmDouble Bbar; 174 175 element->inputs->GetInputAverage(&Bbar,MaterialsRheologyBbarEnum); 176 return Bbar; 150 177 } 151 178 /*}}}*/ … … 159 186 } 160 187 /*}}}*/ 188 IssmDouble Matestar::GetEc(){/*{{{*/ 189 190 /*Output*/ 191 IssmDouble Ec; 192 193 element->inputs->GetInputAverage(&Ec,MaterialsRheologyEcEnum); 194 return Ec; 195 } 196 /*}}}*/ 197 IssmDouble Matestar::GetEcbar(){/*{{{*/ 198 199 /*Output*/ 200 IssmDouble Ecbar; 201 202 element->inputs->GetInputAverage(&Ecbar,MaterialsRheologyEcbarEnum); 203 return Ecbar; 204 } 205 /*}}}*/ 206 IssmDouble Matestar::GetEs(){/*{{{*/ 207 208 /*Output*/ 209 IssmDouble Es; 210 211 element->inputs->GetInputAverage(&Es,MaterialsRheologyEsEnum); 212 return Es; 213 } 214 /*}}}*/ 215 IssmDouble Matestar::GetEsbar(){/*{{{*/ 216 217 /*Output*/ 218 IssmDouble Esbar; 219 220 element->inputs->GetInputAverage(&Esbar,MaterialsRheologyEsbarEnum); 221 return Esbar; 222 } 223 /*}}}*/ 161 224 IssmDouble Matestar::GetN(){/*{{{*/ 162 _error_("not implemented yet"); 225 226 /*Output*/ 227 IssmDouble n=3.0; 228 return n; 163 229 } 164 230 /*}}}*/ 165 231 void Matestar::GetViscosity(IssmDouble* pviscosity,IssmDouble eps_eff){/*{{{*/ 166 232 _error_("not implemented yet"); 167 /*From a string tensor and a material object, return viscosity, using Glen's flow law. 168 (1-D) B 169 viscosity= ------------------------- 170 2 eps_eff ^[(n-1)/n] 171 172 where viscosity is the viscotiy, B the flow law parameter , eps_eff is the effective strain rate 173 and n the flow law exponent. 174 175 If eps_eff = 0 , it means this is the first time SystemMatrices is being run, and we 176 return 10^14, initial viscosity. 177 */ 233 } 234 /*}}}*/ 235 void Matestar::GetViscosityBar(IssmDouble* pviscosity,IssmDouble eps_eff){/*{{{*/ 236 _error_("not implemented yet"); 237 } 238 /*}}}*/ 239 void Matestar::GetViscosityComplement(IssmDouble* pviscosity_complement, IssmDouble* epsilon){/*{{{*/ 240 _error_("not implemented yet"); 241 } 242 /*}}}*/ 243 void Matestar::GetViscosityDComplement(IssmDouble* pviscosity_complement, IssmDouble* epsilon){/*{{{*/ 244 _error_("not implemented yet"); 245 } 246 /*}}}*/ 247 void Matestar::GetViscosityDerivativeEpsSquare(IssmDouble* pmu_prime, IssmDouble* epsilon){/*{{{*/ 248 _error_("not implemented yet"); 249 } 250 /*}}}*/ 251 IssmDouble Matestar::GetViscosityGeneral(IssmDouble vx,IssmDouble vy,IssmDouble vz,IssmDouble* dvx,IssmDouble* dvy,IssmDouble* dvz,bool isdepthaveraged){/*{{{*/ 178 252 179 253 /*output: */ 180 254 IssmDouble viscosity; 181 255 182 /*Intermediary: */ 183 IssmDouble B,D=0.,n; 184 185 /*Get B and n*/ 186 B=GetB(); _assert_(B>0.); 187 n=GetN(); _assert_(n>0.); 188 189 if (n==1.){ 190 /*Linear Viscous behavior (Newtonian fluid) viscosity=B/2: */ 191 viscosity=(1.-D)*B/2.; 192 } 193 else{ 194 195 /*if no strain rate, return maximum viscosity*/ 196 if(eps_eff==0.){ 197 viscosity = 1.e+14/2.; 198 //viscosity = B; 199 //viscosity=2.5*pow(10.,17); 200 } 201 202 else{ 203 viscosity=(1.-D)*B/(2.*pow(eps_eff,(n-1.)/n)); 204 } 205 } 206 207 /*Checks in debugging mode*/ 208 if(viscosity<=0) _error_("Negative viscosity"); 209 210 /*Return: */ 211 *pviscosity=viscosity; 212 } 213 /*}}}*/ 214 void Matestar::GetViscosityBar(IssmDouble* pviscosity,IssmDouble eps_eff){/*{{{*/ 215 _error_("not implemented yet"); 216 } 217 /*}}}*/ 218 void Matestar::GetViscosityComplement(IssmDouble* pviscosity_complement, IssmDouble* epsilon){/*{{{*/ 219 _error_("not implemented yet"); 220 } 221 /*}}}*/ 222 void Matestar::GetViscosityDComplement(IssmDouble* pviscosity_complement, IssmDouble* epsilon){/*{{{*/ 223 _error_("not implemented yet"); 224 } 225 /*}}}*/ 226 void Matestar::GetViscosityDerivativeEpsSquare(IssmDouble* pmu_prime, IssmDouble* epsilon){/*{{{*/ 227 _error_("not implemented yet"); 228 } 229 /*}}}*/ 230 IssmDouble Matestar::GetViscosityGeneral(IssmDouble ko,IssmDouble Ec, IssmDouble Es,IssmDouble vx,IssmDouble vy,IssmDouble vz,IssmDouble* dvx,IssmDouble* dvy,IssmDouble* dvz){/*{{{*/ 231 232 /*Intermediaries*/ 233 IssmDouble viscosity; 234 IssmDouble E,lambdas; 235 IssmDouble epso,epsprime_norm; 256 /*Intermediaries*/ 257 IssmDouble epseff,epsprime_norm; 258 IssmDouble lambdas; 236 259 IssmDouble vmag,dvmag[3]; 260 IssmDouble B,Ec,Es,E,n; 237 261 238 262 /*Calculate velocity magnitude and its derivative*/ … … 249 273 } 250 274 251 EstarStrainrateQuantities(&epso,&epsprime_norm,vx,vy,vz,vmag,dvx,dvy,dvz,&dvmag[0]); 252 lambdas=EstarLambdaS(epso,epsprime_norm); 275 EstarStrainrateQuantities(&epseff,&epsprime_norm,vx,vy,vz,vmag,dvx,dvy,dvz,&dvmag[0]); 276 lambdas=EstarLambdaS(epseff,epsprime_norm); 277 278 /*Get B and enhancement*/ 279 n=GetN(); _assert_(n>0.); 280 if (isdepthaveraged==0.){ 281 B=GetB(); _assert_(B>0.); 282 Ec=GetEc(); _assert_(Ec>=0.); 283 Es=GetEs(); _assert_(Es>=0.); 284 } 285 else{ 286 B=GetBbar(); _assert_(B>0.); 287 Ec=GetEcbar(); _assert_(Ec>=0.); 288 Es=GetEsbar(); _assert_(Es>=0.); 289 } 253 290 254 291 /*Get total enhancement factor E(lambdas)*/ 255 E = Ec + (Es-Ec)*lambdas*lambdas; 292 E = Ec + (Es-Ec)*lambdas*lambdas; _assert_(E>0.); 256 293 257 294 /*Compute viscosity*/ 258 _assert_(E>0.); 259 _assert_(ko>0.); 260 _assert_(epso>0.); 261 viscosity = 1./(2*pow(ko*E*epso*epso,1./3.)); 295 /*if no strain rate, return maximum viscosity*/ 296 if(epseff==0.){ 297 viscosity = 1.e+14/2.; 298 //viscosity = B; 299 //viscosity=2.5*pow(10.,17); 300 } 301 else{ 302 viscosity = B/(2.*pow(E,1./n)*pow(epseff,2./n)); 303 } 262 304 263 305 /*Assign output pointer*/ … … 265 307 } 266 308 /*}}}*/ 309 IssmDouble Matestar::GetViscosity_BGeneral(IssmDouble vx,IssmDouble vy,IssmDouble vz,IssmDouble* dvx,IssmDouble* dvy,IssmDouble* dvz,bool isdepthaveraged){/*{{{*/ 310 311 /*Intermediaries*/ 312 IssmDouble dmudB; 313 IssmDouble epseff,epsprime_norm; 314 IssmDouble lambdas; 315 IssmDouble vmag,dvmag[3]; 316 IssmDouble Ec,Es,E; 317 318 /*Calculate velocity magnitude and its derivative*/ 319 vmag = sqrt(vx*vx+vy*vy+vz*vz); 320 if(vmag<1e-12){ 321 dvmag[0]=0; 322 dvmag[1]=0; 323 dvmag[2]=0; 324 } 325 else{ 326 dvmag[0]=1./(2*sqrt(vmag))*(2*vx*dvx[0]+2*vy*dvy[0]+2*vz*dvz[0]); 327 dvmag[1]=1./(2*sqrt(vmag))*(2*vx*dvx[1]+2*vy*dvy[1]+2*vz*dvz[1]); 328 dvmag[2]=1./(2*sqrt(vmag))*(2*vx*dvx[2]+2*vy*dvy[2]+2*vz*dvz[2]); 329 } 330 331 EstarStrainrateQuantities(&epseff,&epsprime_norm,vx,vy,vz,vmag,dvx,dvy,dvz,&dvmag[0]); 332 lambdas=EstarLambdaS(epseff,epsprime_norm); 333 334 /*Get enhancement*/ 335 if (isdepthaveraged==0.){ 336 Ec=GetEc(); _assert_(Ec>=0.); 337 Es=GetEs(); _assert_(Es>=0.); 338 } 339 else{ 340 Ec=GetEcbar(); _assert_(Ec>=0.); 341 Es=GetEsbar(); _assert_(Es>=0.); 342 } 343 344 /*Get total enhancement factor E(lambdas)*/ 345 E = Ec + (Es-Ec)*lambdas*lambdas; _assert_(E>0.); 346 347 /*Compute dmudB*/ 348 if(epseff==0.) dmudB = 0.; 349 else dmudB = 1./(2.*pow(E,1./3.)*pow(epseff,2./3.)); 350 351 /*Assign output*/ 352 return dmudB; 353 354 } 355 /*}}}*/ 267 356 void Matestar::GetViscosity_B(IssmDouble* pdmudB,IssmDouble eps_eff){/*{{{*/ 268 _error_("not implemented yet");357 _error_("not implemented yet"); 269 358 } 270 359 /*}}}*/ … … 319 408 } 320 409 /*}}}*/ 321 void Matestar::Viscosity FS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){/*{{{*/410 void Matestar::ViscosityBFS(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){/*{{{*/ 322 411 323 412 /*Intermediaries*/ 324 413 IssmDouble vx,vy,vz; 325 414 IssmDouble dvx[3],dvy[3],dvz[3]; 326 IssmDouble ko,Ec,Es;415 bool isdepthaveraged=0.; 327 416 328 417 /*Get velocity derivatives in all directions*/ … … 344 433 } 345 434 346 /*Get enhancement factors and ko*/ 347 Input* ec_input = element->inputs->GetInput(MaterialsRheologyEcEnum); _assert_(ec_input); 348 Input* es_input = element->inputs->GetInput(MaterialsRheologyEsEnum); _assert_(es_input); 349 Input* ko_input = element->inputs->GetInput(MaterialsRheologyKoEnum); _assert_(ko_input); 350 ec_input->GetInputValue(&Ec,gauss); 351 es_input->GetInputValue(&Es,gauss); 352 ko_input->GetInputValue(&ko,gauss); 353 354 /*Compute viscosity*/ 355 *pviscosity=GetViscosityGeneral(ko,Ec,Es,vx,vy,vz,&dvx[0],&dvy[0],&dvz[0]); 356 } 357 /*}}}*/ 358 void Matestar::ViscosityFSDerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon){/*{{{*/ 359 this->GetViscosityDerivativeEpsSquare(pmu_prime,epsilon); 360 }/*}}}*/ 361 void Matestar::ViscosityHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/ 435 /*Compute dmudB*/ 436 *pdmudB=GetViscosity_BGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],isdepthaveraged); 437 } 438 /*}}}*/ 439 void Matestar::ViscosityBHO(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/ 362 440 363 441 /*Intermediaries*/ 364 442 IssmDouble vx,vy,vz; 365 443 IssmDouble dvx[3],dvy[3],dvz[3]; 366 IssmDouble ko,Ec,Es;444 bool isdepthaveraged=0.; 367 445 368 446 /*Get velocity derivatives in all directions*/ … … 384 462 dvz[0] = 0.; dvz[1] = 0.; dvz[2] = -dvx[0]-dvy[1]; 385 463 386 /*Get enhancement factors and ko*/387 Input* ec_input = element->inputs->GetInput(MaterialsRheologyEcEnum); _assert_(ec_input);388 Input* es_input = element->inputs->GetInput(MaterialsRheologyEsEnum); _assert_(es_input);389 Input* ko_input = element->inputs->GetInput(MaterialsRheologyKoEnum); _assert_(ko_input);390 ec_input->GetInputValue(&Ec,gauss);391 es_input->GetInputValue(&Es,gauss);392 ko_input->GetInputValue(&ko,gauss);393 394 464 /*Compute viscosity*/ 395 *pviscosity=GetViscosityGeneral(ko,Ec,Es,vx,vy,vz,&dvx[0],&dvy[0],&dvz[0]); 396 }/*}}}*/ 397 void Matestar::ViscosityHODerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon){/*{{{*/ 398 _error_("not implemented yet"); 399 }/*}}}*/ 400 void Matestar::ViscosityL1L2(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* surface_input){/*{{{*/ 401 _error_("not implemented yet"); 402 }/*}}}*/ 403 void Matestar::ViscositySSA(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/ 465 *pdmudB=GetViscosity_BGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],isdepthaveraged); 466 }/*}}}*/ 467 void Matestar::ViscosityBSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/ 404 468 /*Intermediaries*/ 405 469 IssmDouble vx,vy,vz; 406 470 IssmDouble dvx[3],dvy[3],dvz[3]; 407 IssmDouble ko,Ec,Es;471 bool isdepthaveraged=1.; 408 472 409 473 /*Get velocity derivatives in all directions*/ … … 428 492 dvz[0] = 0.; dvz[1] = 0.; dvz[2] = -dvx[0]-dvy[1]; 429 493 430 /*Get enhancement factors and ko*/431 Input* ec_input = element->inputs->GetInput(MaterialsRheologyEcbarEnum); _assert_(ec_input);432 Input* es_input = element->inputs->GetInput(MaterialsRheologyEsbarEnum); _assert_(es_input);433 Input* ko_input = element->inputs->GetInput(MaterialsRheologyKobarEnum); _assert_(ko_input);434 ec_input->GetInputValue(&Ec,gauss);435 es_input->GetInputValue(&Es,gauss);436 ko_input->GetInputValue(&ko,gauss);437 438 494 /*Compute viscosity*/ 439 *pviscosity=GetViscosityGeneral(ko,Ec,Es,vx,vy,vz,&dvx[0],&dvy[0],&dvz[0]); 495 *pdmudB=GetViscosity_BGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],isdepthaveraged); 496 }/*}}}*/ 497 void Matestar::ViscosityFS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){/*{{{*/ 498 499 /*Intermediaries*/ 500 IssmDouble vx,vy,vz; 501 IssmDouble dvx[3],dvy[3],dvz[3]; 502 bool isdepthaveraged=0.; 503 504 /*Get velocity derivatives in all directions*/ 505 _assert_(dim>1); 506 _assert_(vx_input); 507 vx_input->GetInputValue(&vx,gauss); 508 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss); 509 _assert_(vy_input); 510 vy_input->GetInputValue(&vy,gauss); 511 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss); 512 if(dim==3){ 513 _assert_(vz_input); 514 vz_input->GetInputValue(&vz,gauss); 515 vz_input->GetInputDerivativeValue(&dvz[0],xyz_list,gauss); 516 } 517 else{ 518 vz = 0.; 519 dvz[0] = 0.; dvz[1] = 0.; dvz[2] = 0.; 520 } 521 522 /*Compute viscosity*/ 523 *pviscosity=GetViscosityGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],isdepthaveraged); 524 } 525 /*}}}*/ 526 void Matestar::ViscosityFSDerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon){/*{{{*/ 527 this->GetViscosityDerivativeEpsSquare(pmu_prime,epsilon); 528 }/*}}}*/ 529 void Matestar::ViscosityHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/ 530 531 /*Intermediaries*/ 532 IssmDouble vx,vy,vz; 533 IssmDouble dvx[3],dvy[3],dvz[3]; 534 bool isdepthaveraged=0.; 535 536 /*Get velocity derivatives in all directions*/ 537 _assert_(dim==2 || dim==3); 538 _assert_(vx_input); 539 vx_input->GetInputValue(&vx,gauss); 540 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss); 541 if(dim==3){ 542 _assert_(vy_input); 543 vy_input->GetInputValue(&vy,gauss); 544 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss); 545 } 546 else{ 547 dvx[2] = 0.; 548 vy = 0.; 549 dvy[0] = 0.; dvy[1] = 0.; dvy[2] = 0.; 550 } 551 vz = 0.; 552 dvz[0] = 0.; dvz[1] = 0.; dvz[2] = -dvx[0]-dvy[1]; 553 554 /*Compute viscosity*/ 555 *pviscosity=GetViscosityGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],isdepthaveraged); 556 }/*}}}*/ 557 void Matestar::ViscosityHODerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon){/*{{{*/ 558 _error_("not implemented yet"); 559 }/*}}}*/ 560 void Matestar::ViscosityL1L2(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* surface_input){/*{{{*/ 561 _error_("not implemented yet"); 562 }/*}}}*/ 563 void Matestar::ViscositySSA(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/ 564 565 /*Intermediaries*/ 566 IssmDouble vx,vy,vz; 567 IssmDouble dvx[3],dvy[3],dvz[3]; 568 bool isdepthaveraged=1.; 569 570 /*Get velocity derivatives in all directions*/ 571 _assert_(dim==1 || dim==2); 572 _assert_(vx_input); 573 vx_input->GetInputValue(&vx,gauss); 574 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss); 575 if(dim==2){ 576 _assert_(vy_input); 577 vy_input->GetInputValue(&vy,gauss); 578 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss); 579 } 580 else{ 581 dvx[1] = 0.; 582 dvx[2] = 0.; 583 vy = 0.; 584 dvy[0] = 0.; dvy[1] = 0.; dvy[2] = 0.; 585 } 586 dvx[2] = 0.; 587 dvy[2] = 0.; 588 vz = 0.; 589 dvz[0] = 0.; dvz[1] = 0.; dvz[2] = -dvx[0]-dvy[1]; 590 591 /*Compute viscosity*/ 592 *pviscosity=GetViscosityGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],isdepthaveraged); 440 593 }/*}}}*/ 441 594 void Matestar::ViscositySSADerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon){/*{{{*/
Note:
See TracChangeset
for help on using the changeset viewer.