Changeset 16074 for issm/trunk-jpl/src/c/classes/gauss/GaussPenta.cpp
- Timestamp:
- 09/04/13 15:39:30 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/classes/gauss/GaussPenta.cpp
r15720 r16074 236 236 xDelete<double>(seg_vert_coords); 237 237 xDelete<double>(seg_vert_weights); 238 } 239 /*}}}*/ 240 /*FUNCTION GaussPenta::GaussPenta(int index,double r1,double r2,int order) {{{*/ 241 GaussPenta::GaussPenta(int index,IssmDouble r1,IssmDouble r2,bool mainlyfloating,int order){ 242 243 /* 244 * ^ 245 * | 246 * 1|\ 247 * | \ 248 * | \ 249 * | \ 250 * | \ 251 * | \ 252 * | +(x,y) \ 253 * | \ 254 * +---------------+--> 255 * 0 1 256 * 257 */ 258 int ig; 259 IssmDouble x,y; 260 IssmDouble xy_list[3][2]; 261 262 if(mainlyfloating){ 263 /*Get gauss points*/ 264 GaussLegendreTria(&this->numgauss,&this->coords1,&this->coords2,&this->coords3,&this->weights,order); 265 266 xy_list[0][0]=0; xy_list[0][1]=0; 267 xy_list[1][0]=r1; xy_list[1][1]=0; 268 xy_list[2][0]=0; xy_list[2][1]=r2; 269 270 for(ig=0;ig<this->numgauss;ig++){ 271 x = this->coords1[ig]*xy_list[0][0] + this->coords2[ig]*xy_list[1][0] + this->coords3[ig]*xy_list[2][0]; 272 y = this->coords1[ig]*xy_list[0][1] + this->coords2[ig]*xy_list[1][1] + this->coords3[ig]*xy_list[2][1]; 273 274 switch(index){ 275 case 0: 276 this->coords1[ig] = 1.-x-y; 277 this->coords2[ig] = x; 278 this->coords3[ig] = y; 279 break; 280 case 1: 281 this->coords1[ig] = y; 282 this->coords2[ig] = 1.-x-y; 283 this->coords3[ig] = x; 284 break; 285 case 2: 286 this->coords1[ig] = x; 287 this->coords2[ig] = y; 288 this->coords3[ig] = 1.-x-y; 289 break; 290 default: 291 _error_("index "<<index<<" not supported yet"); 292 } 293 this->weights[ig] = this->weights[ig]*r1*r2; 294 this->coords4=xNew<IssmDouble>(numgauss); 295 for(ig=0;ig<numgauss;ig++) this->coords4[ig]=-1.0; 296 } 297 } 298 else{ 299 /*Double number of gauss points*/ 300 GaussPenta *gauss1 = NULL; 301 GaussPenta *gauss2 = NULL; 302 gauss1=new GaussPenta(0,1,2,order); 303 gauss2=new GaussPenta(0,1,2,order); 304 305 xy_list[0][0]=r1; xy_list[0][1]=0; 306 xy_list[1][0]=0; xy_list[1][1]=1.; 307 xy_list[2][0]=0; xy_list[2][1]=r2; 308 309 //gauss1->Echo(); 310 for(ig=0;ig<gauss1->numgauss;ig++){ 311 x = gauss1->coords1[ig]*xy_list[0][0] + gauss1->coords2[ig]*xy_list[1][0] + gauss1->coords3[ig]*xy_list[2][0]; 312 y = gauss1->coords1[ig]*xy_list[0][1] + gauss1->coords2[ig]*xy_list[1][1] + gauss1->coords3[ig]*xy_list[2][1]; 313 314 switch(index){ 315 case 0: 316 gauss1->coords1[ig] = 1.-x-y; 317 gauss1->coords2[ig] = x; 318 gauss1->coords3[ig] = y; 319 break; 320 case 1: 321 gauss1->coords1[ig] = y; 322 gauss1->coords2[ig] = 1.-x-y; 323 gauss1->coords3[ig] = x; 324 break; 325 case 2: 326 gauss1->coords1[ig] = x; 327 gauss1->coords2[ig] = y; 328 gauss1->coords3[ig] = 1.-x-y; 329 break; 330 default: 331 _error_("index "<<index<<" not supported yet"); 332 } 333 gauss1->weights[ig] = gauss1->weights[ig]*r1*(1-r2); 334 } 335 //gauss1->Echo(); 336 xy_list[0][0]=r1; xy_list[0][1]=0; 337 xy_list[1][0]=1.; xy_list[1][1]=0; 338 xy_list[2][0]=0; xy_list[2][1]=1.; 339 340 //gauss2->Echo(); 341 for(ig=0;ig<gauss2->numgauss;ig++){ 342 x = gauss2->coords1[ig]*xy_list[0][0] + gauss2->coords2[ig]*xy_list[1][0] + gauss2->coords3[ig]*xy_list[2][0]; 343 y = gauss2->coords1[ig]*xy_list[0][1] + gauss2->coords2[ig]*xy_list[1][1] + gauss2->coords3[ig]*xy_list[2][1]; 344 345 switch(index){ 346 case 0: 347 gauss2->coords1[ig] = 1.-x-y; 348 gauss2->coords2[ig] = x; 349 gauss2->coords3[ig] = y; 350 break; 351 case 1: 352 gauss2->coords1[ig] = y; 353 gauss2->coords2[ig] = 1.-x-y; 354 gauss2->coords3[ig] = x; 355 break; 356 case 2: 357 gauss2->coords1[ig] = x; 358 gauss2->coords2[ig] = y; 359 gauss2->coords3[ig] = 1.-x-y; 360 break; 361 default: 362 _error_("index "<<index<<" not supported yet"); 363 } 364 gauss2->weights[ig] = gauss2->weights[ig]*(1-r1); 365 } 366 367 this->numgauss = gauss1->numgauss + gauss2->numgauss; 368 this->coords1=xNew<IssmDouble>(this->numgauss); 369 this->coords2=xNew<IssmDouble>(this->numgauss); 370 this->coords3=xNew<IssmDouble>(this->numgauss); 371 this->coords4=xNew<IssmDouble>(this->numgauss); 372 this->weights=xNew<IssmDouble>(this->numgauss); 373 374 for(ig=0;ig<gauss1->numgauss;ig++){ // Add the first triangle gauss points 375 this->coords1[ig]=gauss1->coords1[ig]; 376 this->coords2[ig]=gauss1->coords2[ig]; 377 this->coords3[ig]=gauss1->coords3[ig]; 378 this->coords4[ig]=gauss1->coords4[ig]; 379 this->weights[ig]=gauss1->weights[ig]; 380 } 381 for(ig=0;ig<gauss2->numgauss;ig++){ // Add the second triangle gauss points 382 this->coords1[gauss1->numgauss+ig]=gauss2->coords1[ig]; 383 this->coords2[gauss1->numgauss+ig]=gauss2->coords2[ig]; 384 this->coords3[gauss1->numgauss+ig]=gauss2->coords3[ig]; 385 this->coords4[gauss1->numgauss+ig]=gauss2->coords4[ig]; 386 this->weights[gauss1->numgauss+ig]=gauss2->weights[ig]; 387 } 388 389 /*Delete gauss points*/ 390 delete gauss1; 391 delete gauss2; 392 } 393 394 /*Initialize static fields as undefined*/ 395 weight=UNDEF; 396 coord1=UNDEF; 397 coord2=UNDEF; 398 coord3=UNDEF; 399 coord4=UNDEF; 238 400 } 239 401 /*}}}*/
Note:
See TracChangeset
for help on using the changeset viewer.