Changeset 23814


Ignore:
Timestamp:
03/29/19 15:50:05 (6 years ago)
Author:
schlegel
Message:

NEW: Add option to repeat smb forcing as a climatology for GEMB and smb components forcing

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

Legend:

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

    r23808 r23814  
    192192        switch(smb_model){
    193193                case SMBforcingEnum:
    194                         /*Nothing to add to parameters*/
     194                        parameters->AddObject(iomodel->CopyConstantObject("md.smb.isclimatology",SmbIsclimatologyEnum));
    195195                        break;
    196196                case SMBgembEnum:
     
    278278                        break;
    279279                case SMBcomponentsEnum:
    280                         /*Nothing to add to parameters*/
     280                        parameters->AddObject(iomodel->CopyConstantObject("md.smb.isclimatology",SmbIsclimatologyEnum));
    281281                        break;
    282282                case SMBmeltcomponentsEnum:
    283                         /*Nothing to add to parameters*/
     283                        parameters->AddObject(iomodel->CopyConstantObject("md.smb.isclimatology",SmbIsclimatologyEnum));
    284284                        break;
    285285                case SMBgradientscomponentsEnum:
     
    322322        switch(smb_model){
    323323                case SMBforcingEnum:
    324                         /*Nothing to be done*/
     324                        SmbForcingx(femmodel);
    325325                        break;
    326326                case SMBgembEnum:
  • issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp

    r23665 r23814  
    66#include "../../shared/shared.h"
    77#include "../../toolkits/toolkits.h"
    8 
     8#include "../modules.h"
     9
     10void SmbForcingx(FemModel* femmodel){/*{{{*/
     11
     12        // void SmbForcingx(smb,ni){
     13        //    INPUT parameters: ni: working size of arrays
     14        //    OUTPUT: mass-balance (m/yr ice): agd(NA)
     15        bool isclimatology=false;
     16        femmodel->parameters->FindParam(&isclimatology,SmbIsclimatologyEnum);
     17
     18        if (isclimatology){
     19                int v;
     20                IssmDouble time,dt,delta,starttime,finaltime;
     21                int offsetend;
     22                IssmDouble time0, timeend, timeclim;
     23
     24                femmodel->parameters->FindParam(&time,TimeEnum);
     25                femmodel->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
     26                femmodel->parameters->FindParam(&finaltime,TimesteppingFinalTimeEnum);
     27                femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
     28               
     29                if (time<=starttime+dt){
     30                        InputDuplicatex(femmodel,SmbMassBalanceEnum,SmbMassBalanceClimateEnum);
     31                }
     32
     33                /*Loop over all the elements of this partition*/
     34                for(int i=0;i<femmodel->elements->Size();i++){
     35                        Element* element=xDynamicCast<Element*>(femmodel->elements->GetObjectByOffset(i));
     36
     37                        int         numvertices = element->GetNumberOfVertices();
     38                        IssmDouble* smb         = xNew<IssmDouble>(numvertices);
     39
     40                        /*Recover Smb*/
     41                        //If this is a climatology, we need to repeat the forcing after the final time
     42                        Input* smb_input=element->GetInput(SmbMassBalanceClimateEnum); _assert_(smb_input);
     43
     44                        //Get accumulation climatology value
     45                        offsetend=dynamic_cast<TransientInput*>(smb_input)->GetTimeInputOffset(finaltime);
     46                        time0=dynamic_cast<TransientInput*>(smb_input)->GetTimeByOffset(0);
     47                        timeend=dynamic_cast<TransientInput*>(smb_input)->GetTimeByOffset(offsetend);
     48                        if (time>time0 & timeend>time0){
     49                                delta=(time-time0) - (timeend-time0)*((int)((time-time0)/(timeend-time0)));
     50                                if (delta==0){ timeclim=timeend;}
     51                                else{ timeclim=time0+delta;}
     52                        }
     53
     54                        element->GetInputListOnVerticesAtTime(smb,SmbMassBalanceClimateEnum,timeclim);
     55
     56                        /*Add input to element and Free memory*/
     57                        element->AddInput(SmbMassBalanceEnum,smb,P1Enum);
     58                        xDelete<IssmDouble>(smb);
     59                }
     60        }
     61
     62}/*}}}*/
    963void SmbGradientsx(FemModel* femmodel){/*{{{*/
    1064
     
    350404        //    OUTPUT: mass-balance (m/yr ice): agd(NA)
    351405        int v;
     406        bool isclimatology=false;
     407        IssmDouble time,delta,starttime,finaltime;
     408        int offsetend;
     409        IssmDouble time0, timeend, timeclim;
     410
     411        femmodel->parameters->FindParam(&isclimatology,SmbIsclimatologyEnum);
     412        femmodel->parameters->FindParam(&time,TimeEnum);
     413        femmodel->parameters->FindParam(&finaltime,TimesteppingFinalTimeEnum);
     414        femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
    352415
    353416        /*Loop over all the elements of this partition*/
     
    363426
    364427                /*Recover Smb Components*/
    365                 element->GetInputListOnVertices(acc,SmbAccumulationEnum);
    366                 element->GetInputListOnVertices(evap,SmbEvaporationEnum);
    367                 element->GetInputListOnVertices(runoff,SmbRunoffEnum);
     428                if (isclimatology){
     429
     430                        //If this is a climatology, we need to repeat the forcing after the final time
     431                        Input* acc_input=element->GetInput(SmbAccumulationEnum); _assert_(acc_input);
     432                        Input* evap_input=element->GetInput(SmbEvaporationEnum); _assert_(evap_input);
     433                        Input* runoff_input=element->GetInput(SmbRunoffEnum); _assert_(runoff_input);
     434
     435                        //Get accumulation climatology value
     436                        offsetend=dynamic_cast<TransientInput*>(acc_input)->GetTimeInputOffset(finaltime);
     437                        time0=dynamic_cast<TransientInput*>(acc_input)->GetTimeByOffset(0);
     438                        timeend=dynamic_cast<TransientInput*>(acc_input)->GetTimeByOffset(offsetend);
     439                        if (time>time0 & timeend>time0){
     440                                delta=(time-time0) - (timeend-time0)*((int)((time-time0)/(timeend-time0)));
     441                                if (delta==0){ timeclim=timeend;}
     442                                else{ timeclim=time0+delta;}
     443                        }
     444
     445                        element->GetInputListOnVerticesAtTime(acc,SmbAccumulationEnum,timeclim);
     446
     447                        //Get evaporation climatology value
     448                        offsetend=dynamic_cast<TransientInput*>(evap_input)->GetTimeInputOffset(finaltime);
     449                        time0=dynamic_cast<TransientInput*>(evap_input)->GetTimeByOffset(0);
     450                        timeend=dynamic_cast<TransientInput*>(evap_input)->GetTimeByOffset(offsetend);
     451                        if (time>time0 & timeend>time0){
     452                                delta=(time-time0) - (timeend-time0)*((int)((time-time0)/(timeend-time0)));
     453                                if (delta==0){ timeclim=timeend;}
     454                                else{ timeclim=time0+delta;}
     455                        }
     456
     457                        element->GetInputListOnVerticesAtTime(evap,SmbEvaporationEnum,timeclim);
     458
     459                        //Get runoff climatology value
     460                        offsetend=dynamic_cast<TransientInput*>(runoff_input)->GetTimeInputOffset(finaltime);
     461                        time0=dynamic_cast<TransientInput*>(runoff_input)->GetTimeByOffset(0);
     462                        timeend=dynamic_cast<TransientInput*>(runoff_input)->GetTimeByOffset(offsetend);
     463                        if (time>time0 & timeend>time0){
     464                                delta=(time-time0) - (timeend-time0)*((int)((time-time0)/(timeend-time0)));
     465                                if (delta==0){ timeclim=timeend;}
     466                                else{ timeclim=time0+delta;}
     467                        }
     468
     469                        element->GetInputListOnVerticesAtTime(runoff,SmbRunoffEnum,timeclim);
     470                }
     471                else{
     472                        element->GetInputListOnVertices(acc,SmbAccumulationEnum);
     473                        element->GetInputListOnVertices(evap,SmbEvaporationEnum);
     474                        element->GetInputListOnVertices(runoff,SmbRunoffEnum);
     475                }
    368476
    369477                // loop over all vertices
     
    391499        //    OUTPUT: mass-balance (m/yr ice): agd(NA)
    392500        int v;
     501        bool isclimatology=false;
     502        IssmDouble time,delta,starttime,finaltime;
     503        int offsetend;
     504        IssmDouble time0, timeend, timeclim;
     505
     506        femmodel->parameters->FindParam(&isclimatology,SmbIsclimatologyEnum);
     507        femmodel->parameters->FindParam(&time,TimeEnum);
     508        femmodel->parameters->FindParam(&finaltime,TimesteppingFinalTimeEnum);
     509        femmodel->parameters->FindParam(&starttime,TimesteppingStartTimeEnum);
    393510
    394511        /*Loop over all the elements of this partition*/
     
    405522
    406523                /*Recover Smb Components*/
    407                 element->GetInputListOnVertices(acc,SmbAccumulationEnum);
    408                 element->GetInputListOnVertices(evap,SmbEvaporationEnum);
    409                 element->GetInputListOnVertices(melt,SmbMeltEnum);
    410                 element->GetInputListOnVertices(refreeze,SmbRefreezeEnum);
     524                if (isclimatology){
     525
     526                        //If this is a climatology, we need to repeat the forcing after the final time
     527                        Input* acc_input=element->GetInput(SmbAccumulationEnum); _assert_(acc_input);
     528                        Input* evap_input=element->GetInput(SmbEvaporationEnum); _assert_(evap_input);
     529                        Input* melt_input=element->GetInput(SmbMeltEnum); _assert_(melt_input);
     530                        Input* refreeze_input=element->GetInput(SmbRefreezeEnum); _assert_(refreeze_input);
     531
     532                        //Get accumulation climatology value
     533                        offsetend=dynamic_cast<TransientInput*>(acc_input)->GetTimeInputOffset(finaltime);
     534                        time0=dynamic_cast<TransientInput*>(acc_input)->GetTimeByOffset(0);
     535                        timeend=dynamic_cast<TransientInput*>(acc_input)->GetTimeByOffset(offsetend);
     536                        if (time>time0 & timeend>time0){
     537                                delta=(time-time0) - (timeend-time0)*((int)((time-time0)/(timeend-time0)));
     538                                if (delta==0){ timeclim=timeend;}
     539                                else{ timeclim=time0+delta;}
     540                        }
     541
     542                        element->GetInputListOnVerticesAtTime(acc,SmbAccumulationEnum,timeclim);
     543
     544                        //Get evaporation climatology value
     545                        offsetend=dynamic_cast<TransientInput*>(evap_input)->GetTimeInputOffset(finaltime);
     546                        time0=dynamic_cast<TransientInput*>(evap_input)->GetTimeByOffset(0);
     547                        timeend=dynamic_cast<TransientInput*>(evap_input)->GetTimeByOffset(offsetend);
     548                        if (time>time0){
     549                                delta=(time-time0) - (timeend-time0)*((int)((time-time0)/(timeend-time0)));
     550                                if (delta==0){ timeclim=timeend;}
     551                                else{ timeclim=time0+delta;}
     552                        }
     553
     554                        element->GetInputListOnVerticesAtTime(evap,SmbEvaporationEnum,timeclim);
     555
     556                        //Get melt climatology value
     557                        offsetend=dynamic_cast<TransientInput*>(melt_input)->GetTimeInputOffset(finaltime);
     558                        time0=dynamic_cast<TransientInput*>(melt_input)->GetTimeByOffset(0);
     559                        timeend=dynamic_cast<TransientInput*>(melt_input)->GetTimeByOffset(offsetend);
     560                        if (time>time0){
     561                                delta=(time-time0) - (timeend-time0)*((int)((time-time0)/(timeend-time0)));
     562                                if (delta==0){ timeclim=timeend;}
     563                                else{ timeclim=time0+delta;}
     564                        }
     565
     566                        element->GetInputListOnVerticesAtTime(melt,SmbMeltEnum,timeclim);
     567
     568                        //Get refreeze climatology value
     569                        offsetend=dynamic_cast<TransientInput*>(refreeze_input)->GetTimeInputOffset(finaltime);
     570                        time0=dynamic_cast<TransientInput*>(refreeze_input)->GetTimeByOffset(0);
     571                        timeend=dynamic_cast<TransientInput*>(refreeze_input)->GetTimeByOffset(offsetend);
     572                        if (time>time0){
     573                                delta=(time-time0) - (timeend-time0)*((int)((time-time0)/(timeend-time0)));
     574                                if (delta==0){ timeclim=timeend;}
     575                                else{ timeclim=time0+delta;}
     576                        }
     577
     578                        element->GetInputListOnVerticesAtTime(refreeze,SmbRefreezeEnum,timeclim);
     579                }
     580                else{
     581                        element->GetInputListOnVertices(acc,SmbAccumulationEnum);
     582                        element->GetInputListOnVertices(evap,SmbEvaporationEnum);
     583                        element->GetInputListOnVertices(melt,SmbMeltEnum);
     584                        element->GetInputListOnVertices(refreeze,SmbRefreezeEnum);
     585                }
    411586
    412587                // loop over all vertices
  • issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.h

    r23540 r23814  
    1010/* local prototypes: */
    1111void SurfaceMassBalancex(FemModel* femmodel);
     12void SmbForcingx(FemModel* femmodel);
    1213void SmbGradientsx(FemModel* femmodel);
    1314void SmbGradientsElax(FemModel* femmodel);
  • issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h

    r23808 r23814  
    640640        SmbIsInitializedEnum,
    641641        SmbMassBalanceEnum,
     642        SmbMassBalanceClimateEnum,
    642643        SmbMeltEnum,
    643644        SmbMonthlytemperaturesEnum,
  • issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp

    r23808 r23814  
    646646                case SmbIsInitializedEnum : return "SmbIsInitialized";
    647647                case SmbMassBalanceEnum : return "SmbMassBalance";
     648                case SmbMassBalanceClimateEnum : return "SmbMassBalanceClimate";
    648649                case SmbMeltEnum : return "SmbMelt";
    649650                case SmbMonthlytemperaturesEnum : return "SmbMonthlytemperatures";
  • issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp

    r23808 r23814  
    661661              else if (strcmp(name,"SmbIsInitialized")==0) return SmbIsInitializedEnum;
    662662              else if (strcmp(name,"SmbMassBalance")==0) return SmbMassBalanceEnum;
     663              else if (strcmp(name,"SmbMassBalanceClimate")==0) return SmbMassBalanceClimateEnum;
    663664              else if (strcmp(name,"SmbMelt")==0) return SmbMeltEnum;
    664665              else if (strcmp(name,"SmbMonthlytemperatures")==0) return SmbMonthlytemperaturesEnum;
     
    751752              else if (strcmp(name,"VzSSA")==0) return VzSSAEnum;
    752753              else if (strcmp(name,"Watercolumn")==0) return WatercolumnEnum;
    753               else if (strcmp(name,"WaterColumnOld")==0) return WaterColumnOldEnum;
    754754         else stage=7;
    755755   }
    756756   if(stage==7){
    757               if (strcmp(name,"WaterfractionDrainage")==0) return WaterfractionDrainageEnum;
     757              if (strcmp(name,"WaterColumnOld")==0) return WaterColumnOldEnum;
     758              else if (strcmp(name,"WaterfractionDrainage")==0) return WaterfractionDrainageEnum;
    758759              else if (strcmp(name,"WaterfractionDrainageIntegrated")==0) return WaterfractionDrainageIntegratedEnum;
    759760              else if (strcmp(name,"Waterfraction")==0) return WaterfractionEnum;
     
    874875              else if (strcmp(name,"FullMeltOnPartiallyFloating")==0) return FullMeltOnPartiallyFloatingEnum;
    875876              else if (strcmp(name,"GaussPenta")==0) return GaussPentaEnum;
    876               else if (strcmp(name,"GaussSeg")==0) return GaussSegEnum;
    877877         else stage=8;
    878878   }
    879879   if(stage==8){
    880               if (strcmp(name,"GaussTetra")==0) return GaussTetraEnum;
     880              if (strcmp(name,"GaussSeg")==0) return GaussSegEnum;
     881              else if (strcmp(name,"GaussTetra")==0) return GaussTetraEnum;
    881882              else if (strcmp(name,"GaussTria")==0) return GaussTriaEnum;
    882883              else if (strcmp(name,"GenericOption")==0) return GenericOptionEnum;
     
    997998              else if (strcmp(name,"NoMeltOnPartiallyFloating")==0) return NoMeltOnPartiallyFloatingEnum;
    998999              else if (strcmp(name,"NoneApproximation")==0) return NoneApproximationEnum;
    999               else if (strcmp(name,"None")==0) return NoneEnum;
    10001000         else stage=9;
    10011001   }
    10021002   if(stage==9){
    1003               if (strcmp(name,"Numberedcostfunction")==0) return NumberedcostfunctionEnum;
     1003              if (strcmp(name,"None")==0) return NoneEnum;
     1004              else if (strcmp(name,"Numberedcostfunction")==0) return NumberedcostfunctionEnum;
    10041005              else if (strcmp(name,"Numericalflux")==0) return NumericalfluxEnum;
    10051006              else if (strcmp(name,"OldGradient")==0) return OldGradientEnum;
     
    11201121              else if (strcmp(name,"P2")==0) return P2Enum;
    11211122              else if (strcmp(name,"P2xP1")==0) return P2xP1Enum;
    1122               else if (strcmp(name,"P2xP4")==0) return P2xP4Enum;
    11231123         else stage=10;
    11241124   }
    11251125   if(stage==10){
    1126               if (strcmp(name,"Paterson")==0) return PatersonEnum;
     1126              if (strcmp(name,"P2xP4")==0) return P2xP4Enum;
     1127              else if (strcmp(name,"Paterson")==0) return PatersonEnum;
    11271128              else if (strcmp(name,"Pengrid")==0) return PengridEnum;
    11281129              else if (strcmp(name,"Penpair")==0) return PenpairEnum;
     
    12431244              else if (strcmp(name,"NearestInterp")==0) return NearestInterpEnum;
    12441245              else if (strcmp(name,"OutputdefinitionList")==0) return OutputdefinitionListEnum;
    1245               else if (strcmp(name,"SealevelObs")==0) return SealevelObsEnum;
    12461246         else stage=11;
    12471247   }
    12481248   if(stage==11){
    1249               if (strcmp(name,"SealevelWeights")==0) return SealevelWeightsEnum;
     1249              if (strcmp(name,"SealevelObs")==0) return SealevelObsEnum;
     1250              else if (strcmp(name,"SealevelWeights")==0) return SealevelWeightsEnum;
    12501251              else if (strcmp(name,"StrainRate")==0) return StrainRateEnum;
    12511252              else if (strcmp(name,"StressbalanceViscosityOvershoot")==0) return StressbalanceViscosityOvershootEnum;
  • issm/trunk-jpl/src/m/classes/SMBcomponents.m

    r21049 r23814  
    66classdef SMBcomponents
    77        properties (SetAccess=public)
     8                isclimatology = 0;
    89                accumulation = NaN;
    910                runoff = NaN;
     
    6869                        end
    6970                        md = checkfield(md,'fieldname','smb.requested_outputs','stringrow',1);
     71                        md = checkfield(md,'fieldname','smb.isclimatology','values',[0 1]);
     72                        if (self.isclimatology)
     73                                md = checkfield(md,'fieldname', 'smb.accumulation', 'size',[md.mesh.numberofvertices+1],...
     74                                        'message',['accumulation must have md.mesh.numberofvertices+1 rows in order to force a climatology']);
     75                                md = checkfield(md,'fieldname', 'smb.runoff', 'size',[md.mesh.numberofvertices+1],...
     76                                        'message',['runoff must have md.mesh.numberofvertices+1 rows in order to force a climatology']);
     77                                md = checkfield(md,'fieldname', 'smb.evaporation', 'size',[md.mesh.numberofvertices+1],...
     78                                        'message',['evaporation must have md.mesh.numberofvertices+1 rows in order to force a climatology']);
     79                        end
    7080                end % }}}
    7181                function disp(self) % {{{
     
    7484                        fielddisplay(self,'runoff','amount of ice melt lost from the ice column [m/yr ice eq]');
    7585                        fielddisplay(self,'evaporation','amount of ice lost to evaporative processes [m/yr ice eq]');
     86                        fielddisplay(self,'isclimatology','repeat all forcings when past last forcing time (default false)');
    7687                        fielddisplay(self,'requested_outputs','additional outputs requested');
    7788                end % }}}
     
    93104                        end
    94105                        WriteData(fid,prefix,'data',outputs,'name','md.smb.requested_outputs','format','StringArray');
     106                        WriteData(fid,prefix,'object',self,'class','smb','fieldname','isclimatology','format','Boolean');
    95107
    96108                end % }}}
  • issm/trunk-jpl/src/m/classes/SMBcomponents.py

    r23716 r23814  
    1616                self.runoff = float('NaN')
    1717                self.evaporation = float('NaN')
     18                self.isclimatology = 0
    1819                self.requested_outputs      = []
    1920                #}}}
     
    2324                string="%s\n%s"%(string,fielddisplay(self,'runoff','amount of ice melt lost from the ice column [m/yr ice eq]'))
    2425                string="%s\n%s"%(string,fielddisplay(self,'evaporation','mount of ice lost to evaporative processes [m/yr ice eq]'))
     26                string="%s\n%s"%(string,fielddisplay(self,'isclimatology','repeat all forcings when past last forcing time (default false)'))
    2527                string="%s\n%s"%(string,fielddisplay(self,'requested_outputs','additional outputs requested'))
    2628                return string
     
    7375               
    7476                md = checkfield(md,'fieldname','masstransport.requested_outputs','stringrow',1)
     77                md = checkfield(md,'fieldname','smb.isclimatology','values',[0,1])
    7578
    7679                return md
     
    9295                        outputs    =outputscopy
    9396                WriteData(fid,prefix,'data',outputs,'name','md.smb.requested_outputs','format','StringArray')
     97                WriteData(fid,prefix,'object',self,'class','smb','fieldname','isclimatology','format','Boolean')
     98                if (self.isclimatology>0):
     99                        md = checkfield(md,'fieldname', 'smb.accumulation', 'size',[md.mesh.numberofvertices+1],'message','accumulation must have md.mesh.numberofvertices+1 rows in order to force a climatology')
     100                        md = checkfield(md,'fieldname', 'smb.runoff', 'size',[md.mesh.numberofvertices+1],'message','runoff must have md.mesh.numberofvertices+1 rows in order to force a climatology')
     101                        md = checkfield(md,'fieldname', 'smb.evaporation', 'size',[md.mesh.numberofvertices+1],'message','evaporation must have md.mesh.numberofvertices+1 rows in order to force a climatology')
    94102
    95103        # }}}
  • issm/trunk-jpl/src/m/classes/SMBforcing.m

    r21810 r23814  
    66classdef SMBforcing
    77        properties (SetAccess=public)
     8                isclimatology = 0;
    89                mass_balance = NaN;
    910                requested_outputs      = {};
     
    4950
    5051                        if (strcmp(solution,'TransientSolution') & md.transient.issmb == 0), return; end
    51                        
     52
    5253                        if ismember('MasstransportAnalysis',analyses),
    5354                                md = checkfield(md,'fieldname','smb.mass_balance','timeseries',1,'NaN',1,'Inf',1);
     
    5758                        end
    5859                        md = checkfield(md,'fieldname','smb.requested_outputs','stringrow',1);
     60                        md = checkfield(md,'fieldname','smb.isclimatology','values',[0 1]);
     61                        if (self.isclimatology)
     62                                md = checkfield(md,'fieldname', 'smb.mass_balance', 'size',[md.mesh.numberofvertices+1],...
     63                                        'message',['mass_balance must have md.mesh.numberofvertices+1 rows in order to force a climatology']);
     64                        end
    5965                end % }}}
    6066                function disp(self) % {{{
    6167                        disp(sprintf('   surface forcings parameters:'));
    6268                        fielddisplay(self,'mass_balance','surface mass balance [m/yr ice eq]');
     69                        fielddisplay(self,'isclimatology','repeat all forcings when past last forcing time (default false)');
    6370                        fielddisplay(self,'requested_outputs','additional outputs requested');
    6471                end % }}}
     
    7986                        end
    8087                        WriteData(fid,prefix,'data',outputs,'name','md.smb.requested_outputs','format','StringArray');
     88                        WriteData(fid,prefix,'object',self,'class','smb','fieldname','isclimatology','format','Boolean');
    8189
    8290                end % }}}
     
    8593                        writejs1Darray(fid,[modelname '.smb.mass_balance'],self.mass_balance);
    8694                        writejscellstring(fid,[modelname '.smb.requested_outputs'],self.requested_outputs);
     95                        writejs1Darray(fid,[modelname '.smb.isclimatology'],self.isclimatology);
    8796
    8897                end % }}}
  • issm/trunk-jpl/src/m/classes/SMBforcing.py

    r23716 r23814  
    1616                self.mass_balance = float('NaN')
    1717                self.requested_outputs      = []
     18                self.isclimatology = 0
    1819                #}}}
    1920        def __repr__(self): # {{{
    2021                string="   surface forcings parameters:"
    2122                string="%s\n%s"%(string,fielddisplay(self,'mass_balance','surface mass balance [m/yr ice eq]'))
     23                string="%s\n%s"%(string,fielddisplay(self,'isclimatology','repeat all forcings when past last forcing time (default false)'))
    2224                string="%s\n%s"%(string,fielddisplay(self,'requested_outputs','additional outputs requested'))
    2325                return string
     
    4850
    4951                md = checkfield(md,'fieldname','masstransport.requested_outputs','stringrow',1)
     52                md = checkfield(md,'fieldname','smb.isclimatology','values',[0,1])
     53                if (self.isclimatology>0):
     54                    md = checkfield(md,'fieldname', 'smb.mass_balance', 'size',[md.mesh.numberofvertices+1],'message','mass_balance must have md.mesh.numberofvertices+1 rows in order to force a climatology')
     55
    5056                return md
    5157        # }}}
     
    6571                        outputs    =outputscopy
    6672                WriteData(fid,prefix,'data',outputs,'name','md.smb.requested_outputs','format','StringArray')
     73                WriteData(fid,prefix,'object',self,'class','smb','fieldname','isclimatology','format','Boolean')
    6774
    6875        # }}}
  • issm/trunk-jpl/src/m/classes/SMBgemb.m

    r23808 r23814  
    218218
    219219                        md = checkfield(md,'fieldname','smb.Ta','timeseries',1,'NaN',1,'Inf',1,'>',273-100,'<',273+100); %-100/100 celsius min/max value
    220                         md = checkfield(md,'fieldname','smb.V','timeseries',1,'NaN',1,'Inf',1,'>=',0,'<',45); %max 500 km/h
    221                         md = checkfield(md,'fieldname','smb.dswrf','timeseries',1,'NaN',1,'Inf',1,'>=',0,'<=',1400);
    222                         md = checkfield(md,'fieldname','smb.dlwrf','timeseries',1,'NaN',1,'Inf',1,'>=',0);
    223                         md = checkfield(md,'fieldname','smb.P','timeseries',1,'NaN',1,'Inf',1,'>=',0,'<=',100);
    224                         md = checkfield(md,'fieldname','smb.eAir','timeseries',1,'NaN',1,'Inf',1);
     220                        md = checkfield(md,'fieldname','smb.V','timeseries',1,'NaN',1,'Inf',1,'>=',0,'<',45,'size',size(self.Ta)); %max 500 km/h
     221                        md = checkfield(md,'fieldname','smb.dswrf','timeseries',1,'NaN',1,'Inf',1,'>=',0,'<=',1400,'size',size(self.Ta));
     222                        md = checkfield(md,'fieldname','smb.dlwrf','timeseries',1,'NaN',1,'Inf',1,'>=',0,'size',size(self.Ta));
     223                        md = checkfield(md,'fieldname','smb.P','timeseries',1,'NaN',1,'Inf',1,'>=',0,'<=',100,'size',size(self.Ta));
     224                        md = checkfield(md,'fieldname','smb.eAir','timeseries',1,'NaN',1,'Inf',1,'size',size(self.Ta));
     225
     226                        if (self.isclimatology)
     227                                md = checkfield(md,'fieldname', 'smb.Ta', 'size',[md.mesh.numberofelements+1],...
     228                                        'message',['Ta must have md.mesh.numberofelements+1 rows in order to force a climatology']);
     229                                md = checkfield(md,'fieldname', 'smb.V', 'size',[md.mesh.numberofelements+1],...
     230                                        'message',['V must have md.mesh.numberofelements+1 rows in order to force a climatology']);
     231                                md = checkfield(md,'fieldname', 'smb.dswrf', 'size',[md.mesh.numberofelements+1],...
     232                                        'message',['dswrf must have md.mesh.numberofelements+1 rows in order to force a climatology']);
     233                                md = checkfield(md,'fieldname', 'smb.dlwrf', 'size',[md.mesh.numberofelements+1],...
     234                                        'message',['dlwrf must have md.mesh.numberofelements+1 rows in order to force a climatology']);
     235                                md = checkfield(md,'fieldname', 'smb.P', 'size',[md.mesh.numberofelements+1],...
     236                                        'message',['P must have md.mesh.numberofelements+1 rows in order to force a climatology']);
     237                                md = checkfield(md,'fieldname', 'smb.eAir', 'size',[md.mesh.numberofelements+1],...
     238                                        'message',['eAir must have md.mesh.numberofelements+1 rows in order to force a climatology']);
     239                        end
    225240
    226241                        md = checkfield(md,'fieldname','smb.Tmean','size',[md.mesh.numberofelements 1],'NaN',1,'Inf',1,'>',273-100,'<',273+100); %-100/100 celsius min/max value
  • issm/trunk-jpl/src/m/classes/SMBgemb.py

    r23808 r23814  
    296296
    297297                md = checkfield(md,'fieldname','smb.Ta','timeseries',1,'NaN',1,'Inf',1,'>',273-100,'<',273+100) #-100/100 celsius min/max value
    298                 md = checkfield(md,'fieldname','smb.V','timeseries',1,'NaN',1,'Inf',1,'> = ',0,'<',45) #max 500 km/h
    299                 md = checkfield(md,'fieldname','smb.dswrf','timeseries',1,'NaN',1,'Inf',1,'> = ',0,'< = ',1400)
    300                 md = checkfield(md,'fieldname','smb.dlwrf','timeseries',1,'NaN',1,'Inf',1,'> = ',0)
    301                 md = checkfield(md,'fieldname','smb.P','timeseries',1,'NaN',1,'Inf',1,'> = ',0,'< = ',100)
    302                 md = checkfield(md,'fieldname','smb.eAir','timeseries',1,'NaN',1,'Inf',1)
     298                md = checkfield(md,'fieldname','smb.V','timeseries',1,'NaN',1,'Inf',1,'> = ',0,'<',45,'size',np.shape(self.Ta)) #max 500 km/h
     299                md = checkfield(md,'fieldname','smb.dswrf','timeseries',1,'NaN',1,'Inf',1,'> = ',0,'< = ',1400,'size',np.shape(self.Ta))
     300                md = checkfield(md,'fieldname','smb.dlwrf','timeseries',1,'NaN',1,'Inf',1,'> = ',0,'size',np.shape(self.Ta))
     301                md = checkfield(md,'fieldname','smb.P','timeseries',1,'NaN',1,'Inf',1,'> = ',0,'< = ',100,'size',np.shape(self.Ta))
     302                md = checkfield(md,'fieldname','smb.eAir','timeseries',1,'NaN',1,'Inf',1,'size',np.shape(self.Ta))
     303
     304                if (self.isclimatology>0):
     305                        md = checkfield(md,'fieldname', 'smb.Ta', 'size',[md.mesh.numberofelements+1],'message','Ta must have md.mesh.numberofelements+1 rows in order to force a climatology')
     306                        md = checkfield(md,'fieldname', 'smb.V', 'size',[md.mesh.numberofelements+1],'message','V must have md.mesh.numberofelements+1 rows in order to force a climatology')
     307                        md = checkfield(md,'fieldname', 'smb.dswrf', 'size',[md.mesh.numberofelements+1],'message','dswrf must have md.mesh.numberofelements+1 rows in order to force a climatology')
     308                        md = checkfield(md,'fieldname', 'smb.dlwrf', 'size',[md.mesh.numberofelements+1],'message','dlwrf must have md.mesh.numberofelements+1 rows in order to force a climatology')
     309                        md = checkfield(md,'fieldname', 'smb.P', 'size',[md.mesh.numberofelements+1],'message','P must have md.mesh.numberofelements+1 rows in order to force a climatology')
     310                        md = checkfield(md,'fieldname', 'smb.eAir', 'size',[md.mesh.numberofelements+1],'message','eAir must have md.mesh.numberofelements+1 rows in order to force a climatology')
    303311
    304312                md = checkfield(md,'fieldname','smb.Tmean','size',[md.mesh.numberofelements],'NaN',1,'Inf',1,'>',273-100,'<',273+100) #-100/100 celsius min/max value
  • issm/trunk-jpl/src/m/classes/SMBmeltcomponents.m

    r21049 r23814  
    66classdef SMBmeltcomponents
    77        properties (SetAccess=public)
     8                isclimatology = 0;
    89                accumulation = NaN;
    910                evaporation = NaN;
     
    7879                        end
    7980                        md = checkfield(md,'fieldname','smb.requested_outputs','stringrow',1);
     81                        md = checkfield(md,'fieldname','smb.isclimatology','values',[0 1]);
     82                        if (self.isclimatology)
     83                                md = checkfield(md,'fieldname', 'smb.accumulation', 'size',[md.mesh.numberofvertices+1],...
     84                                        'message',['accumulation must have md.mesh.numberofvertices+1 rows in order to force a climatology']);
     85                                md = checkfield(md,'fieldname', 'smb.melt', 'size',[md.mesh.numberofvertices+1],...
     86                                        'message',['melt must have md.mesh.numberofvertices+1 rows in order to force a climatology']);
     87                                md = checkfield(md,'fieldname', 'smb.refreeze', 'size',[md.mesh.numberofvertices+1],...
     88                                        'message',['refreeze must have md.mesh.numberofvertices+1 rows in order to force a climatology']);
     89                                md = checkfield(md,'fieldname', 'smb.evaporation', 'size',[md.mesh.numberofvertices+1],...
     90                                        'message',['evaporation must have md.mesh.numberofvertices+1 rows in order to force a climatology']);
     91                        end
    8092                end % }}}
    8193                function disp(self) % {{{
     
    8597                        fielddisplay(self,'melt','amount of ice melt in ice column [m/yr ice eq]');
    8698                        fielddisplay(self,'refreeze','amount of ice melt refrozen in ice column [m/yr ice eq]');
     99                        fielddisplay(self,'isclimatology','repeat all forcings when past last forcing time (default false)');
    87100                        fielddisplay(self,'requested_outputs','additional outputs requested');
    88101                end % }}}
     
    105118                        end
    106119                        WriteData(fid,prefix,'data',outputs,'name','md.smb.requested_outputs','format','StringArray');
     120                        WriteData(fid,prefix,'object',self,'class','smb','fieldname','isclimatology','format','Boolean');
    107121
    108122                end % }}}
  • issm/trunk-jpl/src/m/classes/SMBmeltcomponents.py

    r23716 r23814  
    1616                self.runoff = float('NaN')
    1717                self.evaporation = float('NaN')
     18                self.isclimatology = 0
    1819                self.requested_outputs      = []
    1920                #}}}
     
    2425                string="%s\n%s"%(string,fielddisplay(self,'melt','amount of ice melt in the ice column [m/yr ice eq]'))
    2526                string="%s\n%s"%(string,fielddisplay(self,'refreeze','amount of ice melt refrozen in the ice column [m/yr ice eq]'))
     27                string="%s\n%s"%(string,fielddisplay(self,'isclimatology','repeat all forcings when past last forcing time (default false)'))
    2628                string="%s\n%s"%(string,fielddisplay(self,'requested_outputs','additional outputs requested'))
    2729                return string
     
    8587
    8688                md = checkfield(md,'fieldname','masstransport.requested_outputs','stringrow',1)
     89                md = checkfield(md,'fieldname','smb.isclimatology','values',[0,1])
    8790                return md
    8891        # }}}
     
    104107                        outputs    =outputscopy
    105108                WriteData(fid,prefix,'data',outputs,'name','md.smb.requested_outputs','format','StringArray')
     109                WriteData(fid,prefix,'object',self,'class','smb','fieldname','isclimatology','format','Boolean')
     110                if (self.isclimatology>0):
     111                        md = checkfield(md,'fieldname', 'smb.accumulation', 'size',[md.mesh.numberofvertices+1],'message','accumulation must have md.mesh.numberofvertices+1 rows in order to force a climatology')
     112                        md = checkfield(md,'fieldname', 'smb.melt', 'size',[md.mesh.numberofvertices+1],'message','melt must have md.mesh.numberofvertices+1 rows in order to force a climatology')
     113                        md = checkfield(md,'fieldname', 'smb.refreeze', 'size',[md.mesh.numberofvertices+1],'message','refreeze must have md.mesh.numberofvertices+1 rows in order to force a climatology')
     114                        md = checkfield(md,'fieldname', 'smb.evaporation', 'size',[md.mesh.numberofvertices+1],'message','evaporation must have md.mesh.numberofvertices+1 rows in order to force a climatology')
    106115
    107116        # }}}
  • issm/trunk-jpl/src/m/classes/model.m

    r23771 r23814  
    167167                                else
    168168                                        md.settings.results_on_nodes = {'all'};
     169                                end
     170                        end
     171                        %2019 Mar 28
     172                        if isa(md.smb.isclimatology,'double')
     173                                if prod(size(md.smb.isclimatology)) ~= 1
     174                                        md.smb.isclimatology = 0;
    169175                                end
    170176                        end
Note: See TracChangeset for help on using the changeset viewer.