incomp-flame-post/code/post.f90
2019-07-07 00:11:10 +09:00

342 lines
8.5 KiB
Fortran

MODULE post
USE Compact
USE m_parameters
USE m_calculate
USE m_arrays
USE m_terms
IMPLICIT NONE
PRIVATE
INTEGER :: countnum
INTEGER :: nprogress
INTEGER :: num_, dummyu_ ! hybrid
REAL :: tnow
REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: old_scalar, new_scalar
PUBLIC :: main, main_lb
CONTAINS
SUBROUTINE main
INTEGER :: fread,i
CALL READ_INTRO
CALL ALLOCATE_ARRAYS
if (iammaster) CALL PRINT_BANNER
countnum=0
firstloop: DO fread=startnum,endnum,skipnum
IF ( to_omit(fread) ) THEN
WRITE(*,'(a47,i7,a4,i5,a3,i5)') &
' Current fullsavenum = ', fread, ' || ', (fread-startnum+1), ' / ', (endnum-startnum+1)
WRITE(*,'(a12,i6,a20,i6)') &
' Skip. ', omit_t(i,1), ' <= fullsavenum <= ', omit_t(i,2)
ELSE
countnum=countnum+1
IF (file_dist(fread).eq.myid) THEN
CALL READ_FILE(fread)
CALL m_terms_calculate_pass1
END IF
ENDIF
ENDDO firstloop
write(*,*) '1st loop finished'
CALL m_terms_average_pass1(countnum)
optional_pass2: IF ( pass2_required ) THEN
secondloop: DO fread=startnum,endnum,skipnum
IF ( to_omit(fread) ) THEN
WRITE(*,'(a40,i7,a4,i4,a3,i4)') &
' Current fullsavenum = ', fread, ' || ', (fread-startnum+1), ' / ', (endnum-startnum+1)
WRITE(*,'(a12,i6,a20,i6)') &
' Skip. ', omit_t(i,1), ' <= fullsavenum <= ', omit_t(i,2)
ELSE
IF (file_dist(fread).eq.myid) THEN
CALL READ_FILE(fread)
CALL m_terms_calculate_pass2
ENDIF
ENDIF
ENDDO secondloop
CALL m_terms_average_pass2(countnum)
ENDIF optional_pass2
if (iammaster) then
CALL m_terms_write_result
WRITE(*,*) ' Avergaing RAW data is FINISHED'
WRITE(*,*) 'qEdge_X.dat is generated'
end if
CALL DEALLOCATES_CLOSE
END SUBROUTINE main
SUBROUTINE main_lb
INTEGER :: fread,i
INTEGER, PARAMETER :: eofread = -1
CALL READ_INTRO
CALL ALLOCATE_ARRAYS
if (iammaster) CALL PRINT_BANNER
! PASS 1
tag = 1
countnum = 0
nprogress = 0
if (iammaster) then
dispatchloop1: DO fread=startnum,endnum,skipnum
IF ( to_omit(fread) ) THEN
WRITE(*,'(a47,i7,a4,i5,a3,i5)') &
' Current fullsavenum = ', fread, ' || ', (fread-startnum+1), ' / ', (endnum-startnum+1)
WRITE(*,'(a12,i6,a20,i6)') &
' Skip. ', omit_t(i,1), ' <= fullsavenum <= ', omit_t(i,2)
ELSE
countnum=countnum+1
CALL MPI_RECV(id_to, 1, MPI_INTEGER, MPI_ANY_SOURCE, tag, MPI_COMM_TASK, mpi_status, mpi_err)
CALL MPI_SEND(fread, 1, MPI_INTEGER8, id_to, tag, MPI_COMM_TASK, mpi_err)
ENDIF
ENDDO dispatchloop1
end_of_dispatch1: DO i=1,numprocs-1
CALL MPI_RECV(id_to, 1, MPI_INTEGER, MPI_ANY_SOURCE, tag, MPI_COMM_TASK, mpi_status, mpi_err)
CALL MPI_SEND(eofread, 1, MPI_INTEGER8, id_to, tag, MPI_COMM_TASK, mpi_err)
ENDDO end_of_dispatch1
else ! slave
fetchloop1: do
CALL MPI_SEND(myid, 1, MPI_INTEGER, master, tag, MPI_COMM_TASK, mpi_err)
CALL MPI_RECV(fread, 1, MPI_INTEGER8, master, tag, MPI_COMM_TASK, mpi_status, mpi_err)
if (fread < 0) exit
nprogress = nprogress + 1
CALL READ_FILE(fread)
CALL m_terms_calculate_pass1
end do fetchloop1
end if
CALL MPI_BCAST(countnum, 1, MPI_INTEGER8, master, MPI_COMM_TASK, mpi_err)
CALL m_terms_average_pass1(countnum)
if (iammaster) write(*,*) '1st loop finished'
! PASS 2
optional_pass2: IF ( pass2_required ) THEN
tag = 2
nprogress = 0
if (iammaster) then
dispatchloop2: DO fread=startnum,endnum,skipnum
IF ( to_omit(fread) ) THEN
WRITE(*,'(a40,i7,a4,i4,a3,i4)') &
' Current fullsavenum = ', fread, ' || ', (fread-startnum+1), ' / ', (endnum-startnum+1)
WRITE(*,'(a12,i6,a20,i6)') &
' Skip. ', omit_t(i,1), ' <= fullsavenum <= ', omit_t(i,2)
ELSE
CALL MPI_RECV(id_to, 1, MPI_INTEGER, MPI_ANY_SOURCE, tag, MPI_COMM_TASK, mpi_status, mpi_err)
CALL MPI_SEND(fread, 1, MPI_INTEGER8, id_to, tag, MPI_COMM_TASK, mpi_err)
ENDIF
ENDDO dispatchloop2
end_of_dispatch2: DO i=1,numprocs-1
CALL MPI_RECV(id_to, 1, MPI_INTEGER, MPI_ANY_SOURCE, tag, MPI_COMM_TASK, mpi_status, mpi_err)
CALL MPI_SEND(eofread, 1, MPI_INTEGER8, id_to, tag, MPI_COMM_TASK, mpi_err)
ENDDO end_of_dispatch2
else ! slave
fetchloop2: do
CALL MPI_SEND(myid, 1, MPI_INTEGER, master, tag, MPI_COMM_TASK, mpi_err)
CALL MPI_RECV(fread, 1, MPI_INTEGER8, master, tag, MPI_COMM_TASK, mpi_status, mpi_err)
if (fread < 0) exit
nprogress = nprogress + 1
CALL READ_FILE(fread)
CALL m_terms_calculate_pass2
end do fetchloop2
end if
CALL m_terms_average_pass2(countnum)
ENDIF optional_pass2
if (iammaster) then
CALL m_terms_write_result
WRITE(*,*) ' Avergaing RAW data is FINISHED'
WRITE(*,*) 'qEdge_X.dat is generated'
end if
CALL DEALLOCATES_CLOSE
END SUBROUTINE main_lb
!========================================================================================
! End of main routine
!========================================================================================
SUBROUTINE PRINT_BANNER
WRITE(*,*) ' This program, x-edge-cold-bc-5-hybrid, is written by D. Kim, 2018'
WRITE(*,*) ' It is to study the statistics of the flame parameters at the leading edge'
WRITE(*,*) ' in turbulent premixed flames.'
WRITE(*,'(a40,i5,a11,i5,a1)') ' Postprocess will be done from "FORT.',startnum,'" to "FORT.',endnum,'"'
END SUBROUTINE PRINT_BANNER
SUBROUTINE READ_FILE(num)
INTEGER, INTENT(IN) :: num
REAL, DIMENSION(2) :: tmpr
INTEGER :: nx, ny, nz
REAL :: tmp1,tmp2
REAL :: dt,dummyu
INTEGER :: ncyc
OPEN(num,FORM='unformatted',STATUS='unknown')
READ (num) tnow,nx,ny,nz,tmp1,tmp2
IF ((nx .ne. nxp) .or. (ny .ne. nyp) .or. (nz .ne. nzp)) THEN
WRITE(0,*) "Array dimension mismatch", nx, ny, nz, " != ", nxp, nyp, nzp
STOP -1
ENDIF
READ (num) ncyc,dt,dummyu
READ (num) tmpr(1:2)
READ (num) tmpr(1:2)
READ (num) tmpr(1:2)
WRITE(*,'(a4,i3,a40,f8.3,a2,i7,a2,i5,a4,i5,a3,i5)') ' p ', myid, ': time / NCYC / fullsavenum = ',tnow,&
' /',ncyc,' /',num,' || ',(num-startnum+1),' / ',(endnum-startnum+1)
WRITE(*,*) ' Reading current data file and processing'
WRITE(*,'(a10,i3,a10,i5,a10)') 'processor ', myid, ' processed ', nprogress, ' files'
num_=num
IF(num.le.shiftnum) THEN
WRITE(*,*) ' with an old fort data from Nueman-0X'
READ (num) u,v,w,old_scalar
y(:,:,:) = old_scalar(2,:,:,:)
ELSE
WRITE(*,*) ' with a new fort data from Comb-Cluster'
READ (num) u,v,w,new_scalar
u = u + dummyu
y = new_scalar(:,:,:,2)
ENDIF
CLOSE (num)
END SUBROUTINE READ_FILE
SUBROUTINE ALLOCATE_ARRAYS
INTEGER :: ierr
CALL m_arrays_init
CALL m_calculate_init
CALL m_terms_init
ALLOCATE(old_scalar(2,nxp,nyp,nzp),STAT=ierr) ; old_scalar=0. ! Main variables
ALLOCATE(new_scalar(nxp,nyp,nzp,2),STAT=ierr) ; new_scalar=0.
WRITE(*,'(a6,i3,a8,i3,a8,i3)') ' NX = ',nxp,' / NY = ',nyp,' / NZ = ',nzp
WRITE(*,*) ' Preparing memory space for COMPACT SCHEME'
! CALL ludcmp(nxp,nyp,nzp,1,0,0) ! 1,1,0
WRITE(*,'(a22,i3,a3,i3,a4,i3)') ' Grid number range : ',syp,' ~ ',eyp,' of ',nyp
WRITE(*,*)
END SUBROUTINE ALLOCATE_ARRAYS
SUBROUTINE DEALLOCATES_CLOSE
CALL m_arrays_finalize
CALL m_calculate_finalize
CALL m_terms_finalize
DEALLOCATE(old_scalar)
DEALLOCATE(new_scalar)
IF(omitnum.gt.0) DEALLOCATE(omit_t)
DEALLOCATE(file_dist)
END SUBROUTINE DEALLOCATES_CLOSE
END MODULE post