[23390] | 1 | Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.h
|
---|
| 2 | ===================================================================
|
---|
| 3 | --- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.h (revision 23198)
|
---|
| 4 | +++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.h (revision 23199)
|
---|
| 5 | @@ -74,6 +74,7 @@
|
---|
| 6 | ElementMatrix* CreateKMatrixFSViscousLA(Element* element);
|
---|
| 7 | ElementMatrix* CreateKMatrixFSViscousXTH(Element* element);
|
---|
| 8 | ElementMatrix* CreatePressureMassMatrix(Element* element);
|
---|
| 9 | + ElementMatrix* CreateSchurPrecondMatrix(Element* element);
|
---|
| 10 | ElementVector* CreatePVectorFS(Element* element);
|
---|
| 11 | ElementVector* CreatePVectorFSFriction(Element* element);
|
---|
| 12 | ElementVector* CreatePVectorFSFront(Element* element);
|
---|
| 13 | Index: ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
|
---|
| 14 | ===================================================================
|
---|
| 15 | --- ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp (revision 23198)
|
---|
| 16 | +++ ../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp (revision 23199)
|
---|
| 17 | @@ -944,9 +944,11 @@
|
---|
| 18 | #ifdef _HAVE_PETSC_
|
---|
| 19 | int solver_type;
|
---|
| 20 | PetscOptionsDetermineSolverType(&solver_type);
|
---|
| 21 | +
|
---|
| 22 | if(solver_type==FSSolverEnum) is_schur_cg_solver = true;
|
---|
| 23 | #endif
|
---|
| 24 |
|
---|
| 25 | +
|
---|
| 26 | if(is_schur_cg_solver)
|
---|
| 27 | solutionsequence_schurcg(femmodel);
|
---|
| 28 | else if (fe_FS==XTaylorHoodEnum)
|
---|
| 29 | @@ -3288,6 +3290,64 @@
|
---|
| 30 | xDelete<IssmDouble>(pbasis);
|
---|
| 31 | return Ke;
|
---|
| 32 | }/*}}}*/
|
---|
| 33 | +ElementMatrix* StressbalanceAnalysis::CreateSchurPrecondMatrix(Element* element){/*{{{*/
|
---|
| 34 | +
|
---|
| 35 | + /*Intermediaries*/
|
---|
| 36 | + int i,dim;
|
---|
| 37 | + IssmDouble viscosity,FSreconditioning,Jdet;
|
---|
| 38 | + IssmDouble *xyz_list = NULL;
|
---|
| 39 | +
|
---|
| 40 | + /*Get problem dimension*/
|
---|
| 41 | + element->FindParam(&dim,DomainDimensionEnum);
|
---|
| 42 | +
|
---|
| 43 | + /*Fetch number of nodes and dof for this finite element*/
|
---|
| 44 | + int vnumnodes = element->NumberofNodesVelocity();
|
---|
| 45 | + int pnumnodes = element->NumberofNodesPressure();
|
---|
| 46 | + int numdof = vnumnodes*dim + pnumnodes;
|
---|
| 47 | +
|
---|
| 48 | + /*Initialize Element matrix and vectors*/
|
---|
| 49 | + ElementMatrix* Ke = element->NewElementMatrix(FSvelocityEnum);
|
---|
| 50 | + IssmDouble* pbasis = xNew<IssmDouble>(pnumnodes);
|
---|
| 51 | +
|
---|
| 52 | + /*Retrieve all inputs and parameters*/
|
---|
| 53 | + element->GetVerticesCoordinates(&xyz_list);
|
---|
| 54 | + //element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum);
|
---|
| 55 | + Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input);
|
---|
| 56 | + Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input);
|
---|
| 57 | + Input* vz_input = NULL;
|
---|
| 58 | + if(dim==3){vz_input=element->GetInput(VzEnum); _assert_(vz_input);}
|
---|
| 59 | +
|
---|
| 60 | +
|
---|
| 61 | + /* Start looping on the number of gaussian points: */
|
---|
| 62 | + Gauss* gauss = element->NewGauss(5);
|
---|
| 63 | + for(int ig=gauss->begin();ig<gauss->end();ig++){
|
---|
| 64 | + gauss->GaussPoint(ig);
|
---|
| 65 | +
|
---|
| 66 | + element->JacobianDeterminant(&Jdet,xyz_list,gauss);
|
---|
| 67 | + element->NodalFunctionsPressure(pbasis,gauss);
|
---|
| 68 | + element->material->ViscosityFS(&viscosity,dim,xyz_list,gauss,vx_input,vy_input,vz_input);
|
---|
| 69 | +
|
---|
| 70 | +
|
---|
| 71 | + if(dim==3){
|
---|
| 72 | + /*Pressure mass matrix*/
|
---|
| 73 | + for(int k=0;k<pnumnodes;k++){
|
---|
| 74 | + for(int j=0;j<pnumnodes;j++){
|
---|
| 75 | + Ke->values[(3*vnumnodes+k)*numdof+3*vnumnodes+j] += gauss->weight*1./viscosity*Jdet*(pbasis[j]*pbasis[k]);
|
---|
| 76 | + }
|
---|
| 77 | + }
|
---|
| 78 | + }
|
---|
| 79 | + else{
|
---|
| 80 | + _error_("STOP");
|
---|
| 81 | + }
|
---|
| 82 | + }
|
---|
| 83 | +
|
---|
| 84 | + /*Clean up and return*/
|
---|
| 85 | + delete gauss;
|
---|
| 86 | + xDelete<IssmDouble>(xyz_list);
|
---|
| 87 | + xDelete<IssmDouble>(pbasis);
|
---|
| 88 | + return Ke;
|
---|
| 89 | +}/*}}}*/
|
---|
| 90 | +
|
---|
| 91 | ElementMatrix* StressbalanceAnalysis::CreateKMatrixFSViscousLA(Element* element){/*{{{*/
|
---|
| 92 |
|
---|
| 93 | /*Intermediaries*/
|
---|