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
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)