2 #include "../toolkits/toolkits.h"
3 #include "../classes/classes.h"
4 #include "../shared/shared.h"
5 #include "../modules/modules.h"
8 #define OMEGA 0.001 // parameter controlling transition to nonlinear resistance in basal system (dimensionless)
9 #define NU 1.787e-6 //kinematic water viscosity m^2/s
10 #define CT 7.5e-8 // Clapeyron slope (K/Pa)
11 #define CW 4.22e3 // specific heat capacity of water (J/kg/K)
18 iomodel->
FindConstant(&hydrology_model,
"md.hydrology.model");
29 iomodel->
FindConstant(&hydrology_model,
"md.hydrology.model");
43 else if(reCast<int>(iomodel->
Data(
"md.mesh.vertexonbase")[i])){
54 iomodel->
FetchData(&segments,&M,&N,
"md.mesh.segments");
63 xDelete<int>(segments);
70 iomodel->
FindConstant(&hydrology_model,
"md.hydrology.model");
77 iomodel->
DeleteData(2,
"md.mesh.vertexonbase",
"md.mesh.vertexonsurface");
85 int hydrology_model,frictionlaw;
86 iomodel->
FindConstant(&hydrology_model,
"md.hydrology.model");
96 element->
Update(inputs2,i,iomodel,analysis_counter,analysis_type,
P1Enum);
134 _error_(
"Friction law "<< frictionlaw <<
" not supported");
142 char** requestedoutputs = NULL;
143 iomodel->
FindConstant(&hydrology_model,
"md.hydrology.model");
154 iomodel->
FindConstant(&requestedoutputs,&numoutputs,
"md.hydrology.requested_outputs");
157 iomodel->
DeleteData(&requestedoutputs,numoutputs,
"md.hydrology.requested_outputs");
182 IssmDouble* dbasis = xNew<IssmDouble>(2*numnodes);
183 IssmDouble* basis = xNew<IssmDouble>(numnodes);
198 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
205 for(
int i=0;i<numnodes;i++){
206 for(
int j=0;j<numnodes;j++){
207 Ke->
values[i*numnodes+j] += conductivity*gauss->
weight*Jdet*(dbasis[0*numnodes+i]*dbasis[0*numnodes+j] + dbasis[1*numnodes+i]*dbasis[1*numnodes+j])
208 + gauss->
weight*Jdet*storage/dt*basis[i]*basis[j];
214 xDelete<IssmDouble>(xyz_list);
215 xDelete<IssmDouble>(basis);
216 xDelete<IssmDouble>(dbasis);
227 IssmDouble gap,bed,thickness,head,ieb,head_old;
230 IssmDouble PMPheat,dpressure_water[2],dbed[2];
238 IssmDouble* basis = xNew<IssmDouble>(numnodes);
273 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
307 frictionheat=alpha2*(vx*vx+vy*vy);
311 IssmDouble pressure_water = rho_water*g*(head-bed);
312 if(pressure_water>pressure_ice) pressure_water = pressure_ice;
315 IssmDouble pressure_water_old = rho_water*g*(head_old-bed);
316 if(pressure_water_old>pressure_ice) pressure_water_old = pressure_ice;
319 dpressure_water[0] = rho_water*g*(dh[0] - dbed[0]);
320 dpressure_water[1] = rho_water*g*(dh[1] - dbed[1]);
321 PMPheat=-
CT*
CW*conductivity*(dh[0]*dpressure_water[0]+dh[1]*dpressure_water[1]);
323 meltrate = 1/latentheat*(G+frictionheat+rho_water*g*conductivity*(dh[0]*dh[0]+dh[1]*dh[1])-PMPheat);
326 for(
int i=0;i<numnodes;i++) pe->
values[i]+=Jdet*gauss->
weight*
328 meltrate*(1/rho_water-1/rho_ice)
329 +A*pow(fabs(pressure_ice - pressure_water),n-1)*(pressure_ice - pressure_water)*gap
330 -beta*sqrt(vx*vx+vy*vy)
336 xDelete<IssmDouble>(xyz_list);
337 xDelete<IssmDouble>(basis);
346 _error_(
"Not implemented yet");
363 IssmDouble* values = xNew<IssmDouble>(numnodes);
366 IssmDouble* eff_pressure = xNew<IssmDouble>(numnodes);
367 IssmDouble* thickness = xNew<IssmDouble>(numnodes);
375 IssmDouble* head_old = xNew<IssmDouble>(numnodes);
381 for(
int i=0;i<numnodes;i++){
382 values[i]=solution[doflist[i]];
385 if(values[i]>rho_ice*thickness[i]/rho_water+bed[i]){
386 values[i] = rho_ice*thickness[i]/rho_water+bed[i];
395 values[i] = head_old[i] - relaxation*(head_old[i]-values[i]);
398 eff_pressure[i] = rho_ice*g*thickness[i] - rho_water*g*(values[i]-bed[i]);
400 if(xIsNan<IssmDouble>(values[i]))
_error_(
"NaN found in solution vector");
401 if(xIsInf<IssmDouble>(values[i]))
_error_(
"Inf found in solution vector");
418 IssmDouble reynolds = conductivity*sqrt(dh[0]*dh[0]+dh[1]*dh[1])/
NU;
422 xDelete<IssmDouble>(values);
423 xDelete<IssmDouble>(thickness);
424 xDelete<IssmDouble>(bed);
425 xDelete<IssmDouble>(xyz_list);
426 xDelete<int>(doflist);
427 xDelete<IssmDouble>(eff_pressure);
428 xDelete<IssmDouble>(head_old);
477 IssmDouble dpressure_water[2],dbed[2],PMPheat;
512 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
545 frictionheat=alpha2*(vx*vx+vy*vy);
549 IssmDouble pressure_water = rho_water*g*(head-bed);
550 if(pressure_water>pressure_ice) pressure_water = pressure_ice;
553 dpressure_water[0] = rho_water*g*(dh[0] - dbed[0]);
554 dpressure_water[1] = rho_water*g*(dh[1] - dbed[1]);
555 PMPheat=-
CT*
CW*conductivity*(dh[0]*dpressure_water[0]+dh[1]*dpressure_water[1]);
557 meltrate = 1/latentheat*(G+frictionheat+rho_water*g*conductivity*(dh[0]*dh[0]+dh[1]*dh[1])-PMPheat);
560 newgap += gauss->
weight*Jdet*(gap+dt*(
562 -A*pow(fabs(pressure_ice-pressure_water),n-1)*(pressure_ice-pressure_water)*gap
563 +beta*sqrt(vx*vx+vy*vy)
565 totalweights +=gauss->
weight*Jdet;
568 q += gauss->
weight*Jdet*(conductivity*sqrt(dh[0]*dh[0]+dh[1]*dh[1]));
571 channelization += gauss->
weight*Jdet*(meltrate/rho_ice/(meltrate/rho_ice+beta*sqrt(vx*vx+vy*vy)));
575 newgap = newgap/totalweights;
577 if(newgap<mingap) newgap=mingap;
591 channelization = channelization/totalweights;
595 xDelete<IssmDouble>(xyz_list);