Выпуск печати различных значений в определенных диапазонах - PullRequest
0 голосов
/ 15 января 2019

Я использую код Фортрана, который должен писать от 1 до 2000000 в левом столбце и в диапазоне 1 - 0,001 в правом столбце, основное тело кода ниже:

program signal
implicit none

integer dt_start, dtq, dtb, dtt, mdotb, i, mdot, t_start, n, dt, t
real*8 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       !initial time
dt = 10     !time step
n = 2000000 !interval
t_start = 0 !start of the range

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

do i = 1, n

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

 if (dt_start .le. dtb) then

  if (dt_start .eq. dtb) then
   t_start = i*dtb
  endif
      write(1,*) t, mdotb

 else if (dt_start .le. dtt) then

  if (dt_start .eq. dtt) then
   t_start = i*dtt
  endif
      write(1,*) t, nmdott

 else if (dt_start .le. dtq) then

  if (dt_start .eq. dtq) then
   t_start = i*dtq
  endif
      write(1,*) t, mdotq

 else if (dt_start .le. dtt) then

  if (dt_start .eq. dtt) then
   t_start = i*dtt
  endif
  write(1,*) t, mdott

 endif

enddo

close(1)

end

Выводит следующие результаты:

      10           1
      20           1
      30           1
      40           1
      50           1
      60           1
      70           1
      80           1
      90           1
     100           1
     110           1
     120           1
     130           1
     140           1
     150           1
     160           1
     170           1
     180           1
     190           1
     200           1
     210           1
     220           1
     230           1
     240           1
     250           1
     260           1
     270           1
     280           1
     290           1
     300           1

и так продолжается до 2000000. Я не понимаю, что я сделал не так с кодом, думаю, мне может понадобиться просто перезапустить в определенные моменты времени или что-то еще?

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Или ОП хочет ...

"запись (, ) т, mdott"

или

"Записать (, ) t, mdotb! Но сначала установите mdotb, чтобы оно не было 1"

Или

"Написать (, ) I, т!?

0 голосов
/ 15 января 2019

Посмотрите на себя с этой точки зрения:

integer t = 0 
integer t_start = 0
integer dt = 10
integer dtb = 100
integer n = 2000000
integer mdotb = 1
! (...)

do i = 1, n
  t = t + dt
  dt_start = t-t_start           ! <- (*)
  ! (...)

  if (dt_start .le. dtb) then    ! <- condition (A)
    if (dt_start .eq. dtb) then  ! <- condition (A.1)
      t_start = I*dtb.           ! <- (**) 
    endif
    write(1,*) t, mdotb          ! <- output for branch (A)

  else if                        ! <- other conditions
  ! (...)
  end if
end do

Для первых итераций i = 1, 9 у вас есть условие (A) true и (A.1) false, затем вывод для ветви (A) выполняется, и код печатает t = 10, 90 в первом столбце и mdotb = 1 во втором столбце.

Для итерации i = 10 у вас наконец есть dt_start == dtb, поэтому условие (A) выполняется, а (A.1) также выполняется. Внутри ветви (A.1) вы получаете назначение t_start = 1000 в строке, помеченной как (**). Затем вывод для ветви (A) выполняется снова, и код печатает t = 100 в первом столбце и mdotb = 1 во втором.

Для следующих итераций i = 11, 109, помните, что t_start == 1000 сейчас, поэтому в строке, помеченной как (*), у вас будет dt_start = -890, dt_start = -880 ... до dt_start = 90, где все время условия (A) верно, (A.1) ложно, и вы продолжаете печатать t и mdotb все время.

Достигнув итерации i = 110, наконец, снова dt_start = 100, тогда оба условия (A) и (A.1) снова верны, затем снова выполняется строка (**), затем t_start = 11000 и вывод для ветвь (A) выполняется снова, снова печатая t и mdotb.

Для следующих итераций i = 111, 1109 вы повторяете цикл, в котором dt_start имеет отрицательные / низкие значения, все еще делая условие (A) всегда верным, печатая всегда один и тот же вывод ...

Затем i = 1110 снова делает dt_start = 100, затем t_start = 111000 сейчас, тот же вывод ...

И этот шаблон повторяется снова и снова, в то время как ваш вывод для ветви (A) всегда выполняется, а остальные условия никогда не будут достигнуты.

Очевидно, что логика вашей программы несовершенна (ну, технически она находится в диапазоне 0,001 ~ 1, как всегда 1 ... но вам это не нравится). Но я не знаю, что вы пытаетесь напечатать во втором столбце вывода. Я точно знаю, что если вы хотите от 1 до 2000000 в первом столбце, вы должны напечатать I вместо t.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...