259 lines
5.2 KiB
Fortran
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) :: divn_fh
|
|
integer(kind=MPI_INTEGER_KIND) :: divn_info
|
|
|
|
! - buffer
|
|
real*8, allocatable, dimension(:,:,:) :: divn_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(divn_info, mpi_err)
|
|
call MPI_FILE_OPEN(MPI_COMM_TASK,'divn-export.dat',MPI_MODE_WRONLY+MPI_MODE_CREATE,divn_info,divn_fh,mpi_err)
|
|
allocate(divn_export_array(176:400,1:nyp,1:nzp), stat=ierr) ; divn_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(divn_fh, mpi_err)
|
|
call MPI_INFO_FREE(divn_info, mpi_err)
|
|
deallocate(divn_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 = {x_start}, {x_end}
|
|
! {field_name}_export_array(i,j,k) = {work_array}(i,j,k)
|
|
! end do
|
|
! end do
|
|
! end do
|
|
|
|
! write to file
|
|
! count = ({xe} - {xs} + 1) * ({ye} - {ys} + 1) * ({ze} - {zs} + 1)
|
|
! offset = {itime} * count
|
|
! call MPI_FILE_WRITE_AT({field_name}_fh, offset, {field_name}_export_array, 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
|
|
|