growthmod.f90 Source File


Contents

Source Code


Source Code

module growthmod
	implicit none
	contains
 !===================================
 subroutine initialize_gw3(d_connect,d_node,peti_coord,leaf_coord,max_leaf_angle,&
	max_leaf_length,max_leaf_width,leaf_shape_rate,peti_length,max_length)
	integer,allocatable,intent(out)::d_connect(:,:)
	real(8),allocatable,intent(out)::d_node(:,:),peti_coord(:,:,:),leaf_coord(:,:,:,:)
	real(8),intent(in)::max_leaf_angle,&
	max_leaf_length,max_leaf_width,leaf_shape_rate,peti_length,max_length
	real(8) r1,r2,x_coord,&
	y_coord,z_coord,direction,pi,angle,x_coord_1,y_coord_1,z_coord_1,&
	peti_RUE,mid_length,width,length
	real(8),allocatable::a(:),b(:),z(:),nvec(:),a_unit(:),b_unit(:)
	
	integer int_num,real_value
	
	integer i,j,n,m,o,parent,itr
	integer :: seedsize
	integer,allocatable :: seed(:)
	real :: rnd
	integer :: c !時間を入れる
	pi=3.14159265350d0
	
	int_num=3
	real_value=5
	allocate(d_connect(2,int_num),d_node(2,real_value))
	allocate(peti_coord(2,4,3),leaf_coord(2,3,4,3)   )
	allocate(a(3),b(3),z(3),nvec(3),a_unit(3),b_unit(3) )
	leaf_coord(:,:,:,:)=0.0d0
	peti_coord(:,:,:)=0.0d0
	!initisalize d_connect
	d_connect(1,1)=1
	d_connect(1,2)=-1 !Apical No. 
	d_connect(1,3)=0
	
	d_connect(2,1)=1
	d_connect(2,2)=0 !Apical No. 
	d_connect(2,3)=0
	
	!initialize d_node
	d_node(1,1)=0.0d0
	d_node(1,2)=0.0d0
	d_node(1,3)=0.0d0
	d_node(1,4)=1.0d0
	d_node(1,5)=0.0d0
	
	d_node(2,1)=0.0d0
	d_node(2,2)=0.0d0
	d_node(2,3)=max_length
	d_node(2,4)=1.0d0
	d_node(2,5)=0.0d0
	
	!initialize peti_coord(:,:,:)============
	
	!random number generation
	call system_clock(count=c) !時間を取得
	call random_seed(size=seedsize)
	allocate(seed(seedsize))
	call random_seed(get=seed)
	seed = c !時間を全部に代入
	call random_number(rnd) !rndに乱数をセット
	deallocate(seed)
		
	angle=((rnd-0.50d0)+1.0d0)*max_leaf_angle

	call system_clock(count=c) !時間を取得
	call random_seed(size=seedsize)
	allocate(seed(seedsize))
	call random_seed(get=seed)
	seed = c !時間を全部に代入
	call random_number(rnd) !rndに乱数をセット
	deallocate(seed)

	
	length=((rnd-0.50d0)+1.0d0)*peti_length
	
	call system_clock(count=c) !時間を取得
	call random_seed(size=seedsize)
	allocate(seed(seedsize))
	call random_seed(get=seed)
	seed = c !時間を全部に代入
	call random_number(rnd) !rndに乱数をセット
	deallocate(seed)
	
	direction=rnd*360.0d0
	
	r1=cos(pi*(angle/180.0d0))*length
	r2=sin(pi*(angle/180.0d0))*length
	
	
	x_coord=d_node(2,1)
	y_coord=d_node(2,2)
	z_coord=d_node(2,3)
	
	x_coord=x_coord+r2*cos( pi*(direction/180.0d0) )
	y_coord=y_coord+r2*sin( pi*(direction/180.0d0) )
	z_coord=z_coord+r1
	
	peti_coord(1,:,:)=0.0d0
	
	peti_coord(2,1,1)=x_coord
	peti_coord(2,1,2)=y_coord
	peti_coord(2,1,3)=z_coord
	
	
	!second-fourth
	do i=2,4	
		!random number generation
		call system_clock(count=c) !時間を取得
		call random_seed(size=seedsize)
		allocate(seed(seedsize))
		call random_seed(get=seed)
		seed = c !時間を全部に代入
		call random_number(rnd) !rndに乱数をセット
		deallocate(seed)
			
		angle=((rnd-0.50d0)+1.0d0)*max_leaf_angle
		
		call system_clock(count=c) !時間を取得
		call random_seed(size=seedsize)
		allocate(seed(seedsize))
		call random_seed(get=seed)
		seed = c !時間を全部に代入
		call random_number(rnd) !rndに乱数をセット
		deallocate(seed)
		
		if(i==2)then
			peti_RUE=0.1
		else
			peti_RUE=0.05
		endif
		
		length=((rnd-0.50d0)+1.0d0)*max_leaf_length*peti_RUE
		
		call system_clock(count=c) !時間を取得
		call random_seed(size=seedsize)
		allocate(seed(seedsize))
		call random_seed(get=seed)
		seed = c !時間を全部に代入
		call random_number(rnd) !rndに乱数をセット
		deallocate(seed)
		
		if(i==2)then
			direction=rnd*360.0d0
		elseif(i==3)then
			direction=direction+120
		elseif(i==4)then
			direction=direction-240
		endif
		r1=cos(pi*(angle/180.0d0))*length
		r2=sin(pi*(angle/180.0d0)  )*length
		
		
		x_coord_1=x_coord
		y_coord_1=y_coord
		z_coord_1=z_coord
		
		x_coord_1=x_coord_1+r2*cos( pi*(direction/180.0d0) )
		y_coord_1=y_coord_1+r2*sin( pi*(direction/180.0d0) )
		z_coord_1=z_coord_1+r1
		
		peti_coord(2,i,1)=x_coord_1
		peti_coord(2,i,2)=y_coord_1
		peti_coord(2,i,3)=z_coord_1
	enddo
	
	!leaf generate
	do i=1,3
		!random number generation
		call system_clock(count=c) !時間を取得
		call random_seed(size=seedsize)
		allocate(seed(seedsize))
		call random_seed(get=seed)
		seed = c !時間を全部に代入
		call random_number(rnd) !rndに乱数をセット
		deallocate(seed)
			
		angle=((rnd-0.50d0)+1.0d0)*max_leaf_angle
		
		call system_clock(count=c) !時間を取得
		call random_seed(size=seedsize)
		allocate(seed(seedsize))
		call random_seed(get=seed)
		seed = c !時間を全部に代入
		call random_number(rnd) !rndに乱数をセット
		deallocate(seed)
		
		length=((rnd-0.50d0)+1.0d0)*max_leaf_length
		width=((rnd-0.50d0)+1.0d0)*max_leaf_width
		
		call system_clock(count=c) !時間を取得
		call random_seed(size=seedsize)
		allocate(seed(seedsize))
		call random_seed(get=seed)
		seed = c !時間を全部に代入
		call random_number(rnd) !rndに乱数をセット
		deallocate(seed)
		
		if(i==1)then
			direction=rnd*360.0d0
		elseif(i==2)then
			direction=direction+120
		elseif(i==3)then
			direction=direction-240
		endif
		
		r1=cos(pi*(angle/180.0d0))*length
		r2=sin(pi*(angle/180.0d0)  )*length
		
		
		x_coord_1=peti_coord(2,i,1)
		y_coord_1=peti_coord(2,i,2)
		z_coord_1=peti_coord(2,i,3)
		
		x_coord_1=x_coord_1+r2*cos( pi*(direction/180.0d0) )
		y_coord_1=y_coord_1+r2*sin( pi*(direction/180.0d0) )
		z_coord_1=z_coord_1+r1
		
		leaf_coord(2,i,3,1)=x_coord_1
		leaf_coord(2,i,3,2)=y_coord_1
		leaf_coord(2,i,3,3)=z_coord_1
		
		leaf_coord(2,i,1,1)=peti_coord(2,i,1)
		leaf_coord(2,i,1,2)=peti_coord(2,i,2)
		leaf_coord(2,i,1,3)=peti_coord(2,i,3)
		!
		a(1)=leaf_coord(2,i,3,1)-peti_coord(2,i,1)
		a(2)=leaf_coord(2,i,3,2)-peti_coord(2,i,2)
		a(3)=leaf_coord(2,i,3,3)-peti_coord(2,i,3)
		
		z(1)=0.0d0
		z(2)=0.0d0
		z(3)=1.0d0
		
		a_unit(:)=a(:)/dsqrt(dot_product(a,a))
		
		b(:)=z(:)-dot_product(a,z)*a_unit(:)
		
		b_unit(:)=b(:)/dsqrt(dot_product(b,b))
		
		nvec(1)=a_unit(2)*b_unit(3)-a_unit(3)*b_unit(2)
		nvec(2)=a_unit(3)*b_unit(1)-a_unit(1)*b_unit(3)
		nvec(3)=a_unit(1)*b_unit(2)-a_unit(2)*b_unit(1)
		
		nvec(:)=nvec(:)/dsqrt(dot_product(nvec,nvec))
		
		mid_length=1.0d0/(1.0d0+leaf_shape_rate)*length
		
		j=2
			
			x_coord_1=peti_coord(2,i,1)
			y_coord_1=peti_coord(2,i,2)
			z_coord_1=peti_coord(2,i,3)
			
			x_coord_1=x_coord_1+mid_length*a_unit(1)
			y_coord_1=y_coord_1+mid_length*a_unit(2)
			z_coord_1=z_coord_1+mid_length*a_unit(3)
			
			leaf_coord(2,i,j,1)=x_coord_1-0.50d0*width*nvec(1)
			leaf_coord(2,i,j,2)=y_coord_1-0.50d0*width*nvec(2)
			leaf_coord(2,i,j,3)=z_coord_1-0.50d0*width*nvec(3)
			
		j=4
			x_coord_1=peti_coord(2,i,1)
			y_coord_1=peti_coord(2,i,2)
			z_coord_1=peti_coord(2,i,3)
			
			x_coord_1=x_coord_1+mid_length*a_unit(1)
			y_coord_1=y_coord_1+mid_length*a_unit(2)
			z_coord_1=z_coord_1+mid_length*a_unit(3)
			
			leaf_coord(2,i,j,1)=x_coord_1+0.50d0*width*nvec(1)
			leaf_coord(2,i,j,2)=y_coord_1+0.50d0*width*nvec(2)
			leaf_coord(2,i,j,3)=z_coord_1+0.50d0*width*nvec(3)
		
		
	enddo
	
 end subroutine initialize_gw3
 !===================================
 subroutine growth_gw3(node,d_connect,d_node,max_angle,max_length,&
	Apical_dominance_p,max_leaf_angle,&
	max_leaf_length,max_leaf_width,leaf_shape_rate,&
	peti_coord,leaf_coord,peti_length)
	
	integer,allocatable::d_connect_es(:,:)
	integer,allocatable,intent(inout)::d_connect(:,:)
	
	real(8),allocatable::d_node_es(:,:),peti_coord_es(:,:,:),&
		leaf_coord_es(:,:,:,:)
	real(8),allocatable,intent(inout)::d_node(:,:),peti_coord(:,:,:),&
		leaf_coord(:,:,:,:)
		
	real(8),intent(in)::max_angle,max_length,peti_length
	real(8),intent(in)::max_leaf_angle,&
	max_leaf_length,max_leaf_width,leaf_shape_rate
	real(8) angle,length,direction,r1,r2,pi,x_coord,y_coord,z_coord
	integer,intent(in)::node,Apical_dominance_p
	
	real(8) x_coord_1,y_coord_1,z_coord_1,peti_RUE,mid_length,width
	real(8),allocatable::a(:),b(:),z(:),nvec(:),a_unit(:),b_unit(:)
	
	integer i,j,n,m,o,parent,itr
	integer :: seedsize
	integer,allocatable :: seed(:)
	real :: rnd
	integer :: c !時間を入れる

	pi=3.14159265350d0
	
	
	allocate(a(3),b(3),z(3),nvec(3),a_unit(3),b_unit(3) )
	
	
	n=size(d_connect,1)
	m=size(d_connect,2)
	o=size(d_node,2)
	allocate(d_connect_es(n+1,m),d_node_es(n+1,o))
	d_connect_es(:,:)=0
	allocate(peti_coord_es(n,4,3),leaf_coord_es(n,3,4,3)   )
	!copy
	do i=1,n
		d_connect_es(i,:)=d_connect(i,:)
		d_node_es(i,:)=d_node(i,:)
	enddo
	
	!generate new node
	d_connect_es(n+1,1)=node
	if(d_connect_es(node,2)==-1  )then
		!basis
		return
	elseif(d_connect_es(node,2)==0  )then
		!aptical node => Get aptical dominance
		d_connect_es(n+1,2)=0
		
		d_connect_es(node,2)=1
		parent=d_connect_es(node,1)
		itr=1
		do
			itr=itr+1
			if( d_connect_es(parent,2)==-1 )then
				!base
				exit
			else
				if(  d_connect_es(parent,2)+1>=itr)then
					d_connect_es(parent,2)=d_connect_es(parent,2)+1
					parent = d_connect_es(parent,1)
				else
					cycle
				endif
			endif
		enddo
		
		
		
	elseif(d_connect_es(node,2)>=Apical_dominance_p  )then
		!generate new aptical
		d_connect_es(n+1,2)=0
		parent=d_connect_es(node,1)
		itr=1
		do
			itr=itr+1
			if( d_connect_es(parent,2)==-1 )then
				!base
				exit
			else
				if(  d_connect_es(parent,2)+1==itr)then
					d_connect_es(parent,2)=d_connect_es(parent,2)+1
					parent = d_connect_es(parent,1)
				else
					exit
				endif
			endif		
		enddo
	else
		!not generate
		return
	endif
	
	d_connect_es(n+1,3)=0
	
	!random number generation
	call system_clock(count=c) !時間を取得
	call random_seed(size=seedsize)
	allocate(seed(seedsize))
	call random_seed(get=seed)
	seed = c !時間を全部に代入
	call random_number(rnd) !rndに乱数をセット
	deallocate(seed)
		
	angle=((rnd-0.50d0)+1.0d0)*max_angle

	call system_clock(count=c) !時間を取得
	call random_seed(size=seedsize)
	allocate(seed(seedsize))
	call random_seed(get=seed)
	seed = c !時間を全部に代入
	call random_number(rnd) !rndに乱数をセット
	deallocate(seed)
	
	length=((rnd-0.50d0)+1.0d0)*max_length
	
	call system_clock(count=c) !時間を取得
	call random_seed(size=seedsize)
	allocate(seed(seedsize))
	call random_seed(get=seed)
	seed = c !時間を全部に代入
	call random_number(rnd) !rndに乱数をセット
	deallocate(seed)
	
	direction=rnd*360.0d0
	
	r1=abs(cos(pi*(angle/180.0d0)))*length
	r2=abs( sin(pi*(angle/180.0d0)  ))*length
	
	
	x_coord=d_node(node,1)
	y_coord=d_node(node,2)
	z_coord=d_node(node,3)
	
	x_coord=x_coord+r2*cos( pi*(direction/180.0d0) )
	y_coord=y_coord+r2*sin( pi*(direction/180.0d0) )
	z_coord=z_coord+r1
	
	d_node_es(n+1,1)=x_coord
	d_node_es(n+1,2)=y_coord
	d_node_es(n+1,3)=z_coord
	d_node_es(n+1,4)=1.0d0
	d_node_es(n+1,5)=0.0d0
	
	
	deallocate(d_connect,d_node)
	n=size(d_connect_es,1)
	m=size(d_connect_es,2)
	o=size(d_node_es,2)
	allocate(d_connect(n,m),d_node(n,o))
	d_connect(:,:)=d_connect_es(:,:)
	d_node(:,:)=d_node_es(:,:)
	deallocate(d_connect_es,d_node_es)
	
	!====================================
	!generate peti and leaf
	!========================
	
	!expand peti_coord,leaf_coord
	!copy
	n=size(d_connect,1)
	leaf_coord_es(:,:,:,:)=leaf_coord(:,:,:,:)
	peti_coord_es(:,:,:)=peti_coord(:,:,:)
	deallocate(peti_coord,leaf_coord)
	allocate(peti_coord(n,4,3),leaf_coord(n,3,4,3)   )
	
	do i=1,size(peti_coord,1)
		peti_coord(i,:,:)=peti_coord_es(i,:,:)
		leaf_coord(i,:,:,:)=leaf_coord_es(i,:,:,:)
	enddo
	deallocate(peti_coord_es,leaf_coord_es)
	
	
	n=size(d_connect,1)
	!random number generation
	call system_clock(count=c) !時間を取得
	call random_seed(size=seedsize)
	allocate(seed(seedsize))
	call random_seed(get=seed)
	seed = c !時間を全部に代入
	call random_number(rnd) !rndに乱数をセット
	deallocate(seed)
		
	angle=((rnd-0.50d0)+1.0d0)*max_leaf_angle

	call system_clock(count=c) !時間を取得
	call random_seed(size=seedsize)
	allocate(seed(seedsize))
	call random_seed(get=seed)
	seed = c !時間を全部に代入
	call random_number(rnd) !rndに乱数をセット
	deallocate(seed)
	
	length=((rnd-0.50d0)+1.0d0)*peti_length
	
	call system_clock(count=c) !時間を取得
	call random_seed(size=seedsize)
	allocate(seed(seedsize))
	call random_seed(get=seed)
	seed = c !時間を全部に代入
	call random_number(rnd) !rndに乱数をセット
	deallocate(seed)
	
	direction=rnd*360.0d0
	
	r1=cos(pi*(angle/180.0d0))*length
	r2=sin(pi*(angle/180.0d0)  )*length
	
	
	x_coord=d_node(n,1)
	y_coord=d_node(n,2)
	z_coord=d_node(n,3)
	
	x_coord=x_coord+r2*cos( pi*(direction/180.0d0) )
	y_coord=y_coord+r2*sin( pi*(direction/180.0d0) )
	z_coord=z_coord+r1
	
	peti_coord(1,:,:)=0.0d0
	
	peti_coord(n,1,1)=x_coord
	peti_coord(n,1,2)=y_coord
	peti_coord(n,1,3)=z_coord
	
	
	!second-fourth
	do i=2,4	
		!random number generation
		call system_clock(count=c) !時間を取得
		call random_seed(size=seedsize)
		allocate(seed(seedsize))
		call random_seed(get=seed)
		seed = c !時間を全部に代入
		call random_number(rnd) !rndに乱数をセット
		deallocate(seed)
			
		angle=((rnd-0.50d0)+1.0d0)*max_leaf_angle
		
		call system_clock(count=c) !時間を取得
		call random_seed(size=seedsize)
		allocate(seed(seedsize))
		call random_seed(get=seed)
		seed = c !時間を全部に代入
		call random_number(rnd) !rndに乱数をセット
		deallocate(seed)
		
		if(i==2)then
			peti_RUE=0.10d0
		else
			peti_RUE=0.050d0
		endif
		
		length=((rnd-0.50d0)+1.0d0)*max_leaf_length*peti_RUE
		
		call system_clock(count=c) !時間を取得
		call random_seed(size=seedsize)
		allocate(seed(seedsize))
		call random_seed(get=seed)
		seed = c !時間を全部に代入
		call random_number(rnd) !rndに乱数をセット
		deallocate(seed)
		
		if(i==2)then
			direction=rnd*360.0d0
		elseif(i==3)then
			direction=direction+120
		elseif(i==4)then
			direction=direction-240
		endif
		
		r1=abs(cos(pi*(angle/180.0d0)))*length
		r2=abs( sin(pi*(angle/180.0d0)  ))*length
		
		
		x_coord_1=x_coord
		y_coord_1=y_coord
		z_coord_1=z_coord
		
		x_coord_1=x_coord_1+r2*cos( pi*(direction/180.0d0) )
		y_coord_1=y_coord_1+r2*sin( pi*(direction/180.0d0) )
		z_coord_1=z_coord_1+r1
		
		peti_coord(n,i,1)=x_coord_1
		peti_coord(n,i,2)=y_coord_1
		peti_coord(n,i,3)=z_coord_1
	enddo
	
	!leaf generate
	do i=1,3
		!random number generation
		call system_clock(count=c) !時間を取得
		call random_seed(size=seedsize)
		allocate(seed(seedsize))
		call random_seed(get=seed)
		seed = c !時間を全部に代入
		call random_number(rnd) !rndに乱数をセット
		deallocate(seed)
			
		angle=((rnd-0.50d0)+1.0d0)*max_leaf_angle
		
		call system_clock(count=c) !時間を取得
		call random_seed(size=seedsize)
		allocate(seed(seedsize))
		call random_seed(get=seed)
		seed = c !時間を全部に代入
		call random_number(rnd) !rndに乱数をセット
		deallocate(seed)
		
		length=((rnd-0.50d0)+1.0d0)*max_leaf_length
		width=((rnd-0.50d0)+1.0d0)*max_leaf_width
		
		call system_clock(count=c) !時間を取得
		call random_seed(size=seedsize)
		allocate(seed(seedsize))
		call random_seed(get=seed)
		seed = c !時間を全部に代入
		call random_number(rnd) !rndに乱数をセット
		deallocate(seed)
		
		if(i==1)then
			direction=rnd*360.0d0
		elseif(i==2)then
			direction=direction+120
		elseif(i==3)then
			direction=direction-240
		endif
		
		r1=abs(cos(pi*(angle/180.0d0)))*length
		r2=abs( sin(pi*(angle/180.0d0)  ))*length
		
		
		x_coord_1=peti_coord(n,i,1)
		y_coord_1=peti_coord(n,i,2)
		z_coord_1=peti_coord(n,i,3)
		
		x_coord_1=x_coord_1+r2*cos( pi*(direction/180.0d0) )
		y_coord_1=y_coord_1+r2*sin( pi*(direction/180.0d0) )
		z_coord_1=z_coord_1+r1
		
		leaf_coord(n,i,3,1)=x_coord_1
		leaf_coord(n,i,3,2)=y_coord_1
		leaf_coord(n,i,3,3)=z_coord_1
		
		leaf_coord(n,i,1,1)=peti_coord(n,i,1)
		leaf_coord(n,i,1,2)=peti_coord(n,i,2)
		leaf_coord(n,i,1,3)=peti_coord(n,i,3)
		!
		a(1)=leaf_coord(n,i,3,1)-peti_coord(n,i,1)
		a(2)=leaf_coord(n,i,3,2)-peti_coord(n,i,2)
		a(3)=leaf_coord(n,i,3,3)-peti_coord(n,i,3)
		
		z(1)=0.0d0
		z(2)=0.0d0
		z(3)=1.0d0
		
		a_unit(:)=a(:)/dsqrt(dot_product(a,a))
		
		b(:)=z(:)-dot_product(a,z)*a_unit(:)
		
		b_unit(:)=b(:)/dsqrt(dot_product(b,b))
		
		nvec(1)=a_unit(2)*b_unit(3)-a_unit(3)*b_unit(2)
		nvec(2)=a_unit(3)*b_unit(1)-a_unit(1)*b_unit(3)
		nvec(3)=a_unit(1)*b_unit(2)-a_unit(2)*b_unit(1)
		nvec(:)=nvec(:)/dsqrt(dot_product(nvec,nvec))
		mid_length=1.0d0/(1.0d0+leaf_shape_rate)*length
		
		j=2
			
			x_coord_1=peti_coord(n,i,1)
			y_coord_1=peti_coord(n,i,2)
			z_coord_1=peti_coord(n,i,3)
			
			x_coord_1=x_coord_1+mid_length*a_unit(1)
			y_coord_1=y_coord_1+mid_length*a_unit(2)
			z_coord_1=z_coord_1+mid_length*a_unit(3)
			
			leaf_coord(n,i,j,1)=x_coord_1-0.50d0*width*nvec(1)
			leaf_coord(n,i,j,2)=y_coord_1-0.50d0*width*nvec(2)
			leaf_coord(n,i,j,3)=z_coord_1-0.50d0*width*nvec(3)
			
		j=4
			x_coord_1=peti_coord(n,i,1)
			y_coord_1=peti_coord(n,i,2)
			z_coord_1=peti_coord(n,i,3)
			
			x_coord_1=x_coord_1+mid_length*a_unit(1)
			y_coord_1=y_coord_1+mid_length*a_unit(2)
			z_coord_1=z_coord_1+mid_length*a_unit(3)
			
			leaf_coord(n,i,j,1)=x_coord_1+0.50d0*width*nvec(1)
			leaf_coord(n,i,j,2)=y_coord_1+0.50d0*width*nvec(2)
			leaf_coord(n,i,j,3)=z_coord_1+0.50d0*width*nvec(3)
		
		
	enddo

 end subroutine growth_gw3
 !===================================
 subroutine update_factor_gw3(d_connect,d_node,RUE,num_node,leaf_coord&
	,day,daylength,limit_leaf_day,day_ID)
	real(8),intent(inout)::d_node(:,:)
	real(8),intent(in)::RUE,leaf_coord(:,:,:,:),daylength(:)
	real(8),allocatable::photosynthesis(:,:),radiation(:,:)
	real(8) factor,light_area,total_area,old_RUEmeter
	integer,intent(in)::d_connect(:,:),num_node,day_ID,day(:,:),limit_leaf_day
	integer i,j,month,node_ID,leaf_ID
	
	allocate(photosynthesis(num_node,3),radiation(12,2) )
	photosynthesis(:,:)=0.0d0
	open(60,file="radiation.txt")
	do i=1,12
		read(60,*)radiation(i,1:2)
	enddo
	close(60)
	
	!生成してから1日経ってから光合成開始
	!日照面積判定
	do i=1,num_node
		do j=1,size(leaf_coord,2)
			!compute light area
			node_ID=i
			leaf_ID=j
			call detect_light_area(leaf_coord,light_area,total_area,node_ID,leaf_ID)
		
			photosynthesis(i,1)=light_area
			photosynthesis(i,2)=total_area
			!光合成量=日射時間(hr)×面積当たり時間当たり日射量(MJ/m^2/hr)×日照面積(m^2)×日射量あたり光合成(g/MJ)
			month=day(day_ID,2)
			if( radiation(month,1)==0.0d0 )then
				photosynthesis(i,3)=0.0d0
			endif
			
			if(d_connect(i,3)==-1 )then
				old_RUEmeter=0.0d0
			else
				old_RUEmeter=dble(d_connect(i,3))/dble(limit_leaf_day)
				if(old_RUEmeter<0)stop"debugb"
			endif
			
			photosynthesis(i,3)=daylength(day_ID)*radiation(month,2)/radiation(month,1)&
				*light_area*RUE*old_RUEmeter
		enddo
	enddo
	
	
	do i=1,num_node
		!compute factor
		factor=d_node(i,5)
		
		factor=factor+photosynthesis(i,3)
		
		d_node(i,5)=factor
	enddo
	
	
 end subroutine update_factor_gw3
 !===================================
 subroutine detect_start(start,finish,seedling_day,harvesting_day,day)
	integer,intent(out)::start,finish
	integer,intent(in)::seedling_day(:),harvesting_day(:),day(:,:)
	integer i,j,n,yy,mm,dd,diff
	
	do i=1,size(day,1)
		yy=day(i,1)
		mm=day(i,2)
		dd=day(i,3)
		
		diff=abs( seedling_day(1)-yy )&
			+abs( seedling_day(2)-mm )&
			+abs( seedling_day(3)-dd )
		
		if(diff==0 )then
			start=i
			exit
		endif
		
	enddo
	
	do i=1,size(day,1)
		yy=day(i,1)
		mm=day(i,2)
		dd=day(i,3)
		
		diff=abs( harvesting_day(1)-yy )&
			+abs( harvesting_day(2)-mm )&
			+abs( harvesting_day(3)-dd )
		
		if(diff==0 )then
			finish=i
			exit
		endif
		
	enddo
	
	
 end subroutine detect_start
 !===================================
  subroutine count_br_per_node(node_number,br_per_node,d_connect)
	integer,intent(in)::node_number,d_connect(:,:)
	integer,intent(out)::br_per_node
	integer i
	
	br_per_node=0
	do i=1,size(d_connect,1)
		if(node_number==d_connect(i,1) )then
			br_per_node=br_per_node+1
		else
			cycle
		endif
	enddo
	if(br_per_node>=3)stop"debug"
	
 end subroutine count_br_per_node
 !===================================
 subroutine detect_light_area(leaf_coord,light_area,total_area,node_ID,leaf_ID)
	real(8),intent(in)::leaf_coord(:,:,:,:)
	real(8),intent(out)::light_area,total_area
	real(8),allocatable::mid_x(:),shape_function(:),evaluate_point(:,:),eva_x(:),rvec(:)&
		,x1(:),x2(:),y1(:),y2(:)
	real(8) gzi_1,gzi_2,eva_r,mid_r,both_r,l1,l2,l3
	integer,intent(in)::node_ID,leaf_ID
	integer i,j,k,l,m,shade_or_not,count_shade
	
	allocate(mid_x(3),shape_function(4),evaluate_point(4,2),eva_x(3),rvec(2),x1(2),x2(2))
	allocate(y1(3),y2(3))
	
	!2D linear interpolation,4 points
	evaluate_point(1,1)=-0.50d0
	evaluate_point(1,2)=-0.50d0
	evaluate_point(2,1)=-0.50d0
	evaluate_point(2,2)=0.50d0
	evaluate_point(3,1)=0.50d0
	evaluate_point(3,2)=0.50d0
	evaluate_point(4,1)=0.50d0
	evaluate_point(4,2)=-0.50d0
	
	y1(1:3)=leaf_coord(node_ID,leaf_ID,1,1:3)-leaf_coord(node_ID,leaf_ID,3,1:3)
	y2(1:3)=leaf_coord(node_ID,leaf_ID,2,1:3)-leaf_coord(node_ID,leaf_ID,4,1:3)
	l1=dsqrt( dot_product(y1,y1) )
	l2=dsqrt( dot_product(y2,y2) )
	total_area=0.50d0*l1*l2/100.0d0/100.0d0
	
	count_shade=0
	do k=1,4 !evaluate points
		gzi_1=evaluate_point(k,1)
		gzi_2=evaluate_point(k,2)
		shape_function(1)=0.250d0*(1.0d0-gzi_1)*(1.0d0-gzi_1)
		shape_function(2)=0.250d0*(1.0d0-gzi_1)*(1.0d0+gzi_1)
		shape_function(3)=0.250d0*(1.0d0+gzi_1)*(1.0d0+gzi_1)
		shape_function(4)=0.250d0*(1.0d0+gzi_1)*(1.0d0-gzi_1)
		
		eva_x(:)=0.0d0
		do l=1,4 
			eva_x(:)=eva_x(:)+leaf_coord(node_ID,leaf_ID,l,:)&
				*shape_function(l)
		enddo
		rvec(:)=leaf_coord(node_ID,leaf_ID,k,1:2)
		eva_r=dsqrt( dot_product(rvec-eva_x(1:2) ,rvec-eva_x(1:2)  ) )
		
		shade_or_not=0
		
		do i=1,size(leaf_coord,1)
			do j=1,size(leaf_coord,2)
				mid_x(:)=0.0d0
				do l=1,4
					mid_x(:)=mid_x(:)+0.250d0*leaf_coord(i,j,l,:)
				enddo
				
				!if z coordinate of the midpoint of the leaf > evaluate point
				! => possible node
				if(mid_x(3) < eva_x(3) )then
					cycle
				endif
				
				x1(1:2)=leaf_coord(i,j,1,1:2)-leaf_coord(i,j,3,1:2)
				x2(1:2)=leaf_coord(i,j,2,1:2)-leaf_coord(i,j,4,1:2)
				
				mid_r=dsqrt( dot_product(x1,x1) )+dsqrt( dot_product(x2,x2) )
				mid_r=0.50d0*mid_r
				
				both_r=dsqrt( dot_product(mid_x(1:2)-eva_x(1:2),mid_x(1:2)-eva_x(1:2)))
				
				if(both_r > eva_r+mid_r)then
					cycle
				else
					shade_or_not=1
					exit
				endif		
			enddo
			
			if(shade_or_not==1)then
				exit
			endif
		enddo
		
		if(shade_or_not==1)then
			cycle
		else
			count_shade=count_shade+1
		endif	
	enddo
	
	light_area=total_area/4.0d0*dble(count_shade)
	
 end subroutine detect_light_area
 !===================================
 subroutine get_old(d_connect,limit_leaf_day)
	integer,intent(inout)::d_connect(:,:)
	integer,intent(in)::limit_leaf_day
	integer i
	
	do i=1,size(d_connect,1)
		if(d_connect(i,3)==0 )then
			!first day 
			d_connect(i,3)=limit_leaf_day
		elseif(d_connect(i,3)==1 )then
			d_connect(i,3)=-1
		elseif(d_connect(i,3)==-1 )then
			d_connect(i,3)=-1
		elseif(limit_leaf_day>=d_connect(i,3) .and. d_connect(i,3)>=2)then
			d_connect(i,3)=d_connect(i,3)-1
		else
			stop"invalid d_connect,3"
		endif
	enddo
	
 end subroutine get_old
 !===================================
 subroutine generate_pod(d_node,d_pod,source_convection_rate,source_limitation)
	real(8),intent(inout)::d_node(:,:),d_pod(:,:)
	real(8),intent(in)::source_convection_rate,source_limitation
	real(8) total_source,extra_source
	integer i,j,pn
	
	do i=1,size(d_node,1)
		total_source=d_node(i,5)
		pn=0
		do j=1,size(d_pod,2)
			if(d_pod(i,j)==source_limitation)then
				cycle
			elseif(d_pod(i,j)<source_limitation )then
				pn=j
				exit
			else
				stop"invalid source/pod"
			endif
		enddo
		
		if(pn==0)then
			!sink was occupied
			cycle
		endif
		
		if(total_source>=source_convection_rate)then
			d_node(i,5)=total_source-source_convection_rate
			d_pod(i,pn)=d_pod(i,pn)+source_convection_rate
			
			
		elseif(source_convection_rate>total_source .and. &
			total_source>0.0d0)then
			d_pod(i,pn)=d_pod(i,pn)+total_source
			d_node(i,5)=0.0d0
		elseif(total_source==0.0d0)then
			cycle
		else
			stop"invalid source < 0"
		endif
		
		extra_source=0.0d0
		do j=1,size(d_pod,2)
			if(extra_source/=0.0d0)then
				d_pod(i,j)=d_pod(i,j)+extra_source
			endif
			
			if(d_pod(i,j)>source_limitation)then
				extra_source=d_pod(i,j)-source_limitation
				d_pod(i,j)=source_limitation
			endif
		enddo
		
		if(extra_source/=0.0d0)then
			d_node(i,5)=d_node(i,5)+extra_source
			extra_source=0.0d0
		endif
		
	enddo
	
	
	
 end subroutine generate_pod
 !===================================
end module growthmod