Changeset 24010 for issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatePicox/FloatingiceMeltingRatePicox.cpp
- Timestamp:
- 06/11/19 11:07:32 (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatePicox/FloatingiceMeltingRatePicox.cpp
r23255 r24010 12 12 bool isplume; 13 13 14 15 16 17 18 19 20 21 14 /*First, reset all melt to 0 */ 15 for(int i=0;i<femmodel->elements->Size();i++){ 16 Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i)); 17 int numvertices = element->GetNumberOfVertices(); 18 IssmDouble* values = xNewZeroInit<IssmDouble>(numvertices); 19 element->AddInput(BasalforcingsFloatingiceMeltingRateEnum,values,P1Enum); 20 xDelete<IssmDouble>(values); 21 } 22 22 23 23 /*PICO melt rate parameterization (Reese et al., 2018)*/ 24 25 26 27 28 29 24 femmodel->parameters->FindParam(&maxbox,BasalforcingsPicoMaxboxcountEnum); 25 UpdateBoxIdsPico(femmodel); 26 ComputeBoxAreasPico(femmodel); 27 for(int i=0;i<maxbox;i++){ 28 UpdateBoxPico(femmodel,i); 29 ComputeAverageOceanvarsPico(femmodel,i); 30 30 } 31 31 … … 103 103 void ComputeBoxAreasPico(FemModel* femmodel){/*{{{*/ 104 104 105 int num_basins,maxbox,basinid,boxid ;105 int num_basins,maxbox,basinid,boxid,domaintype; 106 106 IssmDouble dist_max,area; 107 107 … … 113 113 for(int i=0;i<femmodel->elements->Size();i++){ 114 114 Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i)); 115 if(!element->IsIceInElement() || !element->IsFloating()) continue; 116 element->inputs->GetInputValue(&boxid,BasalforcingsPicoBoxIdEnum); 117 element->inputs->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum); 118 boxareas[basinid*maxbox+boxid]+=element->GetHorizontalSurfaceArea(); 115 if(!element->IsOnBase()) continue; 116 Element* basalelement = element->SpawnBasalElement(); 117 if(!basalelement->IsIceInElement() || !basalelement->IsFloating()) continue; 118 basalelement->inputs->GetInputValue(&boxid,BasalforcingsPicoBoxIdEnum); 119 basalelement->inputs->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum); 120 boxareas[basinid*maxbox+boxid]+=basalelement->GetHorizontalSurfaceArea(); 121 basalelement->FindParam(&domaintype,DomainTypeEnum); 122 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 119 123 } 120 124 … … 140 144 void ComputeAverageOceanvarsPico(FemModel* femmodel, int boxid){/*{{{*/ 141 145 142 int num_basins, basinid, maxbox, M ;146 int num_basins, basinid, maxbox, M, domaintype; 143 147 IssmDouble area, toc, soc, overturning; 144 148 IssmDouble* boxareas=NULL; … … 157 161 for(int i=0;i<femmodel->elements->Size();i++){ 158 162 Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i)); 159 if(!element->IsIceInElement() || !element->IsFloating()) continue; 163 if(!element->IsOnBase()) continue; 164 Element* basalelement = element->SpawnBasalElement(); 165 if(!basalelement->IsIceInElement() || !basalelement->IsFloating()) continue; 160 166 int el_boxid; 161 element->inputs->GetInputValue(&el_boxid,BasalforcingsPicoBoxIdEnum);167 basalelement->inputs->GetInputValue(&el_boxid,BasalforcingsPicoBoxIdEnum); 162 168 if(el_boxid!=boxid) continue; 163 169 164 Input* tocs_input= element->GetInput(BasalforcingsPicoSubShelfOceanTempEnum); _assert_(tocs_input);165 Input* socs_input= element->GetInput(BasalforcingsPicoSubShelfOceanSalinityEnum); _assert_(socs_input);166 167 element->inputs->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum);168 Gauss* gauss= element->NewGauss(1); gauss->GaussPoint(0);170 Input* tocs_input=basalelement->GetInput(BasalforcingsPicoSubShelfOceanTempEnum); _assert_(tocs_input); 171 Input* socs_input=basalelement->GetInput(BasalforcingsPicoSubShelfOceanSalinityEnum); _assert_(socs_input); 172 173 basalelement->inputs->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum); 174 Gauss* gauss=basalelement->NewGauss(1); gauss->GaussPoint(0); 169 175 tocs_input->GetInputValue(&toc,gauss); 170 176 socs_input->GetInputValue(&soc,gauss); 171 177 delete gauss; 172 area= element->GetHorizontalSurfaceArea();178 area=basalelement->GetHorizontalSurfaceArea(); 173 179 toc_weighted_avg[basinid]+=toc*area; 174 180 soc_weighted_avg[basinid]+=soc*area; 181 basalelement->FindParam(&domaintype,DomainTypeEnum); 182 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 175 183 } 176 184 … … 194 202 for(int i=0;i<femmodel->elements->Size();i++){ 195 203 Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i)); 196 if(!element->IsIceInElement() || !element->IsFloating()) continue; 204 if(!element->IsOnBase()) continue; 205 Element* basalelement = element->SpawnBasalElement(); 206 if(!basalelement->IsIceInElement() || !basalelement->IsFloating()) continue; 197 207 int el_boxid; 198 element->inputs->GetInputValue(&el_boxid,BasalforcingsPicoBoxIdEnum);208 basalelement->inputs->GetInputValue(&el_boxid,BasalforcingsPicoBoxIdEnum); 199 209 if(el_boxid!=boxid) continue; 200 210 201 Input* overturnings_input= element->GetInput(BasalforcingsPicoSubShelfOceanOverturningEnum); _assert_(overturnings_input);202 203 element->inputs->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum);204 Gauss* gauss= element->NewGauss(1); gauss->GaussPoint(0);211 Input* overturnings_input=basalelement->GetInput(BasalforcingsPicoSubShelfOceanOverturningEnum); _assert_(overturnings_input); 212 213 basalelement->inputs->GetInputValue(&basinid,BasalforcingsPicoBasinIdEnum); 214 Gauss* gauss=basalelement->NewGauss(1); gauss->GaussPoint(0); 205 215 overturnings_input->GetInputValue(&overturning,gauss); 206 216 delete gauss; 207 area= element->GetHorizontalSurfaceArea();217 area=basalelement->GetHorizontalSurfaceArea(); 208 218 overturning_weighted_avg[basinid]+=overturning*area; 219 basalelement->FindParam(&domaintype,DomainTypeEnum); 220 if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;}; 209 221 } 210 222
Note:
See TracChangeset
for help on using the changeset viewer.