首页/文章/ 详情

前几天我去了NAFEMS 会议

11小时前浏览4

可能细心的朋友们会发现,我这几天没怎么更新,那是因为前几天去奥地利萨尔兹堡参加了NAFEMS 2025的国际会议,对NAFEMS就是那个搞了一堆benchmark那个,作为现场唯一一家中国仿真厂商的代表,与现场的各位朋友们进行了充分的交流。然后出差挺累,又倒时差就没来得及继续写东西。

首先给大狗子公众 号的大伙们,看一看萨尔兹堡的美景 (我时差一直没倒过来,每天早上4点多醒,6点多去河边散步)


会议总共持续了四天,会议上我和世界顶级的那几个仿真软件供应商的人员都有很多交流,就是大家熟悉的那几个:

  1. Dassaullt Simulia
  2. Ansys
  3. Simens
  4. Altair (已经成为Simens的一部分)

总的聊下来听下来,给我的感受就是核心技术方面其实没啥差别,大家都是在以往的技术上各种打磨,而对于新兴技术也都在探索阶段(比如AI,model reduction)。

这几天,我看到有好多人在转发老美对我们CAD、CAE断供等等,很多人很担忧。而在我看来,其实问题并不大,中国向来不缺优秀的工程师,缺少的可能是工程师文化,让工程师可以坚定的做自己擅长的事情。国外的商业软件公司这些年来做的比较好的就是真正理解工程师的需求,去打磨去优化他们的软件,然后逐步的变好,这就是一个过程,想着弯道超车不太现实,但是我们其实也并没有落后太多,也并不至于赶不上。

举个例子,达索Simulia老哥讲自己通过新的3DE平台,CST+Abaqus可以co-simulation,非常自信,讲的可high了。但其实我们做过这些编码的人也都知道,这也没啥,笔者博士的时候拿一个别人的电磁软件,加自己写的结构仿真软件基于PreCICE也可以轻松实现这种界面弱耦合,本质上达索就是做了个自动化的事情,这个事本质上不难,但是只要用户觉得工作变轻松了就是好的,对工程师就是有意义的。在我看来我们国内很多老师可能有套优秀的求解器(在某一个或者某一些方面优秀),但是并没有花心思把这些东西弄成一套完整的用户好用的软件,大多数人也懒得打磨,这些地方我们确实相比巨头们有差距,但是我觉得是这是属于坚定着做下去就会有结果那种。

另外就是老外真的把数值仿真当回事(可能是他们试验太贵的缘故),越来越多的场景靠仿真去解决,从传统的机械、土木、能源、汽车、航空航天,到最近的生命健康、制药等,到处都离不开仿真。而我接触的很多企业还更多的是将仿真当作一种验证工具或者只求交个报告,大家更倾向于相信实物的结果,我只能说这也同样是个过程,我也看到越来越多的企业定义了自己的仿真规范,越来越多的企业通过验证与校核形成一套自己行之有效的仿真方法。

最后说一个那就是老外真的很把Marketing当回事,市场营销方面,我们会看到Simulia与Simens这些大场的炫酷展示,同样1-10人的小公司也有诸多精彩海报、文稿、VR、AR展示,这点我们真的得跟老外学学,毕竟这个年代,酒香也怕巷子深。

说点自己的不成熟的见解,很多人经常讨论所谓国产软件如何突围,讨论的五花八门,我比较年轻,比较愣头青,所以想着干就完了,自主且开放,知道老外在干啥,且坚定的走出自己的路。



来源:大狗子说数值模拟
Abaqus航空航天汽车制药CST试验ANSYSAltair
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2025-06-07
最近编辑:11小时前
大狗子说数值模拟
博士 传播国际一流的数值模拟算法
获赞 9粉丝 17文章 59课程 0
点赞
收藏
作者推荐

有限元基础知识:AABB包围盒的计算

上次说了接触计算中的几种不同的包围盒子,有限元基础知识:接触计算中的包围盒子下面开始分别讲一下各自的编码实现,先从最简单的AABB开始,AABB包围盒由于每个面(3D)都与坐标系平行,所以其实只需要找到,x,y,z 三个方向上所有节点的最大值和最小值就行了。下边以C++代码为例,给大家示范一下AABB的计算流程// 函数定义using point3D = std::array<double, 3>;struct AABB{ point3D min; point3D max; void init(); void addPoint(const point3D & p)};void AABB::init(){ min[0] = min[1] = min[2] = FLT_MAX; max[0] = max[1] = max[2] = -FLT_MAX;};void addPoint(const point3D & p){ if (p[0] < min[0]) min[0] = p[0]; if (p[0] > max[0]) max[0] = p[0]; if (p[1] < min[1]) min[1] = p[1]; if (p[1] > max[1]) max[1] = p[1]; if (p[2] < min[2]) min[2] = p[2]; if (p[2] > max[2]) max[2] = p[2];};// 真正的形成一个AABBAABB box;box.init();// 对于主面或者从面的节点循环// points is a vector of point3Dfor (auto p : points){ box.addPoint(p);} 那么这样一个主面或者从面的包围盒子就形成了,然而在真实的有限元计算中,由于我们需要定位潜在可能发生的接触,或者接触已经发生了,已经有了微小的穿透,以上还需要进行一点点补充,就是增加一些buffer,给现在的box扩大一圈,一般的做法如下:void AABB::addBuffer(double dis){ min[0] -= dis; min[1] -= dis; min[2] -= dis; max[0] += dis; max[1] += dis; max[2] += dis;};box.addBuffer(dis); 这样我们就完成了一个扩大化的bounding box, 如下图所示,蓝色的就是最开始计算的box,而红色虚线就是加上了buffer的box 那么然后就是如何检测两个bounding box 是否接触了,这个也非常简单,若所有轴均重叠则碰撞,否则就不bool AABBIntersect(const AABB & box1, const AABB & box2){ return (box1.min[0] <= box2.max[0] && box1.max[0] >= box2.min[0]) && (box1.min[1] <= box2.max[1] && box1.max[1] >= box2.min[1]) && (box1.min[2] <= box2.max[2] && box.max[2] >= box2.min[2]);} 这样我们就能检测两个AABB的box是否接触,做一个粗放式的检查。好了今天就先到这,明天讲一下OBB与分离轴定理SAT的编码实现,敬请期待。来源:大狗子说数值模拟

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