Changeset 26650


Ignore:
Timestamp:
11/19/21 12:21:28 (3 years ago)
Author:
Mathieu Morlighem
Message:

CHG: moving EffectivePressure calculation to another function

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

Legend:

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

    r26632 r26650  
    154154   parameters->AddObject(iomodel->CopyConstantObject("md.hydrology.relaxation",HydrologyRelaxationEnum));
    155155        parameters->AddObject(iomodel->CopyConstantObject("md.hydrology.storage",HydrologyStorageEnum));
     156
     157        /*Deal with friction parameters*/
     158        int frictionlaw;
     159        iomodel->FindConstant(&frictionlaw,"md.friction.law");
     160        if(frictionlaw==6){
     161                parameters->AddObject(iomodel->CopyConstantObject("md.friction.gamma",FrictionGammaEnum));
     162        }
     163        if(frictionlaw==4){
     164                parameters->AddObject(iomodel->CopyConstantObject("md.friction.gamma",FrictionGammaEnum));
     165                parameters->AddObject(iomodel->CopyConstantObject("md.friction.coupling",FrictionCouplingEnum));
     166                parameters->AddObject(iomodel->CopyConstantObject("md.friction.effective_pressure_limit",FrictionEffectivePressureLimitEnum));
     167        }
     168        if(frictionlaw==1 || frictionlaw==3 || frictionlaw==7){
     169                parameters->AddObject(iomodel->CopyConstantObject("md.friction.coupling",FrictionCouplingEnum));
     170                parameters->AddObject(iomodel->CopyConstantObject("md.friction.effective_pressure_limit",FrictionEffectivePressureLimitEnum));
     171        }
     172        if(frictionlaw==9){
     173                parameters->AddObject(iomodel->CopyConstantObject("md.friction.gamma",FrictionGammaEnum));
     174                parameters->AddObject(iomodel->CopyConstantObject("md.friction.effective_pressure_limit",FrictionEffectivePressureLimitEnum));
     175                parameters->AddObject(new IntParam(FrictionCouplingEnum,0));
     176        }
    156177
    157178  /*Requested outputs*/
     
    465486
    466487        /*Get thickness and base on nodes to apply cap on water head*/
    467    IssmDouble* eff_pressure = xNew<IssmDouble>(numnodes);
    468488        IssmDouble* thickness = xNew<IssmDouble>(numnodes);
    469489        IssmDouble* bed       = xNew<IssmDouble>(numnodes);
     
    496516           values[i] = head_old[i] - relaxation*(head_old[i]-values[i]);
    497517
    498                 /*Calculate effective pressure*/
    499                 eff_pressure[i] = rho_ice*g*thickness[i] - rho_water*g*(values[i]-bed[i]);
    500 
    501518                if(xIsNan<IssmDouble>(values[i])) _error_("NaN found in solution vector");
    502519                if(xIsInf<IssmDouble>(values[i])) _error_("Inf found in solution vector");
     
    505522        /*Add input to the element: */
    506523        element->AddInput(HydrologyHeadEnum,values,element->GetElementType());
    507    element->AddInput(EffectivePressureEnum,eff_pressure,P1Enum);
    508524
    509525        /*Update reynolds number according to new solution*/
     
    519535        IssmDouble reynolds = conductivity*sqrt(dh[0]*dh[0]+dh[1]*dh[1])/NU;
    520536        element->AddInput(HydrologyReynoldsEnum,&reynolds,P0Enum);
     537
     538   /*Compute new effective pressure*/
     539   this->UpdateEffectivePressure(element);
    521540
    522541        /*Free resources:*/
     
    526545        xDelete<IssmDouble>(xyz_list);
    527546        xDelete<int>(doflist);
    528         xDelete<IssmDouble>(eff_pressure);
    529547   xDelete<IssmDouble>(head_old);
    530548}/*}}}*/
     
    724742        delete gauss;
    725743}/*}}}*/
     744void HydrologyShaktiAnalysis::UpdateEffectivePressure(FemModel* femmodel){/*{{{*/
     745
     746        for(Object* & object : femmodel->elements->objects){
     747                Element* element=xDynamicCast<Element*>(object);
     748                UpdateEffectivePressure(element);
     749        }
     750
     751}/*}}}*/
     752void HydrologyShaktiAnalysis::UpdateEffectivePressure(Element* element){/*{{{*/
     753
     754        /*Skip if water or ice shelf element*/
     755        if(element->IsAllFloating()) return;
     756
     757        /*Intermediaries*/
     758        IssmDouble bed,thickness,head;
     759
     760        /* Fetch number of nodes and allocate output*/
     761   int numnodes = element->GetNumberOfNodes();
     762   IssmDouble* N = xNew<IssmDouble>(numnodes);
     763
     764        /*Retrieve all inputs and parameters*/
     765        IssmDouble  g          = element->FindParam(ConstantsGEnum);
     766        IssmDouble  rho_ice    = element->FindParam(MaterialsRhoIceEnum);
     767        IssmDouble  rho_water  = element->FindParam(MaterialsRhoFreshwaterEnum);
     768        Input* head_input      = element->GetInput(HydrologyHeadEnum); _assert_(head_input);
     769        Input* thickness_input = element->GetInput(ThicknessEnum);     _assert_(thickness_input);
     770        Input* base_input      = element->GetInput(BaseEnum);          _assert_(base_input);
     771
     772
     773   Gauss* gauss=element->NewGauss();
     774   for (int i=0;i<numnodes;i++){
     775      gauss->GaussNode(element->GetElementType(),i);
     776
     777                base_input->GetInputValue(&bed,gauss);
     778                thickness_input->GetInputValue(&thickness,gauss);
     779                head_input->GetInputValue(&head,gauss);
     780
     781                N[i] = rho_ice*g*thickness - rho_water*g*(head-bed);
     782        }
     783
     784        /*Add new gap as an input*/
     785        element->AddInput(EffectivePressureEnum,N,element->GetElementType());
     786
     787        /*Clean up and return*/
     788   xDelete<IssmDouble>(N);
     789        delete gauss;
     790}/*}}}*/
  • issm/trunk-jpl/src/c/analyses/HydrologyShaktiAnalysis.h

    r26047 r26650  
    3636                void UpdateGapHeight(FemModel* femmodel);
    3737                void UpdateGapHeight(Element* element);
     38                void UpdateEffectivePressure(FemModel* femmodel);
     39                void UpdateEffectivePressure(Element* element);
    3840};
    3941#endif
Note: See TracChangeset for help on using the changeset viewer.