ubuntu下CGNS套件的编译安装。

CGNS(CFD General Notation System)是什么就不废话了,搞CFD编程的应该有所了解

这里给出CGNS lib 和 CGNS Tools的编译安装方法。

(以下方法在ubuntu 9.04上完成。)

Part A 安装CGNS lib

1.下载源代码包

wget http://nchc.dl.sourceforge.net/sourceforge/cgns/cgnslib_2.5-3.tar.gz

2.解压缩

tar cgnslib_2.5-3.tar.gz
cd cgnslib_2.5

3.配置

./configure --enable-gcc

4.编译

make

5.安装

sudo make install
cd ..
注1:前几天惊喜的发现,在ubuntu9.04的源里面居然有cgns lib。如果不需要cgns tools的话可以直接安装源里的cgns lib。从源里安装命令如下
sudo apt-get install libcgns2 libcgns-dev

注2:在第三步配置时需要注意加选项 --enable-gcc。如果没有加,就不能用ifort、gfortran等进行编译时会报错如下:

 

/usr/local/lib/libcgns.a(cgnslib.o): In function `cg_version':
cgnslib.c:(.text+0x7dc): undefined reference to `__xtol'

/usr/local/lib/libcgns.a(cgnslib.o): In function `cg_field_read':
cgnslib.c:(.text+0x38f0): undefined reference to `__xtol'

cgnslib.c:(.text+0x39c4): undefined reference to `__xtol'
/usr/local/lib/libcgns.a(cgnslib.o): In function `cg_conn_read'
:
cgnslib.c:(.text+0x4c05): undefined reference to `__xtol'
cgnslib.c:(.text+0x4c5d): undefined reference to `__xtol'

这个错误折磨了我好几天。

Part B 安装CGNS Tools

由于编译时需要用到Part A中生成的make文件,所以最好接着Part A做。就是在做完Part A之后不要删除 cgnslib_2.5目录

为了编译还需要安装一些文件,命令如下:

sudo apt-get install tk-dev libglu1-mesa-dev  libxmu-dev libgl1-mesa-dev

1.下载源代码包

wget http://nchc.dl.sourceforge.net/sourceforge/cgns/cgnstools-2-5-2.tar.gz

2.解压缩

tar xvzf cgnstools-2-5-2.tar.gz
cd cgnstools

3.配置

./configure --enable-gcc

此处需要对make.defs文件修改。在文件中用下面两行替代上面两行。

TKINCS =
TKLIBS = -ltcl -ltk

TKINCS = -I/usr/include/tk
TKLIBS = -ltcl8.4 -ltk8.4 -lX11 -ldl  -lpthread -lieee -lm

注:应该只改 TKINCS = -I/usr/include/tk 就可以。

4.编译

make all

5.安装

sudo make install all

此处需要注意的是,虽然用的是 install all ,但是cgnsplot还没有安装,因此需要执行以下命令

cd cgnsplot
sudo make install
cd ..

如果没有问题的话就大功告成了。别忘了把这两个编译目录删除。

注:貌似还有一些编译好的可执行程序没有进行安装(如tools目录下的cgnslist等)。不过应该是没什么用的。

这是彩票还是骗局?

今天看到网易上的一篇文章《神奇!20注572万出自20个投注站 且都是单式票》(http://sports.163.com/09/0406/19/5686MUG100052DT2.html)令我瞠目结舌!

看到数学家计算出这个事情的概率为7.6479039856437971544432348924782e-203,该文章作者说“在概率学上这叫做极小概率事件,换言之,这种事件在人类可以预见到的未来基本不可能发生第二次。”。

不得不说这个作者是个外行。我学过概率(虽然考试成绩并不好),但是也知道什么是小概率事件,小概率事件是几乎不可能发生的。

我认为这次事件说明了一个事实,这是一场骗局。原因很简单"这种事件在人类可以预见到的未来基本不可能发生第二次。",相比之下我敢说"人类可以预见到的未来必定会有彩票作弊的事情发生“。

或者我们做两个假设:

A:这次彩票开奖是公正公平公开的。(可能性差不多是一亿亿亿亿亿亿亿亿亿亿亿亿亿亿亿亿亿亿亿亿亿亿亿亿亿……(至少25个亿)分之一)

B:这次彩票开奖是场骗局。(可能性肯定不会小于一亿亿亿分之一)

P.S.  假设B的可能性是我猜的,给不出什么证据。但是以我在人间混迹的这些年来看,这个估计还是比较靠谱的。这个概率意味着,“人类生存100亿年,每年彩票开奖合计1亿次,那么在如此众多的赌局中有人作弊一次。”,从这个可能性结果来看人类是如此的正直、高贵。另外的百万分之一的可能性可以认为是像这回一样,作弊者不小心露出马脚的概率。

无须多言,数学不撒谎,从这两个假设就可以看出此次事情的真相。

 

如果你不同意我的观点可以和我打赌(当然几乎没法验证),但是我要说的是:“我输得概率比一个老鹰扔个乌龟把我砸死的可能性还小。”

 

简单Fortran工程的 makefile 的模版

试着用automake生成fortran的make文件,总是搞不定。无奈只好通过google搜索,然后自己修改了一份makefile。存之……

#############################################################
#      ________________________
#     /  Makefile for Fortran  \
#     | Compile on Linux Write |
#     |  by wangbo 2009.2.14   |
#     |       2009.2.14        |
#     \        IN NUAA         /
#      ------------------------
#      \     /\  ___  /\
#       \   // \/   \/ \\
#          ((    O O    ))
#           \\ /     \ //
#            \/  | |  \/
#             |  | |  | 
#             |  | |  | 
#             |   o   | 
#             | |   | | 
#             |m|   |m| 
#############################################################
#              Globle set
# project name
PRO_NAME = hover

# FPE
FPEFLAGS = -fpe3

# output
FFLAGS = -o

# compiler
FF = ifort

# files & objects
FILES= variable.f90 main.f90 output.f90 solver.f90 timestep.f90
OBJECTS= variable.o main.o output.o solver.o timestep.o

#############################################################
#              default build
$(PRO_NAME): release
       
#############################################################
#              Clean files
clean:
        -rm -f *.o  *.mod $(PRO_NAME) d$(PRO_NAME)

#############################################################
#              Build Object file
$(OBJECTS) : $(FILES)
        $(FF) $(LFLAGS)  -c $(FILES)

#############################################################
#              Release
release : LFLAGS= -O3 $(FPEFLAGS)
release : $(OBJECTS)
        $(FF) $(LFLAGS) $(OBJECTS) $(FFLAGS) $(PRO_NAME)
        @echo -e "\033[;31m$(PRO_NAME)\033[0m : \033[33mRelease is now up2dated!\033[0m"

#############################################################
#              debug
debug : LFLAGS = -O0 -g $(FPEFLAGS)
debug : $(OBJECTS)
        $(FF) -g $(LFLAGS) $(OBJECTS) $(FFLAGS) d$(PRO_NAME)
        @echo -e "\033[;31m$(PRO_NAME)\033[0m : \033[33mDebug is now up2dated!\033[0m"

#############################################################
#                clean && debug
#               clean && release
cdebug : clean debug
crelease : clean $(PRO_NAME)

#############################################################
#                make tags
tag : $(FILES)
        rm -f tags
        ctags -R *90
cscope : $(FILES)
        rm -f cscope.*
        cscope -Rbq *.f90
 

 

 

 

程序计算完成的短信提醒

你是否有过这样的经历:程序不知道什么时候运算完,因此你不得不频繁的查看运行状态。或者不知道程序会在什么时候出现错误,因此溜号的时候总是提心吊胆。

这篇文章就是用来帮助你解决这个问题的。前提是你是中国移动用户,并且那个让你牵肠挂肚的的电脑可以上网。

在我的工作中,CFD(包括很多科学运算)程序需要运行很长的时间,完成时间难以确定。因此如果可以在计算完成后进行短信提醒则会起到很大的帮助。

通过google搜索,我发现可以采用 程序->脚本->电子邮件->短信 这样的流程来完成这一功能。

1.电子邮件->短信

    这一步可以采用139的信箱来完成。如果你是移动的用户就可以免费注册一个139信箱(mail.139.com)。这个信箱在收到邮件后会给注册的手机发送提醒短信,内容包括发件人和邮件标题。注册后邮箱名为 "手机号码@139.com"  例如 1391302****@139.com。

2.命令(脚本)->电子邮件

    对我来说这一步是最麻烦的(对于有些可以直接用命令行发送邮件的电脑来说这一步就极其简单了),我参考了网上的文章,用Gmail账户发送邮件。

主要参考http://www.61dh.com/blog/2009/01/ubuntu.html

1. 安装所需的软件

$ sudo apt-get install msmtp

$ sudo apt-get install nail

2. 安装Gamil的Thawte证书

$ mkdir -p ~/etc/.certs

$ chmod 0700 ~/etc/.certs

$ cd ~/etc/.certs

$ wget https://www.verisign.com/support/thawte-roots.zip --no-check-certificate

$ unzip thawte-roots.zip

$ cp Thawte\ Server\ Roots/ThawtePremiumServerCA_b64.txt ThawtePremiumServerCA.crt

3. 配置msmtp,我是用Vim打开的,原文使用gedit

$ gedit ~/.msmtprc

或者:

$ vim ~/.msmtprc

这将打开一个空白文档,你只需把下面大写部分改为你的个人设置后粘帖即可。因为我只想使用gmail account,所以我没有设置isp account,并且把account default改为gmail。 别忘了改“USER”!!!

# config options: http://msmtp.sourceforge.net/doc/msmtp.html#A-user-configuration-file

defaults

logfile /tmp/msmtp.log

# isp account

account isp

auth login

host SMTP.YOURISP.COM

port 25

user YOURNAME@ISP.COM

from YOURNAME@ISP.COM

password *****

# gmail account

account gmail

auth on

host smtp.gmail.com

port 587

user YOURNAME@gmail.com

password *****

from YOURNAME@gmail.com

tls on

tls_trust_file /home/USER/etc/.certs/ThawtePremiumServerCA.crt

# set default account to use (from above)

account default : isp

# 注意:我把默认改为 gmail

4. 更改msmtprc文件的许可

$ chmod 600 ~/.msmtprc

5. 配置nail,我是用Vim打开的,原文使用gedit

$ gedit ~/.mailrc

或者

$ vim ~/.mailrc

这将打开一个空白文档,你只需把下面大写部分改为你的个人设置后粘帖即可。因为我只想使用gmail account,所以我没有设置isp account。

# set smtp for nail

# ref: http://ubuntuforums.org/showpost.php...94&postcount=6

# docs: http://msmtp.sourceforge.net/doc/msm...guration-files

# isp account (default)

# $ nail -s "subject line" -a /path/file recipient@email.com < /path/body.txt

set from="YOURNAME@ISP.COM"

set sendmail="/usr/bin/msmtp"

set message-sendmail-extra-arguments="-a isp"

# gmail account

# $ nail -A gmail -s "subject line" -a /path/file recipient@email.com < /path/body.txt

account gmail {

set from="YOURNAME@gmail.com (YOURNAME)"

set sendmail="/usr/bin/msmtp"

set message-sendmail-extra-arguments="-a gmail"

}

搞定!!!

发送测试:

$ echo -e "testing email from the command line" > /tmp/test_email

$ nail -A gmail -s "gmail test" YOURNAME@gmail.com < /tmp/test_email

    完成了这个设置后建立两个文件第一个是~/etc/null 这个文件里面是所发邮件的内容。我把它设置为空内容。

    第二个文件是执行脚本/usr/local/bin/sms内容如下。请将其中的USER换为对应的用户名,1391302****@139.com改用你自己的邮箱。

#!/bin/bash
nail -A gmail -s "$1" 1391302****@139.com < /home/USER/etc/null

    完成后,请执行如下命令进行测试。如果一切顺利你可以收到一条提示你接收邮件的短信。

$sms  短信测试

3.程序->命令

    在所执行的程序中调用系统函数。这里给出对应的fortran代码

program test
    call system('sms 我是一个Fortran程序')
end program test

    其他语言也可以采用同样的方法完成这个工作。这就是我的解决办法,希望对大家有用。

 

如果你觉得你有更好地方案,请留言告诉我。

 

容易解决和难以解决的春运难题

      春运又到了,每年到了这会儿总是让人满腹牢骚,“火车票怎么这么难买?”。刚刚看了了这样一条新闻。

      吉林省四平市委常委、四平市人民政府副市长李鸥在自己的博客中发文称,“火车票票贩子多,完全是铁路系统的售票方式造成的。”李鸥认为,火车车上补票收取 手续费制度使得有些车站故意压票,从中获利;没有实行使用身份证购买火车票的制度,使得票贩子可以倒票赚钱,是铁路部门售票的制度不合理导致了票贩子的猖 獗。

      这段时间相关的言论总是很多,但我觉得大都和我想的有些不一样。今天实在是忍不住想要说一说。春运难题是难以解决的,但是从另外一个角度来看又是容易解决的。

      买票难的问题根本是春节期间流动人口众多和运输力量不足导致的。从这个角度来讲,春运难题是难以解决的。除非我国铁路运力得到飞跃式的发展,或者人们改变过年回家的习惯,否则春运难题是没办法解决的。

      但是人民最大的牢骚是“票怎么都到票贩子手里面了?”。这个春运难题确实是很容易解决的。只要能够做到古人所说的“不患寡而患不均”就可以解决这个问题。前两天铁道部的专家说了,“实名制”是不现实的,技术上不可行,并且罗列了种种理由。粗粗看了一下,说的确实有些道理,但是我还是要说这个家伙根本不知道什么是“三个代表”、“八荣八耻”。为什么要这么说呢?因为这些铁道部的砖家没有动一点脑子去为人民考虑,这个方法不行就不能换一个么。我就给他们指点一条简单的道路,就两个字,“透明”。具体措施很多,简单例举几条:

  1.售票流程透明化。将火车票的分配方式公布出来,所有的细节全部公布出来,比如一趟车给始发站和过路站留有多少票。包括需要给特殊部门(公安、国安等)或事件留的机动票数。暗箱操作的弊端就不用我再来批判了。

  2.售票透明化。售票点一律不准挂窗帘(24小时)(这一点要感谢广大银行给我的启示)工作时间不接电话,工作服不留口袋,24小时录像,把售票员工作置于群众的监督之下。正所谓“瓜田不纳履,李下不整冠”,前几天闹得沸沸扬扬“傻瓜票”视频事件就是铁道部自找麻烦,必须道歉。

  3.票流向透明化。火车票销售信息全部透明化,在网上公示每一个已售出票的销售信息,最少应包括销售时间、销售窗口。买不到票的人最少也有权力知道是自己排队策略比买到票的人是差在了哪里,让大家知道下次可以在哪里买到票。

  4售票信息透明化。在重要媒体上提前公布更为详细的售票规则的变化。

      今天是1月16号,看看南京站在今年春运期间给出的公告。春运期间(1月12日—2月19日)一条公告也没有,我只好说南京站的工作做得真好,学生都知道什么时候开始可以购买返程票了;群众都知道火车站晚上八点以后可以在动车组售票点买普通车次的票了。

以下为南京站截至目前为止给出的公告。http://www.njstation.com/info/infolist.aspx?ModuleID=1

火车票预售期消息 2009-1-5 13:38:59
最新代售点 2009-1-5 13:37:19
代售点09年春节前开通夜市 2009-1-5 13:30:16
关于调整儿童票身高的通知 2008-12-19 18:06:15
南京站首次开行南京——北京直达动车组卧铺列车 2008-12-15 14:43:49
南京火车站市内代售点 2008-9-24 10:03:41
铜九线新增列车 2008-9-8 17:04:02
合肥动车消息 2008-9-8 17:01:57
关于2008年8月1日起增开合宁线动车组列车的通知 2008-7-28 14:04:03
好消息:南京站新增车次 2007-4-22 9:45:55

 

用Fortran在Linux终端输出彩色文字

采用彩色的文字可以给出明显的提示,增加程序的易用性(例如采用“错误:压力出现负值” 比 “错误:压力出现负值”要醒目得多)。然而Fortran无法在命令行下直接输出彩色文字,不过通过调用系统函数可以解决这一难题。

通过参考http://bbs.stupc.org/thread-16335-1-1.html 关于echo命令的详解如下:

信息来源:
akaedu@akaedu.org

格式: echo \"\\033[字背景颜色;字体颜色m字符串\\033[0m\"

例如:
echo \"\\033[41;36m something here \\033[0m\"

其中41的位置代表底色, 36的位置是代表字的颜色

那些ascii code 是对颜色调用的始末.
\\033[ ; m …… \\033[0m

字背景颜色范围:40----49
40:黑
41:深红
42:绿
43:黄色
44:蓝色
45:紫色
46:深绿
47:白色

字颜色:30-----------39
30:黑
31:红
32:绿
33:黄
34:蓝色
35:紫色
36:深绿
37:白色

===========ANSI控制码的说明
\\33[0m 关闭所有属性
\\33[1m 设置高亮度
\\33[4m 下划线
\\33[5m 闪烁
\\33[7m 反显
\\33[8m 消隐
\\33[30m -- \\33[37m 设置前景色
\\33[40m -- \\33[47m 设置背景色
\\33[nA 光标上移n行
\\33[nB 光标下移n行
\\33[nC 光标右移n行
\\33[nD 光标左移n行
\\33[y;xH设置光标位置
\\33[2J 清屏
\\33[K 清除从光标到行尾的内容
\\33[s 保存光标位置
\\33[u 恢复光标位置
\\33[?25l 隐藏光标
\\33[?25h 显示光标

给出演示 Fortran 代码如下:

program color
implicit none
character*64::title
    title='echo -e "\033[42;30m TEST \033[0m "'
    call system(trim(title))
    call system('echo -ne "\033[41;30m color \033[0m"')
    call system('echo -ne "\033[42;31m color \033[0m"')
    call system('echo -ne "\033[43;32m color \033[0m"')
    call system('echo -ne "\033[44;33m color \033[0m"')
    call system('echo -ne "\033[45;34m color \033[0m"')
    call system('echo -ne "\033[46;35m color \033[0m"')
    call system('echo -ne "\033[47;36m color \033[0m"')
    call system('echo -e "\033[40;37m color \033[0m"')

    call system('echo -ne "\033[30m color \033[0m"')
    call system('echo -ne "\033[31m color \033[0m"')
    call system('echo -ne "\033[32m color \033[0m"')
    call system('echo -ne "\033[33m color \033[0m"')
    call system('echo -ne "\033[34m color \033[0m"')
    call system('echo -ne "\033[35m color \033[0m"')
    call system('echo -ne "\033[36m color \033[0m"')
    call system('echo -e "\033[37m color \033[0m"')
stop
end program

 在ubuntu8.04.1 32bit +Intel Fortran 10 测试通过 ,测试显示"\33"可能会出现问题,因此采用“\033"。

此外,由于此方法是通过调用系统函数完成,执行效率不高,不建议在数值计算中频繁使用。

以上代码是我自己编写,如果你有更好的改进方案或者发现错误,请与我联系。

Plot3D网格文件的读写

PLot3D是一种在CFD领域很常见的格式。几乎所有的网格生成软件都支持这种格式的输出,因此搞清楚这种文件的格式的读入和输出对CFD研究人员的工作带来很大的帮助。这里给出的都是读入ASCII格式文件的代码,输出方式类似。

PLot3D的网格文件后缀名为"xyz",可能是二进制(bin)格式或者文本文件格式(ASCII)。

1.单块网格(Single Grid

 读入3维单块网格

PROGRAM PLOT3D_SINGLE
IMPLICIT NONE
CHARACTER :: BUFFER*30
INTEGER :: I,J,K,IMAX,JMAX,KMAX
REAL,ALLOCATABLE::MESH(:,:,:,:) !MESH存储网格的点坐标

WRITE(*,*)"Please input file name:"
READ(*,*)BUFFER
OPEN(200,FILE=TRIM(buffer))
READ(200,*) IMAX,JMAX,KMAX !获得网格尺寸
ALLOCATE(MESH(3,IMAX,JMAX,KMAX)) !划分网格所需要的内存空间
READ(200,*)      (((MESH(1,I,J,K), I=1,IMAX), J=1,JMAX), K=1,KMAX),&
                       (((MESH(2,I,J,K), I=1,IMAX), J=1,JMAX), K=1,KMAX),&
                       (((MESH(3,I,J,K), I=1,IMAX), J=1,JMAX), K=1,KMAX)
CLOSE(200)
STOP
END PROGRAM

2.多块网格(Multiple Grids

读入3维多块网格(似乎GRIDGEN读入网格时需采用这种格式的文件,你可以将其改成输出程序,所输出的网格就可以用GRIDGEN读入了)

PROGRAM PLOT3D_MULTI
IMPLICIT NONE
CHARACTER :: BUFFER*30
INTEGER :: I,J,K,IMAX,JMAX,KMAX,NMESH,N
INTEGER,ALLOCATABLE::IJK(:,:)   !IJK存储每块网格的尺寸
REAL,ALLOCATABLE::MESH(:,:,:,:,:) !MESH存储网格的点坐标

WRITE(*,*)"Please input file name:"
READ(*,*)BUFFER
OPEN(200,FILE=TRIM(buffer))
READ(200,*)NMESH !读入网格块数
ALLOCATE(IJK(3,NMESH))
READ(200,*) ((IJK(1,N),IJK(2,N),IJK(3,N)), N=1,NMESH) !获得多块网格尺寸
DO N=1,NMESH
  IMAX=MAX(IMAX,IJK(1,N))
  JMAX=MAX(IMAX,IJK(2,N))
  KMAX=MAX(IMAX,IJK(3,N))
END DO
ALLOCATE(MESH(3,IMAX,JMAX,KMAX,NMESH)) !划分网格所需要的内存空间
READ(200,*)    ((((MESH(1,I,J,K,N), I=1,IJK(1,N)), J=1,IJK(2,N)), K=1,IJK(3,N)),&
                      (((MESH(2,I,J,K,N), I=1,IJK(1,N)), J=1,IJK(2,N)), K=1,IJK(3,N)),&
                      (((MESH(3,I,J,K,N), I=1,IJK(1,N)), J=1,IJK(2,N)), K=1,IJK(3,N)),N=1,NMESH)
CLOSE(200)
STOP
END PROGRAM
 

 

以上代码是我自己编写,如果你有更好的改进方案或者发现错误,请与我联系。

 

 

Hello World !

Hello World !

这是我的第一个Blog。

我主要研究领域是CFD(计算流体力学),主要采用Fortran95编程、操作系统采用linux。

欢迎有同好交流。