Changeset 16996
- Timestamp:
- 12/03/13 11:28:58 (11 years ago)
- Location:
- issm/trunk-jpl/src/c/classes/Elements
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Elements/Penta.cpp
r16993 r16996 4520 4520 } 4521 4521 /*}}}*/ 4522 /*FUNCTION Penta::KMatrixGLSstabilization{{{*/4523 void Penta::KMatrixGLSstabilization(ElementMatrix* Ke){4524 4525 int numdof = NUMVERTICES*NDOF4;4526 4527 /*Intermediaries */4528 int i,j;4529 IssmDouble Jdet,viscosity,FSreconditioning,diameter,rigidity;4530 IssmDouble xyz_list[NUMVERTICES][3];4531 IssmDouble epsilon[6]; /* epsilon=[exx,eyy,ezz,exy,exz,eyz];*/4532 GaussPenta *gauss=NULL;4533 4534 /*Stabilization*/4535 IssmDouble D_scalar;4536 IssmDouble dbasis[3][6];4537 IssmDouble dmu[3];4538 IssmDouble mu;4539 IssmDouble dnodalbasis[6][6][3];4540 IssmDouble SU[6][4][4];4541 IssmDouble SW[6][4][4];4542 int p,q,ii;4543 int c=3; //index of pressure4544 4545 /*Retrieve all inputs and parameters*/4546 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);4547 parameters->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum);4548 Input* vx_input=inputs->GetInput(VxEnum); _assert_(vx_input);4549 Input* vy_input=inputs->GetInput(VyEnum); _assert_(vy_input);4550 Input* vz_input=inputs->GetInput(VzEnum); _assert_(vz_input);4551 4552 /*Find minimal length and B*/4553 rigidity=material->GetB();4554 diameter=MinEdgeLength(&xyz_list[0][0]);4555 4556 gauss=new GaussPenta();4557 for(int iv=0;iv<6;iv++){4558 gauss->GaussVertex(iv);4559 GetNodalFunctionsP1Derivatives(&dbasis[0][0],&xyz_list[0][0],gauss);4560 for(i=0;i<6;i++){4561 for(j=0;j<3;j++){4562 dnodalbasis[i][iv][j] = dbasis[j][i];4563 }4564 }4565 }4566 delete gauss;4567 4568 /* Start looping on the number of gaussian points: */4569 gauss=new GaussPenta(5,5);4570 for(int ig=gauss->begin();ig<gauss->end();ig++){4571 4572 gauss->GaussPoint(ig);4573 4574 GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss);4575 4576 this->StrainRateFS(&epsilon[0],&xyz_list[0][0],gauss,vx_input,vy_input,vz_input);4577 material->GetViscosity3dFS(&viscosity,&epsilon[0]);4578 4579 D_scalar=gauss->weight*Jdet;4580 4581 /*Add stabilization*/4582 GetNodalFunctionsP1Derivatives(&dbasis[0][0],&xyz_list[0][0],gauss);4583 dmu[0]=0.; dmu[1]=0.; dmu[2]=0.;4584 mu = 2.*viscosity;4585 for(p=0;p<6;p++) for(i=0;i<4;i++) for(j=0;j<4;j++){4586 SU[p][i][j]=0.;4587 SW[p][i][j]=0.;4588 }4589 for(p=0;p<6;p++){4590 for(i=0;i<3;i++){4591 SU[p][i][c] += dbasis[i][p];4592 SW[p][c][i] += dbasis[i][p];4593 for(j=0;j<3;j++){4594 SU[p][i][i] += -dmu[j]*dbasis[j][p];4595 SU[p][i][j] += -dmu[i]*dbasis[i][p];4596 for(ii=0;ii<6;ii++){4597 SU[p][i][i] += -mu*dnodalbasis[p][ii][j]*dbasis[j][ii];4598 SU[p][i][j] += -mu*dnodalbasis[p][ii][i]*dbasis[j][ii];4599 }4600 SW[p][i][i] += -dmu[j]*dbasis[j][p];4601 SW[p][j][i] += -dmu[j]*dbasis[i][p];4602 for(ii=0;ii<6;ii++){4603 SW[p][i][i] += -mu*dnodalbasis[p][ii][j]*dbasis[j][ii];4604 SW[p][j][i] += -mu*dnodalbasis[p][ii][i]*dbasis[j][ii];4605 }4606 }4607 }4608 }4609 IssmDouble tau = 1./3.*pow(diameter,2)/(8.*2.*viscosity);4610 for(p=0;p<6;p++){4611 for(q=0;q<6;q++){4612 for(i=0;i<4;i++){4613 for(j=0;j<4;j++){4614 Ke->values[(p*4+i)*numdof+q*4+j] += gauss->weight*Jdet*tau*SW[p][i][0]*SU[q][0][j];4615 Ke->values[(p*4+i)*numdof+q*4+j] += gauss->weight*Jdet*tau*SW[p][i][1]*SU[q][1][j];4616 Ke->values[(p*4+i)*numdof+q*4+j] += gauss->weight*Jdet*tau*SW[p][i][2]*SU[q][2][j];4617 }4618 }4619 }4620 }4621 }4622 4623 /*Clean up*/4624 delete gauss;4625 }4626 /*}}}*/4627 4522 #endif 4628 4523 -
issm/trunk-jpl/src/c/classes/Elements/Penta.h
r16993 r16996 212 212 void GetMaterialInputValue(IssmDouble* pvalue,Node* node,int enumtype); 213 213 Node* GetNode(int node_number); 214 void GetStrainRate3dHO(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss, Input* vx_input, Input* vy_input);215 void GetStrainRate3d(IssmDouble* epsilon,IssmDouble* xyz_list, Gauss* gauss, Input* vx_input, Input* vy_input, Input* vz_input);216 214 Penta* GetUpperElement(void); 217 215 Penta* GetLowerElement(void); … … 257 255 ElementVector* CreateDVectorStressbalanceHoriz(void); 258 256 ElementVector* CreateDVectorStressbalanceFS(void); 259 void KMatrixGLSstabilization(ElementMatrix* Ke);260 257 #endif 261 258 -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r16993 r16996 3062 3062 #endif 3063 3063 3064 #ifdef _HAVE_STRESSBALANCE_3065 /*FUNCTION Tria::GetYcoord {{{*/3066 IssmDouble Tria::GetYcoord(GaussTria* gauss){3067 3068 IssmDouble y;3069 IssmDouble xyz_list[NUMVERTICES][3];3070 IssmDouble y_list[NUMVERTICES];3071 3072 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);3073 for(int i=0;i<NUMVERTICES;i++) y_list[i]=xyz_list[i][1];3074 TriaRef::GetInputValue(&y,&y_list[0],gauss,P1Enum);3075 3076 return y;3077 }3078 /*}}}*/3079 #endif3080 3081 3064 #ifdef _HAVE_CONTROL_ 3082 3065 /*FUNCTION Tria::BalancethicknessMisfit{{{*/ … … 4905 4888 #endif 4906 4889 4907 #ifdef _HAVE_DAMAGE_4908 /*FUNCTION Tria::DamageEvolutionF{{{*/4909 void Tria::DamageEvolutionF(IssmDouble* f){4910 4911 /*Intermediaries */4912 IssmDouble c1,c2,c3,healing,stress_threshold;4913 IssmDouble s_xx,s_xy,s_yy;4914 IssmDouble J2s;4915 IssmDouble Xis;4916 IssmDouble Psi;4917 IssmDouble PosPsi;4918 IssmDouble NegPsi;4919 Input* damage_input=NULL;4920 Input* sigma_xx_input = NULL;4921 Input* sigma_xy_input = NULL;4922 Input* sigma_yy_input = NULL;4923 GaussTria* gauss=NULL;4924 IssmDouble damage,sigma_xx,sigma_xy,sigma_yy;4925 4926 /*retrieve parameters:*/4927 this->parameters->FindParam(&c1,DamageC1Enum);4928 this->parameters->FindParam(&c2,DamageC2Enum);4929 this->parameters->FindParam(&c3,DamageC3Enum);4930 this->parameters->FindParam(&healing,DamageHealingEnum);4931 this->parameters->FindParam(&stress_threshold,DamageStressThresholdEnum);4932 4933 /*Compute stress tensor: */4934 this->ComputeStressTensor();4935 4936 /*retrieve what we need: */4937 sigma_xx_input = inputs->GetInput(StressTensorxxEnum); _assert_(sigma_xx_input);4938 sigma_xy_input = inputs->GetInput(StressTensorxyEnum); _assert_(sigma_xy_input);4939 sigma_yy_input = inputs->GetInput(StressTensoryyEnum); _assert_(sigma_yy_input);4940 damage_input = this->material->inputs->GetInput(DamageDbarEnum); _assert_(damage_input);4941 4942 /*Damage evolution z mapping: */4943 gauss=new GaussTria();4944 J2s=0;4945 for (int iv=0;iv<NUMVERTICES;iv++){4946 gauss->GaussVertex(iv);4947 4948 damage_input->GetInputValue(&damage,gauss);4949 sigma_xx_input->GetInputValue(&sigma_xx,gauss);4950 sigma_xy_input->GetInputValue(&sigma_xy,gauss);4951 sigma_yy_input->GetInputValue(&sigma_yy,gauss);4952 4953 s_xx=sigma_xx/(1-damage);4954 s_xy=sigma_xy/(1-damage);4955 s_yy=sigma_yy/(1-damage);4956 4957 J2s=1.0/sqrt(2.0)*sqrt(pow(s_xx,2)+pow(s_yy,2)+2*pow(s_xy,2));4958 4959 Xis=sqrt(3.0)*J2s;4960 4961 Psi=Xis-stress_threshold;4962 4963 PosPsi=max(Psi,0.0);4964 NegPsi=max(-Psi,0.0);4965 4966 f[iv]= c1* ( pow(PosPsi,c2) - healing * pow(NegPsi,c2) ) * pow((1 - damage),-c3);4967 4968 }4969 4970 /*Clean up and return*/4971 delete gauss;4972 }4973 /*}}}*/4974 #endif4975 4976 4890 #ifdef _HAVE_DAKOTA_ 4977 4891 /*FUNCTION Tria::InputUpdateFromVectorDakota(IssmDouble* vector, int name, int type);{{{*/ -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r16993 r16996 261 261 void ViscousHeating(IssmDouble* pphi,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input){_error_("not implemented yet");}; 262 262 263 #ifdef _HAVE_STRESSBALANCE_264 void PVectorGLSstabilization(ElementVector* pe);265 IssmDouble GetYcoord(GaussTria* gauss);266 #endif267 268 263 void UpdateConstraintsExtrudeFromBase(void); 269 264 void UpdateConstraintsExtrudeFromTop(void); … … 283 278 void HydrologyEPLGetMask(Vector<IssmDouble>* vec_mask); 284 279 void ComputeEPLThickness(void); 285 286 #endif 287 288 #ifdef _HAVE_DAMAGE_ 289 void DamageEvolutionF(IssmDouble* flist); 290 #endif 291 292 280 #endif 293 281 /*}}}*/ 294 282
Note:
See TracChangeset
for help on using the changeset viewer.