Ice Sheet System Model  4.18
Code documentation
Macros | Functions
solutionsequence_fct.cpp File Reference

: numerical core of flux corrected transport solution More...

#include "../toolkits/toolkits.h"
#include "../classes/classes.h"
#include "../shared/shared.h"
#include "../modules/modules.h"
#include "../analyses/analyses.h"

Go to the source code of this file.

Macros

#define USEPENALTYMETHOD   false
 

Functions

void solutionsequence_fct (FemModel *femmodel)
 

Detailed Description

: numerical core of flux corrected transport solution

Definition in file solutionsequence_fct.cpp.

Macro Definition Documentation

◆ USEPENALTYMETHOD

#define USEPENALTYMETHOD   false

Definition at line 10 of file solutionsequence_fct.cpp.

Function Documentation

◆ solutionsequence_fct()

void solutionsequence_fct ( FemModel femmodel)

Definition at line 388 of file solutionsequence_fct.cpp.

388  {/*{{{*/
389 
390  /*intermediary: */
391  IssmDouble theta,deltat,dmax;
392  int configuration_type,analysis_type;
393  Matrix<IssmDouble>* K = NULL;
394  Matrix<IssmDouble>* Mc = NULL;
395  Vector<IssmDouble>* p = NULL;
396  Vector<IssmDouble>* ug = NULL;
397  Vector<IssmDouble>* uf = NULL;
398  MasstransportAnalysis* manalysis = NULL;
399  DamageEvolutionAnalysis* danalysis = NULL;
400 
401  /*Recover parameters: */
403  femmodel->parameters->FindParam(&configuration_type,ConfigurationTypeEnum);
405  theta = 0.5; //0.5==Crank-Nicolson, 1==Backward Euler
406 
407  /*Create analysis*/
408  femmodel->parameters->FindParam(&analysis_type,AnalysisTypeEnum);
409  switch(analysis_type){
411  manalysis = new MasstransportAnalysis();
412  manalysis->MassMatrix(&Mc,femmodel);
413  manalysis->FctKMatrix(&K,NULL,femmodel);
414  manalysis->FctPVector(&p,femmodel);
415  break;
417  danalysis = new DamageEvolutionAnalysis();
418  danalysis->MassMatrix(&Mc,femmodel);
419  danalysis->FctKMatrix(&K,NULL,femmodel);
420  break;
421  default: _error_("analysis type " << EnumToStringx(analysis_type) << " not supported for FCT\n");
422  }
423  delete manalysis;
424  delete danalysis;
425 
426  #ifdef _HAVE_PETSC_
427 
428  /*Convert matrices to PETSc matrices*/
429  Mat D_petsc = NULL;
430  Mat LHS = NULL;
431  Vec RHS = NULL;
432  Vec u = NULL;
433  Vec udot = NULL;
434  Mat K_petsc = K->pmatrix->matrix;
435  Mat Mc_petsc = Mc->pmatrix->matrix;
436  Vec p_petsc = p->pvector->vector;
437 
438  /*Get previous solution u^n*/
441  delete ug;
442 
443  /*Compute lumped mass matrix*/
444  Vec Ml_petsc = NULL;
445  VecDuplicate(uf->pvector->vector,&Ml_petsc);
446  MatGetRowSum(Mc_petsc,Ml_petsc);
447 
448  /*Create D Matrix*/
449  CreateDMatrix(&D_petsc,K_petsc);
450 
451  /*Create LHS: [ML - theta*detlat *(K+D)^n+1]*/
452  CreateLHS(&LHS,&dmax,K_petsc,D_petsc,Ml_petsc,theta,deltat,femmodel,configuration_type);
453 
454  /*Create RHS: [ML + (1 - theta) deltaT L^n] u^n */
455  CreateRHS(&RHS,K_petsc,D_petsc,Ml_petsc,p_petsc,uf->pvector->vector,theta,deltat,dmax,femmodel,configuration_type);
456  delete uf;
457  delete p;
458 
459  /*Go solve lower order solution*/
461  SolverxPetsc(&u,LHS,RHS,NULL,NULL, femmodel->parameters);
463  MatFree(&LHS);
464  VecFree(&RHS);
465 
466  /*Richardson to calculate udot*/
467  RichardsonUdot(&udot,u,Ml_petsc,K_petsc,Mc_petsc);
468  delete K;
469 
470  /*Serialize u and udot*/
471  IssmDouble* udot_serial = NULL;
472  IssmDouble* u_serial = NULL;
473  IssmDouble* ml_serial = NULL;
474  VecToMPISerial(&udot_serial,udot ,IssmComm::GetComm());
475  VecToMPISerial(&u_serial ,u ,IssmComm::GetComm());
476  VecToMPISerial(&ml_serial ,Ml_petsc,IssmComm::GetComm());
477 
478  /*Anti diffusive fluxes*/
479  Vec Fbar = NULL;
480  IssmDouble *Ri_minus_serial = NULL;
481  IssmDouble *Ri_plus_serial = NULL;
482  IssmDouble *ulmin = NULL;
483  IssmDouble *ulmax = NULL;
484  femmodel->GetInputLocalMinMaxOnNodesx(&ulmin,&ulmax,u_serial);
485  CreateRis(&Ri_plus_serial,&Ri_minus_serial,Mc_petsc,D_petsc,ml_serial,u,u_serial,udot_serial,ulmin,ulmax,deltat);
486  CreateFbar(&Fbar,Ri_plus_serial,Ri_minus_serial,Mc_petsc,D_petsc,udot_serial,u_serial,u);
487  xDelete<IssmDouble>(Ri_plus_serial);
488  xDelete<IssmDouble>(Ri_minus_serial);
489  xDelete<IssmDouble>(ulmin);
490  xDelete<IssmDouble>(ulmax);
491 
492  /*Clean up*/
493  MatFree(&D_petsc);
494  delete Mc;
495  xDelete<IssmDouble>(udot_serial);
496  xDelete<IssmDouble>(u_serial);
497  xDelete<IssmDouble>(ml_serial);
498 
499  /*Compute solution u^n+1 = u_L + deltat Ml^-1 fbar*/
500  UpdateSolution(u,udot,Ml_petsc,Fbar,deltat);
501  uf =new Vector<IssmDouble>(u);
502  VecFree(&u);
503  VecFree(&Fbar);
504  VecFree(&udot);
505  VecFree(&Ml_petsc);
506 
507  /*Update Element inputs*/
509  delete uf;
510 
511  #else
512  _error_("PETSc needs to be installed");
513  #endif
514 }/*}}}*/
Matrix< IssmDouble >
SOLVER
#define SOLVER
Definition: Profiler.h:16
IssmDouble
double IssmDouble
Definition: types.h:37
MasstransportAnalysisEnum
@ MasstransportAnalysisEnum
Definition: EnumDefinitions.h:1163
FemModel::parameters
Parameters * parameters
Definition: FemModel.h:46
IssmComm::GetComm
static ISSM_MPI_Comm GetComm(void)
Definition: IssmComm.cpp:30
TimesteppingTimeStepEnum
@ TimesteppingTimeStepEnum
Definition: EnumDefinitions.h:433
DamageEvolutionAnalysisEnum
@ DamageEvolutionAnalysisEnum
Definition: EnumDefinitions.h:1026
VecFree
void VecFree(Vec *pvec)
Definition: VecFree.cpp:16
SolverxPetsc
void SolverxPetsc(Vec *puf, Mat Kff, Vec pf, Vec uf0, Vec df, Parameters *parameters)
Definition: PetscSolver.cpp:35
MasstransportAnalysis::MassMatrix
void MassMatrix(Matrix< IssmDouble > **pMff, FemModel *femmodel)
Definition: MasstransportAnalysis.cpp:1176
FemModel::UpdateConstraintsx
void UpdateConstraintsx(void)
Definition: FemModel.cpp:3027
FemModel::nodes
Nodes * nodes
Definition: FemModel.h:56
VecToMPISerial
int VecToMPISerial(double **pgathered_vector, Vec vector, ISSM_MPI_Comm comm, bool broadcast=true)
Definition: VecToMPISerial.cpp:14
FemModel::GetInputLocalMinMaxOnNodesx
void GetInputLocalMinMaxOnNodesx(IssmDouble **pmin, IssmDouble **pmax, IssmDouble *ug)
Definition: FemModel.cpp:1308
EnumToStringx
const char * EnumToStringx(int enum_in)
Definition: EnumToStringx.cpp:15
ConfigurationTypeEnum
@ ConfigurationTypeEnum
Definition: EnumDefinitions.h:101
DamageEvolutionAnalysis::FctKMatrix
void FctKMatrix(Matrix< IssmDouble > **pKff, Matrix< IssmDouble > **pKfs, FemModel *femmodel)
Definition: DamageEvolutionAnalysis.cpp:868
Profiler::Stop
void Stop(int tagenum, bool dontmpisync=true)
Definition: Profiler.cpp:179
Reducevectorgtofx
void Reducevectorgtofx(Vector< IssmDouble > **puf, Vector< IssmDouble > *ug, Nodes *nodes, Parameters *parameters)
Definition: Reducevectorgtofx.cpp:8
MasstransportAnalysis::FctKMatrix
void FctKMatrix(Matrix< IssmDouble > **pKff, Matrix< IssmDouble > **pKfs, FemModel *femmodel)
Definition: MasstransportAnalysis.cpp:1128
DamageEvolutionAnalysis
Definition: DamageEvolutionAnalysis.h:11
MatFree
void MatFree(Mat *pmat)
Definition: MatFree.cpp:16
_error_
#define _error_(StreamArgs)
Definition: exceptions.h:49
Profiler::Start
void Start(int tagenum, bool dontmpisync=true)
Definition: Profiler.cpp:139
InputUpdateFromSolutionx
void InputUpdateFromSolutionx(FemModel *femmodel, Vector< IssmDouble > *solution)
Definition: InputUpdateFromSolutionx.cpp:9
GetSolutionFromInputsx
void GetSolutionFromInputsx(Vector< IssmDouble > **psolution, FemModel *femmodel)
Definition: GetSolutionFromInputsx.cpp:9
Parameters::FindParam
void FindParam(bool *pinteger, int enum_type)
Definition: Parameters.cpp:262
AnalysisTypeEnum
@ AnalysisTypeEnum
Definition: EnumDefinitions.h:36
DamageEvolutionAnalysis::MassMatrix
void MassMatrix(Matrix< IssmDouble > **pMff, FemModel *femmodel)
Definition: DamageEvolutionAnalysis.cpp:896
MasstransportAnalysis::FctPVector
void FctPVector(Vector< IssmDouble > **ppf, FemModel *femmodel)
Definition: MasstransportAnalysis.cpp:1156
FemModel::profiler
Profiler * profiler
Definition: FemModel.h:42
Vector< IssmDouble >
MasstransportAnalysis
Definition: MasstransportAnalysis.h:11
femmodel
FemModel * femmodel
Definition: esmfbinders.cpp:16