Novice 发表于 2022-10-22 18:34:39

COMMON中声明的数组在未修改的情况下在子程序中改变

程序为古早时期的代码,f77
编译环境为Ubuntu22.04+oneAPI ifort
1.变量声明
通过include头文件在主程序和所有子程序中声明,
头文件中的部分声明如下:
       
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)改变
改变的位置定位到组装刚度矩阵子程序中对应的部分代码,如下
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:06

可能是K_TEMP和COMMON语句中的变量用equivalence语句共享了存储空间

Novice 发表于 2022-10-23 14:52:13

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

多谢回答,并未使用equivalence语句,目前正在排查是否为越界或赋初始值问题

kyra 发表于 2022-10-23 20:43:34

这就是为什么推荐用module替代common的原因
页: [1]
查看完整版本: COMMON中声明的数组在未修改的情况下在子程序中改变