{
  "schema_version": 1,
  "description": "Explicit supported documentation surface; unlisted helpers remain implementation details.",
  "groups": {
    "builders": [
      "pygrnwang.create_edgrn_bulk.pre_process_edgrn2",
      "pygrnwang.create_edgrn_bulk.create_grnlib_edgrn2_sequential",
      "pygrnwang.create_edgrn_bulk.create_grnlib_edgrn2_parallel",
      "pygrnwang.create_edgrn_bulk.create_grnlib_edgrn2_parallel_multi_nodes",
      "pygrnwang.create_edgrn_bulk.check_grnlib_edgrn2",
      "pygrnwang.create_edcmp_bulk.pre_process_edcmp2",
      "pygrnwang.create_edcmp_bulk.create_grnlib_edcmp2_sequential",
      "pygrnwang.create_edcmp_bulk.create_grnlib_edcmp2_parallel",
      "pygrnwang.create_edcmp_bulk.create_grnlib_edcmp2_parallel_multi_nodes",
      "pygrnwang.create_edcmp_bulk.convert_pd2bin_edcmp2_all",
      "pygrnwang.create_edcmp_bulk.check_grnlib_edcmp2",
      "pygrnwang.create_qseis06_bulk.pre_process_qseis06",
      "pygrnwang.create_qseis06_bulk.pre_process_qseis06_strain_rate",
      "pygrnwang.create_qseis06_bulk.create_grnlib_qseis06_sequential",
      "pygrnwang.create_qseis06_bulk.create_grnlib_qseis06_parallel",
      "pygrnwang.create_qseis06_bulk.create_grnlib_qseis06_parallel_multi_nodes",
      "pygrnwang.create_qseis06_bulk.convert_pd2bin_qseis06_all",
      "pygrnwang.create_qseis06_bulk.check_grnlib_qseis06",
      "pygrnwang.create_qseis2025_bulk.pre_process_qseis2025",
      "pygrnwang.create_qseis2025_bulk.create_grnlib_qseis2025_sequential",
      "pygrnwang.create_qseis2025_bulk.create_grnlib_qseis2025_parallel",
      "pygrnwang.create_qseis2025_bulk.create_grnlib_qseis2025_parallel_multi_nodes",
      "pygrnwang.create_qseis2025_bulk.convert_pd2bin_qseis2025_all",
      "pygrnwang.create_qseis2025_bulk.check_grnlib_qseis2025",
      "pygrnwang.create_spgrn2012_bulk.pre_process_spgrn2012",
      "pygrnwang.create_spgrn2012_bulk.create_grnlib_spgrn2012_sequential",
      "pygrnwang.create_spgrn2012_bulk.create_grnlib_spgrn2012_parallel",
      "pygrnwang.create_spgrn2012_bulk.create_grnlib_spgrn2012_parallel_multi_nodes",
      "pygrnwang.create_spgrn2012_bulk.check_grnlib_spgrn2012",
      "pygrnwang.create_spgrn2020_bulk.pre_process_spgrn2020",
      "pygrnwang.create_spgrn2020_bulk.create_grnlib_spgrn2020_sequential",
      "pygrnwang.create_spgrn2020_bulk.create_grnlib_spgrn2020_parallel",
      "pygrnwang.create_spgrn2020_bulk.create_grnlib_spgrn2020_parallel_multi_nodes",
      "pygrnwang.create_spgrn2020_bulk.check_grnlib_spgrn2020",
      "pygrnwang.create_qssp2020_bulk.pre_process_qssp2020",
      "pygrnwang.create_qssp2020_bulk.create_grnlib_qssp2020_sequential",
      "pygrnwang.create_qssp2020_bulk.create_grnlib_qssp2020_parallel",
      "pygrnwang.create_qssp2020_bulk.create_grnlib_qssp2020_spec_parallel_multi_nodes",
      "pygrnwang.create_qssp2020_bulk.create_grnlib_qssp2020_func_parallel_multi_nodes",
      "pygrnwang.create_qssp2020_bulk.convert_pd2bin_qssp2020_all",
      "pygrnwang.create_qssp2020_bulk.check_grnlib_qssp2020"
    ],
    "readers": [
      "pygrnwang.read_syn.read_syn",
      "pygrnwang.read_qseis2025.seek_qseis2025",
      "pygrnwang.read_qseis06.seek_qseis06",
      "pygrnwang.read_qseis06_diff.seek_qseis06_strain_rate_diff",
      "pygrnwang.read_qseis06_diff.seek_qseis06_stress_rate_diff",
      "pygrnwang.read_qseis06_diff.convert_strain2stress",
      "pygrnwang.read_spgrn2012.seek_spgrn2012",
      "pygrnwang.read_spgrn2020.seek_spgrn2020",
      "pygrnwang.read_spgrn2020.GridGFCache",
      "pygrnwang.read_spgrn2020.GridGFCache.get_block",
      "pygrnwang.read_spgrn2020.GridGFCache.time_series",
      "pygrnwang.read_spgrn2020.GridGFCache.tpts_table",
      "pygrnwang.read_spgrn2020.synthesize_from_cache",
      "pygrnwang.read_qssp2020.seek_qssp2020",
      "pygrnwang.read_by_qssp.read_by_qssp",
      "pygrnwang.read_edcmp.seek_edcmp2",
      "pygrnwang.read_edcmp.seek_edcmp2_bulk",
      "pygrnwang.read_green_info_spgrn.read_green_info_spgrn",
      "pygrnwang.read_tpts_table.read_tpts_table",
      "pygrnwang.utils.read_tpts_table"
    ],
    "traveltimes": [
      "pygrnwang.pytaup.cal_first_p",
      "pygrnwang.pytaup.cal_first_s",
      "pygrnwang.pytaup.cal_first_p_s",
      "pygrnwang.pytaup.taup_time_java",
      "pygrnwang.pytaup.taup_create_npz_file",
      "pygrnwang.pytaup.create_tpts_table"
    ],
    "science": [
      "pygrnwang.focal_mechanism.check_convert_fm",
      "pygrnwang.focal_mechanism.plane2mt",
      "pygrnwang.focal_mechanism.convert_mt_axis",
      "pygrnwang.focal_mechanism.tensor2full_tensor_matrix",
      "pygrnwang.focal_mechanism.moment_from_moment_tensor",
      "pygrnwang.focal_mechanism.cal_m0_from_mt",
      "pygrnwang.focal_mechanism.mt2plane",
      "pygrnwang.focal_mechanism.plane2nd",
      "pygrnwang.focal_mechanism.plane2tbp",
      "pygrnwang.geo.rotate_2d_points",
      "pygrnwang.geo.rotate_rtz_to_enz",
      "pygrnwang.geo.create_rotate_z_mat",
      "pygrnwang.geo.rotate_symmetric_tensor_series",
      "pygrnwang.geo.geo_2_r_earth",
      "pygrnwang.geo.r_earth_2_geo",
      "pygrnwang.geo.convert_axis_delta_geo2ned",
      "pygrnwang.geo.convert_axis_delta_ned2geo",
      "pygrnwang.signal_process.taper",
      "pygrnwang.signal_process.cal_sos",
      "pygrnwang.signal_process.filter_butter",
      "pygrnwang.signal_process.resample",
      "pygrnwang.signal_process.linear_interp",
      "pygrnwang.utils.read_nd",
      "pygrnwang.utils.read_material_nd",
      "pygrnwang.utils.read_layerd_material",
      "pygrnwang.utils.convert_earth_model_nd2inp",
      "pygrnwang.utils.convert_earth_model_nd2nd_without_Q",
      "pygrnwang.utils.create_stf",
      "pygrnwang.utils.cal_grid",
      "pygrnwang.create_nd_by_crust1_ak135.create_nd_by_crust1_ak135",
      "pygrnwang.crust1.CrustModel",
      "pygrnwang.crust1.CrustModel.get_point"
    ]
  }
}
