首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >程序即使在满足条件时也不会进入Fortran中的if-循环。

程序即使在满足条件时也不会进入Fortran中的if-循环。
EN

Stack Overflow用户
提问于 2018-05-21 15:19:23
回答 1查看 359关注 0票数 0

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

代码语言:javascript
复制
    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

产出如下:

代码语言:javascript
复制
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),这也不起作用。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-21 15:26:35

代码中没有循环!IF不是循环!它不会被重复执行,除非您在那里放置一个实际的循环。

如果要在条件仍然有效的情况下循环某些代码,请使用DO WHILE循环或带有EXITDO循环。

代码语言:javascript
复制
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不是循环。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50451881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档