incomp-flame-post/code/m_terms.f90
2019-04-29 06:11:07 +09:00

349 lines
6.7 KiB
Fortran

module m_terms
use m_parameters
use m_arrays
use m_calculate
implicit none
real*8, allocatable, dimension(:) :: fsd_auto_avg_u
real*8, allocatable, dimension(:,:,:) :: fsd_auto
real*8, allocatable, dimension(:) :: avg_c_auto
real*8, allocatable, dimension(:,:,:) :: ddz_c_auto
real*8, allocatable, dimension(:,:,:) :: tflux_y
real*8, allocatable, dimension(:) :: c_auto_avg_w
real*8, allocatable, dimension(:) :: c_auto_avg_v
real*8, allocatable, dimension(:) :: c_auto_avg_u
real*8, allocatable, dimension(:) :: y_avg_w
real*8, allocatable, dimension(:) :: avg_fsd_auto
real*8, allocatable, dimension(:) :: y_avg_v
real*8, allocatable, dimension(:,:,:) :: c_auto
real*8, allocatable, dimension(:) :: y_avg_u
real*8, allocatable, dimension(:,:,:) :: ddy_c_auto
real*8, allocatable, dimension(:) :: y_avg_c_auto
real*8, allocatable, dimension(:) :: avg_u
real*8, allocatable, dimension(:) :: avg_v
real*8, allocatable, dimension(:) :: avg_w
real*8, allocatable, dimension(:) :: avg_y
real*8, allocatable, dimension(:,:,:) :: tflux_
real*8, allocatable, dimension(:) :: y_avg_tflux
real*8, allocatable, dimension(:,:,:) :: ddx_c_auto
real*8, allocatable, dimension(:) :: avg_tflux
contains
subroutine m_terms_init
integer :: ierr
allocate(fsd_auto_avg_u(nxp), stat=ierr) ; fsd_auto_avg_u = 0.
allocate(fsd_auto(nxp,nyp,nzp), stat=ierr) ; fsd_auto = 0.
allocate(avg_c_auto(nxp), stat=ierr) ; avg_c_auto = 0.
allocate(ddz_c_auto(nxp,nyp,nzp), stat=ierr) ; ddz_c_auto = 0.
allocate(tflux_y(nxp,nyp,nzp), stat=ierr) ; tflux_y = 0.
allocate(c_auto_avg_w(nxp), stat=ierr) ; c_auto_avg_w = 0.
allocate(c_auto_avg_v(nxp), stat=ierr) ; c_auto_avg_v = 0.
allocate(c_auto_avg_u(nxp), stat=ierr) ; c_auto_avg_u = 0.
allocate(y_avg_w(nxp), stat=ierr) ; y_avg_w = 0.
allocate(avg_fsd_auto(nxp), stat=ierr) ; avg_fsd_auto = 0.
allocate(y_avg_v(nxp), stat=ierr) ; y_avg_v = 0.
allocate(c_auto(nxp,nyp,nzp), stat=ierr) ; c_auto = 0.
allocate(y_avg_u(nxp), stat=ierr) ; y_avg_u = 0.
allocate(ddy_c_auto(nxp,nyp,nzp), stat=ierr) ; ddy_c_auto = 0.
allocate(y_avg_c_auto(nxp), stat=ierr) ; y_avg_c_auto = 0.
allocate(avg_u(nxp), stat=ierr) ; avg_u = 0.
allocate(avg_v(nxp), stat=ierr) ; avg_v = 0.
allocate(avg_w(nxp), stat=ierr) ; avg_w = 0.
allocate(avg_y(nxp), stat=ierr) ; avg_y = 0.
allocate(tflux_(nxp,nyp,nzp), stat=ierr) ; tflux_ = 0.
allocate(y_avg_tflux(nxp), stat=ierr) ; y_avg_tflux = 0.
allocate(ddx_c_auto(nxp,nyp,nzp), stat=ierr) ; ddx_c_auto = 0.
allocate(avg_tflux(nxp), stat=ierr) ; avg_tflux = 0.
end subroutine m_terms_init
subroutine m_terms_finalize
deallocate(fsd_auto_avg_u)
deallocate(fsd_auto)
deallocate(avg_c_auto)
deallocate(ddz_c_auto)
deallocate(tflux_y)
deallocate(c_auto_avg_w)
deallocate(c_auto_avg_v)
deallocate(c_auto_avg_u)
deallocate(y_avg_w)
deallocate(avg_fsd_auto)
deallocate(y_avg_v)
deallocate(c_auto)
deallocate(y_avg_u)
deallocate(ddy_c_auto)
deallocate(y_avg_c_auto)
deallocate(avg_u)
deallocate(avg_v)
deallocate(avg_w)
deallocate(avg_y)
deallocate(tflux_)
deallocate(y_avg_tflux)
deallocate(ddx_c_auto)
deallocate(avg_tflux)
end subroutine m_terms_finalize
subroutine m_terms_calculate_pass1
integer :: i, j, k
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
y_avg_w(i) = y_avg_w(i) + w(i,j,k) * y(i,j,k)
end do
end do
end do
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
y_avg_v(i) = y_avg_v(i) + v(i,j,k) * y(i,j,k)
end do
end do
end do
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
c_auto(i,j,k) = ( 1.0 - y(i,j,k) )
end do
end do
end do
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
avg_c_auto(i) = avg_c_auto(i) + c_auto(i,j,k)
end do
end do
end do
call ddz ( ddz_c_auto, c_auto )
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
c_auto_avg_w(i) = c_auto_avg_w(i) + w(i,j,k) * c_auto(i,j,k)
end do
end do
end do
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
c_auto_avg_v(i) = c_auto_avg_v(i) + v(i,j,k) * c_auto(i,j,k)
end do
end do
end do
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
c_auto_avg_u(i) = c_auto_avg_u(i) + u(i,j,k) * c_auto(i,j,k)
end do
end do
end do
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
y_avg_u(i) = y_avg_u(i) + u(i,j,k) * y(i,j,k)
end do
end do
end do
call ddy ( ddy_c_auto, c_auto )
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
y_avg_c_auto(i) = y_avg_c_auto(i) + c_auto(i,j,k) * y(i,j,k)
end do
end do
end do
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
avg_u(i) = avg_u(i) + u(i,j,k)
end do
end do
end do
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
avg_v(i) = avg_v(i) + v(i,j,k)
end do
end do
end do
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
avg_w(i) = avg_w(i) + w(i,j,k)
end do
end do
end do
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
avg_y(i) = avg_y(i) + y(i,j,k)
end do
end do
end do
call ddx ( ddx_c_auto, c_auto )
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
fsd_auto(i,j,k) = ( sqrt ( ( ( ((ddx_c_auto(i,j,k))*(ddx_c_auto(i,j,k))) + ((ddy_c_auto(i,j,k))*(ddy_c_auto(i,j,k))) ) + ((ddz_c_auto(i,j,k))*(ddz_c_auto(i,j,k))) ) ) )
end do
end do
end do
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
fsd_auto_avg_u(i) = fsd_auto_avg_u(i) + u(i,j,k) * fsd_auto(i,j,k)
end do
end do
end do
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
avg_fsd_auto(i) = avg_fsd_auto(i) + fsd_auto(i,j,k)
end do
end do
end do
end subroutine m_terms_calculate_pass1
subroutine m_terms_average_pass1 (nfiles)
integer :: nfiles
real*8 :: denum
denum=real(nfiles*nyp*nzp)
avg_u = avg_u / denum
avg_v = avg_v / denum
avg_w = avg_w / denum
avg_c_auto = avg_c_auto / denum
avg_y = avg_y / denum
avg_fsd_auto = avg_fsd_auto / denum
c_auto_avg_u = c_auto_avg_u / denum / avg_c_auto
c_auto_avg_v = c_auto_avg_v / denum / avg_c_auto
c_auto_avg_w = c_auto_avg_w / denum / avg_c_auto
y_avg_u = y_avg_u / denum / avg_y
y_avg_v = y_avg_v / denum / avg_y
y_avg_w = y_avg_w / denum / avg_y
y_avg_c_auto = y_avg_c_auto / denum / avg_y
fsd_auto_avg_u = fsd_auto_avg_u / denum / avg_fsd_auto
end subroutine m_terms_average_pass1
subroutine m_terms_calculate_pass2
integer :: i, j, k
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
c_auto(i,j,k) = ( 1.0 - y(i,j,k) )
end do
end do
end do
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
tflux_(i,j,k) = ( (u(i,j,k) - avg_u(i)) * (c_auto(i,j,k) - avg_c_auto(i)) )
end do
end do
end do
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
avg_tflux(i) = avg_tflux(i) + tflux_(i,j,k)
end do
end do
end do
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
tflux_y(i,j,k) = ( (u(i,j,k) - y_avg_u(i)) * (c_auto(i,j,k) - y_avg_c_auto(i)) )
end do
end do
end do
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
y_avg_tflux(i) = y_avg_tflux(i) + tflux_y(i,j,k) * y(i,j,k)
end do
end do
end do
end subroutine m_terms_calculate_pass2
subroutine m_terms_average_pass2 (nfiles)
integer :: nfiles
real*8 :: denum
denum=real(nfiles*nyp*nzp)
avg_tflux = avg_tflux / denum
y_avg_tflux = y_avg_tflux / denum / avg_y
end subroutine m_terms_average_pass2
end module m_terms