IRI 2016模型计算二维全球电离层TEC分布网格(Fortran离线版)

本文介绍如何利用IRI(Internation Reference Ionosphere 国际参考电离层) 2016模型离线版本(Fortran语言)实现任意时间全球的电离层二维TEC分布图,该功能是IRI在线查询不具备的。

话不多说,先上一张效果图,下图为2019年6月21日(夏至日)的全球TEC分布图,网格精度为1°。

图0. IRI-2016模型生成的全球TEC分布图
图1. IRI官方网站的截图

 

如上图所示,IRI官方网站(http://irimodel.org/)目前提供了MATLAB、Python和Fortran三个版本的电离层的离线查询运行程序。其中Matlab版本需要不具备真正的“离线”功能,即其运行基于CMCC提供的在线服务支持,且运行过程中存在无法连接等问题,使用及其不便。Python版本的基于官方提供的pyglow模块,仅能在Linux系统下先编译、后安装。因此,本文重点介绍利用Fortran版本的离线软件包实现任意精度,任意时刻的全球二维TEC网格的计算方法,并能够真正意义上做到离线运行。

Fortran版本的离线软件包是IRI官方提供最早,最稳健的离线版本,其完整内容如下:

 图2. Fortran版本的软件包

 

其中”*.dat”为数据文件,”*.for”为Fortran程序,其中“iritest.for”为演示程序(main函数),其余for程序为相关的子函数(即subroutine)。编译并运行Fortran需要利用Fortran编译器,目前较为常用的有Visual Studio,Code Blocks和Simply Fortran,个人推荐使用Simply Fortran因为它是专门为Fortran程序设计的编译器前两种集成度太高且不够轻量化(Fortran 2.4安装及注册机,网盘链接:https://pan.baidu.com/s/1E5oZg-DiquAU163lGBEOpw 提取码:1t1q )。下面先介绍IRI-Fortran的基本内容与使用方法:

(1)IRI官网下载Fortran软件包(http://www.irimodel.org/)

图3. IRI官网截图

     

上图中的程序和数据文件都是需要的,关于Fortran软件包的下载可以进一步参考(https://blog.csdn.net/sinat_32602421/article/details/88671935),注意图3中第一行的“common files for all vision”也是必须下载的,其中包含的为“*.asc”文件,并将其拷贝到与代码相同的路径即可。

(2)在Simply Fortran中创建工程并添加文件

安装好Simply Fortran并利用注册机生成的注册码完成激活后,首先创建一个新的工程(*.prj文件)如图9中的IRI2016.prj,第二步将刚刚下载的所有程序及数据文件添加到IRI2016.prj下,此时代码所在路径下应包含图2中的全部内容。

图4. 新建Fortran工程

 

(3) 编译并运行iritest.for(main函数)

如下图所示先编译,再点击运行iritest.for,和C语言一样同一个工程路径下只能有一个main函数,接下来改写iritest.for的时候如果需要备份原代码请将备份的.for程序从工程路径下移除。

图5. 编译程序

                               

图6. 点击运行程序

如果代码没有语法错误会显示编译complete,接下来运行iritest.for会在下方调试栏内弹出会话语句,使用键盘输入需要查询的经纬度时间等信息完成对电离层数据的查询,会话如下:

图7. 通过键盘输入完成查询

 

上述步骤同样可以双击在图2中的target.exe在命令行模式下完成。

(4) 检查结果

完成上述操作后原始文件夹下会出现一个fort.7文件,这个文件就是刚刚查询的电离层数据,选择用记事本或写字板打开此文件,如下图所示。

图8. 电离层数据查询结果

 

该结果后期可应用matlab或python进行读取。到目前为止,为大家介绍了Fortran版本的离线软件包的基本使用方法,以上实现的功能与在线查询可实现的功能基本相同。读者在使用过程中可以发现,在上述查询TEC数据的过程中只有一个可迭代的变量,如果需要生成二维TEC网格就需要对iritest.for进行修改来实现(即多嵌套一层循环),接下来对具体的修改方法进行说明,话不多说直接上对iritest.for进行修改的程序截图:

(1)将键盘输入改为直接设置

iritest.for的原始输入为print、read的标准输入方式,即从键盘读取数据作为输入,实际上在查询的过程中,一次可能只需要修改一个变量(如经纬度、时间等),其他参数如海拔、TEC积分上限高度输出格式的选择等基本不需要修改。更重要的是输出二维的全球TEC网格需要对程序进行多次迭代(纬度范围:-90°~90°,经度范围:0~360°),在多次迭代中每次都用键盘输入查询参数是不现实的,也失去了迭代的意义。因此将图9所示的输入方式更改为图10所示的直接在程序中进行定义。

图9. iritest.for的原始输入
图10. 修改后参数变为直接在程序中设置

(2)添加循环

首先对iritest.for中原本的循环参数进行设置,使之设置为针对纬度(也可以是经度,此处如设置为经度则外层循环设置为纬度)的循环,如下图所示(其中ivar=2表示针对纬度进行循环)。

图11.对原始循环参数进行修改

下面我们需要做的是给该程序多嵌套一层循环,Fortran中的计数循环定义格式为

DO index=istart,iend,step
              循环语句
       END DO
       step如果缺少,默认是1。

因此,在程序的变量声明部分结束后添加如下图所示的循环语句(如果需要更高精度的网格可以指定迭代的step)

图12. 对程序进行如上图所示的修改

循环的终止(即enddo)设置在程序的最后,这里需要注意原本iritest.for在程序末尾设置了,判断循环是否中止的变量icontinue,该变量可以通过键盘输入,如下图所示

图13. 原始程序中的迭代终止方式

显然我们并不想每次通过键盘输入决定程序是否继续,即我们希望程序运行结束自动停止,因此需要对程序的结尾部分进行如下修改:

图14. 程序结尾处进行如图所示修改

至此,完成对程序的修改,重新编译并运行即可得到全球TEC的二维分布数据,其同样线性存储于fort.7文件中,后续工作可以直接将"fort.7"重命名为txt格式的文件,并编写相应的matlab或python程序将其读取为二维网格数据。

相信大家已经通过上述介绍了解了如何手动修改IRI官方提供的Fortran程序实现生成任意时刻,任意精度的全球电离层TEC数据的方法,最后奉上一个修改好的iritest.for文件(可直接替换原程序包中的同名文件)和一组对应的fort.7文件(包含数据)的网盘链接。

下载链接:

  1. 网盘链接:https://pan.baidu.com/s/1bUsT_jO9fNpZQ1_elnczBw 
    提取码:tmhb

本文参考:

《(20190319)IRI-Fortran程序包,说明和使用》

https://blog.csdn.net/sinat_32602421/article/details/88671935

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章