Ignore:
Timestamp:
07/10/20 21:33:01 (5 years ago)
Author:
Mathieu Morlighem
Message:

CHG: removing TripleMultiply

File:
1 edited

Legend:

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

    r25118 r25266  
    161161        ElementMatrix* Ke     = element->NewElementMatrix();
    162162        IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
    163         IssmDouble*    B      = xNew<IssmDouble>(2*numnodes);
    164         IssmDouble*    Bprime = xNew<IssmDouble>(2*numnodes);
     163        IssmDouble*             dbasis = xNew<IssmDouble>(2*numnodes);
    165164        IssmDouble     D[2][2]={0.};
    166165
     
    183182                element->JacobianDeterminant(&Jdet,xyz_list,gauss);
    184183                element->NodalFunctions(basis,gauss);
     184                element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
    185185
    186186                vx_input->GetInputValue(&vx,gauss);
     
    189189                vy_input->GetInputDerivativeValue(&dvy[0],xyz_list,gauss);
    190190
     191                /*Transient term*/
    191192                D_scalar=gauss->weight*Jdet;
    192 
    193                 TripleMultiply(basis,1,numnodes,1,
    194                                         &D_scalar,1,1,0,
    195                                         basis,1,numnodes,0,
    196                                         Ke->values,1);
    197 
    198                 GetB(B,element,xyz_list,gauss);
    199                 GetBprime(Bprime,element,xyz_list,gauss);
    200 
     193                for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Ke->values[i*numnodes+j] += D_scalar*basis[i]*basis[j];
     194
     195                /*Advection terms*/
    201196                dvxdx=dvx[0];
    202197                dvydy=dvy[1];
    203198                D_scalar=dt*gauss->weight*Jdet;
    204 
    205                 D[0][0]=D_scalar*dvxdx;
    206                 D[1][1]=D_scalar*dvydy;
    207                 TripleMultiply(B,2,numnodes,1,
    208                                         &D[0][0],2,2,0,
    209                                         B,2,numnodes,0,
    210                                         &Ke->values[0],1);
    211 
    212                 D[0][0]=D_scalar*vx;
    213                 D[1][1]=D_scalar*vy;
    214                 TripleMultiply(B,2,numnodes,1,
    215                                         &D[0][0],2,2,0,
    216                                         Bprime,2,numnodes,0,
    217                                         &Ke->values[0],1);
     199                for(int i=0;i<numnodes;i++){
     200                        for(int j=0;j<numnodes;j++){
     201                                /*\phi_i \phi_j \nabla\cdot v*/
     202                                Ke->values[i*numnodes+j] += D_scalar*basis[i]*basis[j]*(dvxdx+dvydy);
     203                                /*\phi_i v\cdot\nabla\phi_j*/
     204                                Ke->values[i*numnodes+j] += D_scalar*basis[i]*(vx*dbasis[0*numnodes+j] + vy*dbasis[1*numnodes+j]);
     205                        }
     206                }
    218207
    219208                /*Artificial diffusivity*/
     
    223212                D[0][1]=D_scalar*diffusivity*h/(2*vel)*vx*vy;
    224213                D[1][1]=D_scalar*diffusivity*h/(2*vel)*vy*vy;
    225                 TripleMultiply(Bprime,2,numnodes,1,
    226                                         &D[0][0],2,2,0,
    227                                         Bprime,2,numnodes,0,
    228                                         &Ke->values[0],1);
     214                for(int i=0;i<numnodes;i++){
     215                        for(int j=0;j<numnodes;j++){
     216                                Ke->values[i*numnodes+j] += (
     217                                                        dbasis[0*numnodes+i] *(D[0][0]*dbasis[0*numnodes+j] + D[0][1]*dbasis[1*numnodes+j]) +
     218                                                        dbasis[1*numnodes+i] *(D[1][0]*dbasis[0*numnodes+j] + D[1][1]*dbasis[1*numnodes+j])
     219                                                        );
     220                        }
     221                }
    229222        }
    230223
     
    232225        xDelete<IssmDouble>(xyz_list);
    233226        xDelete<IssmDouble>(basis);
    234         xDelete<IssmDouble>(B);
    235         xDelete<IssmDouble>(Bprime);
     227        xDelete<IssmDouble>(dbasis);
    236228        delete gauss;
    237229        return Ke;
     
    285277        delete gauss;
    286278        return pe;
    287 }/*}}}*/
    288 void           HydrologyShreveAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
    289         /*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*2.
    290          * For node i, Bi can be expressed in the actual coordinate system
    291          * by:
    292          *       Bi=[ N ]
    293          *          [ N ]
    294          * where N is the finiteelement function for node i.
    295          *
    296          * We assume B_prog has been allocated already, of size: 2x(1*numnodes)
    297          */
    298 
    299         /*Fetch number of nodes for this finite element*/
    300         int numnodes = element->GetNumberOfNodes();
    301 
    302         /*Get nodal functions*/
    303         IssmDouble* basis=xNew<IssmDouble>(numnodes);
    304         element->NodalFunctions(basis,gauss);
    305 
    306         /*Build B: */
    307         for(int i=0;i<numnodes;i++){
    308                 B[numnodes*0+i] = basis[i];
    309                 B[numnodes*1+i] = basis[i];
    310         }
    311 
    312         /*Clean-up*/
    313         xDelete<IssmDouble>(basis);
    314 }/*}}}*/
    315 void           HydrologyShreveAnalysis::GetBprime(IssmDouble* Bprime,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
    316         /*Compute B'  matrix. B'=[B1' B2' B3'] where Bi' is of size 3*2.
    317          * For node i, Bi' can be expressed in the actual coordinate system
    318          * by:
    319          *       Bi_prime=[ dN/dx ]
    320          *                [ dN/dy ]
    321          * where N is the finiteelement function for node i.
    322          *
    323          * We assume B' has been allocated already, of size: 3x(2*numnodes)
    324          */
    325 
    326         /*Fetch number of nodes for this finite element*/
    327         int numnodes = element->GetNumberOfNodes();
    328 
    329         /*Get nodal functions derivatives*/
    330         IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes);
    331         element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
    332 
    333         /*Build B': */
    334         for(int i=0;i<numnodes;i++){
    335                 Bprime[numnodes*0+i] = dbasis[0*numnodes+i];
    336                 Bprime[numnodes*1+i] = dbasis[1*numnodes+i];
    337         }
    338 
    339         /*Clean-up*/
    340         xDelete<IssmDouble>(dbasis);
    341 
    342279}/*}}}*/
    343280void           HydrologyShreveAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
Note: See TracChangeset for help on using the changeset viewer.