incomp-flame-post/code/m_terms.f90
2019-07-07 18:22:05 +09:00

259 lines
5.2 KiB
Fortran

module m_terms
use m_openmpi
use m_parameters
use m_arrays
use m_calculate
implicit none
logical, parameter :: pass2_required=.false.
character (len = *), parameter :: output_header="x avg_c avg_divn avg_fsd"
real*8, allocatable, dimension(:) :: avg_c
real*8, allocatable, dimension(:) :: avg_fsd
real*8, allocatable, dimension(:) :: avg_divn
! field exporter common
integer(kind=MPI_OFFSET_KIND) :: offset
! - file_handles and mpi_infos
! integer(kind=MPI_INTEGER_KIND) :: {field_name}_fh
! integer(kind=MPI_INTEGER_KIND) :: {field_name}_info
! - buffer
! real*8, allocatable, dimension(:,:,:) :: {field_name}_export_array
real*8, allocatable, dimension(:,:,:) :: xyzbuffer0
real*8, allocatable, dimension(:,:,:) :: xyzbuffer1
real*8, allocatable, dimension(:,:,:) :: xyzbuffer2
real*8, allocatable, dimension(:,:,:) :: xyzbuffer3
real*8, allocatable, dimension(:,:,:) :: xyzbuffer4
contains
subroutine m_terms_init
integer :: ierr
allocate(avg_c(nxp), stat=ierr) ; avg_c = 0.
allocate(avg_fsd(nxp), stat=ierr) ; avg_fsd = 0.
allocate(avg_divn(nxp), stat=ierr) ; avg_divn = 0.
! init
! call MPI_INFO_CREATE({field_name}_info, mpi_err)
! call MPI_FILE_OPEN(MPI_COMM_TASK,{field_name}_fname,MPI_MODE_WRONLY+MPI_MODE_CREATE,{field_name}_info,{field_name}_fh,mpi_err)
! allocate({field_name}_export_array({1}), stat=ierr) ; {field_name}_export_array = 0.
allocate(xyzbuffer0(nxp,nyp,nzp), stat=ierr) ; xyzbuffer0 = 0.
allocate(xyzbuffer1(nxp,nyp,nzp), stat=ierr) ; xyzbuffer1 = 0.
allocate(xyzbuffer2(nxp,nyp,nzp), stat=ierr) ; xyzbuffer2 = 0.
allocate(xyzbuffer3(nxp,nyp,nzp), stat=ierr) ; xyzbuffer3 = 0.
allocate(xyzbuffer4(nxp,nyp,nzp), stat=ierr) ; xyzbuffer4 = 0.
end subroutine m_terms_init
subroutine m_terms_finalize
deallocate(avg_c)
deallocate(avg_fsd)
deallocate(avg_divn)
! finalize
! call MPI_FILE_CLOSE({field_name}_fh, mpi_err)
! call MPI_INFO_FREE({field_name}_info, mpi_err)
! deallocate({field_name}_export_array)
deallocate(xyzbuffer0)
deallocate(xyzbuffer1)
deallocate(xyzbuffer2)
deallocate(xyzbuffer3)
deallocate(xyzbuffer4)
end subroutine m_terms_finalize
subroutine m_terms_calculate_pass1
integer :: i, j, k
! ( 1.0 - y(i,j,k) )
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
xyzbuffer3(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(i) = avg_c(i) + xyzbuffer3(i,j,k)
end do
end do
end do
call ddx ( xyzbuffer2, xyzbuffer3 )
call ddy ( xyzbuffer1, xyzbuffer3 )
call ddz ( xyzbuffer0, xyzbuffer3 )
! ( sqrt ( ( ( ((ddx_c(i,j,k))*(ddx_c(i,j,k))) + ((ddy_c(i,j,k))*(ddy_c(i,j,k))) ) + ((ddz_c(i,j,k))*(ddz_c(i,j,k))) ) ) )
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
xyzbuffer3(i,j,k) = ( sqrt ( ( ( ((xyzbuffer2(i,j,k))*(xyzbuffer2(i,j,k))) + ((xyzbuffer1(i,j,k))*(xyzbuffer1(i,j,k))) ) + ((xyzbuffer0(i,j,k))*(xyzbuffer0(i,j,k))) ) ) )
end do
end do
end do
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
avg_fsd(i) = avg_fsd(i) + xyzbuffer3(i,j,k)
end do
end do
end do
! ( ( - ddx_c(i,j,k) ) / fsd(i,j,k) )
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
xyzbuffer4(i,j,k) = ( ( - xyzbuffer2(i,j,k) ) / xyzbuffer3(i,j,k) )
end do
end do
end do
call ddx ( xyzbuffer2, xyzbuffer4 )
! ( ( - ddy_c(i,j,k) ) / fsd(i,j,k) )
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
xyzbuffer4(i,j,k) = ( ( - xyzbuffer1(i,j,k) ) / xyzbuffer3(i,j,k) )
end do
end do
end do
! ( ( - ddz_c(i,j,k) ) / fsd(i,j,k) )
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
xyzbuffer1(i,j,k) = ( ( - xyzbuffer0(i,j,k) ) / xyzbuffer3(i,j,k) )
end do
end do
end do
call ddy ( xyzbuffer3, xyzbuffer4 )
call ddz ( xyzbuffer0, xyzbuffer1 )
! ( ( ddx_nx(i,j,k) + ddy_ny(i,j,k) ) + ddz_nz(i,j,k) )
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
xyzbuffer4(i,j,k) = ( ( xyzbuffer2(i,j,k) + xyzbuffer3(i,j,k) ) + xyzbuffer0(i,j,k) )
end do
end do
end do
! copy to array for export
! do k = 1, nzp
! do j = 1, nyp
! do i = {}, {}
! {}(i,j,k) = {}(i,j,k)
! end do
! end do
! end do
! after calculate
! count = {x1-x0+1} * ny * nz
! offset = time_count * count
! call MPI_FILE_WRITE_AT({field_name}_fh, offset, {field_name}_export_buffer, count, MPI_REAL8, mpi_status, mpi_err)
do k = 1, nzp
do j = 1, nyp
do i = 1, nxp
avg_divn(i) = avg_divn(i) + xyzbuffer4(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)
call MPI_ALLREDUCE(MPI_IN_PLACE, avg_c, nxp, MPI_REAL8, MPI_SUM, MPI_COMM_TASK, mpi_err)
avg_c = avg_c / denum
call MPI_ALLREDUCE(MPI_IN_PLACE, avg_divn, nxp, MPI_REAL8, MPI_SUM, MPI_COMM_TASK, mpi_err)
avg_divn = avg_divn / denum
call MPI_ALLREDUCE(MPI_IN_PLACE, avg_fsd, nxp, MPI_REAL8, MPI_SUM, MPI_COMM_TASK, mpi_err)
avg_fsd = avg_fsd / denum
end subroutine m_terms_average_pass1
subroutine m_terms_calculate_pass2
integer :: i, j, k
end subroutine m_terms_calculate_pass2
subroutine m_terms_average_pass2 (nfiles)
integer :: nfiles
real*8 :: denum
denum=real(nfiles*nyp*nzp)
end subroutine m_terms_average_pass2
subroutine m_terms_write_result
integer :: i
open (200, file="qEdge_X.dat")
write (200,*) output_header
do i=1,nxp
write (200,'(4e20.10)') real(i)*hxp, avg_c(i), avg_divn(i), avg_fsd(i)
end do
close (200)
end subroutine m_terms_write_result
end module m_terms