声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

声振论坛 展示 工程软件 Ansys 查看内容

ANSYS耦合终极解决方案

2016-5-5 13:19| 发布者: leejack| 查看: 901| 评论: 0|原作者: 不详|来自: 新浪TJlovefoever的博客

摘要:   这两天很忙,源于自己对论文中可能出现的问题估计不足,不过话说回来,很多问题着实也是在实践过程中才发现其中奥秘。不过这段时间效率低下是一定的了,想必和网上多了有很大关系。看来是我真正下决心息网的时候 ...
  这两天很忙,源于自己对论文中可能出现的问题估计不足,不过话说回来,很多问题着实也是在实践过程中才发现其中奥秘。不过这段时间效率低下是一定的了,想必和网上多了有很大关系。看来是我真正下决心息网的时候到了,成功的前提是有选择性地放弃,看来这句话是对我说的。而且,看着即将完成的一篇论文,怎么看怎么像是我写博客的风格,囧。博客对生活影响真大啊!

  好了,言归正传,刚才在仿真论坛发现了一篇好贴《高效耦合小程序》,si13俨然是个天才,程序写得太牛了,我读了三遍才理解其中奥秘,不禁啧啧称奇。对其作品更是五体投地,相当佩服。首先来围观下面si13编写的APDL代码:

  说明:其中加粗的部分需要根据不同的分析自行修改。
  1.   !**************************************

  2.   allsel !最好保留这句命令

  3.   !*******将从属节点编号依次存入数组****************

  4.   cmsel,s,slavenode

  5.   *get,count1_node,node,0,count

  6.   *del,slave_node

  7.   *dim,slave_node,array,count1_node

  8.   *get,slave_node(1),node,0,num,min

  9.   *do,i,2,count1_node

  10.   slave_node(i)=ndnext(slave_node(i-1))

  11.   *enddo

  12.   !*******将主节点编号依次存入数组****************

  13.   allsel

  14.   cmsel,s,masternode

  15.   *get,count2_node,node,0,count

  16.   *del,master_node

  17.   *dim,master_node,array,count2_node

  18.   *get,master_node(1),node,0,num,min

  19.   *do,i,2,count2_node

  20.   master_node(i)=ndnext(master_node(i-1))

  21.   *enddo

  22.   !********将与从属节点耦合的节点数组初始化****************

  23.   *del,cp_node

  24.   *dim,cp_node,array,count1_node

  25.   *do,i,1,count1_node

  26.   cp_node(i)=0

  27.   *enddo

  28.   !*********开始选择程序****************

  29.   allsel

  30.   cmsel,s,masternode

  31.   *do,i,1,count1_node

  32.   kk=1

  33.   k=1

  34.   *dowhile,kk

  35.   k=nnear(slave_node(i))

  36.   nsel,s,cp,,all

  37.   kk=nsel(k)+0.001

  38.   allsel

  39.   cmsel,s,masternode

  40.   nsel,u,node,,k

  41.   cm,masternode,node

  42.   *enddo

  43.   cp_node(i)=k

  44.   *enddo

  45.   !*******选择完毕****************

  46.   !*******开始耦合****************

  47.   allsel,all

  48.   /prep7

  49.   *do,i,1,count1_node

  50.   cp,next,UX,slave_node(i),cp_node(i)

  51.   cp,next,UY,slave_node(i),cp_node(i)

  52.   cp,next,UZ,slave_node(i),cp_node(i)

  53.   *enddo

  54.   !*******耦合完毕****************
复制代码
  过去常见的耦合命令,主要分三步(以钢筋与混凝土耦合为例):
  选择钢筋线上的节点;
  通过新定义的数组,对这些节点进行排序;
  用一个循环,是这些钢筋上的节点与其周围最近的节点进行耦合。


  最常见的耦合命令流如下(这是我两年前做另一个课题的时候用的):
  1.   cmsel,s,ouhe

  2.   *get,max1,node,0,count !取得节点数目

  3.   *dim,steel,,max1 !定义“节点数”长度的数组

  4.   *get,nod1,node,0,num,min !最小节点编号定义给nod1

  5.   steel(1)=nod1 !数组第一个位置是最小节点的编号

  6.   *do,i,2,max1 !对数组进行排序

  7.   steel(i)=ndnext(steel(i-1))

  8.   *enddo

  9.   allsel

  10.   nsel,all !选择全部节点

  11.   jj=1

  12.   *do,i,1,max1 !对数组中的节点,一一与周围和它最近的节点进行耦合

  13.   cp,jj,ux,steel(i),nnear(steel(i))

  14.   cp,jj+1,uy,steel(i),nnear(steel(i))

  15.   cp,jj+2,uz,steel(i),nnear(steel(i))

  16.   jj=jj+3

  17.   *enddo
复制代码
  这样做其实是很大弊端的,还是拿钢筋混凝土举例:用上面的代码,容易使得钢筋上的节点与钢筋上另外的节点、或者与混凝土中两个节点进行耦合——也就是说,会出现一对多的情况,而这在耦合中是不允许的。

  在我两年前的那次分析,做的是一个组合结构,不是钢筋混凝土,而且我在网格划分的时候,特别注意了让参与耦合的两对节点举例比其他节点更接近。这样就使得用上面的命令实现完美一对一耦合。但在网格不好控制的时候,麻烦可就大了。

  所以后来见过一种改进的方法,将混凝土中的节点也进行排号,然后进行与钢筋节点进行耦合。这样成功地避免了自己耦合自己的情况,但已经耦合过的节点二次被耦合,则依然容易出现。

  si13的这套命令流,应该是把所有问题都解决了,perfect! 下面对他的程序详细地研究研究,学习一下他的编程思想,所以有必要把他的程序再写一遍~

  为了便于理解,下面仍以钢筋与混凝土耦合为例,不再区分主节点与附节点。

  allsel !全部选择
  !将钢筋中节点存入数组
  cmsel,s,slavenode !选择钢筋节点
  *get,count1_node,node,0,count !得到钢筋节点的总数
  *del,slave_node !清空数组变量,相当于slave_node=
  *dim,slave_node,array,count1_node !定义用来“盛装”钢筋节点的数组
  *get,slave_node(1),node,0,num,min !开始对钢筋节点进行排序,并存入数组
  *do,i,2,count1_node
  slave_node(i)=ndnext(slave_node(i-1))
  *enddo

  !**下面是将混凝土中节点存入数组,方法同上,于是就不解释了
  allsel
  cmsel,s,masternode
  *get,count2_node,node,0,count
  *del,master_node
  *dim,master_node,array,count2_node
  *get,master_node(1),node,0,num,min
  *do,i,2,count2_node
  master_node(i)=ndnext(master_node(i-1))
  *enddo

  !*新定义一个数组,专门用来存放混凝土中参与耦合的节点编号
  *del,cp_node
  *dim,cp_node,array,count1_node
  *do,i,1,count1_node
  cp_node(i)=0
  *enddo

  !*最精妙的核心代码来啦
  allsel
  cmsel,s,masternode !选择混凝土中的节点
  !外层循环是为了给cp_node数组赋值,所以数组中元素个数为钢筋节点数
  *do,i,1,count1_node
  kk=1
  k=1
  !内层循环是为了判断钢筋最近的节点是否已经参与过耦合
  *dowhile,kk !循环条件,若kk>0则循环继续,若kk<=0则循环终止
  k=nnear(slave_node(i)) !将距钢筋中第i个节点最近的节点编号赋给k
  nsel,s,cp,,all !选择所有已经耦合的节点,这种用法我是第一次看到
  kk=nsel(k)+0.001 !若上面的节点k不曾参与过耦合,则nsel命令不能将其选中,此处nsel(k)=-1,kk=-0.999<0,此部分循环终止;若上面的节点k已经参与过耦合,则nsel命令可以将其选中,此处nsel(k)=1,kk=1.001>0,循环继续,查找其他与第i个钢筋节点最近的混凝土节点的情况。
  allsel
  cmsel,s,masternode !选择混凝土节点
  nsel,u,node,,k !排除出刚才确定的准备参加耦合的混凝土节点
  cm,masternode,node !重新定义混凝土节点选择集,这是为了下次选择节点的时候,不将已经判读过的节点放在考虑之列
  *enddo

  cp_node(i)=k !将经过判断的k点编号赋予给混凝土参与耦合数组
  *enddo

  !开始耦合,耦合对象为钢筋中全部节点,以及混凝土中一部分专门用来耦合的节点,二者一一对应,而且还位置确定。
  allsel,all
  /prep7
  *do,i,1,count1_node
  cp,next,UX,slave_node(i),cp_node(i)
  cp,next,UY,slave_node(i),cp_node(i)
  cp,next,UZ,slave_node(i),cp_node(i)

  *enddo




最新评论

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-9 19:44 , Processed in 0.047317 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部