Changeset 22510


Ignore:
Timestamp:
03/09/18 11:32:45 (7 years ago)
Author:
Mathieu Morlighem
Message:

CHG: getting rid of TripleMultiply in HO (too much time lost with multiplications and xNew in GetB

File:
1 edited

Legend:

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

    r22371 r22510  
    23362336
    23372337        /*Initialize Element matrix and vectors*/
    2338         ElementMatrix* Ke = element->NewElementMatrix(HOApproximationEnum);
    2339         IssmDouble*    B  = xNew<IssmDouble>((dim-1)*numdof);
    2340         IssmDouble*    D  = xNewZeroInit<IssmDouble>((dim-1)*(dim-1));
     2338        ElementMatrix* Ke     = element->NewElementMatrix(HOApproximationEnum);
     2339        IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
    23412340
    23422341        /*Retrieve all inputs and parameters*/
     
    23702369                }
    23712370
    2372                 this->GetBHOFriction(B,element,dim,xyz_list_base,gauss);
    23732371                element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss);
    2374                 for(int i=0;i<dim-1;i++) D[i*(dim-1)+i]=alpha2*gauss->weight*Jdet;
    2375 
    2376                 TripleMultiply(B,dim-1,numdof,1,
    2377                                         D,dim-1,dim-1,0,
    2378                                         B,dim-1,numdof,0,
    2379                                         &Ke->values[0],1);
     2372                element->NodalFunctions(basis,gauss);
     2373
     2374                if(dim==3){
     2375                        for(int i=0;i<numnodes;i++){
     2376                                for(int j=0;j<numnodes;j++){
     2377                                        Ke->values[2*i*2*numnodes+2*j]       += alpha2*gauss->weight*Jdet*basis[i]*basis[j];
     2378                                        Ke->values[(2*i+1)*2*numnodes+2*j+1] += alpha2*gauss->weight*Jdet*basis[i]*basis[j];
     2379                                }
     2380                        }
     2381                }
     2382                else{
     2383                        for(int i=0;i<numnodes;i++){
     2384                                for(int j=0;j<numnodes;j++){
     2385                                        Ke->values[i*numnodes+j] += alpha2*gauss->weight*Jdet*basis[i]*basis[j];
     2386                                }
     2387                        }
     2388                }
    23802389        }
    23812390
     
    23872396        delete friction;
    23882397        xDelete<IssmDouble>(xyz_list_base);
    2389         xDelete<IssmDouble>(B);
    2390         xDelete<IssmDouble>(D);
     2398        xDelete<IssmDouble>(basis);
    23912399        return Ke;
    23922400}/*}}}*/
     
    24002408        IssmDouble  viscosity,newviscosity,oldviscosity;
    24012409        IssmDouble  viscosity_overshoot,thickness,Jdet;
    2402         IssmDouble  D_scalar;
    24032410        IssmDouble *xyz_list = NULL;
    24042411
    24052412        /*Get problem dimension*/
    24062413        element->FindParam(&dim,DomainDimensionEnum);
    2407         if(dim==2) bsize = 2;
    2408         else       bsize = 5;
    24092414
    24102415        /*Fetch number of nodes and dof for this finite element*/
     
    24142419        /*Initialize Element matrix and vectors*/
    24152420        ElementMatrix* Ke     = element->NewElementMatrix(HOApproximationEnum);
    2416         IssmDouble*    B      = xNew<IssmDouble>(bsize*numdof);
    2417         IssmDouble*    Bprime = xNew<IssmDouble>(bsize*numdof);
    2418         IssmDouble*    D      = xNewZeroInit<IssmDouble>(bsize*bsize);
     2421        IssmDouble*    dbasis = xNew<IssmDouble>(dim*numnodes);
    24192422
    24202423        /*Retrieve all inputs and parameters*/
     
    24362439
    24372440                element->JacobianDeterminant(&Jdet,xyz_list,gauss);
    2438                 this->GetBHO(B,element,dim,xyz_list,gauss);
    2439                 this->GetBHOprime(Bprime,element,dim,xyz_list,gauss);
    2440 
     2441                element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
    24412442                element->material->ViscosityHO(&viscosity,dim,xyz_list,gauss,vx_input,vy_input);
    24422443                element->material->ViscosityHO(&oldviscosity,dim,xyz_list,gauss,vxold_input,vyold_input);
    24432444
    24442445                newviscosity=viscosity+viscosity_overshoot*(viscosity-oldviscosity);
    2445                 D_scalar=2.*newviscosity*gauss->weight*Jdet;
    2446                 for(int i=0;i<bsize;i++) D[i*bsize+i]=D_scalar;
    2447 
    2448                 TripleMultiply(B,bsize,numdof,1,
    2449                                         D,bsize,bsize,0,
    2450                                         Bprime,bsize,numdof,0,
    2451                                         &Ke->values[0],1);
     2446
     2447                if(dim==3){
     2448                        for(int i=0;i<numnodes;i++){
     2449                                for(int j=0;j<numnodes;j++){
     2450                                        Ke->values[2*i*2*numnodes+2*j] += gauss->weight*Jdet*newviscosity*(
     2451                                                                4.*dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + dbasis[1*numnodes+j]*dbasis[1*numnodes+i] + dbasis[2*numnodes+j]*dbasis[2*numnodes+i]
     2452                                                                );
     2453                                        Ke->values[2*i*2*numnodes+2*j+1] += gauss->weight*Jdet*newviscosity*(
     2454                                                                2.*dbasis[1*numnodes+j]*dbasis[0*numnodes+i] + dbasis[0*numnodes+j]*dbasis[1*numnodes+i]
     2455                                                                );
     2456                                        Ke->values[(2*i+1)*2*numnodes+2*j] += gauss->weight*Jdet*newviscosity*(
     2457                                                                2.*dbasis[0*numnodes+j]*dbasis[1*numnodes+i] + dbasis[1*numnodes+j]*dbasis[0*numnodes+i]
     2458                                                                );
     2459                                        Ke->values[(2*i+1)*2*numnodes+2*j+1] += gauss->weight*Jdet*newviscosity*(
     2460                                                                dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + 4.*dbasis[1*numnodes+j]*dbasis[1*numnodes+i] + dbasis[2*numnodes+j]*dbasis[2*numnodes+i]
     2461                                                                );
     2462                                }
     2463                        }
     2464                }
     2465                else{
     2466                        for(int i=0;i<numnodes;i++){
     2467                                for(int j=0;j<numnodes;j++){
     2468                                        Ke->values[i*numnodes+j] += gauss->weight*Jdet*newviscosity*(
     2469                                                                4.*dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + dbasis[1*numnodes+j]*dbasis[1*numnodes+i]
     2470                                                                );
     2471                                }
     2472                        }
     2473                }
    24522474        }
    24532475
     
    24582480        delete gauss;
    24592481        xDelete<IssmDouble>(xyz_list);
    2460         xDelete<IssmDouble>(D);
    2461         xDelete<IssmDouble>(Bprime);
    2462         xDelete<IssmDouble>(B);
     2482        xDelete<IssmDouble>(dbasis);
    24632483        return Ke;
    24642484}/*}}}*/
Note: See TracChangeset for help on using the changeset viewer.