即使满足条件,程序也不会在 Fortran 中进入 if 循环
Program not entering an if-loop in Fortran even when condition is satisfied
这是代码的一部分,与预期的不同 运行。我必须包含一些旧式 "pause" 语句来查明错误位置。
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)
,但也没有用。
您的代码中没有循环! IF
不是循环!它不会重复执行,除非你在那里放置一个实际的循环。
如果您想在条件仍然有效时循环一些代码,请使用 DO WHILE
循环或带有 EXIT
的 DO
循环。
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
不是循环。
这是代码的一部分,与预期的不同 运行。我必须包含一些旧式 "pause" 语句来查明错误位置。
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)
,但也没有用。
您的代码中没有循环! IF
不是循环!它不会重复执行,除非你在那里放置一个实际的循环。
如果您想在条件仍然有效时循环一些代码,请使用 DO WHILE
循环或带有 EXIT
的 DO
循环。
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
不是循环。