Ignore:
Timestamp:
06/11/19 11:07:32 (6 years ago)
Author:
tpelle
Message:

NEW: ISMIP6 and PICO basal melting parameterizations working in HO, PICOP coming soon

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/modules/FloatingiceMeltingRatePicox/FloatingiceMeltingRatePicox.cpp

    r23255 r24010  
    1212        bool isplume;
    1313
    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            }
     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        }
    2222
    2323        /*PICO melt rate parameterization (Reese et al., 2018)*/
    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);
     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);
    3030        }
    3131
     
    103103void ComputeBoxAreasPico(FemModel* femmodel){/*{{{*/
    104104
    105         int num_basins,maxbox,basinid,boxid;
     105        int num_basins,maxbox,basinid,boxid,domaintype;
    106106        IssmDouble dist_max,area;
    107107
     
    113113        for(int i=0;i<femmodel->elements->Size();i++){
    114114                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;};
    119123        }
    120124
     
    140144void ComputeAverageOceanvarsPico(FemModel* femmodel, int boxid){/*{{{*/
    141145
    142         int num_basins, basinid, maxbox, M;
     146        int num_basins, basinid, maxbox, M, domaintype;
    143147        IssmDouble area, toc, soc, overturning;
    144148        IssmDouble* boxareas=NULL;
     
    157161        for(int i=0;i<femmodel->elements->Size();i++){
    158162                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;
    160166                int el_boxid;
    161                 element->inputs->GetInputValue(&el_boxid,BasalforcingsPicoBoxIdEnum);
     167                basalelement->inputs->GetInputValue(&el_boxid,BasalforcingsPicoBoxIdEnum);
    162168                if(el_boxid!=boxid) continue;
    163169
    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);
    169175                tocs_input->GetInputValue(&toc,gauss);
    170176                socs_input->GetInputValue(&soc,gauss);
    171177                delete gauss;
    172                 area=element->GetHorizontalSurfaceArea();
     178                area=basalelement->GetHorizontalSurfaceArea();
    173179                toc_weighted_avg[basinid]+=toc*area;
    174180                soc_weighted_avg[basinid]+=soc*area;
     181                basalelement->FindParam(&domaintype,DomainTypeEnum);
     182                if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
    175183        }
    176184
     
    194202                for(int i=0;i<femmodel->elements->Size();i++){
    195203                        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;
    197207                        int el_boxid;
    198                         element->inputs->GetInputValue(&el_boxid,BasalforcingsPicoBoxIdEnum);
     208                        basalelement->inputs->GetInputValue(&el_boxid,BasalforcingsPicoBoxIdEnum);
    199209                        if(el_boxid!=boxid) continue;
    200210
    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);
    205215                        overturnings_input->GetInputValue(&overturning,gauss);
    206216                        delete gauss;
    207                         area=element->GetHorizontalSurfaceArea();
     217                        area=basalelement->GetHorizontalSurfaceArea();
    208218                        overturning_weighted_avg[basinid]+=overturning*area;
     219                        basalelement->FindParam(&domaintype,DomainTypeEnum);
     220                        if(domaintype!=Domain2DhorizontalEnum){basalelement->DeleteMaterials(); delete basalelement;};
    209221                }
    210222
Note: See TracChangeset for help on using the changeset viewer.