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

Last change on this file since 23524 was 23524, checked in by Mathieu Morlighem, 6 years ago

CHG: cleaning up inputupdate, removing Update class, now that inputs are always in element

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