Changeset 17166


Ignore:
Timestamp:
01/24/14 11:41:17 (11 years ago)
Author:
jbondzio
Message:

CHG: separated computation of basal melting rates and drainage of excess water in ice column. minor cleanups

Location:
issm/trunk-jpl/src/c/analyses
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.cpp

    r17157 r17166  
    821821
    822822/*Modules*/
    823 /*{{{*/
    824 void EnthalpyAnalysis::PostProcessing(FemModel* femmodel){
     823void EnthalpyAnalysis::PostProcessing(FemModel* femmodel){/*{{{*/
     824
    825825        /*Intermediaries*/
    826         int solution_type;
    827 
    828         /*Compute basal melting rates: */
    829         for(int i=0;i<femmodel->elements->Size();i++){
    830                 Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
    831                 ComputeBasalMeltingrate(element);
    832         }
    833 
    834         /*Update basal dirichlet BCs for enthalpy in transient runs: */
    835         femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
    836         if(solution_type==TransientSolutionEnum){
    837                 for(int i=0;i<femmodel->elements->Size();i++){
     826        int solution_type, i;
     827        bool computebasalmeltingrates=true;
     828        bool isdrainage=true;
     829        bool updatebasalconstraints=true;
     830
     831        if(isdrainage){
     832                /*Drain excess water fraction in ice column: */
     833                for(i=0;i<femmodel->elements->Size();i++){
    838834                        Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
    839                         UpdateBasalConstraints(element);
    840                 }
    841         }
    842 }/*}}}*/
    843 
     835                        DrainWaterfractionIcecolumn(element);
     836                }
     837        }
     838
     839        if(computebasalmeltingrates){
     840                /*Compute basal melting rates: */
     841                for(i=0;i<femmodel->elements->Size();i++){
     842                        Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
     843                        ComputeBasalMeltingrate(element);
     844                }
     845        }
     846
     847        if(updatebasalconstraints){
     848                /*Update basal dirichlet BCs for enthalpy in transient runs: */
     849                femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
     850                if(solution_type==TransientSolutionEnum){
     851                        for(i=0;i<femmodel->elements->Size();i++){
     852                                Element* element=dynamic_cast<Element*>(femmodel->elements->GetObjectByOffset(i));
     853                                UpdateBasalConstraints(element);
     854                        }
     855                }
     856        }
     857}/*}}}*/
    844858void EnthalpyAnalysis::ComputeBasalMeltingrate(Element* element){/*{{{*/
    845859        /*Calculate the basal melt rates of the enthalpy model after Aschwanden 2012*/
     
    946960                }
    947961        }
    948 
    949         /******** DRAINAGE *****************************************/
    950         IssmDouble* drainrate_column  = xNew<IssmDouble>(numsegments);
    951         IssmDouble* drainrate_element = xNew<IssmDouble>(numsegments);
    952         for(is=0;is<numsegments;is++)   drainrate_column[is]=0.;
    953         Element* elementi = element;
    954         for(;;){
    955                 for(is=0;is<numsegments;is++)   drainrate_element[is]=0.;
    956                 DrainWaterfraction(elementi,drainrate_element); // TODO: make sure every vertex is only drained once
    957                 for(is=0;is<numsegments;is++)   drainrate_column[is]+=drainrate_element[is];
    958 
    959                 if(elementi->IsOnSurface()) break;
    960                 elementi=elementi->GetUpperElement();                   
    961         }
    962         /* add drained water to melting rate*/
    963         for(is=0;is<numsegments;is++) meltingrate_enthalpy[is]+=drainrate_column[is];
    964 
    965962        /******** UPDATE MELTINGRATES AND WATERCOLUMN **************/
    966963        element->FindParam(&dt,TimesteppingTimeStepEnum);
     
    970967                if(dt!=0.){
    971968                        if(watercolumn[vertexdown]+meltingrate_enthalpy[is]*dt<0.){     // prevent too much freeze on                   
    972                                 melting_overshoot=watercolumn[vertexdown]+meltingrate_enthalpy[is]*dt;
    973                                 lambda=melting_overshoot/(meltingrate_enthalpy[is]*dt); _assert_(lambda>0); _assert_(lambda<1);
    974                                 basalmeltingrate[vertexdown]=(1.-lambda)*meltingrate_enthalpy[is];
     969                                lambda = -watercolumn[vertexdown]/(dt*meltingrate_enthalpy[is]); _assert_(lambda>=0.); _assert_(lambda<1.);
    975970                                watercolumn[vertexdown]=0.;
    976                                 yts=365.*24.*60.*60.;
    977                                 enthalpy[vertexdown]+=dt/yts*lambda*heating[is];
     971                                basalmeltingrate[vertexdown]=lambda*meltingrate_enthalpy[is]; // restrict freeze on only to size of watercolumn
     972                                enthalpy[vertexdown]+=(1.-lambda)*meltingrate_enthalpy[is]*dt*latentheat; // use rest of energy to cool down base
    978973                        }
    979974                        else{
     
    1004999        xDelete<IssmDouble>(meltingrate_enthalpy);
    10051000        xDelete<IssmDouble>(heating);
     1001        xDelete<IssmDouble>(xyz_list);
     1002}/*}}}*/
     1003void EnthalpyAnalysis::DrainWaterfractionIcecolumn(Element* element){/*{{{*/
     1004
     1005        /* Only drain waterfraction of ice column from element at base*/
     1006        if(!element->IsOnBed()) return; //FIXME: allow freeze on for floating elements
     1007
     1008        /* Intermediaries*/
     1009        int is, numvertices, numsegments;
     1010        int *pairindices   = NULL;
     1011
     1012        numvertices=element->GetNumberOfVertices();
     1013        element->VerticalSegmentIndices(&pairindices,&numsegments);
     1014
     1015        IssmDouble* watercolumn = xNew<IssmDouble>(numvertices);
     1016        IssmDouble* drainrate_column  = xNew<IssmDouble>(numsegments);
     1017        IssmDouble* drainrate_element = xNew<IssmDouble>(numsegments);
     1018
     1019        element->GetInputListOnVertices(watercolumn,WatercolumnEnum);
     1020
     1021        for(is=0;is<numsegments;is++)   drainrate_column[is]=0.;
     1022        Element* elementi = element;
     1023        for(;;){
     1024                for(is=0;is<numsegments;is++)   drainrate_element[is]=0.;
     1025                DrainWaterfraction(elementi,drainrate_element); // TODO: make sure every vertex is only drained once
     1026                for(is=0;is<numsegments;is++)   drainrate_column[is]+=drainrate_element[is];
     1027
     1028                if(elementi->IsOnSurface()) break;
     1029                elementi=elementi->GetUpperElement();                   
     1030        }
     1031        /* add drained water to water column*/
     1032        for(is=0;is<numsegments;is++) watercolumn[is]+=drainrate_column[is];
     1033        /* Feed updated water column back into model */
     1034        element->AddInput(WatercolumnEnum,watercolumn,P1Enum);
     1035
     1036        delete pairindices;
    10061037        xDelete<IssmDouble>(drainrate_column);
    10071038        xDelete<IssmDouble>(drainrate_element);
    1008         xDelete<IssmDouble>(xyz_list);
    1009 }/*}}}*/
    1010 
     1039        xDelete<IssmDouble>(watercolumn);
     1040}/*}}}*/
    10111041void EnthalpyAnalysis::DrainWaterfraction(Element* element, IssmDouble* pdrainrate_element){/*{{{*/
    10121042
     
    10561086                height_element=fabs(xyz_list[vertexup*3+2]-xyz_list[vertexdown*3+2]);
    10571087                pdrainrate_element[is]=(deltawaterfractions[vertexdown]+deltawaterfractions[vertexup])/2.*height_element; // return water equivalent of drainage
     1088                _assert_(pdrainrate_element[is]>=0.);
    10581089        }
    10591090
     
    10661097        xDelete<IssmDouble>(deltawaterfractions);
    10671098}/*}}}*/
    1068 
    10691099void EnthalpyAnalysis::UpdateBasalConstraints(Element* element){/*{{{*/
    10701100
     
    11201150                        setspc = false;
    11211151
    1122 
    1123 
    11241152                node=element->GetNode(indices[i]);
    11251153                if (setspc)
    1126                         node->ApplyConstraint(1,h_pmp); /*apply spc*/ //nodes[indices[i]]->ApplyConstraint(1,h_pmp);
     1154                        node->ApplyConstraint(1,h_pmp); /*apply spc*/
    11271155                else                   
    1128                         node->DofInFSet(0); /*remove spc*/ //nodes[indices[i]]->DofInFSet(0);
     1156                        node->DofInFSet(0); /*remove spc*/
    11291157        }
    11301158
  • issm/trunk-jpl/src/c/analyses/EnthalpyAnalysis.h

    r17014 r17166  
    4040                static void PostProcessing(FemModel* femmodel);
    4141                static void ComputeBasalMeltingrate(Element* element);
     42                static void DrainWaterfractionIcecolumn(Element* element);
    4243                static void DrainWaterfraction(Element* element, IssmDouble* pdrainrate_element);
    4344                static void UpdateBasalConstraints(Element* element);
Note: See TracChangeset for help on using the changeset viewer.