예제 #1
0
     def CheckModelOutput(self,strncPathIn,strtxtForcePathIn):
        #1 run model
        fileset = formic.FileSet(include="**/*.nc", directory=strncPathIn)
        nFile   = 0 # print process file ID
        # 
        varTimeDataArray  =  None;
        for file_name in fileset:
            nFile+=1
            print "################################################################"
            print "Current file is : " + file_name + "; It is the " + str(nFile)
            print "################################################################"
            #get date info
            if (varTimeDataArray is None):
                getNcFileDate     =   getSingleNcFileDate(file_name)
                varTimeDataArray  =   getNcFileDate.getNcFileDate("Times","Noah")

            ncFileProcess         =  NcFileProcess(file_name)
            alllayerMonthMean     =  ncFileProcess.getAllLayerMeanTempByMonth(5,varTimeDataArray)
            maxListValue          =  max(alllayerMonthMean[0])
            if (maxListValue < 250) or  (maxListValue > 310):
                InputFileDir,InputFile   = os.path.split(file_name)
                filename, file_extension = os.path.splitext(InputFile)
                strFileFix               = filename+".txt"
                srcfile                  =  strtxtForcePathIn + strFileFix
                if not os.path.exists(srcfile):
                    print "Error there have no " + srcfile
                    os.system("pause")
                    exit(0)
                dstdir                   =  os.path.join("F:\\worktemp\\Permafrost(Change)\\Run(S)\\", strFileFix)
                shutil.copy(srcfile, dstdir)
예제 #2
0
    def IsPermafrost(self,varTimeDataArray,startTime = None, endTime = None):
        if startTime is None:
            startTime       = datetime.datetime(2010,1,1)
        if endTime is None:
            endTime         = datetime.datetime(2010,12,31)

        ncFileProcess       =  NcFileProcess(self.strncDataPath)
        alllayerMonthMean   =  ncFileProcess.getAllLayerMeanTempByMonth(5,varTimeDataArray,startTime,endTime)
        #alllayerDay         =  ncFileProcess.getAllLayerMaxMinTempByDay(5,varTimeDataArray)
        maxList             =  alllayerMonthMean[0]
        minList             =  alllayerMonthMean[1] 
        self.IdentificationPermafrost(maxAllLevelList,minAllLevelList)
예제 #3
0
 def CalCalPermafrostICE(self,varTimeDataArray,layerList = None):
     if layerList is None:
        layerList        =  [-0.045,-0.091,-0.166,-0.289,-0.493,-0.829,-1.383,-2.296,-3.2,-4.2,-5.2,-6.2,\
                             -7.2,-8.2,-9.2,-11.2,-13.2,-15.2]
     lenDepths           =  len(layerList)
     ncFileProcess       =  NcFileProcess(self.strncDataPath)
     alllayerICE         =  ncFileProcess.getAllLayerMeanICEByYear(varTimeDataArray)
     allVList            =  map(self.getVFun,layerList)
     allICEList          =  map(self.calICEListFun,alllayerICE,allVList)
     ICE                 =  0.0
     ICE                 =  sum(allICEList)
     if(ICE < 0.0):
         ICE  = 0.0
     ICE  = round(float(ICE),2)
     return ICE
예제 #4
0
    def __init__(self,analysestart,analysesend,nlayer,soilType,peType,optParmType,varTimeDataArray):
        self.analysestart     = analysestart
        self.analysesend      = analysesend
        self.nlayer           = nlayer
        self.soilType         = soilType
        self.peType           = peType
        self.optParmType      = optParmType
        self.varTimeDataArray = varTimeDataArray
        ###########################################################################
        #
        ###################### Init ####################################  
        if(self.optParmType == 1): 
            self.paraUpdate    =  ParameterUpdate(optParmType,"D:\\worktemp\\Permafrost(NOAH)\\Data\\Run(S)\\SOILPARM.TBL")
        if(self.optParmType == 2):   # general parm   20160725
            self.paraUpdate    =  ParameterUpdate(optParmType,"F:\\worktemp\\Permafrost(Change)\\Run(S)\\GENPARM.TBL")

        self.ncFileProcess =  NcFileProcess("F:\\worktemp\\Permafrost(Change)\\Run(S)\\TGLCH.nc");
        ###########################################################################
        #
        ###################### Evaluation data ####################################    
        #just for test
        readObsData        =  ReadObsData("F:\\worktemp\\Permafrost(Change)\\Run(S)\\TGLData2009.xls");
        if (peType == "STC"):
            getnlayer          =  self.nlayer - 1
            obsDataRes         =  readObsData.getObsData(getnlayer)
            obsDataRes         =  map(lambda x:x-273.15,obsDataRes)
        if (peType == "SH2O"):
            getnlayer          =  self.nlayer + 21
            obsDataRes         =  readObsData.getObsData(getnlayer)
            obsDataRes         =  map(lambda x:x*100,obsDataRes)


        self.observations  =  obsDataRes
예제 #5
0
 def CalCalPermafrostALT(self,varTimeDataArray,layerList = None):
     if layerList is None:
        layerList        = [-0.045,-0.091,-0.166,-0.289,-0.493,-0.829,-1.383,-2.296,-3.2,-4.2,-5.2,-6.2,\
                            -7.2,-8.2,-9.2,-11.2,-13.2,-15.2]
     lenDepths           =  len(layerList)
     ncFileProcess       =  NcFileProcess(self.strncDataPath)
     maxList =[]
     alllayerMonthMean   =  ncFileProcess.getAllLayerMeanTempByMonth(0,varTimeDataArray)
     maxList             =  alllayerMonthMean[0]
     maxList  = map(lambda x:x-273.15,maxList)
     
     ALTINFO  = 15.0
     if min(maxList) > 0:
         ALTINFO = -2.0
     elif maxList[0] > 0:
         reList = self.getSubMax4Alt(maxList)
         nLen   = len(reList)
         InterFun = interp1d( reList, layerList[0:nLen])
         ALTINFO  = InterFun(0.0)
     FALTINFO  = round(float(ALTINFO),2)
     print FALTINFO
     return FALTINFO
예제 #6
0
    def CalCalPermafrostMAGT(self,varTimeDataArray,layerList = None):
        if layerList is None:
           layerList        = [-0.045,-0.091,-0.166,-0.289,-0.493,-0.829,-1.383,-2.296,-3.2,-4.2,-5.2,-6.2,\
                               -7.2,-8.2,-9.2,-11.2,-13.2,-15.2]
        lenDepths           =  len(layerList)
        ncFileProcess       =  NcFileProcess(self.strncDataPath)
        alllayerMonthMean   =  ncFileProcess.getAllLayerMeanTempByMonth(0,varTimeDataArray)
        maxList             =  map(lambda x:x-273.15,alllayerMonthMean[0])
        minList             =  map(lambda x:x-273.15,alllayerMonthMean[1])
        MAGTINFO            =  0.0
        DAZZINFO            =  0.0
        DiffMinMaxList      =  list(map(operator.sub, maxList, minList))
        index = 0
        for val in DiffMinMaxList:
            index = index + 1
            if val < 0.5:
                maxVal    =  maxList[index-1]
                minVal    =  minList[index-1]
                MAGTINFO  =  (maxVal + minVal)/2.0
                DAZZINFO  =  layerList[index-1]
                break
        #Use 15.2m temperature
        if(MAGTINFO == 0.0):
            maxVal    =  maxList[17]
            minVal    =  minList[17]
            MAGTINFO  =  (maxVal + minVal)/2.0
            DAZZINFO  =  -15.20
        #
        if(MAGTINFO > 0.0):
            MAGTINFO  = 0.0
        #
        if(MAGTINFO <-20.0):
            MAGTINFO  = -20.0

        MAGTINFO  = round(float(MAGTINFO),2)
        print MAGTINFO,DAZZINFO
        return [MAGTINFO,DAZZINFO]
예제 #7
0
    def IsPermafrostByYear(self,varTimeDataArray,startYear, endYear):
        startTime           =  datetime.datetime(startYear,1,1)
        endTime             =  datetime.datetime(endYear,12,31)
        ncFileProcess       =  NcFileProcess(self.strncDataPath)
        allLayerMonthTemp   =  ncFileProcess.getAllLayerMeanTempByYearMonth(5,varTimeDataArray,startTime,endTime)
        # first get layer
        allLayerListMax     =  []
        allLayerListMin     =  []
        for layerMonthTemp in allLayerMonthTemp:
            layerYearMonthTemp = list(zip(*[iter(layerMonthTemp)]*12))
            maxValue             =  map(max, layerYearMonthTemp)  
            minValue             =  map(min, layerYearMonthTemp)    
            allLayerListMax.append(maxValue)           #by  layer 
            allLayerListMin.append(minValue)

        allLayerListMax =  zip(*allLayerListMax)   #by  year
        allLayerListMin =  zip(*allLayerListMin)
        # permafrost 
        nYear = endYear-startYear;
        strType = " "
        for i in range(0,nYear):
            nType = self.IdentificationPermafrost(allLayerListMax[i],allLayerListMin[i])
            strType = strType+ " "+ str(nType)
        return strType
예제 #8
0
class NoahModel(object):
    '''
    Input: datastart:    e.g. datetime(1998,6,1)
           dataend:      e.g. datetime(2000,1,1)
           analysestart: e.g. datetime(1999,1,1)
    Output: Initialised model instance with forcing data (climate) and evaluation data (soil temperature)
    '''
    def __init__(self,analysestart,analysesend,nlayer,soilType,peType,optParmType,varTimeDataArray):
        self.analysestart     = analysestart
        self.analysesend      = analysesend
        self.nlayer           = nlayer
        self.soilType         = soilType
        self.peType           = peType
        self.optParmType      = optParmType
        self.varTimeDataArray = varTimeDataArray
        ###########################################################################
        #
        ###################### Init ####################################  
        if(self.optParmType == 1): 
            self.paraUpdate    =  ParameterUpdate(optParmType,"D:\\worktemp\\Permafrost(NOAH)\\Data\\Run(S)\\SOILPARM.TBL")
        if(self.optParmType == 2):   # general parm   20160725
            self.paraUpdate    =  ParameterUpdate(optParmType,"F:\\worktemp\\Permafrost(Change)\\Run(S)\\GENPARM.TBL")

        self.ncFileProcess =  NcFileProcess("F:\\worktemp\\Permafrost(Change)\\Run(S)\\TGLCH.nc");
        ###########################################################################
        #
        ###################### Evaluation data ####################################    
        #just for test
        readObsData        =  ReadObsData("F:\\worktemp\\Permafrost(Change)\\Run(S)\\TGLData2009.xls");
        if (peType == "STC"):
            getnlayer          =  self.nlayer - 1
            obsDataRes         =  readObsData.getObsData(getnlayer)
            obsDataRes         =  map(lambda x:x-273.15,obsDataRes)
        if (peType == "SH2O"):
            getnlayer          =  self.nlayer + 21
            obsDataRes         =  readObsData.getObsData(getnlayer)
            obsDataRes         =  map(lambda x:x*100,obsDataRes)


        self.observations  =  obsDataRes
        ###########################################################################


    def _run(self,dictPara):
        #return alpha,n,porosity,ksat
        '''
        Runs the model instance
        
        Input: Parameter set (in this case VAN-Genuchten Parameter alpha,n,porosity,ksat)
        Output: Simulated values on given observation days
        ''' 
        #NOTE: SATDW = BB*SATDK*(SATPSI/MAXSMC)
        #F11 = ALOG10(SATPSI) + BB*ALOG10(MAXSMC) + 2.0
        #REFSMC1=MAXSMC*(5.79E-9/SATDK)**(1/(2*BB+3)) 5.79E-9 m/s= 0.5 mm
        #REFSMC=REFSMC1+1./3.(MAXSMC-REFSMC1)
        #WLTSMC1=MAXSMC*(200./SATPSI)**(-1./BB)    (Wetzel and Chang, 198
        #WLTSMC=WLTSMC1-0.5*WLTSMC1

        #1 update  SOILPARM.TBL or Other
        self.paraUpdate.updateParameterFile(dictPara,self.soilType)

        ##2 run model
        os.chdir('F:\\worktemp\\Permafrost(Change)\\Run(S)\\')
        command       =  'simple_driver.exe TGLCH.txt'
        subprocess.call(command, shell=True)  #call 7z command
        # 3 get model res return
        getnlayer     =   self.nlayer - 1
        modelRes      =   self.ncFileProcess.getNcDataByDay(self.peType,
                                                            getnlayer,
                                                            self.varTimeDataArray,
                                                            self.analysestart,
                                                            self.analysesend)
        if (self.peType == "STC"):
            return  map(lambda x:x-273.15,modelRes)
        if (self.peType == "SH2O"):
            return  map(lambda x:x*100,modelRes)