diff --git "a/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/EcCodes 2.18.0 for openEuler20.03( LTS-SP1) \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221.md" "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/EcCodes 2.18.0 for openEuler20.03( LTS-SP1) \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221.md" new file mode 100644 index 0000000000000000000000000000000000000000..03931443280dfa45256c109bdcab1137f6ecb163 --- /dev/null +++ "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/EcCodes 2.18.0 for openEuler20.03( LTS-SP1) \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221.md" @@ -0,0 +1,556 @@ +--- +title: "EcCodes 2.18.0-migrate" +date: 2023-02-23 +category: blog +tags: + - EcCodes + - Porting Guide +sig: sig-Compatibility-Infra +archives: 2023-23 +author: caesar +summary: "详细介绍了EcCodes 2.18.0软件移植到openEuler操作系统的具体操作步骤" +--- + +# EcCodes 2.18.0 for openEuler20.03( LTS-SP1) 【迁移移植案例】 + +## 软件介绍 + +EcCodes是ECMWF开发的扩展,它提供应用程序编程接口和多个工具,用于解码和编码以下格式的消息: + +● WMO FM-92 GRIB版本1和版本2 + +● WMO FM-94 BUFR第3版和第4版 + +● WMO GTS缩写报头(仅解码) + +一组有用的命令行工具可快速访问消息,C、Fortran90和Python界面提供对主要EcCodes功能的访问。EcCodes是GRIB +API的发展。它旨在为用户提供一个简单的功能,以键/值方式访问多种格式的数据。 + +语言:C/Fortran + +一句话描述:提供了一个应用程序编程接口和一套用于以WMOGRIB和BUFR格式解码和编码消息的工具。 + +开源协议:Apache 2.0 + +建议使用的版本为"EcCodes 2.18.0"。 + +## 环境要求 + +硬件要求 + +| 项目 | 说明 | +| ---- | ----------------- | +| CPU | Kunpeng 920处理器 | + +软件要求 + +| 项目 | 版本 | 下载地址 | +| ---------- | ------ | ------------------------------------------------------------ | +| 毕昇编译器 | 1.3.1 | https://mirrors.huaweicloud.com/kunpeng/archive/compiler/bisheng_compiler/bisheng-compiler-1.3.1-aarch64-linux.tar.gz | +| Hyper MPI | 1.0.2 | https://repo.huaweicloud.com/hmpi/HMPI_1.0.2_aarch64.tar.gz | +| CMake | 3.16.5 | https://cmake.org/files/v3.16/cmake-3.16.5.tar.gz | +| Eccodes | 2.18.0 | https://confluence.ecmwf.int/download/attachments/45757960/Eccodes-2.18.0-Source.tar.gz | + +操作系统要求 + +| 项目 | 版本 | 下载地址 | +| --------- | -------------------------- | --------------------------------------------------- | +| openEuler | openEuler 20.03 (LTS-SP1) | https://repo.openeuler.org/openEuler-20.03-LTS-SP1/ | +| Kernel | 4.19 | https://gitee.com/openeuler/kernel | + +## 移植规划数据 + +本章节给出Eccodes软件在移植过程中涉及到的相关软件安装规划路径的用途及详细说明。 + +移植规划数据 + +| 序号 | 软件安装规划路径 | 用途 | 说明 | +| ---- | ------------------------------------------------ | -------------------------- | ------------------------------------------------------------ | +| 1 | */opt/compiler/BS* | 毕昇编译器的安装规划路径。 | 参考《[毕昇编译器安装使用](https://support.huaweicloud.com/ug-bisheng-kunpengdevps/kunpengbisheng_06_0002.html)》 | +| 2 | */path/to/install/hucx* */path/to/install/ompi* | Hyper MPI的安装规划路径。 | 参考《[Hyper MPI 1.0.2操作指导](https://support.huaweicloud.com/moredocuments-kunpenghpcs/hypermpimoredoc_06_0003.html)》 | +| *3* | */path/to/* *CMAKE* | cmake的测试规划路径。 | 这里的安装规划路径只是一个举例说明,建议部署在共享路径中。现网需要根据实际情况调整,后续章节凡是遇到安装路径的命令,都以现网实际规划的安装路径为准进行替换,不再单独说明。 | +| 4 | /path/to/ECCODES | EcCodes的安装规划路径 | | + +## 配置编译环境 + +前提条件 + +使用SFTP工具将各安装包上传至服务器对应目录下。 + +配置流程 + +| 序号 | 配置项 | 说明 | +| ---- | ---------------- | ------------------------------------------------------------ | +| 1 | 毕昇编译器的安装 | 参考《[毕昇编译器安装使用](https://support.huaweicloud.com/ug-bisheng-kunpengdevps/kunpengbisheng_06_0002.html)》 | +| 2 | Hyper MPI的安装 | 参考《[Hyper MPI用户规划与创建](https://support.huaweicloud.com/moredocuments-kunpenghpcs/hypermpimoredoc_06_0003.html)》 | +| 3 | 安装CMAKE | 参考[安装CMAKE](#_安装CMAKE) | + +附注:1、先安装毕昇编译器 + +### 安装毕昇编译器 + +本节介绍毕昇编译器的安装步骤,以下操作均使用root用户执行。 +毕昇编译器已经融入openEuler源,在openEuler操作系统中,可以使用yum源方式安装毕昇编译器;在非openEuler操作系统中,可以通过软件包方式安装毕昇编译器。 + +环境依赖 + +内存:8GB以上 + +操作系统:openEuler21.03、openEuler 20.03 (LTS)、CentOS 7.6、Ubuntu +18.04、Ubuntu 20、麒麟V10、UOS 20 + +架构:AArch64 + +GCC版本:4.8.5以上 + +glibc版本:2.17以上 + +libatomic版本:1.2及以上 + +#### yum源安装方式 + +在/etc/yum.repos.d/目录下增加配置文件bisheng-compiler.repo,运行如下命令: + +``` +cat > /etc/yum.repos.d/bisheng-compiler.repo << EOF +[bisheng-compiler] +name=bisheng-compiler +baseurl=https://repo.oepkgs.net/bisheng/aarch64/ +enabled=1 +gpgcheck=0 +priority=100 +EOF +``` + +从yum源下载和安装毕昇编译器rpm包。 + + yum update + yum install bisheng-compiler + +(可选)清空当前窗口的hash表。 + +> 如果系统中有其他版本的 LLVM +> 编译器,请在安装毕昇编译器之后立即运行如下命令 + +``` +hash -r +``` + +> 防止clang命令被hash捕获,出现毕昇编译器或开源LLVM编译器无法使用的问题。 + +验证安装是否成功。 + +> 安装完毕后执行如下命令验证毕昇编译器版本: + + clang -v + +> 若返回结果已包含bisheng compiler版本信息,说明安装成功。 + +#### 软件包安装方式 + +准备工作。 + +> 在毕昇编译器产品页选择"毕昇编译器软件包下载"获取毕昇编译器软件包。且已上传至服务器上。 +> +> + +安装毕昇编译器环境依赖项。 + + yum install -y gcc glibc libatomic bc + +设置安装目录。 + +创建毕昇编译器安装目录 + + mkdir -p /usr/local/bisheng + +> 注:**/usr/local/***为举例说明路径,请根据用例存放实际路径修改。* + +将毕昇编译器压缩包拷贝到安装目录下,并解压: + + cd /usr/local/bisheng + wget https://mirrors.huaweicloud.com/kunpeng/archive/compiler/bisheng_compiler/bisheng-compiler-2.1.0-aarch64-linux.tar.gz --no-check-certificate + tar -zxvf bisheng-compiler-2.1.0-aarch64-linux.tar.gz + +> 解压完成后在当前目录下出现名为**bisheng-compiler-2.1.0-aarch64-linux**的目录。 + +配置毕昇编译器的环境变量。 + +安装environment-modules工具 + + yum install environment-modules -y + source /etc/profile + +执行以下命令,创建环境变量配置文件 + + vi /usr/local/bisheng/bisheng_modulefiles + +> 新增如下内容: + + #%Module1.0 + conflict bisheng + prepend-path PATH /usr/local/bisheng/bisheng-compiler-2.1.0-aarch64-linux/bin + prepend-path LD_LIBRARY_PATH /usr/local/bisheng/bisheng-compiler-2.1.0-aarch64-linux/lib + +执行以下命令,在当前shell中加载环境变量 + + module use /usr/local/bisheng/ + module load /usr/local/bisheng/bisheng_modulefiles + +若要避免每打开一个shell,导入一次变量。可写入到系统配置文件中。 + + vi /etc/profile + +> 新增如下内容: + + module use /usr/local/bisheng/ + module load /usr/local/bisheng/bisheng_modulefiles + +(可选)清空当前窗口的hash表。 + +> 如果系统中有其他版本的 +> LLVM编译器,请在安装毕昇编译器之后立即运行如下命令 + + hash -r + +> 防止clang命令被hash捕获,出现毕昇编译器或开源LLVM编译器无法使用的问题。 + +验证安装是否成功。 + +> 安装完毕后执行如下命令验证毕昇编译器版本: + + clang -v + +> ![](./images/media/rId27.png) +> +>若返回结果已包含bisheng compiler版本信息,说明安装成功。 + +### Hyper MPI用户规划与创建 + +#### 安装HUCX + +Hyper MPI包含Hyper MPI和HUCX两个软件层,其中HyperMPI的安装依赖于HUCX,编译时应先编译HUCX。 + +前提条件 + +已完成以下依赖包的安装。 + +perl-Data-Dumper + +autoconf + +automake + +libtool 2.4.2 + +毕昇编译器2.1.0 + +numactl + +binutils + +systemd-devel + +valgrind + +flex + +> 如果不确定是否安装,则执行下列命令安装。 + + yum install -y perl-Data-Dumper autoconf automake libtool numactl binutils systemd-devel valgrind flex + +毕昇编译hucx软件包 + +下载HUCX源码包"hucx-1.1.1-huawei.tar.gz"。 + +下载地址:https://github.com/kunpengcompute/hucx/archive/refs/tags/v1.1.1-huawei.tar.gz + +下载XUCG源码包"xucg-1.1.1-huawei.tar.gz"。 + +下载地址: + +将上述两个源码包上传至服务器HUCX源码包安装目录,如"/path/to/package/hucx", + +执行以下命令,解压上述两个源码包。 + + tar -zxvf hucx-1.1.1-huawei.tar.gz + tar -zxvf xucg-1.1.1-huawei.tar.gz + +执行以下命令,将XUCG源码包中的内容复制到HUCX源码包中的"src/ucg"目录下。 + + cp -r xucg-1.1.1-huawei/* hucx-1.1.1-huawei/src/ucg + +执行以下命令,进入"autogen.sh"脚本所在目录,并初始化git仓库。 + + cd hucx-1.1.1-huawei/ && git init + +执行以下命令,进行源码包安装。 + + ./autogen.sh + ./contrib/configure-opt -prefix=/usr/local/hmpi/hucx CC=clang CXX=clang++ FC=flang + +> 注:*/usr/local/为举例说明路径,请根据用例存放实际路径修改。* + +![注意](./images/media/rId33.png) + +注意 :环境上若没有安装numactl插件,则需要执行以下命令,指定\--disable-numa参数: + + ./contrib/configure-opt -prefix=/usr/local/hmpi/hucx --disable-numa CC=clang CXX=clang++ FC=flang + for file in `find . -name Makefile`;do sed -i "s/-Werror//g" $file;done + for file in `find . -name Makefile`;do sed -i "s/-implicit-function-declaration//g" $file;done + make -j 8 + make -j 8 install + +配置环境变量 + + export PATH=/usr/local/hmpi/hucx/bin:$PATH + export LD_LIBRARY_PATH=/usr/local/hmpi/hucx/lib:$LD_LIBRARY_PATH + export INCLUDE=/usr/local/hmpi/hucx/include:$INCLUDE + +#### 毕昇编译Hyper-MPI软件包 + +下载Hyper MPI源码包"hmpi-1.1.1-huawei.tar.gz"。 + +> 下载地址: + +将源码包上传至服务器Hyper +MPI源码包安装目录,如"/path/to/package/hmpi";执行以下命令,解压软件包。 + + tar -zxvf hmpi-1.1.1-huawei.tar.gz + +执行以下命令,进入"autogen.pl"脚本所在目录。 + + cd hmpi-1.1.1-huawei/ + +执行以下命令,进行Hyper MPI源码包安装。 + + ./autogen.pl CC=clang CXX=clang++ FC=flang + ./configure -prefix=/usr/local/hmpi --with- platform=contrib/platform/mellanox/optimized --enable-mpi1-compatibility -with- ucx=/usr/local/hmpi/hucx CC=clang CXX=clang++ FC=flang + +> 注:**/usr/local/***为举例说明路径,请根据用例存放实际路径修改。* + + make -j$(nproc) + make -j$(nproc) install + +配置环境变量。 + +执行以下命令,创建环境变量配置文件 + + vi /usr/local/hmpi/hmpi_modulefiles + +> 新增如下内容: + + #%Module1.0 + conflict hmpi + set OPAL_PREFIX /usr/local/hmpi + setenv OPAL_PREFIX /usr/local/hmpi + prepend-path PATH $OPAL_PREFIX/bin:$OPAL_PREFIX/hucx/bin + prepend-path LD_LIBRARY_PATH $OPAL_PREFIX/lib:$OPAL_PREFIX/hucx/lib + prepend-path INCLUDE $OPAL_PREFIX/include:$OPAL_PREFIX/hucx/include + +执行以下命令,在当前shell中加载环境变量 + + module use /usr/local/hmpi/ + module load /usr/local/hmpi/hmpi_modulefiles + +若要避免每打开一个shell,导入一次变量。可写入到系统配置文件中。 + + vi /etc/profile + +> 新增如下内容: + + module use /usr/local/hmpi/ + module load /usr/local/hmpi/hmpi_modulefiles + +安装后检查:执行以下命令,进行安装后检查。 + + which mpirun + +> 若返回如下安装路径示例,则证明安装成功。 + + /usr/local/hmpi/bin/mpirun + +### 配置yum源 + +操作步骤 + +使用PuTTY工具,以root用户登录服务器。 + +执行yum list命令检查yum是否已配置。 + + yum list + +openEuler 20.03 (LTS-SP1)系统上的yum源已默认配置,本次不单独配置。 + +![](./images/media/rId41.png) + +执行以下命令安装基础依赖包。 + + yum install -y gcc gcc-c++ m4 wget openssl-devel git + +### 安装CMAKE + +操作步骤 + +使用PuTTY工具,以root用户登录服务器。 + +执行以下命令解压3.16.5版本的cmake安装包。 + + tar -zxvf cmake-3.16.5.tar.gz + +执行以下命令进入解压后的目录。 + + cd cmake-3.16.5 + +执行以下命令进行配置。 + + export CC=`which clang` + export CXX=`which clang++` + export FC=`which flang` + ./bootstrap --prefix=/path/to/CMAKE + +> 开始回显 + +![](./images/media/rId45.png) + +> 结束回显 +> +> ![](./images/media/rId48.png) + +执行以下命令进行编译安装。 + + make + make install + +![](./images/media/rId51.png) + +执行以下命令设置cmake的环境变量。 + + export PATH=/path/to/CMAKE/bin:$PATH + +检查安装后的版本。 + + cmake --version + +![](./images/media/rId54.png) + +## 获取源码 + +操作步骤 + +执行以下命令创建ECCODES安装路径"/path/to/ECCODES"目录。 + + mkdir -p /path/to/ECCODES + +执行以下命令进入ECCODES目录。 + + cd /path/to/ECCODES + +下载ECCODES安装包"Eccodes-2.18.0-Source.tar.gz"。 + +下载地址:。 + +> ![](./images/media/rId60.png)**说明** + +如果服务器可以连接外网,推荐使用wget命令获取ECCODES安装包。 + + wget https://confluence.ecmwf.int/download/attachments/45757960/Eccodes-2.18.0- Source.tar.gz --no-check-certificate + +## 编译和安装 + +操作步骤 + +使用PuTTY工具,以root用户登录服务器。 + +进入ECCODES安装包所在目录。 + + cd /path/to/ECCODES + +执行以下命令安装依赖包。 + + yum install -y openjpeg-devel python-devel numpy + +执行以下命令解压ECCODES安装包。 + + tar -zxvf Eccodes-2.18.0-Source.tar.gz + +执行以下命令进入解压后的目录。 + + cd eccodes-2.18.0-Source + +执行以下命令创建构建目录。 + + mkdir build + cd build + +执行以下cmake命令。 + + export CC=`which clang` + export CXX=`which clang++` + export FC=`which flang` + cmake ../../eccodes-2.18.0-Source -DCMAKE_INSTALL_PREFIX=/path/to/ECCODES + +> 开始回显 +> +> ![](./images/media/rId64.png) +> +>结束回显 +> +>![](./images/media/rId67.png) + +执行以下命令进行编译。 + + make -j 8 + +> 开始回显 +> +> ![](./images/media/rId70.png) +> +>结束回显 +> +>![](./images/media/rId73.png) + +执行以下命令进行测试。 + + ctest + +![](./images/media/rId76.png) + +执行命令进行安装。 + + make install + +> ![](./images/media/rId79.png) + +执行以下命令设置环境变量。 + + export PATH=/path/to/ECCODES/bin:$PATH + +## 运行和验证 + +操作步骤 + +使用PuTTY工具,以root用户登录服务器。 + +执行以下命令进行运行、验证。 + + codes_info + +![](./images/media/rId83.png) + +执行以下命令进行运行验证并获取运行时间。 + + time codes_info + +![](./images/media/rId86.png) + +> ![](./images/media/rId60.png)**说明** +> +>返回结果中的"real"时间数值,单位是s,数值越小性能越优。 + +## 修订记录 + +| 发布日期 | 修订记录 | +| ----------- | ---------------- | +| 2023-021-23 | 第一次正式发布。 | + diff --git "a/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId27.png" "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId27.png" new file mode 100644 index 0000000000000000000000000000000000000000..cb519f01c03b6aafa99f158dfed4c3822772c39c Binary files /dev/null and "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId27.png" differ diff --git "a/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId33.png" "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId33.png" new file mode 100644 index 0000000000000000000000000000000000000000..53fd89e9fb7450a37e5abfbf3c0da50044a03363 Binary files /dev/null and "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId33.png" differ diff --git "a/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId41.png" "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId41.png" new file mode 100644 index 0000000000000000000000000000000000000000..33e5ab519b097ae573025dc3eaaacc3f4124f682 Binary files /dev/null and "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId41.png" differ diff --git "a/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId45.png" "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId45.png" new file mode 100644 index 0000000000000000000000000000000000000000..4bd6c2f82eccb20618ca7a3493c7c0c4f17da4c5 Binary files /dev/null and "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId45.png" differ diff --git "a/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId48.png" "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId48.png" new file mode 100644 index 0000000000000000000000000000000000000000..6476c1069690d5168d7711a6ab7231cead006f3c Binary files /dev/null and "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId48.png" differ diff --git "a/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId51.png" "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId51.png" new file mode 100644 index 0000000000000000000000000000000000000000..8ebe6b0a362a0c686198c9c2c74def6b537ab731 Binary files /dev/null and "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId51.png" differ diff --git "a/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId54.png" "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId54.png" new file mode 100644 index 0000000000000000000000000000000000000000..fcb42df9c81cad5251be7288e2256b67805a2016 Binary files /dev/null and "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId54.png" differ diff --git "a/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId60.png" "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId60.png" new file mode 100644 index 0000000000000000000000000000000000000000..04523ba8d653c89d1a2afa33286ff1d867a98ccd Binary files /dev/null and "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId60.png" differ diff --git "a/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId64.png" "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId64.png" new file mode 100644 index 0000000000000000000000000000000000000000..018a30ef43db21d9cc573a24407841098d7d55c4 Binary files /dev/null and "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId64.png" differ diff --git "a/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId67.png" "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId67.png" new file mode 100644 index 0000000000000000000000000000000000000000..becd272556e65bc7b3788541e96e7e5861cc4e94 Binary files /dev/null and "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId67.png" differ diff --git "a/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId70.png" "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId70.png" new file mode 100644 index 0000000000000000000000000000000000000000..f0585a2bdf6226f046514a7ebd634a5b062638b6 Binary files /dev/null and "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId70.png" differ diff --git "a/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId73.png" "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId73.png" new file mode 100644 index 0000000000000000000000000000000000000000..3e0f2409dfd35cb58709d2ff334681be3be8590d Binary files /dev/null and "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId73.png" differ diff --git "a/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId76.png" "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId76.png" new file mode 100644 index 0000000000000000000000000000000000000000..b9e0b23bdf5b0816c4d35be26b8179c3fb8ef8cf Binary files /dev/null and "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId76.png" differ diff --git "a/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId79.png" "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId79.png" new file mode 100644 index 0000000000000000000000000000000000000000..2b2849ced138c4198b6ad03172a68f48a37ea8fe Binary files /dev/null and "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId79.png" differ diff --git "a/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId83.png" "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId83.png" new file mode 100644 index 0000000000000000000000000000000000000000..7b59b89597a53667045cf7d9906b0794012fb3bb Binary files /dev/null and "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId83.png" differ diff --git "a/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId86.png" "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId86.png" new file mode 100644 index 0000000000000000000000000000000000000000..46fd710830a0af3bc41e664b3e3a1369ee61daf3 Binary files /dev/null and "b/app/zh/blog/20230223-Eccodes-openEuler \343\200\220\350\277\201\347\247\273\347\247\273\346\244\215\346\241\210\344\276\213\343\200\221/images/media/rId86.png" differ