4 #error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
7 #include "../toolkits/toolkits.h"
8 #include "../classes/classes.h"
9 #include "../shared/shared.h"
10 #include "../modules/modules.h"
11 #include "../solutionsequences/solutionsequences.h"
27 iomodel->
DeleteData(2,
"md.mesh.vertexonbase",
"md.mesh.vertexonsurface");
45 element->
Update(inputs2,i,iomodel,analysis_counter,analysis_type,finiteelement);
87 int melt_parameterization;
88 iomodel->
FindConstant(&melt_parameterization,
"md.frontalforcings.parameterization");
89 switch(melt_parameterization){
135 int melt_parameterization;
136 iomodel->
FindConstant(&melt_parameterization,
"md.frontalforcings.parameterization");
137 switch(melt_parameterization){
162 if(stabilization==4){
181 _error_(
"not implemented yet");
185 if(!element->
IsOnBase())
return NULL;
189 int stabilization,dim, domaintype, calvinglaw;
195 IssmDouble norm_dlsf, norm_calving, calvingrate, meltingrate, groundedice;
196 IssmDouble calvingmax, calvinghaf, heaviside, haf_eps;
217 IssmDouble* basis = xNew<IssmDouble>(numnodes);
218 IssmDouble* dbasis = xNew<IssmDouble>(2*numnodes);
220 if(stabilization==2){
221 Bprime = xNew<IssmDouble>(dim*numnodes);
230 Input2* calvingratex_input = NULL;
231 Input2* calvingratey_input = NULL;
232 Input2* lsf_slopex_input = NULL;
233 Input2* lsf_slopey_input = NULL;
234 Input2* calvingrate_input = NULL;
235 Input2* meltingrate_input = NULL;
310 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
316 D_scalar=gauss->
weight*Jdet;
320 for(i=0;i<numnodes;i++){
321 for(j=0;j<numnodes;j++){
322 Ke->
values[i*numnodes+j] += D_scalar*basis[j]*basis[i];
325 D_scalar=D_scalar*dt;
343 vel=sqrt(v[0]*v[0] + v[1]*v[1]);
344 if(calvingrate>calvingmax+vel) calvingrate = vel+calvingmax;
345 if(groundedice<0) meltingrate = 0.;
348 for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2);
349 norm_dlsf=sqrt(norm_dlsf);
353 c[i]=calvingrate*dlsf[i]/norm_dlsf; m[i]=meltingrate*dlsf[i]/norm_dlsf;
366 for(i=0;i<dim;i++) norm_calving+=pow(c[i],2);
367 norm_calving=sqrt(norm_calving)+1.e-14;
368 for(i=0;i<dim;i++) m[i]=meltingrate*c[i]/norm_calving;
377 for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2);
378 norm_dlsf=sqrt(norm_dlsf);
383 m[i]=meltingrate*dlsf[i]/norm_dlsf;
398 for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2);
399 norm_dlsf=sqrt(norm_dlsf);
404 m[i]=meltingrate*dlsf[i]/norm_dlsf;
418 if(groundedice<0) meltingrate = 0.;
421 for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2);
422 norm_dlsf=sqrt(norm_dlsf);
427 m[i]=meltingrate*dlsf[i]/norm_dlsf;
445 vel=sqrt(v[0]*v[0] + v[1]*v[1]);
447 if(groundedice-calvinghaf<=-haf_eps){
452 else if(groundedice-calvinghaf>=haf_eps){
454 calvingrate=
min(calvingrate,vel);
459 heaviside=(groundedice-calvinghaf+haf_eps)/(2.*haf_eps) + sin(
PI*(groundedice-calvinghaf)/haf_eps)/(2.*
PI);
460 calvingrate=heaviside*(
min(calvingrate,vel)-calvingrate)+calvingrate;
461 meltingrate=heaviside*meltingrate+0.;
465 for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2);
466 norm_dlsf=sqrt(norm_dlsf);
470 c[i]=calvingrate*dlsf[i]/norm_dlsf;
471 m[i]=meltingrate*dlsf[i]/norm_dlsf;
486 for(i=0;i<dim;i++) w[i]=v[i]-c[i]-m[i];
489 for(i=0;i<numnodes;i++){
490 for(j=0;j<numnodes;j++){
492 Ke->
values[i*numnodes+j] += D_scalar*w[k]*dbasis[k*numnodes+j]*basis[i];
499 for(i=0;i<dim;i++) vel+=w[i]*w[i];
500 vel=sqrt(vel)+1.e-14;
501 switch(stabilization){
508 h=sqrt( pow(hx*w[0]/vel,2) + pow(hy*w[1]/vel,2) );
510 for(i=0;i<numnodes;i++){
511 for(j=0;j<numnodes;j++){
513 Ke->
values[i*numnodes+j] += D_scalar*kappa*dbasis[k*numnodes+j]*dbasis[k*numnodes+i];
522 h=sqrt( pow(hx*w[0]/vel,2) + pow(hy*w[1]/vel,2) );
523 for(
int i=0;i<numnodes;i++){
524 for(
int j=0;j<numnodes;j++){
525 Ke->
values[i*numnodes+j] += D_scalar*h/(2.*vel)*(
526 dbasis[0*numnodes+i] *(w[0]*w[0]*dbasis[0*numnodes+j] + w[0]*w[1]*dbasis[1*numnodes+j]) +
527 dbasis[1*numnodes+i] *(w[1]*w[0]*dbasis[0*numnodes+j] + w[1]*w[1]*dbasis[1*numnodes+j])
534 _error_(
"unknown type of stabilization in LevelsetAnalysis.cpp");
539 xDelete<IssmDouble>(xyz_list);
540 xDelete<IssmDouble>(basis);
541 xDelete<IssmDouble>(dbasis);
542 xDelete<IssmDouble>(Bprime);
549 if(!element->
IsOnBase())
return NULL;
553 int i, ig, domaintype;
567 IssmDouble* basis = xNew<IssmDouble>(numnodes);
575 for(ig=gauss->
begin();ig<gauss->end();ig++){
583 for(i=0;i<numnodes;i++) pe->
values[i]+=Jdet*gauss->
weight*lsf*basis[i];
587 xDelete<IssmDouble>(xyz_list);
588 xDelete<IssmDouble>(basis);
618 return fabs(a[0]*b[1]-a[1]*b[0])/norm_b;
621 _error_(
"not implemented yet");
624 _error_(
"Not implemented yet");
644 IssmDouble min_thickness,thickness,hab_fraction;
645 IssmDouble crevassedepth,surface_crevasse,surface,critical_fraction;
668 for(
int in=0;in<numnodes;in++){
676 if(thickness<min_thickness && bed<sealevel){
709 for(
int in=0;in<numnodes;in++){
719 if(thickness<((rho_water/rho_ice)*(1+hab_fraction)*-water_depth) && levelset>-300. && levelset<0.){
733 int nflipped,local_nflipped;
756 for(
int in=0;in<numnodes;in++){
763 surface_crevasse_input->
GetInputValue(&surface_crevasse,gauss);
767 if((surface_crevasse-surface>0. || crevassedepth-thickness>0.) && bed<0.){
777 constraint_nodes=vec_constraint_nodes->
ToMPISerial();
794 bool isconnected =
false;
795 for(
int in=0;in<numnodes;in++){
797 if(constraint_nodes[node->
Sid()]==1.){
805 for(
int in=0;in<numnodes;in++){
811 surface_crevasse_input->
GetInputValue(&surface_crevasse,gauss);
815 if((surface_crevasse-surface>0. || crevassedepth-thickness>0.) && bed<0. && levelset>-300. && levelset<0. && constraint_nodes[node->
Sid()]==0.){
829 xDelete<IssmDouble>(constraint_nodes);
830 constraint_nodes=vec_constraint_nodes->
ToMPISerial();
833 delete vec_constraint_nodes;
841 for(
int in=0;in<numnodes;in++){
846 if(constraint_nodes[node->
Sid()]>0.){
856 xDelete<IssmDouble>(constraint_nodes);