6 #include "../toolkits/toolkits.h"
7 #include "../classes/classes.h"
8 #include "../classes/Inputs2/TriaInput2.h"
9 #include "../classes/Inputs2/TransientInput2.h"
10 #include "../classes/Inputs2/DatasetInput2.h"
11 #include "../shared/shared.h"
12 #include "../modules/modules.h"
13 #include "../solutionsequences/solutionsequences.h"
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);}
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;
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;
346 element->SetSealevelMasks(masks);
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);
428 femmodel->SealevelriseEustatic(RSLgi,&oceanarea,&eustatic, masks);
431 RSLgi_oceanaverage=
femmodel->SealevelriseOceanAverage(RSLgi,masks, oceanarea);
435 RSLgi->
Shift(-eustatic-RSLgi_oceanaverage);
441 *poceanarea=oceanarea;
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){
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);
649 U_gia->
Scale(frequency*dt);
650 N_gia->
Scale(frequency*dt);
682 else if(dslmodel==2){
701 else _error_(
"not implemented yet");
704 *pdynamic_rate_g=dynamic_rate_g;
725 else if (dslmodel==2){
744 else _error_(
"not implemented yet");
747 *psteric_rate_g=steric_rate_g;
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){
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;
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);
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);
997 _error_(
"EarthMassTransport error message: not supported anymore!");
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;