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

If statement 即使条件满足,程序也不会在Fortran中进入if循环,if-statement,fortran,gfortran,fortran95,numerical-computing,If Statement,Fortran,Gfortran,Fortran95,Numerical Computing,这是代码中未按预期运行的部分。我必须包括一些老式的“暂停”语句来锁定错误位置 heun\u公差百分比的值为0.01,max\u heun\u数值为15。我希望执行会进入第二个if循环进行更多的迭代,直到达到最大限制15,但代码似乎会跳到下一个x\u next值2 我甚至尝试将这两个条件组合为If(cond1.and.cond2),但都不起作用。您的代码中没有循环如果不是循环!它不会重复执行,除非您在那里放入一个实际的循环 如果要在条件仍然有效时循环某些代码,请使用DO while循环或DO循

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



heun\u公差百分比
的值为0.01,
max\u heun\u数值
为15。我希望执行会进入第二个if循环进行更多的迭代,直到达到最大限制15,但代码似乎会跳到下一个
x\u next
值2


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

您的代码中没有循环<代码>如果不是循环!它不会重复执行,除非您在那里放入一个实际的循环

如果要在条件仍然有效时循环某些代码,请使用
DO while
循环或
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-while(相对百分比误差>heun百分比公差)
迭代索引=迭代索引+1
打印*,“第一次循环输入”,x\u下一步,相对百分比错误,迭代索引
暂停
如果(迭代指数<最大值),则
y_next=y_精炼
调用dydx(x_next,y_next,dydx_defined_corrector)
y_精化=y_电流+(0.5d0*dx*(dydx_预测器+dydx_精化_校正器))
相对误差百分比=100.d0*(绝对值((y_细化-y_下一步)/y_细化))
打印*,“第二次循环输入”,x\u下一步,相对百分比错误,迭代索引
暂停
如果结束
结束

注意:代码可能仍然不正确,您必须重新构造它,但关键是您需要实际的
DO
循环,而不仅仅是
IF
条件。如果
不是循环,则为

代码中没有循环<代码>如果
不是循环!它不会重复执行,除非您在那里放入一个实际的循环

如果要在条件仍然有效时循环某些代码,请使用
DO while
循环或
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-while(相对百分比误差>heun百分比公差)
迭代索引=迭代索引+1
打印*,“第一次循环输入”,x\u下一步,相对百分比错误,迭代索引
暂停
如果(迭代指数<最大值),则
y_next=y_精炼
调用dydx(x_next,y_next,dydx_defined_corrector)
y_精化=y_电流+(0.5d0*dx*(dydx_预测器+dydx_精化_校正器))
相对误差百分比=100.d0*(绝对值((y_细化-y_下一步)/y_细化))
打印*,“第二次循环输入”,x\u下一步,相对百分比错误,迭代索引
暂停
如果结束
结束

注意:代码可能仍然不正确,您必须重新构造它,但关键是您需要实际的
DO
循环,而不仅仅是
IF
条件。如果
不是一个循环,

谢谢@Vladimir F。它起作用了,您的输入是正确的。仅供参考,我使用了一个“do while”语句,并使用“.”和“.”逻辑条件强制执行了两个数学条件。我得到了我想要的。谢谢你@Vladimir F。它起作用了,你的输入是正确的。仅供参考,我使用了一个“do-while”语句,并使用“.”和“.”逻辑条件强制执行了这两个数学条件。我得到了我想要的。
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