Files
piscal/leafres/testarea/ToLeafGasOptimization.f
T
2016-02-03 18:52:05 +00:00

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
!&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&