Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 77代码可以工作,但不能显示所有值_Fortran_Fortran77 - Fatal编程技术网

Fortran 77代码可以工作,但不能显示所有值

Fortran 77代码可以工作,但不能显示所有值,fortran,fortran77,Fortran,Fortran77,我的程序可以运行,但它不能显示所有的p(I)值 当其工作时,仅显示p(1)值。停下来。但我想知道所有的价值观。P(1)至P(121) 问题出在哪里?循环是否有问题? PROGRAM odev dimension P(121) c div(ro.v.fi)=div(r.gradfi)+a-bfi c P(1)=P(2)=P(3)=P(4)=P(5)=P(6)=P(7)=P(8)=P(9)=P(10)=P(11)=100 c P(12

我的程序可以运行,但它不能显示所有的p(I)值

当其工作时,仅显示p(1)值。停下来。但我想知道所有的价值观。P(1)至P(121)

问题出在哪里?循环是否有问题?

       PROGRAM odev
        dimension P(121)
c       div(ro.v.fi)=div(r.gradfi)+a-bfi
c       P(1)=P(2)=P(3)=P(4)=P(5)=P(6)=P(7)=P(8)=P(9)=P(10)=P(11)=100
c       P(12)=P(23)=P(34)=P(45)=P(56)=P(67)=P(78)=P(89)=P(100)=P(111)=100
c       P(22)=P(33)=P(44)=P(55)=P(66)=P(77)=P(88)=P(99)=P(110)=P(121)=0
c       P(112)=P(113)=P(114)=P(115)=P(116)=P(117)=P(118)=P(119)=P(120)=0
   50  PRINT *, "Hangi yontemle cozum yapmak istiyorsunuz?"
        PRINT *, "Merkezi farklar icin 1"
        PRINT *, "Upwind icin 2"
        PRINT *, "Hybrid icin 3"
        PRINT *, "Powerlaw icin 4 giriniz"
        READ *, DE
        PRINT *, "iterasyon saysn giriniz"
        read*, iter
        IF (DE.eq.1)  THEN
        GO TO 10
        ELSE IF (DE.eq.2)  THEN
        GO TO 20
        ELSE IF (DE.eq.3)  THEN
        GO TO 30
        ELSE IF (DE.eq.4)  THEN
        GO TO 40
        ELSE
        PRINT *, "Lutfen 1-4 aral§nda giriŸ yapnz"
        GO TO 50
        END IF
    5  do I=1,11
       P(I)=100
       end do
    6  do I=12,111,11
       P(I)= 100
       end do
    7  do I=22,121,11
       P(I)=0
       end do
    8  do I=112,120
       P(I)=0
       end do
   10 PRINT *, "Merkezi farklar metodu"
c      tanimlanan formule gore 10*10 hucreli grid
c      sistem icin hesap yapar
       do 3 n=1, iter
        DO 4 I=13, 109
       P(I)=(0.5*P(I+1)+1.5*P(I-1)-P(I-11)+3*P(I+11)+10)/6
    4 continue
    3 continue
        GO TO 60
   20  PRINT *, "Upwind metodu "
       do n=1, iter
        DO I=13, 109
        P(I)=(P(I+1)+2*P(I-1)+P(I-11)+5*P(I+11)+10)/11
        END DO
       end do
        GO TO 60
   30  PRINT *, "Hybrid metodu "
        do n=1, iter
        DO I=13, 109
        P(I)=(0.5*P(I+1)+1.5*P(I-1)+4*P(I+11)+10)/8
        END DO
       end do
        GO TO 60
   40  PRINT *, "Powerlaw metodu "
        do n=1, iter
        DO I=13, 109
       P(I)=(0.591*P(I+1)+1.591*P(I-1)+0.078*P(I-11)+4.078*P(I+11)+10)/8.338
        END DO
       end do
        GO TO 60
   60  PRINT *, "Tesekkurler"
       do 11 I=1,121
       print *, I, P(I)
       pause
   11  continue
       END
编辑

来自高绩效分数的建议

c       P(112)=P(113)=P(114)=P(115)=P(116)=P(117)=P(118)=P(119)=P(120)=0
    5  do I=1,11
       P(I)=100
       end do
    6  do I=12,111,11
       P(I)= 100
       end do
    7  do I=22,121,11
       P(I)=0
       end do
    8  do I=112,120
       P(I)=0
       end do
   50  PRINT *, "Hangi yontemle cozum yapmak istiyorsunuz?"
SELECT CASE (N)
CASE (1)
PRINT *, "Merkezi farklar metodu"
    do 3 n=1, iter
    DO 4 I=13, 109
    P(I)=(0.5*P(I+1)+1.5*P(I-1)-P(I-11)+3*P(I+11)+10)/6
4 continue
3 continue
    GO TO 60
CASE (2)
PRINT *, "Upwind metodu "
    do n=1, iter
    DO I=13, 109
    P(I)=(P(I+1)+2*P(I-1)+P(I-11)+5*P(I+11)+10)/11
    END DO
    end do
    GO TO 60
CASE (3)
PRINT *, "Hybrid metodu "
    do n=1, iter
    DO I=13, 109
    P(I)=(0.5*P(I+1)+1.5*P(I-1)+4*P(I+11)+10)/8
    END DO
    end do
    GO TO 60
CASE (4)
PRINT *, "Powerlaw metodu "
    do n=1, iter
    DO I=13, 109
    Z=8.338
   P(I)=(0.591*P(I+1)+1.591*P(I-1)+0.078*P(I-11)+4.078*P(I+11)+10)/Z
    END DO
    end do
    GO TO 60
END SELECT
现在是工作。但所示的P(13)至P(109)值>Nan

p(1)至p(12)接近1e-40(必须为100) P(110)到P(121)接近1e-38

我想还有一个问题

编辑2

来自@francescalus的建议

c       P(112)=P(113)=P(114)=P(115)=P(116)=P(117)=P(118)=P(119)=P(120)=0
    5  do I=1,11
       P(I)=100
       end do
    6  do I=12,111,11
       P(I)= 100
       end do
    7  do I=22,121,11
       P(I)=0
       end do
    8  do I=112,120
       P(I)=0
       end do
   50  PRINT *, "Hangi yontemle cozum yapmak istiyorsunuz?"
SELECT CASE (N)
CASE (1)
PRINT *, "Merkezi farklar metodu"
    do 3 n=1, iter
    DO 4 I=13, 109
    P(I)=(0.5*P(I+1)+1.5*P(I-1)-P(I-11)+3*P(I+11)+10)/6
4 continue
3 continue
    GO TO 60
CASE (2)
PRINT *, "Upwind metodu "
    do n=1, iter
    DO I=13, 109
    P(I)=(P(I+1)+2*P(I-1)+P(I-11)+5*P(I+11)+10)/11
    END DO
    end do
    GO TO 60
CASE (3)
PRINT *, "Hybrid metodu "
    do n=1, iter
    DO I=13, 109
    P(I)=(0.5*P(I+1)+1.5*P(I-1)+4*P(I+11)+10)/8
    END DO
    end do
    GO TO 60
CASE (4)
PRINT *, "Powerlaw metodu "
    do n=1, iter
    DO I=13, 109
    Z=8.338
   P(I)=(0.591*P(I+1)+1.591*P(I-1)+0.078*P(I-11)+4.078*P(I+11)+10)/Z
    END DO
    end do
    GO TO 60
END SELECT
来自@agentp建议

c       P(112)=P(113)=P(114)=P(115)=P(116)=P(117)=P(118)=P(119)=P(120)=0
    5  do I=1,11
       P(I)=100
       end do
    6  do I=12,111,11
       P(I)= 100
       end do
    7  do I=22,121,11
       P(I)=0
       end do
    8  do I=112,120
       P(I)=0
       end do
   50  PRINT *, "Hangi yontemle cozum yapmak istiyorsunuz?"
SELECT CASE (N)
CASE (1)
PRINT *, "Merkezi farklar metodu"
    do 3 n=1, iter
    DO 4 I=13, 109
    P(I)=(0.5*P(I+1)+1.5*P(I-1)-P(I-11)+3*P(I+11)+10)/6
4 continue
3 continue
    GO TO 60
CASE (2)
PRINT *, "Upwind metodu "
    do n=1, iter
    DO I=13, 109
    P(I)=(P(I+1)+2*P(I-1)+P(I-11)+5*P(I+11)+10)/11
    END DO
    end do
    GO TO 60
CASE (3)
PRINT *, "Hybrid metodu "
    do n=1, iter
    DO I=13, 109
    P(I)=(0.5*P(I+1)+1.5*P(I-1)+4*P(I+11)+10)/8
    END DO
    end do
    GO TO 60
CASE (4)
PRINT *, "Powerlaw metodu "
    do n=1, iter
    DO I=13, 109
    Z=8.338
   P(I)=(0.591*P(I+1)+1.591*P(I-1)+0.078*P(I-11)+4.078*P(I+11)+10)/Z
    END DO
    end do
    GO TO 60
END SELECT
现在终于可以工作了…

这些行

   print *, I, P(I)
   pause
告诉程序打印
p
的第一个元素,然后打印
pause
。在许多计算机上,任何用户当时的输入,如按键,都会导致程序继续。在您的代码中,将导致
P
的下一个元素写入终端,并且程序再次暂停

试着把这行代码暂停出来,看看会发生什么。或者像猴子一样坐在那里,按一个键120次


然后扔掉程序,用现代Fortran重写它;看FORTRAN77让我很痛苦。

的初始赋值
p
(标记为5到10的行)从未执行过。无论
DE
的值是什么,以及随后的跳转,
P
在定义之前都会被引用。在这种情况下,获得想要的结果只是运气的问题。这是一个很好的例子,说明了为什么永远不应该使用
goto
。。使用
SELECT CASE
,(或
if-then
结构,如果您真的必须使用f77)重写它,很高兴它能工作——您不需要
SELECT CASE
中的
goto
,但是@agentp已经观察到,每个案例末尾的
goto
语句是多余的。它使代码看起来像C,令人不寒而栗。