Changeset 26850
- Timestamp:
- 02/02/22 08:24:54 (3 years ago)
- Location:
- issm/trunk-jpl/src
- Files:
-
- 1 added
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
r26784 r26850 118 118 case CalvingTestEnum: 119 119 break; 120 case CalvingParameterizationEnum: 121 iomodel->FetchDataToInput(inputs,elements,"md.calving.stress_threshold_groundedice",CalvingStressThresholdGroundediceEnum); 122 iomodel->FetchDataToInput(inputs,elements,"md.calving.stress_threshold_floatingice",CalvingStressThresholdFloatingiceEnum); 123 iomodel->FetchDataToInput(inputs,elements,"md.geometry.bed",BedEnum); 124 break; 120 125 default: 121 126 _error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet"); … … 172 177 case CalvingTestEnum: 173 178 parameters->AddObject(iomodel->CopyConstantObject("md.calving.speedfactor",CalvingTestSpeedfactorEnum)); 179 break; 180 case CalvingParameterizationEnum: 181 parameters->AddObject(iomodel->CopyConstantObject("md.calving.min_thickness",CalvingMinthicknessEnum)); 182 parameters->AddObject(iomodel->CopyConstantObject("md.calving.use_param",CalvingUseParamEnum)); 183 parameters->AddObject(iomodel->CopyConstantObject("md.calving.scale_theta",CalvingScaleThetaEnum)); 184 parameters->AddObject(iomodel->CopyConstantObject("md.calving.amp_alpha",CalvingAmpAlphaEnum)); 185 parameters->AddObject(iomodel->CopyConstantObject("md.calving.midp",CalvingMidpointEnum)); 186 parameters->AddObject(iomodel->CopyConstantObject("md.calving.nonlinearlaw",CalvingNonlinearLawEnum)); 174 187 break; 175 188 default: … … 572 585 } 573 586 } 587 else if(calvinglaw==CalvingParameterizationEnum){ 588 589 /*Intermediaries*/ 590 IssmDouble thickness,bed,sealevel; 591 IssmDouble min_thickness = femmodel->parameters->FindParam(CalvingMinthicknessEnum); 592 593 /*Loop over all elements of this partition*/ 594 for(Object* & object : femmodel->elements->objects){ 595 Element* element = xDynamicCast<Element*>(object); 596 597 int numnodes = element->GetNumberOfNodes(); 598 Gauss* gauss = element->NewGauss(); 599 Input* H_input = element->GetInput(ThicknessEnum); _assert_(H_input); 600 Input* b_input = element->GetInput(BedEnum); _assert_(b_input); 601 Input* sl_input = element->GetInput(SealevelEnum); _assert_(sl_input); 602 603 /*Potentially constrain nodes of this element*/ 604 for(int in=0;in<numnodes;in++){ 605 gauss->GaussNode(element->GetElementType(),in); 606 Node* node=element->GetNode(in); 607 if(!node->IsActive()) continue; 608 609 H_input->GetInputValue(&thickness,gauss); 610 b_input->GetInputValue(&bed,gauss); 611 sl_input->GetInputValue(&sealevel,gauss); 612 if(thickness<min_thickness && bed<sealevel){ 613 node->ApplyConstraint(0,+1.); 614 } 615 else { 616 /* no ice, set no spc */ 617 node->DofInFSet(0); 618 } 619 } 620 delete gauss; 621 } 622 } 574 623 else if(calvinglaw==CalvingHabEnum){ 575 624 -
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r26836 r26850 3441 3441 case CalvingCrevasseDepthEnum: 3442 3442 this->CalvingCrevasseDepth(); 3443 break; 3444 case CalvingParameterizationEnum: 3445 this->CalvingRateParameterization(); 3443 3446 break; 3444 3447 default: -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r26836 r26850 229 229 virtual void AverageOntoPartition(Vector<IssmDouble>* partition_contributions,Vector<IssmDouble>* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part)=0; 230 230 virtual void BasalNodeIndices(int* pnumindices,int** pindices,int finiteelement){_error_("not implemented yet");}; 231 virtual void CalvingRateParameterization(void){_error_("not implemented yet");}; 231 232 virtual void CalvingRateVonmises(void){_error_("not implemented yet");}; 232 233 virtual void CalvingRateTest(void){_error_("not implemented yet");}; -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r26830 r26850 837 837 delete gauss; 838 838 } 839 } 840 /*}}}*/ 841 void Tria::CalvingRateParameterization(){/*{{{*/ 842 843 IssmDouble xyz_list[NUMVERTICES][3]; 844 IssmDouble epsilon[3]; /* epsilon=[exx,eyy,exy];*/ 845 IssmDouble calvingratex[NUMVERTICES]; 846 IssmDouble calvingratey[NUMVERTICES]; 847 IssmDouble calvingrate[NUMVERTICES]; 848 IssmDouble lambda1,lambda2,ex,ey,vx,vy,vel; 849 IssmDouble sigma_vm[NUMVERTICES]; 850 IssmDouble B,sigma_max,sigma_max_floating,sigma_max_grounded,n; 851 IssmDouble epse_2,groundedice,bed,sealevel; 852 IssmDouble mrate, rho_ice, rho_water, thickness, paramX, Hab; 853 int use_parameter=0; 854 int nonlinear_law=0; 855 IssmDouble theta, alpha, midp, gamma; 856 857 /* Get node coordinates and dof list: */ 858 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES); 859 860 /*Retrieve all inputs and parameters we will need*/ 861 Input* vx_input = this->GetInput(VxEnum); _assert_(vx_input); 862 Input* vy_input = this->GetInput(VyEnum); _assert_(vy_input); 863 Input* B_input = this->GetInput(MaterialsRheologyBbarEnum); _assert_(B_input); 864 Input* gr_input = this->GetInput(MaskOceanLevelsetEnum); _assert_(gr_input); 865 Input* bs_input = this->GetInput(BedEnum); _assert_(bs_input); 866 Input* H_input = this->GetInput(ThicknessEnum); _assert_(H_input); 867 Input* smax_fl_input = this->GetInput(CalvingStressThresholdFloatingiceEnum); _assert_(smax_fl_input); 868 Input* smax_gr_input = this->GetInput(CalvingStressThresholdGroundediceEnum); _assert_(smax_gr_input); 869 Input* n_input = this->GetInput(MaterialsRheologyNEnum); _assert_(n_input); 870 Input* sl_input = this->GetInput(SealevelEnum); _assert_(sl_input); 871 Input* mrate_input = this->GetInput(CalvingMeltingrateEnum); _assert_(mrate_input); 872 873 /* Ice and sea water density */ 874 this->FindParam(&rho_ice,MaterialsRhoIceEnum); 875 this->FindParam(&rho_water,MaterialsRhoSeawaterEnum); 876 877 /* Use which parameter */ 878 this->FindParam(&use_parameter, CalvingUseParamEnum); 879 this->FindParam(&theta, CalvingScaleThetaEnum); 880 this->FindParam(&alpha, CalvingAmpAlphaEnum); 881 this->FindParam(&midp, CalvingMidpointEnum); 882 this->FindParam(&nonlinear_law, CalvingNonlinearLawEnum); 883 884 /* Start looping on the number of vertices: */ 885 GaussTria* gauss=new GaussTria(); 886 for(int iv=0;iv<NUMVERTICES;iv++){ 887 gauss->GaussVertex(iv); 888 889 /*Get velocity components and thickness*/ 890 B_input->GetInputValue(&B,gauss); 891 n_input->GetInputValue(&n,gauss); 892 vx_input->GetInputValue(&vx,gauss); 893 vy_input->GetInputValue(&vy,gauss); 894 gr_input->GetInputValue(&groundedice,gauss); 895 bs_input->GetInputValue(&bed,gauss); 896 H_input->GetInputValue(&thickness,gauss); 897 smax_fl_input->GetInputValue(&sigma_max_floating,gauss); 898 smax_gr_input->GetInputValue(&sigma_max_grounded,gauss); 899 vel=sqrt(vx*vx+vy*vy)+1.e-14; 900 sl_input->GetInputValue(&sealevel,gauss); 901 mrate_input->GetInputValue(&mrate,gauss); 902 903 /*Compute strain rate and viscosity: */ 904 this->StrainRateSSA(&epsilon[0],&xyz_list[0][0],gauss,vx_input,vy_input); 905 906 /*Get Eigen values*/ 907 Matrix2x2Eigen(&lambda1,&lambda2,&ex,&ey,epsilon[0],epsilon[2],epsilon[1]); 908 _assert_(!xIsNan<IssmDouble>(lambda1)); 909 _assert_(!xIsNan<IssmDouble>(lambda2)); 910 911 /*Process Eigen values (only account for extension)*/ 912 lambda1 = max(lambda1,0.); 913 lambda2 = max(lambda2,0.); 914 915 /*Calculate sigma_vm*/ 916 epse_2 = 1./2. *(lambda1*lambda1 + lambda2*lambda2); 917 sigma_vm[iv] = sqrt(3.) * B * pow(epse_2,1./(2.*n)); 918 919 /*Tensile stress threshold*/ 920 if(groundedice<0) 921 sigma_max = sigma_max_floating; 922 else 923 sigma_max = sigma_max_grounded; 924 925 switch (use_parameter) { 926 case 0: 927 /* bed elevation */ 928 paramX = bed; 929 break; 930 case 1: 931 /* Height above floatation */ 932 if (bed>sealevel) paramX = 0.0; 933 else paramX = thickness - (rho_water/rho_ice) * (sealevel-bed); 934 break; 935 case 2: 936 /* Thicknese */ 937 paramX = thickness; 938 break; 939 case 4: 940 /* bed elevation+linear curve fitting */ 941 paramX = bed; 942 break; 943 case -1: 944 /* use nothing, just the mrate*/ 945 break; 946 default: 947 _error_("The parameter is not supported yet!"); 948 } 949 950 /* Compute the hyperbolic tangent function */ 951 if ((use_parameter>-0.5) & (use_parameter<3)) { 952 gamma = 0.5*theta*(1.0-tanh((paramX+midp)/alpha))+(1.0-theta); 953 if (gamma<0.0) gamma =0.0; 954 } 955 else if (use_parameter>=3) { 956 gamma = alpha*paramX + theta; 957 if (gamma > 1.0) gamma = 1.0; 958 if (gamma < 0.0) gamma = 0.0; 959 } 960 else gamma = 1; 961 962 /*-------------------------------------------*/ 963 if (nonlinear_law) { 964 /*This von Mises type has too strong positive feedback with vel included 965 * calvingrate[iv] = (mrate+sigma_vm[iv]*vel/sigma_max)*gamma; 966 */ 967 Hab = thickness - (rho_water/rho_ice) * (sealevel-bed); 968 if (Hab < 0.) Hab = 0.; 969 if (bed > sealevel) Hab = 0.; 970 971 calvingrate[iv] = (mrate+Hab/sigma_max)*gamma; 972 } 973 else { 974 calvingrate[iv] = mrate*gamma; 975 } 976 calvingratex[iv] = calvingrate[iv]*vx/vel; 977 calvingratey[iv] = calvingrate[iv]*vy/vel; 978 } 979 980 /*Add input*/ 981 this->AddInput(CalvingratexEnum,&calvingratex[0],P1DGEnum); 982 this->AddInput(CalvingrateyEnum,&calvingratey[0],P1DGEnum); 983 this->AddInput(CalvingCalvingrateEnum,&calvingrate[0],P1DGEnum); 984 this->AddInput(SigmaVMEnum,&sigma_vm[0],P1DGEnum); 985 986 /*Clean up and return*/ 987 delete gauss; 839 988 } 840 989 /*}}}*/ … … 4256 4405 calvingratey_input=this->GetInput(CalvingrateyEnum); _assert_(calvingratey_input); 4257 4406 break; 4407 case CalvingParameterizationEnum: 4408 lsf_slopex_input = this->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input); 4409 if(dim==2) lsf_slopey_input = this->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input); 4410 calvingrate_input = this->GetInput(CalvingCalvingrateEnum); _assert_(calvingrate_input); 4411 meltingrate_input = this->GetInput(CalvingMeltingrateEnum); _assert_(meltingrate_input); 4412 break; 4258 4413 default: 4259 4414 _error_("Calving law "<<EnumToStringx(calvinglaw)<<" not supported yet"); … … 4418 4573 for(i=0;i<dim;i++) m[i]=0.; 4419 4574 break; 4575 case CalvingParameterizationEnum: 4576 lsf_slopex_input->GetInputValue(&dlsf[0],&gauss); 4577 if(dim==2) lsf_slopey_input->GetInputValue(&dlsf[1],&gauss); 4578 calvingrate_input->GetInputValue(&calvingrate,&gauss); 4579 meltingrate_input->GetInputValue(&meltingrate,&gauss); 4580 meltingrate = 0.; 4581 4582 norm_dlsf=0.; 4583 for(i=0;i<dim;i++) norm_dlsf+=pow(dlsf[i],2); 4584 norm_dlsf=sqrt(norm_dlsf); 4585 4586 if(norm_dlsf>1.e-10) 4587 for(i=0;i<dim;i++){ 4588 c[i]=calvingrate*dlsf[i]/norm_dlsf; 4589 m[i]=meltingrate*dlsf[i]/norm_dlsf; 4590 } 4591 else 4592 for(i=0;i<dim;i++){ 4593 c[i]=0.; m[i]=0.; 4594 } 4595 break; 4420 4596 4421 4597 default: -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r26830 r26850 60 60 void CalvingFluxLevelset(); 61 61 void CalvingMeltingFluxLevelset(); 62 void CalvingRateParameterization(); 62 63 IssmDouble CharacteristicLength(void); 63 64 void ComputeBasalStress(void); -
issm/trunk-jpl/src/c/modules/Calvingx/Calvingx.cpp
r26784 r26850 38 38 femmodel->ElementOperationx(&Element::CalvingRateTest); 39 39 break; 40 case CalvingParameterizationEnum: 41 femmodel->ElementOperationx(&Element::CalvingRateParameterization); 42 break; 40 43 default: 41 44 _error_("Caving law "<<EnumToStringx(calvinglaw)<<" not supported yet"); -
issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
r26837 r26850 107 107 CalvingMinthicknessEnum, 108 108 CalvingTestSpeedfactorEnum, 109 CalvingUseParamEnum, 110 CalvingScaleThetaEnum, 111 CalvingAmpAlphaEnum, 112 CalvingMidpointEnum, 113 CalvingNonlinearLawEnum, 109 114 ConfigurationTypeEnum, 110 115 ConstantsGEnum, … … 1247 1252 CalvingLevermannEnum, 1248 1253 CalvingTestEnum, 1254 CalvingParameterizationEnum, 1249 1255 CalvingVonmisesEnum, 1250 1256 CfdragcoeffabsgradEnum, -
issm/trunk-jpl/src/c/shared/io/Marshalling/IoCodeConversions.cpp
r26836 r26850 268 268 case 6: return CalvingCrevasseDepthEnum; 269 269 case 7: return CalvingDev2Enum; 270 case 9: return CalvingParameterizationEnum; 270 271 case 8: return CalvingTestEnum; 271 272 default: _error_("Marshalled Calving law code \""<<enum_in<<"\" not supported yet");
Note:
See TracChangeset
for help on using the changeset viewer.