Ignore:
Timestamp:
09/04/13 15:39:30 (12 years ago)
Author:
seroussi
Message:

CHG: changd gausspenta for subelement2 migration

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/classes/gauss/GaussPenta.cpp

    r15720 r16074  
    236236        xDelete<double>(seg_vert_coords);
    237237        xDelete<double>(seg_vert_weights);
     238}
     239/*}}}*/
     240/*FUNCTION GaussPenta::GaussPenta(int index,double r1,double r2,int order) {{{*/
     241GaussPenta::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;
    238400}
    239401/*}}}*/
Note: See TracChangeset for help on using the changeset viewer.