首页/文章/ 详情

手搓TexGen—机织蜂窝复合材料网格生成器

8月前浏览342



技术工具化

上一期提到,最近解决了纤维轨迹到三维网格生成技术。手搓TexGen—机织复合材料参数化建模技术    

   

   
   

   
熟悉我们号的朋友应该也发现了,如果说“静界有限元”有什么特色的话,那一定是围绕工程问题,具有系统性的解决方案和配套技术。我们在仿真、试验的同时,长期致力于各种配套软件工具的开发(Matlab APP/PyQt开发:把自己的算法可视化),做一个东西对应开发一套软件,让其他人也能用。    

   
很多事的根源,都要追溯到开头。开头是怎么开的,很大程度会影响一个人的后续职业生涯。    

   
人如此,事业也是如此。北宋始于黄袍加身,整个大宋朝一直到灭亡都防着武将。大明以灭元立国,后又天子守国门,就是防着游牧民族。    

   
扯远了。我读研究生的时候第一个项目就是写织物力学性能分析软件,工作以后搞气动、参加试飞,写了翼型结冰、试飞数据处理、冰风洞试验数据处理、图片曲线数据提取、UG翼型自动建模等等各种软件和工具。一直到现在几乎专门从事工业软件开发。    

   
把力学、建模、前后处理、数据采集与分析等各类技术软件化、工具化,已经是我个人的科研风格了。不能用、不实用的虚幻研究热点和缝合怪课题,即便能做也宁可不做。    

   
所谓科研的品位,就是你自己喜欢怎么做事情。比如有人擅用电镜,还自感发了一堆CNS十分的牛逼。有人喜欢所有东西AI化,用商业软件算点东西,再加点AI佐料,自感十分前卫。有人喜欢追热点,纳米火的时候他搞纳米,石墨烯火的时候他搞石墨烯。    

   
这就没办法,他品位就是那个样子。人间正道是沧桑,好路走起来难。    

   
又扯远了。关于手搓TexGen这个问题也是一样。我们把机织蜂窝复合材料自动生成网格这个技术也软件化。    


开发实现


纤维材料方向的处理    


我们知道纤维束是横观各向同性的,横观各向同性只是听起来像各向同性,它实质上还是个各向异性,需要根据其走向给单元赋材料方向。


由于我们事先建立了纤维轨迹的理论模型,三维网格也是通过截面贯穿轨迹得到的。这个技术方案天然地,就会在生成网格过程中,自然的得到局部材料坐标系,我们只需要在这个过程里把材料方向和网格数据一同储存,随后写入inp中即可。

基体的处理

我们在《机织复合材料细观损伤分析仿真》一文中,已经阐明,可以采用嵌入式约束的方法将纤维和基体进行耦合,这样可以不对基体做布尔运算,简单的六面体网格进行基体单元的快速划分。


对于机织蜂窝复合材料来说,这里会增加一个难题,就是基体也是蜂窝状的,即它在空间中也是间断的,不是连续的。这就不好用一个大的六面体进行包裹,因此网格难度增加了。


但是我们采用了体素的思想,适当降低基体范围的精度,只在纤维区域进行基体创建。


软件开发


我们设计了一个简单的界面,左边输入基本织物参数,右边通过选项卡,可以逐步生成纤维三维轨迹、纤维网格、基体网格,网格结果导出为ABAQUS inp文件,可以直接导入ABAQUS。



有软件的好处就来了,想改什么参数,点几下就搞定了。



除此之外,我们还给每个视口放了三视图按钮,方便观察。



网格的密度也做参数化,可以调节网格数量和分布。

仿真效果


我们把模型导入到ABAQUS中,简单仿真一些工况。可以看到材料方向赋予正确,嵌入式约束可以完成耦合。


作为一个网格生成器来说基本功能是都有了。



封装


最后我们把软件做了加密和封装,方便你我他。




来源:静界有限元
Abaqus复合材料二次开发MATLABUG理论材料试验
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-12-11
最近编辑:8月前
静界有限元
博士 签名征集中
获赞 27粉丝 4文章 58课程 0
点赞
收藏
作者推荐

基于Python的遗传算法实现

1. 废话的一章(可跳过)最近有人问我,说,L老师,发生了肾么事情?公 众号咋不更新了呢。我一看,哦,原来都两个月过去了,确实没更。 没更的原因有很多,一个是最近工作上的变化。另一个就是最近做的单子少,多是可写可不写的。唯一一个描述载荷移动的疲劳分析,我把原先“以静代动”的方法,换成了“动静结合”,算是这两个月的得意之笔吧。 这段时间探索的新技术不多,但是笔杆子没少动。写了好些报告,做了好些ppt,还从其他途径参与到一些有意思的项目,出了很多好点子。嗯,没机会亲手做试验,躲在后面出谋划策的感觉也不错,回头可以考虑买个羽毛扇。 最近总体来说,睡眠也是不错的,敞开了睡,能睡10个小时,这是我这几年都不曾享受到的,朕的头发估计能保住了。 开始学Python,粗略翻了几本书,装上了软件,摸索起来。这是继ANSA之后,又一次开始0基础学新东西,算是给自己的知识库加装了一个新模块。 最近喝酒也不少,不过都不敢喝醉,醉一次太难受了,我这日渐老化的身体可扛不住,只能在醉酒的边缘疯狂试探。 好看的小说也遇到几本。《我的师兄实在太稳健了》、《大奉打更人》,前者轻松娱乐,主角稳如老狗,不稳个几十手,从不出手。后者通篇都是黄色笑话,我严重怀疑作者就是为了讲荤段子才写的这本书,淦。 年初的时候,打死我也想不到年尾的这两个月在自己发生的各类魔幻事件。或许,我离一个真正的工程师越来越近了吧。追求还是在的:上马做撸铁做试验,下马键盘写报告,左手网格做仿真,右手代码搞算法。 总而言之,俺更成熟了。希望明年越来越好! 2. 接触Python的感受 最大的感受,还是源于和MATLAB的对比。首先一个感觉就是乱,列表、元组、字典,常常搞混。应该是我用的太少的原因了吧。 另一个感受就是,很明显,Python能搞的更花哨,与网页交互、与ABAQUS交互、游戏开发等等。干的事情更贴近大众了。 实际上,我学这个软件,应该还是为了更方便地跟ABAQUS交互。之所以第一个算例拿遗传算法练手,也是看后面能不能用到复合材料的优化分析上。 目前,我的要求并不高哈,入门就行。 3. 遗传算法的实现过程老早就想研究下遗传算法,搞搞所谓的优化问题。实际上,这个理论上个世纪就已经很成熟了,随便下载几本老书,一个晚上也就看懂了。房间大灯一关,拉开床边的窗帘,打开床头的看书灯,大窗外月光皎洁,寒风呼啸,我躺在电热毯上,学着学着,嗯也就睡着了。其实好多类似于遗传算法这种上个世纪的东西,在最近这些年被国内追捧的不行。动辄就吹爆的机器学习、人工智能、神经网络、3D打印,都是几十年前的。。。现在大家到处吹,课题里吹,项目里吹,会议里吹,实在搞不懂。也对,技术内卷嘛,口 活先行。 遗传算法是通过模拟自然界的进化过程,达到筛选优化的目的。比如你要求一个函数在某个区间的最大值,先给定一组初始值作为0代祖先,然后设置筛选标准,淘汰一些不好的个体,这些个体自身的值可以转换成二进制的DNA编码,然后随机两两配对,交换DNA片段,形成新的个体,如果再考虑基因变异,让二进制一些位置的0或者1,反置。这样就彻底完成新一代种群的产生。搞个几十代,嗯,最后发现整个种群趋同了,也就是收敛了。 哇,做的时候,可以享受到造物主般的感受。 从上面的过程也看到了,一个简单遗传算法的实现,需要搞出一下东西: (1)订立编码和解码规则。比如二进制来存储信息;(2)订立筛选(基因遗传)规则。比如可以用轮盘赌算法,干掉那些不合格的个体;(3)建立基因交叉算子。随机配对算法、DNA片段交叉算法;(4)建立基因变异算子。DNA片段随机变异算法。 网上讲这些东西的文章很多啦,我这就不说具体算法的实现了。展示下我的算例和结果吧!算例:考虑y=x2在[0.31],区间上的最大值。经过30次迭代的均值结果如下:基本上最后会在30左右浮动。不过这个是我给的比较好的结果。有的时候,它也会收敛在一个不太高的水平上。因为程序里面用了很多随机数,所以是不能保证每次结果都一样的。而且遗传算法对初值的依赖性很强,并且十分“早熟”,很快就达到收敛状态,不管收敛的结果好不好。只负责赶紧生娃制造下一代,不考虑质量! 所以,真正实用的遗传算法还需要根据具体问题,做大量的训练积累经验数据,然后对各个关键算子,做出一定的改进。 果然啊,造物主不好当,上帝造人也不知废了多少劲,说不定也失败了无数次。当然,这一次是不是成功的呢?很难讲。 读者讨论功能目前被禁了,大家有自己好看的科研故事可以投稿给我!算法附后# -*- coding: utf-8 -*-"""SpyderEditorThisis a temporary script file."""importrandomimportnumpy as npimportmathfromnumpy import *importmatplotlib.pyplot as pltn_group=6#群体大小n_gen=30#代数S=[31,0,15,random.randint(0, 31),random.randint(0, 31),random.randint(0, 31)]#初始化种群jnum=0print(S)junzhi=[]junzhi.append(mean(S))number_gen=[]number_gen.append(jnum)while jnum < n_gen:#编码——采用二进制Sb=[]fori in S:zhuanhuanjinzhi = '{:05b}'.format(i)Sb.append(zhuanhuanjinzhi)#计算适应度f=[]fsum=0fzhi=[]fori in S:fs = i**2fsum=fsum+fsfzhi.append(fs)f.append(fs)fp=np.array(fzhi)/fsum #计算个体适应度# print (fp) fpsum=[] fpsumx=0 fori in fp:fpsumx=fpsumx+ifpsum.append(fpsumx)#计算个体累计概率# print (fpsum) fxz=np.zeros((len(fp)),dtype=np.int64)xs=0#---------------------------复 制 --------------------------- whilexs <len(fxz): #———轮盘赌算法random_value = random.random()# print (random_value)forss in range(len(fxz)):ifss==len(fxz)-1:sx=0else:sx=ss+1 iffpsum[ss] <= random_value and fpsum[sx] >= random_value:cind=sxbreakfxz[cind]=fxz[cind]+1 xs=xs+1#根据复 制结果,更新一轮种群Sbb=[]xs=0 whilexs <len(fxz): iffxz[xs] > 0:zhongqunfuzhi=[Sb[xs]]*fxz[xs]foryuansu in zhongqunfuzhi:Sbb.append(yuansu)xs=xs+1 Sb=Sbb#---------------------------交叉---------------------------#随机两两配对——from https://www.jianshu.com/p/d29091e7e37a?from=groupmessage# print(Sb)ifjnum%2 ==0:members = Sbrandom.shuffle(members)d= list(range(0,len(members),2))Sbb=[]jxweizhi=math.floor(len(Sb[1])/2)+1fori in d: Sbb.append(members[i][0:jxweizhi]+members[i+1][jxweizhi:])Sbb.append(members[i+1][0:jxweizhi]+members[i][jxweizhi:])Sb=Sbb#---------------------------变异---------------------------jxweizhi=math.floor(len(Sb[1])/2) ifjnum%10 ==0:ifint(Sb[bianyiw][0]) == 0:Sb[bianyiw] ='1'+Sb[bianyiw][1:]else:Sb[bianyiw] ='0'+Sb[bianyiw][1:]ifjnum%3 ==0: bianyiw=random.randint(0, len(S)-1)ifint(Sb[bianyiw][jxweizhi]) == 0:Sb[bianyiw] =Sb[bianyiw][0:jxweizhi]+'1'+Sb[bianyiw][jxweizhi+1:]else:Sb[bianyiw] =Sb[bianyiw][0:jxweizhi]+'0'+Sb[bianyiw][jxweizhi+1:] #---------------------------解码---------------------------S=[]fori in Sb:zhuanhuanjinzhi = int(i,2)S.append(zhuanhuanjinzhi)junzhi.append(mean(S))jnum=jnum+1number_gen.append(jnum)print(S)#---------------------------画图--------------------------- plt.plot(number_gen,junzhi)来源:静界有限元

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习计划 福利任务
下载APP
联系我们
帮助与反馈