 |
Ice Sheet System Model
4.18
Code documentation
|
#include <DamageEvolutionAnalysis.h>
|
void | CreateConstraints (Constraints *constraints, IoModel *iomodel) |
|
void | CreateLoads (Loads *loads, IoModel *iomodel) |
|
void | CreateNodes (Nodes *nodes, IoModel *iomodel, bool isamr=false) |
|
int | DofsPerNode (int **doflist, int domaintype, int approximation) |
|
void | UpdateElements (Elements *elements, Inputs2 *inputs2, IoModel *iomodel, int analysis_counter, int analysis_type) |
|
void | UpdateParameters (Parameters *parameters, IoModel *iomodel, int solution_enum, int analysis_enum) |
|
void | Core (FemModel *femmodel) |
|
void | CreateDamageFInput (Element *element) |
|
void | CreateDamageFInputArctan (Element *element) |
|
void | CreateDamageFInputExp (Element *element) |
|
void | CreateDamageFInputPralong (Element *element) |
|
ElementVector * | CreateDVector (Element *element) |
|
ElementMatrix * | CreateJacobianMatrix (Element *element) |
|
ElementMatrix * | CreateKMatrix (Element *element) |
|
ElementVector * | CreatePVector (Element *element) |
|
void | GetB (IssmDouble *B, Element *element, int dim, IssmDouble *xyz_list, Gauss *gauss) |
|
void | GetBprime (IssmDouble *B, Element *element, int dim, IssmDouble *xyz_list, Gauss *gauss) |
|
void | GetSolutionFromInputs (Vector< IssmDouble > *solution, Element *element) |
|
void | GradientJ (Vector< IssmDouble > *gradient, Element *element, int control_type, int control_index) |
|
void | InputUpdateFromSolution (IssmDouble *solution, Element *element) |
|
void | UpdateConstraints (FemModel *femmodel) |
|
ElementMatrix * | CreateFctKMatrix (Element *element) |
|
ElementMatrix * | CreateMassMatrix (Element *element) |
|
void | FctKMatrix (Matrix< IssmDouble > **pKff, Matrix< IssmDouble > **pKfs, FemModel *femmodel) |
|
void | MassMatrix (Matrix< IssmDouble > **pMff, FemModel *femmodel) |
|
virtual | ~Analysis () |
|
Definition at line 11 of file DamageEvolutionAnalysis.h.
◆ CreateConstraints()
void DamageEvolutionAnalysis::CreateConstraints |
( |
Constraints * |
constraints, |
|
|
IoModel * |
iomodel |
|
) |
| |
|
virtual |
◆ CreateLoads()
void DamageEvolutionAnalysis::CreateLoads |
( |
Loads * |
loads, |
|
|
IoModel * |
iomodel |
|
) |
| |
|
virtual |
◆ CreateNodes()
void DamageEvolutionAnalysis::CreateNodes |
( |
Nodes * |
nodes, |
|
|
IoModel * |
iomodel, |
|
|
bool |
isamr = false |
|
) |
| |
|
virtual |
◆ DofsPerNode()
int DamageEvolutionAnalysis::DofsPerNode |
( |
int ** |
doflist, |
|
|
int |
domaintype, |
|
|
int |
approximation |
|
) |
| |
|
virtual |
◆ UpdateElements()
void DamageEvolutionAnalysis::UpdateElements |
( |
Elements * |
elements, |
|
|
Inputs2 * |
inputs2, |
|
|
IoModel * |
iomodel, |
|
|
int |
analysis_counter, |
|
|
int |
analysis_type |
|
) |
| |
|
virtual |
Implements Analysis.
Definition at line 42 of file DamageEvolutionAnalysis.cpp.
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++){
◆ UpdateParameters()
void DamageEvolutionAnalysis::UpdateParameters |
( |
Parameters * |
parameters, |
|
|
IoModel * |
iomodel, |
|
|
int |
solution_enum, |
|
|
int |
analysis_enum |
|
) |
| |
|
virtual |
◆ Core()
void DamageEvolutionAnalysis::Core |
( |
FemModel * |
femmodel | ) |
|
|
virtual |
◆ CreateDamageFInput()
void DamageEvolutionAnalysis::CreateDamageFInput |
( |
Element * |
element | ) |
|
◆ CreateDamageFInputArctan()
void DamageEvolutionAnalysis::CreateDamageFInputArctan |
( |
Element * |
element | ) |
|
Definition at line 146 of file DamageEvolutionAnalysis.cpp.
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);
◆ CreateDamageFInputExp()
void DamageEvolutionAnalysis::CreateDamageFInputExp |
( |
Element * |
element | ) |
|
Definition at line 231 of file DamageEvolutionAnalysis.cpp.
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);
◆ CreateDamageFInputPralong()
void DamageEvolutionAnalysis::CreateDamageFInputPralong |
( |
Element * |
element | ) |
|
Definition at line 305 of file DamageEvolutionAnalysis.cpp.
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);
◆ CreateDVector()
◆ CreateJacobianMatrix()
◆ CreateKMatrix()
Implements Analysis.
Definition at line 431 of file DamageEvolutionAnalysis.cpp.
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);
◆ CreatePVector()
Implements Analysis.
Definition at line 597 of file DamageEvolutionAnalysis.cpp.
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);
◆ GetB()
Definition at line 668 of file DamageEvolutionAnalysis.cpp.
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);
◆ GetBprime()
Definition at line 696 of file DamageEvolutionAnalysis.cpp.
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);
◆ GetSolutionFromInputs()
◆ GradientJ()
void DamageEvolutionAnalysis::GradientJ |
( |
Vector< IssmDouble > * |
gradient, |
|
|
Element * |
element, |
|
|
int |
control_type, |
|
|
int |
control_index |
|
) |
| |
|
virtual |
◆ InputUpdateFromSolution()
void DamageEvolutionAnalysis::InputUpdateFromSolution |
( |
IssmDouble * |
solution, |
|
|
Element * |
element |
|
) |
| |
|
virtual |
Implements Analysis.
Definition at line 731 of file DamageEvolutionAnalysis.cpp.
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);
◆ UpdateConstraints()
void DamageEvolutionAnalysis::UpdateConstraints |
( |
FemModel * |
femmodel | ) |
|
|
virtual |
◆ CreateFctKMatrix()
Definition at line 774 of file DamageEvolutionAnalysis.cpp.
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);
◆ CreateMassMatrix()
Definition at line 828 of file DamageEvolutionAnalysis.cpp.
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);
◆ FctKMatrix()
◆ MassMatrix()
The documentation for this class was generated from the following files:
virtual int GetElementType(void)=0
virtual int GetNumberOfNodes(void)=0
void FindParam(bool *pvalue, int paramenum)
void CreateDamageFInput(Element *element)
@ TimesteppingTimeStepEnum
@ DamageEvolutionAnalysisEnum
int IoCodeToEnumElementEquation(int enum_in)
int TripleMultiply(IssmDouble *a, int nrowa, int ncola, int itrna, IssmDouble *b, int nrowb, int ncolb, int itrnb, IssmDouble *c, int nrowc, int ncolc, int itrnc, IssmDouble *d, int iaddd)
void AllocateSystemMatricesx(Matrix< IssmDouble > **pKff, Matrix< IssmDouble > **pKfs, Vector< IssmDouble > **pdf, Vector< IssmDouble > **ppf, FemModel *femmodel)
virtual void GaussNode(int finitelement, int iv)=0
@ DamageStabilizationEnum
@ DamageEvolutionNumRequestedOutputsEnum
void AddObject(Param *newparam)
@ MaterialsRheologyBbarEnum
virtual Input2 * GetInput2(int inputenum)=0
virtual void NodalFunctions(IssmDouble *basis, Gauss *gauss)=0
void CreateDamageFInputArctan(Element *element)
virtual void ElementSizes(IssmDouble *phx, IssmDouble *phy, IssmDouble *phz)=0
ElementMatrix * CreateMassMatrix(Element *element)
ElementVector * NewElementVector(int approximation_enum=NoneApproximationEnum)
void DeleteData(int num,...)
void ActivatePenaltyMethod(int in_analysis)
Param * CopyConstantObject(const char *constant_name, int param_enum)
virtual void AddInput2(int input_enum, IssmDouble *values, int interpolation_enum)
ElementMatrix * CreateFctKMatrix(Element *element)
virtual Gauss * NewGauss(void)=0
void FindConstant(bool *pvalue, const char *constant_name)
void GetVerticesCoordinates(IssmDouble **xyz_list)
void CreateDamageFInputPralong(Element *element)
void FetchData(bool *pboolean, const char *data_name)
void CreateDamageFInputExp(Element *element)
void GetDofListLocal(int **pdoflist, int approximation_enum, int setenum)
@ DamageStressThresholdEnum
virtual void SetElementInput(int enum_in, IssmDouble values)
void GetBprime(IssmDouble *B, Element *element, int dim, IssmDouble *xyz_list, Gauss *gauss)
IssmDouble * Data(const char *data_name)
void GetSolutionFromInputsOneDof(Vector< IssmDouble > *solution, int solutionenum)
#define _error_(StreamArgs)
void SetActiveNodesLSMx(FemModel *femmodel)
virtual int begin(void)=0
Object * GetObjectByOffset(int offset)
virtual IssmDouble CharacteristicLength(void)=0
IssmDouble min(IssmDouble a, IssmDouble b)
@ DamageEvolutionRequestedOutputsEnum
virtual void JacobianDeterminant(IssmDouble *Jdet, IssmDouble *xyz_list, Gauss *gauss)=0
virtual void GaussPoint(int ig)=0
virtual void Update(Inputs2 *inputs2, int index, IoModel *iomodel, int analysis_counter, int analysis_type, int finite_element)=0
void FetchDataToInput(Inputs2 *inputs2, Elements *elements, const char *vector_name, int input_enum)
void IoModelToConstraintsx(Constraints *constraints, IoModel *iomodel, const char *spc_name, int analysis_type, int finite_element, int dof)
void AddToGlobal(Matrix< IssmDouble > *Kff, Matrix< IssmDouble > *Kfs)
void GetB(IssmDouble *B, Element *element, int dim, IssmDouble *xyz_list, Gauss *gauss)
IssmDouble max(IssmDouble a, IssmDouble b)
void CreateNodes(Nodes *nodes, IoModel *iomodel, bool isamr=false)
virtual void NodalFunctionsDerivatives(IssmDouble *dbasis, IssmDouble *xyz_list, Gauss *gauss)=0
virtual void ComputeDeviatoricStressTensor(void)=0
ElementMatrix * NewElementMatrix(int approximation_enum=NoneApproximationEnum)
void StressMaxPrincipalCreateInput(void)