Changeset 18293
- Timestamp:
- 07/28/14 09:18:47 (11 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
r18286 r18293 8 8 9 9 //#define FSANALYTICAL 12 10 //#define LATERALFRICTION 1 10 11 11 12 /*Model processing*/ … … 223 224 iomodel->FetchDataToInput(elements,LoadingforceXEnum); 224 225 iomodel->FetchDataToInput(elements,LoadingforceYEnum); 226 #ifdef LATERALFRICTION 227 iomodel->FetchDataToInput(elements,MeshVertexonboundaryEnum); 228 #endif 225 229 if(isdamage)iomodel->FetchDataToInput(elements,DamageDEnum); 226 230 … … 1218 1222 ElementMatrix* Ke1=CreateKMatrixSSAViscous(basalelement); 1219 1223 ElementMatrix* Ke2=CreateKMatrixSSAFriction(basalelement); 1224 #ifdef LATERALFRICTION 1225 ElementMatrix* Ke3=CreateKMatrixSSALateralFriction(basalelement); 1226 ElementMatrix* Ke =new ElementMatrix(Ke1,Ke2,Ke3); 1227 delete Ke3; 1228 #else 1220 1229 ElementMatrix* Ke =new ElementMatrix(Ke1,Ke2); 1230 #endif 1221 1231 1222 1232 /*clean-up and return*/ … … 1306 1316 delete friction; 1307 1317 xDelete<IssmDouble>(xyz_list); 1318 xDelete<IssmDouble>(B); 1319 xDelete<IssmDouble>(D); 1320 return Ke; 1321 }/*}}}*/ 1322 ElementMatrix* StressbalanceAnalysis::CreateKMatrixSSALateralFriction(Element* element){/*{{{*/ 1323 1324 /*Return if element is inactive*/ 1325 if(!element->IsIceInElement()) return NULL; 1326 1327 /*If no boundary, return NULL*/ 1328 if(!element->IsFaceOnBoundary()) return NULL; 1329 1330 /*Intermediaries*/ 1331 IssmDouble alpha2; 1332 IssmDouble Jdet; 1333 int domaintype; 1334 IssmDouble icefront; 1335 IssmDouble *xyz_list = NULL; 1336 IssmDouble *xyz_list_boundary = NULL; 1337 1338 /*Get problem dimension*/ 1339 element->FindParam(&domaintype,DomainTypeEnum); 1340 if(domaintype==Domain2DverticalEnum) return NULL; //not supported yet 1341 1342 /*Fetch number of nodes and dof for this finite element*/ 1343 int dim = 2; 1344 int numnodes = element->GetNumberOfNodes(); 1345 int numdof = numnodes*dim; 1346 1347 /*Initialize Element matrix and vectors*/ 1348 ElementMatrix* Ke = element->NewElementMatrix(SSAApproximationEnum); 1349 IssmDouble* B = xNew<IssmDouble>(dim*numdof); 1350 IssmDouble* D = xNewZeroInit<IssmDouble>(dim*dim); 1351 1352 /*Retrieve all inputs and parameters*/ 1353 element->GetVerticesCoordinates(&xyz_list); 1354 element->GetLevelCoordinates(&xyz_list_boundary,xyz_list,MeshVertexonboundaryEnum,1.); 1355 Input* icelevelset_input = element->GetInput(MaskIceLevelsetEnum); _assert_(icelevelset_input); 1356 1357 /* Start looping on the number of gaussian points: */ 1358 Gauss* gauss=element->NewGauss(xyz_list,xyz_list_boundary,3); 1359 for(int ig=gauss->begin();ig<gauss->end();ig++){ 1360 gauss->GaussPoint(ig); 1361 1362 this->GetBSSAFriction(B,element,dim,xyz_list,gauss); 1363 element->JacobianDeterminantSurface(&Jdet,xyz_list_boundary,gauss); 1364 icelevelset_input->GetInputValue(&icefront, gauss); 1365 if(icefront==0.) 1366 alpha2=0.; 1367 else 1368 alpha2=2.e+12; 1369 for(int i=0;i<dim;i++) D[i*dim+i]=alpha2*gauss->weight*Jdet; 1370 1371 TripleMultiply(B,dim,numdof,1, 1372 D,dim,dim,0, 1373 B,dim,numdof,0, 1374 &Ke->values[0],1); 1375 } 1376 1377 /*Transform Coordinate System*/ 1378 if(dim==2) element->TransformStiffnessMatrixCoord(Ke,XYEnum); 1379 1380 /*Clean up and return*/ 1381 delete gauss; 1382 xDelete<IssmDouble>(xyz_list); 1383 xDelete<IssmDouble>(xyz_list_boundary); 1308 1384 xDelete<IssmDouble>(B); 1309 1385 xDelete<IssmDouble>(D); -
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h
r18284 r18293 37 37 ElementMatrix* CreateKMatrixSSAViscous(Element* element); 38 38 ElementMatrix* CreateKMatrixSSAFriction(Element* element); 39 ElementMatrix* CreateKMatrixSSALateralFriction(Element* element); 39 40 ElementVector* CreatePVectorSSA(Element* element); 40 41 ElementVector* CreatePVectorSSADrivingStress(Element* element); -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r18283 r18293 256 256 virtual void ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum)=0; 257 257 virtual void GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum)=0; 258 virtual void GetLevelCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum,IssmDouble level)=0; 258 259 259 260 virtual void AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part)=0; -
issm/trunk-jpl/src/c/classes/Elements/Penta.h
r18283 r18293 92 92 void ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum); 93 93 void GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum){_error_("not implemented yet");}; 94 void GetLevelCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum,IssmDouble level){_error_("not implemented yet");}; 94 95 void PositiveDegreeDay(IssmDouble* pdds,IssmDouble* pds,IssmDouble signorm); 95 96 void ReduceMatrices(ElementMatrix* Ke,ElementVector* pe); -
issm/trunk-jpl/src/c/classes/Elements/Seg.h
r18283 r18293 123 123 bool IsZeroLevelset(int levelset_enum){_error_("not implemented");}; 124 124 bool IsIcefront(void); 125 bool IsFaceOnBoundary(void){_error_("not implemented yet");};125 bool IsFaceOnBoundary(void){_error_("not implemented yet");}; 126 126 void ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum){_error_("not implemented");}; 127 127 void GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum); 128 void GetLevelCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum,IssmDouble level){_error_("not implemented");}; 128 129 129 130 void GetSolutionFromInputsOneDof(Vector<IssmDouble>* solution,int enum_type){_error_("not implemented yet");}; -
issm/trunk-jpl/src/c/classes/Elements/Tetra.h
r18283 r18293 128 128 bool IsZeroLevelset(int levelset_enum){_error_("not implemented");}; 129 129 bool IsIcefront(void); 130 bool IsFaceOnBoundary(void){_error_("not implemented yet");};130 bool IsFaceOnBoundary(void){_error_("not implemented yet");}; 131 131 void ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum); 132 132 void GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum){_error_("not implemented yet");}; 133 void GetLevelCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum,IssmDouble level){_error_("not implemented yet");}; 133 134 void GetSolutionFromInputsOneDof(Vector<IssmDouble>* solution,int enum_type){_error_("not implemented yet");}; 134 135 void InputDepthAverageAtBase(int enum_type,int average_enum_type){_error_("not implemented yet");}; -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r18283 r18293 846 846 for(i=0;i<NUMVERTICES;i++){ 847 847 if(levelset[i]>=0.){ 848 indicesfront[nrfrontnodes]=i; 849 nrfrontnodes++; 850 } 851 } 852 853 _assert_(nrfrontnodes==2); 854 855 /* arrange order of frontnodes such that they are oriented counterclockwise */ 856 if((NUMVERTICES+indicesfront[0]-indicesfront[1])%NUMVERTICES!=NUMVERTICES-1){ 857 int index=indicesfront[0]; 858 indicesfront[0]=indicesfront[1]; 859 indicesfront[1]=index; 860 } 861 862 IssmDouble* xyz_front = xNew<IssmDouble>(3*nrfrontnodes); 863 /* Return nodes */ 864 for(i=0;i<nrfrontnodes;i++){ 865 for(dir=0;dir<3;dir++){ 866 xyz_front[3*i+dir]=xyz_list[3*indicesfront[i]+dir]; 867 } 868 } 869 870 *pxyz_front=xyz_front; 871 872 xDelete<int>(indicesfront); 873 }/*}}}*/ 874 void Tria::GetLevelCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum,IssmDouble level){/*{{{*/ 875 876 /* Intermediaries */ 877 int i, dir,nrfrontnodes; 878 IssmDouble levelset[NUMVERTICES]; 879 880 /*Recover parameters and values*/ 881 GetInputListOnVertices(&levelset[0],levelsetenum); 882 883 int* indicesfront = xNew<int>(NUMVERTICES); 884 /* Get nodes where there is no ice */ 885 nrfrontnodes=0; 886 for(i=0;i<NUMVERTICES;i++){ 887 if(levelset[i]==level){ 848 888 indicesfront[nrfrontnodes]=i; 849 889 nrfrontnodes++; -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r18283 r18293 101 101 void Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement); 102 102 IssmDouble TimeAdapt(); 103 void ValueP1OnGauss(IssmDouble* pvalue,IssmDouble* values,Gauss* gauss);104 void ValueP1DerivativesOnGauss(IssmDouble* dvalue,IssmDouble* values,IssmDouble* xyz_list,Gauss* gauss);103 void ValueP1OnGauss(IssmDouble* pvalue,IssmDouble* values,Gauss* gauss); 104 void ValueP1DerivativesOnGauss(IssmDouble* dvalue,IssmDouble* values,IssmDouble* xyz_list,Gauss* gauss); 105 105 int VertexConnectivity(int vertexindex); 106 void VerticalSegmentIndices(int** pindices,int* pnumseg){_error_("not implemented yet");};106 void VerticalSegmentIndices(int** pindices,int* pnumseg){_error_("not implemented yet");}; 107 107 void ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum); 108 void GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum); 108 void GetIcefrontCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum); 109 void GetLevelCoordinates(IssmDouble** pxyz_front,IssmDouble* xyz_list,int levelsetenum,IssmDouble level); 109 110 bool IsZeroLevelset(int levelset_enum); 110 bool IsIcefront(void);111 bool IsFaceOnBoundary(void);111 bool IsIcefront(void); 112 bool IsFaceOnBoundary(void); 112 113 113 114 void AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part);
Note:
See TracChangeset
for help on using the changeset viewer.