Changeset 25261


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

CHG: removing TripleMultiply

Location:
issm/trunk-jpl/src/c/analyses
Files:
3 edited

Legend:

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

    r25118 r25261  
    109109                D=latentheat/heatcapacity*gauss->weight*Jdet;
    110110
    111                 TripleMultiply(basis,1,numnodes,1,
    112                                         &D,1,1,0,
    113                                         basis,1,numnodes,0,
    114                                         &Ke->values[0],1);
     111                for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Ke->values[i*numnodes+j] += D*basis[i]*basis[j];
    115112        }
    116113
  • issm/trunk-jpl/src/c/analyses/ThermalAnalysis.cpp

    r25118 r25261  
    362362                D=gauss->weight*Jdet*rho_water*mixed_layer_capacity*thermal_exchange_vel/(heatcapacity*rho_ice);
    363363                if(reCast<bool,IssmDouble>(dt)) D=dt*D;
    364                 TripleMultiply(basis,numnodes,1,0,
    365                                         &D,1,1,0,
    366                                         basis,1,numnodes,0,
    367                                         &Ke->values[0],1);
    368 
     364                for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Ke->values[i*numnodes+j] += D*basis[i]*basis[j];
    369365        }
    370366
     
    395391        IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
    396392        IssmDouble*    dbasis = xNew<IssmDouble>(3*numnodes);
    397         IssmDouble*    Bprime = xNew<IssmDouble>(3*numnodes);
    398393        IssmDouble     K[3][3];
    399394
     
    468463                        K[2][0]=h/(2.*vel)*fabs(vz*vx);  K[2][1]=h/(2.*vel)*fabs(vz*vy); K[2][2]=h/(2.*vel)*fabs(vz*vz);
    469464                        for(int i=0;i<3;i++) for(int j=0;j<3;j++) K[i][j] = D_scalar*K[i][j];
    470                         GetBAdvecprime(Bprime,element,xyz_list,gauss);
    471 
    472                         TripleMultiply(Bprime,3,numnodes,1,
    473                                                 &K[0][0],3,3,0,
    474                                                 Bprime,3,numnodes,0,
    475                                                 &Ke->values[0],1);
     465
     466                        for(int i=0;i<numnodes;i++){
     467                                for(int j=0;j<numnodes;j++){
     468                                        Ke->values[i*numnodes+j] += (
     469                                                                dbasis[0*numnodes+i] *(K[0][0]*dbasis[0*numnodes+j] + K[0][1]*dbasis[1*numnodes+j]+ K[0][2]*dbasis[2*numnodes+j]) +
     470                                                                dbasis[1*numnodes+i] *(K[1][0]*dbasis[0*numnodes+j] + K[1][1]*dbasis[1*numnodes+j]+ K[1][2]*dbasis[2*numnodes+j]) +
     471                                                                dbasis[2*numnodes+i] *(K[2][0]*dbasis[0*numnodes+j] + K[2][1]*dbasis[1*numnodes+j]+ K[2][2]*dbasis[2*numnodes+j])
     472                                                                );
     473                                }
     474                        }
    476475                }
    477476                else if(stabilization==2){
     
    513512        /*Clean up and return*/
    514513        xDelete<IssmDouble>(xyz_list);
    515         xDelete<IssmDouble>(Bprime);
    516514        xDelete<IssmDouble>(basis);
    517515        xDelete<IssmDouble>(dbasis);
     
    744742        return pe;
    745743
    746 }/*}}}*/
    747 void           ThermalAnalysis::GetBAdvec(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
    748         /*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*1.
    749          * For node i, Bi' can be expressed in the actual coordinate system
    750          * by:
    751          *       Bi_advec =[ h ]
    752          *                 [ h ]
    753          *                 [ h ]
    754          * where h is the interpolation function for node i.
    755          *
    756          * We assume B has been allocated already, of size: 3x(1*NUMNODESP1)
    757          */
    758 
    759         /*Fetch number of nodes for this finite element*/
    760         int numnodes = element->GetNumberOfNodes();
    761 
    762         /*Get nodal functions*/
    763         IssmDouble* basis=xNew<IssmDouble>(numnodes);
    764         element->NodalFunctions(basis,gauss);
    765 
    766         /*Build B: */
    767         for(int i=0;i<numnodes;i++){
    768                 B[numnodes*0+i] = basis[i];
    769                 B[numnodes*1+i] = basis[i];
    770                 B[numnodes*2+i] = basis[i];
    771         }
    772 
    773         /*Clean-up*/
    774         xDelete<IssmDouble>(basis);
    775 }/*}}}*/
    776 void           ThermalAnalysis::GetBAdvecprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
    777         /*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*1.
    778          * For node i, Bi' can be expressed in the actual coordinate system
    779          * by:
    780          *       Biprime_advec=[ dh/dx ]
    781          *                     [ dh/dy ]
    782          *                     [ dh/dz ]
    783          * where h is the interpolation function for node i.
    784          *
    785          * We assume B has been allocated already, of size: 3x(1*numnodes)
    786          */
    787 
    788         /*Fetch number of nodes for this finite element*/
    789         int numnodes = element->GetNumberOfNodes();
    790 
    791         /*Get nodal functions derivatives*/
    792         IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes);
    793         element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
    794 
    795         /*Build B: */
    796         for(int i=0;i<numnodes;i++){
    797                 B[numnodes*0+i] = dbasis[0*numnodes+i];
    798                 B[numnodes*1+i] = dbasis[1*numnodes+i];
    799                 B[numnodes*2+i] = dbasis[2*numnodes+i];
    800         }
    801 
    802         /*Clean-up*/
    803         xDelete<IssmDouble>(dbasis);
    804 }/*}}}*/
    805 void           ThermalAnalysis::GetBConduct(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/
    806         /*Compute B  matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*1.
    807          * For node i, Bi' can be expressed in the actual coordinate system
    808          * by:
    809          *       Bi_conduct=[ dh/dx ]
    810          *                  [ dh/dy ]
    811          *                  [ dh/dz ]
    812          * where h is the interpolation function for node i.
    813          *
    814          * We assume B has been allocated already, of size: 3x(1*numnodes)
    815          */
    816 
    817         /*Fetch number of nodes for this finite element*/
    818         int numnodes = element->GetNumberOfNodes();
    819 
    820         /*Get nodal functions derivatives*/
    821         IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes);
    822         element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
    823 
    824         /*Build B: */
    825         for(int i=0;i<numnodes;i++){
    826                 B[numnodes*0+i] = dbasis[0*numnodes+i];
    827                 B[numnodes*1+i] = dbasis[1*numnodes+i];
    828                 B[numnodes*2+i] = dbasis[2*numnodes+i];
    829         }
    830 
    831         /*Clean-up*/
    832         xDelete<IssmDouble>(dbasis);
    833744}/*}}}*/
    834745void           ThermalAnalysis::GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element){/*{{{*/
  • issm/trunk-jpl/src/c/analyses/ThermalAnalysis.h

    r24335 r25261  
    3131                ElementVector* CreatePVectorShelf(Element* element);
    3232                ElementVector* CreatePVectorVolume(Element* element);
    33                 void           GetBAdvec(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
    34                 void           GetBAdvecprime(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
    35                 void           GetBConduct(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss);
    3633                void           GetSolutionFromInputs(Vector<IssmDouble>* solution,Element* element);
    3734                void           GradientJ(Vector<IssmDouble>* gradient,Element* element,int control_type,int control_index);
Note: See TracChangeset for help on using the changeset viewer.