!*****************************************************************! !* *! !* 4C (FORESEE) Simulation Model *! !* *! !* *! !* SR SEED_multi *! !* *! !* including SR/Function *! !* function rtflsp (regula falsi solving equation) *! !* function weight *! !* function weight1 *! !* *! !* generation of a variety of seedling cohorts for *! !* one seed number according to seedmass distribution *! !* (for given mean value and standard deviation) *! !* *! !* 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 seed_multi(nseed,nsp) USE data_species use data_stand use data_help use data_par use data_soil use data_simul IMPLICIT NONE integer :: nseed, nseedha, nsclass , k, j, nr integer,dimension(:),allocatable :: nsc real, dimension(:), allocatable :: msc, & shooth, & nschelp integer :: nsp REAL :: shoot REAL :: ms, msclass, x1,x2,xacc,shelp, nshelp,ntot,help REAL :: troot2 real :: standdev real :: rtflsp, weight TYPE(cohort) ::tree_ini external weight external rtflsp if(nseed.eq.0) return standdev = spar(nsp)%seedsd*1000. hnspec = nsp ms = spar(nsp)%seedmass *1000. ! g ---> mg nseedha = nseed nshelp = nseedha/10000. ! calculation of seed class number if(flag_reg.eq.3) then nsclass = int(100.*nshelp**0.6) else if(flag_reg.eq.30) then nsclass = int(10.*nshelp**0.6)+1 end if allocate(nsc(nsclass)) allocate(nschelp(nsclass)) allocate(msc(nsclass)) allocate(shooth(nsclass)) ! seed weight and number of seeds per class msclass = 6.*standdev/nsclass ntot = 0 help = (1/(sqrt(2*pi)*standdev)) do k=1, nsclass msc(k) = (ms - 3.*standdev) + msclass*(k-1) nschelp(k) = help*exp(-((msc(k)-ms)**2)/(2*(standdev)**2)) ntot = ntot + nschelp(k) end do do k= 1,nsclass nsc(k) = nint((nschelp(k)*nseedha/ntot) + 0.5) end do ! calculation of shoot weight per seed class and initilization do k = 1,nsclass mschelp = msc(k)/1000000. ! mg ---> kg x1 = 0. x2 = 0.1 xacc=(1.0e-10)*(x1+x2)/2 ! solve mass equation; determine root shelp=rtflsp(weight,x1,x2,xacc) shooth(k)= shelp max_coh = max_coh + 1 call coh_initial (tree_ini) tree_ini%ident = max_coh tree_ini%species = nsp tree_ini%ntreea = nsc(k) tree_ini%nta = nsc(k) shoot = shooth(k) tree_ini%x_sap = shoot ! [kg] shoot = shoot * 1000. ! [g] tree_ini%x_fol= (spar(nsp)%seeda*(tree_ini%x_sap** spar(nsp)%seedb)) ![kg] tree_ini%x_frt = tree_ini%x_fol ! [kg] ! Leder tree_ini%x_hrt = 0. tree_ini%med_sla = spar(nsp)%psla_min + spar(nsp)%psla_a*0.5 tree_ini%t_leaf = tree_ini%med_sla* tree_ini%x_fol ! [m-2] tree_ini%ca_ini = tree_ini%t_leaf tree_ini%crown_area = tree_ini%ca_ini tree_ini%underst = 1 ! tranformation of shoot biomass kg --> mg if(nsp.ne.2)tree_ini%height = spar(nsp)%pheight1*(shoot*1000.)**spar(nsp)%pheight2 ! [cm] berechnet aus shoot biomass (mg) ! Leder if(nsp.eq.2) tree_ini%height = 10**(spar(nsp)%pheight1+ spar(nsp)%pheight2*LOG10(shoot*1000.)+ & spar(nsp)%pheight3*(LOG10(shoot*1000.))**2) IF(nsc(k).ne.0.) then IF (.not. associated(pt%first)) THEN ALLOCATE (pt%first) pt%first%coh = tree_ini NULLIFY(pt%first%next) ! root distribution call root_depth (1, pt%first%coh%species, pt%first%coh%x_age, pt%first%coh%height, pt%first%coh%x_frt, pt%first%coh%x_crt, nr, troot2, pt%first%coh%x_rdpt, pt%first%coh%nroot) pt%first%coh%nroot = nr do j=1,nr pt%first%coh%rooteff = 1. ! assumption for the first use enddo do j=nr+1, nlay pt%first%coh%rooteff = 0. ! layers with no roots enddo ELSE ALLOCATE(zeig) zeig%coh = tree_ini zeig%next => pt%first pt%first => zeig call root_depth (1, zeig%coh%species, zeig%coh%x_age, zeig%coh%height, zeig%coh%x_frt, zeig%coh%x_crt, nr, troot2, zeig%coh%x_rdpt, zeig%coh%nroot) zeig%coh%nroot = nr do j=1,nr zeig%coh%rooteff = 1. ! assumption for the first use enddo do j=nr+1, nlay zeig%coh%rooteff = 0. ! layers with no roots enddo END IF anz_coh=anz_coh+1 END IF end do deallocate(nsc) deallocate(nschelp) deallocate(msc) deallocate(shooth) END SUBROUTINE seed_multi !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! weight: seed mass function !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! function weight (x) use data_help use data_species implicit none real :: x real :: p1,p2, weight p1 = spar(hnspec)%seeda p2 = spar(hnspec)%seedb weight = p1*2*(x**p2) + x - 0.7*mschelp end function weight !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! weight1: coarse root mass function !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! function weight1 (x) use data_help use data_species real :: x real :: p1,p2 p1 = spar(hnspec)%seeda p2 = spar(hnspec)%seedb weight1 = p1*(x**p2) + x - mschelp end function weight1 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! rtflsp: regula falsi solving euation !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! FUNCTION rtflsp(func,x1,x2,xacc) INTEGER MAXIT REAL rtflsp,x1,x2,xacc,func EXTERNAL func PARAMETER (MAXIT=30) INTEGER j REAL del,dx,f,fh,fl,swap,xh,xl fl=func(x1) fh=func(x2) if(fl.lt.0.)then xl=x1 xh=x2 else xl=x2 xh=x1 swap=fl fl=fh fh=swap endif dx=xh-xl do j=1,MAXIT rtflsp=xl+dx*fl/(fl-fh) f=func(rtflsp) if(f.lt.0.) then del=xl-rtflsp xl=rtflsp fl=f else del=xh-rtflsp xh=rtflsp fh=f endif dx=xh-xl if(abs(del).lt.xacc.or.f.eq.0.)return end do END function rtflsp