source: issm/oecreview/Archive/22819-23185/ISSM-23161-23162.diff

Last change on this file was 23186, checked in by Mathieu Morlighem, 7 years ago

CHG: added Archive/22819-23185

File size: 4.6 KB
  • ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.h

     
    7373                ElementMatrix* CreateKMatrixFSViscous(Element* element);
    7474                ElementMatrix* CreateKMatrixFSViscousLA(Element* element);
    7575                ElementMatrix* CreateKMatrixFSViscousXTH(Element* element);
     76                ElementMatrix* CreatePressureMassMatrix(Element* element);
    7677                ElementVector* CreatePVectorFS(Element* element);
    7778                ElementVector* CreatePVectorFSFriction(Element* element);
    7879                ElementVector* CreatePVectorFSFront(Element* element);
  • ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp

     
    32423242        xDelete<int>(cs_list);
    32433243        return Ke;
    32443244}/*}}}*/
     3245ElementMatrix* StressbalanceAnalysis::CreatePressureMassMatrix(Element* element){/*{{{*/
     3246
     3247        /*Intermediaries*/
     3248        int         i,dim;
     3249        IssmDouble  FSreconditioning,Jdet;
     3250        IssmDouble *xyz_list = NULL;
     3251
     3252        /*Get problem dimension*/
     3253        element->FindParam(&dim,DomainDimensionEnum);
     3254
     3255        /*Fetch number of nodes and dof for this finite element*/
     3256        int vnumnodes = element->NumberofNodesVelocity();
     3257        int pnumnodes = element->NumberofNodesPressure();
     3258        int numdof    = vnumnodes*dim + pnumnodes;
     3259
     3260        /*Initialize Element matrix and vectors*/
     3261        ElementMatrix* Ke  = element->NewElementMatrix(FSvelocityEnum);
     3262        IssmDouble* pbasis = xNew<IssmDouble>(pnumnodes);
     3263
     3264        /*Retrieve all inputs and parameters*/
     3265        element->GetVerticesCoordinates(&xyz_list);
     3266        //element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum);
     3267
     3268        /* Start  looping on the number of gaussian points: */
     3269        Gauss* gauss = element->NewGauss(5);
     3270        for(int ig=gauss->begin();ig<gauss->end();ig++){
     3271                gauss->GaussPoint(ig);
     3272
     3273                element->JacobianDeterminant(&Jdet,xyz_list,gauss);
     3274                element->NodalFunctionsPressure(pbasis,gauss);
     3275
     3276                if(dim==3){
     3277                        /*Pressure mass matrix*/
     3278                        for(int k=0;k<pnumnodes;k++){
     3279                                for(int j=0;j<pnumnodes;j++){
     3280                                        Ke->values[(3*vnumnodes+k)*numdof+3*vnumnodes+j] += gauss->weight*Jdet*(pbasis[j]*pbasis[k]);
     3281                                }
     3282                        }
     3283                }
     3284                else{
     3285                        _error_("STOP");
     3286                }
     3287        }
     3288
     3289        /*Clean up and return*/
     3290        delete gauss;
     3291        xDelete<IssmDouble>(xyz_list);
     3292        xDelete<IssmDouble>(pbasis);
     3293        return Ke;
     3294}/*}}}*/
    32453295ElementMatrix* StressbalanceAnalysis::CreateKMatrixFSViscousLA(Element* element){/*{{{*/
    32463296
    32473297        /*Intermediaries*/
  • ../trunk-jpl/src/c/solutionsequences/solutionsequence_schurcg.cpp

     
    1010#include "../analyses/analyses.h"
    1111
    1212#ifdef _HAVE_PETSC_
    13 void SchurCGSolver(Vector<IssmDouble>** puf,Mat Kff, Vec pf, Vec uf0,Vec df,Parameters* parameters){/*{{{*/
     13void SchurCGSolver(Vector<IssmDouble>** puf,Mat Kff,Mat Mff,Vec pf, Vec uf0,Vec df,Parameters* parameters){/*{{{*/
    1414
    1515        /*Initialize output*/
    1616        Vec uf = NULL;
     
    3434        Vector<IssmDouble>* pf0 = NULL;
    3535        Vector<IssmDouble>* df  = NULL;
    3636        Vector<IssmDouble>* ys  = NULL;
     37        Matrix<IssmDouble>* Mff = NULL;
    3738
    3839        /*parameters:*/
    3940        int max_nonlinear_iterations;
     
    7172                CreateNodalConstraintsx(&ys,femmodel->nodes,configuration_type);
    7273                Reduceloadx(pf, Kfs, ys); delete Kfs;
    7374
     75                /*Create mass matrix*/
     76                int fsize; Kff->GetSize(&fsize,&fsize);
     77                Mff=new Matrix<IssmDouble>(fsize,fsize,100,4);
     78                StressbalanceAnalysis* analysis = new StressbalanceAnalysis();
     79                /*Get complete stiffness matrix without penalties*/
     80                for(int i=0;i<femmodel->elements->Size();i++){
     81                        Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
     82                        ElementMatrix* Me = analysis->CreatePressureMassMatrix(element);
     83                        if(Me) Me->AddToGlobal(Mff,NULL);
     84                        delete Me;
     85                }
     86                Mff->Assemble();
     87                delete analysis;
     88
    7489                /*Solve*/
    7590                femmodel->profiler->Start(SOLVER);
    7691                _assert_(Kff->type==PetscMatType);
    7792                SchurCGSolver(&uf,
    7893                                        Kff->pmatrix->matrix,
     94                                        Mff->pmatrix->matrix,
    7995                                        pf->pvector->vector,
    8096                                        old_uf->pvector->vector,
    8197                                        df->pvector->vector,
    8298                                        femmodel->parameters);
    8399                femmodel->profiler->Stop(SOLVER);
    84                 delete pf0;
     100                delete pf0; delete Mff;
    85101
    86102                /*Merge solution from f set to g set*/
    87103                Mergesolutionfromftogx(&ug, uf,ys,femmodel->nodes,femmodel->parameters);delete ys;
Note: See TracBrowser for help on using the repository browser.