Created
June 8, 2012 14:47
-
-
Save mbstacy/2895998 to your computer and use it in GitHub Desktop.
DDA code for TECO
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sys | |
from numpy import * | |
def readobs(filename,headlen=1): | |
"Read the observational file for the TECO model" | |
obs=loadtxt(filename,skiprows=headlen) | |
return obs | |
def readinit(filename,headlen=0): | |
"Read initial conditions for TECO model" | |
initcon=loadtxt(filename,skiprows=headlen) | |
return initcon | |
def fout(filename,data,head): | |
"Output array of data with header from TECO model" | |
# data=array_str(data) | |
# f=open(filename,'w') | |
# f.write(head + '\n') | |
# f.close | |
# savetxt(filename,data,fmt='%9.6f', delimiter=' ',header=head) | |
# savetxt(filename,data,fmt='%1.14e',delimiter=' ') | |
savetxt(filename,data,fmt='%1.14g',delimiter=' ') | |
# savetxt(filename,data,fmt='%9.6f', delimiter=' ') | |
# savetxt(filename,data,fmt='%9.6f') | |
def readpara(filename,headlen=1): | |
"Read information from site parameter file" | |
f=open(filename) | |
for i in range(headlen): | |
f.readline() | |
params=f.readline() | |
params=params.split() | |
f.close() | |
return params |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import fread | |
import sys | |
import numpy | |
import math | |
import os | |
from tkfilter import kalman | |
from teco import * | |
def blcpg(tair,tavg72,omega,glmax,grmax,gsmax,lai,laimax,laimin,sla,tau_l,bmleaf,bmroot,bmstem,bmplant,rootmax,stemmax,saps,storage,gdd5,stor_use,onset,accumulation,gddonset,nsc,fnsc,nscmin,nscmax,add,tcold,gamma_wmax,gamma_tmax): | |
"Brians re-write of the plant growth model" | |
bml=bmleaf | |
bmr=bmroot | |
bms=bmstem | |
bmp=bmplant | |
bw=2.0 | |
bt=2.0 | |
twarm=30.0 | |
rs0=1.0 | |
rs=bmr/bml | |
if(bml<nsc/.333*.5): | |
bml=nsc/.333*.5 | |
if(bmr<nsc/.333*.5): | |
bmr=nsc/.333*.5 | |
if(bms<nsc/.334*.5): | |
bms=nsc/.334*.5 | |
stemsap=min(stemmax,saps*bms) | |
rootsap=bmr | |
if(stemsap<.001): | |
stemsap=.001 | |
if(rootsap<.001): | |
rootsap=.001 | |
if(gdd5>gddonset and onset==0 and storage>stor_use): | |
onset=1 | |
if(onset==1 and storage>stor_use): | |
if(lai<laimax): | |
add=stor_use | |
storage=storage-add | |
else: | |
add=0.0 | |
onset=0.0 | |
if(accumulation<(nscmax+.005*rootsap)): | |
store=.005*nsc | |
else: | |
store=0.0 | |
accumulation=accumulation+store | |
sps=1-fnsc | |
sps=max(.001,sps) | |
st=1/(1+19*math.e**(-.2*tair)) | |
sw=max(.333,.333+omega) | |
w=min(1,50*omega) | |
ss=min(1,2*fnsc) | |
sl_rs=rs/(rs+rs0*(1.5-omega)) | |
sr_rs=(rs0*(1.5-omega))/(rs+rs0*(1.5-omega)) | |
slai=min(1,2.333*(laimax-lai)/(laimax-laimin)) | |
growthl=glmax*bml*st*sw*fnsc*sl_rs*slai*0.45 | |
growthr=grmax*rootsap*st*sw*fnsc*sr_rs*0.5 *0.45 | |
growths=gsmax*stemsap*st*sw*fnsc*0.5*0.5 *0.45 | |
growthl=max(growthl,0) | |
growthr=max(growthr,0) | |
growths=max(growths,0) | |
growthp=growthl+growthr+growths | |
if(growthp>nsc*.5): | |
growthl=.5*nsc*growthl/growthp | |
growthr=.5*nsc*growthr/growthp | |
growths=.5*nsc*growths/growthp | |
npp=add+growthl+growthr+growths | |
if(npp==0): | |
alpha_l=.333 | |
alpha_w=.333 | |
alpha_r=.333 | |
else: | |
alpha_l=(growthl+add)/npp | |
alpha_w=growths/npp | |
alpha_r=growthr/npp | |
if(tair>tcold+10): | |
beta_t=1 | |
else: | |
if(tair>tcold): | |
beta_t=(tair-tcold)/10 | |
if(tair<=tcold): | |
beta_t=0 | |
if(tau_l<8760): | |
gamma_w=(1.-w)**bw*gamma_wmax | |
gamma_t=(1-beta_t)**bt*gamma_tmax | |
gamma_n=0 | |
else: | |
gamma_w=0 | |
gamma_t=0 | |
gamma_n=1/(tau_l*sw) | |
if(lai<laimin): | |
gamma_w=0 | |
gamma_t=0 | |
gamma_n=0 | |
l_fall=bmleaf*.45*min((gamma_w+gamma_t+gamma_n),.99) | |
results=(stemsap,rootsap,storage,onset,accumulation,sps,store,add,l_fall,npp,alpha_l,alpha_w,alpha_r) | |
return results | |
add=0 | |
parafile=sys.argv[1] | |
outfile=sys.argv[2] | |
tfilter=int(sys.argv[3]) | |
aint=int(sys.argv[4]) | |
output=0 | |
parameters=fread.readpara(parafile) | |
(site,vegtype,climfile,NEE_file,out_d,lat,longi,wsmax,wsmin,gddonset,LAIMAX,LAIMIN,rdepth,Rootmax,Stemmax,SapR,SapS,SLA,GLmax,GRmax,Gsmax,stom_n,a1,Ds0,Vcmx0,extkU,xfang,alpha,co2ca,tau_L,tau_W,tau_R,tau_F,tau_C,tau_Micr,tau_Slow,tau_Pass)=parameters | |
lat=float(lat) | |
longi=float(longi) | |
wsmax=float(wsmax) | |
wsmin=float(wsmin) | |
gddonset=float(gddonset) | |
LAIMAX=float(LAIMAX) | |
LAIMIN=float(LAIMIN) | |
rdepth=float(rdepth) | |
Rootmax=float(Rootmax) | |
Stemmax=float(Stemmax) | |
SapR=float(SapR) | |
SapS=float(SapS) | |
SLA=float(SLA) | |
GLmax=float(GLmax) | |
GRmax=float(GRmax) | |
Gsmax=float(Gsmax) | |
stom_n=float(stom_n) | |
a1=float(a1) | |
Ds0=float(Ds0) | |
Vcmx0=float(Vcmx0) | |
extkU=float(extkU) | |
xfang=float(xfang) | |
alpha=float(alpha) | |
co2ca=float(co2ca) | |
tau_L=float(tau_L) | |
tau_W=float(tau_W) | |
tau_R=float(tau_R) | |
tau_F=float(tau_F) | |
tau_C=float(tau_C) | |
tau_Micr=float(tau_Micr) | |
tau_Slow=float(tau_Slow) | |
tau_Pass=float(tau_Pass) | |
climate=fread.readobs(climfile,2) | |
neeObs_days=list() | |
neeSim_days=list() | |
tau_L =tau_L *8760 | |
tau_W =tau_W *8760 | |
tau_R =tau_R *8760 | |
tau_F =tau_F *8760 | |
tau_C =tau_C *8760 | |
tau_Micr=tau_Micr*8760 | |
tau_Slow=tau_Slow*8760 | |
tau_Pass=tau_Pass*8760 | |
GLmax=float(GLmax)/24 | |
GRmax=float(GRmax)/24 | |
Gsmax=float(Gsmax)/24 | |
dayCount = 1 | |
nonValidCount=0 | |
sumObs=0.0 | |
sumSim=0.0 | |
sumObsObs=0.0 | |
sumSimObs=0.0 | |
co2=co2ca | |
accumulation=0 | |
Q_root=0 | |
year_data=climate[:,0] | |
day_data=climate[:,1] | |
hour_data=climate[:,2] | |
input_data=climate[:,3:] | |
hour_data=hour_data+1 | |
yr_data=year_data[-1]-year_data[0]+1 | |
inputstep=hour_data[1]-hour_data[0] | |
lines=len(year_data)-1 | |
tpara=45 | |
#apara=19 | |
#apara=17 | |
apara=11 | |
#apara=9 | |
state=numpy.zeros((lines+1,tpara)) | |
astate=numpy.zeros((lines+1,apara)) | |
updated=numpy.zeros((lines+1,tpara)) | |
cov_mat=0 | |
NEE_obs=numpy.zeros(lines+1) | |
oerror=[[0],[0],[0]] | |
#oerror=[0] | |
#oerror=numpy.zeros(lines+1) | |
have_obs=False | |
if(os.path.exists(NEE_file)): | |
have_obs=True | |
obs=fread.readobs(NEE_file) | |
year_NEE=obs[:,0] | |
day_NEE=obs[:,1] | |
hour_NEE=obs[:,2] | |
reader_NEE=obs[:,3:] | |
for i in range(len(reader_NEE[:,12])): | |
if reader_NEE[i,10]==-999.: | |
reader_NEE[i,10]=0 | |
NEE_obs=reader_NEE[:,10]*12./1000./1000000. | |
yr_NEE=year_NEE[-1]-year_NEE[0]+1 | |
step_NEE=hour_NEE[1]-hour_NEE[0] | |
Cumol2gram=3600.*step_NEE*1000 | |
year_obs=int(year_NEE[0]) | |
NEE_annual=0.0 | |
thksl=[10.0,10.0,10.0,10.0,10.0,20.0,20.0,20.0,20.0,20.0 ] | |
FRLEN=[0.30,0.20,0.15,0.15,0.1,0.05,0.05,0.0,0.0,0.0 ] | |
#thksl=numpy.array(thksl) | |
#FRLEN=numpy.array(FRLEN) | |
(pi,tauL,rhoL,rhoS,emleaf,emsoil,Rconst,sigma,cpair,Patm,Trefk,H2OLv0,airMa,H2OMw,chi,Dheat,wleaf,gsw0,Vcmx0,eJmx0,theta,conKc0,conKo0,Ekc,Eko,o2ci,Eavm,Edvm,Eajm,Edjm,Entrpy,gam0,gam1,gam2)=consts() | |
header_out=' year doy hour carbon_Leaf carbon_Wood carbon_Root carbon_Flitter carbon_Clitter SOM_Miro SOM_SLOW SOM_Pass carbon_canopy carbon_biomass carbon_soil gpp npp nee_simulate nee_observe resp_auto resp_hetero resp_tot ET Transpiration Runoff LatentHeat LAI RootMoist SoilWater soilwater_1 soilwater_2 soilwater_3 soilwater_4 soilwater_5 soilwater_6 soilwater_7 soilwater_8 soilwater_9 soilwater_10 satfrac_1 satfrac_2 satfrac_3 satfrac_4 satfrac_5 satfrac_6 satfrac_7 satfrac_8 satfrac_9 satfrac_10 CO2concentratio AirSpecificHumu rain_div_3600 scale_sw TairPlus273_15' | |
init_opt=fread.readinit('initial_opt.txt') | |
wsmax=init_opt[0] | |
wsmin=init_opt[1] | |
gddonset=init_opt[2] | |
LAIMAX=init_opt[3] | |
LAIMIN=init_opt[4] | |
rdepth=init_opt[5] | |
Rootmax=init_opt[6] | |
Stemmax=init_opt[7] | |
SapR=init_opt[8] | |
SapS=init_opt[9] | |
SLA=init_opt[10] | |
GLmax=init_opt[11]/24. | |
GRmax=init_opt[12]/24. | |
Gsmax=init_opt[13]/24. | |
a1=init_opt[14] | |
Ds0=init_opt[15] | |
Vcmx0=init_opt[16] | |
alpha=init_opt[17] | |
tau_L=init_opt[18]*8760. | |
tau_W=init_opt[19]*8760. | |
tau_R=init_opt[20]*8760. | |
tau_F=init_opt[21]*8760. | |
tau_C=init_opt[22]*8760. | |
tau_Micr=init_opt[23]*8760. | |
tau_Slow=init_opt[24]*8760. | |
tau_Pass=init_opt[25]*8760. | |
TminV=init_opt[26] | |
TmaxV=init_opt[27] | |
ToptV=init_opt[28] | |
Tcold=init_opt[29] | |
Gamma_Wmax=init_opt[30] | |
Gamma_Tmax=init_opt[31] | |
NSC=init_opt[32] | |
Q_leaf=init_opt[33] | |
Q_wood=init_opt[34] | |
Q_root1=init_opt[35] | |
Q_root2=init_opt[36] | |
Q_root3=init_opt[37] | |
Q_coarse=init_opt[38] | |
Q_fine=init_opt[39] | |
Q_micr=init_opt[40] | |
Q_slow=init_opt[41] | |
Q_pass=init_opt[42] | |
S_w_min=init_opt[43] | |
Q10_h=init_opt[44] | |
WILTPT=wsmin/100.0 | |
FILDCP=wsmax/100.0 | |
wscontent=WILTPT | |
fwsoil=1.0 | |
topfws=1.0 | |
omega=1.0 | |
wcl=[FILDCP,FILDCP,FILDCP,FILDCP,FILDCP,FILDCP,FILDCP,FILDCP,FILDCP,FILDCP] | |
Storage=32.09 | |
times_storage_use=600 | |
stor_use=Storage/times_storage_use | |
onset=0 | |
duration=0 | |
offset=0 | |
dormancy=1 | |
LAI=LAIMIN | |
bmstem=Q_wood/0.45 | |
bmroot=(Q_root1+Q_root2+Q_root3)/0.45 | |
bmleaf=Q_leaf/0.45 | |
bmplant=bmstem+bmroot+bmleaf | |
mult=1 | |
writer=yr_data*mult | |
num=0 | |
Tavg72=5.0 | |
neeDif_all=0.0 | |
eJmx0=Vcmx0*2.7 | |
m=0 | |
n=0 | |
ta=0 | |
Sps=0.17 | |
cov_run=True | |
for yr in range(1,int(writer+yr_data)+2): | |
if((year_data[m%lines]% 4)==0): | |
if((year_data[m%lines]%100)==0): | |
if((year_data[m%lines]%400)==0): | |
idays=366 | |
else: | |
idays=365 | |
else: | |
idays=366 | |
else: | |
idays=365 | |
GDD5=0.0 | |
onset=0 | |
gpp_yr=0.0 | |
NPP_yr=0.0 | |
Rh_yr =0.0 | |
NEE_yr=0.0 | |
neeDif_year=0.0 | |
for days in range(1,idays+1): | |
StemSap=min(Stemmax,SapS*bmstem) | |
RootSap=min(Rootmax,SapR*bmroot) | |
NSCmin=5. | |
NSCmax=0.05*(StemSap+RootSap+Q_leaf) | |
#changed by blc, fortran bug | |
if(days==1 and yr==1): | |
# ta=(input_data[0,0]-273.15) | |
ta=0.0 | |
if(ta>0): | |
GDD5=GDD5+ta | |
ta=0.0 | |
#canopy and soil model | |
gpp_t =0.0 | |
transp_t=0.0 | |
Hcanop_d=0.0 | |
evap_t =0.0 | |
Ts=0.0 | |
rain_t=0.0 | |
Trunoff=0.0 | |
RaL=0.0 | |
RaS=0.0 | |
RaR=0.0 | |
Rauto=0.0 | |
neeDif_day=0.0 | |
neeSim_daily=0.0 | |
neeObs_daily=0.0 | |
dtimes=24 | |
for i in range(1,dtimes+1): | |
ti=i | |
if(m>lines): | |
output=1 | |
if(m>lines): | |
m=0 | |
if(n>lines): | |
n=0 | |
year=year_data[m] | |
day=day_data[m] | |
hour =hour_data[m] | |
Tair=input_data[m,0]-273.15 | |
rain=input_data[m,6]*3600. | |
radsol=input_data[m,10] | |
Qair=input_data[m,2] | |
wind=math.fabs(input_data[m,4]) | |
co2ca=input_data[m,14] *1.0E-6 | |
Pa_air=101325.0 | |
LWdown=input_data[m,12] | |
Tsoil=Tair*0.8 | |
windU0=min(1.0,wind) | |
if(radsol==0): | |
radsol=.01 | |
eairP=Qair/(Qair+0.62198)*Pa_air | |
Dair=max(50.01,(esat(Tair)-eairP)) | |
RH=eairP/(eairP+Dair)*100.0 | |
wethr=1 | |
Rnet=0.8*radsol | |
if(radsol>10): | |
G=-25 | |
else: | |
G=0.5 | |
Esoil=.05*radsol | |
if(radsol<=10): | |
Esoil=.5*G | |
Hcrop=0.1 | |
Ecstot=0.1 | |
Anet=0.1 | |
DepH2O=0.2 | |
ta= ta + Tair/24.0 | |
Ts=Ts+Tsoil/24.0 | |
if(NSC<=NSCmin): | |
fnsc=0.0 | |
if(NSC>=NSCmax): | |
fnsc=1.0 | |
if(NSC<NSCmax): | |
if(NSC>NSCmin): | |
fnsc=(NSC-NSCmin)/(NSCmax-NSCmin) | |
[gpp,evap,transp,Acanop,Hcanop,Sps]=canopy(fwsoil,topfws,wscontent,LAI,Sps,day,hour,radsol,Tair,Dair,eairP,windU0,rain,wethr,Rnet,G,Esoil,Hcrop,Ecstot,Anet,Tsoil,DepH2O,wsmax,wsmin,lat,co2ca,a1,Ds0,Vcmx0,extkU,xfang,alpha,stom_n,pi,tauL,rhoL,rhoS,emleaf,emsoil,Rconst,sigma,cpair,Patm,Trefk,H2OLv0,airMa,H2OMw,chi,Dheat,wleaf,gsw0,eJmx0,theta,conKc0,conKo0,Ekc,Eko,o2ci,Eavm,Edvm,Eajm,Edjm,Entrpy,gam0,gam1,gam2,TminV,TmaxV,ToptV) | |
gpp=max(0,gpp) | |
# call resperation | |
[RaLeaf,RaStem,RaRoot,Rauto]=respiration(LAIMIN,gpp,Tair,Tsoil,DepH2O,LAI,SLA,bmstem,bmroot,bmleaf,StemSap,RootSap,NSC,fnsc) | |
# call soilwater | |
[transp,wcl,evap,runoff,wscontent,fwsoil,topfws,omega,omega_S,WaterR,waters,satfracl]=soilwater(wsmax,wsmin,rdepth,FRLEN,rain,Tair,transp,wcl,Tsoil,RH,thksl,LAI,omega) | |
omega=omega_S | |
ET=evap+transp | |
NA_WC_soil=wscontent | |
NA_WC_root=WaterR | |
# call plantgrowth | |
#bmroot odd after first | |
[StemSap,RootSap,Storage,onset,accumulation,Sps,store,add,L_fall,npp,alpha_L,alpha_W,alpha_R]=blcpg(Tavg72,Tavg72,omega,GLmax,GRmax,Gsmax,LAI,LAIMAX,LAIMIN,SLA,tau_L,bmleaf,bmroot,bmstem,bmplant,Rootmax,Stemmax,SapS,Storage,GDD5,stor_use,onset,accumulation,gddonset,NSC,fnsc,NSCmin,NSCmax,add,Tcold,Gamma_Wmax,Gamma_Tmax) | |
NSC=NSC+gpp-Rauto-(npp-add)-store | |
# call TCS | |
[Q_leaf,Q_wood,Q_root,Q_fine,Q_coarse,Q_micr,Q_slow,Q_pass,Rh_f,Rh_c,Rh_Micr,Rh_Slow,Rh_Pass]=tcs(Tair,Tsoil,omega,npp,alpha_L,alpha_W,alpha_R,L_fall,tau_L,tau_W,tau_R,tau_F,tau_C,tau_Micr,tau_Slow,tau_Pass,Q_leaf,Q_wood,Q_root,Q_fine,Q_coarse,Q_micr,Q_slow,Q_pass,S_w_min,Q10_h) | |
Rhetero=Rh_f + Rh_c + Rh_Micr + Rh_Slow + Rh_Pass | |
NEE=Rauto+Rhetero - gpp | |
Q_soil=Q_micr + Q_slow + Q_pass | |
bmroot=Q_root/0.45 | |
bmleaf=Q_leaf/0.45 | |
bmstem=Q_wood/0.45 | |
bmplant=bmleaf+bmroot+bmstem | |
LAI=bmleaf*SLA | |
# if(writer< yr<(writer+yr_data+1)): | |
if(output==1): | |
NA_L=Q_leaf/1000. | |
NA_W=Q_wood/1000. | |
NA_R=Q_root/1000. | |
NA_F=Q_fine/1000. | |
NA_C=Q_coarse/1000. | |
NA_Micr=Q_micr/1000. | |
NA_slow=Q_slow/1000. | |
NA_pass=Q_pass/1000. | |
NA_can=NA_L+NA_W*0.7 | |
NA_BM=NA_L+NA_W+NA_R | |
NA_S=NA_Micr+NA_slow+NA_pass | |
NA_GPP=gpp/(1000.*3600.) | |
NA_NPP=npp/(1000.*3600.) | |
NA_NEE=NEE/(1000.*3600.) | |
NA_Ra=Rauto/(1000.*3600.) | |
NA_Rh=Rhetero/(1000.*3600.) | |
NA_Rt=NA_Ra+NA_Rh | |
NA_ET=ET | |
NA_TR=transp | |
NA_Run=runoff | |
if(NEE_obs[n]>-500*12/1000/1000000): | |
NEE_diff = (NA_NEE-NEE_obs[n])*100000000/12 | |
else: | |
NEE_diff = 0.0 | |
Qle=ET*((2.501-0.00236*Tair)*1000000.0)/3600. | |
# astate[m]=[Q_leaf,Q_wood,Q_root,Q_fine,Q_coarse,Q_micr,Q_slow,Q_pass,tau_L,tau_W,tau_R,tau_F,tau_C,tau_Micr,tau_Slow,tau_Pass,days,i,NEE/(1000*3600)] | |
# astate[m]=[tau_L,tau_W,tau_R,tau_F,tau_C,tau_Micr,tau_Slow,tau_Pass,NEE/(1000*3600)] | |
# astate[m]=[tau_L,tau_W,tau_R,tau_F,tau_C,tau_Micr,tau_Slow,tau_Pass,days,i,NEE/(1000*3600)] | |
astate[m]=[tau_L,tau_W,tau_R,tau_F,tau_C,tau_Micr,tau_Slow,tau_Pass,days,i,NEE] | |
# astate[m]=[tau_L,tau_W,tau_R,tau_F,tau_C,tau_Micr,tau_Slow,tau_Pass,NEE] | |
if(output==0 and m>=200 and tfilter==1 and have_obs==True and (m%aint==0) and (NEE_obs[m]!=0) and cov_run==False): | |
[updated,cov_mat]=kalman(astate,(days,ti,NEE_obs[m]*1000*3600),oerror,cov_mat) | |
# [updated,cov_mat]=kalman(astate,NEE_obs[m],oerror,cov_mat) | |
# (Q_leaf,Q_wood,Q_root,Q_fine,Q_coarse,Q_micr,Q_slow,Q_pass,tau_L,tau_W,tau_R,tau_F,tau_C,tau_Micr,tau_Slow,tau_Pass,tdays,ti,NEE)=updated | |
# (tau_L,tau_W,tau_R,tau_F,tau_C,tau_Micr,tau_Slow,tau_Pass,NEE)=updated | |
(tau_L,tau_W,tau_R,tau_F,tau_C,tau_Micr,tau_Slow,tau_Pass,tdays,ti,NEE)=updated | |
# NEE=NEE*1000*3600 | |
state[m]=[Q_leaf,Q_wood,Q_root,Q_fine,Q_coarse,Q_micr,Q_slow,Q_pass,gpp,npp,Rauto,Rhetero,ET,transp,runoff,LAI,WaterR,wscontent,waters[0],waters[1],waters[2],waters[3],waters[4],waters[5],waters[6],waters[7],waters[8],waters[9],satfracl[0],satfracl[1],satfracl[2],satfracl[3],satfracl[4],satfracl[5],satfracl[6],satfracl[7],satfracl[8],satfracl[9],co2ca,Qair,rain,radsol,Tair,Qle,NEE] | |
m=m+1 | |
# sum day | |
gpp_t=gpp_t + gpp*(24./dtimes) | |
transp_t=transp_t + transp*(24./dtimes) | |
evap_t=evap_t + evap*(24./dtimes) | |
Hcanop_d=Hcanop_d+Hcanop/(24./dtimes) | |
Trunoff=Trunoff+runoff | |
# sum year | |
gpp_yr=gpp_yr+gpp | |
NPP_yr=NPP_yr+npp | |
Rh_yr =Rh_yr +Rhetero | |
NEE_yr=NEE_yr+NEE | |
if(output==1): | |
neeDif_day= neeDif_day + NEE_diff*NEE_diff | |
neeSim_daily=neeSim_daily+NA_NEE*1000000000./12 | |
neeObs_daily=neeObs_daily+NEE_obs[n]*1000000000./12 | |
n=n+1 | |
if(output==1): | |
neeObs_days.append(neeObs_daily) | |
neeSim_days.append(neeSim_daily) | |
sumObs=sumObs+neeObs_daily | |
sumSim=sumSim+neeSim_daily | |
sumObsObs=sumObsObs+neeObs_daily*neeObs_daily | |
sumSimObs=sumSimObs+neeSim_daily*neeObs_daily | |
dayCount = dayCount + 1 | |
neeDif_year=neeDif_year + neeDif_day | |
Tavg72=ta | |
storage=accumulation | |
if(cov_run==True and have_obs==True and tfilter==True and m==lines+1): | |
cov_mat=numpy.cov(astate,rowvar=0) | |
cov_run=False | |
stor_use=Storage/times_storage_use | |
accumulation=0.0 | |
onset=0 | |
neeDif_all=neeDif_all + neeDif_year | |
outvars=53 | |
output=numpy.array(numpy.zeros((lines+1,outvars))) | |
output[:,0]=year_data | |
output[:,1]=day_data | |
output[:,2]=hour_data | |
output[:,3]=state[:,0]/1000 | |
output[:,4]=state[:,1]/1000 | |
output[:,5]=state[:,2]/1000 | |
output[:,6]=state[:,3]/1000 | |
output[:,7]=state[:,4]/1000 | |
output[:,8]=state[:,5]/1000 | |
output[:,9]=state[:,6]/1000 | |
output[:,10]=state[:,7]/1000 | |
output[:,11]=output[:,3]+output[:,4]*.07 | |
output[:,12]=output[:,3]+output[:,4]+output[:,5] | |
output[:,13]=output[:,8]+output[:,9]+output[:,10] | |
output[:,14]=state[:,8]/(1000*3600) | |
output[:,15]=state[:,9]/(1000*3600) | |
output[:,16]=state[:,-1]/(1000*3600) | |
output[:,17]=NEE_obs | |
output[:,18]=state[:,10]/(1000*3600) | |
output[:,19]=state[:,11]/(1000*3600) | |
output[:,20]=output[:,18]+output[:,19] | |
output[:,21]=state[:,12] | |
output[:,22]=state[:,13] | |
output[:,23]=state[:,14] | |
output[:,24]=state[:,-2] | |
output[:,25]=state[:,15] | |
output[:,26]=state[:,16] | |
output[:,27]=state[:,17] | |
output[:,28:38]=state[:,18:28] | |
output[:,38:48]=state[:,28:38] | |
output[:,48]=state[:,38] | |
output[:,49]=state[:,39] | |
output[:,50]=state[:,40]/3600 | |
output[:,51]=state[:,41] | |
output[:,52]=state[:,42]+273.15 | |
fread.fout(outfile,output,header_out) | |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import sys | |
from numpy import * | |
def kalman(state, obs, oberror): | |
"updates the forcast given the history and state matrix, observations, and observational error" | |
oberror=matrix(oberror) | |
state=matrix(state) | |
# X=state[:,-1] | |
X=state[-1,:].T | |
Z=matrix(obs).T | |
Pf=cov(state,rowvar=0) | |
tmp=size(obs) | |
H=matrix(zeros((tmp,size(X)))) | |
# H=matrix(zeros((size(X),tmp))) | |
startdim=(shape(H)[1])-tmp | |
for i in range(0,shape(H)[0]): | |
# H[i+startdim,i]=1 | |
H[i,i+startdim]=1 | |
R=oberror.T*oberror | |
PHT=Pf*H.T | |
D=(H*PHT)+R | |
# Dn=linalg.pinv(D) | |
# Dn=linalg.inv(D) | |
# K=(PHT)*Dn | |
# K=linalg.lstsq(D.T,PHT.T)[0] | |
K=linalg.solve(D.T,PHT.T) | |
K=K.T | |
tmp=K*H | |
Pu=(eye(shape(tmp)[0])-tmp)*Pf | |
Xu=X+(K*(Z-(H*X))) | |
Xu=list(Xu) | |
for i in range(len(Xu)): | |
Xu[i]=float(Xu[i]) | |
return Xu |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment