Changeset 18511


Ignore:
Timestamp:
09/12/14 09:21:30 (11 years ago)
Author:
bdef
Message:

NEW:Adding Hydrology driven friction law

Location:
issm/trunk-jpl/src/c
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/classes/Loads/Friction.cpp

    r18064 r18511  
    4848                case 2:
    4949                        GetAlpha2Weertman(palpha2,gauss);
    50                         break;
    51                 default:
     50          case 3:
     51                        GetAlpha2Hydro(palpha2,gauss);
     52                        break;
     53          default:
    5254                        _error_("not supported");
    5355        }
     
    155157        *palpha2=alpha2;
    156158}/*}}}*/
     159void Friction::GetAlpha2Hydro(IssmDouble* palpha2, Gauss* gauss){/*{{{*/
     160
     161        /*This routine calculates the basal friction coefficient
     162                Based on Gagliardini 2007, needs a good effective pressure computation
     163          alpha2= C*Neff*[|vel|/{(C^n*Neff^n*As)*(1+alpha*Chi^q)}]^(1/n)  with
     164                -Chi=|vel|/(C^n*Neff^n*As)
     165                -alpha=(q-1)^(q-1)/q^q  **/
     166
     167        /*diverse: */
     168        IssmDouble  q_exp;
     169        IssmDouble  C_param;
     170        IssmDouble  As;
     171
     172        IssmDouble  Neff;
     173        IssmDouble  n;
     174
     175        IssmDouble  alpha;
     176        IssmDouble  Chi;
     177
     178        IssmDouble  vx,vy,vz,vmag;
     179        IssmDouble  alpha2;
     180
     181        /*Recover parameters: */
     182        element->GetInputValue(&q_exp,FrictionQEnum);
     183        element->GetInputValue(&C_param,FrictionCEnum);
     184        element->GetInputValue(&As,FrictionAsEnum);
     185
     186        element->GetInputValue(&Neff,gauss,EffectivePressureEnum);
     187        element->GetInputValue(&n,gauss,MaterialsRheologyNEnum);
     188       
     189        if(Neff<0)Neff=0;
     190
     191        switch(dim){
     192                case 1:
     193                        element->GetInputValue(&vx,gauss,VxEnum);
     194                        vmag=sqrt(vx*vx);
     195                        break;
     196                case 2:
     197                        element->GetInputValue(&vx,gauss,VxEnum);
     198                        element->GetInputValue(&vy,gauss,VyEnum);
     199                        vmag=sqrt(vx*vx+vy*vy);
     200                        break;
     201                case 3:
     202                        element->GetInputValue(&vx,gauss,VxEnum);
     203                        element->GetInputValue(&vy,gauss,VyEnum);
     204                        element->GetInputValue(&vz,gauss,VzEnum);
     205                        vmag=sqrt(vx*vx+vy*vy+vz*vz);
     206                        break;
     207                default:
     208                        _error_("not supported");
     209        }
     210
     211        //compute alpha and Chi coefficients: */
     212        alpha=(pow(q_exp-1,q_exp-1))/pow(q_exp,q_exp);
     213        Chi=vmag/(pow(C_param,n)*pow(Neff,n)*As);
     214
     215        alpha2=C_param*Neff*pow((Chi/(1+alpha*pow(Chi,q_exp))),1./n);
     216        _assert_(!xIsNan<IssmDouble>(alpha2));
     217       
     218        /*Assign output pointers:*/
     219        *palpha2=alpha2;
     220}/*}}}*/
    157221void Friction::GetAlphaComplement(IssmDouble* palpha_complement, Gauss* gauss){/*{{{*/
    158222
  • issm/trunk-jpl/src/c/classes/Loads/Friction.h

    r17952 r18511  
    3232                void  GetAlpha2Viscous(IssmDouble* palpha2,Gauss* gauss);
    3333                void  GetAlpha2Weertman(IssmDouble* palpha2,Gauss* gauss);
     34                void  GetAlpha2Hydro(IssmDouble* palpha2,Gauss* gauss);
    3435                void  GetAlphaComplement(IssmDouble* alpha_complement,Gauss* gauss);
    3536};
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r18504 r18511  
    8888        FlowequationFeFSEnum,
    8989        FlowequationVertexEquationEnum,
     90        FrictionAsEnum,
    9091        FrictionCoefficientEnum,
    9192        FrictionPEnum,
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r18504 r18511  
    9696                case FlowequationFeFSEnum : return "FlowequationFeFS";
    9797                case FlowequationVertexEquationEnum : return "FlowequationVertexEquation";
     98                case FrictionAsEnum : return "FrictionAs";
    9899                case FrictionCoefficientEnum : return "FrictionCoefficient";
    99100                case FrictionPEnum : return "FrictionP";
  • issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r18504 r18511  
    9696              else if (strcmp(name,"FlowequationFeFS")==0) return FlowequationFeFSEnum;
    9797              else if (strcmp(name,"FlowequationVertexEquation")==0) return FlowequationVertexEquationEnum;
     98              else if (strcmp(name,"FrictionAs")==0) return FrictionAsEnum;
    9899              else if (strcmp(name,"FrictionCoefficient")==0) return FrictionCoefficientEnum;
    99100              else if (strcmp(name,"FrictionP")==0) return FrictionPEnum;
     
    136137              else if (strcmp(name,"HydrologydcIsefficientlayer")==0) return HydrologydcIsefficientlayerEnum;
    137138              else if (strcmp(name,"HydrologydcSedimentlimitFlag")==0) return HydrologydcSedimentlimitFlagEnum;
    138               else if (strcmp(name,"HydrologydcSedimentlimit")==0) return HydrologydcSedimentlimitEnum;
    139139         else stage=2;
    140140   }
    141141   if(stage==2){
    142               if (strcmp(name,"HydrologydcTransferFlag")==0) return HydrologydcTransferFlagEnum;
     142              if (strcmp(name,"HydrologydcSedimentlimit")==0) return HydrologydcSedimentlimitEnum;
     143              else if (strcmp(name,"HydrologydcTransferFlag")==0) return HydrologydcTransferFlagEnum;
    143144              else if (strcmp(name,"HydrologydcLeakageFactor")==0) return HydrologydcLeakageFactorEnum;
    144145              else if (strcmp(name,"HydrologydcPenaltyFactor")==0) return HydrologydcPenaltyFactorEnum;
     
    259260              else if (strcmp(name,"MassFluxSegments")==0) return MassFluxSegmentsEnum;
    260261              else if (strcmp(name,"MassFluxSegmentsPresent")==0) return MassFluxSegmentsPresentEnum;
    261               else if (strcmp(name,"QmuMassFluxSegmentsPresent")==0) return QmuMassFluxSegmentsPresentEnum;
    262262         else stage=3;
    263263   }
    264264   if(stage==3){
    265               if (strcmp(name,"QmuNumberofpartitions")==0) return QmuNumberofpartitionsEnum;
     265              if (strcmp(name,"QmuMassFluxSegmentsPresent")==0) return QmuMassFluxSegmentsPresentEnum;
     266              else if (strcmp(name,"QmuNumberofpartitions")==0) return QmuNumberofpartitionsEnum;
    266267              else if (strcmp(name,"QmuNumberofresponses")==0) return QmuNumberofresponsesEnum;
    267268              else if (strcmp(name,"QmuPartition")==0) return QmuPartitionEnum;
     
    382383              else if (strcmp(name,"MasstransportAnalysis")==0) return MasstransportAnalysisEnum;
    383384              else if (strcmp(name,"MasstransportSolution")==0) return MasstransportSolutionEnum;
    384               else if (strcmp(name,"FreeSurfaceBaseAnalysis")==0) return FreeSurfaceBaseAnalysisEnum;
    385385         else stage=4;
    386386   }
    387387   if(stage==4){
    388               if (strcmp(name,"FreeSurfaceTopAnalysis")==0) return FreeSurfaceTopAnalysisEnum;
     388              if (strcmp(name,"FreeSurfaceBaseAnalysis")==0) return FreeSurfaceBaseAnalysisEnum;
     389              else if (strcmp(name,"FreeSurfaceTopAnalysis")==0) return FreeSurfaceTopAnalysisEnum;
    389390              else if (strcmp(name,"SurfaceNormalVelocity")==0) return SurfaceNormalVelocityEnum;
    390391              else if (strcmp(name,"ExtrudeFromBaseAnalysis")==0) return ExtrudeFromBaseAnalysisEnum;
     
    505506              else if (strcmp(name,"Friction")==0) return FrictionEnum;
    506507              else if (strcmp(name,"Internal")==0) return InternalEnum;
    507               else if (strcmp(name,"MassFlux")==0) return MassFluxEnum;
    508508         else stage=5;
    509509   }
    510510   if(stage==5){
    511               if (strcmp(name,"MeltingOffset")==0) return MeltingOffsetEnum;
     511              if (strcmp(name,"MassFlux")==0) return MassFluxEnum;
     512              else if (strcmp(name,"MeltingOffset")==0) return MeltingOffsetEnum;
    512513              else if (strcmp(name,"Misfit")==0) return MisfitEnum;
    513514              else if (strcmp(name,"Pressure")==0) return PressureEnum;
     
    628629              else if (strcmp(name,"MisfitTimeinterpolation")==0) return MisfitTimeinterpolationEnum;
    629630              else if (strcmp(name,"MisfitWeights")==0) return MisfitWeightsEnum;
    630               else if (strcmp(name,"MisfitWeightsEnum")==0) return MisfitWeightsEnumEnum;
    631631         else stage=6;
    632632   }
    633633   if(stage==6){
    634               if (strcmp(name,"SurfaceObservation")==0) return SurfaceObservationEnum;
     634              if (strcmp(name,"MisfitWeightsEnum")==0) return MisfitWeightsEnumEnum;
     635              else if (strcmp(name,"SurfaceObservation")==0) return SurfaceObservationEnum;
    635636              else if (strcmp(name,"WeightsSurfaceObservation")==0) return WeightsSurfaceObservationEnum;
    636637              else if (strcmp(name,"MinVel")==0) return MinVelEnum;
     
    751752              else if (strcmp(name,"MaterialsTimeRelaxationDamage")==0) return MaterialsTimeRelaxationDamageEnum;
    752753              else if (strcmp(name,"MaterialsRidgingExponent")==0) return MaterialsRidgingExponentEnum;
    753               else if (strcmp(name,"MaterialsCohesion")==0) return MaterialsCohesionEnum;
    754754         else stage=7;
    755755   }
    756756   if(stage==7){
    757               if (strcmp(name,"MaterialsInternalFrictionCoef")==0) return MaterialsInternalFrictionCoefEnum;
     757              if (strcmp(name,"MaterialsCohesion")==0) return MaterialsCohesionEnum;
     758              else if (strcmp(name,"MaterialsInternalFrictionCoef")==0) return MaterialsInternalFrictionCoefEnum;
    758759              else if (strcmp(name,"MaterialsCompressionCoef")==0) return MaterialsCompressionCoefEnum;
    759760              else if (strcmp(name,"MaterialsTractionCoef")==0) return MaterialsTractionCoefEnum;
Note: See TracChangeset for help on using the changeset viewer.