Почему Фортран пишет в fort.x? - PullRequest
1 голос
/ 05 мая 2020

Я выполняю 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
!========================================================================================!
...