Changeset 24130


Ignore:
Timestamp:
08/30/19 11:51:24 (6 years ago)
Author:
Mathieu Morlighem
Message:

CHG: better way of computing stiffness with DG

Location:
issm/trunk-jpl/src/c/classes/Loads
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/classes/Loads/Numericalflux.cpp

    r24091 r24130  
    351351                                _error_("Numericalflux type " << EnumToStringx(this->flux_type) << " not supported yet");
    352352                }
     353        }
     354        else{
     355                _error_("Numericalflux " << EnumToStringx(this->flux_degree) << " not supported yet");
     356        }
     357
     358}
     359/*}}}*/
     360int   Numericalflux::GetNumberOfNodesOneSide(void){/*{{{*/
     361
     362        if(this->flux_degree==P0DGEnum){
     363                return 1;
     364        }
     365        else if(this->flux_degree==P1DGEnum){
     366                return 2;
    353367        }
    354368        else{
     
    695709
    696710        /* Intermediaries*/
    697         IssmDouble DL1,DL2,Jdet,vx,vy,UdotN;
     711        IssmDouble A1,A2,Jdet,vx,vy,UdotN;
    698712        IssmDouble xyz_list[NUMVERTICES][3];
    699713        IssmDouble normal[2];
    700714
    701715        /*Fetch number of nodes for this flux*/
    702         int numnodes = this->GetNumberOfNodes();
     716        int numnodes       = this->GetNumberOfNodes();
     717        int numnodes_plus  = this->GetNumberOfNodesOneSide();
     718        int numnodes_minus = numnodes_plus; /*For now we are not doing p-adaptive DG*/
     719        _assert_(numnodes==numnodes_plus+numnodes_minus);
    703720
    704721        /*Initialize variables*/
    705         ElementMatrix *Ke     = new ElementMatrix(nodes,numnodes,this->parameters);
    706         IssmDouble    *B      = xNew<IssmDouble>(numnodes);
    707         IssmDouble    *Bprime = xNew<IssmDouble>(numnodes);
     722        ElementMatrix *Ke = new ElementMatrix(nodes,numnodes,this->parameters);
     723        IssmDouble    *basis_plus  = xNew<IssmDouble>(numnodes_plus);
     724        IssmDouble    *basis_minus = xNew<IssmDouble>(numnodes_minus);
    708725
    709726        /*Retrieve all inputs and parameters*/
     
    722739                gauss->GaussPoint(ig);
    723740
    724                 tria->GetSegmentBFlux(&B[0],gauss,index1,index2,tria->FiniteElement());
    725                 tria->GetSegmentBprimeFlux(&Bprime[0],gauss,index1,index2,tria->FiniteElement());
     741                tria->GetSegmentNodalFunctions(&basis_plus[0] ,gauss,index1,index2,tria->FiniteElement());
     742                tria->GetSegmentNodalFunctions(&basis_minus[0],gauss,index1,index2,tria->FiniteElement());
    726743
    727744                vxaverage_input->GetInputValue(&vx,gauss);
     
    729746                UdotN=vx*normal[0]+vy*normal[1];
    730747                tria->GetSegmentJacobianDeterminant(&Jdet,&xyz_list[0][0],gauss);
    731                 DL1=gauss->weight*Jdet*dt*UdotN/2;
    732                 DL2=gauss->weight*Jdet*dt*fabs(UdotN)/2;
    733 
    734                 for(int i=0;i<numnodes;i++){
    735                         for(int j=0;j<numnodes;j++){
    736                                 Ke->values[i*numnodes+j]+=DL1*B[i]*Bprime[j];
    737                                 Ke->values[i*numnodes+j]+=DL2*B[i]*B[j];
     748                A1=gauss->weight*Jdet*dt*UdotN/2;
     749                A2=gauss->weight*Jdet*dt*fabs(UdotN)/2;
     750
     751                /*Term 1 (numerical flux): {Hv}.[[phi]] = 0.5(H+v+ + H-v-)(phi+n+ + phi-n-)
     752                 *                                      = v.n/2 (H+phi+ + H-phi+ -H+phi- -H-phi-)
     753                 *                                      = v.n/2 (H+phi+ + H-phi+ -H+phi- -H-phi-)
     754                 *
     755                 *Term 2 (stabilization)  |v.n|/2 [[H]].[[phi]] = |v.n|/2 (H+n+ + H-n-)(phi+n+ + phi-n-)
     756                 *                                      = |v.n|/2 (H+phi+ -H-phi+ -H+phi- +H-phi-)
     757                 *     | A++ | A+- |
     758                 * K = |-----------|
     759                 *     | A-+ | A-- |
     760                 *
     761                 *These 4 terms for each expressions are added independently*/
     762
     763                /*First term A++*/
     764                for(int i=0;i<numnodes_plus;i++){
     765                        for(int j=0;j<numnodes_plus;j++){
     766                                Ke->values[i*numnodes+j] += A1*(basis_plus[j]*basis_plus[i]);
     767                                Ke->values[i*numnodes+j] += A2*(basis_plus[j]*basis_plus[i]);
    738768                        }
    739769                }
     770                /*Second term A+-*/
     771                for(int i=0;i<numnodes_plus;i++){
     772                        for(int j=0;j<numnodes_minus;j++){
     773                                Ke->values[i*numnodes+numnodes_plus+j] +=  A1*(basis_minus[j]*basis_plus[i]);
     774                                Ke->values[i*numnodes+numnodes_plus+j] += -A2*(basis_minus[j]*basis_plus[i]);
     775                        }
     776                }
     777                /*Third term A-+*/
     778                for(int i=0;i<numnodes_minus;i++){
     779                        for(int j=0;j<numnodes_plus;j++){
     780                                Ke->values[(numnodes_plus+i)*numnodes+j] += -A1*(basis_plus[j]*basis_minus[i]);
     781                                Ke->values[(numnodes_plus+i)*numnodes+j] += -A2*(basis_plus[j]*basis_minus[i]);
     782                        }
     783                }
     784                /*Fourth term A-+*/
     785                for(int i=0;i<numnodes_minus;i++){
     786                        for(int j=0;j<numnodes_minus;j++){
     787                                Ke->values[(numnodes_plus+i)*numnodes+numnodes_plus+j] += -A1*(basis_minus[j]*basis_minus[i]);
     788                                Ke->values[(numnodes_plus+i)*numnodes+numnodes_plus+j] +=  A2*(basis_minus[j]*basis_minus[i]);
     789                        }
     790                }
    740791        }
    741792
    742793        /*Clean up and return*/
    743    xDelete<IssmDouble>(B);
    744    xDelete<IssmDouble>(Bprime);
     794   xDelete<IssmDouble>(basis_plus);
     795   xDelete<IssmDouble>(basis_minus);
    745796        delete gauss;
    746797        return Ke;
  • issm/trunk-jpl/src/c/classes/Loads/Numericalflux.h

    r24088 r24130  
    6464                void GetNodesSidList(int* sidlist);
    6565                int  GetNumberOfNodes(void);
     66                int  GetNumberOfNodesOneSide(void);
    6667                bool IsPenalty(void);
    6768                void PenaltyCreateJacobianMatrix(Matrix<IssmDouble>* Jff,IssmDouble kmax){_error_("Not implemented yet");};
Note: See TracChangeset for help on using the changeset viewer.