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

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

CHG: cleaning up old inputs

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