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

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

CHG: moving inputs2 back to inputs

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