 |
Ice Sheet System Model
4.18
Code documentation
|
Go to the documentation of this file.
5 #include "../toolkits/toolkits.h"
6 #include "../classes/classes.h"
7 #include "../shared/shared.h"
8 #include "../modules/modules.h"
10 #include "../solutionsequences/solutionsequences.h"
38 bool sedconverged,eplconverged,hydroconverged;
39 bool isefficientlayer;
40 int constraints_converged;
41 int num_unstable_constraints;
42 int sedcount,eplcount,hydrocount;
57 if(!isefficientlayer) hydroconverged=
true;
62 if(isefficientlayer) {
84 ug_sed->
Copy(ug_sed_main_iter);
86 ug_epl->
Copy(ug_epl_main_iter);
101 uf_sed->
Copy(uf_sed_sub_iter);
115 delete Kff;
delete pf;
delete df;
123 if(num_unstable_constraints==0) sedconverged =
true;
124 if (sedcount>=hydro_maxiter){
125 _error_(
" maximum number of Sediment iterations (" << hydro_maxiter <<
") exceeded");
130 if(sedconverged)
break;
138 uf_sed_sub_iter->
Copy(duf);
139 duf->
AYPX(uf_sed,-1.0);
143 if (xIsNan<IssmDouble>(ndu_sed) || xIsNan<IssmDouble>(nu_sed))
_error_(
"convergence criterion is NaN!");
144 if (ndu_sed==0.0 && nu_sed==0.0) nu_sed=1.0e-6;
145 if(
VerboseConvergence())
_printf0_(setw(50) << left <<
" Inner Sediment Convergence criterion:" << ndu_sed/nu_sed*100 <<
"%, aiming lower than " << eps_hyd*10*100 <<
" %\n");
146 if((ndu_sed/nu_sed)<eps_hyd*10.){
150 delete uf_sed_sub_iter;
161 if(isefficientlayer){
172 ug_epl->
Copy(ug_epl_sub_iter);
198 delete Kff;
delete pf;
delete df;
199 delete uf_epl_sub_iter;
201 uf_epl->
Copy(uf_epl_sub_iter);
208 ug_epl_sub_iter->
Copy(dug);
209 dug->
AYPX(ug_epl,-1.0);
213 if (xIsNan<IssmDouble>(ndu_epl) || xIsNan<IssmDouble>(nu_epl))
_error_(
"convergence criterion is NaN!");
214 if (ndu_epl==0.0 && nu_epl==0.0) nu_epl=1.0e-6;
215 if(
VerboseConvergence())
_printf0_(setw(50) << left <<
" Inner EPL Convergence criterion:" << ndu_epl/nu_epl*100 <<
"%, aiming lower than " << eps_hyd*10*100 <<
" %\n");
216 if((ndu_epl/nu_epl)<eps_hyd*10.) eplconverged=
true;
217 if (eplcount>=hydro_maxiter){
218 _error_(
" maximum number of EPL iterations (" << hydro_maxiter <<
") exceeded");
222 delete ug_epl_sub_iter;
237 ug_sed_main_iter->
Copy(dug);
238 dug->
AYPX(ug_sed,-1.0);
242 delete ug_sed_main_iter;
243 if (xIsNan<IssmDouble>(ndu_sed) || xIsNan<IssmDouble>(nu_sed))
_error_(
"Sed convergence criterion is NaN!");
244 if (ndu_sed==0.0 && nu_sed==0.0) nu_sed=1.0e-6;
246 ug_epl_main_iter->
Copy(dug);
247 dug->
AYPX(ug_epl,-1.0);
251 delete ug_epl_main_iter;
252 if (xIsNan<IssmDouble>(ndu_epl) || xIsNan<IssmDouble>(nu_epl))
_error_(
"EPL convergence criterion is NaN!");
253 if (ndu_epl==0.0 && nu_epl==0.0) nu_epl=1.0e-6;
254 if (!xIsNan<IssmDouble>(eps_hyd)){
255 if ((ndu_epl/nu_epl)<eps_hyd && (ndu_sed/nu_sed)<(eps_hyd)){
260 if(
VerboseConvergence())
_printf0_(setw(50) << left <<
" Sediment Convergence criterion:" << ndu_sed/nu_sed*100 <<
"%, aiming lower than " << eps_hyd*100 <<
" %\n");
261 if(
VerboseConvergence())
_printf0_(setw(50) << left <<
" EPL Convergence criterion:" << ndu_epl/nu_epl*100 <<
"%, aiming lower than " << eps_hyd*100 <<
" %\n");
262 hydroconverged=
false;
265 else _printf0_(setw(50) << left <<
" Convergence criterion:" << ndu_sed/nu_sed*100 <<
" %\n");
266 if (hydrocount>=hydro_maxiter){
267 _error_(
" maximum number for hydrological global iterations (" << hydro_maxiter <<
") exceeded");
271 if(hydroconverged)
break;
282 delete uf_epl_sub_iter;
void Mergesolutionfromftogx(Vector< IssmDouble > **pug, Vector< IssmDouble > *uf, Vector< IssmDouble > *ys, Nodes *nodes, Parameters *parameters, bool flag_ys0)
void ConstraintsStatex(int *pconverged, int *pnum_unstable_constraints, FemModel *femmodel)
#define _printf0_(StreamArgs)
bool VerboseConvergence(void)
void ResetZigzagCounterx(FemModel *femmodel)
@ HydrologydcIsefficientlayerEnum
void Solverx(Vector< IssmDouble > **puf, Matrix< IssmDouble > *Kff, Vector< IssmDouble > *pf, Vector< IssmDouble > *uf0, Vector< IssmDouble > *df, Parameters *parameters)
Vector< doubletype > * Duplicate(void)
void solutionsequence_linear(FemModel *femmodel)
@ HydrologyDCInefficientAnalysisEnum
doubletype Norm(NormMode norm_type)
void InitZigZagCounter(FemModel *femmodel)
void SetParam(bool boolean, int enum_type)
@ HydrologySedimentKmaxEnum
void HydrologyEPLupdateDomainx(IssmDouble *pEplcount)
void UpdateConstraintsx(void)
void ElementizeIdsMask(FemModel *femmodel)
void ComputeEPLThickness(FemModel *femmodel)
void UpdateConstraintsL2ProjectionEPLx(IssmDouble *pL2count)
void Stop(int tagenum, bool dontmpisync=true)
@ HydrologyDCEfficientAnalysisEnum
void Reducevectorgtofx(Vector< IssmDouble > **puf, Vector< IssmDouble > *ug, Nodes *nodes, Parameters *parameters)
void Reduceloadx(Vector< IssmDouble > *pf, Matrix< IssmDouble > *Kfs, Vector< IssmDouble > *y_s, bool flag_ys0)
@ L2ProjectionEPLAnalysisEnum
void AYPX(Vector *X, doubletype a)
#define _error_(StreamArgs)
void Start(int tagenum, bool dontmpisync=true)
bool VerboseSolution(void)
void ResetCounter(FemModel *femmodel)
void SetCurrentConfiguration(int configuration_type)
void FindParam(bool *pinteger, int enum_type)
void ResetConstraintsx(FemModel *femmodel)
void solutionsequence_hydro_nonlinear(FemModel *femmodel)
void ElementizeEplMask(FemModel *femmodel)
void CreateNodalConstraintsx(Vector< IssmDouble > **pys, Nodes *nodes)
void SystemMatricesx(Matrix< IssmDouble > **pKff, Matrix< IssmDouble > **pKfs, Vector< IssmDouble > **ppf, Vector< IssmDouble > **pdf, IssmDouble *pkmax, FemModel *femmodel, bool isAllocated)