Fortran Coder

楼主: TurboGuu
打印 上一主题 下一主题

[流程控制] 关于程序不进入循环的问题

[复制链接]

8

帖子

2

主题

0

精华

入门

F 币
40 元
贡献
21 点
跳转到指定楼层
楼主
发表于 2017-10-23 22:08:13 | 显示全部楼层 |只看大图 回帖奖励 |倒序浏览 |阅读模式
大家好,我之前在论坛问过关于调用子程序输出全为0的问题,在论坛中热心朋友的帮助下已经解决
现在我在进行导热问题数值计算的过程中又遇到了新的问题
程序的目的就是一片L型的区域离散化,然后每个点设定一个初值,不断迭代求解方程,当误差小于一定值时输出
外边界点温度固定为30,内边界点固定为10,L型内部点设置初值为10,输出结果发现好像程序没有进行循环过程。
上次解决了的问题代码已经被我注释掉,这次不知道是哪里有问题,希望朋友们帮忙解答一下,谢谢大家!
[Fortran] 纯文本查看 复制代码
PROGRAM BCI
    IMPLICIT NONE
        INTEGER::T1=10
        INTEGER::T2=30
        INTEGER::M,N
        REAL::T(16,12)
        REAL::TA(16,12)
        REAL::ET(16,12)
        REAL::LAN=0.53
        REAL::ERR
        CALL GRID
        CALL START
        OPEN(01,FILE='BCI.dat')
        DO WHILE(ERR>0.00000001)
            CALL SOLVER
        END DO
        PRINT*,'    M   N   T'  
        DO M=1,16
            DO N=1,12
                PRINT*,M,N,T(M,N)
                WRITE(01,*)M,N,T(M,N)
            END DO
        END DO
        
    CONTAINS
    SUBROUTINE GRID
        INTEGER::T1=10
        INTEGER::T2=30
        INTEGER M,N
        !REAL T(16,12)
        DO N=1,7
            T(6,N)=T1
        END DO
        DO M=7,16
            T(M,7)=T1
        END DO
        DO N=1,12
            T(1,N)=T2
        END DO
        DO M=2,16
            T(M,12)=T2
        END DO
    END SUBROUTINE GRID
    SUBROUTINE START
        INTEGER M,N
        !REAL T(16,12)
        DO M=2,5
            DO N=1,11
                T(M,N)=10
            END DO
        END DO
        DO M=6,16
           DO N=8,11
               T(M,N)=10
           END DO
        END DO
    END SUBROUTINE START
    SUBROUTINE SOLVER
        INTEGER::T1=10
        INTEGER::T2=30
        INTEGER::M,N
        !REAL::T(16,12)
        !REAL::TA(16,12)
        !REAL::ET(16,12)
        !REAL::ERR
        DO M=2,5
            TA(M,1)=0.25*(2*T(M,2)+T(M-1,1)+T(M+1,1))
        END DO
        DO M=2,5
            DO N=2,11
                TA(M,N)=0.25*(T(M+1,N)+T(M-1,N)+T(M,N+1)+T(M,N-1))
            END DO
        END DO
        DO M=6,15
            DO N=8,11
                TA(M,N)=0.25*(T(M+1,N)+T(M-1,N)+T(M,N+1)+T(M,N-1))
            END DO
        END DO
        DO N=8,11
            TA(16,N)=0.25*(2*T(15,N)+T(16,N-1)+T(16,N-1))
        END DO
        DO N=1,7
            TA(6,N)=T1
        END DO
        DO M=7,16
            TA(M,7)=T1
        END DO
        DO N=1,12
            TA(1,N)=T2
        END DO
        DO M=2,16
            TA(M,12)=T2
        END DO
        DO M=1,16
            DO N=1,12
                ET(M,N)=ABS(TA(M,N)-T(M,N))
            END DO
        END DO
        ERR=MAXVAL(ET(1:16,1:12))
        DO M=1,16
            DO N=1,12
                T(M,N)=TA(M,N)
            END DO
        END DO
    END SUBROUTINE SOLVER
END PROGRAM BCI



分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

8

帖子

2

主题

0

精华

入门

F 币
40 元
贡献
21 点
沙发
 楼主| 发表于 2017-10-24 10:26:03 | 显示全部楼层
各位不好意思,新人不太知道规矩。。
以前遇到过复制代码格式全部错乱的情况。
现已将代码复制过来,还烦请各位帮忙看下,谢谢大家!

8

帖子

2

主题

0

精华

入门

F 币
40 元
贡献
21 点
板凳
 楼主| 发表于 2017-10-24 12:23:22 | 显示全部楼层
谢谢您对代码简化的建议!
不过初始化过后还是不行,跟之前的结果一样,没有循环。输出结果还是初值。

8

帖子

2

主题

0

精华

入门

F 币
40 元
贡献
21 点
地板
 楼主| 发表于 2017-10-24 13:58:50 | 显示全部楼层
我用的VS2015集成Intel Parallel  Studio XE 2018编写的
话说您这是什么编译器?

8

帖子

2

主题

0

精华

入门

F 币
40 元
贡献
21 点
5#
 楼主| 发表于 2017-10-24 14:24:47 | 显示全部楼层
ERR初始化以后也不行。
我把改后的代码发上来,您看看是不是我改得不对呀?
我再下一个gfortran看看

PROGRAM BCI
    IMPLICIT NONE
        INTEGER::T1=10
        INTEGER::T2=30
        INTEGER::M,N
        REAL::T(16,12)=0
        REAL::TA(16,12)=0
        REAL::ET(16,12)=0
        REAL::LAN=0.53
        REAL::ERR=0
        CALL GRID
        CALL START
        OPEN(01,FILE='BCI.dat')
        DO WHILE(ERR>0.00000001)
            CALL SOLVER
        END DO
        PRINT*,'    M   N   T'  
        DO M=1,16
            DO N=1,12
                PRINT*,M,N,T(M,N)
                WRITE(01,*)M,N,T(M,N)
            END DO
        END DO
        
    CONTAINS
    SUBROUTINE GRID
        !INTEGER::T1=10
        !INTEGER::T2=30
        INTEGER M,N
        T(6,1:7) = T1
        T(7:16,7)=T1
        T(1,1:12)=T2
        T(2:16,12)=T2
    END SUBROUTINE GRID
    SUBROUTINE START
        INTEGER M,N
        T(2:5,1:11)=10
        T(6:16,8:11)=10
    END SUBROUTINE START
    SUBROUTINE SOLVER
        !INTEGER::T1=10
        !INTEGER::T2=30
        INTEGER::M,N
        DO M=2,5
            TA(M,1)=0.25*(2*T(M,2)+T(M-1,1)+T(M+1,1))
        END DO
        DO M=2,5
            DO N=2,11
                TA(M,N)=0.25*(T(M+1,N)+T(M-1,N)+T(M,N+1)+T(M,N-1))
            END DO
        END DO
        DO M=6,15
            DO N=8,11
                TA(M,N)=0.25*(T(M+1,N)+T(M-1,N)+T(M,N+1)+T(M,N-1))
            END DO
        END DO
        DO N=8,11
            TA(16,N)=0.25*(2*T(15,N)+T(16,N-1)+T(16,N-1))
        END DO
        ET=ABS(TA-T)
        ERR=MAXVAL(ET(1:16,1:12))
        T=TA
    END SUBROUTINE SOLVER
END PROGRAM BCI

8

帖子

2

主题

0

精华

入门

F 币
40 元
贡献
21 点
6#
 楼主| 发表于 2017-10-24 19:27:41 | 显示全部楼层
终于解决了,多谢您的耐心帮助!!!
感谢感谢~
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-3 05:24

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表