- enable export save - improve term comment with lval name - add export offset array - pass file index to calculation subroutine - bugfix: - get array name after allocation - multiply offset by 8 to be size in Byte
329 lines
6.9 KiB
Fortran
329 lines
6.9 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
|
|
|
|
|
|
! - file_handles and mpi_infos
|
|
integer(kind=MPI_INTEGER_KIND) :: c_fh
|
|
integer(kind=MPI_INTEGER_KIND) :: c_info
|
|
|
|
! - buffer
|
|
real*8, allocatable, dimension(:,:,:) :: c_export_array
|
|
|
|
|
|
! - file_handles and mpi_infos
|
|
integer(kind=MPI_INTEGER_KIND) :: fsd_fh
|
|
integer(kind=MPI_INTEGER_KIND) :: fsd_info
|
|
|
|
! - buffer
|
|
real*8, allocatable, dimension(:,:,:) :: fsd_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,'export-divn.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.
|
|
|
|
|
|
! init
|
|
call MPI_INFO_CREATE(c_info, mpi_err)
|
|
call MPI_FILE_OPEN(MPI_COMM_TASK,'export-c.dat',MPI_MODE_WRONLY+MPI_MODE_CREATE,c_info,c_fh,mpi_err)
|
|
allocate(c_export_array(176:400,1:nyp,1:nzp), stat=ierr) ; c_export_array = 0.
|
|
|
|
|
|
! init
|
|
call MPI_INFO_CREATE(fsd_info, mpi_err)
|
|
call MPI_FILE_OPEN(MPI_COMM_TASK,'export-fsd.dat',MPI_MODE_WRONLY+MPI_MODE_CREATE,fsd_info,fsd_fh,mpi_err)
|
|
allocate(fsd_export_array(176:400,1:nyp,1:nzp), stat=ierr) ; fsd_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)
|
|
|
|
|
|
! finalize
|
|
call MPI_FILE_CLOSE(c_fh, mpi_err)
|
|
call MPI_INFO_FREE(c_info, mpi_err)
|
|
deallocate(c_export_array)
|
|
|
|
|
|
! finalize
|
|
call MPI_FILE_CLOSE(fsd_fh, mpi_err)
|
|
call MPI_INFO_FREE(fsd_info, mpi_err)
|
|
deallocate(fsd_export_array)
|
|
|
|
deallocate(xyzbuffer0)
|
|
deallocate(xyzbuffer1)
|
|
deallocate(xyzbuffer2)
|
|
deallocate(xyzbuffer3)
|
|
deallocate(xyzbuffer4)
|
|
|
|
end subroutine m_terms_finalize
|
|
|
|
|
|
subroutine m_terms_calculate_pass1(fidx)
|
|
|
|
integer :: fidx
|
|
integer :: i, j, k
|
|
|
|
|
|
! c = ( 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
|
|
|
|
! copy to array for export
|
|
do k = 1, nzp
|
|
do j = 1, nyp
|
|
do i = 176, 400
|
|
c_export_array(i,j,k) = xyzbuffer3(i,j,k)
|
|
end do
|
|
end do
|
|
end do
|
|
|
|
! write to file
|
|
count = (400 - 176 + 1) * (nyp - 1 + 1) * (nzp - 1 + 1)
|
|
offset = export_offset(fidx) * count * 8
|
|
call MPI_FILE_WRITE_AT(c_fh, offset, c_export_array, count, MPI_REAL8, mpi_status, mpi_err)
|
|
|
|
|
|
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 )
|
|
|
|
! fsd = ( 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
|
|
|
|
! copy to array for export
|
|
do k = 1, nzp
|
|
do j = 1, nyp
|
|
do i = 176, 400
|
|
fsd_export_array(i,j,k) = xyzbuffer3(i,j,k)
|
|
end do
|
|
end do
|
|
end do
|
|
|
|
! write to file
|
|
count = (400 - 176 + 1) * (nyp - 1 + 1) * (nzp - 1 + 1)
|
|
offset = export_offset(fidx) * count * 8
|
|
call MPI_FILE_WRITE_AT(fsd_fh, offset, fsd_export_array, count, MPI_REAL8, mpi_status, mpi_err)
|
|
|
|
|
|
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
|
|
|
|
|
|
! nx = ( ( - 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 )
|
|
|
|
! ny = ( ( - 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
|
|
|
|
|
|
! nz = ( ( - 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 )
|
|
|
|
! divn = ( ( 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 = 176, 400
|
|
divn_export_array(i,j,k) = xyzbuffer4(i,j,k)
|
|
end do
|
|
end do
|
|
end do
|
|
|
|
! write to file
|
|
count = (400 - 176 + 1) * (nyp - 1 + 1) * (nzp - 1 + 1)
|
|
offset = export_offset(fidx) * count * 8
|
|
call MPI_FILE_WRITE_AT(divn_fh, offset, divn_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(fidx)
|
|
|
|
integer :: fidx
|
|
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
|
|
|