Changeset 16838 for issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
- Timestamp:
- 11/20/13 12:09:18 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r16834 r16838 879 879 /*}}}*/ 880 880 /*FUNCTION Tria::GetAreaCoordinates{{{*/ 881 void Tria::GetAreaCoordinates(IssmDouble* area_coordinates,IssmDouble xyz_zero[3][3],IssmDouble xyz_list[3][3],int numpoints){881 void Tria::GetAreaCoordinates(IssmDouble* area_coordinates,IssmDouble* xyz_zero,IssmDouble* xyz_list,int numpoints){ 882 882 /*Computeportion of the element that is grounded*/ 883 883 … … 891 891 for(j=0;j<3;j++){ 892 892 for(k=0;k<3;k++){ 893 xyz_bis[j][k]=xyz_list[j ][k];893 xyz_bis[j][k]=xyz_list[j*3+k]; 894 894 } 895 895 } … … 898 898 for(k=0;k<3;k++){ 899 899 /*Change appropriate line*/ 900 xyz_bis[j][k]=xyz_zero[i ][k];900 xyz_bis[j][k]=xyz_zero[i*3+k]; 901 901 } 902 902 … … 908 908 for(k=0;k<3;k++){ 909 909 /*Reinitialize xyz_list with original coordinates*/ 910 xyz_bis[j][k]=xyz_list[j ][k];910 xyz_bis[j][k]=xyz_list[j*3+k]; 911 911 } 912 912 } … … 1184 1184 } 1185 1185 /*}}}*/ 1186 /*FUNCTION Tria::GetZeroLevelsetCoordinates{{{*/ 1187 void Tria::GetZeroLevelsetCoordinates(IssmDouble* xyz_zero,IssmDouble xyz_list[3][3],int levelsetenum){ 1188 /*Computeportion of the element that is grounded*/ 1186 /*FUNCTION Tria::ZeroLevelsetCoordinates{{{*/ 1187 void Tria::ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum){ 1189 1188 1190 1189 int normal_orientation=0; … … 1193 1192 1194 1193 /*Recover parameters and values*/ 1194 IssmDouble* xyz_zero = xNew<IssmDouble>(2*3); 1195 1195 GetInputListOnVertices(&levelset[0],levelsetenum); 1196 1196 … … 1202 1202 if(levelset[2]>0.) normal_orientation=1; 1203 1203 /*New point 1*/ 1204 xyz_zero[3*normal_orientation+0]=xyz_list[2 ][0]+s1*(xyz_list[1][0]-xyz_list[2][0]);1205 xyz_zero[3*normal_orientation+1]=xyz_list[2 ][1]+s1*(xyz_list[1][1]-xyz_list[2][1]);1206 xyz_zero[3*normal_orientation+2]=xyz_list[2 ][2]+s1*(xyz_list[1][2]-xyz_list[2][2]);1204 xyz_zero[3*normal_orientation+0]=xyz_list[2*3+0]+s1*(xyz_list[1*3+0]-xyz_list[2*3+0]); 1205 xyz_zero[3*normal_orientation+1]=xyz_list[2*3+1]+s1*(xyz_list[1*3+1]-xyz_list[2*3+1]); 1206 xyz_zero[3*normal_orientation+2]=xyz_list[2*3+2]+s1*(xyz_list[1*3+2]-xyz_list[2*3+2]); 1207 1207 1208 1208 /*New point 0*/ 1209 xyz_zero[3*(1-normal_orientation)+0]=xyz_list[2 ][0]+s2*(xyz_list[0][0]-xyz_list[2][0]);1210 xyz_zero[3*(1-normal_orientation)+1]=xyz_list[2 ][1]+s2*(xyz_list[0][1]-xyz_list[2][1]);1211 xyz_zero[3*(1-normal_orientation)+2]=xyz_list[2 ][2]+s2*(xyz_list[0][2]-xyz_list[2][2]);1209 xyz_zero[3*(1-normal_orientation)+0]=xyz_list[2*3+0]+s2*(xyz_list[0*3+0]-xyz_list[2*3+0]); 1210 xyz_zero[3*(1-normal_orientation)+1]=xyz_list[2*3+1]+s2*(xyz_list[0*3+1]-xyz_list[2*3+1]); 1211 xyz_zero[3*(1-normal_orientation)+2]=xyz_list[2*3+2]+s2*(xyz_list[0*3+2]-xyz_list[2*3+2]); 1212 1212 } 1213 1213 else if(levelset[1]*levelset[2]>0.){ //Nodes 1 and 2 are similar, so points must be found on segment 0-1 and 0-2 … … 1218 1218 if(levelset[0]>0.) normal_orientation=1; 1219 1219 /*New point 1*/ 1220 xyz_zero[3*normal_orientation+0]=xyz_list[0 ][0]+s1*(xyz_list[2][0]-xyz_list[0][0]);1221 xyz_zero[3*normal_orientation+1]=xyz_list[0 ][1]+s1*(xyz_list[2][1]-xyz_list[0][1]);1222 xyz_zero[3*normal_orientation+2]=xyz_list[0 ][2]+s1*(xyz_list[2][2]-xyz_list[0][2]);1220 xyz_zero[3*normal_orientation+0]=xyz_list[0*3+0]+s1*(xyz_list[2*3+0]-xyz_list[0*3+0]); 1221 xyz_zero[3*normal_orientation+1]=xyz_list[0*3+1]+s1*(xyz_list[2*3+1]-xyz_list[0*3+1]); 1222 xyz_zero[3*normal_orientation+2]=xyz_list[0*3+2]+s1*(xyz_list[2*3+2]-xyz_list[0*3+2]); 1223 1223 1224 1224 /*New point 2*/ 1225 xyz_zero[3*(1-normal_orientation)+0]=xyz_list[0 ][0]+s2*(xyz_list[1][0]-xyz_list[0][0]);1226 xyz_zero[3*(1-normal_orientation)+1]=xyz_list[0 ][1]+s2*(xyz_list[1][1]-xyz_list[0][1]);1227 xyz_zero[3*(1-normal_orientation)+2]=xyz_list[0 ][2]+s2*(xyz_list[1][2]-xyz_list[0][2]);1225 xyz_zero[3*(1-normal_orientation)+0]=xyz_list[0*3+0]+s2*(xyz_list[1*3+0]-xyz_list[0*3+0]); 1226 xyz_zero[3*(1-normal_orientation)+1]=xyz_list[0*3+1]+s2*(xyz_list[1*3+1]-xyz_list[0*3+1]); 1227 xyz_zero[3*(1-normal_orientation)+2]=xyz_list[0*3+2]+s2*(xyz_list[1*3+2]-xyz_list[0*3+2]); 1228 1228 } 1229 1229 else if(levelset[0]*levelset[2]>0.){ //Nodes 0 and 2 are similar, so points must be found on segment 1-0 and 1-2 … … 1234 1234 if(levelset[1]>0.) normal_orientation=1; 1235 1235 /*New point 0*/ 1236 xyz_zero[3*normal_orientation+0]=xyz_list[1 ][0]+s1*(xyz_list[0][0]-xyz_list[1][0]);1237 xyz_zero[3*normal_orientation+1]=xyz_list[1 ][1]+s1*(xyz_list[0][1]-xyz_list[1][1]);1238 xyz_zero[3*normal_orientation+2]=xyz_list[1 ][2]+s1*(xyz_list[0][2]-xyz_list[1][2]);1236 xyz_zero[3*normal_orientation+0]=xyz_list[1*3+0]+s1*(xyz_list[0*3+0]-xyz_list[1*3+0]); 1237 xyz_zero[3*normal_orientation+1]=xyz_list[1*3+1]+s1*(xyz_list[0*3+1]-xyz_list[1*3+1]); 1238 xyz_zero[3*normal_orientation+2]=xyz_list[1*3+2]+s1*(xyz_list[0*3+2]-xyz_list[1*3+2]); 1239 1239 1240 1240 /*New point 2*/ 1241 xyz_zero[3*(1-normal_orientation)+0]=xyz_list[1 ][0]+s2*(xyz_list[2][0]-xyz_list[1][0]);1242 xyz_zero[3*(1-normal_orientation)+1]=xyz_list[1 ][1]+s2*(xyz_list[2][1]-xyz_list[1][1]);1243 xyz_zero[3*(1-normal_orientation)+2]=xyz_list[1 ][2]+s2*(xyz_list[2][2]-xyz_list[1][2]);1241 xyz_zero[3*(1-normal_orientation)+0]=xyz_list[1*3+0]+s2*(xyz_list[2*3+0]-xyz_list[1*3+0]); 1242 xyz_zero[3*(1-normal_orientation)+1]=xyz_list[1*3+1]+s2*(xyz_list[2*3+1]-xyz_list[1*3+1]); 1243 xyz_zero[3*(1-normal_orientation)+2]=xyz_list[1*3+2]+s2*(xyz_list[2*3+2]-xyz_list[1*3+2]); 1244 1244 } 1245 1245 else if(levelset[0]==0. && levelset[1]==0.){ //front is on point 0 and 1 1246 xyz_zero[3*0+0]=xyz_list[0 ][0];1247 xyz_zero[3*0+1]=xyz_list[0 ][1];1248 xyz_zero[3*0+2]=xyz_list[0 ][2];1246 xyz_zero[3*0+0]=xyz_list[0*3+0]; 1247 xyz_zero[3*0+1]=xyz_list[0*3+1]; 1248 xyz_zero[3*0+2]=xyz_list[0*3+2]; 1249 1249 1250 1250 /*New point 2*/ 1251 xyz_zero[3*1+0]=xyz_list[1 ][0];1252 xyz_zero[3*1+1]=xyz_list[1 ][1];1253 xyz_zero[3*1+2]=xyz_list[1 ][2];1251 xyz_zero[3*1+0]=xyz_list[1*3+0]; 1252 xyz_zero[3*1+1]=xyz_list[1*3+1]; 1253 xyz_zero[3*1+2]=xyz_list[1*3+2]; 1254 1254 } 1255 1255 else if(levelset[0]==0. && levelset[2]==0.){ //front is on point 0 and 1 1256 xyz_zero[3*0+0]=xyz_list[2 ][0];1257 xyz_zero[3*0+1]=xyz_list[2 ][1];1258 xyz_zero[3*0+2]=xyz_list[2 ][2];1256 xyz_zero[3*0+0]=xyz_list[2*3+0]; 1257 xyz_zero[3*0+1]=xyz_list[2*3+1]; 1258 xyz_zero[3*0+2]=xyz_list[2*3+2]; 1259 1259 1260 1260 /*New point 2*/ 1261 xyz_zero[3*1+0]=xyz_list[0 ][0];1262 xyz_zero[3*1+1]=xyz_list[0 ][1];1263 xyz_zero[3*1+2]=xyz_list[0 ][2];1261 xyz_zero[3*1+0]=xyz_list[0*3+0]; 1262 xyz_zero[3*1+1]=xyz_list[0*3+1]; 1263 xyz_zero[3*1+2]=xyz_list[0*3+2]; 1264 1264 } 1265 1265 else if(levelset[1]==0. && levelset[2]==0.){ //front is on point 0 and 1 1266 xyz_zero[3*0+0]=xyz_list[1 ][0];1267 xyz_zero[3*0+1]=xyz_list[1 ][1];1268 xyz_zero[3*0+2]=xyz_list[1 ][2];1266 xyz_zero[3*0+0]=xyz_list[1*3+0]; 1267 xyz_zero[3*0+1]=xyz_list[1*3+1]; 1268 xyz_zero[3*0+2]=xyz_list[1*3+2]; 1269 1269 1270 1270 /*New point 2*/ 1271 xyz_zero[3*1+0]=xyz_list[2 ][0];1272 xyz_zero[3*1+1]=xyz_list[2 ][1];1273 xyz_zero[3*1+2]=xyz_list[2 ][2];1271 xyz_zero[3*1+0]=xyz_list[2*3+0]; 1272 xyz_zero[3*1+1]=xyz_list[2*3+1]; 1273 xyz_zero[3*1+2]=xyz_list[2*3+2]; 1274 1274 } 1275 1275 else _error_("Case not covered"); 1276 1277 /*Assign output pointer*/ 1278 *pxyz_zero= xyz_zero; 1276 1279 } 1277 1280 /*}}}*/ … … 2014 2017 } 2015 2018 /*}}}*/ 2019 /*FUNCTION Tria::JacobianDeterminantSurface{{{*/ 2020 void Tria::JacobianDeterminantSurface(IssmDouble* pJdet,IssmDouble* xyz_list,Gauss* gauss){ 2021 2022 _assert_(gauss->Enum()==GaussTriaEnum); 2023 this->GetSegmentJacobianDeterminant(pJdet,xyz_list,(GaussTria*)gauss); 2024 2025 } 2026 /*}}}*/ 2016 2027 /*FUNCTION Tria::HasEdgeOnBed {{{*/ 2017 2028 bool Tria::HasEdgeOnBed(){ … … 2207 2218 Gauss* Tria::NewGauss(int order){ 2208 2219 return new GaussTria(order); 2220 } 2221 /*}}}*/ 2222 /*FUNCTION Tria::NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order){{{*/ 2223 Gauss* Tria::NewGauss(IssmDouble* xyz_list, IssmDouble* xyz_list_front,int order){ 2224 2225 IssmDouble area_coordinates[2][3]; 2226 2227 GetAreaCoordinates(&area_coordinates[0][0],xyz_list_front,xyz_list,2); 2228 2229 return new GaussTria(area_coordinates,order); 2209 2230 } 2210 2231 /*}}}*/ … … 3930 3951 IssmDouble Jdet,water_pressure,air_pressure,pressure; 3931 3952 IssmDouble xyz_list[NUMVERTICES][3]; 3932 IssmDouble xyz_list_front[2][3];3953 IssmDouble* xyz_list_front = NULL; 3933 3954 IssmDouble area_coordinates[2][3]; 3934 3955 IssmDouble normal[2]; … … 3953 3974 rho_ice = matpar->GetRhoIce(); 3954 3975 gravity = matpar->GetG(); 3955 GetZeroLevelsetCoordinates(&xyz_list_front[0][0],xyz_list,MaskIceLevelsetEnum);3956 GetAreaCoordinates(&area_coordinates[0][0],xyz_list_front, xyz_list,2);3957 NormalBase(&normal[0], &xyz_list_front[0][0]);3976 ZeroLevelsetCoordinates(&xyz_list_front,&xyz_list[0][0],MaskIceLevelsetEnum); 3977 GetAreaCoordinates(&area_coordinates[0][0],xyz_list_front,&xyz_list[0][0],2); 3978 NormalBase(&normal[0],xyz_list_front); 3958 3979 3959 3980 /*Start looping on Gaussian points*/ 3960 IssmDouble ymax=max(xyz_list_front[0 ][1],xyz_list_front[1][1]);3961 IssmDouble ymin=min(xyz_list_front[0 ][1],xyz_list_front[1][1]);3981 IssmDouble ymax=max(xyz_list_front[0*3+1],xyz_list_front[1*3+1]); 3982 IssmDouble ymin=min(xyz_list_front[0*3+1],xyz_list_front[1*3+1]); 3962 3983 if(ymax>0. && ymin<0.) gauss=new GaussTria(area_coordinates,30); //refined in vertical because of the sea level discontinuity 3963 3984 else gauss=new GaussTria(area_coordinates,3); … … 3968 3989 y_g=GetYcoord(gauss); 3969 3990 GetNodalFunctionsVelocity(vbasis,gauss); 3970 GetSegmentJacobianDeterminant(&Jdet, &xyz_list_front[0][0],gauss);3991 GetSegmentJacobianDeterminant(&Jdet,xyz_list_front,gauss); 3971 3992 3972 3993 water_pressure = rho_water*gravity*min(0.,y_g); //0 if the gaussian point is above water level … … 3980 4001 } 3981 4002 3982 3983 4003 /*Transform coordinate system*/ 3984 4004 ::TransformLoadVectorCoord(pe,nodes,(vnumnodes+pnumnodes),cs_list); … … 3986 4006 /*Clean up and return*/ 3987 4007 xDelete<int>(cs_list); 4008 xDelete<IssmDouble>(xyz_list_front); 3988 4009 xDelete<IssmDouble>(vbasis); 3989 4010 delete gauss; … … 4201 4222 IssmDouble surface_under_water,base_under_water,pressure; 4202 4223 IssmDouble xyz_list[NUMVERTICES][3]; 4203 IssmDouble xyz_list_front[2][3];4224 IssmDouble *xyz_list_front = NULL; 4204 4225 IssmDouble area_coordinates[2][3]; 4205 4226 IssmDouble normal[2]; … … 4219 4240 rho_ice = matpar->GetRhoIce(); 4220 4241 gravity = matpar->GetG(); 4221 GetZeroLevelsetCoordinates(&xyz_list_front[0][0],xyz_list,MaskIceLevelsetEnum);4222 GetAreaCoordinates(&area_coordinates[0][0],xyz_list_front, xyz_list,2);4223 NormalBase(&normal[0], &xyz_list_front[0][0]);4242 ZeroLevelsetCoordinates(&xyz_list_front,&xyz_list[0][0],MaskIceLevelsetEnum); 4243 GetAreaCoordinates(&area_coordinates[0][0],xyz_list_front,&xyz_list[0][0],2); 4244 NormalBase(&normal[0],xyz_list_front); 4224 4245 4225 4246 /*Start looping on Gaussian points*/ … … 4230 4251 thickness_input->GetInputValue(&thickness,gauss); 4231 4252 bed_input->GetInputValue(&bed,gauss); 4232 GetSegmentJacobianDeterminant(&Jdet, &xyz_list_front[0][0],gauss);4253 GetSegmentJacobianDeterminant(&Jdet,xyz_list_front,gauss); 4233 4254 GetNodalFunctions(basis,gauss); 4234 4255 … … 4251 4272 /*Clean up and return*/ 4252 4273 xDelete<IssmDouble>(basis); 4274 xDelete<IssmDouble>(xyz_list_front); 4253 4275 delete gauss; 4254 4276 return pe;
Note:
See TracChangeset
for help on using the changeset viewer.