Changeset 17427
- Timestamp:
- 03/12/14 16:10:59 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp ¶
r17371 r17427 29 29 } 30 30 } 31 31 32 32 iomodel->FetchDataToInput(elements,MaskIceLevelsetEnum); 33 33 iomodel->FetchDataToInput(elements,VxEnum); … … 35 35 iomodel->FetchDataToInput(elements,MasstransportCalvingrateEnum); 36 36 37 if(iomodel->meshtype==Mesh3DEnum){ 38 iomodel->FetchDataToInput(elements,MeshElementonbedEnum); 39 } 37 40 } 38 41 /*}}}*/ 39 42 void LevelsetAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/ 40 43 int finiteelement=P1Enum; 44 if(iomodel->meshtype!=Mesh2DhorizontalEnum) iomodel->FetchData(2,MeshVertexonbedEnum,MeshVertexonsurfaceEnum); 41 45 ::CreateNodes(nodes,iomodel,LevelsetAnalysisEnum,finiteelement); 46 iomodel->DeleteData(2,MeshVertexonbedEnum,MeshVertexonsurfaceEnum); 42 47 } 43 48 /*}}}*/ … … 92 97 ElementMatrix* LevelsetAnalysis::CreateKMatrix(Element* element){/*{{{*/ 93 98 99 if(!element->IsOnBed()) return NULL; 100 Element* basalelement = element->SpawnBasalElement(); 101 94 102 /*Intermediaries */ 95 int dim = 2; // solve for LSF in horizontal plane only103 int dim, meshtype; // solve for LSF in horizontal plane only 96 104 int i, row, col; 97 105 IssmDouble kappa; … … 102 110 IssmDouble* xyz_list = NULL; 103 111 112 /*Get problem dimension*/ 113 basalelement->FindParam(&meshtype,MeshTypeEnum); 114 switch(meshtype){ 115 case Mesh2DverticalEnum: dim = 1; break; 116 case Mesh2DhorizontalEnum: dim = 2; break; 117 case Mesh3DEnum: dim = 2; break; 118 default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet"); 119 } 120 104 121 /*Fetch number of nodes and dof for this finite element*/ 105 int numnodes = element->GetNumberOfNodes();122 int numnodes = basalelement->GetNumberOfNodes(); 106 123 107 124 /*Initialize Element vector and other vectors*/ 108 ElementMatrix* Ke = element->NewElementMatrix();125 ElementMatrix* Ke = basalelement->NewElementMatrix(); 109 126 IssmDouble* basis = xNew<IssmDouble>(numnodes); 110 127 IssmDouble* B = xNew<IssmDouble>(dim*numnodes); … … 117 134 118 135 /*Retrieve all inputs and parameters*/ 119 element->GetVerticesCoordinates(&xyz_list); 120 element->FindParam(&dt,TimesteppingTimeStepEnum); 121 Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input); 122 Input* vy_input = element->GetInput(VyEnum); _assert_(vy_input); 123 Input* lsf_slopex_input = element->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input); 124 Input* lsf_slopey_input = element->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input); 125 Input* calvingrate_input = element->GetInput(MasstransportCalvingrateEnum); _assert_(calvingrate_input); 136 basalelement->GetVerticesCoordinates(&xyz_list); 137 basalelement->FindParam(&dt,TimesteppingTimeStepEnum); 138 Input* vx_input = NULL; 139 Input* vy_input = NULL; 140 Input* lsf_slopex_input = basalelement->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input); 141 Input* lsf_slopey_input = basalelement->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input); 142 Input* calvingrate_input = basalelement->GetInput(MasstransportCalvingrateEnum); _assert_(calvingrate_input); 143 144 if(meshtype==Mesh2DhorizontalEnum){ 145 vx_input=basalelement->GetInput(VxEnum); _assert_(vx_input); 146 vy_input=basalelement->GetInput(VyEnum); _assert_(vy_input); 147 } 148 else{ 149 if(dim==1){ 150 vx_input=basalelement->GetInput(VxEnum); _assert_(vx_input); 151 } 152 if(dim==2){ 153 vx_input=basalelement->GetInput(VxAverageEnum); _assert_(vx_input); 154 vy_input=basalelement->GetInput(VyAverageEnum); _assert_(vy_input); 155 } 156 } 126 157 127 158 /* Start looping on the number of gaussian points: */ 128 Gauss* gauss= element->NewGauss(2);159 Gauss* gauss=basalelement->NewGauss(2); 129 160 for(int ig=gauss->begin();ig<gauss->end();ig++){ 130 161 gauss->GaussPoint(ig); 131 162 132 element->JacobianDeterminant(&Jdet,xyz_list,gauss);163 basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss); 133 164 D_scalar=gauss->weight*Jdet; 134 165 135 166 /* Transient */ 136 167 if(dt!=0.){ 137 element->NodalFunctions(basis,gauss);168 basalelement->NodalFunctions(basis,gauss); 138 169 TripleMultiply(basis,numnodes,1,0, 139 170 &D_scalar,1,1,0, … … 144 175 145 176 /* Advection */ 146 GetB(B, element,xyz_list,gauss);147 GetBprime(Bprime, element,xyz_list,gauss);177 GetB(B,basalelement,xyz_list,gauss); 178 GetBprime(Bprime,basalelement,xyz_list,gauss); 148 179 vx_input->GetInputValue(&v[0],gauss); // in 3D case, add mesh velocity 149 180 vy_input->GetInputValue(&v[1],gauss); … … 186 217 case 1: 187 218 /* Artificial Diffusion */ 188 element->ElementSizes(&hx,&hy,&hz);219 basalelement->ElementSizes(&hx,&hy,&hz); 189 220 h=sqrt( pow(hx*v[0]/vel,2) + pow(hy*v[1]/vel,2) ); 190 221 kappa=h*vel/2.; … … 203 234 case 2: 204 235 /* Streamline Upwinding */ 205 element->ElementSizes(&hx,&hy,&hz);236 basalelement->ElementSizes(&hx,&hy,&hz); 206 237 h=sqrt( pow(hx*v[0]/vel,2) + pow(hy*v[1]/vel,2) ); 207 238 for(row=0;row<dim;row++) … … 229 260 xDelete<IssmDouble>(c); 230 261 xDelete<IssmDouble>(dlsf); 262 if(meshtype!=Mesh2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 231 263 delete gauss; 232 264 return Ke; 233 265 }/*}}}*/ 234 266 ElementVector* LevelsetAnalysis::CreatePVector(Element* element){/*{{{*/ 267 268 if(!element->IsOnBed()) return NULL; 269 Element* basalelement = element->SpawnBasalElement(); 235 270 236 271 /*Intermediaries */ 237 const int dim = 2; 238 int i, ig, k; 272 int i, ig, meshtype; 239 273 IssmDouble Jdet,dt; 240 274 IssmDouble lsf; … … 242 276 243 277 /*Fetch number of nodes and dof for this finite element*/ 244 int numnodes = element->GetNumberOfNodes();278 int numnodes = basalelement->GetNumberOfNodes(); 245 279 246 280 /*Initialize Element vector*/ 247 ElementVector* pe = element->NewElementVector();248 element->FindParam(&dt,TimesteppingTimeStepEnum);281 ElementVector* pe = basalelement->NewElementVector(); 282 basalelement->FindParam(&dt,TimesteppingTimeStepEnum); 249 283 250 284 if(dt!=0.){ … … 253 287 254 288 /*Retrieve all inputs and parameters*/ 255 element->GetVerticesCoordinates(&xyz_list);256 Input* levelset_input = element->GetInput(MaskIceLevelsetEnum); _assert_(levelset_input);289 basalelement->GetVerticesCoordinates(&xyz_list); 290 Input* levelset_input = basalelement->GetInput(MaskIceLevelsetEnum); _assert_(levelset_input); 257 291 258 292 /* Start looping on the number of gaussian points: */ 259 Gauss* gauss= element->NewGauss(2);293 Gauss* gauss=basalelement->NewGauss(2); 260 294 for(ig=gauss->begin();ig<gauss->end();ig++){ 261 295 gauss->GaussPoint(ig); 262 296 263 element->JacobianDeterminant(&Jdet,xyz_list,gauss);264 element->NodalFunctions(basis,gauss);297 basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss); 298 basalelement->NodalFunctions(basis,gauss); 265 299 266 300 /* old function value */ … … 277 311 for(i=0;i<numnodes;i++) 278 312 pe->values[i]=0.; 313 if(meshtype!=Mesh2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 279 314 return pe; 280 315 }/*}}}*/
Note:
See TracChangeset
for help on using the changeset viewer.