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
Line 
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/*}}}*/
103void Matestar::Marshall(MarshallHandle* marshallhandle){ /*{{{*/
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);
111 this->helement->Marshall(marshallhandle);
112 this->element=(Element*)this->helement->delivers();
113
114}
115/*}}}*/
116int Matestar::ObjectEnum(void){/*{{{*/
117
118 return MatestarEnum;
119
120}
121/*}}}*/
122
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/*}}}*/
132IssmDouble Matestar::GetA(Gauss* gauss){/*{{{*/
133 /*
134 * A = 1/B^n
135 */
136
137 IssmDouble B=this->GetB(gauss);
138 IssmDouble n=this->GetN();
139
140 return pow(B,-n);
141}
142/*}}}*/
143IssmDouble Matestar::GetAbar(Gauss* gauss){/*{{{*/
144 /*
145 * A = 1/B^n
146 */
147
148 IssmDouble B=this->GetBbar(gauss);
149 IssmDouble n=this->GetN();
150
151 return pow(B,-n);
152}
153/*}}}*/
154IssmDouble Matestar::GetB(Gauss* gauss){/*{{{*/
155
156 /*Output*/
157 IssmDouble B;
158
159 Input* B_input = element->GetInput(MaterialsRheologyBEnum); _assert_(B_input);
160 B_input->GetInputValue(&B,gauss);
161 return B;
162}
163/*}}}*/
164IssmDouble Matestar::GetBbar(Gauss* gauss){/*{{{*/
165
166 /*Output*/
167 IssmDouble Bbar;
168
169 Input* B_input = element->GetInput(MaterialsRheologyBbarEnum); _assert_(B_input);
170 B_input->GetInputValue(&Bbar,gauss);
171 return Bbar;
172}
173/*}}}*/
174IssmDouble Matestar::GetD(Gauss* gauss){/*{{{*/
175 _error_("not implemented yet");
176}
177/*}}}*/
178IssmDouble Matestar::GetDbar(Gauss* gauss){/*{{{*/
179
180 _error_("not implemented yet");
181}
182/*}}}*/
183IssmDouble Matestar::GetEc(Gauss* gauss){/*{{{*/
184
185 /*Output*/
186 IssmDouble Ec;
187
188 Input* Ec_input = element->GetInput(MaterialsRheologyEcEnum); _assert_(Ec_input);
189 Ec_input->GetInputValue(&Ec,gauss);
190 return Ec;
191}
192/*}}}*/
193IssmDouble Matestar::GetEcbar(Gauss* gauss){/*{{{*/
194
195 /*Output*/
196 IssmDouble Ecbar;
197
198 Input* Ecbar_input = element->GetInput(MaterialsRheologyEcbarEnum); _assert_(Ecbar_input);
199 Ecbar_input->GetInputValue(&Ecbar,gauss);
200 return Ecbar;
201}
202/*}}}*/
203IssmDouble Matestar::GetEs(Gauss* gauss){/*{{{*/
204
205 /*Output*/
206 IssmDouble Es;
207
208 Input* Es_input = element->GetInput(MaterialsRheologyEsEnum); _assert_(Es_input);
209 Es_input->GetInputValue(&Es,gauss);
210 return Es;
211}
212/*}}}*/
213IssmDouble Matestar::GetEsbar(Gauss* gauss){/*{{{*/
214
215 /*Output*/
216 IssmDouble Esbar;
217
218 Input* Esbar_input = element->GetInput(MaterialsRheologyEsbarEnum); _assert_(Esbar_input);
219 Esbar_input->GetInputValue(&Esbar,gauss);
220 return Esbar;
221}
222/*}}}*/
223IssmDouble Matestar::GetN(){/*{{{*/
224
225 /*Output*/
226 IssmDouble n=3.0;
227 return n;
228}
229/*}}}*/
230void Matestar::GetViscosity(IssmDouble* pviscosity,IssmDouble eps_eff,Gauss* gauss){/*{{{*/
231 _error_("not implemented yet");
232}
233/*}}}*/
234void Matestar::GetViscosityBar(IssmDouble* pviscosity,IssmDouble eps_eff,Gauss* gauss){/*{{{*/
235 _error_("not implemented yet");
236}
237/*}}}*/
238void Matestar::GetViscosityComplement(IssmDouble* pviscosity_complement, IssmDouble* epsilon,Gauss* gauss){/*{{{*/
239 _error_("not implemented yet");
240}
241/*}}}*/
242void Matestar::GetViscosityDComplement(IssmDouble* pviscosity_complement, IssmDouble* epsilon,Gauss* gauss){/*{{{*/
243 _error_("not implemented yet");
244}
245/*}}}*/
246void Matestar::GetViscosityDerivativeEpsSquare(IssmDouble* pmu_prime, IssmDouble* epsilon,Gauss* gauss){/*{{{*/
247 _error_("not implemented yet");
248}
249/*}}}*/
250IssmDouble Matestar::GetViscosityGeneral(IssmDouble vx,IssmDouble vy,IssmDouble vz,IssmDouble* dvx,IssmDouble* dvy,IssmDouble* dvz,IssmDouble eps_eff,bool isdepthaveraged,Gauss* gauss){/*{{{*/
251
252 /*output: */
253 IssmDouble viscosity;
254
255 /*Intermediaries*/
256 IssmDouble epsprime_norm;
257 IssmDouble lambdas;
258 IssmDouble vmag,dvmag[3];
259 IssmDouble B,Ec,Es,E,n;
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
274 EstarStrainrateQuantities(&epsprime_norm,vx,vy,vz,vmag,dvx,dvy,dvz,&dvmag[0]);
275 lambdas=EstarLambdaS(eps_eff,epsprime_norm);
276
277 /*Get B and enhancement*/
278 n=GetN(); _assert_(n>0.);
279 if (isdepthaveraged==0.){
280 B=GetB(gauss); _assert_(B>0.);
281 Ec=GetEc(gauss); _assert_(Ec>=0.); Es=GetEs(gauss); _assert_(Es>=0.);
282 }
283 else{
284 B=GetBbar(gauss); _assert_(B>0.);
285 Ec=GetEcbar(gauss); _assert_(Ec>=0.);
286 Es=GetEsbar(gauss); _assert_(Es>=0.);
287 }
288
289 /*Get total enhancement factor E(lambdas)*/
290 E = Ec + (Es-Ec)*lambdas*lambdas; _assert_(E>0.);
291
292 /*Compute viscosity*/
293 /*if no strain rate, return maximum viscosity*/
294 if(eps_eff==0.){
295 viscosity = 1.e+14/2.;
296 //viscosity = B;
297 //viscosity=2.5*pow(10.,17);
298 }
299 else{
300 viscosity = B/(2.*pow(E,1./n)*pow(eps_eff,2./n));
301 }
302
303 /*Checks in debugging mode*/
304 if(viscosity<=0) _error_("Negative viscosity");
305
306 /*Assign output pointer*/
307 return viscosity;
308}
309/*}}}*/
310IssmDouble Matestar::GetViscosity_BGeneral(IssmDouble vx,IssmDouble vy,IssmDouble vz,IssmDouble* dvx,IssmDouble* dvy,IssmDouble* dvz,IssmDouble eps_eff,bool isdepthaveraged,Gauss* gauss){/*{{{*/
311
312 /*Intermediaries*/
313 IssmDouble dmudB;
314 IssmDouble epsprime_norm;
315 IssmDouble lambdas;
316 IssmDouble vmag,dvmag[3];
317 IssmDouble Ec,Es,E;
318
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 }
331
332 EstarStrainrateQuantities(&epsprime_norm,vx,vy,vz,vmag,dvx,dvy,dvz,&dvmag[0]);
333 lambdas=EstarLambdaS(eps_eff,epsprime_norm);
334
335 /*Get enhancement*/
336 if (isdepthaveraged==0.){
337 Ec=GetEc(gauss); _assert_(Ec>=0.);
338 Es=GetEs(gauss); _assert_(Es>=0.);
339 }
340 else{
341 Ec=GetEcbar(gauss); _assert_(Ec>=0.);
342 Es=GetEsbar(gauss); _assert_(Es>=0.);
343 }
344
345 /*Get total enhancement factor E(lambdas)*/
346 E = Ec + (Es-Ec)*lambdas*lambdas; _assert_(E>0.);
347
348 /*Compute dmudB*/
349 if(eps_eff==0.) dmudB = 0.;
350 else dmudB = 1./(2.*pow(E,1./3.)*pow(eps_eff,2./3.));
351
352 /*Assign output*/
353 return dmudB;
354
355}
356/*}}}*/
357void Matestar::GetViscosity_B(IssmDouble* pdmudB,IssmDouble eps_eff,Gauss* gauss){/*{{{*/
358 _error_("not implemented yet");
359}
360/*}}}*/
361void Matestar::GetViscosity_D(IssmDouble* pdmudD,IssmDouble eps_eff,Gauss* gauss){/*{{{*/
362 _error_("not implemented yet");
363}
364/*}}}*/
365void Matestar::GetViscosity2dDerivativeEpsSquare(IssmDouble* pmu_prime, IssmDouble* epsilon,Gauss* gauss){/*{{{*/
366 _error_("not implemented yet");
367}
368/*}}}*/
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/*}}}*/
387void Matestar::ViscosityFSDerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon,Gauss* gauss){/*{{{*/
388 this->GetViscosityDerivativeEpsSquare(pmu_prime,epsilon,gauss);
389}/*}}}*/
390void Matestar::ViscosityHODerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon,Gauss* gauss){/*{{{*/
391 _error_("not implemented yet");
392}/*}}}*/
393void Matestar::ViscositySSADerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon,Gauss* gauss){/*{{{*/
394 _error_("not implemented yet");
395}/*}}}*/
396
397void Matestar::ViscosityBFS(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input,IssmDouble eps_eff){/*{{{*/
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/*}}}*/
426void Matestar::ViscosityBHO(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,IssmDouble eps_eff){/*{{{*/
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}/*}}}*/
454void Matestar::ViscosityBSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,IssmDouble eps_eff){/*{{{*/
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}/*}}}*/
484void Matestar::ViscosityFS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){/*{{{*/
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/*}}}*/
527void Matestar::ViscosityHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/
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}/*}}}*/
569void Matestar::ViscosityL1L2(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* surface_input){/*{{{*/
570 _error_("not implemented yet");
571}/*}}}*/
572void Matestar::ViscositySSA(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/
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.