24小时热门版块排行榜    

CyRhmU.jpeg
查看: 1711  |  回复: 13

htbbzzg

铁杆木虫 (著名写手)

【答案】应助回帖

昨天试算和修改你的命令流,主要是添加了很多输出中间结果的命令,进行检查分析。最终确定重启动确实会导致生死单元的定义丢失,通过重新定义生死单元可以解决这个问题。
  看你的命令流,只是杀死了材料 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&parares,  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

! *
11楼2023-08-13 08:54:35
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

htbbzzg

铁杆木虫 (著名写手)

【答案】应助回帖

★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★
chiko75: 金币+20, ★★★很有帮助 2023-10-13 15:27:02
你好!
周末摸索了一下你的问题,发现确实是重启动导致死单元的定义被删除,不过,在重启动命令之后重新定义死单元就可以解决这个问题。
用于摸索你的问题和在重启动后重新添加死单元定义的命令流如下 ,你可以试试看:

!***   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&parares,  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
12楼2023-08-14 09:18:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

htbbzzg

铁杆木虫 (著名写手)

【答案】应助回帖

昨天把我摸索的结果发到小木虫网站了,可是今早进入你的帖子却没有找到我昨天发的内容,于是重新发了一次。发完后却有看到了我昨天发的内容,实在奇怪。
今天发的比较简单,缺少一些注解。你看昨天的内容就可以了。
13楼2023-08-14 09:23:06
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

chiko75

铜虫 (小有名气)

引用回帖:
13楼: Originally posted by htbbzzg at 2023-08-14 09:23:06
昨天把我摸索的结果发到小木虫网站了,可是今早进入你的帖子却没有找到我昨天发的内容,于是重新发了一次。发完后却有看到了我昨天发的内容,实在奇怪。
今天发的比较简单,缺少一些注解。你看昨天的内容就可以了。

不好意思这么久才回复,这两个月有别的事。
我运行了您给的代码,确实在重启动后死单元数量从312变成0了,重启动后要重新设置需要杀死的单元。
谢谢您的耐心解答。
14楼2023-10-13 15:26:59
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 chiko75 的主题更新
信息提示
请填处理意见