Я выполняю MPI-параллельное моделирование с помощью кода Fortran 90 и хочу записать некоторую информацию в файл с именем «logBubbles.out». На каждом временном шаге моделирования определенное количество строк должно быть добавлено в указанный c файл. Мой код выглядит так:
open(UNIT=s_IOunitNumber,FILE='./logBubbles.out',STATUS='OLD',POSITION='append',ACTION='WRITE')
write(s_IOunitNumber,*) bubbleindex,' ',this%ptrTime_%t_,' ',interfArea,' ',bubVol
close(s_IOunitNumber)
... где bubbleindex - целое число, а остальные - двойные.
Однако, когда я запускаю симуляцию, только около 50% соответствующие строки добавляются к logBubbles.out
, при этом создается дополнительный файл fort.50
. Он всегда включает только одну строку, которая время от времени меняется. Параметр s_IOunitNumber
равен 50
.
Я пробовал разные вещи, но не могу понять, почему это происходит. Моя команда записи неверна?
Дополнительная информация
Comiler -> mpif90
Environment -> OpenSUSE Leap 15.0
Вся подпрограмма:
!========================================================================================!
subroutine computeInterfacialArea(this,vofb)
type(VOF), intent(in) ::this
type(vofBlock), intent(in) :: vofb
integer :: lbi,ubi,lbj,ubj,lbk,ubk,i,j,k,bubbleindex
real(DP) :: dalphadx, dalphady, dalphadz, deltaS,interfArea,bubVol
character(len=20) :: dirName
bubbleindex=vofb%bn !bn is the global bubble index of the vof block
lbi = 1+lbound(vofb%stx,1) !this value would be 1 too low because the grid indices are x staggered
ubi = ubound(vofb%stx,1) !all the other bounding values are correct
lbj = lbound(vofb%stx,2)
ubj = ubound(vofb%stx,2)
lbk = lbound(vofb%stx,3)
ubk = ubound(vofb%stx,3)
interfArea=0.d0
bubVol=0.d0
do k=lbk,ubk
do j=lbj,ubj
do i=lbi,ubi
dalphadx=(vofb%c(i+1,j,k)-vofb%c(i-1,j,k))/(vofb%dxc(i+1)+vofb%dxc(i)) !central differences for dalpha/dx...
dalphady=(vofb%c(i,j+1,k)-vofb%c(i,j-1,k))/(vofb%dyc(j+1)+vofb%dyc(j)) !...dalpha/dy...
dalphadz=(vofb%c(i,j,k+1)-vofb%c(i,j,k-1))/(vofb%dzc(k+1)+vofb%dzc(k)) !...and dalpha/dz on a collocated grid
deltaS=sqrt(dalphadx*dalphadx+dalphady*dalphady+dalphadz*dalphadz) !deltaS is the magnitude
interfArea=interfArea+vofb%dxf(i)*vofb%dyf(j)*vofb%dzf(k)*deltaS !stepwise Volume integral of deltaS
bubVol=bubVol+vofb%dxf(i)*vofb%dyf(j)*vofb%dzf(k)*vofb%c(i,j,k) !stepwise Volume integral of cvof for volume
end do
end do
end do
open(UNIT=s_IOunitNumber,FILE='./logBubbles.out',&
STATUS='OLD',POSITION='append',ACTION='WRITE')
write(s_IOunitNumber,*) bubbleindex,' ',this%ptrTime_%t_,' ',interfArea,' ',bubVol
close(s_IOunitNumber)
end subroutine
!========================================================================================!