Changeset 17307
- Timestamp:
- 02/19/14 13:30:46 (11 years ago)
- Location:
- issm/trunk-jpl/src/c/analyses
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/LsfReinitializationAnalysis.cpp
r17305 r17307 6 6 7 7 /*Model processing*/ 8 int LsfReinitializationAnalysis::DofsPerNode(int** doflist,int meshtype,int approximation){ 9 _error_("not implemented yet");10 } 11 void LsfReinitializationAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){ 12 _error_("not implemented yet");13 } 14 void LsfReinitializationAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){ 15 _error_("not implemented yet");16 } 17 void LsfReinitializationAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){ 18 _error_("not implemented yet");19 } 20 void LsfReinitializationAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){ 21 _error_("not implemented yet");22 } 23 void LsfReinitializationAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){ 24 _error_("not implemented yet");25 } 8 int LsfReinitializationAnalysis::DofsPerNode(int** doflist,int meshtype,int approximation){/*{{{*/ 9 return 1; 10 }/*}}}*/ 11 void LsfReinitializationAnalysis::UpdateParameters(Parameters* parameters,IoModel* iomodel,int solution_enum,int analysis_enum){/*{{{*/ 12 /* Do nothing for now */ 13 }/*}}}*/ 14 void LsfReinitializationAnalysis::UpdateElements(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type){/*{{{*/ 15 /* Do nothing for now */ 16 }/*}}}*/ 17 void LsfReinitializationAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/ 18 /* Do nothing for now */ 19 }/*}}}*/ 20 void LsfReinitializationAnalysis::CreateConstraints(Constraints* constraints,IoModel* iomodel){/*{{{*/ 21 /* Do nothing for now */ 22 }/*}}}*/ 23 void LsfReinitializationAnalysis::CreateLoads(Loads* loads, IoModel* iomodel){/*{{{*/ 24 /* Do nothing for now */ 25 }/*}}}*/ 26 26 27 27 /*Finite element Analysis*/ 28 void LsfReinitializationAnalysis::Core(FemModel* femmodel){ 28 void LsfReinitializationAnalysis::Core(FemModel* femmodel){/*{{{*/ 29 29 _error_("not implemented yet"); 30 } 31 ElementVector* LsfReinitializationAnalysis::CreateDVector(Element* element){ 30 }/*}}}*/ 31 ElementVector* LsfReinitializationAnalysis::CreateDVector(Element* element){/*{{{*/ 32 32 _error_("not implemented yet"); 33 } 34 ElementMatrix* LsfReinitializationAnalysis::CreateJacobianMatrix(Element* element){ 33 }/*}}}*/ 34 ElementMatrix* LsfReinitializationAnalysis::CreateJacobianMatrix(Element* element){/*{{{*/ 35 35 _error_("not implemented yet"); 36 } 37 ElementMatrix* LsfReinitializationAnalysis::CreateKMatrix(Element* element){ 36 }/*}}}*/ 37 ElementMatrix* LsfReinitializationAnalysis::CreateKMatrix(Element* element){/*{{{*/ 38 38 _error_("not implemented yet"); 39 } 40 ElementVector* LsfReinitializationAnalysis::CreatePVector(Element* element){ 39 }/*}}}*/ 40 ElementVector* LsfReinitializationAnalysis::CreatePVector(Element* element){/*{{{*/ 41 41 _error_("not implemented yet"); 42 } 43 void LsfReinitializationAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){ 42 }/*}}}*/ 43 void LsfReinitializationAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/ 44 44 _error_("not implemented yet"); 45 } 46 void LsfReinitializationAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){ 45 }/*}}}*/ 46 void LsfReinitializationAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/ 47 47 _error_("not implemented yet"); 48 } 49 void LsfReinitializationAnalysis::UpdateConstraints(FemModel* femmodel){ 48 }/*}}}*/ 49 void LsfReinitializationAnalysis::UpdateConstraints(FemModel* femmodel){/*{{{*/ 50 50 _error_("not implemented yet"); 51 } 51 }/*}}}*/ 52 52 53 /* Other */ 54 void LsfReinitializationAnalysis::SetDistanceOnIntersectedElements(FemModel* femmodel){/*{{{*/ 55 56 /* Intermediaries */ 57 int i; 58 59 /*Initialize vector with number of vertices*/ 60 int numvertices=femmodel->vertices->NumberOfVertices(); 61 Vector<IssmDouble>* vec_dist_zerolevelset=new Vector<IssmDouble>(numvertices); //vertices that have ice at next time step 62 63 /*TODO: Fill vector with values of old level set function: */ 64 for(i=0;i<numvertices;i++){ 65 vec_dist_zerolevelset->SetValue(i,0.,INS_VAL); 66 } 67 for(i=0;i<femmodel->elements->Size();i++){ 68 Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i)); 69 if(element->IsZeroLevelset(MaskIceLevelsetEnum)) 70 SetDistanceToZeroLevelsetElement(vec_dist_zerolevelset, element); 71 } 72 73 /*Assemble vector and serialize */ 74 vec_dist_zerolevelset->Assemble(); 75 IssmDouble* dist_zerolevelset=vec_dist_zerolevelset->ToMPISerial(); 76 InputUpdateFromVectorx(femmodel,dist_zerolevelset,MaskIceLevelsetEnum,VertexSIdEnum); 77 78 /*Clean up and return*/ 79 delete vec_dist_zerolevelset; 80 delete dist_zerolevelset; 81 }/*}}}*/ 82 void LsfReinitializationAnalysis::SetDistanceToZeroLevelsetElement(Vector<IssmDouble>* vec_signed_dist, Element* element){/*{{{*/ 83 84 if(!element->IsZeroLevelset(MaskIceLevelsetEnum)) 85 return; 86 87 /* Intermediaries */ 88 const int dim=3; 89 int i,d; 90 int numvertices=element->GetNumberOfVertices(); 91 IssmDouble s0[dim], s1[dim], v[dim]; 92 IssmDouble dist,lsf_old; 93 94 IssmDouble* lsf = xNew<IssmDouble>(numvertices); 95 IssmDouble* sign_lsf = xNew<IssmDouble>(numvertices); 96 IssmDouble* signed_dist = xNew<IssmDouble>(numvertices); 97 IssmDouble* xyz_list = NULL; 98 IssmDouble* xyz_list_zero = NULL; 99 100 /* retrieve inputs and parameters */ 101 element->GetVerticesCoordinates(&xyz_list); 102 element->GetInputListOnVertices(lsf,MaskIceLevelsetEnum); 103 104 /* get sign of levelset function */ 105 for(i=0;i<numvertices;i++){ 106 if(lsf[i]==0.) 107 sign_lsf[i]=1.; 108 else 109 sign_lsf[i]=lsf[i]/fabs(lsf[i]); 110 } 111 112 element->ZeroLevelsetCoordinates(&xyz_list_zero, xyz_list, MaskIceLevelsetEnum); 113 for(d=0;d<dim;d++){ 114 s0[d]=xyz_list_zero[0+d]; 115 s1[d]=xyz_list_zero[3+d]; 116 } 117 118 /* get signed_distance of vertices to zero levelset straight */ 119 for(i=0;i<numvertices;i++){ 120 for(d=0;d<dim;d++) 121 v[d]=xyz_list[3*i+d]; 122 dist=GetDistanceToStraight(&v[0],&s0[0],&s1[0]); 123 signed_dist[i]=sign_lsf[i]*dist; 124 } 125 126 /* insert signed_distance into vec_signed_dist, if computed distance is smaller */ 127 for(i=0;i<numvertices;i++){ 128 vec_signed_dist->GetValue(&lsf_old, element->vertices[i]->Sid()); 129 if(fabs(signed_dist[i])<fabs(lsf_old)) 130 vec_signed_dist->SetValue(element->vertices[i]->Sid(),signed_dist[i],INS_VAL); 131 } 132 133 xDelete<IssmDouble>(lsf); 134 xDelete<IssmDouble>(sign_lsf); 135 xDelete<IssmDouble>(signed_dist); 136 }/*}}}*/ 137 IssmDouble LsfReinitializationAnalysis::GetDistanceToStraight(IssmDouble* q, IssmDouble* s0, IssmDouble* s1){/*{{{*/ 138 // returns distance d of point q to straight going through points s0, s1 139 // d=|a x b|/|b| 140 // with a=q-s0, b=s1-s0 141 142 /* Intermediaries */ 143 const int dim=2; 144 int i; 145 IssmDouble a[dim], b[dim]; 146 IssmDouble norm_b; 147 148 for(i=0;i<dim;i++){ 149 a[i]=q[i]-s0[i]; 150 b[i]=s1[i]-s0[i]; 151 } 152 153 norm_b=0.; 154 for(i=0;i<dim;i++) 155 norm_b+=b[i]*b[i]; 156 norm_b=sqrt(norm_b); 157 _assert_(norm_b>0.); 158 159 return fabs(a[0]*b[1]-a[1]*b[0])/norm_b; 160 }/*}}}*/ 161 -
issm/trunk-jpl/src/c/analyses/LsfReinitializationAnalysis.h
r17305 r17307 29 29 void InputUpdateFromSolution(IssmDouble* solution,Element* element); 30 30 void UpdateConstraints(FemModel* femmodel); 31 32 /* Other */ 33 void SetDistanceOnIntersectedElements(FemModel* femmodel); 34 void SetDistanceToZeroLevelsetElement(Vector<IssmDouble>* vec_dist, Element* element); 35 IssmDouble GetDistanceToStraight(IssmDouble* q, IssmDouble* s0, IssmDouble* s1); 31 36 }; 32 37 #endif
Note:
See TracChangeset
for help on using the changeset viewer.