为什么我的参数(包括矩阵)在Fortran子程序中不断变化?
我正在为UMAT子程序调试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
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
有人能帮助我为什么会发生这种情况,我应该怎么做才能解决它?
谢谢
FaezehABA_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
不同的实体?您能否生成一个,特别显示如何调用此子例程,并且理想情况下没有子例程的所有部分不会导致问题?