我是 Fortran 的新手。我正在尝试使用 fortran 95 以 CGNS 格式编写 Flow 解决方案。我编写了 fortran 代码并为 python 创建了这个 fortran 代码的库。我想使用这个库将 *.npy
格式的网格和流数据写入 *.cgns
格式。我的fortran代码片段如下
subroutine un_2d_tr(filename, zoneName)
implicit none
include 'cgnslib_f.h'
character(*) fileName, zoneName
integer :: ier, cellDim, physDim, nelem_start, nelem_end, nbdyelem
integer :: iFile, iB, iCoordX, iCoordY, iSection, iFlow, iu, iv
integer, dimension(1,3) :: isize
character(len=32) :: basename, solname
! --------------------------------------------------------------------
! open CGNS file to write OR edit and create/read base
basename = 'Base'
! In 2D unstr.
cellDim=2
physDim=2
call cg_open_f(fileName,cg_mode_write,iFile,ier)
call check_cg_error_f(ier)
! write base
call cg_base_write_f(iFile,basename,cellDim,physDim, iB,ier)
call check_cg_error_f(ier)
...
然后我继续脚本将网格和流速写入 cgns 文件。使用cg_open_f()
写入打开新文件没有错误(错误状态ier为0)。但是,当我尝试在打开的文件中使用 cg_write_f()
或 cg_base_write_f()
(用于编写基本流程)编写内容时,出现以下错误
CGNS file 0 is not open
如果需要,我可以发布完整的 Fortran 子例程。有没有人对如何纠正这个错误有任何建议?这可能是我的 Linux 发行版的问题吗?如果有帮助,我正在使用 Ubuntu 17.10。我在下面包含了 check_cg_error_f()
。
subroutine check_cg_error_f(ier)
implicit none
include 'cgnslib_f.h'
integer ier
if (ier .ne. CG_OK) then
call cg_error_exit_f
endif
end
我用来搭建cgns库的cmake文件如下
BUILD_CGNSTOOLS OFF
CGNS_BUILD_SHARED ON
CGNS_USE_SHARED ON
CMAKE_BUILD_TYPE Release
CMAKE_INSTALL_PREFIX /home/adhitya/.local/cgns/3.1.4
ENABLE_64BIT ON
ENABLE_FORTRAN ON
ENABLE_HDF5 ON
ENABLE_SCOPING OFF
ENABLE_TESTS OFF
FORTRAN_NAMING LOWERCASE_
HDF5_INCLUDE_PATH /home/adhitya/.local/hdf5/1.8.16/include
HDF5_LIBRARY /home/adhitya/.local/hdf5/1.8.16/lib/libhdf5.so
HDF5_NEED_MPI OFF
HDF5_NEED_SZIP ON
HDF5_NEED_ZLIB ON
SZIP_LIBRARY /home/adhitya/.local/szip/lib/libsz.so
ZLIB_LIBRARY /home/adhitya/.local/zlib/lib/libz.so
cmake 构建版本 3.3.1
CGNS_BUILD_CGNSTOOLS OFF
CGNS_BUILD_SHARED ON
CGNS_BUILD_TESTING OFF
CGNS_ENABLE_64BIT ON
CGNS_ENABLE_BASE_SCOPE OFF
CGNS_ENABLE_FORTRAN ON
CGNS_ENABLE_HDF5 ON
CGNS_ENABLE_MEM_DEBUG OFF
CGNS_ENABLE_SCOPING OFF
CGNS_ENABLE_TESTS OFF
CGNS_USE_SHARED ON
CMAKE_BUILD_TYPE Release
CMAKE_INSTALL_PREFIX /home/adhitya/.local/cgns/3.3.1
HDF5_C_LIBRARY_dl /usr/lib/x86_64-linux-gnu/libdl.so
HDF5_C_LIBRARY_hdf5 /home/adhitya/.local/hdf5/lib/libhdf5.so
HDF5_C_LIBRARY_m /usr/lib/x86_64-linux-gnu/libm.so
HDF5_C_LIBRARY_sz /usr/lib/x86_64-linux-gnu/libsz.so
HDF5_C_LIBRARY_z /usr/lib/x86_64-linux-gnu/libz.so
HDF5_DIR HDF5_DIR-NOTFOUND
HDF5_NEED_MPI OFF
HDF5_NEED_SZIP ON
HDF5_NEED_ZLIB ON
SZIP_LIBRARY /home/adhitya/.local/szip/lib/libsz.so
ZLIB_LIBRARY /usr/lib/x86_64-linux-gnu/libz.so
最佳答案
我不完全知道你的错误是什么。但是我怀疑这是某种类型不匹配。我强烈推荐 使用cgns
而不是include
。现在是 2018 年!让编译器告诉您是否错误地调用了例程。
CGNS 测试程序
语言
program test_cgns
use, intrinsic :: iso_fortran_env, only: error_unit
use cgns
implicit none
integer :: ierr ! error status
integer :: fid ! file id
integer :: bid ! base id
character(len=256) :: filename ! file name
character(len=256), parameter :: base ='Base'
integer, parameter :: dims(3) = [10, 10, 10]
integer :: ndims
call get_command_argument(1, filename)
if (len_trim(filename) == 0) then
write(error_unit, *) 'ERROR: Must supply a filename.'
end if
call cg_set_file_type_f(CG_FILE_HDF5, ierr)
if (ierr /= CG_OK) then
write(error_unit, *) 'Unable to set file type to HDF5'
call cg_error_print_f
stop
end if
call cg_open_f(filename, CG_MODE_WRITE, fid, ierr)
if (ierr /= CG_OK) then
write(error_unit, *) 'Unable to open: ' // trim(filename)
call cg_error_print_f
stop
end if
ndims = size(dims)
call cg_base_write_f(fid, base, ndims, ndims, bid, ierr)
if (ierr /= CG_OK) then
write(error_unit, *) 'Unable to create base: ' // trim(base)
call cg_error_print_f
stop
end if
call cg_close_f(fid, ierr)
if (ierr /= CG_OK) then
write(error_unit, *) 'Unable to close data file'
call cg_error_print_f
end if
end program test_cgns
C
#include <stdlib.h>
#include <stdio.h>
#include <err.h>
#include <cgnslib.h>
int
main(int argc, char **argv)
{
int fid = 0;
int bid = 0;
int ndims = 3;
char *filename = NULL;
char *base = "Base";
if (argc != 2) {
errx(EXIT_FAILURE, "Must supply a filename");
}
filename = argv[1];
if (cg_set_file_type(CG_FILE_HDF5)) {
warnx("Unable to set file type to HDF5");
cg_error_exit();
}
if (cg_open(filename, CG_MODE_WRITE, &fid)) {
warnx("Unable to open file: %s", filename);
cg_error_exit();
}
if (cg_base_write(fid, base, ndims, ndims, &bid)) {
warnx("Unable to create base: %s", base);
cg_error_exit();
}
if (cg_close(fid)) {
warnx("Unable to close data file");
cg_error_exit();
}
return(EXIT_SUCCESS);
}
然后编译它,(请注意您可能需要添加 -I 和 -L 标志来告诉编译器 cgns.mod
和 libcgns.so
在哪里):
$ gfortran -o test_cgns test_cgns.f90 -lcgns
或
$ gcc -o test_cgns test_cgns.c -lcgns
运行测试并查看输出文件:
$ ./test_cgns foo.h5
$ echo $?
0
$ h5dump foo.h5
HDF5 "foo.h5" {
GROUP "/" {
ATTRIBUTE "label" {
DATATYPE H5T_STRING {
STRSIZE 33;
STRPAD H5T_STR_NULLTERM;
CSET H5T_CSET_ASCII;
CTYPE H5T_C_S1;
}
DATASPACE SCALAR
DATA {
(0): "Root Node of HDF5 File"
}
}
....
你能编译并运行这个简单的测试程序吗?
构建CGNS
我只是获取了源代码并在另一个集群上进行了安装。请注意,我使用的是英特尔编译器套件而非 GCC。
CGNS_BUILD_CGNSTOOLS OFF
CGNS_BUILD_SHARED ON
CGNS_BUILD_TESTING OFF
CGNS_ENABLE_64BIT ON
CGNS_ENABLE_BASE_SCOPE OFF
CGNS_ENABLE_FORTRAN ON
CGNS_ENABLE_HDF5 ON
CGNS_ENABLE_MEM_DEBUG OFF
CGNS_ENABLE_SCOPING OFF
CGNS_ENABLE_TESTS OFF
CGNS_USE_SHARED ON
CMAKE_BUILD_TYPE Release
CMAKE_INSTALL_PREFIX /home/tibr1099/cgns/3.3.1
HDF5_C_LIBRARY_dl /usr/lib64/libdl.so
HDF5_C_LIBRARY_hdf5 /curc/sw/hdf5/1.8.18/intel/17.4/lib/libhdf5.so
HDF5_C_LIBRARY_m /usr/lib64/libm.so
HDF5_C_LIBRARY_sz /curc/sw/szip/2.1.1/intel/17.4/lib/libsz.so
HDF5_C_LIBRARY_z /curc/sw/zlib/1.2.11/intel/17.4/lib/libz.so
HDF5_NEED_MPI OFF
HDF5_NEED_SZIP OFF
HDF5_NEED_ZLIB OFF
接着是通常的make install
,然后在安装的include目录中查找:
$ ls ~/cgns/3.3.1/include/
cgns.mod cgnsBuild.defs cgns_io.h cgnsconfig.h cgnslib.h cgnstypes.h cgnstypes_f.h cgnstypes_f03.h cgnswin_f.h
在没有看到您的构建日志的情况下,我敢说删除您的安装并重新开始。此外,3.1.4
不是最新的稳定版。抢如何3.3.1 .
关于python - CGNS 文件 0 未打开错误 - 无法使用 Fortran 编写 cgns 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48451507/