2017-02-20 3 views
0

Контекст: У меня есть намерение поместить определенную подпрограмму Fortran на некоторые тесты, чтобы увидеть, что с ней не так. Это численное моделирование, и результаты не соответствуют теории. Я использую оператор write для выполнения некоторой простой отладки.Fortran не пишет на экран, пока файл открыт

Проблема: Пока файл открыт в моей основной программе, я не могу ничего писать на экране (так что я не могу проверить, какие вещи в настоящее время неправильно передается определенной цепи подпрограммы и т. д.). Он пишет все отлично, когда я делаю это, прежде чем открывать файл, но не внутри него (после открытия и после его закрытия).

Вот код, который я имею в виду:

WRITE(*,*) 'BLA !<--------------------------------------- 
WRITE(*,*) 'BLA BLA' !<--------------------------------------- 

do p=1,N !open files 
    write(posvel, "(a,i0,a)") "1Dposveldatacomelasticaxy1", p, ".dat" 
    OPEN(unit=p, file=trim(posvel), status="unknown") 
end do 

WRITE(*,*) 'bla' !<--------------------------------------- 

t = tmin 
cont = 0 
do while ((t + dt) < (tmax)) 
    t = t+dt 
    cont = cont+1 
    do i = 1, N 
     forcax(i) = 0.0d0 
     forcay(i) = flagy(i)*gravidade(m(i)) 
     do j = 1, N 
    call coefficients(m(i), m(j), gama_n, k_n) 
      Fx_elastica(j,i) = 0.0d0 
      Fy_elastica(j,i) = 0.0d0 
    Fx_viscosa(j,i) = 0.0d0 
    Fy_viscosa(j,i) = 0.0d0 
    WRITE(*,*) 'inside j loop' !<--------------------------------------- 
      if (i .NE. j) then 
       if ((abs(sqrt(((xold(i)-xold(j))**2)+(yold(i)-yold(j))**2))).LE. (a(i)+a(j))) then 
     WRITE(*,*) 'inside collision' !<--------------------------------------- 
        call forca_elastica(k_n, a(i), a(j), xold(i), xold(j), yold(i), yold(j), Fx_elastica(j,i),& 
     Fy_elastica(j,i)) 

       if (Fx_elastica(j,i) .GT. 0.0d0) then 
         Fx_elastica(i,j) = -Fx_elastica(j,i) 
      WRITE(*,*) 'elastic x is being passed' !<--------------------------------------- 
        end if 
     if (Fy_elastica(j,i) .GT. 0.0d0) then 
          Fy_elastica(i,j) = -Fy_elastica(j,i) 
      WRITE(*,*) 'elastic y is being passed' !<--------------------------------------- 
        end if 


      forcax(i) = forcax(i) + flagex(i)*Fx_elastica(j,i) 
      forcay(i) = forcay(i) + flagey(i)*Fy_elastica(j,i) 
     end do 
     call integracao_Euler_xy (xold(i),xnew(i),vxold(i),vxnew(i),forcax(i),yold(i),ynew(i),vyold(i),vynew(i),forcay(i),m(i)) 

     if (mod (cont,5000).eq. 0) then 
      WRITE(p, *) int(cont/5000), t, xold(i), yold(i), forcax(i), forcay(i) !<--------------------------------------- 

     end if 
    end do 
end do 

do p = 1,N !close files 
    close(unit=p) 
end do 

Просто посмотрите на WRITE заявления. Первые два появляются на экране в порядке. После OPEN файлов, хотя ... Это не так. Операторы WRITE, которые зависят от условий, - это те, которые я хочу видеть, но Fortran - это , даже не, написание тех, которые не зависят от этих условий. Также взгляните на последний оператор WRITE - он пишет в файл без проблем.

Любые идеи о том, как исправить/контур этой проблемы?

Я использую Fortran 90.

+0

Вместо того, что вы используете Fortran 90 (которые вы, вероятно, не использовать в любом случае, или, по крайней мере, компилятор не делает, если не старая устаревшая версия), более полезно знать, какой компилятор вы используете. –

ответ

3

Вы не должны использовать небольшое количество для единичных чисел. Вы выполняете цикл с 1 с шагом 1. Вы почти гарантированно попадете на предварительно подключенные устройства для стандартного вывода и стандартного ввода. Смотрите также Standard input and output units in Fortran 90?

петлю из большего числа, скажем, от 100

+0

Вау, я совсем забыл об этом. Я знаю, что есть что-то о том, что номер единицы по умолчанию для операторов чтения и записи составляет 5 и 6, но не знал, что это вызовет какие-либо проблемы. – DrHAL

+0

Если у вас есть совместимый с Fortran 2008 компилятор, вы также можете использовать синтаксис 'open (newunit = u (p), ...)', где 'u' - целочисленный массив. Таким образом, вы можете автоматически запрашивать «безопасный» номер нового устройства при открытии файла. – jabirali

Смежные вопросы