从数据到模拟:GEOS-Chem中MERRA2气象数据异常的全链路诊断与修复

从数据到模拟:GEOS-Chem中MERRA2气象数据异常的全链路诊断与修复

【免费下载链接】geos-chem GEOS-Chem "Science Codebase" repository. Contains GEOS-Chem science routines, run directory generation scripts, and interface code. This repository is used as a submodule within the GCClassic and GCHP wrappers, as well as in other modeling contexts (external ESMs). 【免费下载链接】geos-chem 项目地址: https://gitcode.com/gh_mirrors/ge/geos-chem

引言:MERRA2数据异常的致命影响

你是否曾在GEOS-Chem模拟中遇到过这些令人沮丧的情况:模型突然崩溃并显示"未找到变量"错误?模拟结果中出现明显的空间或时间不连续性?或者输出的气象场数值明显超出合理范围?这些问题往往源于MERRA2(Modern-Era Retrospective analysis for Research and Applications, Version 2)气象数据文件的异常。

MERRA2作为GEOS-Chem中应用最广泛的气象强迫数据之一,其质量直接决定了模拟结果的可靠性。本文将带你深入GEOS-Chem的源代码,揭示MERRA2数据从输入到处理的完整流程,系统分析可能出现的各类异常,并提供一套行之有效的诊断和修复方案。读完本文后,你将能够:

  • 识别MERRA2数据文件的常见异常类型及其特征
  • 使用GEOS-Chem内置工具和日志系统定位问题根源
  • 应用针对性的修复策略解决不同类型的数据异常
  • 建立有效的数据预处理流程,预防潜在的数据问题

MERRA2数据在GEOS-Chem中的处理流程

数据读取的核心路径

GEOS-Chem处理MERRA2数据的流程涉及多个关键模块,形成了一条从文件输入到数据应用的完整链路。下图展示了这一流程的主要组件及其交互关系:

mermaid

配置解析阶段

在GEOS-Chem Classic模式中,Input_Mod模块负责解析配置文件并设置气象场类型。关键代码位于GeosCore/input_mod.F90

! 解析配置文件中的气象场设置
key   = "simulation%met_field"
v_str = MISSING_STR
CALL QFYAML_Add_Get( Config, TRIM( key ), v_str, "", RC )
IF ( RC /= GC_SUCCESS ) THEN
   errMsg = 'Error parsing ' // TRIM( key ) // '!'
   CALL GC_Error( errMsg, RC, thisLoc )
   RETURN
ENDIF
Input_Opt%MetField = TRIM( v_str )

! 验证MERRA2气象场设置
Met = To_UpperCase( TRIM( Input_Opt%MetField ) )
SELECT CASE( TRIM( Met ) )
   CASE( 'MERRA-2', 'MERRA2' )
      Input_Opt%MetField = 'MERRA2'
   ! 其他气象场类型的处理...
   CASE DEFAULT
      errMsg = Trim( Input_Opt%MetField ) // ' is not a valid met field.'
      CALL GC_Error( errMsg, RC, thisLoc )
      RETURN
END SELECT

这段代码首先从YAML配置文件中读取met_field参数,然后将其标准化为"MERRA2"。如果用户输入了无效的气象场类型(如"MERRA"或"MERRA-2.0"),代码会触发错误并终止初始化。

数据读取阶段

FlexGrid_Read_Mod模块是处理MERRA2数据读取的核心,其FlexGrid_Read_A1FlexGrid_Read_A3子程序分别负责读取1小时和3小时平均的气象数据。关键代码位于GeosCore/flexgrid_read_mod.F90

! 确定时间索引
t_index = ( HHMMSS / 10000 ) + 1

! 检查时间索引有效性
IF ( t_index < 1 .or. t_index > 24 ) THEN
   WRITE( errMsg, 100 ) t_index
100 FORMAT( 'Time_index value ', i5, ' must be in the range 1 to 24!' )
   CALL Error_Stop( errMsg, caller )
ENDIF

! 读取2D气象变量
v_name = "PBLH"
CALL Get_Met_2D( Input_Opt, State_Grid, Q, TRIM(v_name), t_index=t_index )
State_Met%PBLH = Q

对于MERRA2数据,GEOS-Chem假设时间维度按小时组织,每个文件包含一天的数据。代码通过将时间(HHMMSS格式)除以10000提取小时部分,再加1得到在NetCDF文件中的时间索引。这一过程假设输入数据严格遵循每小时一个时次的格式,任何偏差都会导致索引错误。

数据转换与单位处理

MERRA2数据的单位转换是另一个关键环节,特别是气压相关变量。在FlexGrid_Read_A1子程序末尾,有专门针对MERRA2的单位转换代码:

! 转换表面降水场单位:[kg/m2/s] -> [mm/day]
State_Met%PRECANV = State_Met%PRECANV * 86400d0
State_Met%PRECCON = State_Met%PRECCON * 86400d0
State_Met%PRECLSC = State_Met%PRECLSC * 86400d0
State_Met%PRECTOT = State_Met%PRECTOT * 86400d0

! 对MERRA2,将气压单位从[Pa]转换为[hPa]
IF ( TRIM(Input_Opt%MetField) == 'MERRA2' ) THEN
   State_Met%SLP     = State_Met%SLP     * 1e-2_fp
   State_Met%TROPP   = State_Met%TROPP   * 1e-2_fp
ENDIF

这些转换因子基于MERRA2数据的官方文档。值得注意的是,GEOS-Chem对不同气象数据集采用不同的单位转换策略,这体现了代码对各类数据特性的适配。

MERRA2数据异常的类型与诊断方法

数据异常的分类体系

MERRA2数据异常可按其出现的阶段和表现形式分为四大类,每类都有其独特的特征和诊断方法:

异常类型出现阶段典型特征可能原因严重程度
文件结构异常数据读取初期模型启动失败,提示"文件未找到"或"变量不存在"文件路径错误、文件名格式不符、变量名拼写错误
维度不匹配数据读取阶段读取数组时崩溃,出现维度不匹配错误时间索引超出范围、经纬度网格不匹配
数值异常数据处理阶段模拟结果异常,出现极端值或空值数据文件损坏、填充值处理不当中-高
单位转换错误后处理阶段物理量数值明显不合理转换因子错误、单位标准不匹配

诊断工具与技术

日志分析技术

GEOS-Chem的日志文件是诊断数据问题的首要信息来源。通过设置适当的日志级别(在geoschem_config.yml中配置simulation%verbose%activate: true),可以获得详细的MERRA2数据读取过程信息:

READ_INPUT_FILE: Opening ./geoschem_config.yml
Config_Simulation: Set MetField to MERRA2
FlexGrid_Read_A1: Reading A1 met fields for 20190701 000000
Get_Met_2D: Reading variable PBLH at t_index=1
FlexGrid_Read_A1: Found all A1 met fields for 20190701 000000

正常情况下,日志会按上述格式记录每个变量的读取过程。如果某个变量缺失或读取失败,日志中会出现包含"Error"或"Missing"关键字的错误信息。

数据可视化诊断

对于数值异常,可视化是最直观的诊断方法。以下Python代码片段可用于快速检查MERRA2数据文件的关键变量:

import netCDF4 as nc
import matplotlib.pyplot as plt
import numpy as np

# 打开MERRA2数据文件
filename = "MERRA2_400.tavg1_2d_flx_Nx.20190701.nc4"
ds = nc.Dataset(filename, 'r')

# 读取边界层高度数据
pblh = ds.variables['PBLH'][0, :, :]  # 读取第一个时次

# 检查数据范围
print(f"PBLH最小值: {np.min(pblh)}")
print(f"PBLH最大值: {np.max(pblh)}")
print(f"PBLH平均值: {np.mean(pblh)}")
print(f"缺失值数量: {np.count_nonzero(np.isnan(pblh))}")

# 可视化
plt.figure(figsize=(12, 8))
plt.imshow(pblh, cmap='viridis')
plt.colorbar(label='PBLH (m)')
plt.title('MERRA2 PBLH at 2019-07-01 00:00')
plt.show()

正常的MERRA2边界层高度数据范围通常在100-5000米之间,若出现大量超过此范围的值或NaN,很可能存在数据质量问题。

专用诊断脚本

利用GEOS-Chem源代码中的测试工具,可以构建专门的MERRA2数据诊断程序:

! 简化的MERRA2数据诊断程序
PROGRAM test_merra2
  USE Input_Opt_Mod
  USE State_Grid_Mod
  USE State_Met_Mod
  USE FlexGrid_Read_Mod
  
  TYPE(OptInput) :: Input_Opt
  TYPE(GrdState) :: State_Grid
  TYPE(MetState) :: State_Met
  INTEGER :: RC, YYYYMMDD, HHMMSS
  
  ! 初始化
  RC = GC_SUCCESS
  YYYYMMDD = 20190701
  HHMMSS = 000000
  
  ! 设置MERRA2为气象场
  Input_Opt%MetField = 'MERRA2'
  
  ! 读取网格信息
  CALL Get_Grid_Info( Input_Opt, State_Grid, RC )
  
  ! 读取A1数据
  CALL FlexGrid_Read_A1( YYYYMMDD, HHMMSS, Input_Opt, State_Grid, State_Met )
  
  ! 检查PBLH数据
  PRINT *, 'PBLH min:', MINVAL(State_Met%PBLH)
  PRINT *, 'PBLH max:', MAXVAL(State_Met%PBLH)
  PRINT *, 'PBLH mean:', MEAN(State_Met%PBLH)
  
  STOP
END PROGRAM test_merra2

这个简化程序可以隔离测试MERRA2数据的读取过程,帮助确定问题是否出在数据本身还是模型的其他部分。

常见异常案例深度分析

案例一:时间索引错误导致的变量读取失败

问题描述:在运行GEOS-Chem模拟时,模型在读取MERRA2数据的特定时间步长时崩溃,错误信息如下:

ERROR: Get_Met_2D: Variable PBLH not found at t_index=25
ERROR_STOP in FlexGrid_Read_A1 (flexgrid_read_mod.F90)

诊断过程

  1. 检查日志中的时间索引值(t_index=25),发现其超出了MERRA2数据文件的时间维度大小(通常为24,对应一天中的24小时)
  2. 查看Input_Opt%MetField设置,确认已正确设置为'MERRA2'
  3. 检查相关代码段:
! 在FlexGrid_Read_A1中的时间索引计算
t_index = ( HHMMSS / 10000 ) + 1

! 验证t_index范围
IF ( t_index < 1 .or. t_index > 24 ) THEN
   WRITE( errMsg, 100 ) t_index
100 FORMAT( 'Time_index value ', i5, ' must be in the range 1 to 24!' )
   CALL Error_Stop( errMsg, caller )
ENDIF

根本原因:输入的HHMMSS值为240000(表示午夜),而非000000。当除以10000时得到24,加1后得到t_index=25,超出了MERRA2数据文件的时间维度范围(1-24)。

解决方案:修正时间处理逻辑,确保240000被正确转换为000000:

! 修复后的时间索引计算
t_index = ( HHMMSS / 10000 ) 
IF ( t_index == 24 ) t_index = 0  ! 将24点转换为0点
t_index = t_index + 1  ! 转换为1-based索引

同时,在准备输入数据时,确保所有时间标签遵循000000-230000的格式,避免使用240000表示午夜。

案例二:单位转换错误导致的物理量异常

问题描述:模拟结果显示表面气压(SLP)数值异常偏低,约为正常值的1/100。

诊断过程

  1. 检查State_Met%SLP的数值范围,发现平均值约为1013,而非预期的101300
  2. 确认Input_Opt%MetField已正确设置为'MERRA2'
  3. 检查单位转换代码段:
! 对MERRA2,将气压单位从[Pa]转换为[hPa]
IF ( TRIM(Input_Opt%MetField) == 'MERRA2' ) THEN
   State_Met%SLP     = State_Met%SLP     * 1e-2_fp
   State_Met%TROPP   = State_Met%TROPP   * 1e-2_fp
ENDIF

根本原因:在某个代码版本中,上述单位转换代码被意外注释掉,导致MERRA2的气压数据仍以Pa为单位(101300 Pa)存在,但模型其他部分期望单位为hPa(1013 hPa),因此出现数值偏差。

解决方案:恢复单位转换代码,并添加额外的检查确保转换正确执行:

! 对MERRA2,将气压单位从[Pa]转换为[hPa]
IF ( TRIM(Input_Opt%MetField) == 'MERRA2' ) THEN
   ! 添加转换前检查,确保数据量级正确
   IF ( MAXVAL(State_Met%SLP) > 200000 .or. MINVAL(State_Met%SLP) < 50000 ) THEN
      PRINT *, 'Warning: SLP values out of expected range for Pa units'
      PRINT *, 'SLP min:', MINVAL(State_Met%SLP)
      PRINT *, 'SLP max:', MAXVAL(State_Met%SLP)
   ENDIF
   
   State_Met%SLP     = State_Met%SLP     * 1e-2_fp
   State_Met%TROPP   = State_Met%TROPP   * 1e-2_fp
   
   ! 转换后验证
   IF ( MAXVAL(State_Met%SLP) > 2000 .or. MINVAL(State_Met%SLP) < 500 ) THEN
      PRINT *, 'Warning: SLP values out of expected range after conversion to hPa'
      PRINT *, 'SLP min:', MINVAL(State_Met%SLP)
      PRINT *, 'SLP max:', MAXVAL(State_Met%SLP)
   ENDIF
ENDIF

案例三:数据文件损坏导致的数值异常

问题描述:模拟运行完成,但输出的降水数据在特定区域出现明显的负值,这在物理上是不合理的。

诊断过程

  1. 检查模型输出的降水变量(如PRECTOT),发现某些网格点的值为负
  2. 定位到FlexGrid_Read_A1子程序中读取PRECTOT的代码:
! Read PRECTOT
v_name = "PRECTOT"
CALL Get_Met_2D( Input_Opt, State_Grid, Q, TRIM(v_name), t_index=t_index )
State_Met%PRECTOT = Q
  1. 直接检查MERRA2数据文件:
import netCDF4 as nc
ds = nc.Dataset("MERRA2_400.tavg1_2d_flx_Nx.20190701.nc4")
prectot = ds.variables['PRECTOT'][:]
print("Min PRECTOT:", prectot.min())  # 输出为-0.00012

根本原因:MERRA2数据文件中存在负值的降水数据,这可能是由于原始数据处理错误或文件传输过程中的损坏导致的。GEOS-Chem在读取时未对这些物理上不合理的值进行检查和处理。

解决方案:在读取降水数据后添加质量控制步骤:

! Read PRECTOT
v_name = "PRECTOT"
CALL Get_Met_2D( Input_Opt, State_Grid, Q, TRIM(v_name), t_index=t_index )

! 质量控制:将负值设为0
WHERE( Q < 0.0 ) Q = 0.0

State_Met%PRECTOT = Q

同时,对原始MERRA2数据文件进行验证和修复,确保作为输入的数据符合物理合理性要求。

系统性解决方案与最佳实践

数据预处理自动化流程

为了从源头预防MERRA2数据异常,建立一套自动化的数据预处理流程至关重要。以下是一个推荐的预处理工作流:

mermaid

可以使用Python编写脚本来自动化这一流程:

import netCDF4 as nc
import numpy as np
import os
import hashlib

def preprocess_merra2(filename):
    """预处理MERRA2数据文件"""
    # 1. 完整性校验
    if not check_md5(filename):
        raise ValueError(f"文件 {filename} 完整性校验失败")
    
    # 2. 打开文件
    ds = nc.Dataset(filename, 'r+')
    
    # 3. 检查必要变量
    required_vars = ['PBLH', 'U', 'V', 'T2M', 'PRECTOT']
    for var in required_vars:
        if var not in ds.variables:
            raise ValueError(f"缺少必要变量: {var}")
    
    # 4. 处理PRECTOT中的负值
    if 'PRECTOT' in ds.variables:
        prectot = ds.variables['PRECTOT'][:]
        prectot[prectot < 0] = 0
        ds.variables['PRECTOT'][:] = prectot
    
    # 5. 检查时间维度
    if ds.dimensions['time'].size != 24:
        raise ValueError(f"时间维度大小应为24,实际为{ds.dimensions['time'].size}")
    
    # 6. 关闭文件
    ds.close()
    
    # 7. 生成报告
    generate_report(filename)
    
    return True

def check_md5(filename):
    """检查文件MD5哈希值"""
    # 实现MD5检查逻辑
    return True

def generate_report(filename):
    """生成预处理报告"""
    # 实现报告生成逻辑
    pass

GEOS-Chem代码增强建议

为提高GEOS-Chem对MERRA2数据异常的鲁棒性,可以考虑对源代码进行以下增强:

  1. 增强的单位转换检查

FlexGrid_Read_A1中添加更全面的单位转换验证:

! 单位转换验证
SELECT CASE( TRIM(Input_Opt%MetField) )
CASE( 'MERRA2' )
   ! 检查SLP范围是否合理(单位转换前)
   IF ( ANY( State_Met%SLP < 50000.0_fp .or. State_Met%SLP > 150000.0_fp ) ) THEN
      PRINT *, 'Warning: SLP values out of expected range (50000-150000 Pa)'
      PRINT *, 'Min SLP:', MINVAL( State_Met%SLP )
      PRINT *, 'Max SLP:', MAXVAL( State_Met%SLP )
   ENDIF
   
   ! 转换单位
   State_Met%SLP     = State_Met%SLP     * 1e-2_fp
   State_Met%TROPP   = State_Met%TROPP   * 1e-2_fp
   
   ! 检查转换后的范围
   IF ( ANY( State_Met%SLP < 500.0_fp .or. State_Met%SLP > 1500.0_fp ) ) THEN
      PRINT *, 'Warning: SLP values out of expected range (500-1500 hPa)'
      PRINT *, 'Min SLP:', MINVAL( State_Met%SLP )
      PRINT *, 'Max SLP:', MAXVAL( State_Met%SLP )
   ENDIF
END SELECT
  1. 灵活的时间索引处理

修改FlexGrid_Read_A1中的时间索引计算,使其能处理各种合法的时间格式:

! 改进的时间索引计算
hour = HHMMSS / 10000
minute = MOD(HHMMSS, 10000) / 100
second = MOD(HHMMSS, 100)

! 处理24:00:00的情况
IF ( hour == 24 .and. minute == 0 .and. second == 0 ) THEN
   hour = 0
ENDIF

! 计算时间索引(MERRA2每小时一个时次)
t_index = hour + 1

! 额外的安全检查
IF ( t_index < 1 .or. t_index > 24 ) THEN
   errMsg = 'Invalid time index for MERRA2 data'
   WRITE(errMsg, '(a,i3,a)') TRIM(errMsg)//': ', t_index, ' (expected 1-24)'
   CALL Error_Stop( errMsg, 'FlexGrid_Read_A1' )
ENDIF
  1. 物理合理性检查框架

创建一个通用的物理合理性检查子程序,用于验证所有读取的气象变量:

SUBROUTINE Check_Met_Validity( MetField, VarName, Data, MinVal, MaxVal )
  CHARACTER(LEN=*), INTENT(IN) :: MetField  ! 气象场类型
  CHARACTER(LEN=*), INTENT(IN) :: VarName   ! 变量名
  REAL(fp),         INTENT(IN) :: Data(:,:) ! 2D数据数组
  REAL(fp),         INTENT(IN) :: MinVal    ! 最小合理值
  REAL(fp),         INTENT(IN) :: MaxVal    ! 最大合理值
  
  ! 检查数据是否超出合理范围
  IF ( ANY( Data < MinVal .or. Data > MaxVal ) ) THEN
     PRINT *, 'Warning: ', TRIM(VarName), ' values out of range for ', TRIM(MetField)
     PRINT *, 'Expected range: ', MinVal, ' to ', MaxVal
     PRINT *, 'Actual range:   ', MINVAL(Data), ' to ', MAXVAL(Data)
     PRINT *, 'Percentage of out-of-range values: ', &
             COUNT(Data < MinVal .or. Data > MaxVal) * 100.0 / SIZE(Data), '%'
  ENDIF
  
END SUBROUTINE Check_Met_Validity

然后在读取每个变量后调用:

! Read PBLH
v_name = "PBLH"
CALL Get_Met_2D( Input_Opt, State_Grid, Q, TRIM(v_name), t_index=t_index )
CALL Check_Met_Validity( Input_Opt%MetField, TRIM(v_name), Q, 100.0_fp, 5000.0_fp )
State_Met%PBLH = Q

异常处理与恢复策略

即使采取了预防措施,数据异常仍可能发生。因此,建立有效的异常处理和恢复策略至关重要:

  1. 分级错误处理机制
! 读取变量并处理不同级别的错误
CALL Get_Met_2D( Input_Opt, State_Grid, Q, TRIM(v_name), t_index=t_index, RC=RC )

SELECT CASE ( RC )
CASE ( GC_SUCCESS )
   ! 成功读取,继续处理
   State_Met%PBLH = Q
   
CASE ( GC_WARNING )
   ! 警告级别错误,使用默认值并记录警告
   PRINT *, 'Warning: Error reading ', TRIM(v_name), '. Using default values.'
   State_Met%PBLH = 1000.0_fp  ! 默认边界层高度
   
CASE ( GC_FATAL )
   ! 致命错误,尝试使用前一时次数据
   IF ( Associated(State_Met_Prev%PBLH) ) THEN
      PRINT *, 'Fatal error reading ', TRIM(v_name), '. Using previous time step data.'
      State_Met%PBLH = State_Met_Prev%PBLH
   ELSE
      ! 无法恢复,终止模拟
      CALL Error_Stop( 'Cannot read '//TRIM(v_name)//' and no previous data available', &
                      'FlexGrid_Read_A1' )
   ENDIF
END SELECT
  1. 数据同化与平滑技术

对于局部的数据缺失或异常,可以采用简单的空间或时间插值技术进行修复:

! 使用空间平滑处理PBLH中的异常值
IF ( Check_For_Outliers(State_Met%PBLH, 3.0) ) THEN
   PRINT *, 'Detected outliers in PBLH. Applying spatial smoothing.'
   State_Met%PBLH = Spatial_Smooth( State_Met%PBLH, 3 )  ! 3x3平滑窗口
ENDIF
  1. 自动化恢复流程

在批处理模拟中,可以实现一个自动化恢复流程:

#!/bin/bash
# run_geoschem.sh - 带有错误恢复的GEOS-Chem运行脚本

YYYYMMDD_START=20190701
YYYYMMDD_END=20190731
CURRENT_DATE=$YYYYMMDD_START

while [ $CURRENT_DATE -le $YYYYMMDD_END ]; do
  # 运行GEOS-Chem模拟当前日期
  ./geoschem.x -r $CURRENT_DATE
  
  # 检查是否成功完成
  if [ $? -ne 0 ]; then
    echo "Simulation failed for $CURRENT_DATE. Attempting recovery..."
    
    # 运行数据诊断工具
    ./diagnose_merra2 $CURRENT_DATE
    
    # 根据诊断结果修复数据
    ./fix_merra2_data $CURRENT_DATE
    
    # 重新运行当天模拟
    ./geoschem.x -r $CURRENT_DATE
    
    # 如果再次失败,记录并继续
    if [ $? -ne 0 ]; then
      echo "Failed to recover $CURRENT_DATE. Skipping..."
      echo $CURRENT_DATE >> failed_dates.txt
    fi
  fi
  
  # 移动到下一天
  CURRENT_DATE=$(date -d "$CURRENT_DATE + 1 day" +%Y%m%d)
done

结论与展望

MERRA2气象数据作为GEOS-Chem模拟的基础,其质量和完整性直接决定了模拟结果的可靠性。本文系统分析了MERRA2数据在GEOS-Chem中的处理流程,识别了四大类数据异常,并通过实际案例展示了诊断和解决这些问题的方法。

通过实施本文提出的系统性解决方案——包括数据预处理自动化、GEOS-Chem代码增强和异常处理策略——可以显著提高模型对数据异常的鲁棒性。这些措施不仅能够减少模拟中断的频率,还能提高模拟结果的物理合理性和准确性。

未来,随着GEOS-Chem模型的不断发展,我们建议:

  1. 开发更智能的数据质量控制系统,利用机器学习算法提前预测和识别潜在的数据异常
  2. 增强模型的自适应能力,使其能够根据可用数据自动调整模拟策略
  3. 建立更全面的MERRA2数据与GEOS-Chem兼容性测试套件,确保新的模型版本能够正确处理各类气象数据

通过持续改进数据处理流程和错误处理机制,我们能够进一步提高GEOS-Chem模拟的可靠性和效率,为大气化学研究提供更坚实的基础。

参考资料

  1. GEOS-Chem User's Guide: https://geos-chem.readthedocs.io/
  2. MERRA-2 Data Products: https://gmao.gsfc.nasa.gov/reanalysis/MERRA-2/
  3. GEOS-Chem Source Code Repository: https://gitcode.com/gh_mirrors/ge/geos-chem
  4. NetCDF File Format Specification: https://www.unidata.ucar.edu/software/netcdf/
  5. Bey, I., et al. (2001). GEOS-Chem: A global 3-D model of tropospheric chemistry driven by assimilated meteorological observations. Journal of Geophysical Research: Atmospheres, 106(D21), 27823-27852.

【免费下载链接】geos-chem GEOS-Chem "Science Codebase" repository. Contains GEOS-Chem science routines, run directory generation scripts, and interface code. This repository is used as a submodule within the GCClassic and GCHP wrappers, as well as in other modeling contexts (external ESMs). 【免费下载链接】geos-chem 项目地址: https://gitcode.com/gh_mirrors/ge/geos-chem

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值