找回密码
 注册
Simdroid-非首页
查看: 730|回复: 11

[其他] 我写的有限元软件(很适合学习基础数学理论)

[复制链接]
发表于 2012-6-13 13:56:33 | 显示全部楼层 |阅读模式 来自 美国
发现这个版更适合,不断更新中...

2012/6/13
好久没来了,最近完成一篇关于这个软件的论文(不得不写啊,论文也很重要),等发出来了贴给大家。
论文的主要内容都来自帮助文档


2012/4/8
更新源码和帮助文档:
FuturEye3.0   

Scala语言版本: ScalaFEM0.1






2012/3/20
好久没来了,给大家汇报一下最近的情况吧,FutuEye3.0的用户手册在2.1的基础上进行了修改,增加了很多内容,不过还没写完,请稍等
另外,用Scala语言(与Java一样,都是基于JVM虚拟机的,支持面向对象和Functional编程,很适合用来开发专业领域的软件,语法可扩充)
又开发了ScalaFEM,是基于FuturEye3.0的基础上进行封装的。

下面给一个例子:求解如下问题
*   -k*\Delta{u} + c*u*v = f in \Omega
*   u=0,                     on \Gamma_D
*   d*u + k*u_n = q          on \Gamma_N
* where
*   \Omega = [-3,3]*[-3,3]
*   \Gamma_N = Right boundary
*   \Gamma_D = Other boundary
*   k = 1.0
*   c = sqrt(x^2+y^2)
*   f = -2.0*(x^2+y^2)+36.0
*   d = 1.0
*   q = 1.0

方程的弱形式在ScalaFEM中可以写成
            val laplace = new PDE
            val k = C1
            val c = sqrt(X*X+Y*Y)
            val f = -2.0*(X*X+Y*Y)+36.0
            val d = C1
            val q = C1
            laplace.integrate(LHS, Inner) {
                    (u,v) => (grad(u, "x","y") dot grad(v, "x","y")) + c*u*v
            }.integrate(LHS, Border) {
                    (u,v) => d*u*v
            }.integrate(RHS, Inner) {
                    (u,v) => f*v
            }.integrate(RHS, Border) {
                    (u,v) => q*v
            }

可以看到,已经很接近数学表达式了。完整的代码在30#楼。



开篇:
Futureye是一个用面向对象方法开发的FEM工具包。它将FEM中的“数学”理论与Java中的对象紧密关联,实现了有限元计算过程。其他类似面向对象的FEM软件几乎都是“大对象”,“粗抽象”,很难精细控制有限元形函数、单元、网格等,不利于新方法的研制和测试。Futureye目前可以求解所有FEM的基本问题以及基于PDE的反问题。现在软件代码已经超过5万多行,有兴趣的请联系我,可以共同学习、研究。 项目地址:http://code.google.com/p/futureye/
该项目为MIT授权。我的邮箱:nkliuyueming@gmail.com

上几个图:
==Plane Elastic==


==Stokes Equation==

==Benchmark of Navier-Stokes Equations==




==Numerical Optimization for Inverse Problems==


==Inverse Problem: Near-Infrared Diffusion Optical Tomography (DOT)==


发表于 2012-6-13 21:29:03 | 显示全部楼层 来自 美国
Simdroid开发平台
Excellent work.
回复 不支持

使用道具 举报

发表于 2012-6-14 12:00:49 | 显示全部楼层 来自 日本
一个人能做出这样完整的工作,非常了不起!值得大家学习!

大致看了一下你的user manual,有如下感受

1)入你所说,你的软件特征是它的Function类。原以为在你的软件中有符号运算功能,但实际上应只能说表面如此,用户在将此类作扩展时仍要将计算式展开。这样的话你即牺牲了计算效,又没有给用户提供实质的方便。这样的功能是否需要?
  你是否可以参考一下Fenics(http://fenicsproject.org/),该软件的上述功能就很有吸引力。

2)你提供的Matrix和Vector是不可用的,它绝对的费时,费内存。
  在我做过的一个项目中,曾有人用Boost作了类似的功能,结果计算时间是同样c实现的几十倍,需要内存是同样c实现的几十倍(具体数字忘了,但绝对是恐怖的数字),结果只好从写。

3)个人认为你的Inverse计算应可算是特征之一,似乎没有开源有此功能。

该软件的计算效会是很低的,望你能做一些比较计算说明它的能力。
回复 不支持

使用道具 举报

 楼主| 发表于 2012-6-15 07:10:15 | 显示全部楼层 来自 美国
tonnyw 发表于 2012-6-15 04:07
It seems to me that in order to use this software the user has to know the governing equation. What  ...

这个函数定义在类edu.uta.futureye.function.basic.FDelta里面,1,2,3维的x都可以,右端项可以自动插值到网格上。shell单元我清楚,我是搞数学的,所以一些工程上常用的单元还需要学习。
回复 不支持

使用道具 举报

发表于 2012-6-14 22:25:50 | 显示全部楼层 来自 美国
之前就看过这个软件了,对作者的开发能力敬佩不已。
楼主加油。
回复 不支持

使用道具 举报

发表于 2012-6-15 04:07:10 | 显示全部楼层 来自 美国
It seems to me that in order to use this software the user has to know the governing equation. What if the user does not the governing equation? For example, the user wants to use shell element to solve a problem.

Can you solve something like the following?
-d^2 u/dx^2 = F*delta(x0)
u(0) = u(1) =1
where delta(x0) is the delta function that goes infinity at x0.
回复 不支持

使用道具 举报

发表于 2012-6-15 04:10:30 | 显示全部楼层 来自 美国
小变形板和梁好像可以,有个laplace的例子。
回复 不支持

使用道具 举报

 楼主| 发表于 2012-6-15 07:54:06 | 显示全部楼层 来自 美国
本帖最后由 nkliuyueming 于 2012-6-15 07:57 编辑
hillyuan 发表于 2012-6-14 12:00
一个人能做出这样完整的工作,非常了不起!值得大家学习!

大致看了一下你的user manual,有如下感受

谢谢,非常好的评论,这些问题都可以展开讨论,可以讨论的地方很多

1)用户只要定义好基本函数,复杂的函数都可以通过函数组合,复合,求导数实现(没有积分功能),只要定义好了函数(一般是方程系数和右端项),剩下的事情就可以自动计算了。函数计算效率的优化有专门的一节讨论,有一些技巧,感兴趣可以交流一下。你提到的FEniCS项目,我写的关于FuturEye的论文提到过,这个项目把有限元求解分成了几个子项目,各自独立,通过定义标准节接口实现一个完整的有限元计算过程。其中方程的表示用SyFi或者FFC把一个脚本语言描述的方程处理过之后,生成C++源代码,最后再和求解库一块编译。这种源码生成的好处是最后的计算速度可以优化的很好,但是生成源码的时间也不能不考虑。个人感觉比较松散。国内类似方法的软件有梁国平的FEPG(透露一下,是我博士导师的同学),用过一点,很不错,是生成Fortran代码的。利用纯符号计算软件做这一块的很早就有了,90年代吧,利用REDUCE和Macsyma做,然后生成源代码。另外还有用Mathematica做的(AceFEM)。我的不是纯符号运算,没有parse表达式的功能。我用Java类来实现数学函数的运算,比如复合函数,导数等操作,还可以自动离散。对于做算例和开发测试新单元很方便,不用手工推导完了再写代码。这个函数的功能的出发点也是节省手工推导的麻烦。

2)Matrix和Vector目前有3种实现,用于不同的目的,一般稀疏矩阵用HashMap做的,只是用来生成刚度矩阵的时候用,不能用于方程组求解,会死人的。压缩存储的稀疏矩阵和满矩实现了AlgebraMatrix接口,可以用来做求解器,只用到了基本java数组实现。另外我定义了接口可以调用本地的C和Fortran求解器(通过用netlib-java的库http://code.google.com/p/netlib-java/)。另外值得一提的是Java写的Colt(欧洲做高能物理的人搞的),求解方程组很不错。求解器速度的优化是个永恒的主题,我这个软件还需要很多优化。

3) 没有任何保留,都是开源的,你可以在edu.uta.futureye.application包里面找到这些反问题的应用

最后计算效率是个问题,做大规模的问题不行,现在的设计吃内存太多,需要有好办法改进。
回复 不支持

使用道具 举报

发表于 2012-6-15 09:28:23 | 显示全部楼层 来自 北京
对于从事基础工作的人,我都是致意十二分的敬意的

我本身以工程应用为主,这种基础工作做不来的

感谢楼主的研究
回复 不支持

使用道具 举报

发表于 2012-6-20 15:36:43 | 显示全部楼层 来自 四川成都
交流学习
回复 不支持

使用道具 举报

 楼主| 发表于 2012-7-19 12:17:40 | 显示全部楼层 来自 美国
myleader 发表于 2012-6-15 09:28
对于从事基础工作的人,我都是致意十二分的敬意的

我本身以工程应用为主,这种基础工作做不来的

谢谢楼主,我也有打算做一点应用,毕竟不能应用于实际的东西,最终也不会有太大的价值。
回复 不支持

使用道具 举报

发表于 2012-12-12 23:55:12 | 显示全部楼层 来自 河南洛阳
非常好,楼主的编程能力很强大啊
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-20 10:49 , Processed in 0.033273 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表