578 lines
24 KiB
FortranFixed
578 lines
24 KiB
FortranFixed
subroutine ToLeafGasOptimization(ntotfiles,ACidata,dataunit,
|
|
&spareunit,datapath,indexunit,ierr)
|
|
implicit none
|
|
!--------------All inputs except for ierr. Outputs are written to files----------------
|
|
integer ntotfiles,dataunit,spareunit,ierr(2),indexunit(20)
|
|
!ierr(1)=0, ok, >1 input data out of range
|
|
!ierr(2) specifies in which input file, the data is out of range
|
|
character*100 datapath,ACidata(ntotfiles)
|
|
!-------------------------------------------------------------------------------
|
|
integer ntotpoints,npoints(ntotfiles),i,j,k,n,curveno(ntotfiles),
|
|
&iobs,maxobs,nmax,iwarning,warningunit,isitmassbased(ntotfiles),
|
|
&iprintheader(ntotfiles),ivector(1000),startline
|
|
parameter(maxobs=2000,nmax=100)
|
|
character*100 sample(ntotfiles)
|
|
character*50 chartime,siteID(ntotfiles),species(ntotfiles),ftime,
|
|
&longchar1*50000,longchar*5000,charvars(500),
|
|
&woodporosity(ntotfiles)
|
|
double precision esat,Latitude(ntotfiles),Longitude(ntotfiles),
|
|
&Elevation(ntotfiles),yearsampled(ntotfiles),sampledoy(ntotfiles),
|
|
&GrowingSeasonStart(ntotfiles),GrowingSeasonEnd(ntotfiles),
|
|
&standage(ntotfiles),CanopyHeight(ntotfiles),
|
|
&LeafAreaIndex(ntotfiles),MeanTimeBtwnSteadyReadings(ntotfiles),
|
|
&SampleHeight(ntotfiles),Needleage(ntotfiles),
|
|
&specificLAI(ntotfiles),nitrogencontent(ntotfiles),
|
|
&carboncontent(ntotfiles),avetimeresolution(ntotfiles),
|
|
&avetimesampled(ntotfiles),phoscontent(ntotfiles),
|
|
&sapwooddensity(ntotfiles),leafratio(ntotfiles),
|
|
&stom_COND_mol,CO2i_ppm,transp_mmol,vpdl_KPa,BLCond,Tair_oC,
|
|
&Tleaf_oC,CO2chamber_ppm,H2OS_mmol,RH_S100,PARi_umol,Press_KPa,
|
|
&oxygeni_KPa,PNcor_umol,uncorphoto,chamberarea,stmrad,tblk,co2r,
|
|
&h2or,rh_r,flow,paro,csmch,hsmch,stablef,listatus,phips2,
|
|
&ambientvaporpres,pari(ntotfiles,maxobs),
|
|
&templeaf(ntotfiles,maxobs),pres_air(ntotfiles,maxobs),
|
|
&yAnet(ntotfiles,maxobs),po2i(ntotfiles,maxobs),
|
|
&trmmol(ntotfiles,maxobs),gswmeas(ntotfiles,maxobs),
|
|
&vpdl(ntotfiles,maxobs),tempair(ntotfiles,maxobs),
|
|
&eambient(ntotfiles,maxobs),xpco2i_ppm(ntotfiles,maxobs),
|
|
&xpco2i(ntotfiles,maxobs),co2a_ppm(ntotfiles,maxobs),
|
|
&pco2ambient(ntotfiles,maxobs),sampletime(ntotfiles,maxobs),
|
|
&chlflphips2(ntotfiles,maxobs),CurveTypeID(ntotfiles,maxobs),
|
|
&fo_pam(ntotfiles,maxobs),fm_pam(ntotfiles,maxobs),
|
|
&fs_pam(ntotfiles,maxobs),pam_measlight(ntotfiles,maxobs),
|
|
&vectorhorse(maxobs),stargamma25_usr(ntotfiles),
|
|
&fkc25_usr(ntotfiles),fko25_usr(ntotfiles),tissuearea,tissuemass,
|
|
&rdlight25_usr(ntotfiles),alpha25_usr(ntotfiles),datumlimit,
|
|
&resistwp25_usr(ntotfiles),resistch25_usr(ntotfiles),gtc,gtw,
|
|
&term,term1,H2OLeaf_mmol,fo_fluoresce,fm_fluoresce,fs_fluoresce,
|
|
&f_measlight,stdpar,fmeanpar,xminpar,xmaxpar,
|
|
&stdco2,fmeanco2,xminco2,xmaxco2
|
|
!
|
|
warningunit=indexunit(10)
|
|
ierr(1)=0
|
|
|
|
! open(unit=121,file='sphagnumdata.csv')
|
|
! write(121,'(200A)')'name,','hhmmss,','no,','time,','datumlimit,',
|
|
! &'stom_COND_mol,','CO2chamber_ppm,','CO2i_ppm,','PARi_umol,',
|
|
! &'Tleaf_oC,','Tair_oC,','transp_mmol,','PNcor_umol,','H2OS_mmol,',
|
|
! &'RH_S100'
|
|
|
|
!We read all files at once
|
|
do 10 i=1,ntotfiles
|
|
isitmassbased(i)=0
|
|
iwarning=0
|
|
ierr(2)=i
|
|
npoints(i)=0
|
|
sample(i)=trim(ACidata(i))
|
|
!fill any blank spaces in sample(i) with '_'
|
|
1 j=index(trim(sample(i)),' ')
|
|
if(j.gt.0)then
|
|
sample(i)(j:j)='_'
|
|
goto 1
|
|
endif
|
|
curveno(i)=i
|
|
!
|
|
!========================================================================================================================
|
|
!In early 2015, the following section of code is added to allow flexibity for the starting rows to be used for metadata.
|
|
!There is no need for a strict number of rows for metadata because the main data section is now determined automatically.
|
|
!Locate the rows for the actual data
|
|
open(unit=dataunit,file=
|
|
&trim(datapath)//trim(ACidata(i))//'middle')
|
|
open(unit=spareunit,file=trim(datapath)//trim(ACidata(i)))
|
|
read(spareunit,fmt=300,err=40,end=40)longchar1
|
|
rewind(spareunit)
|
|
2 read(spareunit,fmt=300,err=40,end=5)longchar1
|
|
3 k=index(longchar1,char(13))
|
|
if(k.gt.0)then
|
|
!DOS text format, convert it to unix format
|
|
longchar1(k:k+len(char(10))-1)=char(10)
|
|
goto 3
|
|
endif
|
|
write(dataunit,340)trim(longchar1)
|
|
goto 2
|
|
5 close(spareunit)
|
|
rewind(dataunit)
|
|
|
|
open(unit=spareunit,file=
|
|
&trim(datapath)//trim(ACidata(i))//'clean')
|
|
7 read(dataunit,fmt=310,err=40,end=9)longchar
|
|
if(longchar.eq.''.or.longchar.eq.' ')goto 7
|
|
call charlineparser(longchar,nmax,charvars,n)
|
|
if(n.eq.0)goto 7
|
|
write(spareunit,340)trim(longchar)
|
|
goto 7
|
|
9 rewind(spareunit)
|
|
close(dataunit,status='delete')
|
|
|
|
j=0
|
|
500 read(spareunit,fmt=310,err=40,end=600)longchar
|
|
call charlineparser(longchar,nmax,charvars,n)
|
|
j=j+1
|
|
ivector(j)=n
|
|
goto 500
|
|
600 if(j.lt.12)then
|
|
close(spareunit,status='delete')
|
|
goto 630
|
|
else
|
|
rewind(spareunit)
|
|
endif
|
|
startline=0
|
|
610 startline=startline+1
|
|
if(startline.gt.j-11)goto 40
|
|
n=0
|
|
if(ivector(startline).ne.ivector(startline+1))n=1
|
|
if(ivector(startline).ne.ivector(startline+2))n=1
|
|
if(ivector(startline+2).lt.15.or.ivector(startline+2).gt.25)n=1
|
|
|
|
if(ivector(startline+3).ne.ivector(startline+4))n=1
|
|
if(ivector(startline+3).ne.ivector(startline+5))n=1
|
|
if(ivector(startline+5).lt.5.or.ivector(startline+5).gt.10)n=1
|
|
|
|
if(ivector(startline+6).ne.ivector(startline+7))n=1
|
|
if(ivector(startline+6).ne.ivector(startline+8))n=1
|
|
if(ivector(startline+8).ne.ivector(startline+9))n=1
|
|
if(ivector(startline+8).ne.ivector(startline+10))n=1
|
|
if(ivector(startline+8).ne.ivector(startline+11))n=1
|
|
if(ivector(startline+8).lt.25)n=1
|
|
if(n.eq.1)goto 610
|
|
|
|
!startline is the line 'Elevation,SampleYear,SampleDayOfYear.....'
|
|
!In general
|
|
!Line 1-10 describe the general information about the data
|
|
!Line 11-12 are the header lines for line 13
|
|
!Line 13 gives the site information and the data about the leaf sampled
|
|
!Line 14-15 are the header lines for lines 16
|
|
!Line 16 user-supplied parameter values
|
|
!Line 17-18 are the header lines for lines 19 and higer
|
|
!Line 19 and higher: actual gas exchange data
|
|
do j=1,startline+1
|
|
read(spareunit,*)
|
|
enddo
|
|
!=========================================================================================================================
|
|
read(spareunit,fmt=310,err=13)longchar
|
|
call charlineparser(longchar,nmax,charvars,n)
|
|
do j=n+1,nmax
|
|
charvars(j)='-9999'
|
|
enddo
|
|
siteID(i)=trim(charvars(1))
|
|
species(i)=trim(charvars(12))
|
|
woodporosity(i)=trim(charvars(20))
|
|
n=len(trim(charvars(2)))
|
|
call extCharToFloatNum(n,charvars(2),Latitude(i),j)
|
|
n=len(trim(charvars(3)))
|
|
call extCharToFloatNum(n,charvars(3),Longitude(i),j)
|
|
n=len(trim(charvars(4)))
|
|
call extCharToFloatNum(n,charvars(4),Elevation(i),j)
|
|
n=len(trim(charvars(5)))
|
|
call extCharToFloatNum(n,charvars(5),yearsampled(i),j)
|
|
n=len(trim(charvars(6)))
|
|
call extCharToFloatNum(n,charvars(6),sampledoy(i),j)
|
|
n=len(trim(charvars(7)))
|
|
call extCharToFloatNum(n,charvars(7),GrowingSeasonStart(i),j)
|
|
n=len(trim(charvars(8)))
|
|
call extCharToFloatNum(n,charvars(8),GrowingSeasonEnd(i),j)
|
|
n=len(trim(charvars(9)))
|
|
call extCharToFloatNum(n,charvars(9),standage(i),j)
|
|
n=len(trim(charvars(10)))
|
|
call extCharToFloatNum(n,charvars(10),CanopyHeight(i),j)
|
|
n=len(trim(charvars(11)))
|
|
call extCharToFloatNum(n,charvars(11),LeafAreaIndex(i),j)
|
|
n=len(trim(charvars(13)))
|
|
call extCharToFloatNum(n,charvars(13),
|
|
&MeanTimeBtwnSteadyReadings(i),j)
|
|
n=len(trim(charvars(14)))
|
|
call extCharToFloatNum(n,charvars(14),SampleHeight(i),j)
|
|
n=len(trim(charvars(15)))
|
|
call extCharToFloatNum(n,charvars(15),Needleage(i),j)
|
|
n=len(trim(charvars(16)))
|
|
call extCharToFloatNum(n,charvars(16),specificLAI(i),j)
|
|
n=len(trim(charvars(17)))
|
|
call extCharToFloatNum(n,charvars(17),nitrogencontent(i),j)
|
|
n=len(trim(charvars(18)))
|
|
call extCharToFloatNum(n,charvars(18),carboncontent(i),j)
|
|
n=len(trim(charvars(19)))
|
|
call extCharToFloatNum(n,charvars(19),phoscontent(i),j)
|
|
n=len(trim(charvars(21)))
|
|
call extCharToFloatNum(n,charvars(21),sapwooddensity(i),j)
|
|
n=len(trim(charvars(22)))
|
|
call extCharToFloatNum(n,charvars(22),leafratio(i),j)
|
|
do j=1,2
|
|
read(spareunit,*)
|
|
enddo
|
|
read(spareunit,fmt=310,err=36)longchar
|
|
call charlineparser(longchar,nmax,charvars,n)
|
|
do j=n+1,nmax
|
|
charvars(j)='-9999'
|
|
enddo
|
|
n=len(trim(charvars(1)))
|
|
call extCharToFloatNum(n,charvars(1),stargamma25_usr(i),j)
|
|
n=len(trim(charvars(2)))
|
|
call extCharToFloatNum(n,charvars(2),fkc25_usr(i),j)
|
|
n=len(trim(charvars(3)))
|
|
call extCharToFloatNum(n,charvars(3),fko25_usr(i),j)
|
|
n=len(trim(charvars(4)))
|
|
call extCharToFloatNum(n,charvars(4),alpha25_usr(i),j)
|
|
n=len(trim(charvars(5)))
|
|
call extCharToFloatNum(n,charvars(5),rdlight25_usr(i),j)
|
|
n=len(trim(charvars(6)))
|
|
call extCharToFloatNum(n,charvars(6),resistwp25_usr(i),j)
|
|
n=len(trim(charvars(7)))
|
|
call extCharToFloatNum(n,charvars(7),resistch25_usr(i),j)
|
|
if(stargamma25_usr(i).lt.0.0d0.or.
|
|
&stargamma25_usr(i).gt.500.0d0)stargamma25_usr(i)=-9999.0d0
|
|
if(fkc25_usr(i).lt.0.0d0.or.fkc25_usr(i).gt.5000.0d0)
|
|
&fkc25_usr(i)=-9999.0d0
|
|
if(fko25_usr(i).lt.0.0d0.or.fko25_usr(i).gt.90000.0d0)
|
|
&fko25_usr(i)=-9999.0d0
|
|
if(alpha25_usr(i).lt.0.0d0.or.alpha25_usr(i).gt.1.0d0)
|
|
&alpha25_usr(i)=-9999.0d0
|
|
if(rdlight25_usr(i).lt.0.0d0.or.rdlight25_usr(i).gt.100.0d0)
|
|
&rdlight25_usr(i)=-9999.0d0
|
|
if(resistwp25_usr(i).lt.0.0d0.or.resistwp25_usr(i).gt.10000.0d0)
|
|
&resistwp25_usr(i)=-9999.0d0
|
|
if(resistwp25_usr(i).lt.0.0d0.or.resistwp25_usr(i).gt.10000.0d0)
|
|
&resistch25_usr(i)=-9999.0d0
|
|
do j=1,2
|
|
read(spareunit,*)
|
|
enddo
|
|
20 read(spareunit,fmt=310,err=39,end=100)longchar
|
|
call charlineparser(longchar,nmax,charvars,n)
|
|
if(n.le.25)goto 20
|
|
do j=n+1,nmax
|
|
charvars(j)='-9999'
|
|
enddo
|
|
chartime=trim(charvars(2))
|
|
ftime=trim(charvars(3))
|
|
n=len(trim(charvars(1)))
|
|
call extCharToFloatNum(n,charvars(1),term,j)
|
|
iObs=idnint(term)
|
|
n=len(trim(charvars(4)))
|
|
call extCharToFloatNum(n,charvars(4),uncorphoto,j)
|
|
n=len(trim(charvars(5)))
|
|
call extCharToFloatNum(n,charvars(5),PNcor_umol,j)
|
|
if(dabs(PNcor_umol+9999.0d0).lt.1.0d-4)PNcor_umol=uncorphoto
|
|
n=len(trim(charvars(6)))
|
|
call extCharToFloatNum(n,charvars(6),stom_COND_mol,j)
|
|
n=len(trim(charvars(7)))
|
|
call extCharToFloatNum(n,charvars(7),CO2i_ppm,j)
|
|
n=len(trim(charvars(8)))
|
|
call extCharToFloatNum(n,charvars(8),transp_mmol,j)
|
|
n=len(trim(charvars(9)))
|
|
call extCharToFloatNum(n,charvars(9),vpdl_KPa,j)
|
|
n=len(trim(charvars(10)))
|
|
call extCharToFloatNum(n,charvars(10),chamberarea,j)
|
|
n=len(trim(charvars(11)))
|
|
call extCharToFloatNum(n,charvars(11),stmrad,j)
|
|
n=len(trim(charvars(12)))
|
|
call extCharToFloatNum(n,charvars(12),BLCond,j)
|
|
n=len(trim(charvars(13)))
|
|
call extCharToFloatNum(n,charvars(13),Tair_oC,j)
|
|
n=len(trim(charvars(14)))
|
|
call extCharToFloatNum(n,charvars(14),Tleaf_oC,j)
|
|
n=len(trim(charvars(15)))
|
|
call extCharToFloatNum(n,charvars(15),tblk,j)
|
|
n=len(trim(charvars(16)))
|
|
call extCharToFloatNum(n,charvars(16),co2r,j)
|
|
n=len(trim(charvars(17)))
|
|
call extCharToFloatNum(n,charvars(17),CO2chamber_ppm,j)
|
|
n=len(trim(charvars(18)))
|
|
call extCharToFloatNum(n,charvars(18),h2or,j)
|
|
n=len(trim(charvars(19)))
|
|
call extCharToFloatNum(n,charvars(19),H2OS_mmol,j)
|
|
n=len(trim(charvars(20)))
|
|
call extCharToFloatNum(n,charvars(20),rh_r,j)
|
|
n=len(trim(charvars(21)))
|
|
call extCharToFloatNum(n,charvars(21),RH_S100,j)
|
|
n=len(trim(charvars(22)))
|
|
call extCharToFloatNum(n,charvars(22),flow,j)
|
|
n=len(trim(charvars(23)))
|
|
call extCharToFloatNum(n,charvars(23),PARi_umol,j)
|
|
n=len(trim(charvars(24)))
|
|
call extCharToFloatNum(n,charvars(24),paro,j)
|
|
n=len(trim(charvars(25)))
|
|
call extCharToFloatNum(n,charvars(25),Press_KPa,j)
|
|
n=len(trim(charvars(26)))
|
|
call extCharToFloatNum(n,charvars(26),csmch,j)
|
|
n=len(trim(charvars(27)))
|
|
call extCharToFloatNum(n,charvars(27),hsmch,j)
|
|
n=len(trim(charvars(28)))
|
|
call extCharToFloatNum(n,charvars(28),stablef,j)
|
|
n=len(trim(charvars(29)))
|
|
call extCharToFloatNum(n,charvars(29),listatus,j)
|
|
n=len(trim(charvars(30)))
|
|
call extCharToFloatNum(n,charvars(30),phips2,j)
|
|
n=len(trim(charvars(31)))
|
|
call extCharToFloatNum(n,charvars(31),oxygeni_KPa,j)
|
|
n=len(trim(charvars(32)))
|
|
call extCharToFloatNum(n,charvars(32),datumlimit,j)
|
|
n=len(trim(charvars(33)))
|
|
call extCharToFloatNum(n,charvars(33),tissuearea,j)
|
|
n=len(trim(charvars(34)))
|
|
call extCharToFloatNum(n,charvars(34),tissuemass,j)
|
|
!
|
|
n=len(trim(charvars(35)))
|
|
call extCharToFloatNum(n,charvars(35),fo_fluoresce,j)
|
|
n=len(trim(charvars(36)))
|
|
call extCharToFloatNum(n,charvars(36),fm_fluoresce,j)
|
|
n=len(trim(charvars(37)))
|
|
call extCharToFloatNum(n,charvars(37),fs_fluoresce,j)
|
|
n=len(trim(charvars(38)))
|
|
call extCharToFloatNum(n,charvars(38),f_measlight,j)
|
|
|
|
if(tissuearea.gt.0.0d0.and.tissuemass.gt.0.0d0)then
|
|
!We assume the user requires mass-based calculations. We convert net photosynthesis,
|
|
!transpiration, conductance and PAR from area basis to mass basis. All fitted parameters
|
|
!are mass-based. However, mixing area- and mass- based calculations is not allowed.
|
|
if(npoints(i).gt.0.and.isitmassbased(i).eq.0)goto 34
|
|
isitmassbased(i)=1
|
|
!Convert PAR from umol/m2/s to umol/kg/s. tissuearea is in cm2 and tissuemass in in g
|
|
PARi_umol=PARi_umol*tissuearea/(tissuemass*10.0d0)
|
|
term=(H2OS_mmol-h2or)/(1000.0d0-H2OS_mmol)
|
|
transp_mmol=(flow/tissuemass)*term
|
|
term=co2r-CO2chamber_ppm*(1000.0d0-h2or)/(1000.0d0-H2OS_mmol)
|
|
PNcor_umol=(1.0d-3*flow/tissuemass)*term
|
|
H2OLeaf_mmol=esat(Tleaf_oC+273.15d0,Press_KPa*1000.0d0)/
|
|
&Press_KPa
|
|
!gtw is the conductance for water vapor between the water film and free air
|
|
gtw=transp_mmol*1.0d-3*(1.0d+3-(H2OLeaf_mmol+H2OS_mmol)/2.0d0)
|
|
&/(H2OLeaf_mmol-H2OS_mmol)
|
|
!we assume no stomatal conductance. We use the ratio of diffusivities of CO2 and water vapor in air (1.6),
|
|
!rather than the ratio of diffusivities of CO2 and water vapor in the boundary layer (1.37) as the latter applies
|
|
!to Pohlhausen analysis of mass transfer from a plate in laminar parallel flows which is probably not true
|
|
!for Sphagnum tissues.
|
|
gtc=gtw/1.6d0
|
|
!we set treat gtw as if it is stomatal conductance.
|
|
stom_COND_mol=gtw
|
|
CO2i_ppm=((gtc-1.0d-3*transp_mmol/2.0d0)*CO2chamber_ppm-
|
|
&PNcor_umol)/(gtc-1.0d-3*transp_mmol/2.0d0)
|
|
else
|
|
if(isitmassbased(i).ne.0)goto 34
|
|
endif
|
|
if(isitmassbased(i).eq.0)then
|
|
term=-100.0d0
|
|
term1=200.0d0
|
|
else
|
|
term=-9998.0d0
|
|
term1=1.0d+10
|
|
endif
|
|
if(PNcor_umol.lt.term.or.PNcor_umol.gt.term1)then
|
|
ierr(1)=1
|
|
if(fm_fluoresce.le.0.0d0)return
|
|
else
|
|
if(transp_mmol.gt.0.0d0.and.stom_COND_mol.gt.0.0d0
|
|
&.and.BLCond.gt.0.0d0)then
|
|
!use the corrected PN to calculate the Ci
|
|
!we assume BLCond already takes into account the stomatal ratio.
|
|
!for Missouri MOFLUX data, only 2004-2008 data need this correction
|
|
gtc=1.0d0/(1.6d0/stom_COND_mol+1.37d0/BLCond)
|
|
term=((gtc-transp_mmol*0.001d0/2.0d0)*CO2chamber_ppm
|
|
&-PNcor_umol)/(gtc+transp_mmol*0.001d0/2.0d0)
|
|
if(dabs(term-CO2i_ppm).gt.5.0d0)then
|
|
if(iwarning.eq.0)then
|
|
write(warningunit,*)'In file ',trim(sample(i))
|
|
write(warningunit,*)'Provided CO2i values do not agree with other
|
|
&input variables. Make sure input data are ok'
|
|
write(warningunit,*)'Original CO2i',',','Calculated CO2i'
|
|
iwarning=1
|
|
endif
|
|
write(warningunit,*)CO2i_ppm,',',term
|
|
endif
|
|
! CO2i_ppm=term
|
|
endif
|
|
endif
|
|
if(CO2i_ppm.le.0.0d0.or.CO2i_ppm.gt.10000.0d0)then
|
|
! ierr(1)=2
|
|
! return
|
|
if(fm_fluoresce.le.0.0d0)goto 20
|
|
endif
|
|
if(Tleaf_oC.lt.-50.0d0.or.Tleaf_oC.gt.100.0d0)then
|
|
ierr(1)=3
|
|
if(fm_fluoresce.le.0.0d0)return
|
|
endif
|
|
if(isitmassbased(i).eq.0)then
|
|
term1=1.0d+5
|
|
else
|
|
term1=1.0d+10
|
|
endif
|
|
if(PARi_umol.lt.-10.01d0.or.PARi_umol.gt.term1)then
|
|
ierr(1)=4
|
|
return
|
|
else
|
|
PARi_umol=dmax1(0.0d0,PARi_umol)
|
|
endif
|
|
if(Press_KPa.lt.50.0d0.or.Press_KPa.gt.150.0d0)then
|
|
Press_KPa=98.9d0
|
|
! ierr(1)=5
|
|
! return
|
|
endif
|
|
if(Tair_oC.lt.-50.0d0.or.Tair_oC.gt.100.0d0)then
|
|
Tair_oC=Tleaf_oC
|
|
endif
|
|
if(vpdl_KPa.lt.0.0d0.or.vpdl_KPa.gt.1000.0d0)then
|
|
if(H2OS_mmol.gt.0.0d0)then
|
|
term=H2OS_mmol*0.001d0/(1.0d0+H2OS_mmol*0.001d0)
|
|
term=term*Press_KPa
|
|
vpdl_KPa=esat((Tleaf_oC+273.15d0),(Press_KPa*1000.0d0))
|
|
vpdl_KPa=vpdl_KPa*0.001d0-term
|
|
else
|
|
if(RH_S100.ge.0.0d0.and.RH_S100.le.100.0d0)then
|
|
term=0.01d0*RH_S100*
|
|
& esat((Tair_oC+273.15d0),(Press_KPa*1000.0d0))
|
|
vpdl_KPa=0.001d0*(
|
|
& esat((Tleaf_oC+273.15d0),(Press_KPa*1000.0d0))-term)
|
|
else
|
|
vpdl_KPa=1.6d0
|
|
endif
|
|
endif
|
|
endif
|
|
if(H2OS_mmol.lt.0.0d0)then
|
|
if(RH_S100.lt.0.0d0.or.RH_S100.gt.100.0d0)then
|
|
ambientvaporpres=esat((Tair_oC+273.15d0),
|
|
& (Press_KPa*1000.0d0))-vpdl_KPa*1000.0d0
|
|
ambientvaporpres=dmax1(0.0d0,ambientvaporpres)
|
|
else
|
|
ambientvaporpres=0.01d0*RH_S100*esat((Tair_oC+273.15d0),
|
|
& (Press_KPa*1000.0d0))
|
|
endif
|
|
else
|
|
ambientvaporpres=H2OS_mmol*0.001d0/(1.0d0+H2OS_mmol*0.001d0)
|
|
ambientvaporpres=ambientvaporpres*Press_KPa*1000.0d0
|
|
endif
|
|
npoints(i)=npoints(i)+1
|
|
pari(i,npoints(i))=PARi_umol
|
|
if(Tleaf_oC.gt.-50.0d0.and.Tleaf_oC.lt.100.0d0)then
|
|
templeaf(i,npoints(i))=Tleaf_oC+273.15d0
|
|
else
|
|
templeaf(i,npoints(i))=-9999.0d0
|
|
endif
|
|
pres_air(i,npoints(i))=Press_KPa*1000.0d0
|
|
yAnet(i,npoints(i))=PNcor_umol
|
|
if(oxygeni_KPa.le.0.0d0.or.oxygeni_KPa.ge.Press_KPa)then
|
|
po2i(i,npoints(i))=0.2095d0*pres_air(i,npoints(i))
|
|
else
|
|
po2i(i,npoints(i))=oxygeni_KPa*1000.0d0
|
|
endif
|
|
trmmol(i,npoints(i))=transp_mmol
|
|
gswmeas(i,npoints(i))=stom_COND_mol
|
|
vpdl(i,npoints(i))=vpdl_KPa*1000.0d0
|
|
if(Tair_oC.gt.-50.0d0.and.Tair_oC.lt.100.0d0)then
|
|
tempair(i,npoints(i))=Tair_oC+273.15d0
|
|
else
|
|
tempair(i,npoints(i))=-9999.0d0
|
|
endif
|
|
eambient(i,npoints(i))=ambientvaporpres
|
|
chlflphips2(i,npoints(i))=phips2
|
|
fo_pam(i,npoints(i))=fo_fluoresce
|
|
fm_pam(i,npoints(i))=fm_fluoresce
|
|
fs_pam(i,npoints(i))=fs_fluoresce
|
|
pam_measlight(i,npoints(i))=f_measlight
|
|
!the unit of CO2 is in umol/mol. We use both umol/mol and Pa. Li-Cor 6400
|
|
!measures CO2 on a moist air basis.
|
|
xpco2i_ppm(i,npoints(i))=CO2i_ppm
|
|
xpco2i(i,npoints(i))=CO2i_ppm*
|
|
& pres_air(i,npoints(i))*1.0d-6
|
|
if(CO2chamber_ppm.gt.0.0d0)then
|
|
co2a_ppm(i,npoints(i))=CO2chamber_ppm
|
|
pco2ambient(i,npoints(i))=CO2chamber_ppm*
|
|
& pres_air(i,npoints(i))*1.0d-6
|
|
else
|
|
pco2ambient(i,npoints(i))=-9999.0d0
|
|
co2a_ppm(i,npoints(i))=-9999.0d0
|
|
endif
|
|
CurveTypeID(i,npoints(i))=datumlimit
|
|
call CharToNumeric(chartime,term)
|
|
sampletime(i,npoints(i))=term
|
|
goto 20
|
|
100 close(spareunit,status='delete')
|
|
do j=1,npoints(i)
|
|
vectorhorse(j)=sampletime(i,j)
|
|
call time_resolution(npoints(i),vectorhorse,
|
|
& avetimeresolution(i),avetimesampled(i))
|
|
enddo
|
|
630 continue
|
|
10 enddo
|
|
iprintheader(1)=1
|
|
do i=2,ntotfiles
|
|
if(isitmassbased(i).eq.isitmassbased(i-1))then
|
|
iprintheader(i)=0
|
|
else
|
|
iprintheader(i)=1
|
|
endif
|
|
enddo
|
|
k=1
|
|
do i=1,ntotfiles
|
|
if(k.eq.1.or.iprintheader(i).eq.1)then
|
|
call LeafGasPrintToFiles(isitmassbased(i:i),indexunit)
|
|
k=0
|
|
endif
|
|
if(npoints(i).lt.3)goto 1112
|
|
!-----------------------------------------------------
|
|
!detect A/Ci or light response curves with many points but no curve types are given
|
|
if(npoints(i).ge.7)then
|
|
j=0
|
|
do n=1,npoints(i)
|
|
if(CurveTypeID(i,n).gt.0)j=1
|
|
enddo
|
|
if(j.eq.0)then
|
|
call stdmaxmeanmin(npoints(i),pari(i:i,1:npoints(i)),
|
|
&stdpar,fmeanpar,xminpar,xmaxpar)
|
|
stdpar=100.0d0*(xmaxpar-xminpar)/fmeanpar
|
|
call stdmaxmeanmin(npoints(i),pco2ambient(i:i,1:npoints(i)),
|
|
&stdco2,fmeanco2,xminco2,xmaxco2)
|
|
stdco2=100.0d0*(xmaxco2-xminco2)/fmeanco2
|
|
if(stdpar.lt.5.0d0.and.stdco2.gt.5.0d0)then
|
|
!ACi curve
|
|
do n=1,npoints(i)
|
|
CurveTypeID(i,n)=11
|
|
enddo
|
|
else
|
|
if(stdpar.gt.5.0d0.and.stdco2.lt.5.0d0)then
|
|
!light response curve
|
|
do n=1,npoints(i)
|
|
CurveTypeID(i,n)=31
|
|
enddo
|
|
endif
|
|
endif
|
|
endif
|
|
endif
|
|
!------------------------------------------------------
|
|
call SetUpLeafGasFit(curveno(i:i),sample(i:i),npoints(i:i),
|
|
&CurveTypeID(i:i,1:npoints(i)),yAnet(i:i,1:npoints(i)),
|
|
&xpco2i(i:i,1:npoints(i)),templeaf(i:i,1:npoints(i)),
|
|
&pari(i:i,1:npoints(i)),pres_air(i:i,1:npoints(i)),
|
|
&po2i(i:i,1:npoints(i)),chlflphips2(i:i,1:npoints(i)),
|
|
&pco2ambient(i:i,1:npoints(i)),trmmol(i:i,1:npoints(i)),
|
|
&gswmeas(i:i,1:npoints(i)),vpdl(i:i,1:npoints(i)),
|
|
&tempair(i:i,1:npoints(i)),eambient(i:i,1:npoints(i)),
|
|
&fo_pam(i:i,1:npoints(i)),fm_pam(i:i,1:npoints(i)),
|
|
&fs_pam(i:i,1:npoints(i)),pam_measlight(i:i,1:npoints(i)),
|
|
&stargamma25_usr(i:i),fkc25_usr(i:i),fko25_usr(i:i),
|
|
&rdlight25_usr(i:i),alpha25_usr(i:i),resistwp25_usr(i:i),
|
|
&resistch25_usr(i:i),isitmassbased(i:i),indexunit,
|
|
&siteID(i:i),Latitude(i:i),Longitude(i:i),Elevation(i:i),
|
|
&yearsampled(i:i),sampledoy(i:i),GrowingSeasonStart(i:i),
|
|
&GrowingSeasonEnd(i:i),standage(i:i),CanopyHeight(i:i),
|
|
&LeafAreaIndex(i:i),species(i:i),avetimeresolution(i:i),
|
|
&avetimesampled(i:i),SampleHeight(i:i),Needleage(i:i),
|
|
&specificLAI(i:i),nitrogencontent(i:i),carboncontent(i:i),
|
|
&phoscontent(i:i),woodporosity(i:i),sapwooddensity(i:i),
|
|
&leafratio(i:i))
|
|
1112 continue
|
|
enddo
|
|
return
|
|
13 ierr(1)=13
|
|
return
|
|
34 ierr(1)=34
|
|
return
|
|
36 ierr(1)=36
|
|
return
|
|
39 ierr(1)=39
|
|
return
|
|
40 ierr(1)=40
|
|
return
|
|
300 format(a50000)
|
|
310 format(a5000)
|
|
340 format(a)
|
|
end subroutine ToLeafGasOptimization
|
|
!&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
|