!*****************************************************************! !* *! !* 4C (FORESEE) *! !* *! !* *! !* Subroutines: *! !* PREPARE_SITE and PREPARE_CLIMATE *! !* *! !* Contains subroutines: *! !* *! !* PREPARE_SITE: *! !* preparation of site specific simulation parameters *! !* *! !* contains internal subroutines: *! !* SITEMENU: choice of inputs *! !* EDITFILE: edit filenames *! !* READSOIL: input of soil parameter *! !* READCN: input of C-N-parameter *! !* READVALUE: input of start values for *! !* soil water and C-N-modeling *! !* ALLOC_SOIL: allocate soil variables *! !* STAND_BAL_INI: allocate and init stand variables *! !* CONTROL_FILE: saving all parameters *! !* and start conditions for each site *! !* *! !* READDEPO: reading deposition data *! !* READREDN: reading values of redN *! !* READLIT: reading initialisation data of litter fractions *! !* *! !* PREPARE_CLIMATE: reading of site specific climate input data *! !* from file *! !* contains internal subroutines: *! !* READ_DWD *! !* READ_CLI *! !* CLIMFILL *! !* *! !* STORE_PARA: multi run - restore of changed parameter *! !* *! !* Copyright (C) 1996-2018 *! !* Potsdam Institute for Climate Impact Reserach (PIK) *! !* Authors and contributors see AUTHOR file *! !* This file is part of 4C and is licensed under BSD-2-Clause *! !* See LICENSE file or under: *! !* http://www.https://opensource.org/licenses/BSD-2-Clause *! !* Contact: *! !* https://gitlab.pik-potsdam.de/foresee/4C *! !* *! !*****************************************************************! subroutine prepare_site ! input of site specific data use data_climate use data_inter use data_manag use data_mess use data_out use data_par use data_simul use data_site use data_soil use data_soil_cn use data_species use data_stand use data_tsort use data_frost implicit none integer i,ios,help, help_ip character a character :: text character(10) :: helpsim, text2 logical:: ex=.TRUE. real parerr real, external :: avg_sun_incl character(100) :: helpx if (flag_trace) write (unit_trace, '(I4,I10,A)') iday, time_cur, ' prepare_site' WRITE(helpsim,'(I4)') anz_sim read(helpsim,*) anh IF(site_nr==1) THEN help_ip=site_nr ELSE help_ip=ip END IF ! Initialization of climate data IF (flag_clim==1 .or. ip==1 .or. flag_multi .eq.5) THEN call prepare_climate END IF if (flag_end .gt. 0) return ios=0; help=0 do if (ip==1 .and. flag_mult9) then if (flag_trace) write (unit_trace, '(I4,I10,A,I3,A5,L5)') iday, time_cur, ' prepare_site ip=',ip,' ex=',ex call readspec call readsoil ! reading soil parameter IF (flag_end .gt.0) return if (flag_soilin .eq. 0) call readvalue ! Initialization of simulation start values for soil layers ! biochar if (flag_bc .gt. 0) call bc_appl ! Deposition data call readdepo ! Input redN if (flag_multi .ne. 4 .or. flag_multi .ne. 8 ) call readredN flag_mult9 = .FALSE. else if (flag_trace) write (unit_trace, '(I4,I10,A,I3,A5,L5)') iday, time_cur, ' prepare_site ip=',ip,' ex=',ex ! Deposition data call readdepo select case (flag_multi) case (1,6) call readspec if (flag_soilin .eq. 0) call readvalue ! Initialization of simulation start values for soil layers call readredN ! Input redN call readsoil ! reading soil parameter do jpar = jpar + 1 if (vpar(jpar) .gt. -90.0) then helpx = simpar(jpar) call store_para(vpar(jpar), helpx, parerr) IF (parerr .ne. 1.) then CALL error_mess(time,'parameter variation: '//trim(simpar(jpar))//' not found',vpar(jpar)) write (*,*) '*** parameter variation: ', trim(simpar(jpar)), ' not found, see error log' endif else exit endif enddo ! biochar if (flag_bc .gt. 0 .or. flag_decomp .gt. 100) call bc_appl case (2,4) call readsoil ! reading soil parameter if (flag_soilin .eq. 0) call readvalue ! Initialization of simulation start values for soil layers case (5) call readspec call readsoil if (flag_soilin .eq. 0) call readvalue ! Initialization of simulation start values for soil layers call readredN ! Input redN case (7) call assign_co2par call readsoil ! reading soil parameter if (flag_soilin .eq. 0) call readvalue ! Initialization of simulation start values for soil layers call readredN ! Input redN case (8, 9, 10) call readsoil ! reading soil parameter IF (flag_end .gt.0) return call readredN ! Input redN or test resp. end select endif exit enddo ! Setting flag_inth and prec_stad_red from flag_int if (flag_int .lt. 1000) then flag_inth = flag_int else ! Conversion character ==> number and vice versa write (helpsim,'(I4)') flag_int text2 = helpsim(2:2) read (text2,*) flag_inth text2 = helpsim(3:4) read (text2,*) prec_stand_red endif if (.not.flag_mult8910) then unit_soil = getunit() open (unit_soil,file=trim(dirout)//trim(site_name(help_ip))//'_soil.ini'//anh,status='replace') WRITE (unit_soil,'(2A)') '! Soil initialisation, site name: ',site_name(help_ip) endif call stand_bal_ini !allocation of stand summation variables ! Initialization of CO2 call assign_co2par ! Initialisation litter compartments call readlit ! Initialization of soil model with profile data call soil_ini ! Aufruf ohne s_cn_ini ! Initialization disturbances IF (flag_dis .eq. 1 .or. flag_dis .eq. 2) CALL dist_ini ! Initialization of stand call prepare_stand IF (flag_end .gt.0) return ! calculation of latitude in radians xlat = lat/90.*pi*0.5 ! calculation of average sun inclination avg_incl = AVG_SUN_INCL(lat) ! degrees beta=avg_incl*PI/180 ! radians ! read externally prescribed bud burst days CALL readbudb ! Initialization management IF(flag_mg.ne.0.and. flag_mg.ne.5) call manag_ini IF(flag_mg.eq. 5) then thin_dead = 1 allocate(thin_flag1(nspec_tree)) thin_flag1 = 0 end if ! Initialization of output file per site call prep_out call stand_balance call CROWN_PROJ call standup call root_ini ! initialisation of root distribution call s_cn_ini ! Initialization of soil temperature model with stand data call s_t_ini ! control file for saving simulation environment ! output of first Litter-Input at start if(flag_mult8910 .and. (anz_sim .gt. 1)) then continue else IF ((ip .eq. 1 .or. flag_multi .eq. 1 .or. flag_multi .eq. 6) .and. (time_out .ne. -2) ) call control_file endif ! hand over of the litter-initialising call litter if ((flag_decomp .eq. 20) .or. (flag_decomp .eq. 21)) then call testfile(valfile(ip),ex) if (ex .eqv. .true.) then ios = 0 unit_litter = getunit() open(unit_litter,file=valfile(ip),status='old',action='read') if (flag_multi .ne. 9) print *,' *** Open file of litter input data ',valfile(ip),'...' do read(unit_litter,*) text IF(text .ne. '!')then backspace(unit_litter);exit endif enddo endif endif call cn_inp ! read flux data if (flag_eva .gt.10) call evapo_ini ! yearly output IF (time_out .gt. 0) THEN IF (mod(time,time_out) .eq. 0) CALL outyear (1) IF (mod(time,time_out) .eq. 0) CALL outyear (2) ENDIF contains !------------------------------------------------------------------------------- subroutine readsoil ! Input of soil parameter use data_par use data_soil_t use data_site implicit none integer :: inunit, helpnl, helpnr, ihelp real helpgrw, hlong, hlat character :: text character(30) :: hor, boart, helpid if (flag_trace) write (unit_trace, '(I4,I10,A)') iday, time_cur, ' readsoil' ! Setting of flag_surf from flag_cond select case (flag_cond) case (0,1,2,3) flag_surf = 0 case (10,11,12,13) flag_surf = 1 case (30,31,32,33) flag_surf = 3 end select ! Setting of flag_bc from flag_decomp if (flag_decomp .ge. 100) then flag_decomp = flag_decomp - 100 flag_bc = 1 else flag_bc = 0 endif call testfile(sitefile(ip),ex) IF (ex .eqv. .true.) then inunit = getunit() ios=0 open(inunit,file=sitefile(ip),iostat=ios,status='old',action='read') if (.not.flag_mult8910) then print *,'***** Reading soil parameter from file ',sitefile(ip),'...' write (unit_err, *) 'Soil parameter from file ',trim(sitefile(ip)) endif do read(inunit,*) text IF(text .ne. '!')then backspace(inunit) exit endif enddo if (flag_multi .eq. 8.or. flag_multi.eq.5.or. flag_mult910) then read(inunit,*) text IF((text .eq. 'N') .or. (text .eq. 'n'))then flag_soilin = 3 else flag_soilin = 2 backspace(inunit) endif else read(inunit,*) text IF((text .eq. 'N') .or. (text .eq. 'n'))then flag_soilin = 1 else flag_soilin = 0 backspace(inunit) endif soilid(ip) = valfile(ip) endif if ((text .eq. 'S') .or. (text .eq. 's'))then flag_soilin = 4 read(inunit,*) text endif if (.not.flag_mult8910) then write (unit_err, *) 'Soil identity number ', trim(soilid(ip)) write (unit_err, *) 'Climate ID ', trim(clim_id(ip)) endif if (flag_soilin .eq. 1 .or. flag_soilin .ge. 3) then flag_hum = 1 endif if (flag_cond .ge. 40) then flag_hum = 0 endif select case (flag_soilin) case (0,1) ! single files f. j. site read (inunit,*,iostat=ios) long read (inunit,*,iostat=ios) lat read (inunit,*,iostat=ios) nlay read (inunit,*,iostat=ios) nroot_max read (inunit,*,iostat=ios) helpgrw if (helpgrw .gt. 1) then grwlev = helpgrw else fakt = helpgrw grwlev = 1000. endif read (inunit,*,iostat=ios) w_ev_d read(inunit,*,iostat=ios) k_hum ! mineralization constants of humus read(inunit,*,iostat=ios) k_hum_r read(inunit,*,iostat=ios) k_nit ! nitrification constant IF(help==0) call alloc_soil read (inunit,*,iostat=ios) text select case (flag_soilin) case (0) ! old input structure do i = 1, nlay read (inunit,*,iostat=ios) text read (inunit,*,iostat=ios) thick(i),pv_v(i),dens(i),f_cap_v(i), & wilt_p_v(i),spheat(i),phv(i),wlam(i) end do skelv = 0. case(1) ! new input structure do i = 1, nlay read (inunit,*,iostat=ios) helpnr, thick(i),pv_v(i),f_cap_v(i),wilt_p_v(i), & dens(i),spheat(i),phv(i),wlam(i),skelv(i), sandv(i),clayv(i),humusv(i),& C_hum(i), N_hum(i),NH4(i),NO3(i) if (flag_wurz .eq. 4 .or. flag_wurz .eq. 6) then if (phv(i) .le. 0.01) phv(i)=6.0 ! if flag_wurz 4 or 6 is used for calculation a pH-value is assumed endif end do end select ! flag_soilin (0,1) if (.not.flag_mult8910) print *, ' ' IF (ios .ne.0) then print *,' >>>FORESEE message: Error during reading soil data!' WRITE(*,'(A)',advance='no') ' Stop program (y/n)? ' read *, a IF ( a .eq. 'y' .or. a .eq. 'Y') then print *, ' STOP program!' stop endif IF (help==1) call dealloc_soil print *,' Check your input choice!!!' endif ! ios case (2) ! all sites are read from one file; old structure ios = 0 do while (ios .eq. 0) read (inunit,*,iostat=ios) helpid, helpnl, helpnr if (trim(soilid(ip)) .ne. trim(helpid)) then do i = 1, helpnl read (inunit,*,iostat=ios) helpid enddo else nlay = helpnl nroot_max = helpnr if (help==0) call alloc_soil do i = 1, nlay read (inunit,*,iostat=ios) helpnl, hor, boart, depth(i), thick(i),pv_v(i),dens(i), & f_cap_v(i), wilt_p_v(i), spheat(i),phv(i),wlam(i), & C_hum(i), N_hum(i), NH4(i), NO3(i), temps(i) enddo lat = latitude(ip) grwlev = gwtable(ip) exit endif enddo IF (ios .lt. 0) then if (.not.flag_mult8910) print *,' >>>FORESEE message: soil_id ', soilid(ip), ' not found' if (.not.flag_mult8910) print *,' Check your input choice!!!' if (help==1) call dealloc_soil CALL error_mess(time,"soil identificator not found "//adjustl(soilid(ip))//" ip No. ",real(help_ip)) flag_end = 5 return ENDIF ! ios skelv = 0. case (3) ! all sites are read from one file; new structure ios = 0 do while (ios .eq. 0) read (inunit,*,iostat=ios) helpid, helpnl, helpnr if (trim(soilid(ip)) .ne. trim(helpid)) then do i = 1, helpnl read (inunit,*,iostat=ios) helpid enddo else nlay = helpnl nroot_max = helpnr if (help==0) call alloc_soil do i = 1, nlay read (inunit,*,iostat=ios) helpnr, hor, boart, depth(i), thick(i),pv_v(i),f_cap_v(i), & wilt_p_v(i),dens(i),spheat(i),phv(i),wlam(i),skelv(i), sandv(i), & clayv(i),humusv(i),C_hum(i), N_hum(i),NH4(i),NO3(i) if (flag_wurz .eq. 4 .or. flag_wurz .eq. 6) then if (phv(i) .le. 0.01) phv(i)=6.0 ! if flag_wurz 4 or 6 is used for calculation a pH-value is assumed endif end do lat = latitude(ip) grwlev = gwtable(ip) exit endif enddo IF (ios .lt. 0) then if (.not.flag_mult8910) print *,' >>>FORESEE message: soil_id ', soilid(ip), ' not found' if (.not.flag_mult8910) print *,' Check your input choice!!!' if (help==1) call dealloc_soil CALL error_mess(time,"soil identificator not found "//adjustl(soilid(ip))//"ip No.",real(help_ip)) flag_end = 5 return ENDIF ! ios case (4) ! one file several sites if (.not.flag_mult8910) print *,' Reading soil model parameter from soil type file... ', soilid(ip) ios = 0 do while (ios .eq. 0) read (inunit,*,iostat=ios) helpid if (trim(soilid(ip)) .ne. trim(helpid)) then read (inunit,*,iostat=ios) text read (inunit,*,iostat=ios) text read (inunit,*,iostat=ios) helpnl do i = 1, helpnl+6 read (inunit,*,iostat=ios) boart enddo read (inunit,*,iostat=ios) boart else read (inunit,*,iostat=ios) hlong read (inunit,*,iostat=ios) hlat read (inunit,*,iostat=ios) nlay read (inunit,*,iostat=ios) nroot_max read (inunit,*,iostat=ios) helpgrw if (flag_multi .eq. 8.or. flag_multi.eq.5.or. flag_mult910) then if (abs(latitude(ip)) .gt. 90.) lat = latitude(ip) grwlev = gwtable(ip) else if (helpgrw .gt. 1) then grwlev = helpgrw else fakt = helpgrw grwlev = 1000. endif long = hlong lat = hlat endif read (inunit,*,iostat=ios) w_ev_d read(inunit,*,iostat=ios) k_hum ! mineralization constants of humus read(inunit,*,iostat=ios) k_hum_r read(inunit,*,iostat=ios) k_nit ! nitrification constant IF(help==0) call alloc_soil read (inunit,*,iostat=ios) text do i = 1, nlay read (inunit,*,iostat=ios) helpnr, thick(i),pv_v(i),f_cap_v(i),wilt_p_v(i), & dens(i),spheat(i),phv(i),wlam(i),skelv(i), sandv(i),clayv(i),humusv(i),& C_hum(i), N_hum(i),NH4(i),NO3(i) if (flag_wurz .eq. 4 .or. flag_wurz .eq. 6) then if (phv(i) .le. 0.01) phv(i)=6.0 ! if flag_wurz 4 or 6 is used for calculation a pH-value is assumed endif end do IF (ios .ne.0) then print *,' >>>FORESEE message: Error during reading soil data!' print *, ' Program stopped!' IF (help==1) call dealloc_soil flag_end = 7 return endif ! ios exit endif enddo if (.not.flag_mult8910) print *, ' ' IF (ios .lt. 0) then if (.not.flag_mult8910) then print *,' >>>FORESEE message: soil_id ', soilid(ip), ' not found' print *,' Check your input choice!!!' endif if (help==1) call dealloc_soil CALL error_mess(time,"soil identificator not found "//adjustl(soilid(ip))//"ip No.",real(help_ip)) flag_end = 5 return ENDIF ! ios end select ! flag_soilin close(inunit) endif ! ex if (nroot_max .lt. 0) then do i=1, nlay if (C_hum(i) .gt. zero) nroot_max = i enddo endif if (.not.flag_mult8910) then write (unit_err, *) 'Latitude ',lat write (unit_err,*) endif end subroutine readsoil !------------------------------------------------------------------------- subroutine readvalue ! Input of cn-parameters and start values for soil model integer :: inunit character :: text if (flag_trace) write (unit_trace, '(I4,I10,A)') iday, time_cur, ' readvalue' call testfile(valfile(ip),ex) IF (ex .eqv. .true.) then ios = 0 inunit = getunit() open(inunit,file=valfile(ip),status='old',action='read') if (.not.flag_mult8910) print *,' *** Reading initial soil values from file ',valfile(ip),'...' do read(inunit,*) text IF(text .ne. '!')then backspace(inunit);exit endif enddo ! Soil temperature read(inunit,*,iostat=ios) text read(inunit,*,iostat=ios) (temps(i),i=1,nlay) ! C-content of humus read(inunit,*,iostat=ios) text read(inunit,*,iostat=ios) (C_hum(i),i=1,nlay) ! N-content of humus read(inunit,*,iostat=ios) text read(inunit,*,iostat=ios) (N_hum(i),i=1,nlay) ! NH4-content read(inunit,*,iostat=ios) text read(inunit,*,iostat=ios) (NH4(i),i=1,nlay) ! NO3-content read(inunit,*,iostat=ios) text read(inunit,*,iostat=ios) (NO3(i),i=1,nlay) endif IF (ios .ne. 0) then print *,' >>>FORESEE message: Error during reading start values!' WRITE(*,'(A)',advance='no') ' Stop program (y/n)? ' read *, a IF ( a .eq. 'y' .or. a .eq. 'Y') then print *, ' STOP program!' stop ELSE call dealloc_soil print *,' Check your input choice!!!' end if endif close(inunit) end subroutine readvalue !-------------------------------------------------------------------------- subroutine alloc_soil use data_soil_t use data_soil if (flag_trace) write (unit_trace, '(I4,I10,A)') iday, time_cur, ' alloc_soil' help=0 allocate(thick(nlay)) allocate(mid(nlay)) allocate(depth(nlay)) allocate(pv(nlay)) allocate(pv_v(nlay)) allocate(dens(nlay)) allocate(f_cap_v(nlay)) allocate(field_cap(nlay)) allocate(wilt_p(nlay)) allocate(wilt_p_v(nlay)) allocate(vol(nlay)) allocate(quarzv(nlay)) allocate(sandv(nlay)) allocate(BDopt(nlay)) allocate(clayv(nlay)) allocate(siltv(nlay)) allocate(humusv(nlay)) allocate(fcaph(nlay)) allocate(wiltph(nlay)) allocate(pvh(nlay)) allocate(dmass(nlay)) allocate(skelv(nlay)) allocate(skelfact(nlay)) allocate(spheat(nlay)) allocate(phv(nlay)) allocate(wlam(nlay)) allocate(wats(nlay)) allocate(watvol(nlay)) allocate(wat_res(nlay)) wat_res = 0. allocate(perc(nlay)) allocate(wupt_r(nlay)) allocate(wupt_ev(nlay)) allocate(s_drought(nlay)) allocate(root_fr(nlay)) !allocate(dp_rfr(nlay)) allocate(temps(nlay)) allocate (C_opm(nlay)) allocate (C_hum(nlay)) allocate (C_opmfrt(nlay)) allocate (C_opmcrt(nlay)) allocate (N_opm(nlay)) allocate (N_hum(nlay)) allocate (N_opmfrt(nlay)) allocate (N_opmcrt(nlay)) allocate (NH4(nlay)) allocate (NO3(nlay)) allocate (Nupt(nlay)) allocate (Nmin(nlay)) allocate (rmin_phv(nlay)) allocate (rnit_phv(nlay)) allocate (cnv_opm(nlay)) allocate (cnv_hum(nlay)) allocate(slit(nspecies)) allocate(slit_1(nspecies)) if (flag_bc .gt. 0) then allocate (C_bc(nlay)) allocate (N_bc(nlay)) C_bc = 0. N_bc = 0. endif do i=1,nspecies slit(i)%C_opm_frt = 0. slit(i)%N_opm_frt = 0. slit(i)%C_opm_crt = 0. slit(i)%N_opm_crt = 0. slit(i)%C_opm_tb = 0. slit(i)%N_opm_tb = 0. slit(i)%C_opm_stem = 0. slit(i)%N_opm_stem = 0. enddo nlay2 = nlay+2 mfirst = 1 allocate (sh(mfirst:nlay2)) allocate (sv(mfirst:nlay2)) allocate (sb(mfirst:nlay2)) allocate (sbt(mfirst:nlay2)) allocate (t_cb(mfirst:nlay2)) allocate (t_cond(mfirst:nlay2)) allocate (h_cap(mfirst:nlay2)) allocate (sxx(mfirst:nlay2)) allocate (svv(mfirst:nlay2)) allocate (svva(mfirst:nlay2)) allocate (soh(mfirst:nlay2)) allocate (son(mfirst:nlay2+1)) help=1 C_opm = 0 allocate(fr_loss(nlay)) allocate(redis(nlay)) end subroutine alloc_soil !------------------------------------------------------------------ subroutine stand_bal_ini use data_stand implicit none integer i allocate(diam_class(num_class, nspecies)); diam_class=0 allocate(diam_class_t(num_class, nspecies)); diam_class_t=0 allocate(diam_class_h(num_class,nspecies)); diam_class_h=0 allocate(diam_class_age(num_class,nspecies)); diam_class_age=0 allocate(diam_class_mvol(num_class,nspecies)); diam_class_mvol=0 allocate(diam_classm(num_class,nspecies)); diam_classm=0 allocate(diam_classm_h(num_class,nspecies)); diam_classm_h=0 allocate(height_class(num_class)); height_class =0 ! array of potential litter (dead stems and twigs/branches for the next years allocate(dead_wood(nspec_tree)) do i = 1,nspec_tree allocate(dead_wood(i)%C_tb(lit_year)) allocate(dead_wood(i)%N_tb(lit_year)) allocate(dead_wood(i)%C_stem(lit_year)) allocate(dead_wood(i)%N_stem(lit_year)) dead_wood(i)%C_tb = 0. dead_wood(i)%N_tb = 0. dead_wood(i)%C_stem = 0. dead_wood(i)%N_stem = 0. enddo end subroutine stand_bal_ini !-------------------------------------------------------------- subroutine control_file ! saving simulation parameter and start conditions for each site real buckdepth character(8) actdate character(10) acttime character(150) site_help integer help_ip, j TYPE(Coh_Obj), Pointer :: help_coh ! pointer to cohort list IF(site_nr==1) THEN help_ip=site_nr ELSE help_ip=ip END IF ! Write soil initialisation file if (flag_mult8910) then site_help = site_name1 else site_help = site_name(help_ip) endif if (.not.flag_mult8910 .or. (flag_mult8910 .and. anh .eq. "1") .or. (flag_mult8910 .and. time_out .gt. 0.)) then if (.not.flag_mult8910) then WRITE (unit_soil,'(26A)') 'Layer',' Depth(cm)',' F-cap(mm)',' F-cap(Vol%)',' Wiltp(mm)', & ' Wiltp(Vol%)',' Pore vol.',' Skel.(Vol%)',' Density',' Spheat',' pH',' Wlam', & ' Water(mm)',' Water(Vol%)',' Soil-temp.',' C_opm g/m2', & ' C_hum g/m2',' N_opm g/m2',' N_hum g/m2',' NH4 g/m2',' NO3 g/m2',' humus part',' d_mass g/m2', ' Clay',' Silt',' Sand' do i = 1,nlay WRITE (unit_soil,'(I5,2F10.2,3F12.2,F10.2,F12.2,4F8.2,F10.2,F12.2, 5F11.2,2F9.4,2E12.4, 3F6.1)') i,depth(i),field_cap(i),f_cap_v(i),wilt_p(i), & wilt_p_v(i),pv_v(i), skelv(i)*100., dens(i),spheat(i),phv(i),wlam(i), & wats(i),watvol(i),temps(i),c_opm(i),c_hum(i),n_opm(i), n_hum(i),nh4(i),no3(i),humusv(i),dmass(i), clayv(i)*100., siltv(i)*100., sandv(i)*100. end do endif ! Write control file call date_and_time(actdate, acttime) unit_ctr = getunit() open(unit_ctr,file=trim(dirout)//trim(site_help)//'.ctr'//anh,status='replace') WRITE(unit_ctr,'(2A)') '*** Site name: ',site_name(help_ip) WRITE(unit_ctr,'(2A)') ' Appendix ' ,anh WRITE(unit_ctr,'(A,F7.2)') ' Longitude: ', long WRITE(unit_ctr,'(A,F7.2)') ' Latitude: ', lat WRITE(unit_ctr,*) ' ' WRITE(unit_ctr,'(10A)') ' ---- Version: v2.2 ---- ' WRITE(unit_ctr,'(10A)') ' Date: ',actdate(7:8),'.',actdate(5:6),'.',actdate(1:4), & ' Time: ',acttime(1:2),':',acttime(3:4) WRITE(unit_ctr,'(A,A)') ' Simulation control file: ',trim(simfile) WRITE(unit_ctr,*) ' ' WRITE(unit_ctr,'(A)') '*** Data files:' IF(flag_clim==1)then WRITE(unit_ctr,'(A,A)') ' Climfile: ',trim(climfile(ip)) ELSE WRITE(unit_ctr,'(A,A)') ' Climfile: ',trim(climfile(1)) endif WRITE(unit_ctr,'(A,A)') ' Sitefile: ',trim(sitefile(help_ip)) WRITE(unit_ctr,'(A,A)') ' Start value file: ',trim(valfile(help_ip)) ! Initialization of stand IF( flag_multi==3 .OR. (site_nr>1 .AND. flag_stand>0) ) THEN WRITE(unit_ctr,'(A,A)') ' Stand initialization: ',trim(treefile(ip)) ELSE IF( ip==1 .AND. flag_stand>0) THEN WRITE(unit_ctr,'(A,A)') ' Stand initialization: ',trim(treefile(ip)) ELSE IF (flag_stand==0) THEN WRITE(unit_ctr,'(A,A)') ' Stand initialization: none' endif IF (lmulti) WRITE(unit_ctr,'(A,A)') ' Stand identificator: ', adjustl(standid(ip)) WRITE(unit_ctr,*) ' ' IF(flag_mg.ne.0 .and. flag_mg.ne.5) then WRITE(unit_ctr,'(A,A)') ' Management control file: ',trim(manfile(ip)) ELSE WRITE(unit_ctr,'(A)') ' Management: none' endif WRITE(unit_ctr,'(A,A)') ' Deposition file: ',trim(depofile(ip)) WRITE(unit_ctr,'(A,A)') ' N reduction file: ',trim(redfile(ip)) WRITE(unit_ctr,'(A,A)') ' Litter initialisation file: ',trim(litfile(ip)) if (flag_stat .gt. 0) WRITE(unit_ctr,'(A,A)') ' File with measurements: ',trim(mesfile(1)) WRITE(unit_ctr,*) ' ' WRITE(unit_ctr,'(A)') '*** Soil description ' WRITE(unit_ctr,'(A,I3)') ' Number of soil layers: ',nlay WRITE(unit_ctr,'(A,I3)') ' Number of rooting layers: ',nroot_max WRITE(unit_ctr,'(A,I3)') ' Ground water from layer: ',nlgrw WRITE(unit_ctr,'(A,F5.1)') ' Evaporation depth (cm): ',w_ev_d call bucket(bucks_100, bucks_root, buckdepth) buckdepth = buckdepth/100 WRITE(unit_ctr,'(A,F5.2,A,F7.2)') ' Bucket size (mm), ', buckdepth,' m depth: ',bucks_100 WRITE(unit_ctr,'(A,F7.2)') ' Bucket size (mm) of rooting zone: ',bucks_root WRITE(unit_ctr,*) ' ' WRITE(unit_ctr,'(A)') '*** Soil water conditions' WRITE(unit_ctr,'(12A)') 'Layer ','Depth(cm) ','F-cap(mm) ','F-cap(Vol%) ','Wiltp(mm) ', & 'Wiltp(Vol%) ','Pore vol. ','Density ','Spheat ','pH-value ',' Wlam',' skel. ' do i = 1,nlay WRITE(unit_ctr,'(I5,12F10.2)') i,depth(i),field_cap(i),f_cap_v(i),wilt_p(i), & wilt_p_v(i),pv_v(i),dens(i),spheat(i),phv(i),wlam(i),skelv(i) end do WRITE(unit_ctr,*) ' ' WRITE(unit_ctr,'(A)') '*** Soil initial values' WRITE(unit_ctr,'(9A)') 'Layer ','Water-cont. ','Soil-temp. ','C_opm ', & 'C_hum ','N_opm ','N_hum ','NH4-cont. ','NO3-cont ' do i=1,nlay WRITE(unit_ctr,'(I5, 2F10.2, 6F10.4)') i,wats(i),temps(i),c_opm(i),c_hum(i),n_opm(i), & n_hum(i),nh4(i),no3(i) end do WRITE(unit_ctr,*) ' ' WRITE(unit_ctr,'(A)') ' N_tot C_tot N_antot N_humtot C_humtot C_opm_fol C_opm_tb C_opm_frt C_opm_crt C_opm_stem ' WRITE(unit_ctr,'(10F12.4)') N_tot, C_tot, N_an_tot, N_hum_tot, C_hum_tot, C_opm_fol, C_opm_tb, C_opm_frt, C_opm_crt, C_opm_stem WRITE(unit_ctr,*) ' ' WRITE(unit_ctr,'(A)',advance='no') 'Mineralization constant of humus - humus layer (k_hum): ' WRITE(unit_ctr,'(F10.5)') k_hum WRITE(unit_ctr,'(A)',advance='no') 'Mineralization constant of humus - mineral soil (k_hum_r): ' WRITE(unit_ctr,'(F10.5)') k_hum_r WRITE(unit_ctr,'(A)',advance='no') 'Nitrification constant (k_nit): ' WRITE(unit_ctr,'(F10.5)') k_nit WRITE(unit_ctr,*) ' ' if (flag_bc .gt.0) then WRITE(unit_ctr,'(A)') '*** Biochar application ' WRITE(unit_ctr,'(A)') ' year C-content(%) C/N-ratio depth mass(kg/ha dry mass)' do j = 1, n_appl_bc WRITE(unit_ctr,'(I7,F14.1, F11.1, I7, F18.1)') & y_bc(j), cpart_bc(j), cnv_bc(j), bc_appl_lay(j), C_bc_appl(j) enddo WRITE(unit_ctr,'(F10.5)') endif WRITE(unit_ctr,*) ' ' WRITE(unit_ctr,'(A)') '*** Stand initialisation' WRITE(unit_ctr,'(A)')' Coh x_fol x_frt x_sap x_hrt x_Ahb height x_hbole x_age n sp DC DBH' help_coh => pt%first DO WHILE (ASSOCIATED(help_coh)) WRITE(unit_ctr,'(I5,5f12.5,2f10.0,i7,f7.0,i7, 2f12.5)') help_coh%coh%ident, help_coh%coh%x_fol, help_coh%coh%x_frt, help_coh%coh%x_sap, help_coh%coh%x_hrt, & help_coh%coh%x_Ahb, help_coh%coh%height, help_coh%coh%x_hbole, help_coh%coh%x_age, & help_coh%coh%nTreeA,help_coh%coh%species, help_coh%coh%dcrb, help_coh%coh%diam help_coh => help_coh%next END DO WRITE(unit_ctr,*) ' ' WRITE(unit_ctr,'(A)') '*** Simulation control' WRITE(unit_ctr,'(A66,I4)') 'Run option: ',flag_multi WRITE(unit_ctr,'(A66,I4)') 'Start year: ',time_b WRITE(unit_ctr,'(A66,I4)') 'Number of simulation years - year: ', year WRITE(unit_ctr,'(A60,F12.1)') 'Patch size [m²] - kpatchsize: ',kpatchsize WRITE(unit_ctr,'(A60,F12.1)') 'Thickness of leaf layers - dz: ',dz WRITE(unit_ctr,'(A66,I4)') 'Time step for photosynthesis calculations (days) - ns_pro: ',ns_pro WRITE(unit_ctr,'(A66,I4)') 'Mortality (0-OFF,1-ON stress, 2- ON stress+intr) - flag_mort: ',flag_mort WRITE(unit_ctr,'(A66,I4)') 'Regeneration (0-OFF,1-ON, 2-weekly growth of seedl.) - flag_reg: ',flag_reg WRITE(unit_ctr,'(A66,I4)') 'use FORSKA for regeneration (0-OFF,1-ON) - flag_forska: ',flag_lambda WRITE(unit_ctr,'(A66,I4)') 'Stand initialization (0-no,1-from *.ini,2-generate) - flag_stand: ',flag_stand WRITE(unit_ctr,'(A66,I4)') 'Ground vegetation initialization (0-no,1-generate) - flag_sveg: ',flag_sveg WRITE(unit_ctr,'(A66,I4)') 'Stand management (0-no,1-yes, 2 - seed once) - flag_mg: ',flag_mg WRITE(unit_ctr,'(A66,I4)') 'Disturbance (0-OFF, 1-ON ) - flag_dis: ',flag_dis WRITE(unit_ctr,'(A66,I4)') 'Light absoption algorithm (1,2,3,4) - : ',flag_light WRITE(unit_ctr,'(A66,I4)') 'Foliage-height relationship (0,1) - flag_folhei: ',flag_folhei WRITE(unit_ctr,'(A66,I4)') 'Volume function trunc (0,1) - flag_volfunc: ',flag_volfunc WRITE(unit_ctr,'(A66,I4)') 'Respiration model (0-0.5*NPP,1-organ specific) - flag_resp: ',flag_resp WRITE(unit_ctr,'(A66,I4)') 'Limitation (0-NO,1-water, 2-N, 3-water+N) - flag_limi: ',flag_limi WRITE(unit_ctr,'(A66,I4)') 'Flag for decomposition model - flag_decomp: ',flag_decomp WRITE(unit_ctr,'(A66,I4)') 'Root spec. activity (0-const,1-varying) - flag_sign: ',flag_sign WRITE(unit_ctr,'(A66,I4)') 'Water uptake function soil (1,2,3,4) - flag_wred: ',flag_wred WRITE(unit_ctr,'(A66,I4)') 'Root distribution - flag_wurz: ',flag_wurz WRITE(unit_ctr,'(A66,I4)') 'Heat conductance - flag_cond: ',flag_cond WRITE(unit_ctr,'(A66,I4)') 'Interception - flag_int: ',flag_int WRITE(unit_ctr,'(A66,I4)') 'Evapotranspiration - flag_eva: ',flag_eva WRITE(unit_ctr,'(A66,I4)') 'CO2 (0-constant,1-historic increase,2-step change)- flag_co2: ',flag_co2 WRITE(unit_ctr,'(A66,I4)') 'Sort flag - flag_sort: ',flag_sort WRITE(unit_ctr,'(A66,I4)') 'wpm flag - flag_wpm: ',flag_wpm WRITE(unit_ctr,'(A66,I4)') 'Analysis of measurements - flag_stat: ',flag_stat WRITE(unit_ctr,*) ' ' WRITE(unit_ctr,'(A66,A)') 'Species parameter file: ',trim(specfile(help_ip)) WRITE(unit_ctr,*) ' ' WRITE(unit_ctr,'(A)') '*** Species parameter description' WRITE(unit_ctr,'(A51,I4)') ' Species number: ', nspecies WRITE(unit_ctr,'(A51,I4)') ' Number of tree species: ', nspec_tree WRITE(unit_ctr,*) ' ********** ' WRITE(unit_ctr,'(A25,A9,2X,A30)') 'Short Name', ' Spec-Nr', 'Latin Name ' WRITE(unit_ctr,*) ' ' do i=1,nspecies WRITE(unit_ctr,'(A25,I9,2X,A30)') trim(spar(i)%species_short_name), i, spar(i)%species_name enddo WRITE(unit_ctr,*) ' ********** ' WRITE(unit_ctr,'(A51,15A16)') ' Species name: ', (trim(spar(i)%species_short_name),i=1,nspecies) WRITE(unit_ctr,1010) ' Maximal age - max_age: ', (spar(i)%max_age,i=1,nspecies) WRITE(unit_ctr,1010) ' Stress rec. time - yrec: ', (spar(i)%yrec,i=1,nspecies) WRITE(unit_ctr,1010) ' Shade tolerance - stol: ', (spar(i)%stol,i=1,nspecies) WRITE(unit_ctr,1000) ' Extinction coeff - pfext: ', (spar(i)%pfext,i=1,nspecies) WRITE(unit_ctr,1000) ' Root activity rate - sigman: ', (spar(i)%sigman,i=1,nspecies) WRITE(unit_ctr,1000) ' Respiration coeff - respcoeff: ', (spar(i)%respcoeff,i=1,nspecies) WRITE(unit_ctr,1000) ' Growth resp. par. - prg: ', (spar(i)%prg,i=1,nspecies) WRITE(unit_ctr,1000) ' Maint.resp.par./sapwood - prms: ', (spar(i)%prms,i=1,nspecies) WRITE(unit_ctr,1000) ' Maint.resp.par./fineroot - prmr: ', (spar(i)%prmr,i=1,nspecies) WRITE(unit_ctr,1000) ' Senesc.par. foliage - psf: ', (spar(i)%psf,i=1,nspecies) WRITE(unit_ctr,1000) ' Senesc.par. sapwood - pss: ', (spar(i)%pss,i=1,nspecies) WRITE(unit_ctr,1000) ' Senesc.par. fineroot - psr: ', (spar(i)%psr,i=1,nspecies) WRITE(unit_ctr,1000) ' N/C ratio of biomass - pcnr: ', (spar(i)%pcnr,i=1,nspecies) WRITE(unit_ctr,1000) ' N concentration of foliage - ncon_fol: ', (spar(i)%ncon_fol,i=1,nspecies) WRITE(unit_ctr,1000) ' N concentration of fine roots - ncon_frt: ', (spar(i)%ncon_frt,i=1,nspecies) WRITE(unit_ctr,1000) ' N concentration of coarse roots - ncon_crt: ', (spar(i)%ncon_crt,i=1,nspecies) WRITE(unit_ctr,1000) ' N concentration of twigs and branches - ncon_tbc: ', (spar(i)%ncon_tbc,i=1,nspecies) WRITE(unit_ctr,1000) ' N concentration of stemwood - ncon_stem: ', (spar(i)%ncon_stem,i=1,nspecies) WRITE(unit_ctr,1000) ' Reallocation parameter of foliage - reallo_fol: ', (spar(i)%reallo_fol,i=1,nspecies) WRITE(unit_ctr,1000) ' Reallocation parameter of fine root - reallo_frt: ', (spar(i)%reallo_frt,i=1,nspecies) WRITE(unit_ctr,1000) ' Ratio of coarse wood - alphac: ', (spar(i)%alphac,i=1,nspecies) WRITE(unit_ctr,1000) ' Coarse root fraction of coarse wood - cr_frac: ', (spar(i)%cr_frac,i=1,nspecies) WRITE(unit_ctr,1000) ' Sapwood density - prhos: ', (spar(i)%prhos,i=1,nspecies) WRITE(unit_ctr,1000) ' Proport.const.(pipe mod.) - pnus: ', (spar(i)%pnus,i=1,nspecies) IF(flag_folhei==0) THEN WRITE(unit_ctr,1000) ' Height growth parameter - pha: ', (spar(i)%pha,i=1,nspecies) ELSEIF(flag_folhei==1) THEN WRITE(unit_ctr,1000) ' Height growth par. 1 - pha_v1: ', (spar(i)%pha_v1,i=1,nspecies) WRITE(unit_ctr,1000) ' Height growth par. 2 - pha_v2: ', (spar(i)%pha_v2,i=1,nspecies) WRITE(unit_ctr,1000) ' Height growth par. 3 - pha_v3: ', (spar(i)%pha_v3,i=1,nspecies) ELSE WRITE(unit_ctr,'(A51,I3)') ' non valid flag value - flag_folhei : ',flag_folhei ENDIF WRITE(unit_ctr,1000) ' Height growth parameter coeff 1 - pha_coeff1: ', (spar(i)%pha_coeff1,i=1,nspecies) WRITE(unit_ctr,1000) ' Height growth parameter coeff 2 - pha_coeff2: ', (spar(i)%pha_coeff2,i=1,nspecies) WRITE(unit_ctr,1000) ' Crown radius - DBH ratio parameter a - crown_a: ', (spar(i)%crown_a,i=1,nspecies) WRITE(unit_ctr,1000) ' Crown radius - DBH ratio parameter b - crown_b: ', (spar(i)%crown_b,i=1,nspecies) WRITE(unit_ctr,1000) ' Crown radius - DBH ratio parameter c - crown_c: ', (spar(i)%crown_c,i=1,nspecies) WRITE(unit_ctr,1000) ' Minimum specific leaf area - psla_min: ', (spar(i)%psla_min,i=1,nspecies) WRITE(unit_ctr,1000) ' Light dep. specific leaf area - psla_a: ', (spar(i)%psla_a,i=1,nspecies) WRITE(unit_ctr,1000) ' Efficiency parameter - phic: ', (spar(i)%phic,i=1,nspecies) WRITE(unit_ctr,1000) ' N content - pnc: ', (spar(i)%pnc,i=1,nspecies) WRITE(unit_ctr,1000) ' kco2_25: ', (spar(i)%kCO2_25,i=1,nspecies) WRITE(unit_ctr,1000) ' ko2_25: ', (spar(i)%kO2_25,i=1,nspecies) WRITE(unit_ctr,1000) ' CO2/O2 specif. value - pc_25: ', (spar(i)%pc_25,i=1,nspecies) WRITE(unit_ctr,1000) ' Q10_kco2: ', (spar(i)%q10_kCO2,i=1,nspecies) WRITE(unit_ctr,1000) ' Q10_ko2: ', (spar(i)%q10_kO2,i=1,nspecies) WRITE(unit_ctr,1000) ' Q10_pc: ', (spar(i)%q10_pc,i=1,nspecies) WRITE(unit_ctr,1000) ' Rd to Vm ratio - pb: ', (spar(i)%pb,i=1,nspecies) WRITE(unit_ctr,1000) ' PIM: Inhibitor min temp. - PItmin: ', (spar(i)%PItmin,i=1,nspecies) WRITE(unit_ctr,1000) ' PIM: Inhibitor opt temp. - PItopt: ', (spar(i)%PItopt,i=1,nspecies) WRITE(unit_ctr,1000) ' PIM: Inhibitor max temp. - PItmax: ', (spar(i)%PItmax,i=1,nspecies) WRITE(unit_ctr,1000) ' PIM: Inhibitor scaling factor - PIa: ', (spar(i)%PIa,i=1,nspecies) WRITE(unit_ctr,1000) ' PIM: Promotor min temp. - PPtmin: ', (spar(i)%PPtmin,i=1,nspecies) WRITE(unit_ctr,1000) ' PIM: Promotor opt temp. - PPtopt: ', (spar(i)%PPtopt,i=1,nspecies) WRITE(unit_ctr,1000) ' PIM: Promotor max temp. - PPtmax: ', (spar(i)%PPtmax,i=1,nspecies) WRITE(unit_ctr,1000) ' PIM: Promotor scaling factor - PPa: ', (spar(i)%PPa,i=1,nspecies) WRITE(unit_ctr,1000) ' PIM: Promotor scaling factor - PPb: ', (spar(i)%PPb,i=1,nspecies) WRITE(unit_ctr,1000) ' CSM: chilling base temp. - CSTbC: ', (spar(i)%CSTbC,i=1,nspecies) WRITE(unit_ctr,1000) ' CSM: base temp. - CSTbT: ', (spar(i)%CSTbT,i=1,nspecies) WRITE(unit_ctr,1000) ' CSM: scaling factor - CSa: ', (spar(i)%CSa,i=1,nspecies) WRITE(unit_ctr,1000) ' CSM: scaling factor - CSb: ', (spar(i)%CSb,i=1,nspecies) WRITE(unit_ctr,1000) ' TSM: base temp. - LTbT: ', (spar(i)%LTbT,i=1,nspecies) WRITE(unit_ctr,1000) ' TSM: critical temperature sum - LTcrit: ', (spar(i)%LTcrit,i=1,nspecies) WRITE(unit_ctr,1010) ' TSM: start day after 1.11. - Lstart: ', (spar(i)%Lstart,i=1,nspecies) WRITE(unit_ctr,1000) ' usefd pheno model - Phmodel: ', (spar(i)%Phmodel,i=1,nspecies) WRITE(unit_ctr,1000) ' End day for phenology - end_bb: ', (spar(i)%end_bb,i=1,nspecies) WRITE(unit_ctr,1000) ' Fpar_mod - fpar_mod: ', (spar(i)%fpar_mod,i=1,nspecies) WRITE(unit_ctr,1000) ' Intercep.cap. - ceppot_spec: ', (spar(i)%ceppot_spec,i=1,nspecies) WRITE(unit_ctr,1000) ' photosynthesis response to N-limitation - Nresp: ', (spar(i)%Nresp,i=1,nspecies) WRITE(unit_ctr,1000) ' Regeneration flag - regflag: ', (spar(i)%regflag,i=1,nspecies) WRITE(unit_ctr,1000) ' Seedrate: ', (spar(i)%seedrate,i=1,nspecies) WRITE(unit_ctr,1000) ' Seedmass: ', (spar(i)%seedmass,i=1,nspecies) WRITE(unit_ctr,1000) ' Standard dev. of seedrate - seedsd: ', (spar(i)%seedsd,i=1,nspecies) WRITE(unit_ctr,1000) ' all. parameter - seeda: ', (spar(i)%seeda,i=1,nspecies) WRITE(unit_ctr,1000) ' all. parameter - seedb: ', (spar(i)%seedb,i=1,nspecies) WRITE(unit_ctr,1000) ' all. parameter - pheight1: ', (spar(i)%pheight1,i=1,nspecies) WRITE(unit_ctr,1000) ' all. parameter - pheight2: ', (spar(i)%pheight2,i=1,nspecies) WRITE(unit_ctr,1000) ' all. parameter - pheight3: ', (spar(i)%pheight3,i=1,nspecies) WRITE(unit_ctr,1000) ' all. parameter - pdiam1: ', (spar(i)%pdiam1,i=1,nspecies) WRITE(unit_ctr,1000) ' all. parameter - pdiam2: ', (spar(i)%pdiam2,i=1,nspecies) WRITE(unit_ctr,1000) ' all. parameter - pdiam3: ', (spar(i)%pdiam3,i=1,nspecies) WRITE(unit_ctr,1000) ' decomp. parameter foliage - k_opm_fol: ', (spar(i)%k_opm_fol,i=1,nspecies) WRITE(unit_ctr,1000) ' synth. parameter foliage - k_syn_fol: ', (spar(i)%k_syn_fol,i=1,nspecies) WRITE(unit_ctr,1000) ' decomp. parameter fine roots - k_opm_frt: ', (spar(i)%k_opm_frt,i=1,nspecies) WRITE(unit_ctr,1000) ' synth. parameter fine roots - k_syn_frt: ', (spar(i)%k_syn_frt,i=1,nspecies) WRITE(unit_ctr,1000) ' decomp. parameter coarse roots - k_opm_crt: ', (spar(i)%k_opm_crt,i=1,nspecies) WRITE(unit_ctr,1000) ' synth. parameter coarse roots - k_syn_crt: ', (spar(i)%k_syn_crt,i=1,nspecies) WRITE(unit_ctr,1000) ' decomp. parameter twigs/branches - k_opm_tb: ', (spar(i)%k_opm_tb,i=1,nspecies) WRITE(unit_ctr,1000) ' synth. parameter twigs/branches - k_syn_tb: ', (spar(i)%k_syn_tb,i=1,nspecies) WRITE(unit_ctr,1000) ' decomp. parameter stem - k_opm_stem: ', (spar(i)%k_opm_stem,i=1,nspecies) WRITE(unit_ctr,1000) ' synth. parameter dtem - k_syn_stem: ', (spar(i)%k_syn_stem,i=1,nspecies) WRITE(unit_ctr,1000) WRITE(unit_ctr,1000) ' spec_rl: ', (spar(i)%spec_rl,i=1,nspecies) WRITE(unit_ctr,1000) ' tbase: ', (spar(i)%tbase,i=1,nspecies) WRITE(unit_ctr,1000) ' topt: ', (spar(i)%topt,i=1,nspecies) WRITE(unit_ctr,1000) ' bdmax_coef: ', (spar(i)%bdmax_coef,i=1,nspecies) WRITE(unit_ctr,1000) ' porcrit_coef: ', (spar(i)%porcrit_coef,i=1,nspecies) WRITE(unit_ctr,1000) ' ph_opt_max: ', (spar(i)%ph_opt_max,i=1,nspecies) WRITE(unit_ctr,1000) ' ph_opt_min: ', (spar(i)%ph_opt_min,i=1,nspecies) WRITE(unit_ctr,1000) ' ph_max: ', (spar(i)%ph_max,i=1,nspecies) WRITE(unit_ctr,1000) ' ph_min : ', (spar(i)%ph_min ,i=1,nspecies) WRITE(unit_ctr,1000) ' v_growth: ', (spar(i)%v_growth,i=1,nspecies) WRITE(unit_ctr,1000) WRITE(unit_ctr,1000) ' C/N ratio of foliage - cnr_fol: ', (spar(i)%cnr_fol,i=1,nspecies) WRITE(unit_ctr,1000) ' C/N ratio of fine roots - cnr_frt: ', (spar(i)%cnr_frt,i=1,nspecies) WRITE(unit_ctr,1000) ' C/N ratio of coarse roots - cnr_crt: ', (spar(i)%cnr_crt,i=1,nspecies) WRITE(unit_ctr,1000) ' C/N ratio of twigs and branches - cnr_tbc: ', (spar(i)%cnr_tbc,i=1,nspecies) WRITE(unit_ctr,1000) ' C/N ratio of stemwood - cnr_stem: ', (spar(i)%cnr_stem,i=1,nspecies) WRITE(unit_ctr,1000) WRITE(unit_ctr,1000) ' Reduction factor - RedN: ', (svar(i)%RedN, i=1,nspecies) WRITE(unit_ctr,*) ' ' WRITE(unit_ctr,'(A)') '****** Model parameter ******' WRITE(unit_ctr,1020) 'Optimum ratio of ci to ca [-] - Lambda: ',lambda WRITE(unit_ctr,1020) 'Molar mass of carbon [g/mol] - Cmass: ',Cmass WRITE(unit_ctr,1020) 'Minimum conductance [mol/(m2*d)] - gmin: ',gmin WRITE(unit_ctr,1020) 'Shape of PS response curve - ps: ',ps WRITE(unit_ctr,1020) 'Slope of N function at 20 °C [g(N) (mymol s-1)-1] - pn: ',pn WRITE(unit_ctr,1020) 'Minimum N content [g/g] - nc0: ',nc0 WRITE(unit_ctr,1020) 'C3 quantum efficiency - qco2: ',qco2 WRITE(unit_ctr,1020) 'Scaling parameter - qco2a: ',qco2a WRITE(unit_ctr,1020) 'Partial pressure of oxygen (kPa) - o2: ',o2 WRITE(unit_ctr,1020) 'Atmospheric CO2 content (mol/mol) - co2: ',co2_st WRITE(unit_ctr,1020) 'Albedo of the canopy - pfref: ',pfref WRITE(unit_ctr,1020) 'Part of C in biomass [-] - cpart: ',cpart WRITE(unit_ctr,1020) 'Ratio of molecular weights of water and air - rmolw: ',rmolw WRITE(unit_ctr,1020) 'Universal gas constant [J/mol/K] = [Pa/m3/K] - R_gas: ',R_gas WRITE(unit_ctr,1020) 'von Karman''s constant [-] - c_karman: ',c_karman WRITE(unit_ctr,1020) 'Specific heat of air at const. pressure [J/g/K] - c_air: ',c_air WRITE(unit_ctr,1020) 'Psychrometer constant [hPa/K] - psycro: ',psycro WRITE(unit_ctr,1020) 'Breast height for inventory measurements [cm] - h_breast: ',h_breast WRITE(unit_ctr,1020) 'Height for sapling allometry - h_sapini: ',h_sapini WRITE(unit_ctr,1020) 'Min. diff. b. height of crown base and breast height- h_bo_br_diff: ',h_bo_br_diff WRITE(unit_ctr,1020) 'Parameter variable for calculation of CO2 scenario - p1_co2: ',p1_co2 WRITE(unit_ctr,1020) 'Parameter variable for calculation of CO2 scenario - p2_co2: ',p2_co2 WRITE(unit_ctr,1020) 'Parameter variable for calculation of CO2 scenario - p3_co2: ',p3_co2 WRITE(unit_ctr,1020) 'Parameter variable for calculation of CO2 scenario - p4_co2: ',p4_co2 WRITE(unit_ctr,1020) 'Parameter variable for calculation of CO2 scenario - p5_co2: ',p5_co2 WRITE(unit_ctr,1020) 'Parameter variable for calculation of historical CO2 scenario - p1_co2h: ',p1_co2h WRITE(unit_ctr,1020) 'Parameter variable for calculation of historical CO2 scenario - p2_co2h: ',p2_co2h WRITE(unit_ctr,1020) 'Parameter variable for calculation of historical CO2 scenario - p3_co2h: ',p3_co2h WRITE(unit_ctr,1020) 'Parameter variable for calculation of historical CO2 scenario - p4_co2h: ',p4_co2h WRITE(unit_ctr,1020) 'Threshold of air temperature for snow accumulation [°C] - temp_snow: ',temp_snow WRITE(unit_ctr,1020) 'Parameter for calculation of transpiration demand - alfm: ',alfm WRITE(unit_ctr,1020) 'Parameter for calculation of transpiration demand [mol/(m2*d)] - gpmax: ',gpmax WRITE(unit_ctr,1020) 'Parameter for growing degree day calculation - thr_gdd: ',thr_gdd IF (flag_multi==2) THEN WRITE(unit_ctr,*) ' ' WRITE(unit_ctr,*) 'runs with climate scenarios produced by adding summands to every daily temperature' WRITE(unit_ctr,*) 'and modifying every single precipitation value by a multiplicand' WRITE(unit_ctr,*) 'run ident deltaT delta P factor' ENDIF ! mangament parameter adaptation management IF (flag_mg.eq.2. .and. flag_reg .eq. 0) then WRITE(unit_ctr,*) ' ' WRITE(unit_ctr,*) '***Managment parameter case flag_mg = 2 (user specified) ***' WRITE(unit_ctr,'(A35,4F15.5)') 'height for management control(cm)', ho1,ho2,ho3,ho4 WRITE(unit_ctr,'(A35,5I15)') 'management flags thr1-thr5' , thr1,thr2, thr3,thr4,thr5 WRITE(unit_ctr,'(A35,F15.5)') 'height for directional felling', thr6 WRITE(unit_ctr,'(A35,I15)') 'measure at rotation', thr7 WRITE(unit_ctr,'(A35,I15)') 'regeneration measure', mgreg WRITE(unit_ctr,'(A35,F15.5)') 'lower/upper limit of height(cm)', limit WRITE(unit_ctr,'(A35,I15)') 'number of years between thinning',thinstep WRITE(unit_ctr,'(A35,F15.5)') 'rel. value for directional felling', direcfel WRITE(unit_ctr,'(A35,5F15.5)')'number of Zielbaeume(spec.)', (zbnr(i),i=1,nspec_tree) WRITE(unit_ctr,'(A35,5F15.5)')'rel. value for tending of pl.',(tend(i), i =1,nspec_tree) WRITE(unit_ctr,'(A35,5I15)')'rotation ',(rot(i), i =1,nspec_tree) WRITE(unit_ctr,'(A35,5I15)')'age of nat./pl. regeneration',(regage(i), i =1,nspec_tree) end IF IF (flag_multi .ne. 2.and. flag_mg.ne.2 .and. flag_reg .eq.0) close(unit_ctr) endif ! flag_mult8910 1000 FORMAT (A51,15 F16.5) 1010 FORMAT (A51,15 I16) 1020 FORMAT(A70,F15.5) end subroutine control_file end subroutine prepare_site !****************************************************************************** SUBROUTINE readbudb use data_simul use data_species use data_stand implicit none DO ns=1,nspecies IF(spar(ns)%phmodel==4) THEN WRITE(*,*) 'Please type the day of budburst for 4C species number ',ns,':' READ(*,*) svar(ns)%ext_daybb ENDIF ENDDO END subroutine readbudb !****************************************************************************** SUBROUTINE readdepo use data_climate use data_depo use data_out use data_simul use data_site implicit none character text integer hx, unit_dep, i,j,ios, ii !integer realrec integer id,im,iy,itz1, itz2, hyear1, hyear2, hyear3, hy logical ex real hNO, hNH if (flag_trace) write (unit_trace, '(I4,I10,A)') iday, time_cur, ' readdepo' if (.not.allocated(NOd)) allocate (NOd (1:366,1:year)) if (.not.allocated(NHd)) allocate (NHd (1:366, 1:year)) ! for areal usage standard/constant deposition is set as concentration: if (flag_multi .eq. 8 .or. flag_mult910) then flag_depo = 2 NOd = NOdep(ip) ! concentration mg/l NHd = NHdep(ip) ! concentration mg/l return endif NOd = 0. NHd = 0. if (.not.flag_mult8910) print * inquire (File = depofile(ip), exist = ex) ! test whether file exists IF(ex .eqv. .false.) then if (.not.flag_mult8910) then hx = 0 print *,' >>>FORESEE message: Cannot find deposition data - all data set to zero!' CALL error_mess(hx,'Cannot find deposition data - all data set to ',REAL(hx)) endif else if (.not.flag_mult8910) print *, ' >>>FORESEE message: Now reading DEPOSITION data from file, please wait...' ! now read data from file unit_dep = getunit() OPEN (unit_dep,FILE=depofile(ip),IOSTAT=ios,STATUS='OLD',ACTION='READ') flag_depo = 1 read(unit_dep,*) text select case (text) case ('C', 'c') ! concentrations mg/l flag_depo = 2 read(unit_dep,*) text case ('Y', 'y') ! Yearly constant deposition mg/m2 flag_depo = 3 read(unit_dep,*) text case ('A', 'a') ! Annual sum of deposition g/m2 flag_depo = 4 read(unit_dep,*) text end select do IF (text .ne. '!') then backspace(unit_dep) exit endif read(unit_dep,*) text enddo ! assignment of dates ! fill in missing values with current values until current date ! fill in missing values at the end hyear1 = 0 hyear2 = 0 hyear3 = 1 itz1 = 1 itz2 = 1 select case (flag_depo) case(4) do while ((ios .eq. 0) .and. (hyear1 .lt. year)) read(unit_dep,*,iostat=ios) iy, hNO, hNH if (ios .eq.0) then if (iy .gt. time_b+year) then hyear1 = year else hyear1 = iy - time_b + 1 endif if ((hyear1 .le. year) .and. (hyear1 .gt. 0)) then ! save from simulation start year onwards do i = 1,366 NOd(i,hyear1) = hNO * 1000./366. ! report of year [g/m2] in daily values [mg/m2] NHd(i,hyear1) = hNH * 1000./366. enddo hy = hyear1-1 do while ((hy .gt. hyear2) .and. (hy .gt. 0)) do i = 366, 1, -1 NOd(i,hy) = hNO * 1000./366. NHd(i,hy) = hNH * 1000./366. enddo hy = hy - 1 enddo hyear2 = hyear1 endif ! 0 < hyear1 < year else ! ios .ne. 0 if (hyear1 .le. 0) then hyear1 = 1 hyear2 = 1 endif continue endif ! ios = 0 enddo case default do while ((ios .eq. 0) .and. (hyear1 .lt. year)) read(unit_dep,*,iostat=ios) id,im,iy, hNO, hNH if (ios .eq.0) then call daintz(id,im,iy,itz1) if (iy .gt. time_b+year) then hyear1 = year else hyear1 = iy - time_b + 1 endif if ((hyear1 .le. year) .and. (hyear1 .gt. 0)) then ! save from simulation start year onwards NOd(itz1,hyear1) = hNO NHd(itz1,hyear1) = hNH select case (flag_depo) case(1,2) if (hyear1 .eq. hyear3) then if (itz1 .gt. 1) then do i = itz1-1, itz2, -1 NOd(i,hyear1) = hNO NHd(i,hyear1) = hNH enddo endif else if (itz2 .lt. recs(hyear3)) then do i = itz2+1, recs(hyear3) NOd(i,hyear3) = hNO NHd(i,hyear3) = hNH enddo endif itz2 = 1 if (itz1 .gt. 1) then do i = itz1-1, itz2, -1 NOd(i,hyear1) = hNO NHd(i,hyear1) = hNH enddo endif hy = hyear1-1 do while ((hy .gt. hyear3) .and. (hy .gt. 0)) do i = 366, 1, -1 NOd(i,hy) = hNO NHd(i,hy) = hNH enddo hy = hy - 1 enddo endif ! hyear1 .eq. hyear3 hyear3 = hyear1 itz2 = itz1 hyear2 = hyear3 case(3) ! fill in of constant year values do i = 1,366 NOd(i,hyear1) = hNO NHd(i,hyear1) = hNH enddo hy = hyear1-1 do while ((hy .gt. hyear2) .and. (hy .gt. 0)) do i = 366, 1, -1 NOd(i,hy) = hNO NHd(i,hy) = hNH enddo hy = hy - 1 enddo hyear2 = hyear1 itz2 = 366 end select ! flag_depo 1-3 endif ! 0 < hyear1 < year else ! ios .ne. 0 if (hyear1 .le. 0) then hyear1 = 1 hyear2 = 1 endif continue endif ! ios = 0 enddo end select ! flag_depo ! fill in of the missing data at the end select case (flag_depo) case (3) if (hyear1 .lt. year) then hy = hyear1+1 do while (hy .le. year) do i = 366, 1, -1 NOd(i,hy) = hNO NHd(i,hy) = hNH enddo hy = hy + 1 enddo else ! if date is outside the simulation period, it will be completly filled in do j = 1, year do i = 1, 366 NOd(i,j) = hNO NHd(i,j) = hNH enddo enddo endif case default if (hyear2 .le. year) then if (itz2 .lt. recs(hyear2)) then if (.not.flag_mult8910) then hx = iy CALL error_mess(hx,' Not enough data records in deposition file, iostat = ',REAL(ios)) WRITE (unit_err,*) ' >>>FORESEE message: Fill next values with same data ' WRITE (unit_err,'(A,2I4,A,2I4)')' from internal simulation time', itz2, hyear2, ' to', recs(hyear2), year endif do j = hyear2, year ii = 1 if (j .eq. hyear2) ii = itz2 do i = ii, 366 NOd(i,j) = hNO NHd(i,j) = hNH enddo enddo else hy = hyear2+1 do while (hy .le. year) do i = 366, 1, -1 NOd(i,hy) = hNO NHd(i,hy) = hNH enddo hy = hy + 1 enddo endif else ! if date is outside the simulation period, it will be completly filled in do j = 1, year do i = 1, 366 NOd(i,j) = hNO NHd(i,j) = hNH enddo enddo endif end select close (unit_dep) endif write (*,*) END subroutine readdepo !****************************************************************************** SUBROUTINE readredN use data_out use data_site use data_species use data_stand use data_simul implicit none character text integer hx, unit_red, i,ios logical ex if (.not.flag_mult8910) print * if (flag_multi .lt. 8) then inquire (File = "./input/.", exist = ex) ! test whether file exists inquire (File = redfile(ip), exist = ex) ! test whether file exists IF(ex .eqv. .false.) then print *,' >>>FORESEE message: Cannot find data of RedN - internal calculation' hx = 0 CALL error_mess(hx,'Cannot find data of RedN - internal calculation ',REAL(hx)) else print *, ' >>>FORESEE message: Now reading RedN data from file, please wait...' unit_red = getunit() OPEN (unit_red,FILE=redfile(ip),IOSTAT=ios,STATUS='OLD',ACTION='READ') DO READ(unit_red,*) text IF (text .ne. '!') THEN backspace(unit_red) EXIT ENDIF ENDDO read (unit_red,*,iostat=ios) (svar(i)%RedN, i=1,nspecies) close (unit_red) endif ! ex else do i = 1, nspecies svar(i)%RedN = RedN_list(i, ip) enddo endif ! flag_multi IF(flag_limi==0 .OR. flag_limi==1) THEN DO i=1,nspecies svar(i)%RedN = 1. ENDDO ENDIF do i = 1,nspecies if (svar(i)%RedN .lt. 0) then ! no values; internal calculation if (flag_multi .lt. 8) then print *,' >>>FORESEE message: Cannot find data of RedN - internal calculation for', spar(i)%species_short_name write (unit_err, '(A,I3,1X,A)') 'Cannot find data of RedN - internal calculation for species ',i, spar(i)%species_short_name endif flag_redn = .TRUE. endif enddo if (.not.flag_mult8910) write (*,*) END subroutine readredN !****************************************************************************** SUBROUTINE readlit !use data_climate use data_out use data_soil_cn use data_species use data_stand use data_simul implicit none character text integer unit_lit, i,ios integer nspec_lit logical ex real help, hx real, dimension(22) :: helpin flag_lit = 0 if (flag_mult8910) then inquire (File = litfile(1), exist = ex) ! test whether file exists else print * inquire (File = litfile(ip), exist = ex) ! test whether file exists endif IF(ex .eqv. .false.) then if (.not.flag_mult8910) then print *,' >>>FORESEE message: Cannot find data of litter initialisation - internal calculation' hx = 0. write (unit_err,*) write (unit_err,*) 'Cannot find data of litter initialisation - internal calculation ' endif else if (.not.flag_mult8910) print *, ' >>>FORESEE message: Now reading litter initialisation data from file, please wait...' ! now read data from file unit_lit = getunit() OPEN (unit_lit,FILE=litfile(ip),IOSTAT=ios,STATUS='OLD',ACTION='READ') do read(unit_lit,*) text IF (text .ne. '!') then backspace(unit_lit) exit endif enddo helpin = 0. slit%C_opm_fol = 0. read (unit_lit,*) nspec_lit read (unit_lit,*,iostat=ios) text, (slit(i)%C_opm_fol, i=1,nspec_lit) read (unit_lit,*,iostat=ios) text, (slit(i)%C_opm_tb , i=1,nspec_lit) read (unit_lit,*,iostat=ios) text, (slit(i)%C_opm_frt(1), i=1,nspec_lit) read (unit_lit,*,iostat=ios) text, (slit(i)%C_opm_crt(1), i=1,nspec_lit) read (unit_lit,*,iostat=ios) text, (slit(i)%C_opm_stem,i=1,nspec_lit) flag_lit = 1 help = 0. hx = 1. do i=1,nspecies if (slit(i)%C_opm_fol .gt. 0) then totfol_lit = totfol_lit + slit(i)%C_opm_fol totfrt_lit = totfrt_lit + slit(i)%C_opm_frt(1) tottb_lit = tottb_lit + slit(i)%C_opm_tb totcrt_lit = totcrt_lit + slit(i)%C_opm_crt(1) totstem_lit = totstem_lit + slit(i)%C_opm_stem else hx = -1. endif enddo help = totfol_lit if ((help .gt. 0.) .or. (hx .gt. 0) .and. .not.flag_mult8910) then CALL error_mess(0,'Using data of litter initialisation from file '//trim(litfile(ip)), hx) else ! no values; internal calculation of litter initialisation if (.not.flag_mult8910) then print *,' >>>FORESEE message: No data of litter initialisation - internal calculation' hx = 0. CALL error_mess(0,'No data of litter initialisation - internal calculation ', hx) endif flag_lit = 0 endif close (unit_lit) endif ! ex if (.not.flag_mult8910) write (*,*) END subroutine readlit !****************************************************************************** subroutine prepare_climate ! read climate file use data_climate use data_out use data_simul use data_stand implicit none type clifile ! new data type for all climate parameters integer :: day,mon,ye real :: m1, m2, m3, m4, m5, m6, m7, m8, m9, m10, m11 end type clifile type (clifile), allocatable,dimension(:,:) :: climall !variable for data type climfile character(1) c character :: text integer :: i,j,ios, unit_cli integer :: realrec = 0 integer :: repflag = 0 logical :: ex if (.not.flag_mult8910) then print *, ' ' print *, ' Input of climate data: ' endif call testfile(climfile(ip),ex) !input filename, test whether file exists IF(ex .eqv. .false.) then print *,' >>>FORESEE message: Cannot find climate data - program STOP!' stop endif if (.not.flag_mult8910) print *, ' >>>FORESEE message: Now reading CLIMATE data from file, please wait...' !now read data from file unit_cli = getunit() OPEN (unit_cli,FILE=climfile(ip),IOSTAT=ios,STATUS='OLD',ACTION='READ') allocate (recs (1:year)) allocate (dd (1:366,1:year));allocate (mm (1:366, 1:year)) allocate (yy (1:year));allocate (tp (-2:366,1:year)) allocate (hm (0:366,1:year));allocate (prc (0:366,1:year)) allocate (prs (0:366,1:year));allocate (rd (0:366,1:year)) allocate (tn (0:366,1:year)) allocate (tx (0:366,1:year)) allocate (vp (0:366,1:year)) allocate (sdu (0:366,1:year)) allocate (wd (0:366,1:year)) allocate (sde (0:366,1:year)) allocate (bw (0:366,1:year)) dd = -99.9 mm = -99.9 yy = -99.9 tn = -99.9 tx = -99.9 wd = -99.9 ! wind initialisation IF (index(climfile(ip),'.cli') .ne. 0) then flag_climtyp = 1 do read(unit_cli,*) text IF (text .ne. '!') then IF (text .eq. 'N') then flag_climtyp = 2 else IF(text.eq.'T') then flag_climtyp = 3 else backspace(unit_cli) exit endif endif enddo else if (index(climfile(ip),'.txt') .ne. 0) then flag_climtyp = 4 else flag_climtyp = 5 end IF call read_cli close(unit_cli) if (flag_end .gt. 0) return IF (realrec < year .and. repflag == 0) then year = realrec else IF (repflag == 1) then call climfill end IF end IF med_rad1 = 0. do j = 1, year-1 tp(0,j+1) = tp(recs(j),j) tp(-1,j+1)= tp(recs(j)-1,j) tp(-2,j+1)= tp(recs(j)-2,j) hm(0,j+1) = hm(recs(j),j);prc(0,j+1) = prc(recs(j),j);prs(0,j+1) = prs(recs(j),j) rd(0,j+1) = rd(recs(j),j) wd(0,j+1) = wd(recs(j),j) bw(0,j+1) = bw(recs(j),j) vp(0,j+1) = vp(recs(j),j) sdu(0,j+1) = sdu(recs(j),j) sde(0,j+1) = sde(recs(j),j) tx(0,j+1) = tx(recs(j),j) tn(0,j+1) = tn(recs(j),j) if( yy(j) .eq.time_b) then do i=1, recs(j) med_rad1 = med_rad1 + rd(i, j) end do med_rad1 = med_rad1/recs(1) end if end do tp(-2,1) = tp(1,1); tp(-1,1) = tp(1,1); tp(0,1) = tp(1,1) hm(0,1) = hm(1,1);prc(0,1) = prc(1,1);prs(0,1) = prs(1,1) rd(0,1) = rd(1,1) wd(0,1)=wd(1,1) vp(0,1) = vp(1,1) bw(0,1) = bw(1,1) tn(0,1) = tn(1,1) tx(0,1) = tx(1,1) sdu(0,1) =sdu(1,1) sde(0,1) = sde(1,1) contains !-------------------------------------------------------------- subroutine read_dwd character(3) text integer help, help1, help2, help3 allocate (climall (0:366,1:year)) j=1 c = 'n' do IF (j > year) then realrec = year exit end IF if (.not.flag_mult8910) print *, 'Year ',j read(unit_cli,*) text if(text.ne.'ta ') then backspace(unit_cli) end if do i = 1, 366 read (unit_cli,*,IOSTAT=ios) climall(i,j) help2 = climall(i,j)%day help3 = climall(i,j)%mon help = climall(i,j)%ye help1 = climall(i-1,j)%ye if (help.eq.2099 .and.help1.eq.2100.and. i.eq.366) then end if end do IF (climall(365,j)%ye == climall(366,j)%ye) then recs(j) = 366 else backspace unit_cli climall(366,j)%day = 0 climall(366,j)%mon = 0 climall(366,j)%ye = 0 recs(j) = 365 help = help-1 end IF IF (j < year .and. ios < 0 .and. c .eq. 'n') then realrec = j if (.not.flag_mult8910) then print *, ' >>>FORESEE message: Not enough climate data records in file!' call error_mess(0,'read_cli: Not enough data records in climate file; number of complete years: ',real(realrec)) write(unit_err,'(A,I5)')' read_cli: Fill next values with same from first year, day: ',i_exit write(unit_err,'(A,I5)')' read_cli: Fill next values with same data up to years: ',year repflag = 1 exit endif else if(j.eq.year.and.ios < 0) then realrec = year exit end IF j=j+1 if(help.lt.time_b) j = j-1 end do do j = 1, realrec yy(j) = climall(1,j)%ye do i = 1, recs(j) dd(i,j) = climall(i,j)%day mm(i,j) = climall(i,j)%mon tx(i,j) = climall(i,j)%m1 tp(i,j) = climall(i,j)%m2 tn(i,j) = climall(i,j)%m3 prc(i,j) = climall(i,j)%m4 hm(i,j) = climall(i,j)%m5 prs(i,j) = climall(i,j)%m6 vp(i,j) = climall(i,j)%m7 sdu(i,j) = climall(i,j)%m8 bw(i,j) = climall(i,j)%m9 rd(i,j) = climall(i,j)%m10 wd(i,j) = climall(i,j)%m11 end do end do close(9) deallocate (climall) end subroutine read_dwd !-------------------------------------------------------------- subroutine read_cli implicit none integer :: testtext, hp character(11) :: text2 character(4) :: text testtext=0 c = 'n' j = 1 hp = 0 read(unit_cli,'(A)') text2 hp = index(text2,'.') backspace(unit_cli) do IF(j > year) exit select case(flag_climtyp) case (1) do i=1,366 if (hp .gt. 0) then read(unit_cli,*,iostat=ios) text2,tp(i,j),hm(i,j),prc(i,j),prs(i,j),rd(i,j) text = text2(1:2) write (text,'(A)') text2(1:2) read (text,*) dd(i,j) write (text,'(A)') text2(4:5) read (text,*) mm(i,j) write (text,'(A)') text2(7:10) read (text,*) yy(j) else read(unit_cli,*,iostat=ios) dd(i,j),mm(i,j),yy(j),tp(i,j),hm(i,j),prc(i,j),prs(i,j),rd(i,j) endif ! hp i_exit = i if ((dd(i,j) .eq. 31) .and. (mm(i,j) .eq. 12)) then recs(j) = i write (*,*) 'Year ',j, yy(j) realrec = j if (j .eq. year) ios = -10 exit endif if (ios .ne. 0) exit end do case (2) do i=1,366 read(unit_cli,*) dd(i,j),mm(i,j),yy(j),& tp(i,j),hm(i,j),prc(i,j),prs(i,j),rd(i,j),wd(i,j) i_exit = i if ((dd(i,j) .eq. 31) .and. (mm(i,j) .eq. 12)) then recs(j) = i write (*,*) 'Year ',j, yy(j) realrec = j if (j .eq. year) ios = -10 exit endif if (ios .ne. 0) exit end do case (3) do i=1,366 if (hp .gt. 0) then read(unit_cli,*,iostat=ios) text2, & tp(i,j),hm(i,j),prc(i,j),prs(i,j),rd(i,j),wd(i,j), tx(i,j),tn(i,j) text = text2(1:2) write (text,'(A)') text2(1:2) read (text,*) dd(i,j) write (text,'(A)') text2(4:5) read (text,*) mm(i,j) write (text,'(A)') text2(7:10) read (text,*) yy(j) else read(unit_cli,*,iostat=ios) dd(i,j),mm(i,j),yy(j),& tp(i,j),hm(i,j),prc(i,j),prs(i,j),rd(i,j),wd(i,j), tx(i,j),tn(i,j) endif i_exit = i if ((dd(i,j) .eq. 31) .and. (mm(i,j) .eq. 12)) then recs(j) = i write (*,*) 'Year ',j, yy(j) realrec = j if (j .eq. year) ios = -10 exit endif if (ios .ne. 0) exit end do case (4) ! suffix 'txt' if (j .eq. 1 .and. testtext.eq.0) then read(unit_cli,*) text testtext = 1 end if do i=1,366 read(unit_cli,*,iostat=ios) dd(i,j),mm(i,j),yy(j),& tx(i,j),tp(i,j),tn(i,j),prc(i,j),hm(i,j),prs(i,j),rd(i,j),wd(i,j) i_exit = i if ((dd(i,j) .eq. 31) .and. (mm(i,j) .eq. 12)) then recs(j) = i write (*,*) 'Year ',j, yy(j) realrec = j if (j .eq. year) ios = -10 exit endif if (ios .ne. 0) exit end do case (5 ) call read_dwd exit end select IF (realrec .lt. year .and. ios .ne. 0 .and. c .eq. 'n') then if (dd(i_exit,j) .gt. 0) i_exit = i_exit+1 if (i_exit .ge. 365) i_exit = 1 repflag = 1 if (.not.flag_mult8910) then print *, ' >>>FORESEE message: Not enough data records in file' print *, ' IOSTAT = ', ios WRITE (*,'(A,I5)') ' >>>FORESEE message: Fill next values with same data from day number', i_exit CALL error_mess(0,'read_cli: Not enough data records in meteorology file; number of complete years: ',real(realrec)) write(unit_err,'(A,I5)')' read_cli: Fill next values with same from first year, day: ',i_exit write(unit_err,'(A,I5)')' read_cli: Fill next values with same data up to years: ',year exit endif end if if (ios .ne. 0) exit if (yy(j) .ge. time_b) then if ((j .eq. 1) .and. (yy(j) .gt. time_b)) then CALL error_mess(0,'read_cli: No climate data in meteorology file for year ',real(time_b)) flag_end = 6 return endif j = j+1 endif end do end subroutine read_cli !-------------------------------------------------------------- subroutine climfill integer istart istart = i_exit if(istart.eq.0) istart =istart +1 do j=realrec+1,year print *,'Year ',j yy(j)=yy(j-realrec) recs(j)=recs(j-realrec) do i=istart,366 dd(i,j) = dd(i,j-realrec) mm(i,j) = mm(i,j-realrec) tp(i,j) = tp(i,j-realrec) hm(i,j) = hm(i,j-realrec) prc(i,j) = prc(i,j-realrec) prs(i,j) = prs(i,j-realrec) rd(i,j) = rd(i,j-realrec) wd(i,j) = wd(i,j-realrec) tx(i,j) = tx(i,j-realrec) tn(i,j) = tn(i,j-realrec) end do end do end subroutine climfill END subroutine prepare_climate !************************************************************** SUBROUTINE store_para(hpara, simpara, parerr) use data_simul use data_out use data_par use data_species use data_soil_cn use data_stand use data_tsort implicit none integer inum real hpara, parerr character(100):: simpara, hchar1 integer, external :: array_num if (flag_trace) write (unit_trace, '(I4,I10,A)') iday, time_cur, ' store_para' parerr = 0. if (trim(simpara) .eq. 'year') then year=hpara parerr = 1. return endif if (trim(simpara) .eq. 'time_b') then time_b=hpara parerr = 1. return endif if (trim(simpara) .eq. 'kpatchsize') then kpatchsize=hpara parerr = 1. return endif if (trim(simpara) .eq. 'dz') then dz=hpara parerr = 1. return endif if (trim(simpara) .eq. 'ns_pro') then ns_pro=hpara parerr = 1. return endif if (trim(simpara) .eq. 'flag_mort') then flag_mort=hpara parerr = 1. return endif if (trim(simpara) .eq. 'flag_reg') then flag_reg=hpara parerr = 1. return endif if (trim(simpara) .eq. 'flag_stand') then flag_stand=hpara parerr = 1. return endif if (trim(simpara) .eq. 'flag_sveg') then flag_sveg=hpara parerr = 1. return endif if (trim(simpara) .eq. 'flag_mg') then flag_mg=hpara parerr = 1. return endif if (trim(simpara) .eq. 'flag_dis') then flag_dis=hpara parerr = 1. return endif if (trim(simpara) .eq. 'flag_light') then flag_light=hpara parerr = 1. return endif if (trim(simpara) .eq. 'flag_folhei') then flag_folhei=hpara parerr = 1. return endif if (trim(simpara) .eq. 'flag_volfunc') then flag_volfunc=hpara parerr = 1. return endif if (trim(simpara) .eq. 'flag_resp') then flag_resp=hpara parerr = 1. return endif if (trim(simpara) .eq. 'flag_limi') then flag_limi=hpara parerr = 1. return endif if (trim(simpara) .eq. 'flag_sign') then flag_sign=hpara parerr = 1. return endif if (trim(simpara) .eq. 'flag_decomp') then flag_decomp=hpara parerr = 1. return endif if (trim(simpara) .eq. 'flag_wred') then flag_wred=hpara parerr = 1. return endif if (trim(simpara) .eq. 'flag_wurz') then flag_wurz=hpara parerr = 1. return endif if (trim(simpara) .eq. 'flag_cond') then flag_cond=hpara parerr = 1. return endif if (trim(simpara) .eq. 'flag_int') then flag_int=hpara parerr = 1. return endif if (trim(simpara) .eq. 'flag_eva') then flag_eva=hpara parerr = 1. return endif if ((trim(simpara) .eq. 'flag_co2') .or.(trim(simpara) .eq. 'flag_CO2')) then flag_co2=hpara parerr = 1. return endif if (adjustl(trim(simpara)) .eq. 'flag_sort') then flag_sort = hpara parerr = 1. return endif if (adjustl(trim(simpara)) .eq. 'flag_wpm') then flag_wpm = hpara parerr = 1. return endif if (trim(simpara) .eq. 'time_out') then time_out=hpara parerr = 1. return endif if (trim(simpara) .eq. 'flag_dayout') then flag_dayout=hpara parerr = 1. return endif if (trim(simpara) .eq. 'flag_cohout') then flag_cohout=hpara parerr = 1. return endif if (trim(simpara) .eq. 'flag_sum') then flag_sum=hpara parerr = 1. return endif if (trim(simpara) .eq. 'k_hum') then k_hum=hpara parerr = 1. return endif if (trim(simpara) .eq. 'k_hum_r') then k_hum_r=hpara parerr = 1. return endif if (trim(simpara) .eq. 'k_nit') then k_nit=hpara parerr = 1. return endif if (adjustl(trim(simpara)) .eq. 'alfm') then alfm = hpara parerr = 1. return endif if (adjustl(trim(simpara)) .eq. 'gpmax') then gpmax = hpara parerr = 1. return endif if (adjustl(trim(simpara)) .eq. 'alfm') then alfm = hpara parerr = 1. return endif ! Species parameter hchar1 = adjustl(simpara) inum = array_num(hchar1) if (hchar1(1:9) .eq. 'k_opm_fol') then if (inum .gt. 0 .and. inum .le. nspecies) then spar(inum)%k_opm_fol = hpara parerr = 1. return endif endif if (hchar1(1:9) .eq. 'k_opm_frt') then inum = array_num(hchar1) if (inum .gt. 0 .and. inum .le. nspecies) then spar(inum)%k_opm_frt = hpara parerr = 1. return endif endif if (hchar1(1:9) .eq. 'k_syn_fol') then inum = array_num(hchar1) if (inum .gt. 0 .and. inum .le. nspecies) then spar(inum)%k_syn_fol = hpara parerr = 1. return endif endif if (hchar1(1:9) .eq. 'k_syn_frt') then if (inum .gt. 0 .and. inum .le. nspecies) then spar(inum)%k_syn_frt = hpara parerr = 1. return endif endif if (hchar1(1:3) .eq. 'psf') then inum = array_num(hchar1) if (inum .gt. 0 .and. inum .le. nspecies) then spar(inum)%psf = hpara parerr = 1. return endif endif if (hchar1(1:7) .eq. 'Phmodel') then inum = array_num(hchar1) if (inum .gt. 0 .and. inum .le. nspecies) then spar(inum)%Phmodel = hpara parerr = 1. return endif endif if ((hchar1(1:4) .eq. 'pnus') .or. (hchar1(1:4) .eq. 'Pnus')) then inum = array_num(hchar1) if (inum .gt. 0 .and. inum .le. nspecies) then spar(inum)%pnus = hpara parerr = 1. return endif endif if ((hchar1(1:4) .eq. 'RedN') .or. (hchar1(1:4) .eq. 'redn')) then inum = array_num(hchar1) if (inum .gt. 0 .and. inum .le. nspecies) then svar(inum)%RedN = hpara parerr = 1. return endif endif if (hchar1(1:4) .eq. 'prms') then inum = array_num(hchar1) if (inum .gt. 0 .and. inum .le. nspecies) then spar(inum)%prms = hpara parerr = 1. return endif endif if (hchar1(1:4) .eq. 'prmr') then inum = array_num(hchar1) if (inum .gt. 0 .and. inum .le. nspecies) then spar(inum)%prmr = hpara parerr = 1. return endif endif END subroutine store_para !************************************************************** integer FUNCTION array_num(string) ! reads the field numbre out of an array and hands it back as integer implicit none integer ipos1, ipos2, inum character (100) string character (10) help, hchar ipos1 = scan(string, '(' ) ipos2 = scan(string, ')' ) ipos1 = ipos1+1 ipos2 = ipos2-1 hchar = string(ipos1:ipos2) write(help,'(A3)') hchar read(help,*) inum array_num = inum end function array_num