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)