Ice Sheet System Model  4.18
Code documentation
Functions
solutionsequence_la_theta.cpp File Reference

: numerical core of la_theta solutions More...

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

Go to the source code of this file.

Functions

void solutionsequence_la_theta (FemModel *femmodel)
 

Detailed Description

: numerical core of la_theta solutions

Definition in file solutionsequence_la_theta.cpp.

Function Documentation

◆ solutionsequence_la_theta()

void solutionsequence_la_theta ( FemModel femmodel)

Definition at line 10 of file solutionsequence_la_theta.cpp.

10  {
11 
12  /*intermediary: */
13  Matrix<IssmDouble>* Kff = NULL;
14  Matrix<IssmDouble>* Kfs = NULL;
15  Vector<IssmDouble>* ug_old = NULL;
16  Vector<IssmDouble>* ug = NULL;
17  Vector<IssmDouble>* uf = NULL;
18  Vector<IssmDouble>* pf = NULL;
19  Vector<IssmDouble>* df = NULL;
20  Vector<IssmDouble>* ys = NULL;
21  IssmDouble eps_rel,r,theta; // 0<theta<.5 -> .15<theta<.45
22  int max_nonlinear_iterations;
23 
24  /*Create analysis*/
26 
27  /*Recover parameters: */
29  femmodel->parameters->FindParam(&max_nonlinear_iterations,StressbalanceMaxiterEnum);
32 
33  /*Update constraints and initialize d and tau if necessary*/
36 
37  /*Convergence criterion*/
38  int count = 0;
40  Vector<IssmDouble>* vx = NULL;
41  Vector<IssmDouble>* vx_old = NULL;
43 
44  while(true){
45  count++;
46 
47  /*save pointer to old velocity*/
48  delete ug_old;ug_old=ug;
49  delete vx_old;vx_old=vx;
50 
51  /*Calculate d*/
52  if(theta>0.){
54  }
55 
56  /*Solve KU=F*/
57  SystemMatricesx(&Kff,&Kfs,&pf,&df,NULL,femmodel);
59  Reduceloadx(pf, Kfs, ys); delete Kfs;
60 
62  Solverx(&uf, Kff, pf, NULL, df, femmodel->parameters);
64 
65  delete Kff; delete pf; delete df;
66  Mergesolutionfromftogx(&ug, uf,ys,femmodel->nodes,femmodel->parameters);delete uf; delete ys;
67 
68  /*Update solution*/
70 
71  /*Update d and tau accordingly*/
75 
76  /*Check for convergence*/
77  //Vector<IssmDouble>* dug=ug_old->Duplicate(); ug_old->Copy(dug); dug->AYPX(ug,-1.0);
78  //IssmDouble ndu=dug->Norm(NORM_TWO); delete dug;
79  //IssmDouble nu =ug_old->Norm(NORM_TWO);
80  Vector<IssmDouble>* dvx=vx_old->Duplicate(); vx_old->Copy(dvx); dvx->AYPX(vx,-1.0);
81  IssmDouble ndu=dvx->Norm(NORM_TWO); delete dvx;
82  IssmDouble nu =vx_old->Norm(NORM_TWO);
83  if (xIsNan<IssmDouble>(ndu) || xIsNan<IssmDouble>(nu)) _error_("convergence criterion is NaN!");
84  if((ndu/nu)<eps_rel){
85  if(VerboseConvergence()) _printf0_(setw(50) << left << " Convergence criterion: norm(du)/norm(u)" << ndu/nu*100 << " < " << eps_rel*100 << " %\n");
86  break;
87  }
88  else{
89  if(VerboseConvergence()) _printf0_(setw(50) << left << " Convergence criterion: norm(du)/norm(u)" << ndu/nu*100 << " > " << eps_rel*100 << " %\n");
90  }
91 
92  if(count>=max_nonlinear_iterations){
93  _printf0_(" maximum number of nonlinear iterations (" << max_nonlinear_iterations << ") exceeded\n");
94  break;
95  }
96  }
97 
98  if(VerboseConvergence()) _printf0_("\n total number of iterations: " << count-1 << "\n");
99 
100  delete ug;
101  delete ug_old;
102  delete vx;
103  delete vx_old;
104  delete analysis;
105 }
Matrix< IssmDouble >
SOLVER
#define SOLVER
Definition: Profiler.h:16
StressbalanceAnalysis
Definition: StressbalanceAnalysis.h:11
Mergesolutionfromftogx
void Mergesolutionfromftogx(Vector< IssmDouble > **pug, Vector< IssmDouble > *uf, Vector< IssmDouble > *ys, Nodes *nodes, Parameters *parameters, bool flag_ys0)
Definition: Mergesolutionfromftogx.cpp:8
IssmDouble
double IssmDouble
Definition: types.h:37
_printf0_
#define _printf0_(StreamArgs)
Definition: Print.h:29
VerboseConvergence
bool VerboseConvergence(void)
Definition: Verbosity.cpp:26
FemModel::parameters
Parameters * parameters
Definition: FemModel.h:46
GetVectorFromInputsx
void GetVectorFromInputsx(IssmDouble **pvector, int *pvector_size, FemModel *femmodel, int name)
Definition: GetVectorFromInputsx.cpp:81
Solverx
void Solverx(Vector< IssmDouble > **puf, Matrix< IssmDouble > *Kff, Vector< IssmDouble > *pf, Vector< IssmDouble > *uf0, Vector< IssmDouble > *df, Parameters *parameters)
Definition: Solverx.cpp:15
Vector::Duplicate
Vector< doubletype > * Duplicate(void)
Definition: Vector.h:230
AugmentedLagrangianThetaEnum
@ AugmentedLagrangianThetaEnum
Definition: EnumDefinitions.h:41
NORM_TWO
@ NORM_TWO
Definition: toolkitsenums.h:15
StressbalanceMaxiterEnum
@ StressbalanceMaxiterEnum
Definition: EnumDefinitions.h:407
Vector::Norm
doubletype Norm(NormMode norm_type)
Definition: Vector.h:342
FemModel::UpdateConstraintsx
void UpdateConstraintsx(void)
Definition: FemModel.cpp:3027
FemModel::nodes
Nodes * nodes
Definition: FemModel.h:56
StressbalanceReltolEnum
@ StressbalanceReltolEnum
Definition: EnumDefinitions.h:410
Profiler::Stop
void Stop(int tagenum, bool dontmpisync=true)
Definition: Profiler.cpp:179
FemModel::elements
Elements * elements
Definition: FemModel.h:44
StressbalanceAnalysis::InputUpdateFromSolutionFSXTH_tau
void InputUpdateFromSolutionFSXTH_tau(Elements *elements, Parameters *parameters)
Definition: StressbalanceAnalysis.cpp:5535
VertexPIdEnum
@ VertexPIdEnum
Definition: EnumDefinitions.h:1324
Reduceloadx
void Reduceloadx(Vector< IssmDouble > *pf, Matrix< IssmDouble > *Kfs, Vector< IssmDouble > *y_s, bool flag_ys0)
Definition: Reduceloadx.cpp:14
StressbalanceAnalysis::InputUpdateFromSolutionFSXTH_d
void InputUpdateFromSolutionFSXTH_d(Elements *elements, Parameters *parameters)
Definition: StressbalanceAnalysis.cpp:5322
Vector::AYPX
void AYPX(Vector *X, doubletype a)
Definition: Vector.h:267
StressbalanceAnalysis::InitializeXTH
void InitializeXTH(Elements *elements, Parameters *parameters)
Definition: StressbalanceAnalysis.cpp:5155
_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
VxEnum
@ VxEnum
Definition: EnumDefinitions.h:846
Parameters::FindParam
void FindParam(bool *pinteger, int enum_type)
Definition: Parameters.cpp:262
AugmentedLagrangianREnum
@ AugmentedLagrangianREnum
Definition: EnumDefinitions.h:37
Vector::Copy
void Copy(Vector *to)
Definition: Vector.h:319
CreateNodalConstraintsx
void CreateNodalConstraintsx(Vector< IssmDouble > **pys, Nodes *nodes)
Definition: CreateNodalConstraintsx.cpp:10
SystemMatricesx
void SystemMatricesx(Matrix< IssmDouble > **pKff, Matrix< IssmDouble > **pKfs, Vector< IssmDouble > **ppf, Vector< IssmDouble > **pdf, IssmDouble *pkmax, FemModel *femmodel, bool isAllocated)
Definition: SystemMatricesx.cpp:10
FemModel::profiler
Profiler * profiler
Definition: FemModel.h:42
Vector< IssmDouble >
femmodel
FemModel * femmodel
Definition: esmfbinders.cpp:16