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

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

NEW: added Inputs2, TODO: still AMR, GEMB and DC do not work, and need to delete current Inputs

File size: 24.4 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::ViscosityBFS(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input,IssmDouble eps_eff){/*{{{*/
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*/
416 *pdmudB=GetViscosity_BGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
417}
418/*}}}*/
419void Matestar::ViscosityBHO(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,IssmDouble eps_eff){/*{{{*/
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*/
445 *pdmudB=GetViscosity_BGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
446}/*}}}*/
447void Matestar::ViscosityBSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,IssmDouble eps_eff){/*{{{*/
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*/
475 *pdmudB=GetViscosity_BGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
476}/*}}}*/
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];
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;
485 bool isdepthaveraged=0.;
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
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
516 /*Compute viscosity*/
517 *pviscosity=GetViscosityGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
518}
519/*}}}*/
520void Matestar::ViscosityFSDerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon,Gauss* gauss){/*{{{*/
521 this->GetViscosityDerivativeEpsSquare(pmu_prime,epsilon,gauss);
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];
528 IssmDouble epsilon3d[5]; /* epsilon=[exx,eyy,exy,exz,eyz];*/
529 IssmDouble epsilon2d[5]; /* epsilon=[exx,exy];*/
530 IssmDouble eps_eff;
531 bool isdepthaveraged=0.;
532
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
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*/
563 *pviscosity=GetViscosityGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
564}/*}}}*/
565void Matestar::ViscosityHODerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon,Gauss* gauss){/*{{{*/
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){/*{{{*/
572
573 /*Intermediaries*/
574 IssmDouble vx,vy,vz;
575 IssmDouble dvx[3],dvy[3],dvz[3];
576 IssmDouble epsilon2d[3];/* epsilon=[exx,eyy,exy]; */
577 IssmDouble epsilon1d; /* epsilon=[exx]; */
578 IssmDouble eps_eff;
579 bool isdepthaveraged=1.;
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 }
597 dvx[2] = 0.;
598 dvy[2] = 0.;
599 vz = 0.;
600 dvz[0] = 0.; dvz[1] = 0.; dvz[2] = -dvx[0]-dvy[1];
601
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
613 /*Compute viscosity*/
614 *pviscosity=GetViscosityGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
615}/*}}}*/
616void Matestar::ViscositySSADerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon,Gauss* gauss){/*{{{*/
617 _error_("not implemented yet");
618}/*}}}*/
619
620void Matestar::ViscosityBFS(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* vz_input,IssmDouble eps_eff){/*{{{*/
621
622 /*Intermediaries*/
623 IssmDouble vx,vy,vz;
624 IssmDouble dvx[3],dvy[3],dvz[3];
625 bool isdepthaveraged=0.;
626
627 /*Get velocity derivatives in all directions*/
628 _assert_(dim>1);
629 _assert_(vx_input);
630 vx_input->GetInputValue(&vx,gauss);
631 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
632 _assert_(vy_input);
633 vy_input->GetInputValue(&vy,gauss);
634 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
635 if(dim==3){
636 _assert_(vz_input);
637 vz_input->GetInputValue(&vz,gauss);
638 vz_input->GetInputDerivativeValue(&dvz[0],xyz_list,gauss);
639 }
640 else{
641 vz = 0.;
642 dvz[0] = 0.; dvz[1] = 0.; dvz[2] = 0.;
643 }
644
645 /*Compute dmudB*/
646 *pdmudB=GetViscosity_BGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
647}
648/*}}}*/
649void Matestar::ViscosityBHO(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,IssmDouble eps_eff){/*{{{*/
650
651 /*Intermediaries*/
652 IssmDouble vx,vy,vz;
653 IssmDouble dvx[3],dvy[3],dvz[3];
654 bool isdepthaveraged=0.;
655
656 /*Get velocity derivatives in all directions*/
657 _assert_(dim==2 || dim==3);
658 _assert_(vx_input);
659 vx_input->GetInputValue(&vx,gauss);
660 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
661 if(dim==3){
662 _assert_(vy_input);
663 vy_input->GetInputValue(&vy,gauss);
664 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
665 }
666 else{
667 dvx[2] = 0.;
668 vy = 0.;
669 dvy[0] = 0.; dvy[1] = 0.; dvy[2] = 0.;
670 }
671 vz = 0.;
672 dvz[0] = 0.; dvz[1] = 0.; dvz[2] = -dvx[0]-dvy[1];
673
674 /*Compute viscosity*/
675 *pdmudB=GetViscosity_BGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
676}/*}}}*/
677void Matestar::ViscosityBSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,IssmDouble eps_eff){/*{{{*/
678 /*Intermediaries*/
679 IssmDouble vx,vy,vz;
680 IssmDouble dvx[3],dvy[3],dvz[3];
681 bool isdepthaveraged=1.;
682
683 /*Get velocity derivatives in all directions*/
684 _assert_(dim==1 || dim==2);
685 _assert_(vx_input);
686 vx_input->GetInputValue(&vx,gauss);
687 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
688 if(dim==2){
689 _assert_(vy_input);
690 vy_input->GetInputValue(&vy,gauss);
691 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
692 }
693 else{
694 dvx[1] = 0.;
695 dvx[2] = 0.;
696 vy = 0.;
697 dvy[0] = 0.; dvy[1] = 0.; dvy[2] = 0.;
698 }
699 dvx[2] = 0.;
700 dvy[2] = 0.;
701 vz = 0.;
702 dvz[0] = 0.; dvz[1] = 0.; dvz[2] = -dvx[0]-dvy[1];
703
704 /*Compute viscosity*/
705 *pdmudB=GetViscosity_BGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
706}/*}}}*/
707void Matestar::ViscosityFS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* vz_input){/*{{{*/
708
709 /*Intermediaries*/
710 IssmDouble vx,vy,vz;
711 IssmDouble dvx[3],dvy[3],dvz[3];
712 IssmDouble epsilon3d[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
713 IssmDouble epsilon2d[3]; /* epsilon=[exx,eyy,exy];*/
714 IssmDouble eps_eff,eps0=1.e-27;
715 bool isdepthaveraged=0.;
716
717 /*Get velocity derivatives in all directions*/
718 _assert_(dim>1);
719 _assert_(vx_input);
720 vx_input->GetInputValue(&vx,gauss);
721 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
722 _assert_(vy_input);
723 vy_input->GetInputValue(&vy,gauss);
724 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
725 if(dim==3){
726 _assert_(vz_input);
727 vz_input->GetInputValue(&vz,gauss);
728 vz_input->GetInputDerivativeValue(&dvz[0],xyz_list,gauss);
729 }
730 else{
731 vz = 0.;
732 dvz[0] = 0.; dvz[1] = 0.; dvz[2] = 0.;
733 }
734
735 if(dim==3){
736 /* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exz^2 + eyz^2 + exx*eyy */
737 element->StrainRateFS(&epsilon3d[0],xyz_list,gauss,vx_input,vy_input,vz_input);
738 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);
739 }
740 else{
741 /* eps_eff^2 = 1/2 ( exx^2 + eyy^2 + 2*exy^2 )*/
742 element->StrainRateSSA(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
743 eps_eff = 1./sqrt(2.)*sqrt(epsilon2d[0]*epsilon2d[0] + epsilon2d[1]*epsilon2d[1] + 2.*epsilon2d[2]*epsilon2d[2]);
744 }
745
746 /*Compute viscosity*/
747 *pviscosity=GetViscosityGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
748}
749/*}}}*/
750void Matestar::ViscosityHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input){/*{{{*/
751
752 /*Intermediaries*/
753 IssmDouble vx,vy,vz;
754 IssmDouble dvx[3],dvy[3],dvz[3];
755 IssmDouble epsilon3d[5]; /* epsilon=[exx,eyy,exy,exz,eyz];*/
756 IssmDouble epsilon2d[5]; /* epsilon=[exx,exy];*/
757 IssmDouble eps_eff;
758 bool isdepthaveraged=0.;
759
760 if(dim==3){
761 /* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exz^2 + eyz^2 + exx*eyy */
762 element->StrainRateHO(&epsilon3d[0],xyz_list,gauss,vx_input,vy_input);
763 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]);
764 }
765 else{
766 /* eps_eff^2 = 1/2 (2*exx^2 + 2*exy^2 ) (since eps_zz = - eps_xx)*/
767 element->StrainRateHO2dvertical(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
768 eps_eff = 1./sqrt(2.)*sqrt(2*epsilon2d[0]*epsilon2d[0] + 2*epsilon2d[1]*epsilon2d[1]);
769 }
770
771 /*Get velocity derivatives in all directions*/
772 _assert_(dim==2 || dim==3);
773 _assert_(vx_input);
774 vx_input->GetInputValue(&vx,gauss);
775 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
776 if(dim==3){
777 _assert_(vy_input);
778 vy_input->GetInputValue(&vy,gauss);
779 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
780 }
781 else{
782 dvx[2] = 0.;
783 vy = 0.;
784 dvy[0] = 0.; dvy[1] = 0.; dvy[2] = 0.;
785 }
786 vz = 0.;
787 dvz[0] = 0.; dvz[1] = 0.; dvz[2] = -dvx[0]-dvy[1];
788
789 /*Compute viscosity*/
790 *pviscosity=GetViscosityGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
791}/*}}}*/
792void Matestar::ViscosityL1L2(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input,Input2* surface_input){/*{{{*/
793 _error_("not implemented yet");
794}/*}}}*/
795void Matestar::ViscositySSA(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input2* vx_input,Input2* vy_input){/*{{{*/
796
797 /*Intermediaries*/
798 IssmDouble vx,vy,vz;
799 IssmDouble dvx[3],dvy[3],dvz[3];
800 IssmDouble epsilon2d[3];/* epsilon=[exx,eyy,exy]; */
801 IssmDouble epsilon1d; /* epsilon=[exx]; */
802 IssmDouble eps_eff;
803 bool isdepthaveraged=1.;
804
805 /*Get velocity derivatives in all directions*/
806 _assert_(dim==1 || dim==2);
807 _assert_(vx_input);
808 vx_input->GetInputValue(&vx,gauss);
809 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
810 if(dim==2){
811 _assert_(vy_input);
812 vy_input->GetInputValue(&vy,gauss);
813 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
814 }
815 else{
816 dvx[1] = 0.;
817 dvx[2] = 0.;
818 vy = 0.;
819 dvy[0] = 0.; dvy[1] = 0.; dvy[2] = 0.;
820 }
821 dvx[2] = 0.;
822 dvy[2] = 0.;
823 vz = 0.;
824 dvz[0] = 0.; dvz[1] = 0.; dvz[2] = -dvx[0]-dvy[1];
825
826 if(dim==2){
827 /* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exx*eyy*/
828 element->StrainRateSSA(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
829 eps_eff = sqrt(epsilon2d[0]*epsilon2d[0] + epsilon2d[1]*epsilon2d[1] + epsilon2d[2]*epsilon2d[2] + epsilon2d[0]*epsilon2d[1]);
830 }
831 else{
832 /* eps_eff^2 = exx^2*/
833 element->StrainRateSSA1d(&epsilon1d,xyz_list,gauss,vx_input);
834 eps_eff = fabs(epsilon1d);
835 }
836
837 /*Compute viscosity*/
838 *pviscosity=GetViscosityGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
839}/*}}}*/
Note: See TracBrowser for help on using the repository browser.