2 #include "../toolkits/toolkits.h"
3 #include "../classes/classes.h"
4 #include "../shared/shared.h"
5 #include "../modules/modules.h"
16 bool isefficientlayer;
18 iomodel->
FindConstant(&hydrology_model,
"md.hydrology.model");
24 iomodel->
FindConstant(&isefficientlayer,
"md.hydrology.isefficientlayer");
27 if(!isefficientlayer)
return;
30 iomodel->
FetchData(&eplflip_lock,
"md.hydrology.eplflip_lock");
33 iomodel->
FetchData(&eplthickcomp,
"md.hydrology.epl_thick_comp");
38 bool isefficientlayer;
42 iomodel->
FindConstant(&hydrology_model,
"md.hydrology.model");
46 iomodel->
FindConstant(&isefficientlayer,
"md.hydrology.isefficientlayer");
47 if(!isefficientlayer)
return;
54 element->
Update(inputs2,i,iomodel,analysis_counter,analysis_type,
P1Enum);
74 iomodel->
FindConstant(&hydrology_model,
"md.hydrology.model");
78 bool isefficientlayer;
79 iomodel->
FindConstant(&isefficientlayer,
"md.hydrology.isefficientlayer");
80 if(!isefficientlayer)
return;
83 iomodel->
FetchData(2,
"md.mesh.vertexonbase",
"md.mesh.vertexonsurface");
86 iomodel->
DeleteData(2,
"md.mesh.vertexonbase",
"md.mesh.vertexonsurface");
92 iomodel->
FindConstant(&hydrology_model,
"md.hydrology.model");
96 bool isefficientlayer;
97 iomodel->
FindConstant(&isefficientlayer,
"md.hydrology.isefficientlayer");
98 if(!isefficientlayer)
return;
106 iomodel->
FindConstant(&hydrology_model,
"md.hydrology.model");
110 bool isefficientlayer;
111 iomodel->
FindConstant(&isefficientlayer,
"md.hydrology.isefficientlayer");
112 if(!isefficientlayer)
return;
116 iomodel->
FetchData(1,
"md.mesh.vertexonbase");
128 else if(reCast<int>(iomodel->
Data(
"md.mesh.vertexonbase")[i])){
134 iomodel->
DeleteData(1,
"md.mesh.vertexonbase");
138 int* eplzigzag_counter =NULL;
141 xDelete<int>(eplzigzag_counter);
145 int* eplzigzag_counter=NULL;
148 eplzigzag_counter[i]=0;
151 xDelete<int>(eplzigzag_counter);
176 basalelement = element;
179 if(!element->
IsOnBase())
return NULL;
188 if(!active_element) {
209 IssmDouble* basis = xNew<IssmDouble>(numnodes);
221 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
225 epl_transmitivity =
EplTransmitivity(basalelement,gauss,epl_thick_input,epl_head_input,base_input);
226 epl_storing =
EplStoring(basalelement,gauss,epl_thick_input,epl_head_input,base_input);
229 D_scalar=epl_transmitivity*gauss->
weight*Jdet;
231 if(dt!=0.) D_scalar=D_scalar*dt;
234 GetB(B,basalelement,xyz_list,gauss);
243 D_scalar=epl_storing*gauss->
weight*Jdet;
252 D_scalar=dt*transfer*gauss->
weight*Jdet;
262 xDelete<IssmDouble>(xyz_list);
263 xDelete<IssmDouble>(basis);
264 xDelete<IssmDouble>(B);
280 basalelement = element;
283 if(!element->
IsOnBase())
return NULL;
292 if(!active_element) {
303 int hydrologysubstepping;
311 Input2 *old_wh_input = NULL;
312 Input2 *dummy_input = NULL;
313 Input2 *surface_runoff_input = NULL;
321 IssmDouble* basis = xNew<IssmDouble>(numnodes);
346 if(smbsubstepping==1){
350 else if(smbsubstepping>1 && smbsubstepping<=hydrologysubstepping){
358 surface_runoff_input=xDynamicCast<Input2*>(dummy_input);
_assert_(surface_runoff_input);
363 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
367 epl_storing =
EplStoring(basalelement,gauss,epl_thick_input,epl_head_input,base_input);
368 epl_transmitivity =
EplTransmitivity(basalelement,gauss,epl_thick_input,epl_head_input,base_input);
372 if(surface_runoff_input) surface_runoff_input->
GetInputValue(&runoff_value,gauss);
373 else runoff_value = 0.;
374 scalar = Jdet*gauss->
weight*(water_load+runoff_value);
376 if(dt!=0.) scalar = scalar*dt;
377 for(
int i=0;i<numnodes;i++)pe->
values[i]+=scalar*basis[i];
384 scalar = Jdet*gauss->
weight*((water_head*epl_storing)+(dt*transfer));
386 for(
int i=0;i<numnodes;i++)pe->
values[i]+=scalar*basis[i];
393 for(
int iv=0;iv<numvertices;iv++){
395 epl_transmitivity =
EplTransmitivity(basalelement,gauss,epl_thick_input,epl_head_input,base_input);
398 pe->
values[iv]+=residual/connectivity;
402 xDelete<IssmDouble>(xyz_list);
403 xDelete<IssmDouble>(basis);
423 IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes);
427 for(
int i=0;i<numnodes;i++){
428 B[numnodes*0+i] = dbasis[0*numnodes+i];
429 B[numnodes*1+i] = dbasis[1*numnodes+i];
433 xDelete<IssmDouble>(dbasis);
439 _error_(
"Not implemented yet");
450 basalelement = element;
466 IssmDouble* eplHeads = xNew<IssmDouble>(numnodes);
470 for(
int i=0;i<numnodes;i++){
471 eplHeads[i]=solution[doflist[i]];
472 if(xIsNan<IssmDouble>(eplHeads[i]))
_error_(
"NaN found in solution vector");
473 if(xIsInf<IssmDouble>(eplHeads[i]))
_error_(
"Inf found in solution vector");
479 xDelete<IssmDouble>(eplHeads);
480 xDelete<int>(doflist);
492 IssmDouble epl_thickness,prestep_head,base_elev;
502 water_sheet=
max(0.0,(prestep_head-base_elev));
503 storing=rho_freshwater*g*epl_porosity*epl_thickness*(water_compressibility+(epl_compressibility/epl_porosity));
523 IssmDouble epl_thickness,base_elev,prestep_head;
529 water_sheet=
max(0.0,(prestep_head-base_elev));
530 epl_transmitivity=epl_conductivity*epl_thickness;
532 return epl_transmitivity;
556 element-> GetInputValue(&bed,innode,
BaseEnum);
557 h_max=((rho_ice*thickness)/rho_water)+bed;
560 _error_(
"Using normal stress not supported yet");
563 _error_(
"no case higher than 3 for SedimentlimitFlag");
576 switch(transfermethod){
586 _error_(
"no case higher than 1 for the Transfer method");
598 switch(transfermethod){
607 transfer=+sediment_head*leakage;
610 _error_(
"no case higher than 1 for the Transfer method");
627 if(iseplthickcomp==0)
return;
637 IssmDouble* thickness = xNew<IssmDouble>(numnodes);
640 IssmDouble* eplhead = xNew<IssmDouble>(numnodes);
641 IssmDouble* epl_slopeX = xNew<IssmDouble>(numnodes);
642 IssmDouble* epl_slopeY = xNew<IssmDouble>(numnodes);
643 IssmDouble* old_thickness = xNew<IssmDouble>(numnodes);
644 IssmDouble* ice_thickness = xNew<IssmDouble>(numnodes);
662 default:
_error_(
"not Implemented Yet");
675 for(
int i=0;i<numnodes;i++){
676 thickness[i]=init_thick;
680 for(
int i=0;i<numnodes;i++){
683 EPL_N=gravity*((rho_ice*ice_thickness[i])-(rho_water*(eplhead[i]-bed[i])));
684 if(EPL_N<0.0)EPL_N=0.0;
686 EPLgrad2 = (epl_slopeX[i]*epl_slopeX[i])+(epl_slopeY[i]*epl_slopeY[i]);
688 opening=(rho_water*gravity*epl_conductivity*EPLgrad2*dt)/(rho_ice*latentheat);
689 closing=(2.0*A*dt*pow(EPL_N,n[i]))/(pow(n[i],n[i]));
691 thickness[i] = old_thickness[i]/(1.0-opening+closing);
697 if(thickness[i]>max_thick){
698 thickness[i] = max_thick;
703 xDelete<IssmDouble>(thickness);
704 xDelete<IssmDouble>(eplhead);
705 xDelete<IssmDouble>(epl_slopeX);
706 xDelete<IssmDouble>(epl_slopeY);
707 xDelete<IssmDouble>(old_thickness);
708 xDelete<IssmDouble>(ice_thickness);
709 xDelete<IssmDouble>(bed);
710 xDelete<IssmDouble>(B);
711 xDelete<IssmDouble>(n);
726 basalelement = element;
736 IssmDouble* epl_thickness =xNew<IssmDouble>(numnodes);
737 IssmDouble* old_active =xNew<IssmDouble>(numnodes);
738 IssmDouble* sedhead =xNew<IssmDouble>(numnodes);
739 IssmDouble* eplhead =xNew<IssmDouble>(numnodes);
740 IssmDouble* residual =xNew<IssmDouble>(numnodes);
753 basalelement-> GetInputListOnVertices(&base[0],
BaseEnum);
756 sedheadmin=sedhead[0];
757 for(
int i=1;i<numnodes;i++)
if(sedhead[i]<=sedheadmin)sedheadmin=sedhead[i];
758 for(
int i=0;i<numnodes;i++){
761 if(old_active[i]>0.){
764 if(epl_thickness[i]<colapse_thick && residual[i]<=0.){
769 else if (old_active[i]==0.){
777 epl_thickness[i]=init_thick;
782 if(eplhead[i]>=h_max && active_element){
783 for(
int j=0;j<numnodes;j++){
785 if((sedhead[j] == sedheadmin) && (i!=j)){
787 if(old_active[j]==0.){
800 xDelete<IssmDouble>(epl_thickness);
801 xDelete<IssmDouble>(old_active);
802 xDelete<IssmDouble>(sedhead);
803 xDelete<IssmDouble>(eplhead);
804 xDelete<IssmDouble>(residual);
805 xDelete<IssmDouble>(base);
817 basalelement = element;
828 IssmDouble* active = xNew<IssmDouble>(numnodes);
835 for(
int i=0;i<numnodes;i++) flag+=active[i];
839 for(
int i=0;i<numnodes;i++){
844 else if(active_element){
845 for(
int i=0;i<numnodes;i++){
853 xDelete<IssmDouble>(active);