当前位置: 首页 > news >正文

在Ubuntu 18.04上从零搭建FLEXPART 10.4:一份避开了所有坑的保姆级配置清单

在Ubuntu 18.04上从零搭建FLEXPART 10.4:一份避开了所有坑的保姆级配置清单

大气传输扩散模型FLEXPART是研究污染物长距离输送、核事故应急响应等场景的重要工具。但它的安装过程堪称"依赖地狱"——从GRIB数据处理库到NetCDF支持,每个环节都可能因为版本不匹配或系统环境差异而失败。本文将带你用一台纯净的Ubuntu 18.04系统,避开所有常见陷阱,完成FLEXPART 10.4的完整部署。

1. 环境准备:为什么必须是Ubuntu 18.04?

选择Ubuntu 18.04并非偶然。这个LTS版本的内核(4.15)和GCC编译器(7.5)恰好满足FLEXPART 10.4对Fortran 2003标准的完整支持。更关键的是,其软件源中的关键依赖包版本与FLEXPART所需完美匹配:

依赖项必需版本Ubuntu 18.04源版本
gfortran≥7.57.5.0-3ubuntu1
libeccodes2.7.x2.7.3-1
libnetcdf4.6.x4.6.0-2build1

重要提示:虚拟机请使用VMware或VirtualBox,WSL因缺少完整的systemd支持会导致grib_api编译失败。物理机安装时建议分配至少20GB磁盘空间。

系统初始化命令如下:

sudo apt update && sudo apt upgrade -y sudo apt install -y g++ gfortran autoconf libtool automake flex bison cmake \ python3-dev python3-pip git vim curl build-essential libbz2-dev \ libssl-dev libreadline-dev libsqlite3-dev tk-dev ruby

2. 依赖库安装:顺序就是生命线

2.1 基础科学计算库

错误的安装顺序会导致后续编译时出现"undefined reference"错误。必须严格按照以下步骤:

  1. Jasper图像库:先安装这个图像编解码器,它是GRIB数据处理的基础

    wget http://www.ece.uvic.ca/~mdadams/jasper/software/jasper-1.900.1.zip unzip jasper-1.900.1.zip cd jasper-1.900.1 CFLAGS="-fPIC" ./configure --prefix=/usr/local/jasper make -j$(nproc) && sudo make install
  2. GRIB_API与ECCodes:这两个库存在替代关系,但FLEXPART 10.4需要同时使用

    # 先安装旧版grib_api wget https://people.freebsd.org/~sunpoet/sunpoet/grib_api-1.28.0-Source.tar.gz tar xvzf grib_api-1.28.0-Source.tar.gz cd grib_api-1.28.0-Source ./configure --prefix=/usr/local/grib_api --with-jasper=/usr/local/jasper make && sudo make install # 再安装ECCodes wget https://confluence.ecmwf.int/download/attachments/45757960/eccodes-2.7.3-Source.tar.gz tar xvzf eccodes-2.7.3-Source.tar.gz cd eccodes-2.7.3-Source mkdir build && cd build cmake -DCMAKE_INSTALL_PREFIX=/usr/local/eccodes .. make && sudo make install

2.2 NetCDF支持配置

FLEXPART输出需要NetCDF格式支持,但Ubuntu源中的版本缺少HDF5高级特性支持,必须手动编译:

# 安装zlib和szip压缩库 wget ftp://ftp.unidata.ucar.edu/pub/netcdf/netcdf-4/zlib-1.2.8.tar.gz tar -xf zlib-1.2.8.tar.gz && cd zlib-1.2.8 ./configure --prefix=/usr/local && make && sudo make install # 编译HDF5时需启用HL接口 wget ftp://ftp.unidata.ucar.edu/pub/netcdf/netcdf-4/hdf5-1.8.13.tar.gz tar -xf hdf5-1.8.13.tar.gz && cd hdf5-1.8.13 ./configure --enable-shared --enable-hl --prefix=/usr/local/hdf5 make -j$(nproc) && sudo make install

3. FLEXPART本体编译:关键参数解析

获取源代码后,需要特别注意makefile的修改:

wget https://www.flexpart.eu/downloads/66 -O flexpart_v10.4.tar.gz tar xvf flexpart_v10.4.tar.gz cd flexpart_v10.4/src

修改makefile时重点关注以下参数:

  • ROOT_DIR = /usr/local:确保指向所有依赖库的安装前缀
  • NCOPT = -DUSE_NCF -lnetcdff -lnetcdf:启用NetCDF输出支持
  • FFLAGS中添加-fconvert=little-endian:匹配x86架构字节序

编译命令:

make ncf=yes O_LEV=3 export LD_LIBRARY_PATH=/usr/local/grib_api/lib:$LD_LIBRARY_PATH

4. 验证与排错:常见问题解决方案

4.1 动态链接库问题

如果运行时出现libgrib_api.so not found错误,需要更新动态链接库缓存:

sudo ldconfig

4.2 Python接口配置

flex_extract工具依赖Python环境,需确保以下包版本匹配:

pip3 install cdsapi ecmwf-api-client netcdf4 --upgrade python3 -c "import eccodes; print(eccodes.__version__)"

4.3 测试用例运行

使用内置测试案例验证安装:

cd ../examples/emep_50km ./run_emep.sh

成功运行后应看到类似输出:

FLEXPART V10.4 ... Simulation finished normally

我在实际部署中发现,最容易出错的环节是ECCodes与grib_api的共存配置。当遇到GRIB解码失败时,可以尝试在编译FLEXPART时临时禁用其中一个库进行测试。另外,建议在.bashrc中添加以下环境变量避免权限问题:

export ECCODES_DEFINITION_PATH=/usr/local/eccodes/share/eccodes/definitions export GRIB_API_DEFINITION_PATH=/usr/local/grib_api/share/grib_api/definitions
http://www.jsqmd.com/news/666711/

相关文章:

  • 从一道笔试题看Java内存模型:String s = new String(“abc“) 到底创建了几个对象?
  • 谁还没玩过茶杯头?全网高清完整版网盘资源速存!新手入坑必看
  • Unity游戏去马赛克实战指南:8大模块深度剖析与完整解决方案
  • 模糊PID控制主动悬架模型的优化效果对比研究:基于Simulink模型的性能分析
  • 用USRP B210和Ubuntu 18.04搭建5G OAI开源基站:从硬件选型到RRC连接成功的保姆级避坑记录
  • CentOS 7.9 换源后 yum makecache 总报错?别急着重装,试试手动修正 $releasever 变量
  • Windows 11上SQL Server 2019 Developer版保姆级安装教程(含SSMS和远程连接配置)
  • 猫抓插件:三步解决你的网页资源下载难题
  • 直方图桶的概念(桶Bucket)(等宽桶Equal-width bucket、非等宽桶Custom bucket、累积桶Cumulative Bucket)
  • 深入解析Linux umask:从原理到实战,精准掌控文件默认权限
  • 基于51单片机的直流电机驱动系统设计
  • 别再纠结致远、比邻、如翼了!一张图看懂中国电信5G定制网三种模式怎么选
  • 2026 年美发人注意!美发会员管理系统避坑指南在此 - 记络会员管理软件
  • 别再只用Days和Hours了!Java8 ChronoUnit枚举类里这些隐藏的时间单位,让你的代码更专业
  • Android视频压缩的高效方案:基于硬件编解码的MediaCodec实践
  • Ryujinx:在PC上畅玩Switch游戏的终极完整指南
  • Barrier终极指南:一套键鼠控制多台电脑的免费开源解决方案
  • RV1126视频驱动全景解析:从Sensor到ISP的模块化架构与数据流
  • 示波器上那个神秘的‘Escape Mode’是啥?手把手拆解MIPI DSI的低功耗逃生通道
  • 2026 理发店速进!挑收银软件这些坑躲远点别中招 - 记络会员管理软件
  • IDR工具完全指南:从零开始掌握Delphi程序逆向工程
  • 当Windows遇见macOS:用OSX-Hyper-V在虚拟机中打造苹果体验
  • 树莓派4B上Miniconda3保姆级安装教程(含清华源配置与常见SSL报错解决)
  • 手把手教你用UC3843A升压模块点亮IN-12辉光管(附MOS管/二极管替换指南)
  • 别再瞎测了!手把手教你给矢量网络分析仪做一次靠谱的校准(从误差到实操)
  • 抖音无水印批量下载工具:免费高效的视频保存方案
  • 新质谱仪炸场!蛋白代谢天都亮了?
  • Snap Hutao原神工具箱:如何高效管理你的游戏数据体验
  • 2026 年开理发店必避坑!收银系统挑选要点全解析 - 记络会员管理软件
  • 新手避坑指南:用nvm安装Node.js时,90%的人会踩的这几个雷(附解决方案)