Changeset 18958
- Timestamp:
- 12/12/14 01:01:37 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r18957 r18958 1275 1275 } 1276 1276 break; 1277 case 2: // two vertices have ice: get area of quadrangle1277 case 2: // two vertices have ice: fraction is computed from first ice vertex to last in CCW fashion 1278 1278 for(i=0;i<2;i++){ 1279 1279 fraction[i]=(level-lsf[indices[i]])/(lsf[indices[numiceverts]]-lsf[indices[i]]); … … 3197 3197 /*}}}*/ 3198 3198 void Tria::ZeroLevelsetCoordinates(IssmDouble** pxyz_zero,IssmDouble* xyz_list,int levelsetenum){/*{{{*/ 3199 3200 int normal_orientation=0; 3201 IssmDouble s1,s2; 3202 IssmDouble levelset[NUMVERTICES]; 3203 3204 /*Recover parameters and values*/ 3205 IssmDouble* xyz_zero = xNew<IssmDouble>(2*3); 3206 GetInputListOnVertices(&levelset[0],levelsetenum); 3207 3208 if(levelset[0]*levelset[1]>0.){ //Nodes 0 and 1 are similar, so points must be found on segment 0-2 and 1-2 3209 /*Portion of the segments*/ 3210 s1=levelset[2]/(levelset[2]-levelset[1]); 3211 s2=levelset[2]/(levelset[2]-levelset[0]); 3212 3213 if(levelset[2]<0.) normal_orientation=1; //orientation of quadrangle depending on distribution of levelsetfunction 3214 /*New point 1*/ 3215 xyz_zero[3*normal_orientation+0]=xyz_list[2*3+0]+s1*(xyz_list[1*3+0]-xyz_list[2*3+0]); 3216 xyz_zero[3*normal_orientation+1]=xyz_list[2*3+1]+s1*(xyz_list[1*3+1]-xyz_list[2*3+1]); 3217 xyz_zero[3*normal_orientation+2]=xyz_list[2*3+2]+s1*(xyz_list[1*3+2]-xyz_list[2*3+2]); 3218 3219 /*New point 0*/ 3220 xyz_zero[3*(1-normal_orientation)+0]=xyz_list[2*3+0]+s2*(xyz_list[0*3+0]-xyz_list[2*3+0]); 3221 xyz_zero[3*(1-normal_orientation)+1]=xyz_list[2*3+1]+s2*(xyz_list[0*3+1]-xyz_list[2*3+1]); 3222 xyz_zero[3*(1-normal_orientation)+2]=xyz_list[2*3+2]+s2*(xyz_list[0*3+2]-xyz_list[2*3+2]); 3223 } 3224 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 3225 /*Portion of the segments*/ 3226 s1=levelset[0]/(levelset[0]-levelset[2]); 3227 s2=levelset[0]/(levelset[0]-levelset[1]); 3228 3229 if(levelset[0]<0.) normal_orientation=1; 3230 /*New point 1*/ 3231 xyz_zero[3*normal_orientation+0]=xyz_list[0*3+0]+s1*(xyz_list[2*3+0]-xyz_list[0*3+0]); 3232 xyz_zero[3*normal_orientation+1]=xyz_list[0*3+1]+s1*(xyz_list[2*3+1]-xyz_list[0*3+1]); 3233 xyz_zero[3*normal_orientation+2]=xyz_list[0*3+2]+s1*(xyz_list[2*3+2]-xyz_list[0*3+2]); 3234 3235 /*New point 2*/ 3236 xyz_zero[3*(1-normal_orientation)+0]=xyz_list[0*3+0]+s2*(xyz_list[1*3+0]-xyz_list[0*3+0]); 3237 xyz_zero[3*(1-normal_orientation)+1]=xyz_list[0*3+1]+s2*(xyz_list[1*3+1]-xyz_list[0*3+1]); 3238 xyz_zero[3*(1-normal_orientation)+2]=xyz_list[0*3+2]+s2*(xyz_list[1*3+2]-xyz_list[0*3+2]); 3239 } 3240 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 3241 /*Portion of the segments*/ 3242 s1=levelset[1]/(levelset[1]-levelset[0]); 3243 s2=levelset[1]/(levelset[1]-levelset[2]); 3244 3245 if(levelset[1]<0.) normal_orientation=1; 3246 /*New point 0*/ 3247 xyz_zero[3*normal_orientation+0]=xyz_list[1*3+0]+s1*(xyz_list[0*3+0]-xyz_list[1*3+0]); 3248 xyz_zero[3*normal_orientation+1]=xyz_list[1*3+1]+s1*(xyz_list[0*3+1]-xyz_list[1*3+1]); 3249 xyz_zero[3*normal_orientation+2]=xyz_list[1*3+2]+s1*(xyz_list[0*3+2]-xyz_list[1*3+2]); 3250 3251 /*New point 2*/ 3252 xyz_zero[3*(1-normal_orientation)+0]=xyz_list[1*3+0]+s2*(xyz_list[2*3+0]-xyz_list[1*3+0]); 3253 xyz_zero[3*(1-normal_orientation)+1]=xyz_list[1*3+1]+s2*(xyz_list[2*3+1]-xyz_list[1*3+1]); 3254 xyz_zero[3*(1-normal_orientation)+2]=xyz_list[1*3+2]+s2*(xyz_list[2*3+2]-xyz_list[1*3+2]); 3255 } 3256 else if(levelset[0]==0. && levelset[1]==0.){ //front is on point 0 and 1 3257 xyz_zero[3*0+0]=xyz_list[0*3+0]; 3258 xyz_zero[3*0+1]=xyz_list[0*3+1]; 3259 xyz_zero[3*0+2]=xyz_list[0*3+2]; 3260 3261 /*New point 2*/ 3262 xyz_zero[3*1+0]=xyz_list[1*3+0]; 3263 xyz_zero[3*1+1]=xyz_list[1*3+1]; 3264 xyz_zero[3*1+2]=xyz_list[1*3+2]; 3265 } 3266 else if(levelset[0]==0. && levelset[2]==0.){ //front is on point 0 and 1 3267 xyz_zero[3*0+0]=xyz_list[2*3+0]; 3268 xyz_zero[3*0+1]=xyz_list[2*3+1]; 3269 xyz_zero[3*0+2]=xyz_list[2*3+2]; 3270 3271 /*New point 2*/ 3272 xyz_zero[3*1+0]=xyz_list[0*3+0]; 3273 xyz_zero[3*1+1]=xyz_list[0*3+1]; 3274 xyz_zero[3*1+2]=xyz_list[0*3+2]; 3275 } 3276 else if(levelset[1]==0. && levelset[2]==0.){ //front is on point 0 and 1 3277 xyz_zero[3*0+0]=xyz_list[1*3+0]; 3278 xyz_zero[3*0+1]=xyz_list[1*3+1]; 3279 xyz_zero[3*0+2]=xyz_list[1*3+2]; 3280 3281 /*New point 2*/ 3282 xyz_zero[3*1+0]=xyz_list[2*3+0]; 3283 xyz_zero[3*1+1]=xyz_list[2*3+1]; 3284 xyz_zero[3*1+2]=xyz_list[2*3+2]; 3285 } 3286 else _error_("Case not covered"); 3287 3288 /*Assign output pointer*/ 3289 *pxyz_zero= xyz_zero; 3199 /* Return coordinates where levelset intersects element edges. 3200 * Attention: In case that no intersection exists, NULL pointer is returned.*/ 3201 3202 /*Intermediaries*/ 3203 const int dim=3; 3204 int numiceverts; 3205 int i, n, e, counter; 3206 IssmDouble s[2]; 3207 int* indices=NULL; 3208 IssmDouble* xyz_zero=NULL; 3209 3210 this->GetLevelsetIntersection(&indices, &numiceverts, s, MaskIceLevelsetEnum, 0.); 3211 3212 //TODO: check if for 2 iceverts front segment is oriented in CCW way 3213 3214 if(numiceverts>0) xyz_zero=xNew<IssmDouble>(2*dim); 3215 if((numiceverts>0)&&(numiceverts<NUMVERTICES)){ 3216 counter=0; 3217 for(i=0;i<numiceverts;i++){ // iterate over ice vertices 3218 for(n=numiceverts;n<NUMVERTICES;n++){ // iterate over no-ice vertices 3219 for(e=0;e<dim;e++){ // spatial direction 3220 int ind_ice =dim*indices[i]+e; 3221 int ind_noice =dim*indices[n]+e; 3222 int ind =dim*counter+e; 3223 xyz_zero[ind]=xyz_list[ind_ice]+s[counter]*(xyz_list[ind_noice]-xyz_list[ind_ice]); 3224 } 3225 counter++; 3226 } 3227 } 3228 } 3229 else if(numiceverts==NUMVERTICES){ //NUMVERTICES ice vertices: calving front lies on element edge 3230 IssmDouble lsf[NUMVERTICES]; 3231 this->GetInputListOnVertices(&lsf[0],MaskIceLevelsetEnum); 3232 counter=0; 3233 for(i=0;i<NUMVERTICES;i++){ 3234 if(lsf[indices[i]]==0.){ 3235 for(e=0;e<dim;e++) xyz_zero[dim*counter+e]=xyz_list[dim*indices[i]+e]; 3236 counter++; 3237 } 3238 if(counter==2) break; 3239 } 3240 } 3241 _assert_(counter==2); 3242 3243 /*Cleanup & return*/ 3244 xDelete<int>(indices); 3245 *pxyz_zero=xyz_zero; 3290 3246 } 3291 3247 /*}}}*/
Note:
See TracChangeset
for help on using the changeset viewer.