2 #include "../toolkits/toolkits.h"
3 #include "../classes/classes.h"
4 #include "../shared/shared.h"
5 #include "../modules/modules.h"
25 bool isdynamic =
false;
45 iomodel->
FetchData(&spcvector,&M,&N,
"md.thermal.spctemperature");
46 iomodel->
FetchData(&spcvectorstatic,&M,&N,
"md.thermal.spctemperature");
53 if (issurface[i]==1)spcvectorstatic[i*N+j] = NAN;
54 else spcvector[i*N+j] = NAN;
68 iomodel->
DeleteData(spcvector,
"md.thermal.spctemperature");
69 iomodel->
DeleteData(spcvectorstatic,
"md.thermal.spctemperature");
70 iomodel->
DeleteData(issurface,
"md.mesh.vertexonsurface");
78 iomodel->
FetchData(1,
"md.thermal.spctemperature");
85 if (xIsNan<IssmDouble>(iomodel->
Data(
"md.thermal.spctemperature")[i])){
90 iomodel->
DeleteData(1,
"md.thermal.spctemperature");
101 iomodel->
DeleteData(2,
"md.mesh.vertexonbase",
"md.mesh.vertexonsurface");
108 int frictionlaw,basalforcing_model,materialstype;
109 int FrictionCoupling;
121 element->
Update(inputs2,i,iomodel,analysis_counter,analysis_type,finiteelement);
126 bool dakota_analysis, ismovingfront;
127 iomodel->
FindConstant(&dakota_analysis,
"md.qmu.isdakota");
128 iomodel->
FindConstant(&ismovingfront,
"md.transient.ismovingfront");
130 iomodel->
FindConstant(&materialstype,
"md.materials.type");
155 switch(materialstype){
177 iomodel->
FindConstant(&basalforcing_model,
"md.basalforcings.model");
178 switch(basalforcing_model){
188 iomodel->
FindConstant(&FrictionCoupling,
"md.friction.coupling");
192 if (FrictionCoupling==3){
194 else if(FrictionCoupling==4){
203 iomodel->
FindConstant(&FrictionCoupling,
"md.friction.coupling");
207 if (FrictionCoupling==3){
209 else if(FrictionCoupling==4){
219 iomodel->
FindConstant(&FrictionCoupling,
"md.friction.coupling");
234 iomodel->
FindConstant(&FrictionCoupling,
"md.friction.coupling");
239 if (FrictionCoupling==3){
241 else if(FrictionCoupling==4){
252 _error_(
"friction law not supported");
258 char** requestedoutputs = NULL;
269 iomodel->
FindConstant(&requestedoutputs,&numoutputs,
"md.thermal.requested_outputs");
272 iomodel->
DeleteData(&requestedoutputs,numoutputs,
"md.thermal.requested_outputs");
285 if(frictionlaw==1 || frictionlaw==3 || frictionlaw==7){
342 IssmDouble* basis = xNew<IssmDouble>(numnodes);
356 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
362 D=gauss->
weight*Jdet*rho_water*mixed_layer_capacity*thermal_exchange_vel/(heatcapacity*rho_ice);
363 if(reCast<bool,IssmDouble>(dt)) D=dt*D;
373 xDelete<IssmDouble>(basis);
374 xDelete<IssmDouble>(xyz_list_base);
387 IssmDouble tau_parameter_anisotropic[2],tau_parameter_hor,tau_parameter_ver;
395 IssmDouble* basis = xNew<IssmDouble>(numnodes);
396 IssmDouble* dbasis = xNew<IssmDouble>(3*numnodes);
397 IssmDouble* Bprime = xNew<IssmDouble>(3*numnodes);
409 IssmDouble kappa = thermalconductivity/(rho_ice*heatcapacity);
419 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
426 D_scalar=gauss->
weight*Jdet;
427 if(dt!=0.) D_scalar=D_scalar*dt;
430 for(
int i=0;i<numnodes;i++){
431 for(
int j=0;j<numnodes;j++){
432 Ke->
values[i*numnodes+j] += D_scalar*kappa*(
433 dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + dbasis[1*numnodes+j]*dbasis[1*numnodes+i] + dbasis[2*numnodes+j]*dbasis[2*numnodes+i]
442 for(
int i=0;i<numnodes;i++){
443 for(
int j=0;j<numnodes;j++){
444 Ke->
values[i*numnodes+j] += D_scalar*(
445 vx*dbasis[0*numnodes+j]*basis[i] + vy*dbasis[1*numnodes+j]*basis[i] +vz*dbasis[2*numnodes+j]*basis[i]
452 D_scalar=gauss->
weight*Jdet;
453 for(
int i=0;i<numnodes;i++){
454 for(
int j=0;j<numnodes;j++){
455 Ke->
values[i*numnodes+j] += D_scalar*basis[j]*basis[i];
458 D_scalar=D_scalar*dt;
462 if(stabilization==1){
464 vel=sqrt(vx*vx + vy*vy + vz*vz)+1.e-14;
465 h=sqrt( pow(hx*vx/vel,2) + pow(hy*vy/vel,2) + pow(hz*vz/vel,2));
466 K[0][0]=h/(2.*vel)*fabs(vx*vx); K[0][1]=h/(2.*vel)*fabs(vx*vy); K[0][2]=h/(2.*vel)*fabs(vx*vz);
467 K[1][0]=h/(2.*vel)*fabs(vy*vx); K[1][1]=h/(2.*vel)*fabs(vy*vy); K[1][2]=h/(2.*vel)*fabs(vy*vz);
468 K[2][0]=h/(2.*vel)*fabs(vz*vx); K[2][1]=h/(2.*vel)*fabs(vz*vy); K[2][2]=h/(2.*vel)*fabs(vz*vz);
469 for(
int i=0;i<3;i++)
for(
int j=0;j<3;j++) K[i][j] = D_scalar*K[i][j];
477 else if(stabilization==2){
480 for(
int i=0;i<numnodes;i++){
481 for(
int j=0;j<numnodes;j++){
482 Ke->
values[i*numnodes+j]+=tau_parameter*D_scalar*
483 ((u-um)*dbasis[0*numnodes+i]+(v-vm)*dbasis[1*numnodes+i]+(w-wm)*dbasis[2*numnodes+i])*
484 ((u-um)*dbasis[0*numnodes+j]+(v-vm)*dbasis[1*numnodes+j]+(w-wm)*dbasis[2*numnodes+j]);
488 D_scalar=gauss->
weight*Jdet;
489 for(
int i=0;i<numnodes;i++){
490 for(
int j=0;j<numnodes;j++){
491 Ke->
values[i*numnodes+j]+=tau_parameter*D_scalar*basis[j]*((u-um)*dbasis[0*numnodes+i]+(v-vm)*dbasis[1*numnodes+i]+(w-wm)*dbasis[2*numnodes+i]);
497 else if(stabilization==3){
501 tau_parameter_hor=tau_parameter_anisotropic[0];
502 tau_parameter_ver=tau_parameter_anisotropic[1];
503 for(
int i=0;i<numnodes;i++){
504 for(
int j=0;j<numnodes;j++){
505 Ke->
values[i*numnodes+j]+=D_scalar*
506 (sqrt(tau_parameter_hor)*(u-um)*dbasis[0*numnodes+i]+sqrt(tau_parameter_hor)*(v-vm)*dbasis[1*numnodes+i]+sqrt(tau_parameter_ver)*(w-wm)*dbasis[2*numnodes+i])*
507 (sqrt(tau_parameter_hor)*(u-um)*dbasis[0*numnodes+j]+sqrt(tau_parameter_hor)*(v-vm)*dbasis[1*numnodes+j]+sqrt(tau_parameter_ver)*(w-wm)*dbasis[2*numnodes+j]);
514 xDelete<IssmDouble>(xyz_list);
515 xDelete<IssmDouble>(Bprime);
516 xDelete<IssmDouble>(basis);
517 xDelete<IssmDouble>(dbasis);
547 IssmDouble alpha2,scalar,basalfriction,heatflux;
555 IssmDouble* basis = xNew<IssmDouble>(numnodes);
572 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
584 basalfriction = alpha2*(vx*vx + vy*vy + vz*vz);
585 heatflux = (basalfriction+geothermalflux)/(rho_ice*heatcapacity);
587 scalar = gauss->
weight*Jdet*heatflux;
588 if(dt!=0.) scalar=dt*scalar;
590 for(
int i=0;i<numnodes;i++) pe->
values[i]+=scalar*basis[i];
596 xDelete<IssmDouble>(basis);
597 xDelete<IssmDouble>(xyz_list_base);
605 IssmDouble t_pmp,dt,Jdet,scalar_ocean,pressure;
616 IssmDouble* basis = xNew<IssmDouble>(numnodes);
631 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
640 scalar_ocean=gauss->
weight*Jdet*rho_water*mixed_layer_capacity*thermal_exchange_vel*(t_pmp)/(heatcapacity*rho_ice);
641 if(reCast<bool,IssmDouble>(dt)) scalar_ocean=dt*scalar_ocean;
643 for(
int i=0;i<numnodes;i++) pe->
values[i]+=scalar_ocean*basis[i];
648 xDelete<IssmDouble>(basis);
649 xDelete<IssmDouble>(xyz_list_base);
662 IssmDouble tau_parameter_anisotropic[2],tau_parameter_hor,tau_parameter_ver;
672 IssmDouble* basis = xNew<IssmDouble>(numnodes);
673 IssmDouble* dbasis = xNew<IssmDouble>(3*numnodes);
680 IssmDouble kappa = thermalconductivity/(rho_ice*heatcapacity);
686 Input2* temperature_input = NULL;
691 for(
int ig=gauss->
begin();ig<gauss->end();ig++){
696 element->
ViscousHeating(&phi,xyz_list,gauss,vx_input,vy_input,vz_input);
698 scalar_def=phi/(rho_ice*heatcapacity)*Jdet*gauss->
weight;
699 if(reCast<bool,IssmDouble>(dt)) scalar_def=scalar_def*dt;
701 for(
int i=0;i<numnodes;i++) pe->
values[i]+=scalar_def*basis[i];
704 if(reCast<bool,IssmDouble>(dt)){
706 scalar_transient=temperature*Jdet*gauss->
weight;
707 for(
int i=0;i<numnodes;i++) pe->
values[i]+=scalar_transient*basis[i];
710 if(stabilization==2){
719 for(
int i=0;i<numnodes;i++) pe->
values[i]+=tau_parameter*scalar_def*(u*dbasis[0*numnodes+i]+v*dbasis[1*numnodes+i]+w*dbasis[2*numnodes+i]);
720 if(reCast<bool,IssmDouble>(dt)){
721 for(
int i=0;i<numnodes;i++) pe->
values[i]+=tau_parameter*scalar_transient*(u*dbasis[0*numnodes+i]+v*dbasis[1*numnodes+i]+w*dbasis[2*numnodes+i]);
725 else if(stabilization==3){
732 tau_parameter_hor=tau_parameter_anisotropic[0];
733 tau_parameter_ver=tau_parameter_anisotropic[1];
735 for(
int i=0;i<numnodes;i++) pe->
values[i]+=scalar_def*(tau_parameter_hor*u*dbasis[0*numnodes+i]+tau_parameter_hor*v*dbasis[1*numnodes+i]+tau_parameter_ver*w*dbasis[2*numnodes+i]);
740 xDelete<IssmDouble>(basis);
741 xDelete<IssmDouble>(dbasis);
742 xDelete<IssmDouble>(xyz_list);
767 for(
int i=0;i<numnodes;i++){
768 B[numnodes*0+i] = basis[i];
769 B[numnodes*1+i] = basis[i];
770 B[numnodes*2+i] = basis[i];
774 xDelete<IssmDouble>(basis);
792 IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes);
796 for(
int i=0;i<numnodes;i++){
797 B[numnodes*0+i] = dbasis[0*numnodes+i];
798 B[numnodes*1+i] = dbasis[1*numnodes+i];
799 B[numnodes*2+i] = dbasis[2*numnodes+i];
803 xDelete<IssmDouble>(dbasis);
821 IssmDouble* dbasis=xNew<IssmDouble>(3*numnodes);
825 for(
int i=0;i<numnodes;i++){
826 B[numnodes*0+i] = dbasis[0*numnodes+i];
827 B[numnodes*1+i] = dbasis[1*numnodes+i];
828 B[numnodes*2+i] = dbasis[2*numnodes+i];
832 xDelete<IssmDouble>(dbasis);
838 _error_(
"Not implemented yet");
853 IssmDouble* values = xNew<IssmDouble>(numnodes);
854 IssmDouble* surface = xNew<IssmDouble>(numnodes);
858 for(i=0;i<numnodes;i++){
859 values[i]=solution[doflist[i]];
862 if(xIsNan<IssmDouble>(values[i]))
_error_(
"NaN found in solution vector");
863 if(xIsInf<IssmDouble>(values[i]))
_error_(
"Inf found in solution vector");
870 IssmDouble* pressure = xNew<IssmDouble>(numnodes);
872 for(i=0;i<numnodes;i++){
876 xDelete<IssmDouble>(pressure);
886 for(i=0;i<numnodes;i++) n[i]=3.;
897 switch(rheology_law){
902 for(i=0;i<numnodes;i++) B[i]=
BuddJacka(values[i]);
906 for(i=0;i<numnodes;i++) B[i]=
Cuffey(values[i]);
910 for(i=0;i<numnodes;i++) B[i]=
Paterson(values[i]);
914 for(i=0;i<numnodes;i++) B[i]=
NyeH2O(values[i]);
918 for(i=0;i<numnodes;i++) B[i]=
NyeCO2(values[i]);
923 for(i=0;i<numnodes;i++) B[i]=
Arrhenius(values[i],surface[i]-xyz_list[i*3+2],n[i]);
930 xDelete<IssmDouble>(n);
937 xDelete<IssmDouble>(values);
938 xDelete<IssmDouble>(surface);
939 xDelete<IssmDouble>(B);
940 xDelete<IssmDouble>(xyz_list);
941 xDelete<int>(doflist);