source:
issm/oecreview/Archive/22819-23185/ISSM-23161-23162.diff
Last change on this file was 23186, checked in by , 7 years ago | |
---|---|
File size: 4.6 KB |
-
../trunk-jpl/src/c/analyses/StressbalanceAnalysis.h
73 73 ElementMatrix* CreateKMatrixFSViscous(Element* element); 74 74 ElementMatrix* CreateKMatrixFSViscousLA(Element* element); 75 75 ElementMatrix* CreateKMatrixFSViscousXTH(Element* element); 76 ElementMatrix* CreatePressureMassMatrix(Element* element); 76 77 ElementVector* CreatePVectorFS(Element* element); 77 78 ElementVector* CreatePVectorFSFriction(Element* element); 78 79 ElementVector* CreatePVectorFSFront(Element* element); -
../trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
3242 3242 xDelete<int>(cs_list); 3243 3243 return Ke; 3244 3244 }/*}}}*/ 3245 ElementMatrix* 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 }/*}}}*/ 3245 3295 ElementMatrix* StressbalanceAnalysis::CreateKMatrixFSViscousLA(Element* element){/*{{{*/ 3246 3296 3247 3297 /*Intermediaries*/ -
../trunk-jpl/src/c/solutionsequences/solutionsequence_schurcg.cpp
10 10 #include "../analyses/analyses.h" 11 11 12 12 #ifdef _HAVE_PETSC_ 13 void SchurCGSolver(Vector<IssmDouble>** puf,Mat Kff, 13 void SchurCGSolver(Vector<IssmDouble>** puf,Mat Kff,Mat Mff,Vec pf, Vec uf0,Vec df,Parameters* parameters){/*{{{*/ 14 14 15 15 /*Initialize output*/ 16 16 Vec uf = NULL; … … 34 34 Vector<IssmDouble>* pf0 = NULL; 35 35 Vector<IssmDouble>* df = NULL; 36 36 Vector<IssmDouble>* ys = NULL; 37 Matrix<IssmDouble>* Mff = NULL; 37 38 38 39 /*parameters:*/ 39 40 int max_nonlinear_iterations; … … 71 72 CreateNodalConstraintsx(&ys,femmodel->nodes,configuration_type); 72 73 Reduceloadx(pf, Kfs, ys); delete Kfs; 73 74 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 74 89 /*Solve*/ 75 90 femmodel->profiler->Start(SOLVER); 76 91 _assert_(Kff->type==PetscMatType); 77 92 SchurCGSolver(&uf, 78 93 Kff->pmatrix->matrix, 94 Mff->pmatrix->matrix, 79 95 pf->pvector->vector, 80 96 old_uf->pvector->vector, 81 97 df->pvector->vector, 82 98 femmodel->parameters); 83 99 femmodel->profiler->Stop(SOLVER); 84 delete pf0; 100 delete pf0; delete Mff; 85 101 86 102 /*Merge solution from f set to g set*/ 87 103 Mergesolutionfromftogx(&ug, uf,ys,femmodel->nodes,femmodel->parameters);delete ys;
Note:
See TracBrowser
for help on using the repository browser.