Changeset 24431


Ignore:
Timestamp:
12/04/19 21:11:16 (5 years ago)
Author:
Mathieu Morlighem
Message:

CHG: trying to speed up the code

Location:
issm/trunk-jpl/src/c
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp

    r24429 r24431  
    207207ElementVector* ExtrapolationAnalysis::CreatePVector(Element* element){/*{{{*/
    208208        return NULL;
    209 
    210 }/*}}}*/
    211 void           ExtrapolationAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss, int dim){/*{{{*/
    212         /*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*NDOF2.
    213          * For node i, Bi can be expressed in the actual coordinate system
    214          * by:
    215          *       Bi=[ N ]
    216          *          [ N ]
    217          * where N is the finiteelement function for node i.
    218          *
    219          * We assume B_prog has been allocated already, of size: 2x(NDOF1*numnodes)
    220          */
    221 
    222         /*Fetch number of nodes for this finite element*/
    223         int numnodes = element->GetNumberOfNodes();
    224 
    225         /*Get nodal functions*/
    226         IssmDouble* basis=xNew<IssmDouble>(numnodes);
    227         element->NodalFunctions(basis,gauss);
    228 
    229         /*Build B: */
    230         for(int i=0;i<numnodes;i++)
    231                 for(int d=0;d<dim;d++)
    232                         B[numnodes*d+i] = basis[i];
    233 
    234         /*Clean-up*/
    235         xDelete<IssmDouble>(basis);
    236 }/*}}}*/
    237 void           ExtrapolationAnalysis::GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss, int dim){/*{{{*/
    238         /*Compute B'  matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2.
    239          * For node i, Bi' can be expressed in the actual coordinate system
    240          * by:
    241          *       Bi_prime=[ dN/dx ]
    242          *                [ dN/dy ]
    243          * where N is the finiteelement function for node i.
    244          *
    245          * We assume B' has been allocated already, of size: 3x(NDOF2*numnodes)
    246          */
    247 
    248         /*Fetch number of nodes for this finite element*/
    249         int numnodes = element->GetNumberOfNodes();
    250 
    251         /*Get nodal functions derivatives*/
    252         IssmDouble* dbasis=xNew<IssmDouble>(dim*numnodes);
    253         element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
    254 
    255         /*Build B': */
    256         for(int i=0;i<numnodes;i++)
    257                 for(int d=0;d<dim;d++)
    258                         Bprime[numnodes*d+i] = dbasis[d*numnodes+i];
    259 
    260         /*Clean-up*/
    261         xDelete<IssmDouble>(dbasis);
    262 
    263209}/*}}}*/
    264210void           ExtrapolationAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
     
    288234        }
    289235}/*}}}*/
    290 int                             ExtrapolationAnalysis::GetExtrapolationCase(Element* element){/*{{{*/
     236int            ExtrapolationAnalysis::GetExtrapolationCase(Element* element){/*{{{*/
    291237
    292238        /* Get case of extrapolation, depending on domain quality, and extrapolation variable */
  • issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.h

    r24335 r24431  
    2626        ElementMatrix* CreateKMatrix(Element* element);
    2727        ElementVector* CreatePVector(Element* element);
    28         void           GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss, int dim);
    29         void           GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss, int dim);
    3028        void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
    3129        void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
  • issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp

    r24429 r24431  
    291291        IssmDouble xi,tau;
    292292        IssmDouble dvx[2],dvy[2];
     293        IssmDouble D[4];
    293294        IssmDouble* xyz_list = NULL;
    294295
     
    309310        IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
    310311        IssmDouble*             dbasis = xNew<IssmDouble>(dim*numnodes);
    311         IssmDouble*    B      = xNew<IssmDouble>(dim*numnodes);
    312         IssmDouble*    Bprime = xNew<IssmDouble>(dim*numnodes);
    313         IssmDouble*    D      = xNewZeroInit<IssmDouble>(dim*dim);
    314312
    315313        /*Retrieve all inputs and parameters*/
     
    333331                element->JacobianDeterminant(&Jdet,xyz_list,gauss);
    334332                element->NodalFunctions(basis,gauss);
    335 
     333                element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
     334
     335                /*Transient term*/
     336                D_scalar=gauss->weight*Jdet;
     337                for(int i=0;i<numnodes;i++){
     338                        for(int j=0;j<numnodes;j++){
     339                                Ke->values[i*numnodes+j] += D_scalar*basis[i]*basis[j];
     340                        }
     341                }
     342
     343                /*Advection terms*/
    336344                vxaverage_input->GetInputValue(&vx,gauss);
    337345                vxaverage_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss);
     346                D_scalar=dt*gauss->weight*Jdet;
    338347                if(dim==2){
    339348                        vyaverage_input->GetInputValue(&vy,gauss);
    340349                        vyaverage_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
    341                 }
    342 
    343                 D_scalar=gauss->weight*Jdet;
    344                 TripleMultiply(basis,1,numnodes,1,
    345                                         &D_scalar,1,1,0,
    346                                         basis,1,numnodes,0,
    347                                         &Ke->values[0],1);
    348 
    349                 GetB(B,element,dim,xyz_list,gauss);
    350                 GetBprime(Bprime,element,dim,xyz_list,gauss);
    351 
    352                 dvxdx=dvx[0];
    353                 if(dim==2) dvydy=dvy[1];
    354                 D_scalar=dt*gauss->weight*Jdet;
    355 
    356                 D[0*dim+0]=D_scalar*dvxdx;
    357                 if(dim==2) D[1*dim+1]=D_scalar*dvydy;
    358 
    359                 TripleMultiply(B,dim,numnodes,1,
    360                                         D,dim,dim,0,
    361                                         B,dim,numnodes,0,
    362                                         &Ke->values[0],1);
    363 
    364                 D[0*dim+0]=D_scalar*vx;
    365                 if(dim==2) D[1*dim+1]=D_scalar*vy;
    366 
    367                 TripleMultiply(B,dim,numnodes,1,
    368                                         D,dim,dim,0,
    369                                         Bprime,dim,numnodes,0,
    370                                         &Ke->values[0],1);
    371 
     350                        dvxdx=dvx[0];
     351                        dvydy=dvy[1];
     352                        for(int i=0;i<numnodes;i++){
     353                                for(int j=0;j<numnodes;j++){
     354                                        /*\phi_i \phi_j \nabla\cdot v*/
     355                                        Ke->values[i*numnodes+j] += D_scalar*basis[i]*basis[j]*(dvxdx+dvydy);
     356                                        /*\phi_i v\cdot\nabla\phi_j*/
     357                                        Ke->values[i*numnodes+j] += D_scalar*basis[i]*(vx*dbasis[0*numnodes+j] + vy*dbasis[1*numnodes+j]);
     358                                }
     359                        }
     360                }
     361                else{
     362                        dvxdx=dvx[0];
     363                        for(int i=0;i<numnodes;i++){
     364                                for(int j=0;j<numnodes;j++){
     365                                        Ke->values[i*numnodes+j] += D_scalar*dvxdx*dbasis[0*numnodes+i]*dbasis[0*numnodes+j];
     366                                        Ke->values[i*numnodes+j] += D_scalar*vx*dbasis[0*numnodes+j]*basis[i];
     367                                }
     368                        }
     369                }
     370
     371                for(int i=0;i<4;i++) D[i]=0.;
    372372                switch(stabilization){
    373373                        case 0:
     
    383383                        case 2:
    384384                                /*Streamline upwinding*/
    385                                 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
    386385                                vxaverage_input->GetInputAverage(&vx);
    387386                                if(dim==1){
     
    397396                                /*SUPG*/
    398397                                if(dim!=2) _error_("Stabilization "<<stabilization<<" not supported yet for dim != 2");
    399                                 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
    400398                                vxaverage_input->GetInputAverage(&vx);
    401399                                vyaverage_input->GetInputAverage(&vy);
     
    418416                        }
    419417
    420                         TripleMultiply(Bprime,dim,numnodes,1,
    421                                                 D,dim,dim,0,
    422                                                 Bprime,dim,numnodes,0,
    423                                                 &Ke->values[0],1);
     418                        if(dim==2){
     419                                for(int i=0;i<numnodes;i++){
     420                                        for(int j=0;j<numnodes;j++){
     421                                                Ke->values[i*numnodes+j] += (
     422                                                                        dbasis[0*numnodes+i] *(D[0*dim+0]*dbasis[0*numnodes+j] + D[0*dim+1]*dbasis[1*numnodes+j]) +
     423                                                                        dbasis[1*numnodes+i] *(D[1*dim+0]*dbasis[0*numnodes+j] + D[1*dim+1]*dbasis[1*numnodes+j])
     424                                                                        );
     425                                        }
     426                                }
     427                        }
     428                        else{
     429                                for(int i=0;i<numnodes;i++){
     430                                        for(int j=0;j<numnodes;j++){
     431                                                Ke->values[i*numnodes+j] += D_scalar*h/(2.*vel)*dbasis[0*numnodes+i] *D[0]*dbasis[0*numnodes+j];
     432                                        }
     433                                }
     434                        }
    424435                }
    425436                if(stabilization==2){
     
    478489        xDelete<IssmDouble>(basis);
    479490        xDelete<IssmDouble>(dbasis);
    480         xDelete<IssmDouble>(B);
    481         xDelete<IssmDouble>(Bprime);
    482         xDelete<IssmDouble>(D);
    483491        delete gauss;
    484492        return Ke;
  • issm/trunk-jpl/src/c/classes/Elements/Element.cpp

    r24404 r24431  
    4747
    4848/*Other*/
     49bool       Element::AnyFSet(){/*{{{*/
     50
     51        /*Fetch number of nodes and dof for this finite element*/
     52        int numnodes = this->GetNumberOfNodes();
     53
     54        for(int i=0;i<numnodes;i++){
     55                if(nodes[i]->fsize) return true;
     56        }
     57        return false;
     58}/*}}}*/
    4959void       Element::ComputeLambdaS(){/*{{{*/
    5060
  • issm/trunk-jpl/src/c/classes/Elements/Element.h

    r24378 r24431  
    6363                /*bool               AllActive(void);*/
    6464                /*bool               AnyActive(void);*/
     65                bool               AnyFSet(void);
    6566                void               ComputeLambdaS(void);
    6667                void               ComputeNewDamage();
  • issm/trunk-jpl/src/c/modules/SystemMatricesx/SystemMatricesx.cpp

    r24109 r24431  
    4343                for (i=0;i<femmodel->elements->Size();i++){
    4444                        element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
     45                        if(!element->AnyFSet()) continue;
    4546                        ElementMatrix* Ke = analysis->CreateKMatrix(element);
    4647                        ElementVector* pe = analysis->CreatePVector(element);
     
    7677        for (i=0;i<femmodel->elements->Size();i++){
    7778                element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
     79                if(!element->AnyFSet()) continue;
    7880                ElementMatrix* Ke = analysis->CreateKMatrix(element);
    7981                ElementVector* pe = analysis->CreatePVector(element);
Note: See TracChangeset for help on using the changeset viewer.