Changeset 22513


Ignore:
Timestamp:
03/09/18 15:23:52 (7 years ago)
Author:
Mathieu Morlighem
Message:

CHG: switching to non matrixmultiply code

File:
1 edited

Legend:

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

    r22510 r22513  
    13071307        /*Initialize Element matrix and vectors*/
    13081308        ElementMatrix* Ke = element->NewElementMatrix(SSAApproximationEnum);
    1309         IssmDouble*    B  = xNew<IssmDouble>(dim*numdof);
    1310         IssmDouble*    D  = xNewZeroInit<IssmDouble>(dim*dim);
     1309        IssmDouble*    basis  = xNew<IssmDouble>(numnodes);
    13111310
    13121311        /*Retrieve all inputs and parameters*/
     
    13411340                }
    13421341
    1343                 this->GetBSSAFriction(B,element,dim,xyz_list,gauss);
     1342                element->NodalFunctions(basis,gauss);
    13441343                element->JacobianDeterminant(&Jdet, xyz_list,gauss);
    1345                 for(int i=0;i<dim;i++) D[i*dim+i]=alpha2*gauss->weight*Jdet;
    1346 
    1347                 TripleMultiply(B,dim,numdof,1,
    1348                                         D,dim,dim,0,
    1349                                         B,dim,numdof,0,
    1350                                         &Ke->values[0],1);
     1344
     1345                if(dim==2){
     1346                        for(int i=0;i<numnodes;i++){
     1347                                for(int j=0;j<numnodes;j++){
     1348                                        Ke->values[2*i*2*numnodes+2*j]       += alpha2*gauss->weight*Jdet*basis[i]*basis[j];
     1349                                        Ke->values[(2*i+1)*2*numnodes+2*j+1] += alpha2*gauss->weight*Jdet*basis[i]*basis[j];
     1350                                }
     1351                        }
     1352                }
     1353                else{
     1354                        for(int i=0;i<numnodes;i++){
     1355                                for(int j=0;j<numnodes;j++){
     1356                                        Ke->values[i*numnodes+j] += alpha2*gauss->weight*Jdet*basis[i]*basis[j];
     1357                                }
     1358                        }
     1359                }
    13511360        }
    13521361
     
    13581367        delete friction;
    13591368        xDelete<IssmDouble>(xyz_list);
    1360         xDelete<IssmDouble>(B);
    1361         xDelete<IssmDouble>(D);
     1369        xDelete<IssmDouble>(basis);
    13621370        return Ke;
    13631371}/*}}}*/
     
    14341442
    14351443        /*Intermediaries*/
    1436         int         dim,domaintype,bsize;
     1444        int         dim,domaintype;
    14371445        IssmDouble  viscosity,newviscosity,oldviscosity;
    14381446        IssmDouble  viscosity_overshoot,thickness,Jdet;
    1439         IssmDouble  D_scalar;
    14401447        IssmDouble *xyz_list = NULL;
    14411448
     
    14431450        element->FindParam(&domaintype,DomainTypeEnum);
    14441451        switch(domaintype){
    1445                 case Domain2DverticalEnum:   dim = 1; bsize = 1; break;
    1446                 case Domain2DhorizontalEnum: dim = 2; bsize = 3; break;
    1447                 case Domain3DEnum:           dim = 2; bsize = 3; break;
     1452                case Domain2DverticalEnum:   dim = 1; break;
     1453                case Domain2DhorizontalEnum: dim = 2; break;
     1454                case Domain3DEnum:           dim = 2; break;
    14481455                default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
    14491456        }
     
    14551462        /*Initialize Element matrix and vectors*/
    14561463        ElementMatrix* Ke     = element->NewElementMatrix(SSAApproximationEnum);
    1457         IssmDouble*    B      = xNew<IssmDouble>(bsize*numdof);
    1458         IssmDouble*    Bprime = xNew<IssmDouble>(bsize*numdof);
    1459         IssmDouble*    D      = xNewZeroInit<IssmDouble>(bsize*bsize);
     1464        IssmDouble*    dbasis = xNew<IssmDouble>(2*numnodes);
    14601465
    14611466        /*Retrieve all inputs and parameters*/
     
    14781483
    14791484                element->JacobianDeterminant(&Jdet,xyz_list,gauss);
    1480                 this->GetBSSA(B,element,dim,xyz_list,gauss);
    1481                 this->GetBSSAprime(Bprime,element,dim,xyz_list,gauss);
    1482 
     1485                element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
     1486
     1487                thickness_input->GetInputValue(&thickness, gauss);
    14831488                element->material->ViscositySSA(&viscosity,dim,xyz_list,gauss,vx_input,vy_input);
    14841489                element->material->ViscositySSA(&oldviscosity,dim,xyz_list,gauss,vxold_input,vyold_input);
    1485                 thickness_input->GetInputValue(&thickness, gauss);
    1486 
    14871490                newviscosity=viscosity+viscosity_overshoot*(viscosity-oldviscosity);
    1488                 D_scalar=2.*newviscosity*thickness*gauss->weight*Jdet;
    1489                 for(int i=0;i<bsize;i++) D[i*bsize+i]=D_scalar;
    1490 
    1491                 TripleMultiply(B,bsize,numdof,1,
    1492                                         D,bsize,bsize,0,
    1493                                         Bprime,bsize,numdof,0,
    1494                                         &Ke->values[0],1);
     1491
     1492                if(dim==2){
     1493                        for(int i=0;i<numnodes;i++){
     1494                                for(int j=0;j<numnodes;j++){
     1495                                        Ke->values[2*i*2*numnodes+2*j] += gauss->weight*Jdet*newviscosity*thickness*(
     1496                                                                4.*dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + dbasis[1*numnodes+j]*dbasis[1*numnodes+i]
     1497                                                                );
     1498                                        Ke->values[2*i*2*numnodes+2*j+1] += gauss->weight*Jdet*newviscosity*thickness*(
     1499                                                                2.*dbasis[1*numnodes+j]*dbasis[0*numnodes+i] + dbasis[0*numnodes+j]*dbasis[1*numnodes+i]
     1500                                                                );
     1501                                        Ke->values[(2*i+1)*2*numnodes+2*j] += gauss->weight*Jdet*newviscosity*thickness*(
     1502                                                                2.*dbasis[0*numnodes+j]*dbasis[1*numnodes+i] + dbasis[1*numnodes+j]*dbasis[0*numnodes+i]
     1503                                                                );
     1504                                        Ke->values[(2*i+1)*2*numnodes+2*j+1] += gauss->weight*Jdet*newviscosity*thickness*(
     1505                                                                dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + 4.*dbasis[1*numnodes+j]*dbasis[1*numnodes+i]
     1506                                                                );
     1507                                }
     1508                        }
     1509                }
     1510                else{
     1511                        for(int i=0;i<numnodes;i++){
     1512                                for(int j=0;j<numnodes;j++){
     1513                                        Ke->values[i*numnodes+j] += gauss->weight*Jdet*newviscosity*thickness*(
     1514                                                                4.*dbasis[0*numnodes+j]*dbasis[0*numnodes+i]
     1515                                                                );
     1516                                }
     1517                        }
     1518                }
    14951519        }
    14961520
     
    15011525        delete gauss;
    15021526        xDelete<IssmDouble>(xyz_list);
    1503         xDelete<IssmDouble>(D);
    1504         xDelete<IssmDouble>(Bprime);
    1505         xDelete<IssmDouble>(B);
     1527        xDelete<IssmDouble>(dbasis);
    15061528        return Ke;
    15071529}/*}}}*/
Note: See TracChangeset for help on using the changeset viewer.