【求助】使用fortran语言编写umat子程序想实现循环积分,但一直报错,求教
if ((elt_m .ge. 1.0).and.(sigma_N.ge.0)) then !---------matrix tensile cracking---------
Gnc=Gnct
ftype=1.0
T0_eff=T_eff/sqrt(elt_m)
D0_eff=D_eff/sqrt(elt_m)
Gc=Gnc+(Gsc-Gnc)*(Gs/(Gn+Gs))**eta
Df_eff=D0_eff
Df_eff=statev(6)
E_mn=0.5*D0_eff*T0_eff
do while(E_mn.lt.Gc)
Df_eff=Df_eff+0.001
statev(6)=Df_eff
E_mn=E_mn+0.001*exp(T0_eff*D0_eff/(Gc-0.5*T0_eff*D0_eff)*(1.0-Df_eff/D0_eff))*T0_eff
end do
Df_eff=statev(6)+0.001
if(Df_eff.le.D0_eff) then
dm=dgdf2
ftype=1.5
endif
这是包含循环部分的程序,请帮我看看do while部分有没有错误,谢谢了! 返回小木虫查看更多
提示的错误信息是Error: Expecting END SUBROUTINE statement at (1)
楼主是不是只贴出了程序的一部分,根据报错,这和do while 部分没有关系,而且贴出来的部分if部分并不完整
根据提示改啊。在文件最后加上一行: end subroutine umat
是的,原子程序很长,所以我只贴出了我修改过的程序,请你帮我看看我自己改的求积分上限的do while语句是否有问题,如果有需要我可以把整个子程序贴上来
整个子程序是没有问题的,只有do while那一部分是我改动过的,现在提示错误,肯定是修改过的部分出现了错误,所以就想来问问我改的循环部分有没有错误,如果有需要,我可以把整个子程序贴上来
编译器报的是个语法错误,与具体算法没关系。从贴出代码段看,第一行的if一句应该在最后一行加个endif语句来闭合。do while语句没有明显错误。但要注意该循环语句段中有一行特别长,如果编译器选项没设置好的话,这一代码行可能只有前面一百多个字符被识别,后面的会自动被编译器丢弃,也可能会造成语法错误。最后,你的循环语句需要优化下。那个长语句行中,T0_eff和D0_eff的值在循环中一直是固定值,所以请把与这两项相关的乘法除法都移到循环外面计算,不要再循环内一遍又一遍计算已知的值,这是无用功,会降低计算效率
通过对比改动之前的子程序,问题已经解决了,谢谢您的耐心解答和回复
,