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子程序中不断变化?_Fortran_Parameter Passing - Fatal编程技术网

为什么我的参数(包括矩阵)在Fortran子程序中不断变化?

为什么我的参数(包括矩阵)在Fortran子程序中不断变化?,fortran,parameter-passing,Fortran,Parameter Passing,我正在为UMAT子程序调试Fortran代码,我注意到我的一些参数在整个子程序中不断变化,这对我来说很奇怪。例如,我有以下子例程: SUBROUTINE fabric_tensor_Mandel(vm1,vm2,vm3,v_m11,v_m22,v_m33, + sigma_0_plus,sigma_0_minus,vkisi_0,Tau_0,p,q,ro,AA,A,F_F, + vMATRIX_F,NTENS) C INCLUDE 'ABA_PARA

我正在为UMAT子程序调试Fortran代码,我注意到我的一些参数在整个子程序中不断变化,这对我来说很奇怪。例如,我有以下子例程:

SUBROUTINE fabric_tensor_Mandel(vm1,vm2,vm3,v_m11,v_m22,v_m33,
     + sigma_0_plus,sigma_0_minus,vkisi_0,Tau_0,p,q,ro,AA,A,F_F,
     + vMATRIX_F,NTENS) 
C      
      INCLUDE 'ABA_PARAM.INC'
C
      PARAMETER (M=3)
      DIMENSION AA(NTENS,NTENS),A(NTENS),F_F(NTENS,NTENS),F(M,M),
     +  sigma_plus(M),sigma_minus(M),Tau(M,M),vkisi(M,M),v_m(M),
     +  vMM1(M,M),vMM2(M,M),vMM3(M,M),vMM1_v(NTENS),vMM2_v(NTENS),
     +  vMM3_v(NTENS),vM11_dyad(NTENS,NTENS),vM22_dyad(NTENS,NTENS),
     +  vM33_dyad(NTENS,NTENS),vM12_dyad(NTENS,NTENS),vMATRIX_F(M,M),
     +  vM13_dyad(NTENS,NTENS),vM23_dyad(NTENS,NTENS),
     +  vM21_dyad(NTENS,NTENS),vM31_dyad(NTENS,NTENS),
     +  vM32_dyad(NTENS,NTENS),vM12_Sym(NTENS,NTENS),
     +  vM13_Sym(NTENS,NTENS),vM23_Sym(NTENS,NTENS),FFA(NTENS),
     +  vM21_Sym(NTENS,NTENS),vM31_Sym(NTENS,NTENS),FF_inv(NTENS,NTENS),
     +  vM32_Sym(NTENS,NTENS),FF_inv_F(NTENS),F_V(NTENS),
     +  FF_MATRIX(NTENS,NTENS) 
C
C        m=[m1;m2;m3];
        v_m=(/vm1,vm2,vm3/)

C       Mi = mi (dyad) mi  (eq.38)
C       MMi=mii*transpose(mii);
        CALL DYADICPROD(v_m11,v_m11,vMM1,M)
        CALL DYADICPROD(v_m22,v_m22,vMM2,M)
        CALL DYADICPROD(v_m33,v_m33,vMM3,M)
        

C        %convert to voigt notation
C        [MM1_V]= convert_matrix_vector(MM1);
        CALL TENS2VEC(vMM1,M,vMM1_v,NTENS)
        CALL TENS2VEC(vMM2,M,vMM2_v,NTENS)
        CALL TENS2VEC(vMM3,M,vMM3_v,NTENS)

C       (eq. 15-18 Barakuie)
        DO i=1,3
            DO j=1,3
        sigma_plus(i) = sigma_0_plus*(ro**p)*((v_m(i))(2*q))
        sigma_minus(i) = sigma_0_minus*(ro**p)*((v_m(i))(2*q))
        Tau(i,j) = Tau_0*(ro**p)*((v_m(i))(q))*((v_m(j))(q))
        vkisi(i,j)=vkisi_0*((v_m(i))(2*q))/((v_m(j))(2*q))
            END DO
        END DO

C      Construt F (eq.37)

        DO i=1,3
            DO j=1,3
        F(i,j)=((1.d0/sigma_plus(1))-(1.d0/sigma_minus(1)))*vMM1(i,j)+
     1      ((1.d0/sigma_plus(2))-(1.d0/sigma_minus(2)))*vMM2(i,j)+ 
     2     ((1.d0/sigma_plus(3))-(1.d0/sigma_minus(3)))*vMM3(i,j)
          END DO
        END DO
        

C       Convert to voigt notation  
C        [F_V]= convert_matrix_vector(F);
        CALL TENS2VEC(F,M,F_V,NTENS)
        

C       Construct FF (eq. 36)

C       Construct the required dyadic product
C       [M11_dyad]= MM1_V*transpose(MM1_V);
        CALL DYADICPROD(vMM1_v,vMM1_v,vM11_dyad,NTENS)
        CALL DYADICPROD(vMM2_v,vMM2_v,vM22_dyad,NTENS)
        CALL DYADICPROD(vMM3_v,vMM3_v,vM33_dyad,NTENS)
        CALL DYADICPROD(vMM1_v,vMM2_v,vM12_dyad,NTENS)
        CALL DYADICPROD(vMM1_v,vMM3_v,vM13_dyad,NTENS)
        CALL DYADICPROD(vMM2_v,vMM1_v,vM21_dyad,NTENS)
        CALL DYADICPROD(vMM2_v,vMM3_v,vM23_dyad,NTENS)
        CALL DYADICPROD(vMM3_v,vMM1_v,vM31_dyad,NTENS)
        CALL DYADICPROD(vMM3_v,vMM2_v,vM32_dyad,NTENS)
        

C       Construct the required symmetric product
        CALL Symmetric_Zysset_Mandel(vMM1_v,vMM2_v,vM12_Sym)
        CALL Symmetric_Zysset_Mandel(vMM1_v,vMM3_v,vM13_Sym)
        CALL Symmetric_Zysset_Mandel(vMM2_v,vMM1_v,vM21_Sym)
        CALL Symmetric_Zysset_Mandel(vMM2_v,vMM3_v,vM23_Sym)
        CALL Symmetric_Zysset_Mandel(vMM3_v,vMM1_v,vM31_Sym)
        CALL Symmetric_Zysset_Mandel(vMM3_v,vMM2_v,vM32_Sym)
c       Construct fourth-order tensor FF
    DO i=1,NTENS
            DO j=1,NTENS
        F_F(i,j)=((1.d0/(sigma_plus(1)*sigma_minus(1)))*vM11_dyad(i,j))+
  1  ((1.d0/(sigma_plus(2)*sigma_minus(2)))*vM22_dyad(i,j))+
     2    ((1.d0/(sigma_plus(3)*sigma_minus(3)))*vM33_dyad(i,j))-
  3  ((1.d0/(sigma_plus(1)*sigma_minus(1)))*(vkisi(1,2)*vM12_dyad(i,j)+
     4    vkisi(1,3)*vM13_dyad(i,j)))-
  5  ((1.d0/(sigma_plus(2)*sigma_minus(2)))*(vkisi(2,1)*vM21_dyad(i,j)+
     6    vkisi(2,3)*vM23_dyad(i,j)))-
  7  ((1.d0/(sigma_plus(3)*sigma_minus(3)))*(vkisi(3,1)*vM31_dyad(i,j)+
     8    vkisi(3,2)*vM32_dyad(i,j)))+
  9  ((0.5d0/(Tau(1,2)**2.d0))*vM12_Sym(i,j)+
     +    (0.5d0/(Tau(1,3)**2.d0))*vM13_Sym(i,j)+
     +    (0.5d0/(Tau(2,1)**2.d0))*vM21_Sym(i,j) +
     +    ((0.5d0/(Tau(2,3)**2.d0))*vM23_Sym(i,j)+
     +    (0.5d0/(Tau(3,1)**2.d0))*vM31_Sym(i,j)+
     +    (0.5d0/(Tau(3,2)**2.d0))*vM32_Sym(i,j)))
          END DO
        END DO
        
      DO i=1,NTENS
            DO j=1,NTENS
      FF_MATRIX(i,j)=F_F(i,j)
          END DO
      END DO

C       FF_inv=inv(FF);  %compute inverse of 4th order tensor FF
        CALL INVERT(FF_MATRIX,FF_inv,IPIV,6,X,FSMAL,IOUT)
C        FF_inv_F=inv(FF)*F_V;
        CALL KMLT1(FF_inv,F_V,FF_inv_F,NTENS)

C    A = -0.5*FF_inv_F;      %Construct A (3,3) by eq.35
        DO K=1,NTENS
                A(K)=-0.5*FF_inv_F(K)
        END DO
        
C    FFA= FF*A;  %double cntraction of 4th-order FF and 2nd order A to be used in eq. 34
        CALL KMLT1(F_F,A,FFA,NTENS)

C       AFFA = transpose(A)*FFA;  %(scalar)    %Construct A:FF:A (scalar) in the denominator of eq. 34    
        CALL DOTPROD(A,FFA,AFFA,NTENS)

C       AA = FF./(1+AFFA);     %Construct 4th-order tensor AA
        DO i=1,NTENS
            DO j=1,NTENS
            AA(i,j) =(1/(1+AFFA))*F_F(i,j);
            END DO
    END DO
            
      RETURN
      END
但是,例如,矩阵F_F在以下行之后发生变化:

 DO i=1,NTENS
            DO j=1,NTENS
            AA(i,j) =(1/(1+AFFA))*F_F(i,j);
            END DO
    END DO
有人能帮助我为什么会发生这种情况,我应该怎么做才能解决它? 谢谢
Faezeh

ABA_PARAM.INC的内容是什么?在调试模式下运行代码,查看编译器是否检测到任何语义错误或内存损坏。例如,如果您使用的是
gfortran
,则可以添加以下标志:
-g3-O0-fcheck=all-ffpe trap=invalid,zero,overflow-finit real=snan-fbacktrace-fmax errors=10-Wno可能未初始化-Wall-fno不安全的数学优化-fsignaling nans-fronting math
。您还可以将可执行文件传递给
Valgrind
应用程序,以进行进一步的内存调试。另外,实际参数是否对应于
AA
F_F
不同的实体?您能否生成一个,特别显示如何调用此子例程,并且理想情况下没有子例程的所有部分不会导致问题?