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

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

CHG: added Archive/23185-23389

File size: 3.3 KB
RevLine 
[23390]1Index: ../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);
13Index: ../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*/
Note: See TracBrowser for help on using the repository browser.