source: issm/trunk-jpl/src/c/classes/Materials/Matestar.cpp@ 25508

Last change on this file since 25508 was 25508, checked in by Mathieu Morlighem, 5 years ago

CHG: Marshall2 -> Marshall

File size: 16.9 KB
RevLine 
[20687]1/*!\file Matestar.c
2 * \brief: implementation of the Matestar object
3 */
4
5#ifdef HAVE_CONFIG_H
6 #include <config.h>
7#else
8#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
9#endif
10
11#include "./Matestar.h"
12#include "./Materials.h"
13#include "../Elements/Element.h"
14#include "../Elements/Tria.h"
15#include "../Elements/Penta.h"
16#include "../Params/Parameters.h"
17#include "../Vertex.h"
18#include "../Hook.h"
19#include "../Node.h"
20#include "../IoModel.h"
21#include "../../shared/shared.h"
22
23/*Matestar constructors and destructor*/
24Matestar::Matestar(){/*{{{*/
25 this->helement=NULL;
26 this->element=NULL;
27 return;
28}
29/*}}}*/
30Matestar::Matestar(int matestar_mid,int index, IoModel* iomodel){/*{{{*/
31
32 /*Intermediaries:*/
33 int matestar_eid;
34
35 /*Initialize id*/
36 this->mid=matestar_mid;
37
38 /*Hooks: */
39 matestar_eid=index+1;
40 this->helement=new Hook(&matestar_eid,1);
41 this->element=NULL;
42
43 return;
44}
45/*}}}*/
46Matestar::~Matestar(){/*{{{*/
47 delete helement;
48 return;
49}
50/*}}}*/
51
52/*Object virtual functions definitions:*/
53Object* Matestar::copy() {/*{{{*/
54
55 /*Output*/
56 Matestar* matestar=NULL;
57
58 /*Initialize output*/
59 matestar=new Matestar();
60
61 /*copy fields: */
62 matestar->mid=this->mid;
63 matestar->helement=(Hook*)this->helement->copy();
64 matestar->element =(Element*)this->helement->delivers();
65
66 return matestar;
67}
68/*}}}*/
69Material* Matestar::copy2(Element* element_in) {/*{{{*/
70
71 /*Output*/
72 Matestar* matestar=NULL;
73
74 /*Initialize output*/
75 matestar=new Matestar();
76
77 /*copy fields: */
78 matestar->mid=this->mid;
79 matestar->helement=(Hook*)this->helement->copy();
80 matestar->element =element_in;
81
82 return matestar;
83}
84/*}}}*/
85void Matestar::DeepEcho(void){/*{{{*/
86
87 _printf_("Matestar:\n");
88 _printf_(" mid: " << mid << "\n");
89 _printf_(" element:\n");
90 helement->Echo();
91}
92/*}}}*/
93void Matestar::Echo(void){/*{{{*/
94
95 _printf_("Matestar:\n");
96 _printf_(" mid: " << mid << "\n");
97 _printf_(" element:\n");
98 helement->Echo();
99}
100/*}}}*/
101int Matestar::Id(void){ return mid; }/*{{{*/
102/*}}}*/
[25508]103void Matestar::Marshall(MarshallHandle* marshallhandle){ /*{{{*/
[25506]104
105 if(marshallhandle->OperationNumber()==MARSHALLING_LOAD)helement=new Hook();
106
107 int object_enum = MatestarEnum;
108 marshallhandle->call(object_enum);
109
110 marshallhandle->call(this->mid);
[25508]111 this->helement->Marshall(marshallhandle);
[25506]112 this->element=(Element*)this->helement->delivers();
113
114}
115/*}}}*/
[20827]116int Matestar::ObjectEnum(void){/*{{{*/
[20687]117
[20827]118 return MatestarEnum;
119
120}
121/*}}}*/
122
[20687]123/*Matestar management*/
124void Matestar::Configure(Elements* elementsin){/*{{{*/
125
126 /*Take care of hooking up all objects for this element, ie links the objects in the hooks to their respective
127 * datasets, using internal ids and offsets hidden in hooks: */
128 helement->configure((DataSet*)elementsin);
129 this->element = (Element*)helement->delivers();
130}
131/*}}}*/
[22105]132IssmDouble Matestar::GetA(Gauss* gauss){/*{{{*/
[21381]133 /*
134 * A = 1/B^n
[22306]135 */
[21381]136
[22306]137 IssmDouble B=this->GetB(gauss);
138 IssmDouble n=this->GetN();
[21381]139
140 return pow(B,-n);
[20687]141}
142/*}}}*/
[22105]143IssmDouble Matestar::GetAbar(Gauss* gauss){/*{{{*/
[21381]144 /*
145 * A = 1/B^n
146 */
147
[22306]148 IssmDouble B=this->GetBbar(gauss);
149 IssmDouble n=this->GetN();
[21381]150
151 return pow(B,-n);
[20687]152}
153/*}}}*/
[22105]154IssmDouble Matestar::GetB(Gauss* gauss){/*{{{*/
[21700]155
[21381]156 /*Output*/
157 IssmDouble B;
158
[25379]159 Input* B_input = element->GetInput(MaterialsRheologyBEnum); _assert_(B_input);
[22306]160 B_input->GetInputValue(&B,gauss);
[21381]161 return B;
[20687]162}
163/*}}}*/
[22105]164IssmDouble Matestar::GetBbar(Gauss* gauss){/*{{{*/
[21700]165
[21381]166 /*Output*/
167 IssmDouble Bbar;
[20687]168
[25379]169 Input* B_input = element->GetInput(MaterialsRheologyBbarEnum); _assert_(B_input);
[22306]170 B_input->GetInputValue(&Bbar,gauss);
[21381]171 return Bbar;
[20687]172}
173/*}}}*/
[22105]174IssmDouble Matestar::GetD(Gauss* gauss){/*{{{*/
[20687]175 _error_("not implemented yet");
176}
177/*}}}*/
[22105]178IssmDouble Matestar::GetDbar(Gauss* gauss){/*{{{*/
[20687]179
180 _error_("not implemented yet");
181}
182/*}}}*/
[22105]183IssmDouble Matestar::GetEc(Gauss* gauss){/*{{{*/
[21381]184
185 /*Output*/
186 IssmDouble Ec;
187
[25379]188 Input* Ec_input = element->GetInput(MaterialsRheologyEcEnum); _assert_(Ec_input);
[22306]189 Ec_input->GetInputValue(&Ec,gauss);
[21381]190 return Ec;
191}
192/*}}}*/
[22105]193IssmDouble Matestar::GetEcbar(Gauss* gauss){/*{{{*/
[21700]194
195 /*Output*/
196 IssmDouble Ecbar;
197
[25379]198 Input* Ecbar_input = element->GetInput(MaterialsRheologyEcbarEnum); _assert_(Ecbar_input);
[22306]199 Ecbar_input->GetInputValue(&Ecbar,gauss);
[21700]200 return Ecbar;
201}
202/*}}}*/
[22105]203IssmDouble Matestar::GetEs(Gauss* gauss){/*{{{*/
[21381]204
205 /*Output*/
206 IssmDouble Es;
207
[25379]208 Input* Es_input = element->GetInput(MaterialsRheologyEsEnum); _assert_(Es_input);
[22306]209 Es_input->GetInputValue(&Es,gauss);
[21381]210 return Es;
211}
212/*}}}*/
[22105]213IssmDouble Matestar::GetEsbar(Gauss* gauss){/*{{{*/
[21700]214
215 /*Output*/
216 IssmDouble Esbar;
217
[25379]218 Input* Esbar_input = element->GetInput(MaterialsRheologyEsbarEnum); _assert_(Esbar_input);
[22306]219 Esbar_input->GetInputValue(&Esbar,gauss);
[21700]220 return Esbar;
221}
222/*}}}*/
[20827]223IssmDouble Matestar::GetN(){/*{{{*/
[21407]224
225 /*Output*/
226 IssmDouble n=3.0;
227 return n;
[20687]228}
229/*}}}*/
[22105]230void Matestar::GetViscosity(IssmDouble* pviscosity,IssmDouble eps_eff,Gauss* gauss){/*{{{*/
[20687]231 _error_("not implemented yet");
232}
233/*}}}*/
[22105]234void Matestar::GetViscosityBar(IssmDouble* pviscosity,IssmDouble eps_eff,Gauss* gauss){/*{{{*/
[20687]235 _error_("not implemented yet");
236}
237/*}}}*/
[22105]238void Matestar::GetViscosityComplement(IssmDouble* pviscosity_complement, IssmDouble* epsilon,Gauss* gauss){/*{{{*/
[20687]239 _error_("not implemented yet");
240}
241/*}}}*/
[22105]242void Matestar::GetViscosityDComplement(IssmDouble* pviscosity_complement, IssmDouble* epsilon,Gauss* gauss){/*{{{*/
[20687]243 _error_("not implemented yet");
244}
245/*}}}*/
[22105]246void Matestar::GetViscosityDerivativeEpsSquare(IssmDouble* pmu_prime, IssmDouble* epsilon,Gauss* gauss){/*{{{*/
[20687]247 _error_("not implemented yet");
248}
249/*}}}*/
[22105]250IssmDouble Matestar::GetViscosityGeneral(IssmDouble vx,IssmDouble vy,IssmDouble vz,IssmDouble* dvx,IssmDouble* dvy,IssmDouble* dvz,IssmDouble eps_eff,bool isdepthaveraged,Gauss* gauss){/*{{{*/
[20827]251
[21700]252 /*output: */
253 IssmDouble viscosity;
254
[20827]255 /*Intermediaries*/
[21826]256 IssmDouble epsprime_norm;
[21381]257 IssmDouble lambdas;
[20827]258 IssmDouble vmag,dvmag[3];
[21700]259 IssmDouble B,Ec,Es,E,n;
[20827]260
261 /*Calculate velocity magnitude and its derivative*/
262 vmag = sqrt(vx*vx+vy*vy+vz*vz);
263 if(vmag<1e-12){
264 dvmag[0]=0;
265 dvmag[1]=0;
266 dvmag[2]=0;
267 }
268 else{
269 dvmag[0]=1./(2*sqrt(vmag))*(2*vx*dvx[0]+2*vy*dvy[0]+2*vz*dvz[0]);
270 dvmag[1]=1./(2*sqrt(vmag))*(2*vx*dvx[1]+2*vy*dvy[1]+2*vz*dvz[1]);
271 dvmag[2]=1./(2*sqrt(vmag))*(2*vx*dvx[2]+2*vy*dvy[2]+2*vz*dvz[2]);
272 }
273
[21826]274 EstarStrainrateQuantities(&epsprime_norm,vx,vy,vz,vmag,dvx,dvy,dvz,&dvmag[0]);
275 lambdas=EstarLambdaS(eps_eff,epsprime_norm);
[20827]276
[21381]277 /*Get B and enhancement*/
[21700]278 n=GetN(); _assert_(n>0.);
279 if (isdepthaveraged==0.){
[22105]280 B=GetB(gauss); _assert_(B>0.);
281 Ec=GetEc(gauss); _assert_(Ec>=0.); Es=GetEs(gauss); _assert_(Es>=0.);
[21700]282 }
283 else{
[22105]284 B=GetBbar(gauss); _assert_(B>0.);
285 Ec=GetEcbar(gauss); _assert_(Ec>=0.);
286 Es=GetEsbar(gauss); _assert_(Es>=0.);
[21700]287 }
[21381]288
[20827]289 /*Get total enhancement factor E(lambdas)*/
[21381]290 E = Ec + (Es-Ec)*lambdas*lambdas; _assert_(E>0.);
[20827]291
292 /*Compute viscosity*/
[21381]293 /*if no strain rate, return maximum viscosity*/
[21826]294 if(eps_eff==0.){
[21381]295 viscosity = 1.e+14/2.;
296 //viscosity = B;
297 //viscosity=2.5*pow(10.,17);
298 }
299 else{
[21826]300 viscosity = B/(2.*pow(E,1./n)*pow(eps_eff,2./n));
[21381]301 }
[20827]302
[21826]303 /*Checks in debugging mode*/
304 if(viscosity<=0) _error_("Negative viscosity");
305
[20827]306 /*Assign output pointer*/
307 return viscosity;
[20687]308}
309/*}}}*/
[22105]310IssmDouble Matestar::GetViscosity_BGeneral(IssmDouble vx,IssmDouble vy,IssmDouble vz,IssmDouble* dvx,IssmDouble* dvy,IssmDouble* dvz,IssmDouble eps_eff,bool isdepthaveraged,Gauss* gauss){/*{{{*/
[21700]311
312 /*Intermediaries*/
[21407]313 IssmDouble dmudB;
[21826]314 IssmDouble epsprime_norm;
[21700]315 IssmDouble lambdas;
316 IssmDouble vmag,dvmag[3];
317 IssmDouble Ec,Es,E;
[21407]318
[21700]319 /*Calculate velocity magnitude and its derivative*/
320 vmag = sqrt(vx*vx+vy*vy+vz*vz);
321 if(vmag<1e-12){
322 dvmag[0]=0;
323 dvmag[1]=0;
324 dvmag[2]=0;
325 }
326 else{
327 dvmag[0]=1./(2*sqrt(vmag))*(2*vx*dvx[0]+2*vy*dvy[0]+2*vz*dvz[0]);
328 dvmag[1]=1./(2*sqrt(vmag))*(2*vx*dvx[1]+2*vy*dvy[1]+2*vz*dvz[1]);
329 dvmag[2]=1./(2*sqrt(vmag))*(2*vx*dvx[2]+2*vy*dvy[2]+2*vz*dvz[2]);
330 }
[21407]331
[21826]332 EstarStrainrateQuantities(&epsprime_norm,vx,vy,vz,vmag,dvx,dvy,dvz,&dvmag[0]);
333 lambdas=EstarLambdaS(eps_eff,epsprime_norm);
[21700]334
335 /*Get enhancement*/
336 if (isdepthaveraged==0.){
[22105]337 Ec=GetEc(gauss); _assert_(Ec>=0.);
338 Es=GetEs(gauss); _assert_(Es>=0.);
[21407]339 }
340 else{
[22105]341 Ec=GetEcbar(gauss); _assert_(Ec>=0.);
342 Es=GetEsbar(gauss); _assert_(Es>=0.);
[21407]343 }
344
[21700]345 /*Get total enhancement factor E(lambdas)*/
346 E = Ec + (Es-Ec)*lambdas*lambdas; _assert_(E>0.);
347
348 /*Compute dmudB*/
[21826]349 if(eps_eff==0.) dmudB = 0.;
[22105]350 else dmudB = 1./(2.*pow(E,1./3.)*pow(eps_eff,2./3.));
[21700]351
352 /*Assign output*/
353 return dmudB;
354
[20687]355}
356/*}}}*/
[22105]357void Matestar::GetViscosity_B(IssmDouble* pdmudB,IssmDouble eps_eff,Gauss* gauss){/*{{{*/
[21700]358 _error_("not implemented yet");
359}
360/*}}}*/
[22105]361void Matestar::GetViscosity_D(IssmDouble* pdmudD,IssmDouble eps_eff,Gauss* gauss){/*{{{*/
[20827]362 _error_("not implemented yet");
[20687]363}
364/*}}}*/
[22105]365void Matestar::GetViscosity2dDerivativeEpsSquare(IssmDouble* pmu_prime, IssmDouble* epsilon,Gauss* gauss){/*{{{*/
[20827]366 _error_("not implemented yet");
[20687]367}
368/*}}}*/
[20827]369bool Matestar::IsDamage(){/*{{{*/
370
371 _error_("not implemented yet");
372}
373/*}}}*/
374void Matestar::ResetHooks(){/*{{{*/
375
376 this->element=NULL;
377
378 /*Get Element type*/
379 this->helement->reset();
380
381}
382/*}}}*/
383void Matestar::SetCurrentConfiguration(Elements* elementsin,Loads* loadsin,Nodes* nodesin,Vertices* verticesin,Materials* materialsin,Parameters* parametersin){/*{{{*/
384
385}
386/*}}}*/
[22105]387void Matestar::ViscosityFSDerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon,Gauss* gauss){/*{{{*/
388 this->GetViscosityDerivativeEpsSquare(pmu_prime,epsilon,gauss);
[20687]389}/*}}}*/
[22105]390void Matestar::ViscosityHODerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon,Gauss* gauss){/*{{{*/
[20687]391 _error_("not implemented yet");
392}/*}}}*/
[22105]393void Matestar::ViscositySSADerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon,Gauss* gauss){/*{{{*/
[20687]394 _error_("not implemented yet");
395}/*}}}*/
[24335]396
[25379]397void Matestar::ViscosityBFS(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input,IssmDouble eps_eff){/*{{{*/
[24335]398
399 /*Intermediaries*/
400 IssmDouble vx,vy,vz;
401 IssmDouble dvx[3],dvy[3],dvz[3];
402 bool isdepthaveraged=0.;
403
404 /*Get velocity derivatives in all directions*/
405 _assert_(dim>1);
406 _assert_(vx_input);
407 vx_input->GetInputValue(&vx,gauss);
408 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
409 _assert_(vy_input);
410 vy_input->GetInputValue(&vy,gauss);
411 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
412 if(dim==3){
413 _assert_(vz_input);
414 vz_input->GetInputValue(&vz,gauss);
415 vz_input->GetInputDerivativeValue(&dvz[0],xyz_list,gauss);
416 }
417 else{
418 vz = 0.;
419 dvz[0] = 0.; dvz[1] = 0.; dvz[2] = 0.;
420 }
421
422 /*Compute dmudB*/
423 *pdmudB=GetViscosity_BGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
424}
425/*}}}*/
[25379]426void Matestar::ViscosityBHO(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,IssmDouble eps_eff){/*{{{*/
[24335]427
428 /*Intermediaries*/
429 IssmDouble vx,vy,vz;
430 IssmDouble dvx[3],dvy[3],dvz[3];
431 bool isdepthaveraged=0.;
432
433 /*Get velocity derivatives in all directions*/
434 _assert_(dim==2 || dim==3);
435 _assert_(vx_input);
436 vx_input->GetInputValue(&vx,gauss);
437 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
438 if(dim==3){
439 _assert_(vy_input);
440 vy_input->GetInputValue(&vy,gauss);
441 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
442 }
443 else{
444 dvx[2] = 0.;
445 vy = 0.;
446 dvy[0] = 0.; dvy[1] = 0.; dvy[2] = 0.;
447 }
448 vz = 0.;
449 dvz[0] = 0.; dvz[1] = 0.; dvz[2] = -dvx[0]-dvy[1];
450
451 /*Compute viscosity*/
452 *pdmudB=GetViscosity_BGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
453}/*}}}*/
[25379]454void Matestar::ViscosityBSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,IssmDouble eps_eff){/*{{{*/
[24335]455 /*Intermediaries*/
456 IssmDouble vx,vy,vz;
457 IssmDouble dvx[3],dvy[3],dvz[3];
458 bool isdepthaveraged=1.;
459
460 /*Get velocity derivatives in all directions*/
461 _assert_(dim==1 || dim==2);
462 _assert_(vx_input);
463 vx_input->GetInputValue(&vx,gauss);
464 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
465 if(dim==2){
466 _assert_(vy_input);
467 vy_input->GetInputValue(&vy,gauss);
468 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
469 }
470 else{
471 dvx[1] = 0.;
472 dvx[2] = 0.;
473 vy = 0.;
474 dvy[0] = 0.; dvy[1] = 0.; dvy[2] = 0.;
475 }
476 dvx[2] = 0.;
477 dvy[2] = 0.;
478 vz = 0.;
479 dvz[0] = 0.; dvz[1] = 0.; dvz[2] = -dvx[0]-dvy[1];
480
481 /*Compute viscosity*/
482 *pdmudB=GetViscosity_BGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
483}/*}}}*/
[25379]484void Matestar::ViscosityFS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){/*{{{*/
[24335]485
486 /*Intermediaries*/
487 IssmDouble vx,vy,vz;
488 IssmDouble dvx[3],dvy[3],dvz[3];
489 IssmDouble epsilon3d[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
490 IssmDouble epsilon2d[3]; /* epsilon=[exx,eyy,exy];*/
491 IssmDouble eps_eff,eps0=1.e-27;
492 bool isdepthaveraged=0.;
493
494 /*Get velocity derivatives in all directions*/
495 _assert_(dim>1);
496 _assert_(vx_input);
497 vx_input->GetInputValue(&vx,gauss);
498 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
499 _assert_(vy_input);
500 vy_input->GetInputValue(&vy,gauss);
501 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
502 if(dim==3){
503 _assert_(vz_input);
504 vz_input->GetInputValue(&vz,gauss);
505 vz_input->GetInputDerivativeValue(&dvz[0],xyz_list,gauss);
506 }
507 else{
508 vz = 0.;
509 dvz[0] = 0.; dvz[1] = 0.; dvz[2] = 0.;
510 }
511
512 if(dim==3){
513 /* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exz^2 + eyz^2 + exx*eyy */
514 element->StrainRateFS(&epsilon3d[0],xyz_list,gauss,vx_input,vy_input,vz_input);
515 eps_eff = sqrt(epsilon3d[0]*epsilon3d[0] + epsilon3d[1]*epsilon3d[1] + epsilon3d[3]*epsilon3d[3] + epsilon3d[4]*epsilon3d[4] + epsilon3d[5]*epsilon3d[5] + epsilon3d[0]*epsilon3d[1]+eps0*eps0);
516 }
517 else{
518 /* eps_eff^2 = 1/2 ( exx^2 + eyy^2 + 2*exy^2 )*/
519 element->StrainRateSSA(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
520 eps_eff = 1./sqrt(2.)*sqrt(epsilon2d[0]*epsilon2d[0] + epsilon2d[1]*epsilon2d[1] + 2.*epsilon2d[2]*epsilon2d[2]);
521 }
522
523 /*Compute viscosity*/
524 *pviscosity=GetViscosityGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
525}
526/*}}}*/
[25379]527void Matestar::ViscosityHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/
[24335]528
529 /*Intermediaries*/
530 IssmDouble vx,vy,vz;
531 IssmDouble dvx[3],dvy[3],dvz[3];
532 IssmDouble epsilon3d[5]; /* epsilon=[exx,eyy,exy,exz,eyz];*/
533 IssmDouble epsilon2d[5]; /* epsilon=[exx,exy];*/
534 IssmDouble eps_eff;
535 bool isdepthaveraged=0.;
536
537 if(dim==3){
538 /* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exz^2 + eyz^2 + exx*eyy */
539 element->StrainRateHO(&epsilon3d[0],xyz_list,gauss,vx_input,vy_input);
540 eps_eff = sqrt(epsilon3d[0]*epsilon3d[0] + epsilon3d[1]*epsilon3d[1] + epsilon3d[2]*epsilon3d[2] + epsilon3d[3]*epsilon3d[3] + epsilon3d[4]*epsilon3d[4] + epsilon3d[0]*epsilon3d[1]);
541 }
542 else{
543 /* eps_eff^2 = 1/2 (2*exx^2 + 2*exy^2 ) (since eps_zz = - eps_xx)*/
544 element->StrainRateHO2dvertical(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
545 eps_eff = 1./sqrt(2.)*sqrt(2*epsilon2d[0]*epsilon2d[0] + 2*epsilon2d[1]*epsilon2d[1]);
546 }
547
548 /*Get velocity derivatives in all directions*/
549 _assert_(dim==2 || dim==3);
550 _assert_(vx_input);
551 vx_input->GetInputValue(&vx,gauss);
552 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
553 if(dim==3){
554 _assert_(vy_input);
555 vy_input->GetInputValue(&vy,gauss);
556 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
557 }
558 else{
559 dvx[2] = 0.;
560 vy = 0.;
561 dvy[0] = 0.; dvy[1] = 0.; dvy[2] = 0.;
562 }
563 vz = 0.;
564 dvz[0] = 0.; dvz[1] = 0.; dvz[2] = -dvx[0]-dvy[1];
565
566 /*Compute viscosity*/
567 *pviscosity=GetViscosityGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
568}/*}}}*/
[25379]569void Matestar::ViscosityL1L2(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* surface_input){/*{{{*/
[24335]570 _error_("not implemented yet");
571}/*}}}*/
[25379]572void Matestar::ViscositySSA(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/
[24335]573
574 /*Intermediaries*/
575 IssmDouble vx,vy,vz;
576 IssmDouble dvx[3],dvy[3],dvz[3];
577 IssmDouble epsilon2d[3];/* epsilon=[exx,eyy,exy]; */
578 IssmDouble epsilon1d; /* epsilon=[exx]; */
579 IssmDouble eps_eff;
580 bool isdepthaveraged=1.;
581
582 /*Get velocity derivatives in all directions*/
583 _assert_(dim==1 || dim==2);
584 _assert_(vx_input);
585 vx_input->GetInputValue(&vx,gauss);
586 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
587 if(dim==2){
588 _assert_(vy_input);
589 vy_input->GetInputValue(&vy,gauss);
590 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
591 }
592 else{
593 dvx[1] = 0.;
594 dvx[2] = 0.;
595 vy = 0.;
596 dvy[0] = 0.; dvy[1] = 0.; dvy[2] = 0.;
597 }
598 dvx[2] = 0.;
599 dvy[2] = 0.;
600 vz = 0.;
601 dvz[0] = 0.; dvz[1] = 0.; dvz[2] = -dvx[0]-dvy[1];
602
603 if(dim==2){
604 /* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exx*eyy*/
605 element->StrainRateSSA(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
606 eps_eff = sqrt(epsilon2d[0]*epsilon2d[0] + epsilon2d[1]*epsilon2d[1] + epsilon2d[2]*epsilon2d[2] + epsilon2d[0]*epsilon2d[1]);
607 }
608 else{
609 /* eps_eff^2 = exx^2*/
610 element->StrainRateSSA1d(&epsilon1d,xyz_list,gauss,vx_input);
611 eps_eff = fabs(epsilon1d);
612 }
613
614 /*Compute viscosity*/
615 *pviscosity=GetViscosityGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
616}/*}}}*/
Note: See TracBrowser for help on using the repository browser.