即使条件满足,程序也不会在Fortran中进入if循环

时间:2018-05-21 15:19:24

标签: if-statement fortran gfortran fortran95 numerical-computing

这是未按预期运行的代码部分。我必须包含一些旧式的“暂停”语句来指出错误位置。

    iteration_index = 1
    y_refined = y_current + (0.5d0*dx*(dydx_predictor + dydx_refined_corrector))               ! Solution corresponds to i = 2, i.e., the refined Heun's method.

    relative_percent_error = 100.d0*(abs((y_refined - y_next)/y_refined))                         ! Calculation of relative percentage error. This is NOT true error.

    if (relative_percent_error > heun_percent_tolerance) then

        iteration_index = iteration_index + 1

        print*, 'first loop enter', x_next, relative_percent_error, iteration_index
        pause

        if (iteration_index < max_heun_number) then

            y_next = y_refined
            call dydx(x_next, y_next, dydx_refined_corrector)
            y_refined = y_current + (0.5d0*dx*(dydx_predictor + dydx_refined_corrector))
            relative_percent_error = 100.d0*(abs((y_refined - y_next)/y_refined))

            print*, 'second loop enter', x_next, relative_percent_error, iteration_index
            pause

        end if

    end if

输出如下:

first loop enter   1.0000000000000000        6.7763423346068707          2

PAUSE

To resume execution, type go.  Other input will terminate the job.

go

RESUMED

second loop enter   1.0000000000000000        1.6658644147581094        2

PAUSE 

To resume execution, type go.  Other input will terminate the job.

go

RESUMED

first loop enter   2.0000000000000000        6.6615482639252761         2

PAUSE 

To resume execution, type go.  Other input will terminate the job.

heun_percent_tolerance的值为0.01,max_heun_number为15.我希望执行进入第二个if循环以进行更多迭代,直到达到最大限制为15,但似乎是代码跳转到下一个x_next值2.

我甚至尝试将这两个条件合并为If (cond1 .and. cond2),但这两个条件都不起作用。

1 个答案:

答案 0 :(得分:3)

您的代码中没有循环! IF不是循环!除非你把它放在一个实际的循环中,否则不会重复执行。

如果您想在条件仍然有效时循环某些代码,请使用DO WHILE循环或DO循环EXIT

do while (relative_percent_error > heun_percent_tolerance) 

    iteration_index = iteration_index + 1

    print*, 'first loop enter', x_next, relative_percent_error, iteration_index
    pause

    if (iteration_index < max_heun_number) then

        y_next = y_refined
        call dydx(x_next, y_next, dydx_refined_corrector)
        y_refined = y_current + (0.5d0*dx*(dydx_predictor + dydx_refined_corrector))
        relative_percent_error = 100.d0*(abs((y_refined - y_next)/y_refined))

        print*, 'second loop enter', x_next, relative_percent_error, iteration_index
        pause

    end if

end do

注意代码仍然可能不正确,您必须对其进行重组,但关键是您需要实际的DO循环,而不仅仅是IF条件。 IF不是循环。