파이썬을 이용해서 Fire Weather Index를 만들어보려고 하는데 간단한 오류에 막혀서 진행이 안되고 있습니다. 코드도 다 제공된 코드를 사용하고 있는데 에러가 나네요.
import math
import numpy as np
###Define Class FWI Class first###
class FWICLASS:
def __init__(self,temp,rhum,wind,prcp):
self.h = rhum
self.t = temp
self.w = wind
self.p = prcp
def FFMCcalc(self,ffmc0):
mo = (147.2*(101.0 - ffmc0))/(59.5 + ffmc0) #Eq.1
if (self.p > 0.5):
rf = self.p - 0.5 #Eq.2
if(mo > 150.0):
mo = (mo+42.5*rf*math.exp(-100.0/(251.0-mo))*(1.0 - mathe.exp(-6.93/rf))) + (0.0015*(mo - 150.0)**2)*math.sqrt(rf) #Eq.3b
elif mo <= 150.0:
mo = mo+42.5*rf*math.exp(-100.0/(251.0-mo))*(1.0 - math.exp(-6.93/rf)) #Eq.3a
if(mo > 250.0):
mo = 250.0
ed = 0.942*(self.h**0.679) + (11.0*math.exp((self.h-100.0)/10.0) + 0.18*(21.1-self.t)*(1.0 - 1.0/math.exp(0.1150 * self.h)) #Eq.4
if(ed < mo):
ew = 0.618*(self.h**0.753) + (10.0*math.exp((self.h-100.0)/10.0)) + 0.18*(21.1-self.t)*(1.0 - 1.0/math.exp(0.115*self.h)) #Eq.5
if(mo <= ew):
kl = 0.424*(1.0-((100.0-self.h)/100.0)**1.7+(0.0694*math.sqrt(self.w))*(1.0 - ((100.0 - self.h)/100.0)**8) #Eq.7a
kw = kl * (0.581 * math.exp(0.0365 * self.t)) #Eq.7b
m = ew - (ew - mo)/10.0**kw #Eq.9
elif mo > ew:
m = mo
elif(mo == ed):
m = mo
elif mo > ed:
kl = 0.424*(1.0-(self.h/100.0)**1.7)+(0.0694*math.sqrt(self.w))*(1.0-(self.h/100.0)**8) #Eq.6a
kw = kl * (0.581*math.exp(0.0365*self.t)) #Eq.6b
m = ed + (mo-ed)/10.0**kw #Eq.8
ffmc = (59.5 * (250.0 -m)) / (147.2 + m)
if (ffmc > 101.0):
ffmc = 101.0
if (ffmc <= 0.0):
ffmc = 0.0
return ffmc
def DMCclac(self,dmc0,mth):
el = [6.5,7.5,9.0,12.8,13.9,13.9,12.4,10.9,9.4,8.0,7.0,6.0]
t = self.t
if (t < -1.1):
t = -1.1
rk = 1.894*(t+1.1) * (100.0-self.h) * (el[mth-1]*0.0001) #Eqs. 16 and 17
if self.p > 1.5:
ra = self.p
rw = 0.92*ra - 1.27 #Eq.11
wmi = 20.0 + 280.0/math.exp(0.023*dmc0) #Eq.12
if dmc0 <= 33.0:
b = 100.0/(0.5 + 0.3*dmc0) #Eq.13a
elif dmc0 > 33.0:
if dmc0 <= 65.0:
b = 14.0 - 1.3*math.log(dmc0) #Eq.13b
elif dmc0 > 65.0:
b = 6.2 * math.log(dmc0) - 17.2 #Eq.13c
wmr = wmi + (1000*rw) / (48.77+b*rw) #Eq.14
pr = 43.43 * (5.6348 - math.log(wmr-20.0)) #Eq.15
elif self.p <=1.5:
pr = dmc0
if (pr<0.0):
pr = 0.0
dmc = pr + rk
if (dmc<= 1.0):
dmc = 1.0
return dmc
def DCcalc(self,dc0,mth):
fl = [-1.6, -1.6, -1.6, 0.9, 3.8, 5.8, 6.4, 5.0, 2.4, 0.4, -1.6, -1.6]
t = self.t
if(t < -2.8):
t = -2.8
pe = (0.36*(t+2.8) + fl[mth-1] )/2 # Eq.22
if pe <= 0.0:
pe = 0.0
if (self.p > 2.8):
ra = self.p
rw = 0.83*ra - 1.27 #Eq.18
smi = 800.0 * math.exp(-dc0/400.0) #Eq.19
dr = dc0 - 400.0*math.log(1.0 + ((3.937*rw)/smi)) #Eqs.20 and 21
if (dr > 0.0):
dc = dr + pe
elif self.p <= 2.8:
dc = dc0 + pe
return dc
def ISIcalc(self,ffmc):
mo = 147.2*(101.0-ffmc) / (59.5+ffmc) #Eq.1
ff = 19.115*math.exp(mo*-0.1386) * (1.0+(mo**5.31)/49300000.0) #Eq.25
isi = ff * math.exp(0.05039*self.w) #Eq.26
return isi
def BUIcalc(self,dmc,dc):
if dmc <= 0.4*dc:
bui = (0.8*dc*dmc) / (dmc+0.4*dc) #Eq.27a
else:
bui = dmc - (1.0-0.8*dc/(dmc+0.4*dc))*(0.92+(0.0114*dmc)**1.7) #Eq.27b
if bui < 0.0:
bui = 0.0
return bui
def FWIcalc(self,isi,bui):
if bui <= 80.0:
bb = 0.1 * isi * (0.626*bui**0.809 + 2.0) #Eq.28a
else:
bb = 0.1*isi*(1000.0/(25+108.64/math.exp(0.023*bui))) # Eq.28b
if(bb <= 1.0):
fwi = bb #Eq.30b
else:
fwi = math.exp(2.72*(0.434*math.log(bb))**0.647) #Eq.30a
return fwi
###End of class FWI Class###
def main():
ffmc0 = 85.0
dmc0 = 6.0
dc0 = 15.0
infile = open('era5.input.200011_201912.nc','r')
outfile = open('fwioutput.txt','w')
try:
for line in infile:
mth,day,temp,rhum,wind,prcp=[float(field) for field in line.strip() .lstrip('[').rstrip(']').split()]
if rhum>100.0:
rhum = 100.0
mth = int(mth)
fwisystem = FWICLASS(temp,rhum,wind,prcp)
ffmc = fwisystem.FFMCcalc(ffmc0)
cmd = fwisystem.DMCcalc(dmc0,mth)
dc = fwisystem.DCcalc(dc0,mth)
isi = fwisystem.ISIcalc(ffmc)
bui = fwisystem.BUIcalc(dmc,dc)
fwi = fwisystem.FWIcalc(isi,bui)
ffmc0 = ffmc
dmc0 = dmc
dc0 = dc
outfile.write("%s %s %s %s %s %s n"%(str(ffmc),str(dmc),str(dc),str(isi),str(bui),str(fwi)))
finally:
infile.close()
outfile.close()
main()
전체적인 코드인데 여기서 문제가 발생하는 부분은 25번째 라인인 if(ed < mo):
에서
SyntaxError: invalid syntax
에러가 발생한다고 합니다. 무엇이 문제일까요? 저 구문이 유효하지 않다면 밑의 DMCcalc
함수도 에러가 나야하는데, FFMCcalc
함수를 제외하고 나머지 코드를 쭉 진행하면 에러없이 잘 진행이 됩니다. 아나콘다 프롬프트에서 코드 한줄한줄 다 입력해보면서 확인하였습니다.
껏다가도 켜보고 주석처리를 해도 그 다음줄에서 에러가 나는데 혹시 해결방법 아시는분 있을까요?
저기 FFMCcalc
부분만 해결되면 됩니다.