Fortran Coder

标题: COMMON中声明的数组在未修改的情况下在子程序中改变 [打印本页]

作者: Novice    时间: 2022-10-22 18:34
标题: COMMON中声明的数组在未修改的情况下在子程序中改变
程序为古早时期的代码,f77
编译环境为Ubuntu22.04+oneAPI ifort
1.变量声明
通过include头文件在主程序和所有子程序中声明,
头文件中的部分声明如下:
[Fortran] 纯文本查看 复制代码
        
PARAMETER(NF=1,NLG=50)
REAL :: XLGM,YLGM,XLGM1,YLGM1,XLGM0,YLGM0,XLGM00,YLGM00
          COMMON/LAGRM0/XLGM(NF,NLG),YLGM(NF,NLG)

可以将XLGM(NF,NLG),YLGM(NF,NLG)看作结点的坐标
2.问题
2.1.调用逻辑
在主程序中先调用有限元的子程序,再在有限元的子程序中先后调用处理质量矩阵和刚度矩阵的子程序
其中调用质量矩阵子程序前后,XLGM(NF,NLG),YLGM(NF,NLG)未改变,但在调用相同处理方式的刚度矩阵子程序后,XLGM(NF,NLG),YLGM(NF,NLG)改变
改变的位置定位到组装刚度矩阵子程序中对应的部分代码,如下
[Fortran] 纯文本查看 复制代码
K_TEMP(:,1:40)=KS(:,3:42)
        DO IL=1,NLG1(IIF)
          WRITE(*,*) 'STIFF1:IL,XLGM(IIF,IL),YLGM(IIF,IL)'
          WRITE(*,*) IL,XLGM(IIF,IL),YLGM(IIF,IL)
        ENDDO
        K_TEMP(:,41:80)=KS(:,45:84)
        DO IL=1,NLG1(IIF)
          WRITE(*,*) 'STIFF2:IL,XLGM(IIF,IL),YLGM(IIF,IL)'
          WRITE(*,*) IL,XLGM(IIF,IL),YLGM(IIF,IL)
        ENDDO
        K_TEMP(:,81:120)=KS(:,87:126)
        DO IL=1,NLG1(IIF)
          WRITE(*,*) 'STIFF3:IL,XLGM(IIF,IL),YLGM(IIF,IL)'
          WRITE(*,*) IL,XLGM(IIF,IL),YLGM(IIF,IL)
        ENDDO
        K_REDUCT(1:40,:)=K_TEMP(3:42,:)
        DO IL=1,NLG1(IIF)
          WRITE(*,*) 'STIFF4:IL,XLGM(IIF,IL),YLGM(IIF,IL)'
          WRITE(*,*) IL,XLGM(IIF,IL),YLGM(IIF,IL)
        ENDDO






请问下可能是什么原因呢?有什么可行的解决方式呢?

作者: necrohan    时间: 2022-10-23 10:51
可能是K_TEMP和COMMON语句中的变量用equivalence语句共享了存储空间
作者: Novice    时间: 2022-10-23 14:52
necrohan 发表于 2022-10-23 10:51
可能是K_TEMP和COMMON语句中的变量用equivalence语句共享了存储空间

多谢回答,并未使用equivalence语句,目前正在排查是否为越界或赋初始值问题
作者: kyra    时间: 2022-10-23 20:43
这就是为什么推荐用module替代common的原因




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2