Changeset 23808


Ignore:
Timestamp:
03/27/19 19:26:53 (6 years ago)
Author:
schlegel
Message:

CHG: add capability to repeat forcing as a climatology for GEMB

Location:
issm/trunk-jpl/src
Files:
7 edited

Legend:

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

    r23585 r23808  
    214214                        parameters->AddObject(iomodel->CopyConstantObject("md.smb.isdensification",SmbIsdensificationEnum));
    215215                        parameters->AddObject(iomodel->CopyConstantObject("md.smb.isturbulentflux",SmbIsturbulentfluxEnum));
     216                        parameters->AddObject(iomodel->CopyConstantObject("md.smb.isclimatology",SmbIsclimatologyEnum));
    216217                        parameters->AddObject(iomodel->CopyConstantObject("md.smb.InitDensityScaling",SmbInitDensityScalingEnum));
    217218                        parameters->AddObject(iomodel->CopyConstantObject("md.smb.ThermoDeltaTScaling",SmbThermoDeltaTScalingEnum));
  • issm/trunk-jpl/src/c/classes/Elements/Element.cpp

    r23797 r23808  
    32153215        IssmDouble Tz,Vz=0.0;
    32163216        IssmDouble rho_ice, rho_water,aSnow,aIce;
    3217         IssmDouble time,dt;
     3217        IssmDouble time,dt,starttime,finaltime;
     3218        IssmDouble timeclim=0.0;
    32183219        IssmDouble t,smb_dt;
    32193220        IssmDouble yts;
     
    32503251        IssmDouble dMass=0.0;
    32513252        bool isgraingrowth,isalbedo,isshortwave,isthermal,isaccumulation,ismelt,isdensification,isturbulentflux;
     3253        bool isclimatology=false;
    32523254        IssmDouble init_scaling=0.0;
    32533255        IssmDouble thermo_scaling=1.0;
    32543256        IssmDouble adThresh=1023.0;
     3257        int offset0, offsetend;
     3258        IssmDouble time0, timeend;
    32553259
    32563260        /*}}}*/
     
    32963300        parameters->FindParam(&dt,TimesteppingTimeStepEnum);          /*transient core time step*/
    32973301        parameters->FindParam(&yts,ConstantsYtsEnum);
     3302        parameters->FindParam(&finaltime,TimesteppingFinalTimeEnum);
     3303        parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
    32983304        parameters->FindParam(&smb_dt,SmbDtEnum);                     /*time period for the smb solution,  usually smaller than the glaciological dt*/
    32993305        parameters->FindParam(&aIdx,SmbAIdxEnum);
     
    33053311        parameters->FindParam(&t0dry,SmbT0dryEnum);
    33063312        parameters->FindParam(&K,SmbKEnum);
     3313        parameters->FindParam(&isclimatology,SmbIsclimatologyEnum);
    33073314        parameters->FindParam(&isgraingrowth,SmbIsgraingrowthEnum);
    33083315        parameters->FindParam(&isalbedo,SmbIsalbedoEnum);
     
    34663473        //go back to time - deltaT:
    34673474        time-=dt;
     3475        if (isclimatology){
     3476                //If this is a climatology, we need to repeat the forcing after the final time
     3477                offset0=dynamic_cast<TransientInput*>(Ta_input)->GetTimeInputOffset(starttime);
     3478                offsetend=dynamic_cast<TransientInput*>(Ta_input)->GetTimeInputOffset(finaltime);
     3479                time0=dynamic_cast<TransientInput*>(Ta_input)->GetTimeByOffset(offset0);
     3480                timeend=dynamic_cast<TransientInput*>(Ta_input)->GetTimeByOffset(offsetend);
     3481                timeclim=time0+fmod(time-time0,timeend-time0);
     3482        }
     3483        else{
     3484                timeclim=time;
     3485        }
    34683486
    34693487        /*Start loop: */
     
    34743492
    34753493                /*extract daily data:{{{*/
    3476                 Ta_input->GetInputValue(&Ta,gauss,t);//screen level air temperature [K]
    3477                 V_input->GetInputValue(&V,gauss,t);  //wind speed [m s-1]
    3478                 Dlwr_input->GetInputValue(&dlw,gauss,t);   //downward longwave radiation flux [W m-2]
    3479                 Dswr_input->GetInputValue(&dsw,gauss,t);   //downward shortwave radiation flux [W m-2]
    3480                 P_input->GetInputValue(&P,gauss,t);        //precipitation [kg m-2]
    3481                 eAir_input->GetInputValue(&eAir,gauss,t);  //screen level vapor pressure [Pa]
    3482                 pAir_input->GetInputValue(&pAir,gauss,t);  // screen level air pressure [Pa]
     3494                Ta_input->GetInputValue(&Ta,gauss,t-time+timeclim);//screen level air temperature [K]
     3495                V_input->GetInputValue(&V,gauss,t-time+timeclim);  //wind speed [m s-1]
     3496                Dlwr_input->GetInputValue(&dlw,gauss,t-time+timeclim);   //downward longwave radiation flux [W m-2]
     3497                Dswr_input->GetInputValue(&dsw,gauss,t-time+timeclim);   //downward shortwave radiation flux [W m-2]
     3498                P_input->GetInputValue(&P,gauss,t-time+timeclim);        //precipitation [kg m-2]
     3499                eAir_input->GetInputValue(&eAir,gauss,t-time+timeclim);  //screen level vapor pressure [Pa]
     3500                pAir_input->GetInputValue(&pAir,gauss,t-time+timeclim);  // screen level air pressure [Pa]
    34833501                teValue_input->GetInputValue(&teValue,gauss);  // screen level air pressure [Pa]
    34843502                aValue_input->GetInputValue(&aValue,gauss);  // screen level air pressure [Pa]
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r23795 r23808  
    335335        SmbIsaccumulationEnum,
    336336        SmbIsalbedoEnum,
     337        SmbIsclimatologyEnum,
    337338        SmbIsd18opdEnum,
    338339        SmbIsdelta18oEnum,
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r23795 r23808  
    343343                case SmbIsaccumulationEnum : return "SmbIsaccumulation";
    344344                case SmbIsalbedoEnum : return "SmbIsalbedo";
     345                case SmbIsclimatologyEnum : return "SmbIsclimatology";
    345346                case SmbIsd18opdEnum : return "SmbIsd18opd";
    346347                case SmbIsdelta18oEnum : return "SmbIsdelta18o";
  • issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r23795 r23808  
    349349              else if (strcmp(name,"SmbIsaccumulation")==0) return SmbIsaccumulationEnum;
    350350              else if (strcmp(name,"SmbIsalbedo")==0) return SmbIsalbedoEnum;
     351              else if (strcmp(name,"SmbIsclimatology")==0) return SmbIsclimatologyEnum;
    351352              else if (strcmp(name,"SmbIsd18opd")==0) return SmbIsd18opdEnum;
    352353              else if (strcmp(name,"SmbIsdelta18o")==0) return SmbIsdelta18oEnum;
     
    382383              else if (strcmp(name,"SteadystateMaxiter")==0) return SteadystateMaxiterEnum;
    383384              else if (strcmp(name,"SteadystateNumRequestedOutputs")==0) return SteadystateNumRequestedOutputsEnum;
    384               else if (strcmp(name,"SteadystateReltol")==0) return SteadystateReltolEnum;
    385385         else stage=4;
    386386   }
    387387   if(stage==4){
    388               if (strcmp(name,"SteadystateRequestedOutputs")==0) return SteadystateRequestedOutputsEnum;
     388              if (strcmp(name,"SteadystateReltol")==0) return SteadystateReltolEnum;
     389              else if (strcmp(name,"SteadystateRequestedOutputs")==0) return SteadystateRequestedOutputsEnum;
    389390              else if (strcmp(name,"Step")==0) return StepEnum;
    390391              else if (strcmp(name,"StressbalanceAbstol")==0) return StressbalanceAbstolEnum;
     
    505506              else if (strcmp(name,"EplHeadHydrostep")==0) return EplHeadHydrostepEnum;
    506507              else if (strcmp(name,"EplHeadOld")==0) return EplHeadOldEnum;
    507               else if (strcmp(name,"EplHeadSlopeX")==0) return EplHeadSlopeXEnum;
    508508         else stage=5;
    509509   }
    510510   if(stage==5){
    511               if (strcmp(name,"EplHeadSlopeY")==0) return EplHeadSlopeYEnum;
     511              if (strcmp(name,"EplHeadSlopeX")==0) return EplHeadSlopeXEnum;
     512              else if (strcmp(name,"EplHeadSlopeY")==0) return EplHeadSlopeYEnum;
    512513              else if (strcmp(name,"EsaDeltathickness")==0) return EsaDeltathicknessEnum;
    513514              else if (strcmp(name,"EsaEmotion")==0) return EsaEmotionEnum;
     
    628629              else if (strcmp(name,"SmbBPos")==0) return SmbBPosEnum;
    629630              else if (strcmp(name,"SmbC")==0) return SmbCEnum;
    630               else if (strcmp(name,"SmbDailysnowfall")==0) return SmbDailysnowfallEnum;
    631631         else stage=6;
    632632   }
    633633   if(stage==6){
    634               if (strcmp(name,"SmbDailyrainfall")==0) return SmbDailyrainfallEnum;
     634              if (strcmp(name,"SmbDailysnowfall")==0) return SmbDailysnowfallEnum;
     635              else if (strcmp(name,"SmbDailyrainfall")==0) return SmbDailyrainfallEnum;
    635636              else if (strcmp(name,"SmbDailydsradiation")==0) return SmbDailydsradiationEnum;
    636637              else if (strcmp(name,"SmbDailydlradiation")==0) return SmbDailydlradiationEnum;
     
    751752              else if (strcmp(name,"Watercolumn")==0) return WatercolumnEnum;
    752753              else if (strcmp(name,"WaterColumnOld")==0) return WaterColumnOldEnum;
    753               else if (strcmp(name,"WaterfractionDrainage")==0) return WaterfractionDrainageEnum;
    754754         else stage=7;
    755755   }
    756756   if(stage==7){
    757               if (strcmp(name,"WaterfractionDrainageIntegrated")==0) return WaterfractionDrainageIntegratedEnum;
     757              if (strcmp(name,"WaterfractionDrainage")==0) return WaterfractionDrainageEnum;
     758              else if (strcmp(name,"WaterfractionDrainageIntegrated")==0) return WaterfractionDrainageIntegratedEnum;
    758759              else if (strcmp(name,"Waterfraction")==0) return WaterfractionEnum;
    759760              else if (strcmp(name,"Waterheight")==0) return WaterheightEnum;
     
    874875              else if (strcmp(name,"GaussPenta")==0) return GaussPentaEnum;
    875876              else if (strcmp(name,"GaussSeg")==0) return GaussSegEnum;
    876               else if (strcmp(name,"GaussTetra")==0) return GaussTetraEnum;
    877877         else stage=8;
    878878   }
    879879   if(stage==8){
    880               if (strcmp(name,"GaussTria")==0) return GaussTriaEnum;
     880              if (strcmp(name,"GaussTetra")==0) return GaussTetraEnum;
     881              else if (strcmp(name,"GaussTria")==0) return GaussTriaEnum;
    881882              else if (strcmp(name,"GenericOption")==0) return GenericOptionEnum;
    882883              else if (strcmp(name,"GenericParam")==0) return GenericParamEnum;
     
    997998              else if (strcmp(name,"NoneApproximation")==0) return NoneApproximationEnum;
    998999              else if (strcmp(name,"None")==0) return NoneEnum;
    999               else if (strcmp(name,"Numberedcostfunction")==0) return NumberedcostfunctionEnum;
    10001000         else stage=9;
    10011001   }
    10021002   if(stage==9){
    1003               if (strcmp(name,"Numericalflux")==0) return NumericalfluxEnum;
     1003              if (strcmp(name,"Numberedcostfunction")==0) return NumberedcostfunctionEnum;
     1004              else if (strcmp(name,"Numericalflux")==0) return NumericalfluxEnum;
    10041005              else if (strcmp(name,"OldGradient")==0) return OldGradientEnum;
    10051006              else if (strcmp(name,"OneLayerP4z")==0) return OneLayerP4zEnum;
     
    11201121              else if (strcmp(name,"P2xP1")==0) return P2xP1Enum;
    11211122              else if (strcmp(name,"P2xP4")==0) return P2xP4Enum;
    1122               else if (strcmp(name,"Paterson")==0) return PatersonEnum;
    11231123         else stage=10;
    11241124   }
    11251125   if(stage==10){
    1126               if (strcmp(name,"Pengrid")==0) return PengridEnum;
     1126              if (strcmp(name,"Paterson")==0) return PatersonEnum;
     1127              else if (strcmp(name,"Pengrid")==0) return PengridEnum;
    11271128              else if (strcmp(name,"Penpair")==0) return PenpairEnum;
    11281129              else if (strcmp(name,"Penta")==0) return PentaEnum;
     
    12431244              else if (strcmp(name,"OutputdefinitionList")==0) return OutputdefinitionListEnum;
    12441245              else if (strcmp(name,"SealevelObs")==0) return SealevelObsEnum;
    1245               else if (strcmp(name,"SealevelWeights")==0) return SealevelWeightsEnum;
    12461246         else stage=11;
    12471247   }
    12481248   if(stage==11){
    1249               if (strcmp(name,"StrainRate")==0) return StrainRateEnum;
     1249              if (strcmp(name,"SealevelWeights")==0) return SealevelWeightsEnum;
     1250              else if (strcmp(name,"StrainRate")==0) return StrainRateEnum;
    12501251              else if (strcmp(name,"StressbalanceViscosityOvershoot")==0) return StressbalanceViscosityOvershootEnum;
    12511252              else if (strcmp(name,"StressTensor")==0) return StressTensorEnum;
  • issm/trunk-jpl/src/m/classes/SMBgemb.m

    r23468 r23808  
    2222                isdensification;
    2323                isturbulentflux;   
     24                isclimatology;
    2425
    2526                %inputs:
     
    159160                self.isdensification=1;
    160161                self.isturbulentflux=1;
     162                self.isclimatology=0;
    161163       
    162164                self.aIdx = 1;
     
    213215                        md = checkfield(md,'fieldname','smb.isdensification','values',[0 1]);
    214216                        md = checkfield(md,'fieldname','smb.isturbulentflux','values',[0 1]);
     217                        md = checkfield(md,'fieldname','smb.isclimatology','values',[0 1]);
    215218
    216219                        md = checkfield(md,'fieldname','smb.Ta','timeseries',1,'NaN',1,'Inf',1,'>',273-100,'<',273+100); %-100/100 celsius min/max value
     
    277280                        fielddisplay(self,'isdensification','run densification module (default true)');
    278281                        fielddisplay(self,'isturbulentflux','run turbulant heat fluxes module (default true)');
     282                        fielddisplay(self,'isclimatology','repeat all forcings when past last forcing time (default false)');
    279283                        fielddisplay(self,'Ta','2 m air temperature, in Kelvin');
    280284                        fielddisplay(self,'V','wind speed (m s-1)');
     
    370374                        WriteData(fid,prefix,'object',self,'class','smb','fieldname','isdensification','format','Boolean');
    371375                        WriteData(fid,prefix,'object',self,'class','smb','fieldname','isturbulentflux','format','Boolean');
     376                        WriteData(fid,prefix,'object',self,'class','smb','fieldname','isclimatology','format','Boolean');
    372377           
    373378                        WriteData(fid,prefix,'object',self,'class','smb','fieldname','Ta','format','DoubleMat','mattype',2,'timeserieslength',md.mesh.numberofelements+1,'yts',md.constants.yts);
  • issm/trunk-jpl/src/m/classes/SMBgemb.py

    r23716 r23808  
    132132                string = "%s\n%s"%(string,fielddisplay(self,'isdensification','run densification module (default true)'))
    133133                string = "%s\n%s"%(string,fielddisplay(self,'isturbulentflux','run turbulant heat fluxes module (default true)'))
     134                string = "%s\n%s"%(string,fielddisplay(self,'isclimatology','repeat all forcings when past last forcing time (default false)'))
    134135                string = "%s\n%s"%(string,fielddisplay(self,'Ta','2 m air temperature, in Kelvin'))
    135136                string = "%s\n%s"%(string,fielddisplay(self,'V','wind speed (m s-1)'))
     
    237238                self.isdensification = 1
    238239                self.isturbulentflux = 1
     240                self.isclimatology = 0
    239241
    240242                self.aIdx = 1
     
    291293                md = checkfield(md,'fieldname','smb.isdensification','values',[0,1])
    292294                md = checkfield(md,'fieldname','smb.isturbulentflux','values',[0,1])
     295                md = checkfield(md,'fieldname','smb.isclimatology','values',[0,1])
    293296
    294297                md = checkfield(md,'fieldname','smb.Ta','timeseries',1,'NaN',1,'Inf',1,'>',273-100,'<',273+100) #-100/100 celsius min/max value
     
    357360                WriteData(fid,prefix,'object',self,'class','smb','fieldname','isdensification','format','Boolean')
    358361                WriteData(fid,prefix,'object',self,'class','smb','fieldname','isturbulentflux','format','Boolean')
     362                WriteData(fid,prefix,'object',self,'class','smb','fieldname','isclimatology','format','Boolean')
    359363
    360364                WriteData(fid,prefix,'object',self,'class','smb','fieldname','Ta','format','DoubleMat','mattype',2,'timeserieslength',md.mesh.numberofelements+1,'yts',md.constants.yts)
Note: See TracChangeset for help on using the changeset viewer.