source: issm/oecreview/Archive/23185-23389/ISSM-23198-23199.diff

Last change on this file was 23390, checked in by Mathieu Morlighem, 6 years ago

CHG: added Archive/23185-23389

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

     
    7474                ElementMatrix* CreateKMatrixFSViscousLA(Element* element);
    7575                ElementMatrix* CreateKMatrixFSViscousXTH(Element* element);
    7676                ElementMatrix* CreatePressureMassMatrix(Element* element);
     77                ElementMatrix* CreateSchurPrecondMatrix(Element* element);
    7778                ElementVector* CreatePVectorFS(Element* element);
    7879                ElementVector* CreatePVectorFSFriction(Element* element);
    7980                ElementVector* CreatePVectorFSFront(Element* element);
  • ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp

     
    944944                #ifdef _HAVE_PETSC_
    945945                int solver_type;
    946946                PetscOptionsDetermineSolverType(&solver_type);
     947
    947948                if(solver_type==FSSolverEnum) is_schur_cg_solver = true;
    948949                #endif
    949950
     951               
    950952                if(is_schur_cg_solver)
    951953                 solutionsequence_schurcg(femmodel);
    952954                else if (fe_FS==XTaylorHoodEnum)
     
    32883290        xDelete<IssmDouble>(pbasis);
    32893291        return Ke;
    32903292}/*}}}*/
     3293ElementMatrix* StressbalanceAnalysis::CreateSchurPrecondMatrix(Element* element){/*{{{*/
     3294
     3295        /*Intermediaries*/
     3296        int         i,dim;
     3297        IssmDouble  viscosity,FSreconditioning,Jdet;
     3298        IssmDouble *xyz_list = NULL;
     3299
     3300        /*Get problem dimension*/
     3301        element->FindParam(&dim,DomainDimensionEnum);
     3302
     3303        /*Fetch number of nodes and dof for this finite element*/
     3304        int vnumnodes = element->NumberofNodesVelocity();
     3305        int pnumnodes = element->NumberofNodesPressure();
     3306        int numdof    = vnumnodes*dim + pnumnodes;
     3307
     3308        /*Initialize Element matrix and vectors*/
     3309        ElementMatrix* Ke  = element->NewElementMatrix(FSvelocityEnum);
     3310        IssmDouble* pbasis = xNew<IssmDouble>(pnumnodes);
     3311
     3312        /*Retrieve all inputs and parameters*/
     3313        element->GetVerticesCoordinates(&xyz_list);
     3314        //element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum);
     3315        Input* vx_input=element->GetInput(VxEnum);     _assert_(vx_input);
     3316        Input* vy_input=element->GetInput(VyEnum);     _assert_(vy_input);
     3317        Input* vz_input = NULL;
     3318        if(dim==3){vz_input=element->GetInput(VzEnum); _assert_(vz_input);}
     3319
     3320
     3321        /* Start  looping on the number of gaussian points: */
     3322        Gauss* gauss = element->NewGauss(5);
     3323        for(int ig=gauss->begin();ig<gauss->end();ig++){
     3324                gauss->GaussPoint(ig);
     3325
     3326                element->JacobianDeterminant(&Jdet,xyz_list,gauss);
     3327                element->NodalFunctionsPressure(pbasis,gauss);
     3328                element->material->ViscosityFS(&viscosity,dim,xyz_list,gauss,vx_input,vy_input,vz_input);
     3329
     3330
     3331                if(dim==3){
     3332                        /*Pressure mass matrix*/
     3333                        for(int k=0;k<pnumnodes;k++){
     3334                                for(int j=0;j<pnumnodes;j++){
     3335                                        Ke->values[(3*vnumnodes+k)*numdof+3*vnumnodes+j] += gauss->weight*1./viscosity*Jdet*(pbasis[j]*pbasis[k]);
     3336                                }
     3337                        }
     3338                }
     3339                else{
     3340                        _error_("STOP");
     3341                }
     3342        }
     3343
     3344        /*Clean up and return*/
     3345        delete gauss;
     3346        xDelete<IssmDouble>(xyz_list);
     3347        xDelete<IssmDouble>(pbasis);
     3348        return Ke;
     3349}/*}}}*/
     3350
    32913351ElementMatrix* StressbalanceAnalysis::CreateKMatrixFSViscousLA(Element* element){/*{{{*/
    32923352
    32933353        /*Intermediaries*/
Note: See TracBrowser for help on using the repository browser.