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

Last change on this file since 22306 was 22306, checked in by Mathieu Morlighem, 7 years ago

CHG: WARNING This is a significant change, we do not average B, D and E over the element anymore because this makes models with few layers but high degree of interpolation useless

File size: 17.7 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 Input* B_input = element->GetInput(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 Input* B_input = element->GetInput(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 Input* Ec_input = element->GetInput(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 Input* Ecbar_input = element->GetInput(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 Input* Es_input = element->GetInput(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 Input* Esbar_input = element->GetInput(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/*}}}*/
372void Matestar::InputUpdateFromConstant(IssmDouble constant, int name){/*{{{*/
373 /*Nothing updated yet*/
374}
375/*}}}*/
376void Matestar::InputUpdateFromConstant(int constant, int name){/*{{{*/
377 /*Nothing updated yet*/
378}
379/*}}}*/
380void Matestar::InputUpdateFromConstant(bool constant, int name){/*{{{*/
381 /*Nothing updated yet*/
382}
383/*}}}*/
384void Matestar::InputUpdateFromMatrixDakota(IssmDouble* matrix, int nrows, int ncols,int name, int type){/*{{{*/
385 /*Nothing updated yet*/
386}
387/*}}}*/
388void Matestar::InputUpdateFromVector(IssmDouble* vector, int name, int type){/*{{{*/
389
390}
391/*}}}*/
392void Matestar::InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type){/*{{{*/
393
394}
395/*}}}*/
396bool Matestar::IsDamage(){/*{{{*/
397
398 _error_("not implemented yet");
399}
400/*}}}*/
401void Matestar::ResetHooks(){/*{{{*/
402
403 this->element=NULL;
404
405 /*Get Element type*/
406 this->helement->reset();
407
408}
409/*}}}*/
410void Matestar::SetCurrentConfiguration(Elements* elementsin,Loads* loadsin,Nodes* nodesin,Vertices* verticesin,Materials* materialsin,Parameters* parametersin){/*{{{*/
411
412}
413/*}}}*/
414void Matestar::ViscosityBFS(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input,IssmDouble eps_eff){/*{{{*/
415
416 /*Intermediaries*/
417 IssmDouble vx,vy,vz;
418 IssmDouble dvx[3],dvy[3],dvz[3];
419 bool isdepthaveraged=0.;
420
421 /*Get velocity derivatives in all directions*/
422 _assert_(dim>1);
423 _assert_(vx_input);
424 vx_input->GetInputValue(&vx,gauss);
425 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
426 _assert_(vy_input);
427 vy_input->GetInputValue(&vy,gauss);
428 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
429 if(dim==3){
430 _assert_(vz_input);
431 vz_input->GetInputValue(&vz,gauss);
432 vz_input->GetInputDerivativeValue(&dvz[0],xyz_list,gauss);
433 }
434 else{
435 vz = 0.;
436 dvz[0] = 0.; dvz[1] = 0.; dvz[2] = 0.;
437 }
438
439 /*Compute dmudB*/
440 *pdmudB=GetViscosity_BGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
441}
442/*}}}*/
443void Matestar::ViscosityBHO(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,IssmDouble eps_eff){/*{{{*/
444
445 /*Intermediaries*/
446 IssmDouble vx,vy,vz;
447 IssmDouble dvx[3],dvy[3],dvz[3];
448 bool isdepthaveraged=0.;
449
450 /*Get velocity derivatives in all directions*/
451 _assert_(dim==2 || dim==3);
452 _assert_(vx_input);
453 vx_input->GetInputValue(&vx,gauss);
454 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
455 if(dim==3){
456 _assert_(vy_input);
457 vy_input->GetInputValue(&vy,gauss);
458 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
459 }
460 else{
461 dvx[2] = 0.;
462 vy = 0.;
463 dvy[0] = 0.; dvy[1] = 0.; dvy[2] = 0.;
464 }
465 vz = 0.;
466 dvz[0] = 0.; dvz[1] = 0.; dvz[2] = -dvx[0]-dvy[1];
467
468 /*Compute viscosity*/
469 *pdmudB=GetViscosity_BGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
470}/*}}}*/
471void Matestar::ViscosityBSSA(IssmDouble* pdmudB,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,IssmDouble eps_eff){/*{{{*/
472 /*Intermediaries*/
473 IssmDouble vx,vy,vz;
474 IssmDouble dvx[3],dvy[3],dvz[3];
475 bool isdepthaveraged=1.;
476
477 /*Get velocity derivatives in all directions*/
478 _assert_(dim==1 || dim==2);
479 _assert_(vx_input);
480 vx_input->GetInputValue(&vx,gauss);
481 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
482 if(dim==2){
483 _assert_(vy_input);
484 vy_input->GetInputValue(&vy,gauss);
485 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
486 }
487 else{
488 dvx[1] = 0.;
489 dvx[2] = 0.;
490 vy = 0.;
491 dvy[0] = 0.; dvy[1] = 0.; dvy[2] = 0.;
492 }
493 dvx[2] = 0.;
494 dvy[2] = 0.;
495 vz = 0.;
496 dvz[0] = 0.; dvz[1] = 0.; dvz[2] = -dvx[0]-dvy[1];
497
498 /*Compute viscosity*/
499 *pdmudB=GetViscosity_BGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
500}/*}}}*/
501void Matestar::ViscosityFS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){/*{{{*/
502
503 /*Intermediaries*/
504 IssmDouble vx,vy,vz;
505 IssmDouble dvx[3],dvy[3],dvz[3];
506 IssmDouble epsilon3d[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/
507 IssmDouble epsilon2d[3]; /* epsilon=[exx,eyy,exy];*/
508 IssmDouble eps_eff,eps0=1.e-27;
509 bool isdepthaveraged=0.;
510
511 /*Get velocity derivatives in all directions*/
512 _assert_(dim>1);
513 _assert_(vx_input);
514 vx_input->GetInputValue(&vx,gauss);
515 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
516 _assert_(vy_input);
517 vy_input->GetInputValue(&vy,gauss);
518 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
519 if(dim==3){
520 _assert_(vz_input);
521 vz_input->GetInputValue(&vz,gauss);
522 vz_input->GetInputDerivativeValue(&dvz[0],xyz_list,gauss);
523 }
524 else{
525 vz = 0.;
526 dvz[0] = 0.; dvz[1] = 0.; dvz[2] = 0.;
527 }
528
529 if(dim==3){
530 /* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exz^2 + eyz^2 + exx*eyy */
531 element->StrainRateFS(&epsilon3d[0],xyz_list,gauss,vx_input,vy_input,vz_input);
532 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);
533 }
534 else{
535 /* eps_eff^2 = 1/2 ( exx^2 + eyy^2 + 2*exy^2 )*/
536 element->StrainRateSSA(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
537 eps_eff = 1./sqrt(2.)*sqrt(epsilon2d[0]*epsilon2d[0] + epsilon2d[1]*epsilon2d[1] + 2.*epsilon2d[2]*epsilon2d[2]);
538 }
539
540 /*Compute viscosity*/
541 *pviscosity=GetViscosityGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
542}
543/*}}}*/
544void Matestar::ViscosityFSDerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon,Gauss* gauss){/*{{{*/
545 this->GetViscosityDerivativeEpsSquare(pmu_prime,epsilon,gauss);
546}/*}}}*/
547void Matestar::ViscosityHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/
548
549 /*Intermediaries*/
550 IssmDouble vx,vy,vz;
551 IssmDouble dvx[3],dvy[3],dvz[3];
552 IssmDouble epsilon3d[5]; /* epsilon=[exx,eyy,exy,exz,eyz];*/
553 IssmDouble epsilon2d[5]; /* epsilon=[exx,exy];*/
554 IssmDouble eps_eff;
555 bool isdepthaveraged=0.;
556
557 if(dim==3){
558 /* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exz^2 + eyz^2 + exx*eyy */
559 element->StrainRateHO(&epsilon3d[0],xyz_list,gauss,vx_input,vy_input);
560 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]);
561 }
562 else{
563 /* eps_eff^2 = 1/2 (2*exx^2 + 2*exy^2 ) (since eps_zz = - eps_xx)*/
564 element->StrainRateHO2dvertical(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
565 eps_eff = 1./sqrt(2.)*sqrt(2*epsilon2d[0]*epsilon2d[0] + 2*epsilon2d[1]*epsilon2d[1]);
566 }
567
568 /*Get velocity derivatives in all directions*/
569 _assert_(dim==2 || dim==3);
570 _assert_(vx_input);
571 vx_input->GetInputValue(&vx,gauss);
572 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
573 if(dim==3){
574 _assert_(vy_input);
575 vy_input->GetInputValue(&vy,gauss);
576 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
577 }
578 else{
579 dvx[2] = 0.;
580 vy = 0.;
581 dvy[0] = 0.; dvy[1] = 0.; dvy[2] = 0.;
582 }
583 vz = 0.;
584 dvz[0] = 0.; dvz[1] = 0.; dvz[2] = -dvx[0]-dvy[1];
585
586 /*Compute viscosity*/
587 *pviscosity=GetViscosityGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
588}/*}}}*/
589void Matestar::ViscosityHODerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon,Gauss* gauss){/*{{{*/
590 _error_("not implemented yet");
591}/*}}}*/
592void Matestar::ViscosityL1L2(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* surface_input){/*{{{*/
593 _error_("not implemented yet");
594}/*}}}*/
595void Matestar::ViscositySSA(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/
596
597 /*Intermediaries*/
598 IssmDouble vx,vy,vz;
599 IssmDouble dvx[3],dvy[3],dvz[3];
600 IssmDouble epsilon2d[3];/* epsilon=[exx,eyy,exy]; */
601 IssmDouble epsilon1d; /* epsilon=[exx]; */
602 IssmDouble eps_eff;
603 bool isdepthaveraged=1.;
604
605 /*Get velocity derivatives in all directions*/
606 _assert_(dim==1 || dim==2);
607 _assert_(vx_input);
608 vx_input->GetInputValue(&vx,gauss);
609 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
610 if(dim==2){
611 _assert_(vy_input);
612 vy_input->GetInputValue(&vy,gauss);
613 vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
614 }
615 else{
616 dvx[1] = 0.;
617 dvx[2] = 0.;
618 vy = 0.;
619 dvy[0] = 0.; dvy[1] = 0.; dvy[2] = 0.;
620 }
621 dvx[2] = 0.;
622 dvy[2] = 0.;
623 vz = 0.;
624 dvz[0] = 0.; dvz[1] = 0.; dvz[2] = -dvx[0]-dvy[1];
625
626 if(dim==2){
627 /* eps_eff^2 = exx^2 + eyy^2 + exy^2 + exx*eyy*/
628 element->StrainRateSSA(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input);
629 eps_eff = sqrt(epsilon2d[0]*epsilon2d[0] + epsilon2d[1]*epsilon2d[1] + epsilon2d[2]*epsilon2d[2] + epsilon2d[0]*epsilon2d[1]);
630 }
631 else{
632 /* eps_eff^2 = exx^2*/
633 element->StrainRateSSA1d(&epsilon1d,xyz_list,gauss,vx_input);
634 eps_eff = fabs(epsilon1d);
635 }
636
637 /*Compute viscosity*/
638 *pviscosity=GetViscosityGeneral(vx,vy,vz,&dvx[0],&dvy[0],&dvz[0],eps_eff,isdepthaveraged,gauss);
639}/*}}}*/
640void Matestar::ViscositySSADerivativeEpsSquare(IssmDouble* pmu_prime,IssmDouble* epsilon,Gauss* gauss){/*{{{*/
641 _error_("not implemented yet");
642}/*}}}*/
Note: See TracBrowser for help on using the repository browser.