Populate the catalog at runtime (procedure pointers can’t be a parameter constructor). Idempotent.
subroutine ensure_catalog_initialised() !! Populate the catalog at runtime (procedure pointers can't be a !! parameter constructor). Idempotent. if (catalog_initialised) return CATALOG(1) = derived_entry_t( & name="h_layer", & long_name="layer_thickness", & units="m", & standard_name="ocean_layer_thickness", & fill=fill_h_layer, is_layered=.true.) CATALOG(2) = derived_entry_t( & name="rho_layer", & long_name="layer_in_situ_density", & units="kg m-3", & standard_name="sea_water_density", & fill=fill_rho_layer, is_layered=.true.) CATALOG(3) = derived_entry_t( & name="vorticity_z", & long_name="vertical_relative_vorticity_at_cell_centre", & units="s-1", & standard_name="ocean_relative_vorticity", & fill=fill_vorticity_z, is_layered=.true., masks_land=.true.) CATALOG(4) = derived_entry_t( & name="ke_total", & long_name="depth_integrated_kinetic_energy", & units="m3 s-2", & standard_name="ocean_kinetic_energy_content", & fill=fill_ke_total, is_layered=.false.) CATALOG(5) = derived_entry_t( & name="transport_x", & long_name="depth_integrated_eastward_transport", & units="m2 s-1", & standard_name="ocean_volume_transport_x", & fill=fill_transport_x, is_layered=.false.) CATALOG(6) = derived_entry_t( & name="transport_y", & long_name="depth_integrated_northward_transport", & units="m2 s-1", & standard_name="ocean_volume_transport_y", & fill=fill_transport_y, is_layered=.false.) CATALOG(7) = derived_entry_t( & name="mld_density", & long_name="mixed_layer_depth_density_threshold", & units="m", & standard_name="ocean_mixed_layer_thickness_defined_by_sigma_t", & fill=fill_mld_density, is_layered=.false.) CATALOG(8) = derived_entry_t( & name="ice_speed", & long_name="sea_ice_drift_speed_at_cell_centre", & units="m s-1", & standard_name="sea_ice_speed", & fill=fill_ice_speed, is_layered=.false.) CATALOG(9) = derived_entry_t( & name="ice_u", & long_name="eastward_sea_ice_velocity_at_cell_centre", & units="m s-1", & standard_name="sea_ice_x_velocity", & fill=fill_ice_u, is_layered=.false.) CATALOG(10) = derived_entry_t( & name="ice_v", & long_name="northward_sea_ice_velocity_at_cell_centre", & units="m s-1", & standard_name="sea_ice_y_velocity", & fill=fill_ice_v, is_layered=.false.) ! ---- Ice-shelf cavity (P2c). Eleven melt-interface fields, all ! gated on `&ocean_cavity_melt_nml enable`, plus two GEOMETRY ! fields that need only `&ocean_cavity_dyn_nml`. Every one is ! NaN outside the cover, so a domain mean over the output is a ! mean over the CAVITY — see `cavity_mask_impl`. CATALOG(11) = derived_entry_t( & name="melt", & long_name="ice_shelf_basal_melt_mass_flux", & units="kg m-2 s-1", & standard_name="water_flux_into_sea_water_from_ice_shelf", & fill=fill_melt, is_layered=.false., & requires=DERIVED_REQ_CAVITY_MELT) CATALOG(12) = derived_entry_t( & name="melt_m_per_yr", & long_name="ice_shelf_basal_melt_rate_isomip_convention", & units="m yr-1", & standard_name="ice_shelf_basal_melt_rate", & fill=fill_melt_m_per_yr, is_layered=.false., & requires=DERIVED_REQ_CAVITY_MELT) CATALOG(13) = derived_entry_t( & name="thermal_driving", & long_name="far_field_thermal_driving_above_in_situ_freezing_point", & units="degC", & standard_name="ocean_thermal_driving", & fill=fill_thermal_driving, is_layered=.false., & requires=DERIVED_REQ_CAVITY_MELT) CATALOG(14) = derived_entry_t( & name="haline_driving", & long_name="far_field_haline_driving_above_interface_salinity", & units="g kg-1", & standard_name="ocean_haline_driving", & fill=fill_haline_driving, is_layered=.false., & requires=DERIVED_REQ_CAVITY_MELT) CATALOG(15) = derived_entry_t( & name="tbdry", & long_name="ice_ocean_interface_temperature", & units="degC", & standard_name="sea_water_temperature_at_ice_shelf_base", & fill=fill_tbdry, is_layered=.false., & requires=DERIVED_REQ_CAVITY_MELT) CATALOG(16) = derived_entry_t( & name="sbdry", & long_name="ice_ocean_interface_salinity", & units="g kg-1", & standard_name="sea_water_salinity_at_ice_shelf_base", & fill=fill_sbdry, is_layered=.false., & requires=DERIVED_REQ_CAVITY_MELT) CATALOG(17) = derived_entry_t( & name="tfreeze_ib", & long_name="in_situ_freezing_point_of_the_far_field_at_the_ice_base", & units="degC", & standard_name="sea_water_freezing_temperature", & fill=fill_tfreeze_ib, is_layered=.false., & requires=DERIVED_REQ_CAVITY_MELT) CATALOG(18) = derived_entry_t( & name="exch_vel_t", & long_name="thermal_exchange_velocity_at_the_ice_base", & units="m s-1", & standard_name="ocean_thermal_exchange_velocity", & fill=fill_exch_vel_t, is_layered=.false., & requires=DERIVED_REQ_CAVITY_MELT) CATALOG(19) = derived_entry_t( & name="exch_vel_s", & long_name="haline_exchange_velocity_at_the_ice_base", & units="m s-1", & standard_name="ocean_haline_exchange_velocity", & fill=fill_exch_vel_s, is_layered=.false., & requires=DERIVED_REQ_CAVITY_MELT) CATALOG(20) = derived_entry_t( & name="ustar_shelf", & long_name="friction_velocity_of_the_ice_shelf_melt_law", & units="m s-1", & standard_name="ocean_friction_velocity_at_ice_shelf_base", & fill=fill_ustar_shelf, is_layered=.false., & requires=DERIVED_REQ_CAVITY_MELT) CATALOG(21) = derived_entry_t( & name="cavity_melt_status", & long_name="per_column_basal_melt_solver_status_code", & units="1", & standard_name="ocean_basal_melt_solver_status", & fill=fill_cavity_melt_status, is_layered=.false., & requires=DERIVED_REQ_CAVITY_MELT) CATALOG(22) = derived_entry_t( & name="z_draft", & long_name="ice_shelf_draft_below_the_geoid", & units="m", & standard_name="ice_shelf_draft", & fill=fill_z_draft, is_layered=.false., & requires=DERIVED_REQ_CAVITY_DYN) CATALOG(23) = derived_entry_t( & name="water_column", & long_name="water_column_thickness_under_the_ice_shelf", & units="m", & standard_name="sea_water_column_thickness", & fill=fill_water_column, is_layered=.false., & requires=DERIVED_REQ_CAVITY_DYN) catalog_initialised = .true. end subroutine ensure_catalog_initialised