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