2 #include "../toolkits/toolkits.h"
3 #include "../classes/classes.h"
4 #include "../shared/shared.h"
5 #include "../modules/modules.h"
6 #include "../solutionsequences/solutionsequences.h"
12 bool isSIA,isSSA,isL1L2,isHO,isFS,iscoupling;
25 if((isSIA?1.:0.) + (isSSA?1.:0.) + (isL1L2?1.:0.) + (isHO?1.:0.) + (isFS?1.:0.) >1.)
37 iomodel->
FetchData(3,
"md.stressbalance.spcvx",
"md.stressbalance.spcvy",
"md.flowequation.vertex_equation");
55 if (!xIsNan<IssmDouble>(iomodel->
Data(
"md.stressbalance.spcvx")[i])){
60 if (!xIsNan<IssmDouble>(iomodel->
Data(
"md.stressbalance.spcvy")[i])){
70 iomodel->
DeleteData(3,
"md.stressbalance.spcvx",
"md.stressbalance.spcvy",
"md.flowequation.vertex_equation");
91 iomodel->
FetchData(4,
"md.flowequation.borderSSA",
"md.flowequation.borderFS",
"md.flowequation.vertex_equation",
"md.stressbalance.referential");
93 iomodel->
FetchData(2,
"md.mesh.vertexonbase",
"md.mesh.vertexonsurface");
97 for(
int i=0;i<nodes->
Size();i++){
99 int sid = node->
Sid();
103 iomodel->
DeleteData(6,
"md.mesh.vertexonbase",
"md.mesh.vertexonsurface",
"md.flowequation.borderSSA",
"md.flowequation.borderFS",
"md.flowequation.vertex_equation",
"md.stressbalance.referential");
116 iomodel->
FindConstant(&ismovingfront,
"md.transient.ismovingfront");
122 iomodel->
FetchData(1,
"md.flowequation.element_equation");
129 element->
Update(inputs2,i,iomodel,analysis_counter,analysis_type,
P1Enum);
131 if(iomodel->
Data(
"md.flowequation.element_equation")){
139 iomodel->
DeleteData(1,
"md.flowequation.element_equation");
218 for(
int iv=0;iv<numvertices;iv++){
220 Ke->
values[(2*iv+0)*2*numvertices+(2*iv+0)]=1./connectivity;
221 Ke->
values[(2*iv+1)*2*numvertices+(2*iv+1)]=1./connectivity;
233 int i0,i1,j0,j1,nodeup,nodedown,numsegments;
234 IssmDouble slope[2],connectivity[2],one0,one1;
235 int *pairindices = NULL;
239 int numdof = 2*numvertices;
245 for(
int is=0;is<numsegments;is++){
246 nodedown = pairindices[is*2+0];
247 nodeup = pairindices[is*2+1];
250 one0=1./connectivity[0];
251 one1=1./connectivity[1];
254 i0=2*nodedown; i1=2*nodedown+1;
256 j0=2*nodeup; j1=2*nodeup+1;
260 Ke->
values[i0*numdof+i0] = +one0;
261 Ke->
values[i1*numdof+i1] = +one0;
262 Ke->
values[j0*numdof+i0] = -one1;
263 Ke->
values[j0*numdof+j0] = +one1;
264 Ke->
values[j1*numdof+i1] = -one1;
265 Ke->
values[j1*numdof+j1] = +one1;
268 Ke->
values[i0*numdof+i0] = one0;
269 Ke->
values[i1*numdof+i1] = one0;
270 Ke->
values[j0*numdof+i0] = -2.*one1;
271 Ke->
values[j0*numdof+j0] = +2.*one1;
272 Ke->
values[j1*numdof+i1] = -2.*one1;
273 Ke->
values[j1*numdof+j1] = +2.*one1;
276 Ke->
values[j0*numdof+i0] = -one1;
277 Ke->
values[j0*numdof+j0] = +one1;
278 Ke->
values[j1*numdof+i1] = -one1;
279 Ke->
values[j1*numdof+j1] = +one1;
282 Ke->
values[j0*numdof+i0] = -2.*one1;
283 Ke->
values[j0*numdof+j0] = +2.*one1;
284 Ke->
values[j1*numdof+i1] = -2.*one1;
285 Ke->
values[j1*numdof+j1] = +2.*one1;
290 xDelete<int>(pairindices);
315 IssmDouble ub,vb,slope2,drag,thickness,surface,connectivity;
334 Input2* drag_input = NULL;
335 if(frictionlaw!=5 && frictionlaw!=1){
340 for(
int iv=0;iv<numvertices;iv++){
351 slope2=slope[0]*slope[0]+slope[1]*slope[1];
356 ub=-1.58*1.e-10*rho_ice*gravity*thickness*slope[0];
357 vb=-1.58*1.e-10*rho_ice*gravity*thickness*slope[1];
362 ub=drag*(rho_ice*gravity*thickness)*(rho_ice*gravity*thickness)*slope[0]/sqrt(slope2);
363 vb=drag*(rho_ice*gravity*thickness)*(rho_ice*gravity*thickness)*slope[1]/sqrt(slope2);
368 ub=-drag*rho_ice*gravity*thickness*slope[0];
369 vb=-drag*rho_ice*gravity*thickness*slope[1];
373 drag = -4e-15 * surface + 8.6e-12;
374 ub=-drag*rho_ice*gravity*thickness*slope[0];
375 vb=-drag*rho_ice*gravity*thickness*slope[1];
386 pe->
values[2*iv+0]=(ub-2.*pow(rho_ice*gravity,n)*pow(slope2,((n-1.)/2.))*pow(thickness,n+1.)/(pow(B,n)*(n+2))*slope[0])/connectivity;
387 pe->
values[2*iv+1]=(vb-2.*pow(rho_ice*gravity,n)*pow(slope2,((n-1.)/2.))*pow(thickness,n+1.)/(pow(B,n)*(n+2))*slope[1])/connectivity;
401 int nodeup,nodedown,numsegments;
402 IssmDouble ub,vb,slope2,drag,surface,thickness,constant_part,z,Jdet;
403 IssmDouble slope[2],connectivity[2],xyz_list_line[2][3];
405 int *pairindices = NULL;
424 Input2* drag_input = NULL;
426 if(frictionlaw!=5 && frictionlaw!=1){
429 else if(frictionlaw==5){
435 for(
int is=0;is<numsegments;is++){
436 nodedown = pairindices[is*2+0];
437 nodeup = pairindices[is*2+1];
440 for(
int i=0;i<3;i++){
441 xyz_list_line[0][i]=xyz_list[nodedown*3+i];
442 xyz_list_line[1][i]=xyz_list[nodeup*3+i];
446 for(
int ig=gauss->
begin();ig<gauss->
end();ig++){
456 slope2=slope[0]*slope[0]+slope[1]*slope[1];
457 constant_part=-2.*pow(rho_ice*gravity,n)*pow(slope2,((n-1.)/2.));
463 pe->
values[2*nodeup+0]+=constant_part*pow((surface-z)/B,n)*slope[0]*Jdet*gauss->
weight/connectivity[1];
464 pe->
values[2*nodeup+1]+=constant_part*pow((surface-z)/B,n)*slope[1]*Jdet*gauss->
weight/connectivity[1];
467 pe->
values[2*nodeup+0]+=constant_part*pow((surface-z)/B,n)*slope[0]*Jdet*gauss->
weight*2./connectivity[1];
468 pe->
values[2*nodeup+1]+=constant_part*pow((surface-z)/B,n)*slope[1]*Jdet*gauss->
weight*2./connectivity[1];
475 delete gauss; gauss=element->
NewGauss();
480 ub=-1.58*1.e-10*rho_ice*gravity*thickness*slope[0];
481 vb=-1.58*1.e-10*rho_ice*gravity*thickness*slope[1];
486 ub=drag*(rho_ice*gravity*thickness)*(rho_ice*gravity*thickness)*slope[0]/sqrt(slope2);
487 vb=drag*(rho_ice*gravity*thickness)*(rho_ice*gravity*thickness)*slope[1]/sqrt(slope2);
492 ub=-drag*rho_ice*gravity*thickness*slope[0];
493 vb=-drag*rho_ice*gravity*thickness*slope[1];
498 drag = -4e-15 * surface + 8.6e-12;
499 ub=-drag*rho_ice*gravity*thickness*slope[0];
500 vb=-drag*rho_ice*gravity*thickness*slope[1];
504 ub = -1./drag * rho_ice*gravity*thickness*slope[0];
505 vb = -1./drag * rho_ice*gravity*thickness*slope[1];
512 pe->
values[2*nodedown+0]+=ub/connectivity[0];
513 pe->
values[2*nodedown+1]+=vb/connectivity[0];
519 xDelete<int>(pairindices);
520 xDelete<IssmDouble>(xyz_list);
521 if(frictionlaw==5)
delete friction;
532 int numdof = numnodes*2;
533 IssmDouble* values = xNew<IssmDouble>(numdof);
542 for(
int i=0;i<numnodes;i++){
555 xDelete<int>(doflist);
556 xDelete<IssmDouble>(values);
559 _error_(
"Not implemented yet");
570 int numdof = numnodes*2;
574 IssmDouble* values = xNew<IssmDouble>(numdof);
579 IssmDouble* pressure = xNew<IssmDouble>(numdof);
580 IssmDouble* thickness = xNew<IssmDouble>(numdof);
581 IssmDouble* surface = xNew<IssmDouble>(numnodes);
584 for(i=0;i<numdof;i++) values[i]=solution[doflist[i]];
590 for(i=0;i<numnodes;i++){
595 if(xIsNan<IssmDouble>(vx[i]))
_error_(
"NaN found in solution vector");
596 if(xIsInf<IssmDouble>(vx[i]))
_error_(
"Inf found in solution vector");
597 if(xIsNan<IssmDouble>(vy[i]))
_error_(
"NaN found in solution vector");
598 if(xIsInf<IssmDouble>(vy[i]))
_error_(
"Inf found in solution vector");
603 for(i=0;i<numnodes;i++) vel[i]=sqrt(vx[i]*vx[i] + vy[i]*vy[i] + vz[i]*vz[i]);
613 for(i=0;i<numnodes;i++) pressure[i]=rho_ice*g*thickness[i];
618 for(i=0;i<numnodes;i++) pressure[i]=rho_ice*g*(surface[i]-xyz_list[i*3+2]);
630 xDelete<IssmDouble>(thickness);
631 xDelete<IssmDouble>(surface);
632 xDelete<IssmDouble>(pressure);
633 xDelete<IssmDouble>(vel);
634 xDelete<IssmDouble>(vz);
635 xDelete<IssmDouble>(vy);
636 xDelete<IssmDouble>(vx);
637 xDelete<IssmDouble>(values);
638 xDelete<IssmDouble>(xyz_list);
639 xDelete<int>(doflist);