 |
Ice Sheet System Model
4.18
Code documentation
|
: core of the sea-level change solution
More...
Go to the source code of this file.
|
void | sealevelchange_core (FemModel *femmodel) |
|
void | grd_core (FemModel *femmodel) |
|
void | dynstr_core (FemModel *femmodel) |
|
SealevelMasks * | sealevelrise_core_masks (FemModel *femmodel) |
|
void | sealevelrise_core_geometry (FemModel *femmodel) |
|
Vector< IssmDouble > * | sealevelrise_core_eustatic (FemModel *femmodel, SealevelMasks *masks, IssmDouble *poceanarea) |
|
Vector< IssmDouble > * | sealevelrise_core_noneustatic (FemModel *femmodel, SealevelMasks *masks, Vector< IssmDouble > *RSLg_eustatic, IssmDouble oceanarea) |
|
void | sealevelrise_core_elastic (Vector< IssmDouble > **pU_esa, Vector< IssmDouble > **pU_north_esa, Vector< IssmDouble > **pU_east_esa, FemModel *femmodel, Vector< IssmDouble > *RSLg, SealevelMasks *masks) |
|
void | sealevelrise_core_viscous (Vector< IssmDouble > **pU_gia, Vector< IssmDouble > **pN_gia, FemModel *femmodel, Vector< IssmDouble > *RSLg) |
|
void | sealevelrise_diagnostics (FemModel *femmodel, Vector< IssmDouble > *RSLg) |
|
void | GetDynamicRate (Vector< IssmDouble > **pdynamic_rate_g, FemModel *femmodel) |
|
void | GetStericRate (Vector< IssmDouble > **psteric_rate_g, FemModel *femmodel) |
|
void | TransferForcing (FemModel *femmodel, int forcingenum) |
|
void | TransferSealevel (FemModel *femmodel, int forcingenum) |
|
void | EarthMassTransport (FemModel *femmodel) |
|
void | slrconvergence (bool *pconverged, Vector< IssmDouble > *RSLg, Vector< IssmDouble > *RSLg_old, IssmDouble eps_rel, IssmDouble eps_abs) |
|
: core of the sea-level change solution
Definition in file sealevelchange_core.cpp.
◆ sealevelchange_core()
void sealevelchange_core |
( |
FemModel * |
femmodel | ) |
|
Definition at line 17 of file sealevelchange_core.cpp.
50 _error_(
"ISSM was not compiled with gia capabilities. Exiting");
69 char **requested_outputs = NULL;
74 if(numoutputs){
for(
int i=0;i<numoutputs;i++){xDelete<char>(requested_outputs[i]);} xDelete<char*>(requested_outputs);}
◆ grd_core()
Definition at line 84 of file sealevelchange_core.cpp.
109 bool istransientmasstransport;
115 int bp_compute_fingerprints=0;
139 modelid=1; earthid=1;
151 if (count<frequency){
166 if(modelid==earthid){
191 if(bp_compute_fingerprints){
197 N_esa_rate=N_esa->
Duplicate(); N_esa->
Copy(N_esa_rate); N_esa_rate->
Scale(1/(dt*frequency));
198 U_esa_rate=U_esa->
Duplicate(); U_esa->
Copy(U_esa_rate); U_esa_rate->
Scale(1/(dt*frequency));
199 N_gia_rate=N_gia->
Duplicate(); N_gia->
Copy(N_gia_rate); N_gia_rate->
Scale(1/(dt*frequency));
200 U_gia_rate=U_gia->
Duplicate(); U_gia->
Copy(U_gia_rate); U_gia_rate->
Scale(1/(dt*frequency));
201 RSLg_rate=RSLg->
Duplicate(); RSLg->
Copy(RSLg_rate); RSLg_rate->
Scale(1/(dt*frequency));
239 delete RSLg_eustatic;
◆ dynstr_core()
Definition at line 259 of file sealevelchange_core.cpp.
306 SL->
AXPY(N_gia_rate,dt);
307 SL->
AXPY(N_esa_rate,dt);
309 SL->
AXPY(steric_rate_g,dt);
310 SL->
AXPY(dynamic_rate_g,dt);
314 bedrock->
AXPY(U_esa_rate,dt);
315 bedrock->
AXPY(U_gia_rate,dt);
325 delete steric_rate_g;
326 delete dynamic_rate_g;
◆ sealevelrise_core_masks()
◆ sealevelrise_core_geometry()
void sealevelrise_core_geometry |
( |
FemModel * |
femmodel | ) |
|
Definition at line 351 of file sealevelchange_core.cpp.
364 bool geometrydone =
false;
387 element->SealevelriseGeometry(latitude,longitude,radius,xx,yy,zz);
392 xDelete<IssmDouble>(xx);
393 xDelete<IssmDouble>(yy);
394 xDelete<IssmDouble>(zz);
396 xDelete<IssmDouble>(longitude);
397 xDelete<IssmDouble>(radius);
◆ sealevelrise_core_eustatic()
Definition at line 404 of file sealevelchange_core.cpp.
428 femmodel->SealevelriseEustatic(RSLgi,&oceanarea,&eustatic, masks);
431 RSLgi_oceanaverage=
femmodel->SealevelriseOceanAverage(RSLgi,masks, oceanarea);
435 RSLgi->
Shift(-eustatic-RSLgi_oceanaverage);
441 *poceanarea=oceanarea;
◆ sealevelrise_core_noneustatic()
Definition at line 444 of file sealevelchange_core.cpp.
463 bool verboseconvolution=
true;
464 int max_nonlinear_iterations;
469 int bp_compute_fingerprints= 0;
487 RSLg_eustatic->
Copy(RSLg);
499 delete RSLg_old; RSLg_old=RSLg;
506 femmodel->SealevelriseNonEustatic(RSLgo, RSLg_old, masks, verboseconvolution);
515 femmodel->SealevelriseRotationalFeedback(RSLgo_rot,RSLg_old,&Ixz,&Iyz,&Izz, masks);
523 RSLgo->
AXPY(RSLgo_rot,1);
527 RSLgo_oceanaverage=
femmodel->SealevelriseOceanAverage(RSLgo,masks, oceanarea);
530 RSLg_eustatic->
Copy(RSLg); RSLg->
AXPY(RSLgo,1);
531 RSLg->
Shift(-RSLgo_oceanaverage);
546 if(count>=max_nonlinear_iterations){
547 _printf0_(
" maximum number of nonlinear iterations (" << max_nonlinear_iterations <<
") exceeded\n");
553 if(count>1)verboseconvolution=
false;
562 if(bp_compute_fingerprints){
◆ sealevelrise_core_elastic()
Definition at line 572 of file sealevelchange_core.cpp.
610 femmodel->SealevelriseElastic(U_esa,U_north_esa,U_east_esa,RSLg, masks);
615 *pU_east_esa=U_east_esa;
616 *pU_north_esa=U_north_esa;
620 xDelete<IssmDouble>(longitude);
621 xDelete<IssmDouble>(latitude);
622 xDelete<IssmDouble>(xx);
623 xDelete<IssmDouble>(yy);
624 xDelete<IssmDouble>(zz);
625 xDelete<IssmDouble>(radius);
◆ sealevelrise_core_viscous()
◆ sealevelrise_diagnostics()
◆ GetDynamicRate()
◆ GetStericRate()
◆ TransferForcing()
void TransferForcing |
( |
FemModel * |
femmodel, |
|
|
int |
forcingenum |
|
) |
| |
Definition at line 752 of file sealevelchange_core.cpp.
763 int* transitions_m=NULL;
764 int* transitions_n=NULL;
782 if(modelid==earthid){
784 if(!parcoms)
_error_(
"TransferForcing error message: could not find IcecapToEarthComm communicator");
789 if(!parcom)
_error_(
"TransferForcing error message: could not find IcecapToEarthComm communicator");
794 if(modelid!=earthid){
801 if(modelid==earthid){
802 forcings=xNew<IssmDouble*>(nummodels-1);
803 nvs=xNew<int>(nummodels-1);
804 for(
int i=0;i<earthid;i++){
806 forcings[i]=xNew<IssmDouble>(nvs[i]);
819 if(modelid==earthid){
829 if(ntransitions!=earthid)
_error_(
"TransferForcing error message: number of transition vectors is not equal to the number of icecaps!");
833 for(
int i=0;i<earthid;i++){
837 int M=transitions_m[i];
840 int* index=xNew<int>(M);
for(
int i=0;i<M;i++)index[i]=reCast<int>(transition[i])-1;
859 for(
int i=0;i<nummodels-1;i++){
860 IssmDouble* temp=forcings[i]; xDelete<IssmDouble>(temp);
862 xDelete<IssmDouble*>(forcings);
864 if(forcing)xDelete<IssmDouble>(forcing);
865 if(forcingglobal)
delete forcingglobal;
867 for(
int i=0;i<earthid;i++){
869 xDelete<IssmDouble>(temp);
871 xDelete<IssmDouble*>(transitions);
872 xDelete<int>(transitions_m);
873 xDelete<int>(transitions_n);
875 if(nvs)xDelete<int>(nvs);
◆ TransferSealevel()
void TransferSealevel |
( |
FemModel * |
femmodel, |
|
|
int |
forcingenum |
|
) |
| |
Definition at line 879 of file sealevelchange_core.cpp.
888 int* transitions_m=NULL;
889 int* transitions_n=NULL;
908 if(modelid==earthid){
910 if(!parcoms)
_error_(
"TransferSealevel error message: could not find IcecapToEarthComm communicator");
916 if(!parcom)
_error_(
"TransferSealevel error message: could not find IcecapToEarthComm communicator");
922 if(modelid==earthid){
930 if(modelid==earthid){
935 if(ntransitions!=earthid)
_error_(
"TransferSeaLevel error message: number of transition vectors is not equal to the number of icecaps!");
937 for(
int i=0;i<earthid;i++){
939 forcing=xNew<IssmDouble>(nv);
941 for(
int j=0;j<nv;j++){
942 forcing[j]=forcingglobal[reCast<int>(transition[j])-1];
950 forcing=xNew<IssmDouble>(nv);
957 if(modelid!=earthid){
960 if(my_rank!=0)forcing=xNew<IssmDouble>(nv);
969 if(forcingglobal)xDelete<IssmDouble>(forcingglobal);
970 if(forcing)xDelete<IssmDouble>(forcing);
972 for(
int i=0;i<ntransitions;i++){
974 xDelete<IssmDouble>(temp);
976 xDelete<IssmDouble*>(transitions);
977 xDelete<int>(transitions_m);
978 xDelete<int>(transitions_n);
◆ EarthMassTransport()
void EarthMassTransport |
( |
FemModel * |
femmodel | ) |
|
◆ slrconvergence()
Definition at line 1031 of file sealevelchange_core.cpp.
1033 bool converged=
true;
1041 if (xIsNan<IssmDouble>(ndS))
_error_(
"convergence criterion is NaN!");
1043 if(!xIsNan<IssmDouble>(eps_rel)){
1045 if (xIsNan<IssmDouble>(nS))
_error_(
"convergence criterion is NaN!");
1052 if(!xIsNan<IssmDouble>(eps_rel)){
1053 if((ndS/nS)<eps_rel){
1054 if(
VerboseConvergence())
_printf0_(setw(50) << left <<
" convergence criterion: norm(dS)/norm(S)" << ndS/nS*100 <<
" < " << eps_rel*100 <<
" %\n");
1057 if(
VerboseConvergence())
_printf0_(setw(50) << left <<
" convergence criterion: norm(dS)/norm(S)" << ndS/nS*100 <<
" > " << eps_rel*100 <<
" %\n");
1061 if(!xIsNan<IssmDouble>(eps_abs)){
1072 *pconverged=converged;
@ DslSeaWaterPressureChangeAtSeaFloor
@ DslSeaSurfaceHeightChangeAboveGeoidEnum
@ DslGlobalAverageThermostericSeaLevelChangeEnum
@ SolidearthSettingsAbstolEnum
@ TransientIsmasstransportEnum
SealevelMasks * sealevelrise_core_masks(FemModel *femmodel)
#define _printf0_(StreamArgs)
bool VerboseConvergence(void)
void sealevelrise_diagnostics(FemModel *femmodel, Vector< IssmDouble > *RSLg)
static ISSM_MPI_Comm GetComm(void)
@ TimesteppingTimeStepEnum
void GetVectorFromInputsx(IssmDouble **pvector, int *pvector_size, FemModel *femmodel, int name)
int NumberOfVertices(void)
Vector< doubletype > * Duplicate(void)
@ SealevelriseSolutionEnum
@ SolidearthSettingsHorizEnum
@ SealevelriseRunCountEnum
void EarthMassTransport(FemModel *femmodel)
void grd_core(FemModel *femmodel)
void RequestedDependentsx(void)
doubletype Norm(NormMode norm_type)
@ SealevelriseTransitionsEnum
void sealevelrise_core_geometry(FemModel *femmodel)
void Scale(doubletype scale_factor)
@ SolidearthSettingsReltolEnum
@ SealevelriseCumDeltathicknessEnum
@ DslComputeFingerprintsEnum
void SetParam(bool boolean, int enum_type)
@ SolidearthSettingsMaxiterEnum
void AXPY(Vector *X, doubletype a)
void SetValues(int ssize, int *list, doubletype *values, InsMode mode)
@ SealevelInertiaTensorXZEnum
@ SealevelRSLEustaticEnum
void slrconvergence(bool *pconverged, Vector< IssmDouble > *RSLg, Vector< IssmDouble > *RSLg_old, IssmDouble eps_rel, IssmDouble eps_abs)
Vector< IssmDouble > * sealevelrise_core_eustatic(FemModel *femmodel, SealevelMasks *masks, IssmDouble *poceanarea)
void gia_core(FemModel *femmodel)
int ISSM_MPI_Send(void *buf, int count, ISSM_MPI_Datatype datatype, int dest, int tag, ISSM_MPI_Comm comm)
void sealevelrise_core_viscous(Vector< IssmDouble > **pU_gia, Vector< IssmDouble > **pN_gia, FemModel *femmodel, Vector< IssmDouble > *RSLg)
void TransferForcing(FemModel *femmodel, int forcingenum)
@ SealevelriseAnalysisEnum
int AddResult(ExternalResult *result)
void dynstr_core(FemModel *femmodel)
void Stop(int tagenum, bool dontmpisync=true)
@ SealevelriseGeometryDoneEnum
int ISSM_MPI_Bcast(void *buffer, int count, ISSM_MPI_Datatype datatype, int root, ISSM_MPI_Comm comm)
void sealevelrise_core_elastic(Vector< IssmDouble > **pU_esa, Vector< IssmDouble > **pU_north_esa, Vector< IssmDouble > **pU_east_esa, FemModel *femmodel, Vector< IssmDouble > *RSLg, SealevelMasks *masks)
@ SealevelInertiaTensorZZEnum
void AYPX(Vector *X, doubletype a)
@ SealevelriseRequestedOutputsEnum
#define _error_(StreamArgs)
void Start(int tagenum, bool dontmpisync=true)
@ SolidearthSettingsRotationEnum
bool VerboseSolution(void)
Object * GetObjectByOffset(int offset)
@ SurfaceloadIceThicknessChangeEnum
@ SolidearthSettingsRunFrequencyEnum
void RequestedOutputsx(Results **presults, char **requested_outputs, int numoutputs, bool save_results=true)
void SetCurrentConfiguration(int configuration_type)
void FindParam(bool *pinteger, int enum_type)
void VertexCoordinatesx(IssmDouble **px, IssmDouble **py, IssmDouble **pz, Vertices *vertices, bool spherical)
int ISSM_MPI_Recv(void *buf, int count, ISSM_MPI_Datatype datatype, int source, int tag, ISSM_MPI_Comm comm, ISSM_MPI_Status *status)
Param * FindParamObject(int enum_type)
void Shift(doubletype shift)
void TransferSealevel(FemModel *femmodel, int forcingenum)
int NumberOfDofs(int setenum)
@ SealevelInertiaTensorYZEnum
void GetStericRate(Vector< IssmDouble > **psteric_rate_g, FemModel *femmodel)
@ SolidearthSettingsComputesealevelchangeEnum
void GetDynamicRate(Vector< IssmDouble > **pdynamic_rate_g, FemModel *femmodel)
Vector< IssmDouble > * sealevelrise_core_noneustatic(FemModel *femmodel, SealevelMasks *masks, Vector< IssmDouble > *RSLg_eustatic, IssmDouble oceanarea)