cfl3d linux 编译,CMake build system for cfl3d

@@ -0,0 +1,379 @@

---

title: cfl3d+openmpi+gfortran编译和安装

---

#简介

cfl3d用intel的编译器和mpi会比较容易编译,不再详述。本文主要讲述用gfortran的情况

cfl3d依赖于cgns, fortran编译器和mpi

- mpi:只要是符合mpi1.1的标准的MPI应该都可以的,mpich, openmpi, intelmpi都可以

- fortran编译器:gfortran, ifort都可以;

- cgns库:不是必须的,但是有个算例会用到,用apt-get安装的cgns库在链接的时候会找不到hdf5库。

- 所以根据cfl3d说明和网上的资料,本文选择cgns 2.5.5来进行自主编译

#下载和解压cfl3d 6.7 开源版本

```shell

cd $HOME

mkdir cfl3d

cd cfl3d

git clone https://github.com/nasa/CFL3D.git

```

这样就在`$HOME/cfl3d/CFL3D`中下载到了所有源代码。

#MPI和gfortran

在ubuntu下

```shell

sudo apt-get install libopenmpi-dev gfortran build-essential -y

```

在RHEL/Centos下

```shell

sudo yum install openmpi-devel gcc gcc-gfortran

```

#下载和安装cgns

```shell

cd $HOME/cfl3d

wget "http://jaist.dl.sourceforge.net/project/cgns/cgnslib_2.5/Release 5/cgnslib_2.5-5.tar.gz" -O cgnslib_2.5-5.tar.gz

tar xf cgnslib_2.5-5.tar.gz

mkdir cgns

mkdir cgns/include

mkdir cgns/lib

cd cgnslib_2.5-5

./configure --prefix=../cgns #这是按照最简单的配置进行编译的,没有配hdf5,并行之类高级的东西。

make

make install

```

#生成cfl3d的makefile文件

运行`build/Install`

```shell

cd $HOME/cfl3d/CFL3D/build

./Install -fastio -cgnsdir=$HOME/cfl3d/cgns

```

之后会生成`build/makefile`文件可按下面进行更改。

```

# makefile

FFLAG = -O3 -fbacktrace -w -march=native -J../../$(CFLLIBSD)

FFLAG_SPEC = -O3 -fbacktrace -w -march=native -J../../$(CFLLIBSD)

PREC = -fdefault-real-8

PREC_MPI = -DDBLE_PRECSN

LFLAG =

## 没有libcommon.a在编译precfl3d时会出现undefined reference 错误。

LLIBS = -L/home/di/cfl3d/cgns/lib -lcgns ../../$(CFLLIBSD)/libcommon.a

LLIBS_SEQ = -L/home/di/cfl3d/cgns/lib -lcgns ../../$(CFLLIBSD)/libcommon.a

## 因为后面用了mpif90作为fortran编译器和mpicc作为c编译器,所以MPI_INCDIR设置为空

MPI_INCDIR =

CGNS_INCDIR = -I/home/di/cfl3d/cgns/include

CPP = cpp

CPPFLAG = -P

CPPOPT = -DFASTIO $(MPI_INCDIR) -DDIST_MPI $(PREC_MPI)

CPPOPT_SP = -DP3D_SINGLE -DLINUX -DCGNS $(PREC_MPI) $(CGNS_INCDIR)

CPPOPT_CMPLX = -DCMPLX

FTN = mpif90

CC = mpicc

CFLAG =

AROPT = rusc

RANLIB = true

INLINE =

```

说明:

- `MPI_INCDIR`为空,因为`FTN`和`CC`编译器已经设置为`mpi`包装过的版本了。

- `CGNS_INCDIR`似乎必须设置为绝对路径;

- `AROPT`设置为`rusc`会报警告,可以无视,也可以改成`cr`啥的。

- 原文件选项的意义:

- `-z muldefs`: 等价于`--allow-multiple-definition`,让编译器遇到多个定义时,用第一个而不是报致命错;

#最终编译

```shell

make cfl3d_seq cfl3d_mpi splitter cfl3d_tools

make precfl3d

make ronnie preronnie

make maggie

make splittercmplx cfl3dcmplx_seq cfl3dcmplx_mpi

```

##代码修正

###复数版本的错误

cfl3dcmplx_seq和cfl3dcmplx_mpi会因为cfl3dcmplx_libs编译不成功(spalart.F的turre的类型成了complex,不能比较大小)而失败。其他的都可以编译成功。

查看问题所在

```shell

di@ubuntu:~/cfl3d/CFL3D/build$ grep -n "turre.*.lt.*" cfl/libs/*.Fdi@ubuntu:~/cfl3d/CFL3D/build$ grep -n "turre.*.lt.*" cfl/libs/*.F

cfl/libs/barth3d.F:1863: if((real(turre(j,k,i)+vist3d(j,k,i))) .lt. 1.e-12) then

cfl/libs/foureqn.F:1876: if (real(turre(j,k,i,4)) .lt. 400.) then

cfl/libs/foureqn.F:1880: + real(turre(j,k,i,4)) .lt. 596.) then

cfl/libs/foureqn.F:1885: + real(turre(j,k,i,4)) .lt. 1200.) then

cfl/libs/global.F:3818: . ' automatically to turre...plt'

cfl/libs/global.F:3833: . ' automatically to turre...plt'

cfl/libs/spalart.F:547: if (i_saneg .eq. 1 .and. turre(j,k,i) .lt. 0.) then

cfl/libs/spalart.F:611: if (i_saneg .eq. 1 .and. turre(j,k,i) .lt. 0.) then

cfl/libs/spalart.F:674: if (i_saneg .eq. 1 .and. turre(j,k,i) .lt. 0.) then

cfl/libs/spalart.F:787: if (i_saneg .eq. 1 .and. turre(j,k,i) .lt. 0.) then

cfl/libs/spalart.F:850: if (i_saneg .eq. 1 .and. turre(j,k,i) .lt. 0.) then

cfl/libs/spalart.F:912: if (i_saneg .eq. 1 .and. turre(j,k,i) .lt. 0.) then

cfl/libs/spalart.F:1026: if (i_saneg .eq. 1 .and. turre(j,k,i) .lt. 0.) then

cfl/libs/spalart.F:1092: if (i_saneg .eq. 1 .and. turre(j,k,i) .lt. 0.) then

cfl/libs/spalart.F:1157: if (i_saneg .eq. 1 .and. turre(j,k,i) .lt. 0.) then

cfl/libs/spalart.F:1297: rd = turre(j,k,i)/(sqrt(velterm)*akarman*akarman*

cfl/libs/spalart.F:1414: if (i_saneg .eq. 1 .and. turre(j,k,i) .lt. 0.) then

cfl/libs/spalart.F:1480: if (i_saneg .eq. 1 .and. turre(j,k,i) .lt. 0.) then

cfl/libs/spalart.F:1643: if (i_saneg .eq. 1 .and. turre(j,k,i) .lt. 0.) then

cfl/libs/spalart.F:1738: if (i_saneg .eq. 1 .and. turre(j,k,i) .lt. 0.) then

cfl/libs/spalart.F:1832: if (i_saneg .eq. 1 .and. turre(j,k,i) .lt. 0.) then

cfl/libs/spalart.F:1945: if (i_saneg .eq. 1 .and. turre(j,k,i) .lt. 0.) then

cfl/libs/spalart.F:2029: if (i_saneg .eq. 1 .and. turre(j,k,i) .lt. 0.) then

cfl/libs/spalart.F:2112: if (i_saneg .eq. 1 .and. turre(j,k,i) .lt. 0.) then

cfl/libs/spalart.F:2215: if (i_saneg .eq. 1 .and. turre(j,k,i) .lt. 0.) then

cfl/libs/spalart.F:2301: if (i_saneg .eq. 1 .and. turre(j,k,i) .lt. 0.) then

cfl/libs/spalart.F:2386: if (i_saneg .eq. 1 .and. turre(j,k,i) .lt. 0.) then

cfl/libs/spalart.F:2463: + (real(turre(j,k,i)+vist3d(j,k,i))) .lt. 1.e-12) then

cfl/libs/spalart.F:2468: + (real(turre(j,k,i)+vist3d(j,k,i))) .lt. 0.) then

cfl/libs/spalart.F:2503: if (i_saneg .eq. 1 .and. turre(j,k,i) .lt. 0.) then

cfl/libs/twoeqn.F:3344: d5 = re*beta5*ft*turre(j,k,i,1)**1.5/(sqrt(rt)+delta)

```

说明没有加real是主要的问题!

解决方案:turre(j,k,i)修改为了real(turre(j,k,i))

```shell

sed -i -e "s/\sturre(j,k,i)\s/ real(turre(j,k,i))/g" ../source/cfl3d/libs/spalart.F

sed -i -e "s/sbar \.ge\. -0\.7\*ss/real(sbar) .ge. -0.7*real(ss)/g" ../source/cfl3d/libs/spalart.F

```

sed所用的正则表达式可以在http://regexr.com/编辑和测试得到。

### maggie错误

maggie有位于`cputim.F`关于`ETIME`函数的错误,这是因为gfortran的ETIME和其他编译器不同,多带了一个参数。利用gfortran自带定义的`__GFORTRAN__`宏可以进行条件编译。

```fortran

! cputim.F :109

!#if defined ETFLAG

! call etime_(tm)

! call itime_(ia)

!#else

! call etime(tm)

! call itime(ia)

!#endif

#if defined ETFLAG

call etime_(tm)

call itime_(ia)

#elif defined __GFORTRAN__

call etime(tm(1:2),tm(3))

call itime(ia)

#else

call etime(tm)

call itime(ia)

#endif

```

# 设置链接

```shell

cd $HOME/cfl3d/CFL3D

mkdir bin

cd bin

## basic

ln -s ../build/cfl/seq/cfl3d_seq

## parallel version

ln -s ../build/cfl/mpi/cfl3d_mpi

## mesh block splitter

ln -s ../build/split/seq/splitter

## memory usage estimator

ln -s ../build/precfl/seq/precfl3d

## overset mesh related tool

ln -s ../build/mag/seq/maggie

## mesh deformation tool and its memory usage estimator

ln -s ../build/ron/seq/ronnie

ln -s ../build/preron/seq/preronnie

## complex version of cfl3d which is used to compulate flight derivative

ln -s ../build/cflcmplx/seq/cfl3dcmplx_seq

ln -s ../build/cflcmplx/mpi/cfl3dcmplx_mpi

ln -s ../build/splitcmplx/seq/splittercmplx

## cfl3d_tools

ln -s ../build/tools/seq/v6inpdoubhalf

ln -s ../build/tools/seq/Get_FD

ln -s ../build/tools/seq/initialize_field

ln -s ../build/tools/seq/nmf_to_cfl3dinput

ln -s ../build/tools/seq/cgns_to_cfl3dinput

ln -s ../build/tools/seq/v6inpswitchijk

ln -s ../build/tools/seq/v6_ronnie_mod

ln -s ../build/tools/seq/moovmaker

ln -s ../build/tools/seq/grid_perturb_cmplx

ln -s ../build/tools/seq/v6_restart_mod

ln -s ../build/tools/seq/gridswitchijk

ln -s ../build/tools/seq/cfl3d_to_nmf

ln -s ../build/tools/seq/cgns_readhist

ln -s ../build/tools/seq/p3d_to_cfl3drst

ln -s ../build/tools/seq/everyother_xyz

ln -s ../build/tools/seq/p3d_to_INGRID

ln -s ../build/tools/seq/v6_ronnie_mod.F90

ln -s ../build/tools/seq/INGRID_to_p3d

ln -s ../build/tools/seq/grid_perturb

ln -s ../build/tools/seq/cfl3dinp_to_FVBND

ln -s ../build/tools/seq/cfl3d_to_pegbc

ln -s ../build/tools/seq/plot3dg_to_cgns

ln -s ../build/tools/seq/XINTOUT_to_ovrlp

```

# 测试算例

测试算例的地址在:

https://cfl3d.larc.nasa.gov/Cfl3dv6/cfl3dv6_testcases.html

可以通过如下脚本下载所有测试算例

```shell

cd $HOME/cfl3d

mkdir TestCases

cd TestCases

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/Flatplate/Flatplate.tar.Z

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/Flatplateskew/Flatplateskew.tar.Z

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/Flatplateyplus/Flatplateyplus.tar.gz

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/Backstep/Backstep.tar.gz

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/Transdiff/Transdiff.tar.Z

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/NACA_4412/NACA_4412.tar.Z

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/RAE_Sensitivity/RAE_Sensitivity.tar.gz

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/Ramp/Ramp.tar.Z

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/Cylinder/Timeaccstudy.tar.Z

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/N0012/Spaceaccstudy.tar.Z

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/Ejectornozzle/Ejectornozzle.tar.gz

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/Pitch/Pitch0012.tar.Z

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/Rotorstator/Rotorstator.tar.Z

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/Hump/Humpcase.tar.gz

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/Curvature/SoMellor.tar.gz

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/3DTestcases/Axibump/Axibump.tar.gz

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/3DTestcases/ONERA_M6/ONERA_M6.tar.Z

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/3DTestcases/ARA_M100/ARA_M100.tar.Z

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/3DTestcases/ARA_M100_XMERA/ARA_M100_XMERA.tar.Z

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/3DTestcases/Delta/Delta_cgns.tar.Z

```

# 总结

上述修正已经提交到我的https://github.com/chengdi/CFL3D了,所以可以用以下脚本安装所有东西。

```shell

# MPI和fortran,UBUNTU为例

sudo apt-get update

sudo apt-get install libopenmpi-dev gfortran build-essential git -y

# 下载cfl3d代码

cd $HOME

mkdir cfl3d

cd cfl3d

git clone https://github.com/chengdi/CFL3D.git

# cgns代码和安装

cd $HOME/cfl3d

wget "http://jaist.dl.sourceforge.net/project/cgns/cgnslib_2.5/Release 5/cgnslib_2.5-5.tar.gz" -O cgnslib_2.5-5.tar.gz

tar xf cgnslib_2.5-5.tar.gz

mkdir cgns

mkdir cgns/include

mkdir cgns/lib

cd cgnslib_2.5-5

./configure --prefix=../cgns #这是按照最简单的配置进行编译的,没有配hdf5,并行之类高级的东西。

make

make install

# 生成makefile

cd $HOME/cfl3d/CFL3D/build

./Install -fastio -cgnsdir=$HOME/cfl3d/cgns

# 编译cfl3d

cd $HOME/cfl3d/CFL3D/build

cp makefile_linux_gfortran_openmpi makefile #覆盖掉新生成的makefile

make cfl3d_seq cfl3d_mpi splitter cfl3d_tools

make precfl3d

make ronnie preronnie

make maggie

make splittercmplx cfl3dcmplx_seq cfl3dcmplx_mpi

# 建立链接

cd $HOME/cfl3d/CFL3D

mkdir bin

cd bin

## basic

ln -s ../build/cfl/seq/cfl3d_seq

## parallel version

ln -s ../build/cfl/mpi/cfl3d_mpi

## mesh block splitter

ln -s ../build/split/seq/splitter

## memory usage estimator

ln -s ../build/precfl/seq/precfl3d

## overset mesh related tool

ln -s ../build/mag/seq/maggie

## mesh deformation tool and its memory usage estimator

ln -s ../build/ron/seq/ronnie

ln -s ../build/preron/seq/preronnie

## complex version of cfl3d which is used to compulate flight derivative

ln -s ../build/cflcmplx/seq/cfl3dcmplx_seq

ln -s ../build/cflcmplx/mpi/cfl3dcmplx_mpi

ln -s ../build/splitcmplx/seq/splittercmplx

## cfl3d_tools

ln -s ../build/tools/seq/v6inpdoubhalf

ln -s ../build/tools/seq/Get_FD

ln -s ../build/tools/seq/initialize_field

ln -s ../build/tools/seq/nmf_to_cfl3dinput

ln -s ../build/tools/seq/cgns_to_cfl3dinput

ln -s ../build/tools/seq/v6inpswitchijk

ln -s ../build/tools/seq/v6_ronnie_mod

ln -s ../build/tools/seq/moovmaker

ln -s ../build/tools/seq/grid_perturb_cmplx

ln -s ../build/tools/seq/v6_restart_mod

ln -s ../build/tools/seq/gridswitchijk

ln -s ../build/tools/seq/cfl3d_to_nmf

ln -s ../build/tools/seq/cgns_readhist

ln -s ../build/tools/seq/p3d_to_cfl3drst

ln -s ../build/tools/seq/everyother_xyz

ln -s ../build/tools/seq/p3d_to_INGRID

ln -s ../build/tools/seq/v6_ronnie_mod.F90

ln -s ../build/tools/seq/INGRID_to_p3d

ln -s ../build/tools/seq/grid_perturb

ln -s ../build/tools/seq/cfl3dinp_to_FVBND

ln -s ../build/tools/seq/cfl3d_to_pegbc

ln -s ../build/tools/seq/plot3dg_to_cgns

ln -s ../build/tools/seq/XINTOUT_to_ovrlp

# 下载算例

cd $HOME/cfl3d

mkdir TestCases

cd TestCases

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/Flatplate/Flatplate.tar.Z

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/Flatplateskew/Flatplateskew.tar.Z

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/Flatplateyplus/Flatplateyplus.tar.gz

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/Backstep/Backstep.tar.gz

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/Transdiff/Transdiff.tar.Z

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/NACA_4412/NACA_4412.tar.Z

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/RAE_Sensitivity/RAE_Sensitivity.tar.gz

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/Ramp/Ramp.tar.Z

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/Cylinder/Timeaccstudy.tar.Z

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/N0012/Spaceaccstudy.tar.Z

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/Ejectornozzle/Ejectornozzle.tar.gz

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/Pitch/Pitch0012.tar.Z

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/Rotorstator/Rotorstator.tar.Z

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/Hump/Humpcase.tar.gz

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/2DTestcases/Curvature/SoMellor.tar.gz

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/3DTestcases/Axibump/Axibump.tar.gz

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/3DTestcases/ONERA_M6/ONERA_M6.tar.Z

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/3DTestcases/ARA_M100/ARA_M100.tar.Z

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/3DTestcases/ARA_M100_XMERA/ARA_M100_XMERA.tar.Z

wget https://cfl3d.larc.nasa.gov/Cfl3dv6/3DTestcases/Delta/Delta_cgns.tar.Z

```

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值