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

CHG: removing TripleMultiply

File:
1 edited

Legend:

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

    r25118 r25264  
    169169        ElementMatrix* Ke     = basalelement->NewElementMatrix(NoneApproximationEnum);
    170170        IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
    171         IssmDouble*    B      = xNew<IssmDouble>(dim*numnodes);
    172         IssmDouble*    Bprime = xNew<IssmDouble>(dim*numnodes);
     171        IssmDouble*    dbasis = xNew<IssmDouble>(dim*numnodes);
    173172        IssmDouble*    D      = xNew<IssmDouble>(dim*dim);
    174173
     
    189188                basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
    190189                basalelement->NodalFunctions(basis,gauss);
     190                basalelement->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
    191191
    192192                vx_input->GetInputValue(&vx,gauss);
    193193                if(dim==2) vy_input->GetInputValue(&vy,gauss);
    194194
     195                /*Transient term*/
    195196                D_scalar=gauss->weight*Jdet;
    196                 TripleMultiply(basis,1,numnodes,1,
    197                                         &D_scalar,1,1,0,
    198                                         basis,1,numnodes,0,
    199                                         &Ke->values[0],1);
    200 
    201                 GetB(B,basalelement,dim,xyz_list,gauss);
    202                 GetBprime(Bprime,basalelement,dim,xyz_list,gauss);
    203 
     197                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];
     198
     199                /*Advection terms*/
    204200                D_scalar=dt*gauss->weight*Jdet;
    205201                for(int i=0;i<dim*dim;i++) D[i]=0.;
    206                 D[0] = D_scalar*vx;
    207                 if(dim==2) D[1*dim+1] = D_scalar*vy;
    208 
    209                 TripleMultiply(B,dim,numnodes,1,
    210                                         D,dim,dim,0,
    211                                         Bprime,dim,numnodes,0,
    212                                         &Ke->values[0],1);
     202
     203                if(dim==1){
     204                        /*\phi_i v\cdot\nabla\phi_j*/
     205                        for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Ke->values[i*numnodes+j] += D_scalar*basis[i]*vx*dbasis[0*numnodes+j];
     206                }
     207                else{
     208                        _assert_(dim==2);
     209                        for(int i=0;i<numnodes;i++){
     210                                for(int j=0;j<numnodes;j++){
     211                                        /*\phi_i v\cdot\nabla\phi_j*/
     212                                        Ke->values[i*numnodes+j] += D_scalar*basis[i]*(vx*dbasis[0*numnodes+j] + vy*dbasis[1*numnodes+j]);
     213                                }
     214                        }
     215                }
    213216
    214217                if(stabilization==2){
     
    241244                if(stabilization==1 || stabilization==2){
    242245                        for(int i=0;i<dim*dim;i++) D[i]=D_scalar*D[i];
    243                         TripleMultiply(Bprime,dim,numnodes,1,
    244                                                 D,dim,dim,0,
    245                                                 Bprime,dim,numnodes,0,
    246                                                 &Ke->values[0],1);
     246                        if(dim==2){
     247                                for(int i=0;i<numnodes;i++){
     248                                        for(int j=0;j<numnodes;j++){
     249                                                Ke->values[i*numnodes+j] += (
     250                                                                        dbasis[0*numnodes+i] *(D[0*dim+0]*dbasis[0*numnodes+j] + D[0*dim+1]*dbasis[1*numnodes+j]) +
     251                                                                        dbasis[1*numnodes+i] *(D[1*dim+0]*dbasis[0*numnodes+j] + D[1*dim+1]*dbasis[1*numnodes+j])
     252                                                                        );
     253                                        }
     254                                }
     255                        }
     256                        else{
     257                                for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Ke->values[i*numnodes+j] += dbasis[0*numnodes+i]*D[0]*dbasis[0*numnodes+j];
     258                        }
    247259                }
    248260        }
     
    251263        xDelete<IssmDouble>(xyz_list);
    252264        xDelete<IssmDouble>(basis);
    253         xDelete<IssmDouble>(B);
    254         xDelete<IssmDouble>(Bprime);
     265        xDelete<IssmDouble>(dbasis);
    255266        xDelete<IssmDouble>(D);
    256267        delete gauss;
     
    332343        if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
    333344        return pe;
    334 
    335 }/*}}}*/
    336 void           FreeSurfaceBaseAnalysis::GetB(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
    337         /*Compute B  matrix. B=[B1 B2 B3] where Bi is of size 3*2.
    338          * For node i, Bi can be expressed in the actual coordinate system
    339          * by:
    340          *       Bi=[ N ]
    341          *          [ N ]
    342          * where N is the finiteelement function for node i.
    343          *
    344          * We assume B_prog has been allocated already, of size: 2x(1*numnodes)
    345          */
    346 
    347         /*Fetch number of nodes for this finite element*/
    348         int numnodes = element->GetNumberOfNodes();
    349 
    350         /*Get nodal functions*/
    351         IssmDouble* basis=xNew<IssmDouble>(numnodes);
    352         element->NodalFunctions(basis,gauss);
    353 
    354         /*Build B: */
    355         for(int i=0;i<numnodes;i++){
    356                 for(int j=0;j<dim;j++){
    357                         B[numnodes*j+i] = basis[i];
    358                 }
    359         }
    360 
    361         /*Clean-up*/
    362         xDelete<IssmDouble>(basis);
    363 }/*}}}*/
    364 void           FreeSurfaceBaseAnalysis::GetBprime(IssmDouble* Bprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
    365         /*Compute B'  matrix. B'=[B1' B2' B3'] where Bi' is of size 3*2.
    366          * For node i, Bi' can be expressed in the actual coordinate system
    367          * by:
    368          *       Bi_prime=[ dN/dx ]
    369          *                [ dN/dy ]
    370          * where N is the finiteelement function for node i.
    371          *
    372          * We assume B' has been allocated already, of size: 3x(2*numnodes)
    373          */
    374 
    375         /*Fetch number of nodes for this finite element*/
    376         int numnodes = element->GetNumberOfNodes();
    377 
    378         /*Get nodal functions derivatives*/
    379         IssmDouble* dbasis=xNew<IssmDouble>(dim*numnodes);
    380         element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
    381 
    382         /*Build B': */
    383         for(int i=0;i<numnodes;i++){
    384                 for(int j=0;j<dim;j++){
    385                         Bprime[numnodes*j+i] = dbasis[j*numnodes+i];
    386                 }
    387         }
    388 
    389         /*Clean-up*/
    390         xDelete<IssmDouble>(dbasis);
    391345
    392346}/*}}}*/
Note: See TracChangeset for help on using the changeset viewer.