Index: ../trunk-jpl/src/c/modules/Calvingx/Calvingx.cpp =================================================================== --- ../trunk-jpl/src/c/modules/Calvingx/Calvingx.cpp (revision 20718) +++ ../trunk-jpl/src/c/modules/Calvingx/Calvingx.cpp (revision 20719) @@ -26,6 +26,9 @@ femmodel->CalvingRateDevx(); femmodel->ElementOperationx(&Element::CalvingRateDev); break; + case CalvingMinthicknessEnum: + femmodel->CalvingRateMinthicknessx(); + break; default: _error_("Caving law "<CalvingRateDev(); break; + case CalvingMinthicknessEnum: + this->CalvingRateMinthickness(); + break; default: _error_("Calving law "<* partition_contributions,Vector* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part)=0; virtual void CalvingRateLevermann(void)=0; virtual void CalvingRateDev(void){_error_("not implemented yet");}; + virtual void CalvingRateMinthickness(void){_error_("not implemented yet");}; virtual void WriteLevelsetSegment(DataSet* segments){_error_("not implemented yet");}; virtual void ResetLevelsetFromSegmentlist(IssmDouble* segments,int numsegments){_error_("not implemented yet");}; virtual IssmDouble CharacteristicLength(void)=0; Index: ../trunk-jpl/src/c/classes/Elements/Tria.cpp =================================================================== --- ../trunk-jpl/src/c/classes/Elements/Tria.cpp (revision 20718) +++ ../trunk-jpl/src/c/classes/Elements/Tria.cpp (revision 20719) @@ -337,6 +337,51 @@ delete gauss; } /*}}}*/ +void Tria::CalvingRateMinthickness(){/*{{{*/ + + IssmDouble calvingratex[NUMVERTICES]; + IssmDouble calvingratey[NUMVERTICES]; + IssmDouble calvingrate[NUMVERTICES]; + IssmDouble vx,vy,H,minH; + + /*Retrieve all inputs and parameters we will need*/ + Input* vx_input = inputs->GetInput(VxEnum); _assert_(vx_input); + Input* vy_input = inputs->GetInput(VyEnum); _assert_(vy_input); + Input* H_input = inputs->GetInput(ThicknessEnum); _assert_(H_input); + parameters->FindParam(&minH,CalvingMinthicknessEnum); + + /* Start looping on the number of vertices: */ + GaussTria* gauss=new GaussTria(); + for(int iv=0;ivGaussVertex(iv); + + /*Get velocity components and thickness*/ + vx_input->GetInputValue(&vx,gauss); + vy_input->GetInputValue(&vy,gauss); + H_input->GetInputValue(&H,gauss); + + /*Assign values*/ + if(H>minH){ + calvingratex[iv]=0.; + calvingratey[iv]=0.; + calvingrate[iv]=0.; + } + else{ + calvingratex[iv]=vx+1e-2; //counter balance advance + add some retreat + calvingratey[iv]=vy+1e-2; + calvingrate[iv]=sqrt(calvingratex[iv]*calvingratex[iv] + calvingratey[iv]*calvingratey[iv]); + } + } + + /*Add input*/ + this->inputs->AddInput(new TriaInput(CalvingratexEnum,&calvingratex[0],P1Enum)); + this->inputs->AddInput(new TriaInput(CalvingrateyEnum,&calvingratey[0],P1Enum)); + this->inputs->AddInput(new TriaInput(CalvingCalvingrateEnum,&calvingrate[0],P1Enum)); + + /*Clean up and return*/ + delete gauss; +} +/*}}}*/ void Tria::WriteLevelsetSegment(DataSet* segments){/*{{{*/ if(!this->IsZeroLevelset(MaskIceLevelsetEnum)) return; Index: ../trunk-jpl/src/c/classes/Elements/Tria.h =================================================================== --- ../trunk-jpl/src/c/classes/Elements/Tria.h (revision 20718) +++ ../trunk-jpl/src/c/classes/Elements/Tria.h (revision 20719) @@ -53,6 +53,7 @@ void AverageOntoPartition(Vector* partition_contributions,Vector* partition_areas,IssmDouble* vertex_response,IssmDouble* qmu_part); void CalvingRateLevermann(); void CalvingRateDev(); + void CalvingRateMinthickness(); void WriteLevelsetSegment(DataSet* segments); void ResetLevelsetFromSegmentlist(IssmDouble* segments,int numsegments); IssmDouble CharacteristicLength(void); Index: ../trunk-jpl/src/c/classes/FemModel.h =================================================================== --- ../trunk-jpl/src/c/classes/FemModel.h (revision 20718) +++ ../trunk-jpl/src/c/classes/FemModel.h (revision 20719) @@ -94,6 +94,7 @@ void DeviatoricStressx(); void CalvingRateLevermannx(); void CalvingRateDevx(); + void CalvingRateMinthicknessx(); void ResetLevelset(); #ifdef _HAVE_DAKOTA_ void DakotaResponsesx(double* d_responses,char** responses_descriptors,int numresponsedescriptors,int d_numresponses); Index: ../trunk-jpl/src/c/classes/FemModel.cpp =================================================================== --- ../trunk-jpl/src/c/classes/FemModel.cpp (revision 20718) +++ ../trunk-jpl/src/c/classes/FemModel.cpp (revision 20719) @@ -2165,6 +2165,14 @@ } } /*}}}*/ +void FemModel::CalvingRateMinthicknessx(){/*{{{*/ + + for(int i=0;iSize();i++){ + Element* element=dynamic_cast(this->elements->GetObjectByOffset(i)); + element->CalvingRateMinthickness(); + } +} +/*}}}*/ void FemModel::StrainRateparallelx(){/*{{{*/ for(int i=0;iSize();i++){ Index: ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp =================================================================== --- ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp (revision 20718) +++ ../trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp (revision 20719) @@ -197,6 +197,7 @@ switch(calvinglaw){ case DefaultCalvingEnum: case CalvingDevEnum: + case CalvingMinthicknessEnum: lsf_slopex_input = basalelement->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input); if(dim==2) lsf_slopey_input = basalelement->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input); calvingrate_input = basalelement->GetInput(CalvingCalvingrateEnum); _assert_(calvingrate_input); @@ -250,6 +251,8 @@ /*Get calving speed*/ switch(calvinglaw){ case DefaultCalvingEnum: + case CalvingDevEnum: + case CalvingMinthicknessEnum: lsf_slopex_input->GetInputValue(&dlsf[0],gauss); if(dim==2) lsf_slopey_input->GetInputValue(&dlsf[1],gauss); calvingrate_input->GetInputValue(&calvingrate,gauss); @@ -270,7 +273,6 @@ break; case CalvingLevermannEnum: - case CalvingDevEnum: calvingratex_input->GetInputValue(&c[0],gauss); if(dim==2) calvingratey_input->GetInputValue(&c[1],gauss); meltingrate_input->GetInputValue(&meltingrate,gauss);