Печать в файл на Фортране внезапно останавливается при условии if - PullRequest
0 голосов
/ 27 декабря 2018

В настоящее время я пытаюсь записать файл Fortran 77, который записывает 2000000 значений в левый столбец файла.Код ниже:

    program signal

    integer dtq, dtb, dtt, mdotb, i, mdot
    real*4 mdotq, mdott, nmdott

    mdotb = 1       !burst phase
    mdotq = 0.001   !quiescent phase
    dtb = 100       !time for burst phase
    dtq = 1080      !time for quiescent phase
    dtt = 200       !transition time
    t = 0           !start time
    dt = 10         !time step
    n = 2000000     !interval
    t_startb = 0    !start of the range

    open(unit=1, file='accretion.txt',status='unknown')

    do i = 1, n

     dt_start = t-t_start
     t = t + dt
     mdott = ((0.999/200)*t) + 0.505
     nmdott = ((-0.999/200)*t) + 0.505

     if (dt_start .lt. dtb) then

      write(1,*) t, mdotb

     else if (dt_start .lt. dtt) then

      write(1,*) t, nmdott

     else if (dt_start .lt. dtq) then

      write(1,*) t, mdotq

     else if (dt_start .lt. dtt) then

      write(1,*) t, mdott

     endif

    enddo

    close(1)

    end

Это печатает только цифры до 1080, так что если останавливается на третьем условном выражении, что не имеет большого смысла для меня.Нужно ли писать метку в начале цикла, чтобы он снова запустился?Или есть синтаксис, который я сделал неправильно?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Помимо некоторых синтаксических ошибок (например, строки, которая говорит только t_start, что не является допустимым Fortran) и некоторых других комментариев, присутствующих в других ответах и ​​комментариях (отсутствие implicit none, нестандартное объявление вида),есть проблема в логике ваших условных выражений.

Предположим, что цикл do достиг итерации, в которой dt_start=1090, что происходит потом?

! dtb = 100, so this branch is skipped
if (dt_start .lt. dtb) then
  write(1,*) t, mdotb

! dtt = 200, so this branch is skipped
else if (dt_start .lt. dtt) then
  write(1,*) t, nmdott

! dtt = 200, so this branch is skipped (and it's repeated, by the way)
else if (dt_start .lt. dtt) then
  write(1,*) t, nmdott

! dtq = 1080, so this branch is skipped ALSO
else if (dt_start .lt. dtq) then
  write(1,*) t, mdotq

! dtt = 200, so this branch is skipped (repeated, AGAIN!)
else if (dt_start .lt. dtt) then
  write(1,*) t, mdott

endif
! nothing was done this iteration, continue to the next

Итак, ваш do цикл действительно работает до n=2000000, но ничего не делает после dt_start=1090.Пожалуйста, не торопитесь, чтобы переосмыслить логику вашего кода, а также устранить недостатки, указанные здесь.

0 голосов
/ 27 декабря 2018

Как и предлагали люди, используйте оператор implicit none сразу после program signal.Вы можете найти больше информации здесь .Я знаю, что в Фортране отсутствует IDE для снижения, поэтому проверьте ваш код дважды, прежде чем обращаться за помощью.Только при быстром взгляде я вижу дублированный оператор if и опечатку.

Правка: используйте лучшие условия в операторах if.Прямо сейчас есть случаи, когда многие из них верны одновременно.Попробуйте что-то вроде if (x .lt. y .and. x.ge.z) then

...