昨天试算和修改你的命令流,主要是添加了很多输出中间结果的命令,进行检查分析。最终确定重启动确实会导致生死单元的定义丢失,通过重新定义生死单元可以解决这个问题。
看你的命令流,只是杀死了材料 1 的所有单元,所以定义生死单元还是很方便的。不过,有一个问题我没有修改,那就是你定义的约束条件好像涉及了少数材料 1 的单元,而你激活了与约束条件有关的单元,因而计算过程中死单元的数量不断在变化。不知道这是否你的本意。
除了为了检查中间结果的部分外,修改的重点有一以几个:
1 在循环中,solve 命令之后增加了 save 命令,以保证盘上存放的是最后一个计算成功的子步的模型。
2 在循环中,后处理之后,回到求解模块时,恢复了 resume 命令,以保证模型与上一次求解后的状态一致。
3 由于上两步不能保证死单元不变,所以在 Antype Rest 命令之后重新定义了死单元。
修改后的命令流如下。其中,用 *cfopen 命令打开了一个用于存放中间结果的文件,计算结束后可以看一下该文件,可以看到死计算过程单及元数量的变化。
!*** chiko75
finish
/clear
/filn, chiko75-03,1
/title, chiko75 -03
/units,si
/prep7
ET,1,SOLID70!responsive structural element for solid185
ET,2,SOLID90!responsive structural element for solid186
!et,2,suff_h152
!keyopt,2,4,0
!keyopt,2,5,1
!keyopt,2,8,3
!keyopt,2,9,1
mat3_top=1
mat_h13=2
!***
!*** /input,FeCrBSi_top_ther,dat,E:\acdE\ANSYSdb\tesueship\matpara
!*** /input,H13_ther,dat,E:\acdE\ANSYSdb\tesueship\matpara
/input, mat3_top,txt !*** 读入两个材料属性文件
/input, mat_h13,txt
!***
mpdele,enth,1
mpdele,enth,2
w_matrix=0.05
l_matrix=0.08
h_matrix=0.010
h_clad=0.002
esize_ref=0.001
D=0.002
pi=acos(-1)
dists_inc=esize_ref
v_scan=10e-3
temp_preh=298.15
count=4 !l_matrix/v_scan
/COM,create volume
block,-D/2,D/2,0,l_matrix,0,h_clad
cm,clad,volu
block,-1.5*D,1.5*D,0,l_matrix,0,-h_matrix
block,-(1.5*D+2*esize_ref),-1.5*D,0,l_matrix,0,-h_matrix
block,1.5*D,(1.5*D+2*esize_ref),0,l_matrix,0,-h_matrix
block,-6*D,-(1.5*D+2*esize_ref),0,l_matrix,0,-h_matrix
block,(1.5*D+2*esize_ref),6*D,0,l_matrix,0,-h_matrix
block,-w_matrix/2,-6*D,0,l_matrix,0,-h_matrix
block,6*D,w_matrix/2,0,l_matrix,0,-h_matrix
allsel
vglue,all
vsel,s,loc,x,-w_matrix/2,-6*D
vsel,a,loc,x,6*D,w_matrix/2
cm,matrix_hex,volu
vsel,s,loc,x,-6*D,6*D
vsel,r,loc,z,0,-l_matrix
cm,matrix_tet,volu
allsel
cmgrp,matrix,matrix_hex,matrix_tet
allsel
lsel,s,loc,x,-1.5*D,1.5*D
lesize,all,esize_ref
lsel,s,loc,x,-(1.5*D+esize_ref)
lsel,a,loc,x,(1.5*D+esize_ref)
lsel,u,tan1,z,1
lsel,u,tan1,z,-1
lesize,all,esize_ref
lsel,s,loc,x,-4*D,-w_matrix
lsel,a,loc,x,4*D,w_matrix
lsel,r,loc,z,-h_matrix/2
lesize,all,4*esize_ref
lsel,s,loc,x,-4*D,-w_matrix
lsel,a,loc,x,4*D,w_matrix
lsel,r,tan1,z,0
lesize,all,4*esize_ref
mat,1
type,1
mshkey,1
mshape,0
vmesh,clad
mat,2
type,1
mshkey,1
mshape,0
vmesh,matrix_hex
!vmesh,7
type,2
mshkey,0
mshape,1
!vmesh,5
!vmesh,6
vmesh,matrix_tet
numcmp,area
vimp,matrix_tet,0,3
numcmp,all !*** 压缩实体编号,去掉空白的编号
save
/solu
*cfopen, chiko75-rl3,txt ! 定义一个输出文件,记录一些中间结果
antype,4
timint,1,therm
solcontrol,on,,
tintp,,,,1,,,,,,
thopt,full,0.05,64
neqit,100
trnopt,full
nropt,full,,on
pred,on,,on
cutcontrol,noiterpredict,0
cutcontrol,cutbackfactor,0.5
cutcontrol,plslimit,10,
cnvtol,temp,,0.01
cnvtol,heat,,0.01,,1e-6
kbc,0
lumpm,0
lnsrch,1
autots,1
ncnv,2
outres,all,all!basic,last
tunif,temp_preh
allsel
nsel,s,loc,z,-h_matrix
sf,all,conv,5,temp_preh
allsel
time,1e-4
deltim,5e-5,5e-5,5e-5
*vwrite,
(/' First solu & solve time=1e-4')
!*** 写中间结果文件,下同
solve
/solu
!*** 这个 /solu 是多余的,可以删除试试,是否影响计算结果
*vwrite,
(/' Second solu - undeleted')
esel,s,mat,,1
ekill,all
cm, emat_1,elem !*** 为材料 1 死单元建组
!*** 将当前死单元数写入中间结果文件,下同
*get,ekilled, elem, 0, count
cm, ekilled, elem
*vwrite, ekilled
(' Ekill all elements for mat 1, count =',f6.0 )
esel,s,live
eplot
!rescontrol,define,all,all
i=1
*do,i,0,count ! count = 4
disy=i*dists_inc
t=(disy+dists_inc)/v_scan
!!!!!
*vwrite, i,t
(//' In *do, i=',f5.0, ' time=',f10.8)
esel,s,mat,,1
nsle,s,1
nsel,r,loc,y,disy-dists_inc,disy+dists_inc,0.00001
esln,s,1 !*** 可能会包含部分 mat 1 的单元
ealive,all !*** 导致部分死单元被激活
bf,all,hgen,4e10
esel,s,live
eplot
csys,0
allsel
esel,s,live
nsle,s,1,
nsel,r,ext
nsel,u,loc,z,-h_matrix !------改
sf,all,conv,50,temp_preh !------改
time,t
nsubst,5,1000,5,1
allsel
!求解
SOLVE
parsav,all,parareco-i1,txt !** 保存参数
save !*** 求解后将模型存盘
!*** 检查死单元
cm, e_befor,elem !*** 保存当前单元
esel,s,live
esel,inve
cm, ekilled_2,elem !*** 为死单元建组
*get,ekilled_2, elem, 0, count
!!!!!
*vwrite, i, ekilled_2
(' After solve, i =',f5.0,' killed elem count = ',f7.0)
cmsel, s, e_befor !*** 恢复原来单元组
/solu
!*** 这个 /solu 是多余的,可以删除试试,是否影响计算结果
!!!!!
*vwrite,i,t
(/' 3-th solu i = ',f5.0,' time=',f10.8)
parsav,all,parareco-i2,txt !** 再次保存参数,与上一次比较
BFDELE,all,HGEN
allsel
nsel,u,loc,z,-h_matrix
sfdele,all,conv
allsel
save
finish
/post1
!etable,temper,temp
!esel,s,etab,temper,1160
!cm,temper1,elem
finish
!save
!/filename,
!*** 检查死单元
cm, e_befor,elem !*** 保存当前单元
esel,s,live
esel,inve
cm, ekilled_3,elem !*** 为死单元建组
*get,ekilled_3, elem, 0, count
*vwrite, i, ekilled_3
(' After solve, i =',f5.0,' killed elem count = ',f6.0)
cmsel, s, e_befor !*** 恢复原来单元组
/solu
resume
!**** 恢复为上面存储的模型
parres,new,parareco-i1,txt
!!!!!
*vwrite
(/' 4-th solu, before rest ')
parsav,all,parareco-i3,txt !** 再次保存参数,与第一次比较
!*** 检查死单元
cm, e_befor,elem !*** 保存当前单元
esel,s,live
esel,inve
cm, ekilled_4,elem !*** 为死单元建组
*get,ekilled_4, elem, 0, count
*vwrite, i, ekilled_4
(' Before rest, i =',f5.0,' killed elem count = ',f6.0)
cmsel, s,e_befor !*** 恢复原来单元组
antype,,rest
!*** 检查死单元
cm, e_befor,elem !*** 保存当前单元
esel,s,live
esel,inve
cm, ekilled_5,elem !*** 为死单元建组
*get,ekilled_5, elem, 0, count
*vwrite, i, ekilled_5
(' After rest, i =',f5.0,' killed elem count = ',f6.0)
cmsel, s, e_befor !*** 恢复原来单元组
!*** 如果没有死单元,则重新定义材料 1 的定义为死单元
*if, ekilled_5,eq,0,then
ESEL,S,MAT,,1
ekill,all
*get,ekilled_5, elem, 0, count
*vwrite, i, ekilled_5
(' Modify: After rest, i =',f5.0,' killed elem count = ',f6.0)
cmsel, s, e_befor !*** 恢复原来单元组
*endif
parres,new,parareco-i3,txt
!*** 检查死单元
cm, e_befor,elem !*** 保存当前单元
esel,s,live
esel,inve
cm, ekilled_6,elem !*** 为死单元建组
*get,ekilled_6, elem, 0, count
*vwrite, i, ekilled_6
(' After rest¶res, i =',f5.0,' killed elem count = ',f6.0)
cmsel, s, e_befor !*** 恢复原来单元组
!parres,new,parareco,txt
!esel,s,,,temper1
!ekill,all
! allsel
!kuse,1
!solve
allsel
*ENDDO
*cfclose
! * |