2 #include "../toolkits/toolkits.h"
3 #include "../classes/classes.h"
4 #include "../shared/shared.h"
5 #include "../modules/modules.h"
11 iomodel->
FindConstant(&finiteelement,
"md.damage.elementinterp");
15 iomodel->
FindConstant(&stabilization,
"md.damage.stabilization");
36 iomodel->
FindConstant(&finiteelement,
"md.damage.elementinterp");
47 iomodel->
FindConstant(&finiteelement,
"md.damage.elementinterp");
48 iomodel->
FindConstant(&ismovingfront,
"md.transient.ismovingfront");
51 iomodel->
FetchData(1,
"md.flowequation.element_equation");
56 element->
Update(inputs2,i,iomodel,analysis_counter,analysis_type,finiteelement);
59 if(iomodel->
Data(
"md.flowequation.element_equation")){
65 iomodel->
DeleteData(1,
"md.flowequation.element_equation");
68 for(
int i=0;i<elements->
Size();i++){
87 char** requestedoutputs = NULL;
95 iomodel->
FindConstant(&requestedoutputs,&numoutputs,
"md.damage.requested_outputs");
98 iomodel->
DeleteData(&requestedoutputs,numoutputs,
"md.damage.requested_outputs");
132 for (
int i=0;i<numnodes;i++){
144 xDelete<IssmDouble>(f);
147 IssmDouble c1, c2, stress_threshold, stress_ubound;
150 IssmDouble principalDevStress1, principalDevStress2;
153 int equivstress, domaintype, dim;
171 default:
_error_(
"not implemented");
179 Input2* damage_input = NULL;
197 for (
int i=0;i<numnodes;i++){
203 principalDevStress1_input->
GetInputValue(&principalDevStress1,gauss);
204 principalDevStress2_input->
GetInputValue(&principalDevStress2,gauss);
206 tensileStress = sqrt(1.5*(pow(
max(principalDevStress1, 0.), 2) + pow(
max(principalDevStress2, 0.), 2)));
207 compressiveStress = sqrt(1.5*(pow(
min(principalDevStress1, 0.), 2) + pow(
min(principalDevStress2, 0.), 2)));
212 if(tensileStress > stress_threshold)
213 f[i] += c1*atan((tensileStress/stress_threshold - 1)/(1-damage));
215 if(compressiveStress < stress_ubound)
216 f[i] += c2*atan((compressiveStress/stress_ubound - 1)/(1-damage));
219 _error_(
"Only 2D is implemented.");
227 xDelete<IssmDouble>(f);
236 IssmDouble eps_xx,eps_yy,eps_xy,eps1,eps2,epstmp;
256 Input2* damage_input = NULL;
269 for (
int i=0;i<numnodes;i++){
280 eps1=(eps_xx+eps_yy)/2.+sqrt(pow((eps_xx-eps_yy)/2.,2)+pow(eps_xy,2));
281 eps2=(eps_xx+eps_yy)/2.-sqrt(pow((eps_xx-eps_yy)/2.,2)+pow(eps_xy,2));
282 if(fabs(eps2)>fabs(eps1)){epstmp=eps2; eps2=eps1; eps1=epstmp;}
285 epseff=1./sqrt(2.)*sqrt(eps1*eps1-eps1*eps2+eps2*eps2);
286 eps0=pow(stress_threshold/B,n);
289 f[i]=1.-pow(eps0/epseff,1./n)*exp(-(epseff-eps0)/(epsf-eps0))-damage;
294 if(f[i]>10.) f[i]=10.;
295 if(f[i]<-10.) f[i]=-10.;
302 xDelete<IssmDouble>(f);
309 IssmDouble s_xx,s_xy,s_xz,s_yy,s_yz,s_zz,s1,s2,s3,stmp;
311 IssmDouble damage,tau_xx,tau_xy,tau_xz,tau_yy,tau_yz,tau_zz,stressMaxPrincipal;
312 int equivstress,domaintype,dim;
330 default:
_error_(
"not implemented");
342 Input2* tau_xz_input = NULL;
343 Input2* tau_yz_input = NULL;
344 Input2* tau_zz_input = NULL;
345 Input2* stressMaxPrincipal_input = NULL;
352 Input2* damage_input = NULL;
365 for (
int i=0;i<numnodes;i++){
378 s_xx=tau_xx/(1.-damage);
379 s_xy=tau_xy/(1.-damage);
380 s_yy=tau_yy/(1.-damage);
382 s_xz=tau_xz/(1.-damage);
383 s_yz=tau_yz/(1.-damage);
384 s_zz=tau_zz/(1.-damage);
388 s1=(s_xx+s_yy)/2.+sqrt(pow((s_xx-s_yy)/2.,2)+pow(s_xy,2));
389 s2=(s_xx+s_yy)/2.-sqrt(pow((s_xx-s_yy)/2.,2)+pow(s_xy,2));
390 if(fabs(s2)>fabs(s1)){stmp=s2; s2=s1; s1=stmp;}
393 Chi=sqrt(s1*s1-s1*s2+s2*s2);
395 else if(equivstress==1){
398 Psi=Chi-stress_threshold;
401 f[i]= c1*(pow(PosPsi,c2) - healing*pow(NegPsi,c2))*pow((1./(1.-damage)),c3);
405 stressMaxPrincipal_input->
GetInputValue(&stressMaxPrincipal,gauss);
406 Chi=stressMaxPrincipal/(1.-damage);
408 else if(equivstress==0){
409 Chi=sqrt(((s_xx-s_yy)*(s_xx-s_yy)+(s_yy-s_zz)*(s_yy-s_zz)+(s_zz-s_xx)*(s_zz-s_xx)+6.*(s_xy*s_xy+s_yz*s_yz+s_xz*s_xz))/2.);
411 Psi=Chi-stress_threshold;
414 f[i]= c1*(pow(PosPsi,c2) - healing*pow(NegPsi,c2))*pow((1./(1.-damage)),c3);
421 xDelete<IssmDouble>(f);
439 IssmDouble vel,vx,vy,vz,dvxdx,dvydy,dvzdz,dvx[3],dvy[3],dvz[3];
447 default:
_error_(
"Not implemented yet");
455 IssmDouble* basis = xNew<IssmDouble>(numnodes);
456 IssmDouble* B = xNew<IssmDouble>(dim*numnodes);
457 IssmDouble* Bprime = xNew<IssmDouble>(dim*numnodes);
458 IssmDouble* D = xNewZeroInit<IssmDouble>(dim*dim);
476 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
492 D_scalar=gauss->
weight*Jdet;
498 GetB(B,element,dim,xyz_list,gauss);
499 GetBprime(Bprime,element,dim,xyz_list,gauss);
503 if(dim==3) dvzdz=dvz[2];
504 D_scalar=dt*gauss->
weight*Jdet;
506 D[0*dim+0]=D_scalar*dvxdx;
507 D[1*dim+1]=D_scalar*dvydy;
508 if(dim==3) D[2*dim+2]=D_scalar*dvzdz;
515 D[0*dim+0]=D_scalar*vx;
516 D[1*dim+1]=D_scalar*vy;
517 if(dim==3) D[2*dim+2]=D_scalar*vz;
521 Bprime,dim,numnodes,0,
524 if(stabilization==2){
526 vel=sqrt(vx*vx+vy*vy+vz*vz)+1.e-8;
527 D[0*dim+0]=h/(2.0*vel)*vx*vx;
528 D[1*dim+0]=h/(2.0*vel)*vy*vx;
529 D[2*dim+0]=h/(2.0*vel)*vz*vx;
530 D[0*dim+1]=h/(2.0*vel)*vx*vy;
531 D[1*dim+1]=h/(2.0*vel)*vy*vy;
532 D[2*dim+1]=h/(2.0*vel)*vy*vz;
533 D[0*dim+2]=h/(2.0*vel)*vx*vz;
534 D[1*dim+2]=h/(2.0*vel)*vy*vz;
535 D[2*dim+2]=h/(2.0*vel)*vz*vz;
539 vel=sqrt(vx*vx+vy*vy)+1.e-8;
540 D[0*dim+0]=h/(2.0*vel)*vx*vx;
541 D[1*dim+0]=h/(2.0*vel)*vy*vx;
542 D[0*dim+1]=h/(2.0*vel)*vx*vy;
543 D[1*dim+1]=h/(2.0*vel)*vy*vy;
546 else if(stabilization==1){
550 D[0*dim+0]=h/2.0*fabs(vx);
551 D[1*dim+1]=h/2.0*fabs(vy);
555 vel=sqrt(vx*vx + vy*vy + vz*vz)+1.e-14;
556 h=sqrt( pow(hx*vx/vel,2) + pow(hy*vy/vel,2) + pow(hz*vz/vel,2));
557 D[0*dim+0]=h/(2.*vel)*fabs(vx*vx); D[0*dim+1]=h/(2.*vel)*fabs(vx*vy); D[0*dim+2]=h/(2.*vel)*fabs(vx*vz);
558 D[1*dim+0]=h/(2.*vel)*fabs(vy*vx); D[1*dim+1]=h/(2.*vel)*fabs(vy*vy); D[1*dim+2]=h/(2.*vel)*fabs(vy*vz);
559 D[2*dim+0]=h/(2.*vel)*fabs(vz*vx); D[2*dim+1]=h/(2.*vel)*fabs(vz*vy); D[2*dim+2]=h/(2.*vel)*fabs(vz*vz);
562 if(stabilization==1 || stabilization==2){
564 D[0*dim+0]=D_scalar*D[0*dim+0];
565 D[1*dim+0]=D_scalar*D[1*dim+0];
566 D[0*dim+1]=D_scalar*D[0*dim+1];
567 D[1*dim+1]=D_scalar*D[1*dim+1];
570 D[0*dim+0]=D_scalar*D[0*dim+0];
571 D[1*dim+0]=D_scalar*D[1*dim+0];
572 D[2*dim+0]=D_scalar*D[2*dim+0];
573 D[0*dim+1]=D_scalar*D[0*dim+1];
574 D[1*dim+1]=D_scalar*D[1*dim+1];
575 D[2*dim+1]=D_scalar*D[2*dim+1];
576 D[0*dim+2]=D_scalar*D[0*dim+2];
577 D[1*dim+2]=D_scalar*D[1*dim+2];
578 D[2*dim+2]=D_scalar*D[2*dim+2];
582 Bprime,dim,numnodes,0,
589 xDelete<IssmDouble>(xyz_list);
590 xDelete<IssmDouble>(basis);
591 xDelete<IssmDouble>(B);
592 xDelete<IssmDouble>(Bprime);
593 xDelete<IssmDouble>(D);
603 int domaintype,damagelaw;
615 IssmDouble* basis = xNew<IssmDouble>(numnodes);
635 _error_(
"not implemented yet");
638 Input2* damaged_input = NULL;
649 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
658 for(
int i=0;i<numnodes;i++){
659 pe->
values[i]+=Jdet*gauss->
weight*(damage+dt*f)*basis[i];
663 xDelete<IssmDouble>(xyz_list);
664 xDelete<IssmDouble>(basis);
687 for(
int i=0;i<numnodes;i++){
688 for(
int j=0;j<dim;j++){
689 B[numnodes*j+i] = basis[i];
694 xDelete<IssmDouble>(basis);
711 IssmDouble* dbasis=xNew<IssmDouble>(dim*numnodes);
715 for(
int i=0;i<numnodes;i++){
716 for(
int j=0;j<dim;j++){
717 Bprime[numnodes*j+i] = dbasis[j*numnodes+i];
722 xDelete<IssmDouble>(dbasis);
729 _error_(
"Not implemented yet");
739 IssmDouble* newdamage = xNew<IssmDouble>(numnodes);
745 for(
int i=0;i<numnodes;i++){
746 newdamage[i]=solution[doflist[i]];
748 if(xIsNan<IssmDouble>(newdamage[i]))
_error_(
"NaN found in solution vector");
749 if(xIsInf<IssmDouble>(newdamage[i]))
_error_(
"Inf found in solution vector");
751 if(newdamage[i]>max_damage) newdamage[i]=max_damage;
752 else if(newdamage[i]<0.) newdamage[i]=0.;
766 xDelete<IssmDouble>(newdamage);
767 xDelete<int>(doflist);
790 IssmDouble* B = xNew<IssmDouble>(dim*numnodes);
791 IssmDouble* Bprime = xNew<IssmDouble>(dim*numnodes);
792 IssmDouble* D = xNewZeroInit<IssmDouble>(dim*dim);
801 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
805 GetB(B,element,dim,xyz_list,gauss);
806 GetBprime(Bprime,element,dim,xyz_list,gauss);
810 D[0*dim+0] = -gauss->
weight*vx*Jdet;
811 D[1*dim+1] = -gauss->
weight*vy*Jdet;
815 Bprime,dim,numnodes,0,
821 xDelete<IssmDouble>(xyz_list);
822 xDelete<IssmDouble>(B);
823 xDelete<IssmDouble>(Bprime);
824 xDelete<IssmDouble>(D);
842 IssmDouble* basis = xNew<IssmDouble>(numnodes);
849 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
863 xDelete<IssmDouble>(xyz_list);
864 xDelete<IssmDouble>(basis);