Changeset 22523


Ignore:
Timestamp:
03/11/18 14:38:34 (7 years ago)
Author:
Mathieu Morlighem
Message:

CHG: removing TripleMultiply where needed

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

Legend:

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

    r22492 r22523  
    156156        /*Intermediaries */
    157157        int  stabilization,dim, domaintype, calvinglaw;
    158         int i, row, col;
     158        int i,j,k,row, col;
    159159        IssmDouble kappa;
    160160        IssmDouble Jdet, dt, D_scalar;
    161161        IssmDouble h,hx,hy,hz;
    162         IssmDouble vel;
     162        IssmDouble vel,v[3],w[3],c[3],m[3],dlsf[3];
    163163        IssmDouble norm_dlsf, norm_calving, calvingrate, meltingrate, groundedice;
    164164        IssmDouble calvingmax, calvinghaf, heaviside, haf_eps;
     
    184184        ElementMatrix* Ke       = basalelement->NewElementMatrix();
    185185        IssmDouble*    basis    = xNew<IssmDouble>(numnodes);
    186         IssmDouble*    B        = xNew<IssmDouble>(dim*numnodes);
    187         IssmDouble*    Bprime   = xNew<IssmDouble>(dim*numnodes);
    188         IssmDouble*    D        = xNew<IssmDouble>(dim*dim);
    189         IssmDouble*    v        = xNew<IssmDouble>(dim);
    190         IssmDouble*    w        = xNew<IssmDouble>(dim);
    191         IssmDouble*    c        = xNewZeroInit<IssmDouble>(dim);
    192         IssmDouble*    m        = xNewZeroInit<IssmDouble>(dim);
    193         IssmDouble*    dlsf     = xNew<IssmDouble>(dim);
     186        IssmDouble*    dbasis   = xNew<IssmDouble>(2*numnodes);
     187        IssmDouble*    Bprime = NULL;
     188        if(stabilization==2){
     189                Bprime   = xNew<IssmDouble>(dim*numnodes);
     190        }
    194191
    195192        /*Retrieve all inputs and parameters*/
     
    283280
    284281                basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
     282                basalelement->NodalFunctions(basis,gauss);
     283                basalelement->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
    285284                D_scalar=gauss->weight*Jdet;
    286285
    287286                /* Transient */
    288287                if(dt!=0.){
    289                         basalelement->NodalFunctions(basis,gauss);
    290                         TripleMultiply(basis,numnodes,1,0,
    291                                                 &D_scalar,1,1,0,
    292                                                 basis,1,numnodes,0,
    293                                                 &Ke->values[0],1);
    294                         D_scalar*=dt;
     288                        for(i=0;i<numnodes;i++){
     289                                for(j=0;j<numnodes;j++){
     290                                        Ke->values[i*numnodes+j] += D_scalar*basis[j]*basis[i];
     291                                }
     292                        }
     293                        D_scalar=D_scalar*dt;
    295294                }
    296295
    297296                /* Advection */
    298                 GetB(B,basalelement,xyz_list,gauss);
    299                 GetBprime(Bprime,basalelement,xyz_list,gauss);
    300297                vx_input->GetInputValue(&v[0],gauss);
    301298                vy_input->GetInputValue(&v[1],gauss);
     
    458455
    459456                /*Compute D*/
    460                 for(row=0;row<dim;row++){
    461                         for(col=0;col<dim;col++){
    462                                 if(row==col)
    463                                  D[row*dim+col]=D_scalar*w[row];
    464                                 else
    465                                  D[row*dim+col]=0.;
     457                for(i=0;i<numnodes;i++){
     458                        for(j=0;j<numnodes;j++){
     459                                for(k=0;k<dim;k++){
     460                                        Ke->values[i*numnodes+j] += D_scalar*w[k]*dbasis[k*numnodes+j]*basis[i];
     461                                }
    466462                        }
    467463                }
    468 
    469                 TripleMultiply(B,dim,numnodes,1,
    470                                         D,dim,dim,0,
    471                                         Bprime,dim,numnodes,0,
    472                                         &Ke->values[0],1);
    473464
    474465                /* Stabilization */
     
    485476                                h=sqrt( pow(hx*w[0]/vel,2) + pow(hy*w[1]/vel,2) );
    486477                                kappa=h*vel/2.;
    487                                 for(row=0;row<dim;row++)
    488                                         for(col=0;col<dim;col++)
    489                                         if(row==col)
    490                                                 D[row*dim+col]=D_scalar*kappa;
    491                                         else
    492                                                 D[row*dim+col]=0.;
    493 
    494                                 TripleMultiply(Bprime,dim,numnodes,1,
    495                                                         D,dim,dim,0,
    496                                                         Bprime,dim,numnodes,0,
    497                                                         &Ke->values[0],1);
     478                                for(i=0;i<numnodes;i++){
     479                                        for(j=0;j<numnodes;j++){
     480                                                for(k=0;k<dim;k++){
     481                                                        Ke->values[i*numnodes+j] += D_scalar*kappa*dbasis[k*numnodes+j]*dbasis[k*numnodes+i];
     482                                                }
     483                                        }
     484                                }
    498485                                break; 
    499486                        case 2:
     
    501488                                basalelement->ElementSizes(&hx,&hy,&hz);
    502489                                h=sqrt( pow(hx*w[0]/vel,2) + pow(hy*w[1]/vel,2) );
     490                                IssmDouble D[3*3];
    503491                                for(row=0;row<dim;row++)
    504492                                        for(col=0;col<dim;col++)
    505493                                                D[row*dim+col] = D_scalar*h/(2.*vel)*w[row]*w[col];
     494                                GetBprime(Bprime,basalelement,xyz_list,gauss);
    506495
    507496                                TripleMultiply(Bprime,dim,numnodes,1,
    508                                                         D,dim,dim,0,
     497                                                        &D[0],dim,dim,0,
    509498                                                        Bprime,dim,numnodes,0,
    510499                                                        &Ke->values[0],1);
     
    518507        xDelete<IssmDouble>(xyz_list);
    519508        xDelete<IssmDouble>(basis);
    520         xDelete<IssmDouble>(B);
    521         xDelete<IssmDouble>(D);
     509        xDelete<IssmDouble>(dbasis);
    522510        xDelete<IssmDouble>(Bprime);
    523         xDelete<IssmDouble>(v);
    524         xDelete<IssmDouble>(w);
    525         xDelete<IssmDouble>(c);
    526         xDelete<IssmDouble>(m);
    527         xDelete<IssmDouble>(dlsf);
    528511        delete gauss;
    529512        if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
  • issm/trunk-jpl/src/c/analyses/ThermalAnalysis.cpp

    r22511 r22523  
    461461                }
    462462                else if(stabilization==2){
    463                         element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss);
    464463                        tau_parameter=element->StabilizationParameter(u-um,v-vm,w-wm,diameter,kappa);
    465464                        for(int i=0;i<numnodes;i++){
Note: See TracChangeset for help on using the changeset viewer.