qlearner的个人博客分享 http://blog.sciencenet.cn/u/qlearner

博文

AFEPack 学习注意点

已有 5338 次阅读 2012-7-17 11:12 |个人分类:专业学习|系统分类:科研笔记| 学习, AFEPack

1、安装AFEPack软件包,需要提前安好的软件有gcc、g++、doxygen、automake、dx、emac、vim。
2、例子运行时找不到 libAFEPack.so,查看看看路径 /usr/local/lib(AFEPack安装的lib文件路径)  是不是写进了/etc/ld.so.conf文件。如果没有,需要加进 这个路径,并以管理员权限运行一次 /sbin/ldconfig。这个做法的依据是:在/etc/ld.so.conf文件中写入动态函数库所在的目录(是目录,不是文件),这样可执行文件运行时,动态函数库就会先加载到内存中,增加了读取速度。ldconfig是将/etc/ld.so.conf的数据读入缓存中。
3、main(int argc, char*argv[])
这个函数中两个参数的意义,argc记录的是命令行中输入参数的数目,以空格分割,argv是一个拥有argc个元素的字符串数组,每个元素保存一个命令行中输入的参数。
4、linux下的路径非常重要,不要搞错。/home/qixinbo/files/AFEPack,而不是/home/qixinbo/AFEPack
5、编程时函数的输入参数弄准。如 triangle_template_dof(triangle_template_geometry),当时忘了带参数,自由度的设定要有几何信息作准备。
6、在emacs中使用gdb调试程序:http://emacser.com/emacs-gdb.htm#sec-6.3
以下论述有的引自movingmesh论坛上老师和师兄的话,有的是自己感悟,总结以理解:
7、CoordTransform类决定参考单元到网格单元之间的映射的 方式,一般不必修改,只和单元的形状有关系 。三角形和四边形应该读入不同的模板文件, 如果暂时只用三角形,就不必改了。
8、Template.n.tmp_dof文件存储每个几何体上的自由度分布,如0维点、一维边、二维形上各分布有多少自由度。
9、建立有限元空间需要一个网格和一组参考单元,但一般只形成不多于四个的参考单元,用一个数组存储。
10、StiffMatrix类在库中已内置(这个矩阵可看作一个标准的稀疏矩阵样板,偏微分前面的系数为1,而若不为1,则需要自己构造刚度矩阵),故可根据有限元空间直接生成该类的一个对象,然后设置计算矩阵时使用的数值积分公式的代数精度的阶数,再build计算即可。
11、自己构造刚度矩阵时用的getElementMatrix函数可接收两个参考单元信息,这两个可分布在不同的有限元空间上。计算数值积分时,积分点先给在参考单元上,然后通过坐标变换映射到实际单元上,成为实际单元上的积分点。
12、
网格可以使用 Gmsh 产生一个比较稀疏的,然后用 mesh_refine_3d  命令进行均匀加密就能获得三维情况下比较大 的网格了。
13、GMSH软件是一个自动的三维网格生成器。安装最好从源代码(source文件)安装,这样能够将函数库链接好,直接使用binary文件可能会找不到函数库。安装gmsh软件需要:一个C++编译器、cmake、FLTK1.1.7以上以及BLAS和LAPACK库(尤其是里面的liblapack-dev)等。
14、两种求解器:(吴师兄)
AMGSolver solver;  solver.lazyReinit(stiff_matrix);
或AMGSolver solver;  solver.solve(stiff_matrix);
lazy模式中用的投影算子是一个比较简单的形式,所以多代数多重网格的准备过程比较简单,但求解时相对慢一些。而普通的模式,准备过程比较长,但求解相对较快。也就是说,这两种方式只是处理同一个问题的两种不同方式,并不代表它们处理问题的范围不同。
比如你要解一个时间发展方程,总刚度矩阵需要频繁改变时,就推荐用lazy模式;如果总刚度矩阵很长时间不变,就推荐用默认的模式,因为可以在反复求解代数系统中节省时间。
15、段错误一般都是内存访问越界,比如一个指针指向没有分配的内存空间。刚写的时候出现段错误,多数原因是类似数组越界访问的情况。比如你一个数组分配有10个,但a[10]就是个没有分配的空间。这主要是因为对问题的数学理解不清晰。(吴师兄)
16、一个单元上插值点的个数决定是什么插值,如果是三角形单元,只有三个节点就是线性插值,三个节点再加上三个中间点就是二次插值。中间点不看作节点。
一个点上的分量个数,就是这个点的自由度;所有点上的分量个数,就是整个单元的自由度。因为分量个数决定了未知参数的个数。每个点上分量个数与连接方式以及维数有关。如只有拉伸作用,没有旋转和扭转,且二维情况下,每个点的自由度为2。当只选择一个方向如x方向时,每个点的分量个数为1。AFEPack包中的自由度文件设定为每个点上有1个自由度。一般情况下每个点上的自由度个数相同(边界除外)。
自由度个数与节点个数不一样。按AFEPack包中的设定,每个点只有一个自由度来讨论:当线性插值时,两者相同;非线性插值时,自由度个数大于节点个数。自由度个数应该与所有点个数相对应。而组装刚度矩阵时,显然不能按节点个数来组装,应该按所有点来组装,所以按自由度来组装,这样自由度就与基函数一一对应。
17、L2Interpolate和L2Project的实现的原理不同:(吴师兄)
(1) L2Interpolate在计算新网格上的值时,只是简单的把新函数上的插值点值通过旧网格求出。例如P1空间,就是计算新网格的节点在就函数上的值,计算量很小;
(2) L2Project的实现就如同它的名字,是要保证L2内积的投影,也就是说,新投影出来的解u_new满足
         int_Omega  u_new * v dx = int_Omega u_old * v dx,
这里v是空间上的任意测试函数。所以操作过程必须做单元上的L2内积,也就是必须要两套网格上的数值积分,所以计算量会比前者大不少,算不动也是正常的。
新旧网格上有些量是必须要守恒的(比如能量),这时从数学角度就要做守恒型投影了。采用哪种算子实际上很依赖于问题,一般我们做网格自适应时都自己根据问题写投影算子。
23、openmpi安装注意点:
(1)configure过程中,--prefix=/path/指定安装路径,然后make all install。
如果使用动态链接库,还必须给环境变量LD_LIBRARY_PATH指定openmpi的库文件路径,即export LD_LIBRARY_PATH=/path/lib同时在环境变量PATH中指定openmpi的可执行文件路径,两项可在~/.bashrc中完成。
(2)在tarball文件的examples文件夹下make一下可以得到例子,用mpirun -np 2 ./hello_f90可以测试一下,如果有问题,如./hello_f90: error while loading shared libraries: libmpi_f90.so.0: cannot open shared object file: No such file or directory 则要检查一下是否$LD_LIBRARY_PATH是空的,执行export LD_LIBRARY_PATH=/usr/local/openmpi/lib以后就行了。
另外:为了用几个节点或者在一个节点上算题,再对ssh作一下工作。
1) sudo apt-get install openssh
2) cd; ssh-keygen -t rsa, 也可以是 ssh-keygen -t dsa 碰见提示就回车和yes.
3) cp ~/.ssh/id_rsa.pub ~/.ssh/authorized_keys, 完成无密码登录授权



https://blog.sciencenet.cn/blog-441611-592940.html

上一篇:linux小知识点 专帖
下一篇:AFEPack 基础知识
收藏 IP: 210.72.136.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-24 07:46

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部