Проблема фортрана - PullRequest
       11

Проблема фортрана

1 голос
/ 07 декабря 2008

нужна помощь в Фортране ...

Это основной цикл программы ..

do iStep=0,nStep
    write(7,*)iStep

    !* Compute new temperature using FTCS scheme.
    do i=1,N
        if( istep==0) then  !only for t=0
            tt_new(i)=250
    write(7,*)tt_new(i)
        else
            if(i==1) then
                tt_new(i)=2*coeff*(tt(i+1)+35.494)-0.036*tt(i)
                write(7,*)tt(i)
            else 
                if(i==N) then
                    tt_new(i)=2*coeff*(tt(i-1)+35.494)-0.036*tt(i)
                    write(7,*)tt(i)
                else           
                    tt_new(i) = coeff*(tt(i+1) + tt(i-1)+33.333)+(1 - 2*coeff)*tt(i)
                    write (7,*) tt_new(i)
                end if
            end if
        end if     
    end do

    do i=1,N
        tt(i) = tt_new(i)     ! Reset temperature to new values
    enddo
end do

это вывод ....

0
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
2.5000000E+02
1
2.5000000E+02     <--
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.6666650E+02
2.5000000E+02   <--

Как видите ... программа не вычисляет значения для первого и последнего узла ... Можете ли вы сказать мне, почему ???

Ответы [ 3 ]

5 голосов
/ 07 декабря 2008

Для i=1 и i=N вы печатаете tt(i) вместо tt_new(i) - расчет выполняется правильно, но результаты не будут отображаться должным образом. Выполнение кода с помощью отладчика весьма полезно в подобных случаях.

Я бы также предложил реструктурировать ваше заявление if, но я бы не пошел так далеко, как гимел - я думаю, что намерение было бы более ясным, как

if (iStep == 0) then
    ! Perform actions for time 0
else
    ! Perform actions for time > 0
    if (i == 1) then
        ! Perform actions for first endpoint
    else if (i == N) then
        ! Perform actions for last endpoint
    else
        ! Perform actions for midsection
    end if
end if

поскольку у вас есть два типа особых случаев - пространственное ограничение (как по-разному обрабатывать конечные точки) и временное ограничение (как обрабатывать ваше начальное условие).

3 голосов
/ 07 декабря 2008

Тим Уиткомб и Гимел дали хорошие ответы. Однако вам следует еще больше пересмотреть свой код - поскольку нет необходимости использовать несколько операторов записи (или пустых строк, или дополнительных операторов END IF).

if (istep==0) then  !only for t=0
    tt_new(i)=250
else if (i==1) then
    tt_new(i) = 2*coeff*(tt(i+1)+35.494)-0.036*tt(i)
else if (i==N) then
    tt_new(i) = 2*coeff*(tt(i-1)+35.494)-0.036*tt(i)
else           
    tt_new(i) = coeff*(tt(i+1) + tt(i-1)+33.333)+(1 - 2*coeff)*tt(i)
end if
write(7,*)tt_new(i)

Если бы это был мой код, я бы более либерально использовал интервалы в строках.

3 голосов
/ 07 декабря 2008

Попробуйте отформатировать ваш внутренний IF ELSE более читабельным способом:

if( istep==0) then  !only for t=0
    tt_new(i)=250
    write(7,*)tt_new(i)
else if(i==1) then
    tt_new(i)=2*coeff*(tt(i+1)+35.494)-0.036*tt(i)
    write(7,*)tt(i)
else if(i==N) then
    tt_new(i)=2*coeff*(tt(i-1)+35.494)-0.036*tt(i)
    write(7,*)tt(i)
else           
    tt_new(i) = coeff*(tt(i+1) + tt(i-1)+33.333)+(1 - 2*coeff)*tt(i)
    write (7,*) tt_new(i)

end if
end if //redundant
end if //redundant

Таким образом, вы видите, что необходим только один END IF, поскольку ведущие предложения IF (или ELSE IF) закрываются соответствующими ELSE.

( РЕДАКТИРОВАТЬ: первые 2 строки кода в вопросе отображаются в порядке - спасибо Джонатан Леффлер.)

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