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