开源项目Futureye:FEM有限元计算及反问题
本帖最后由 nkliuyueming 于 2012-11-2 13:03 编辑不断更新中...
2012/11/2加了几个算例,从图片自动提取计算区域进行建模计算:
https://lh4.googleusercontent.com/-9keZTkOsMtM/UH9wUFbAILI/AAAAAAAAAvI/C7sMgqNQjNE/w484-h224-n-k/car1-1.pnghttps://lh3.googleusercontent.com/-aniDC0jfDCw/UH9wUFUXuHI/AAAAAAAAAvE/n8PnktxrNqE/w484-h224-n-k/car1-2.png
https://lh3.googleusercontent.com/-GbwXVit_TlM/UH9wURc60TI/AAAAAAAAAvM/loMT-rXAxP8/w593-h273-n-k/hand1-1.pnghttps://lh6.googleusercontent.com/-0n5nOmbANv0/UH9wVKoOtrI/AAAAAAAAAvc/clPAbAe2HBw/w654-h302-n-k/hand1-3.pnghttps://lh4.googleusercontent.com/-VRmMoET0F_I/UH9wUrsmoDI/AAAAAAAAAvU/iGaeRwMfYB4/w594-h273-n-k/hand1-2.png
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==
https://lh4.googleusercontent.com/-6BKnBWr-xUQ/TsaxTCHVeMI/AAAAAAAAAr4/LZeaDSZ_V_E/s288/elasticDamInit.pnghttps://lh3.googleusercontent.com/-CGqi7mLpOeo/TsaxTPkESVI/AAAAAAAAArk/K3mf8ixVBuU/s288/elasticDamRlt.pnghttps://lh6.googleusercontent.com/-gvjWG6MvFXc/TsaxTIsLuQI/AAAAAAAAAro/8Cze5IQ2lf8/s288/elasticHoleInit.pnghttps://lh6.googleusercontent.com/-IlcKQ47l-0A/TsaxThv5QsI/AAAAAAAAAr0/gUdNXBk9x_U/s288/elasticHoleRlt.png
==Stokes Equation==
https://lh4.googleusercontent.com/_Cil2MFH7iLM/TYV8o-ST-RI/AAAAAAAAAF4/djcZzGrJ2Fc/s288/cylinder4.pnghttps://lh3.googleusercontent.com/_Cil2MFH7iLM/TbpB8RvD_iI/AAAAAAAAAH0/n0YXrevRCoc/s288/box.png
==Benchmark of Navier-Stokes Equations==
https://lh3.googleusercontent.com/-1dVIzXpwgac/TsafQjWW3WI/AAAAAAAAAqY/7qRiEKDEmcA/s400/NS1.pnghttps://lh3.googleusercontent.com/-flx640NVIf4/TsafQQUHOZI/AAAAAAAAAqQ/Y2zq_GU57gQ/s400/NS2.png
https://lh5.googleusercontent.com/--kWi6uDzZbY/TsafPwE_63I/AAAAAAAAAqA/W3XSIDxyFkk/s400/NS3.pnghttps://lh3.googleusercontent.com/-smYdom1bckU/TsafQFfkKVI/AAAAAAAAAqI/1xJK6MY5Kec/s400/NS4.png
https://lh5.googleusercontent.com/-MgfdT9KqmRI/Tsah4Xd15WI/AAAAAAAAAq0/D32uVqKnmTo/s288/NSBox.png
==Numerical Optimization for Inverse Problems==
https://lh4.googleusercontent.com/-MsgxFIrber8/T-HaVnasgxI/AAAAAAAAAt4/oeGSx-y1L_U/s800/Language1.png
==Inverse Problem: Near-Infrared Diffusion Optical Tomography (DOT)==
https://lh3.googleusercontent.com/-R98pYWlTVRE/TsavryY5GnI/AAAAAAAAArQ/iIam-vbDVQc/s288/DOT1.pnghttps://lh5.googleusercontent.com/-QTCz_HJtGQY/Tsavroh0U7I/AAAAAAAAArA/GlEzcMR7-9U/s288/DOT2.pnghttps://lh4.googleusercontent.com/-XFbSayVIEi4/Tsavrp2P3FI/AAAAAAAAArE/74SF44b7nFE/s288/DOT3.pnghttps://lh4.googleusercontent.com/-4OgNXhubj7Q/TsavsB1Nb7I/AAAAAAAAArY/Pgc8d6oQd-s/s288/DOT4.png
欢迎大家讨论啊,以后会写一些为什么用Java来做有限元计算的理由。 To read forty thousand lines source code is not that easy. It will take a lot of time and patience. How can you help us if some of us are really interested in this?
Can I provide you with some more numerical examples? I just want to see how is the performance of the software.
Thanks. Two questi**:
1. Why using Java in such computatinal intensive problem?
2. How about parrallel calculation? 本帖最后由 pasuka 于 2011-8-31 10:55 编辑
hillyuan 发表于 2011-8-31 10:38 static/image/common/back.gif
Two questi**:
1. Why using Java in such computatinal intensive problem?
2. How about parrallel calcu ...
我也对lz选择完全用java编写这样的程序匪夷所思。。。
matlab虽然很多地方都用到了java,但是也不完全是用Java写的 本帖最后由 nkliuyueming 于 2011-8-31 12:19 编辑
pasuka 发表于 2011-8-31 10:53 static/image/common/back.gif
我也对lz选择完全用java编写这样的程序匪夷所思。。。
matlab虽然很多地方都用到了java,但是也不完全是 ...
首先承认Java的速度比起C/C++和Fortran要慢,但不是慢的不可接受,最多慢10%吧,关于这方面的讨论已经很多了,不赘述了。但是从Java得到的好处却很多:
1. 语法要容易,面向对象的概念要简单的多
2. 内建的垃?圾?回收机制,不用自己考虑内存管理问题,相信很多使用C++的同志都经历过delete对象出错的痛苦
3. 运行时异常与错误处理非常容易,另外自带的JStack, Jmap等命令可以在程序运行时分析程序堆栈情况,查错变得容易多了
4. 免费的集成开发环境Eclipse非常好用,例如你在写代码的时候,其中的错误已经提示出来,极大的提高程序开发效率
5. 关于并行计算,大部分并行库都有Java接口,开发起来不是问题,Futureye项目的核心也集中在单元分析与合成上,代数方程组求解已经预留了外部接口 我也觉得用java不是什么大问题,真正要考虑效率的地方可以用jni做优化。 nkliuyueming 发表于 2011-8-31 12:17 static/image/common/back.gif
首先承认Java的速度比起C/C++和Fortran要慢,但不是慢的不可接受,最多慢10%吧,关于这方面的讨论已经很 ...
问题是:
1、搞数值计算的,用java的人相比C/C++、Fortran实在太少了;
2、用java还不如用python,更简单易用,还能方便地使用以前的C/C++、Fortran代码;
3、既然在谷歌code上建立项目,目的是众人拾柴火焰高,可是选择全部用Java编写本身就把许多人挡在门外了
pasuka 发表于 2011-8-31 12:42 static/image/common/back.gif
问题是:
1、搞数值计算的,用java的人相比C/C++、Fortran实在太少了;
2、用java还不如用python,更简单 ...
个人认为编程语言不会成为大障碍。如果不做太大的改动的话,比着葫芦画瓢,应该够用了。 本帖最后由 tonnyw 于 2011-8-31 13:37 编辑
tonnyw 发表于 2011-8-31 13:13 static/image/common/back.gif
个人认为编程语言不会成为大障碍。如果不做太大的改动的话,比着葫芦画瓢,应该够用了。 ...
是的,Java很容易学,而且想出错也不太容易:)
我不知道你如何感觉。我自己觉得读懂别人的有限元程序,最重要的是该有限元程序的理论说明是否详细。我看了你的手册,对于单元的理论描述还是不够详细。
这是应力场还是位移场?红圈所示处不应该应力集中的部位吗? tonnyw 发表于 2011-8-31 13:43 static/image/common/back.gif
这是应力场还是位移场?红圈所示处不应该应力集中的部位吗?
It seems like you have h-adaptivity. Do you have p-adaptivity? tonnyw 发表于 2011-8-31 13:13 static/image/common/back.gif
个人认为编程语言不会成为大障碍。如果不做太大的改动的话,比着葫芦画瓢,应该够用了。 ...
如果只是使用者的话,确实没有大问题
不过要作为开发者增加新的代码或者单元,实现某种算法就必须得看懂那部分对应的Java代码,就不知道java插入C/C++代码是否像python代码中插入C/C++那样方便呢? 很有兴趣,但不会Java啊,C++或者Fortran就好了 本帖最后由 hillyuan 于 2011-8-31 16:17 编辑
nkliuyueming 发表于 2011-8-31 12:17 static/image/common/back.gif
首先承认Java的速度比起C/C++和Fortran要慢,但不是慢的不可接受,最多慢10%吧,关于这方面的讨论已经很 ...
1. Java is not the only Object-oriented language. Simpler is not always the better.
2. You can use, e.g., smart poiniter in C++
4. Most language, including Fortran C++, could use Eclipse
5. If you don't c-**ider parrallel computation at the stage of your software design, It would be a BIG problem.
I havn't compared Java with C etc myself, but 10% slower is a vital factor for user to choose a software. Anyway, I don't believe your problem would just 10% slow! For example, I see you build your own blas and lapack library. As my experience, a good blas library, such as GOTOBlas, should be several times fast than those of not optimazed ones.
tonnyw 发表于 2011-8-31 13:43 static/image/common/back.gif
这是应力场还是位移场?红圈所示处不应该应力集中的部位吗?
这个是位移场,等值线是位移场的y分量 pasuka 发表于 2011-8-31 14:17 static/image/common/back.gif
如果只是使用者的话,确实没有大问题
不过要作为开发者增加新的代码或者单元,实现某种算法就必须得看懂 ...
不行,需要调用JNI使用本地方法 本帖最后由 nkliuyueming 于 2011-9-2 01:43 编辑
hillyuan 发表于 2011-8-31 16:06 static/image/common/back.gif
1. Java is not the only Object-oriented language. Simpler is not always the better.
2. You can use ...
你说的对,不过十全十美的东西很难找,我只是想发掘优势,弥补不足。 tonnyw 发表于 2011-8-31 13:44 static/image/common/back.gif
It seems like you have h-adaptivity. Do you have p-adaptivity?
Only h-adaptivity examples now, but p-adaptivity is possible. 感觉如果说用JAVA最大的好处,感觉应该是可以跨平台吧,而且还可以分布式计算,虽然在目前实现的难度还是很大,可是也是一个很好的扩展性考虑不是?不过感觉原来编软件的时候,JAVA最大的限制还是在IDE工具上,Eclipse也好,JBuider也罢,和VS一比简直。。。当然,这个也可以不算,毕竟做有限元编程很多人还在用VC++6.0,所以,总体来说,支持一下楼主!请教一下,楼主你用Eclipse的时候用CVS吗?这个我从3.2开始调,一直不是很好用,估计会对异地代码开发有影响吧?