Changeset 22469
- Timestamp:
- 02/26/18 10:47:40 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatex/FloatingiceMeltingRatex.cpp
r20020 r22469 29 29 MismipFloatingiceMeltingRatex(femmodel); 30 30 break; 31 case BasalforcingsPicoEnum: 32 if(VerboseSolution())_printf0_(" call Pico Floating melting rate module\n"); 33 PicoFloatingiceMeltingRatex(femmodel); 34 break; 31 35 default: 32 36 _error_("Basal forcing model "<<EnumToStringx(basalforcing_model)<<" not supported yet"); … … 49 53 element->MismipFloatingiceMeltingRate(); 50 54 } 55 } 56 /*}}}*/ 51 57 58 void PicoFloatingiceMeltingRatex(FemModel* femmodel){/*{{{*/ 59 60 int i,k,p,numvertices; 61 int num_basins,maxbox,basinid,boxid; 62 IssmDouble dist_max,area,earth_grav,rhoi,rhow,rho_star,nu,latentheat; 63 IssmDouble c_p_ocean,lambda,a,b,c,alpha,Beta,gamma_T,overturning_coeff; 64 IssmDouble g1,g2,s1,p_coeff,tavg,savg,overturning_avg; 65 IssmDouble mean_toc,mean_soc,mean_overturning,pressure,T_star; 66 IssmDouble q_coeff,potential_pressure_melting_point,T_pressure_melting,overturning; 67 IssmDouble thickness,toc_farocean,soc_farocean,area_box1,Toc,Soc,basalmeltrate_shelf; 68 int* nd=NULL; 69 IssmDouble* dmax_basin=NULL; 70 IssmDouble* t_farocean=NULL; 71 IssmDouble* s_farocean=NULL; 72 IssmDouble* distances=NULL; 73 IssmDouble* boxareas=NULL; 74 Element* element=NULL; 75 76 femmodel->parameters->FindParam(&num_basins,BasalforcingsPicoNumBasinsEnum); 77 femmodel->parameters->FindParam(&maxbox,BasalforcingsPicoMaxboxcountEnum); 78 dmax_basin=xNew<IssmDouble>(num_basins); 79 femmodel->DistanceToFieldValue(MaskGroundediceLevelsetEnum,0.,DistanceToGroundinglineEnum); 80 femmodel->DistanceToFieldValue(MaskIceLevelsetEnum,0.,DistanceToCalvingfrontEnum); 81 // find maximum distance to grounding line 82 dist_max=-1.; 83 for(i=0;i<num_basins;i++){ 84 dmax_basin[i]=-1; 85 } 86 for(i=0;i<femmodel->elements->Size();i++){ 87 element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i)); 88 if(!element->IsFloating()) continue; 89 numvertices = element->GetNumberOfVertices(); 90 distances=xNew<IssmDouble>(numvertices); 91 element->GetInputListOnVertices(&distances[0],DistanceToGroundinglineEnum); 92 element->inputs->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum); 93 for(k=0; k<numvertices; k++){ 94 if(abs(distances[k])>dist_max){dist_max=abs(distances[k]);} 95 if(abs(distances[k])>dmax_basin[basinid]){dmax_basin[basinid]=abs(distances[k]);} 96 } 97 } 98 //1 Define pico boxes 99 nd=xNew<int>(num_basins); 100 for(i=0; i<num_basins;i++){ 101 nd[i] = round(sqrt(dmax_basin[i]/dist_max)*(maxbox-1)); //0-based 102 } 103 for(int i=0;i<femmodel->elements->Size();i++){ 104 Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i)); 105 element->PicoUpdateBoxid(nd); 106 } 107 108 //2 Get area of the boxes 109 boxareas=new Vector<IssmDouble>(num_basins*maxbox); 110 for(i=0;i<num_basins*maxbox;i++){boxareas[i]=0.;} 111 for(i=0;i<femmodel->elements->Size();i++){ 112 element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i)); 113 if(!element->IsFloating()) continue; 114 element->inputs->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum); 115 element->inputs->GetInputValue(&boxid,BasalforcingsPicoBoxIdEnum); 116 boxareas[basinid*maxbox+boxid]+=element->GetArea(); 117 } 118 119 //3 Compute variables in first box 120 for(int p=0;p<femmodel->elements->Size();p++){ 121 element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(p)); 122 element->PicoUpdateFirstBox(); 123 //Need to save the box1 average of temp, sal, and overt for input into next box. 124 } 125 126 127 //4 Compute variables of all other boxes 128 129 // for(int i=0;i<femmodel->elements->Size();i++){ 130 // Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i)); 131 // element->PicoFloatingiceMeltingRate(); 132 // } 133 /*Cleanup and return */ 134 xDelete<int>(nd); 135 xDelete<IssmDouble>(dmax_basin); 136 xDelete<IssmDouble>(distances); 137 xDelete<IssmDouble>(boxareas); 138 xDelete<IssmDouble>(t_farocean); 139 xDelete<IssmDouble>(s_farocean); 140 xDelete<IssmDouble>(element); 52 141 }/*}}}*/
Note:
See TracChangeset
for help on using the changeset viewer.