Changeset 24936


Ignore:
Timestamp:
05/30/20 22:25:06 (5 years ago)
Author:
Mathieu Morlighem
Message:

CHG: removing TripleMultiply... inefficient

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

Legend:

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

    r24933 r24936  
    164164        /*Initialize Element vector and other vectors*/
    165165        ElementMatrix* Ke     = element->NewElementMatrix();
    166         IssmDouble*    B      = xNew<IssmDouble>(2*numnodes);
    167         IssmDouble*    Bprime = xNew<IssmDouble>(2*numnodes);
     166        IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
     167        IssmDouble*             dbasis = xNew<IssmDouble>(2*numnodes);
    168168        IssmDouble     D[2][2];
    169169
     
    190190
    191191                element->JacobianDeterminant(&Jdet,xyz_list,gauss);
    192                 GetB(B,element,xyz_list,gauss);
    193                 GetBprime(Bprime,element,xyz_list,gauss);
     192                element->NodalFunctions(basis,gauss);
     193                element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
    194194
    195195                vxaverage_input->GetInputValue(&vx,gauss);
     
    201201                D_scalar=gauss->weight*Jdet;
    202202
    203                 D[0][0]=D_scalar*dvxdx;
    204                 D[0][1]=0.;
    205                 D[1][0]=0.;
    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);
     203                for(int i=0;i<numnodes;i++){
     204                        for(int j=0;j<numnodes;j++){
     205                                /*\phi_i \phi_j \nabla\cdot v*/
     206                                Ke->values[i*numnodes+j] += D_scalar*basis[i]*basis[j]*(dvxdx+dvydy);
     207                                /*\phi_i v\cdot\nabla\phi_j*/
     208                                Ke->values[i*numnodes+j] += D_scalar*basis[i]*(vx*dbasis[0*numnodes+j] + vy*dbasis[1*numnodes+j]);
     209                        }
     210                }
    218211
    219212                if(stabilization==1){
     
    239232                        D[0][1]=D_scalar*D[0][1];
    240233                        D[1][1]=D_scalar*D[1][1];
    241                         TripleMultiply(Bprime,2,numnodes,1,
    242                                                 &D[0][0],2,2,0,
    243                                                 Bprime,2,numnodes,0,
    244                                                 &Ke->values[0],1);
     234
     235                        for(int i=0;i<numnodes;i++){
     236                                for(int j=0;j<numnodes;j++){
     237                                        Ke->values[i*numnodes+j] += (
     238                                                                dbasis[0*numnodes+i] *(D[0][0]*dbasis[0*numnodes+j] + D[0][1]*dbasis[1*numnodes+j]) +
     239                                                                dbasis[1*numnodes+i] *(D[1][0]*dbasis[0*numnodes+j] + D[1][1]*dbasis[1*numnodes+j])
     240                                                                );
     241                                }
     242                        }
    245243                }
    246244        }
     
    248246        /*Clean up and return*/
    249247        xDelete<IssmDouble>(xyz_list);
    250         xDelete<IssmDouble>(B);
    251         xDelete<IssmDouble>(Bprime);
     248        xDelete<IssmDouble>(basis);
     249        xDelete<IssmDouble>(dbasis);
    252250        delete gauss;
    253251        return Ke;
  • issm/trunk-jpl/src/c/analyses/StressbalanceVerticalAnalysis.cpp

    r24861 r24936  
    216216                D = -gauss->weight*Jdet*normal[2];
    217217
    218                 TripleMultiply( basis,1,numnodes,1,
    219                                         &D,1,1,0,
    220                                         basis,1,numnodes,0,
    221                                         &Ke->values[0],1);
     218                for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Ke->values[i*numnodes+j] += D*basis[i]*basis[j];
    222219        }
    223220
     
    256253                D = -gauss->weight*Jdet*normal[2];
    257254
    258                 TripleMultiply( basis,1,numnodes,1,
    259                                         &D,1,1,0,
    260                                         basis,1,numnodes,0,
    261                                         &Ke->values[0],1);
     255                for(int i=0;i<numnodes;i++) for(int j=0;j<numnodes;j++) Ke->values[i*numnodes+j] += D*basis[i]*basis[j];
    262256        }
    263257
Note: See TracChangeset for help on using the changeset viewer.