Files
piscal/leafres/testarea/ToLeafGasOptimization.f
T
2022-09-12 16:40:28 +00:00

703 lines
30 KiB
FortranFixed

subroutine ToLeafGasOptimization(ic3c4cam,ntotfiles,ACidata,
&dataunit,spareunit,datapath,indexunit,ierr)
implicit none
!--------------All inputs except for ierr. Outputs are written to files----------------
integer ic3c4cam,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,errorunit
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)
errorunit=indexunit(11)
ierr(1)=0
if(ic3c4cam.ne.1.and.ic3c4cam.ne.2)then
write(errorunit,*)'The analysis for CAM photosyntehsis is still
&under development. Check out LeafWeb for this function later.'
ierr(1)=1
return
endif
! 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=spareunit,file=trim(datapath)//trim(ACidata(i)))
read(spareunit,fmt=300,err=35,end=35)longchar1
rewind(spareunit)
open(unit=dataunit,file=
&trim(datapath)//trim(ACidata(i))//'middle')
2 read(spareunit,fmt=300,err=35,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)//'clean'//trim(ACidata(i)))
7 read(dataunit,fmt=310,err=36,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 rewind(spareunit)
startline=0
610 startline=startline+1
if(j.lt.12.or.startline.gt.j-11)then
if(ierr(2).gt.0)then
write(errorunit,*)'Input data error in ',trim(ACidata(i))
write(errorunit,*)
&'Please resubmit the data after correcting the following error:'
ierr(2)=-ierr(2)
endif
write(errorunit,*)'This file has incorrect data format or does
&not contain data'
ierr(1)=1
goto 630
endif
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=40)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=40)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=40,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)then
if(ierr(2).gt.0)then
write(errorunit,*)'Input data error in ',trim(ACidata(i))
write(errorunit,*)
&'Please resubmit the data after correcting the following error:'
ierr(2)=-ierr(2)
endif
write(errorunit,*)'Line starting with ',longchar(1:50)
write(errorunit,*)'Check Column 33 or 34. Mixing area- and
&mass-based measurements is not allowed'
ierr(1)=1
endif
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)then
if(ierr(2).gt.0)then
write(errorunit,*)'Input data error in ',trim(ACidata(i))
write(errorunit,*)
&'Please resubmit the data after correcting the following error:'
ierr(2)=-ierr(2)
endif
write(errorunit,*)'Line starting with ',longchar(1:50)
write(errorunit,*)'Check Column 33 or 34. Mixing area- and
&mass-based measurements is not allowed'
ierr(1)=1
endif
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
if(fm_fluoresce.le.0.0d0)then
if(ierr(2).gt.0)then
write(errorunit,*)'Input data error in ',trim(ACidata(i))
write(errorunit,*)
&'Please resubmit the data after correcting the following error:'
ierr(2)=-ierr(2)
endif
write(errorunit,*)'Line starting with ',longchar(1:50), '...
&is within the main data body but has no valid photosynthesis data'
if(dabs(PNcor_umol+9999.0d0).gt.1.d-6)then
write(errorunit,*)'Photosynthesis out of range:'
write(errorunit,*)PNcor_umol
endif
ierr(1)=1
endif
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
! if(ierr(2).gt.0)then
! write(errorunit,*)'Input data error in ',trim(ACidata(i))
! write(errorunit,*)
! &'Please resubmit the data after correcting the following error:'
! ierr(2)=-ierr(2)
! endif
! write(errorunit,*)'Intercellular CO2 (ppm) out of range'
! ierr(1)=1
if(fm_fluoresce.le.0.0d0)goto 20
endif
if(Tleaf_oC.lt.-50.0d0.or.Tleaf_oC.gt.100.0d0)then
if(fm_fluoresce.le.0.0d0)then
if(ierr(2).gt.0)then
write(errorunit,*)'Input data error in ',trim(ACidata(i))
write(errorunit,*)
&'Please resubmit the data after correcting the following error:'
ierr(2)=-ierr(2)
endif
write(errorunit,*)'Line starting with ',longchar(1:50), '...
&is within the main data body but has no valid leaf temperature'
write(errorunit,*)'Leaf temperature (oC) out of range'
ierr(1)=1
endif
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
if(ierr(2).gt.0)then
write(errorunit,*)'Input data error in ',trim(ACidata(i))
write(errorunit,*)
&'Please resubmit the data after correcting the following error:'
ierr(2)=-ierr(2)
endif
write(errorunit,*)'Line starting with ',longchar(1:50), '.....
&is within the main data body but has no valid PAR data'
write(errorunit,*)'Sample chamber PAR out of range'
ierr(1)=1
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
! if(ierr(2).gt.0)then
! write(errorunit,*)'Input data error in ',trim(ACidata(i))
! write(errorunit,*)
! &'Please resubmit the data after correcting the following error:'
! ierr(2)=-ierr(2)
! endif
! write(errorunit,*)'Air pressure out of range'
! ierr(1)=1
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 do j=1,npoints(i)
vectorhorse(j)=sampletime(i,j)
call time_resolution(npoints(i),vectorhorse,
& avetimeresolution(i),avetimesampled(i))
enddo
630 close(spareunit)
goto 640
35 if(ierr(2).gt.0)then
write(errorunit,*)'Input data error in ',trim(ACidata(i))
write(errorunit,*)
&'Please resubmit the data after correcting the following error:'
ierr(2)=-ierr(2)
endif
write(errorunit,*)'This file has incorrect data format'
ierr(1)=1
close(spareunit)
goto 640
36 if(ierr(2).gt.0)then
write(errorunit,*)'Input data error in ',trim(ACidata(i))
write(errorunit,*)
&'Please resubmit the data after correcting the following error:'
ierr(2)=-ierr(2)
endif
write(errorunit,*)'This file has incorrect data format'
ierr(1)=1
close(dataunit,status='delete')
goto 640
40 if(ierr(2).gt.0)then
write(errorunit,*)'Input data error in ',trim(ACidata(i))
write(errorunit,*)
&'Please resubmit the data after correcting the following error:'
ierr(2)=-ierr(2)
endif
write(errorunit,*)'This file has incorrect data format'
ierr(1)=1
close(spareunit)
640 continue
10 enddo
if(ierr(1).eq.1)return
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,
&ic3c4cam)
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
!------------------------------------------------------
if(ic3c4cam.eq.1)
&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))
if(ic3c4cam.eq.2)
&call C4SetUpLeafGasFit(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
300 format(a50000)
310 format(a5000)
340 format(a)
end subroutine ToLeafGasOptimization
!&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&