source:
issm/oecreview/Archive/23185-23389/ISSM-23198-23199.diff
Last change on this file was 23390, checked in by , 6 years ago | |
---|---|
File size: 3.3 KB |
-
../trunk-jpl/src/c/analyses/StressbalanceAnalysis.h
74 74 ElementMatrix* CreateKMatrixFSViscousLA(Element* element); 75 75 ElementMatrix* CreateKMatrixFSViscousXTH(Element* element); 76 76 ElementMatrix* CreatePressureMassMatrix(Element* element); 77 ElementMatrix* CreateSchurPrecondMatrix(Element* element); 77 78 ElementVector* CreatePVectorFS(Element* element); 78 79 ElementVector* CreatePVectorFSFriction(Element* element); 79 80 ElementVector* CreatePVectorFSFront(Element* element); -
../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
944 944 #ifdef _HAVE_PETSC_ 945 945 int solver_type; 946 946 PetscOptionsDetermineSolverType(&solver_type); 947 947 948 if(solver_type==FSSolverEnum) is_schur_cg_solver = true; 948 949 #endif 949 950 951 950 952 if(is_schur_cg_solver) 951 953 solutionsequence_schurcg(femmodel); 952 954 else if (fe_FS==XTaylorHoodEnum) … … 3288 3290 xDelete<IssmDouble>(pbasis); 3289 3291 return Ke; 3290 3292 }/*}}}*/ 3293 ElementMatrix* 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 3291 3351 ElementMatrix* StressbalanceAnalysis::CreateKMatrixFSViscousLA(Element* element){/*{{{*/ 3292 3352 3293 3353 /*Intermediaries*/
Note:
See TracBrowser
for help on using the repository browser.