build_pending_handle Subroutine

private subroutine build_pending_handle(text, c_handle, h, status)

Shared prefix of rdb_ocean_create_from_string AND rdb_ocean_create_pending (P2.5): allocate a handle, parse + validate the config, check dt_fixed. Does NOT touch g_handle_live — callers set it themselves once they know which of the two flows they are in (immediate complete_ocean_create vs staying pending for geometry injection).

On success: c_handle/h are a valid, freshly allocated handle (h%is_pending/h%is_initialised both still .false.). On failure: the handle has ALREADY been destroyed (matches the F9 “destroy the whole handle on any failure” contract) — c_handle is left as returned by handle_create/handle_destroy (the caller must not touch it further) and h is null.

Arguments

Type IntentOptional Attributes Name
character(len=*), intent(in) :: text
type(c_ptr), intent(out) :: c_handle
type(ocean_handle_t), intent(out), pointer :: h
integer(kind=c_int), intent(out) :: status

Calls

proc~~build_pending_handle~~CallsGraph proc~build_pending_handle build_pending_handle proc~comm_env_init comm_env_init proc~build_pending_handle->proc~comm_env_init proc~handle_check handle_check proc~build_pending_handle->proc~handle_check proc~handle_create handle_create proc~build_pending_handle->proc~handle_create proc~handle_destroy handle_destroy proc~build_pending_handle->proc~handle_destroy proc~read_config_from_string read_config_from_string proc~build_pending_handle->proc~read_config_from_string proc~validate_config validate_config proc~build_pending_handle->proc~validate_config comm_world comm_world proc~comm_env_init->comm_world pic_mpi_init pic_mpi_init proc~comm_env_init->pic_mpi_init proc~read_config_from_string_impl read_config_from_string_impl proc~read_config_from_string->proc~read_config_from_string_impl cav_dz cav_dz proc~validate_config->cav_dz error error proc~validate_config->error info info proc~validate_config->info proc~aniso_mode_is_implemented aniso_mode_is_implemented proc~validate_config->proc~aniso_mode_is_implemented proc~bbl_glue_is_effective bbl_glue_is_effective proc~validate_config->proc~bbl_glue_is_effective proc~bdrag_variant_is_implemented bdrag_variant_is_implemented proc~validate_config->proc~bdrag_variant_is_implemented proc~bkgnd_henyey_conflicts_profile bkgnd_henyey_conflicts_profile proc~validate_config->proc~bkgnd_henyey_conflicts_profile proc~cavity_draft_is_uniform cavity_draft_is_uniform proc~validate_config->proc~cavity_draft_is_uniform proc~check_dataovr_file check_dataovr_file proc~validate_config->proc~check_dataovr_file proc~dataovr_any_tag_set dataovr_any_tag_set proc~validate_config->proc~dataovr_any_tag_set proc~dataovr_entry_is_valid dataovr_entry_is_valid proc~validate_config->proc~dataovr_entry_is_valid proc~dataovr_freshwater_needs_components dataovr_freshwater_needs_components proc~validate_config->proc~dataovr_freshwater_needs_components proc~dataovr_time_is_valid dataovr_time_is_valid proc~validate_config->proc~dataovr_time_is_valid proc~diag_density_levels_ok diag_density_levels_ok proc~validate_config->proc~diag_density_levels_ok proc~error_ring_push error_ring_push proc~validate_config->proc~error_ring_push proc~fail fail proc~validate_config->proc~fail proc~forcing_components_need_thermo forcing_components_need_thermo proc~validate_config->proc~forcing_components_need_thermo proc~gprime_nz_is_supported gprime_nz_is_supported proc~validate_config->proc~gprime_nz_is_supported proc~has_biharmonic_backstop has_biharmonic_backstop proc~validate_config->proc~has_biharmonic_backstop proc~ice_hlim_count ice_hlim_count proc~validate_config->proc~ice_hlim_count proc~ice_hlim_spec_is_valid ice_hlim_spec_is_valid proc~validate_config->proc~ice_hlim_spec_is_valid proc~ice_ic_parse_conc_config ice_ic_parse_conc_config proc~validate_config->proc~ice_ic_parse_conc_config proc~ice_t_freeze ice_t_freeze proc~validate_config->proc~ice_t_freeze proc~kpp_sw_method_is_implemented kpp_sw_method_is_implemented proc~validate_config->proc~kpp_sw_method_is_implemented proc~lateral_closure_conflicts_smag_ah lateral_closure_conflicts_smag_ah proc~validate_config->proc~lateral_closure_conflicts_smag_ah proc~lateral_closure_is_implemented lateral_closure_is_implemented proc~validate_config->proc~lateral_closure_is_implemented proc~leith_biharm_is_inert leith_biharm_is_inert proc~validate_config->proc~leith_biharm_is_inert proc~nz_stack_is_sufficient nz_stack_is_sufficient proc~validate_config->proc~nz_stack_is_sufficient proc~nz_stack_required nz_stack_required proc~validate_config->proc~nz_stack_required proc~ocean_bc_type_from_string ocean_bc_type_from_string proc~validate_config->proc~ocean_bc_type_from_string proc~ocean_bt_rem_from_visc_rem_on ocean_bt_rem_from_visc_rem_on proc~validate_config->proc~ocean_bt_rem_from_visc_rem_on proc~ocean_bt_visc_rem_producer_on ocean_bt_visc_rem_producer_on proc~validate_config->proc~ocean_bt_visc_rem_producer_on proc~p_top_has_producer p_top_has_producer proc~validate_config->proc~p_top_has_producer proc~parse_bdrag_variant parse_bdrag_variant proc~validate_config->proc~parse_bdrag_variant proc~parse_cavity_draft_sign parse_cavity_draft_sign proc~validate_config->proc~parse_cavity_draft_sign proc~parse_cavity_exchange_law parse_cavity_exchange_law proc~validate_config->proc~parse_cavity_exchange_law proc~parse_cavity_freshwater parse_cavity_freshwater proc~validate_config->proc~parse_cavity_freshwater proc~parse_cavity_ice_mode parse_cavity_ice_mode proc~validate_config->proc~parse_cavity_ice_mode proc~parse_cavity_volume_comp parse_cavity_volume_comp proc~validate_config->proc~parse_cavity_volume_comp proc~parse_lateral_closure parse_lateral_closure proc~validate_config->proc~parse_lateral_closure proc~parse_opgf_variant parse_opgf_variant proc~validate_config->proc~parse_opgf_variant proc~parse_pv_adv_scheme parse_pv_adv_scheme proc~validate_config->proc~parse_pv_adv_scheme proc~parse_pv_variant parse_pv_variant proc~validate_config->proc~parse_pv_variant proc~parse_tdrag_variant parse_tdrag_variant proc~validate_config->proc~parse_tdrag_variant proc~parse_tfreeze_set parse_tfreeze_set proc~validate_config->proc~parse_tfreeze_set proc~parse_tracer_recon parse_tracer_recon proc~validate_config->proc~parse_tracer_recon proc~parse_vcoord_type parse_vcoord_type proc~validate_config->proc~parse_vcoord_type proc~parse_z_fixed_profile parse_z_fixed_profile proc~validate_config->proc~parse_z_fixed_profile proc~pseudo_salt_conflicts_ice pseudo_salt_conflicts_ice proc~validate_config->proc~pseudo_salt_conflicts_ice proc~pseudo_salt_conflicts_restore pseudo_salt_conflicts_restore proc~validate_config->proc~pseudo_salt_conflicts_restore proc~pseudo_salt_needs_thermo_warning pseudo_salt_needs_thermo_warning proc~validate_config->proc~pseudo_salt_needs_thermo_warning proc~pv_adv_required_nghost pv_adv_required_nghost proc~validate_config->proc~pv_adv_required_nghost proc~pv_adv_scheme_is_implemented pv_adv_scheme_is_implemented proc~validate_config->proc~pv_adv_scheme_is_implemented proc~pv_variant_is_implemented pv_variant_is_implemented proc~validate_config->proc~pv_variant_is_implemented proc~sponge_ramp_is_valid sponge_ramp_is_valid proc~validate_config->proc~sponge_ramp_is_valid proc~sponge_source_is_implemented sponge_source_is_implemented proc~validate_config->proc~sponge_source_is_implemented proc~sponge_target_is_implemented sponge_target_is_implemented proc~validate_config->proc~sponge_target_is_implemented proc~substep_drag_ignores_bdrag_form substep_drag_ignores_bdrag_form proc~validate_config->proc~substep_drag_ignores_bdrag_form proc~sw_source_is_implemented sw_source_is_implemented proc~validate_config->proc~sw_source_is_implemented proc~tdrag_variant_is_implemented tdrag_variant_is_implemented proc~validate_config->proc~tdrag_variant_is_implemented proc~tidal_mixing_is_inert tidal_mixing_is_inert proc~validate_config->proc~tidal_mixing_is_inert proc~tracer_recon_required_nghost tracer_recon_required_nghost proc~validate_config->proc~tracer_recon_required_nghost proc~vcoord_h_min_is_coherent vcoord_h_min_is_coherent proc~validate_config->proc~vcoord_h_min_is_coherent proc~warn_unknown_bc warn_unknown_bc proc~validate_config->proc~warn_unknown_bc proc~z_fixed_nominal_dz z_fixed_nominal_dz proc~validate_config->proc~z_fixed_nominal_dz proc~zfixed_cavity_nu_h_below_envelope zfixed_cavity_nu_h_below_envelope proc~validate_config->proc~zfixed_cavity_nu_h_below_envelope to_string to_string proc~validate_config->to_string warning warning proc~validate_config->warning zf_dz zf_dz proc~validate_config->zf_dz proc~check_dataovr_file->error proc~fail->error proc~fail->proc~error_ring_push proc~ice_hlim_spec_is_valid->proc~ice_hlim_count proc~ice_hlim_spec_is_valid->to_string proc~parse_kpp_sw_method parse_kpp_sw_method proc~kpp_sw_method_is_implemented->proc~parse_kpp_sw_method proc~nz_stack_is_sufficient->proc~nz_stack_required to_lower to_lower proc~ocean_bc_type_from_string->to_lower proc~ocean_bt_visc_rem_producer_on->proc~ocean_bt_rem_from_visc_rem_on proc~ocean_bt_forcing_visc_rem_on ocean_bt_forcing_visc_rem_on proc~ocean_bt_visc_rem_producer_on->proc~ocean_bt_forcing_visc_rem_on proc~ocean_bt_renorm_visc_rem_on ocean_bt_renorm_visc_rem_on proc~ocean_bt_visc_rem_producer_on->proc~ocean_bt_renorm_visc_rem_on proc~read_config_from_string_impl->error proc~read_config_from_string_impl->proc~error_ring_push parse_errors parse_errors proc~read_config_from_string_impl->parse_errors proc~apply_cartesian_degrees apply_cartesian_degrees proc~read_config_from_string_impl->proc~apply_cartesian_degrees proc~apply_time_unit_cascade apply_time_unit_cascade proc~read_config_from_string_impl->proc~apply_time_unit_cascade proc~build_rdb_schema build_rdb_schema proc~read_config_from_string_impl->proc~build_rdb_schema proc~schema_parse_lines nml_schema_t%schema_parse_lines proc~read_config_from_string_impl->proc~schema_parse_lines proc~split_to_lines split_to_lines proc~read_config_from_string_impl->proc~split_to_lines proc~vcoord_h_min_role vcoord_h_min_role proc~vcoord_h_min_is_coherent->proc~vcoord_h_min_role proc~warn_unknown_bc->warning proc~zfixed_cavity_nu_h_below_envelope->proc~parse_vcoord_type proc~apply_cartesian_degrees->error proc~apply_cartesian_degrees->info proc~apply_cartesian_degrees->to_string proc~apply_time_unit_cascade->error proc~register_boundary register_boundary proc~build_rdb_schema->proc~register_boundary proc~register_conv register_conv proc~build_rdb_schema->proc~register_conv proc~register_ddiff register_ddiff proc~build_rdb_schema->proc~register_ddiff proc~register_epbl register_epbl proc~build_rdb_schema->proc~register_epbl proc~register_foxkemper register_foxkemper proc~build_rdb_schema->proc~register_foxkemper proc~register_gm register_gm proc~build_rdb_schema->proc~register_gm proc~register_grid register_grid proc~build_rdb_schema->proc~register_grid proc~register_initial_condition register_initial_condition proc~build_rdb_schema->proc~register_initial_condition proc~register_kappa_shear register_kappa_shear proc~build_rdb_schema->proc~register_kappa_shear proc~register_logging register_logging proc~build_rdb_schema->proc~register_logging proc~register_meke register_meke proc~build_rdb_schema->proc~register_meke proc~register_mpi register_mpi proc~build_rdb_schema->proc~register_mpi proc~register_nonhydrostatic register_nonhydrostatic proc~build_rdb_schema->proc~register_nonhydrostatic proc~register_ocean_bc register_ocean_bc proc~build_rdb_schema->proc~register_ocean_bc proc~register_ocean_bdrag register_ocean_bdrag proc~build_rdb_schema->proc~register_ocean_bdrag proc~register_ocean_bt register_ocean_bt proc~build_rdb_schema->proc~register_ocean_bt proc~register_ocean_cavity_dyn register_ocean_cavity_dyn proc~build_rdb_schema->proc~register_ocean_cavity_dyn proc~register_ocean_cavity_melt register_ocean_cavity_melt proc~build_rdb_schema->proc~register_ocean_cavity_melt proc~register_ocean_continuity register_ocean_continuity proc~build_rdb_schema->proc~register_ocean_continuity proc~register_ocean_coriolis register_ocean_coriolis proc~build_rdb_schema->proc~register_ocean_coriolis proc~register_ocean_data register_ocean_data proc~build_rdb_schema->proc~register_ocean_data proc~register_ocean_dataovr register_ocean_dataovr proc~build_rdb_schema->proc~register_ocean_dataovr proc~register_ocean_debug register_ocean_debug proc~build_rdb_schema->proc~register_ocean_debug proc~register_ocean_diag register_ocean_diag proc~build_rdb_schema->proc~register_ocean_diag proc~register_ocean_eos register_ocean_eos proc~build_rdb_schema->proc~register_ocean_eos proc~register_ocean_forcing register_ocean_forcing proc~build_rdb_schema->proc~register_ocean_forcing proc~register_ocean_geothermal register_ocean_geothermal proc~build_rdb_schema->proc~register_ocean_geothermal proc~register_ocean_grid register_ocean_grid proc~build_rdb_schema->proc~register_ocean_grid proc~register_ocean_hdiff register_ocean_hdiff proc~build_rdb_schema->proc~register_ocean_hdiff proc~register_ocean_hvisc register_ocean_hvisc proc~build_rdb_schema->proc~register_ocean_hvisc proc~register_ocean_ic register_ocean_ic proc~build_rdb_schema->proc~register_ocean_ic proc~register_ocean_ice register_ocean_ice proc~build_rdb_schema->proc~register_ocean_ice proc~register_ocean_ice_ic register_ocean_ice_ic proc~build_rdb_schema->proc~register_ocean_ice_ic proc~register_ocean_isopycnal register_ocean_isopycnal proc~build_rdb_schema->proc~register_ocean_isopycnal proc~register_ocean_mpi register_ocean_mpi proc~build_rdb_schema->proc~register_ocean_mpi proc~register_ocean_pgf register_ocean_pgf proc~build_rdb_schema->proc~register_ocean_pgf proc~register_ocean_psurf register_ocean_psurf proc~build_rdb_schema->proc~register_ocean_psurf proc~register_ocean_restore register_ocean_restore proc~build_rdb_schema->proc~register_ocean_restore proc~register_ocean_sponge register_ocean_sponge proc~build_rdb_schema->proc~register_ocean_sponge proc~register_ocean_tdrag register_ocean_tdrag proc~build_rdb_schema->proc~register_ocean_tdrag proc~register_ocean_thermo register_ocean_thermo proc~build_rdb_schema->proc~register_ocean_thermo proc~register_ocean_tides register_ocean_tides proc~build_rdb_schema->proc~register_ocean_tides proc~register_ocean_topo register_ocean_topo proc~build_rdb_schema->proc~register_ocean_topo proc~register_ocean_tracers register_ocean_tracers proc~build_rdb_schema->proc~register_ocean_tracers proc~register_ocean_vdiff register_ocean_vdiff proc~build_rdb_schema->proc~register_ocean_vdiff proc~register_ocean_vmix register_ocean_vmix proc~build_rdb_schema->proc~register_ocean_vmix proc~register_ocean_wetdry register_ocean_wetdry proc~build_rdb_schema->proc~register_ocean_wetdry proc~register_ocean_zinit register_ocean_zinit proc~build_rdb_schema->proc~register_ocean_zinit proc~register_output register_output proc~build_rdb_schema->proc~register_output proc~register_physics register_physics proc~build_rdb_schema->proc~register_physics proc~register_porous register_porous proc~build_rdb_schema->proc~register_porous proc~register_redi register_redi proc~build_rdb_schema->proc~register_redi proc~register_sim register_sim proc~build_rdb_schema->proc~register_sim proc~register_slopes register_slopes proc~build_rdb_schema->proc~register_slopes proc~register_tidal_mixing register_tidal_mixing proc~build_rdb_schema->proc~register_tidal_mixing proc~register_time register_time proc~build_rdb_schema->proc~register_time proc~register_tracer register_tracer proc~build_rdb_schema->proc~register_tracer proc~register_varmix register_varmix proc~build_rdb_schema->proc~register_varmix proc~register_vcoord register_vcoord proc~build_rdb_schema->proc~register_vcoord proc~register_wavespeed register_wavespeed proc~build_rdb_schema->proc~register_wavespeed proc~parse_from_lines parse_from_lines proc~schema_parse_lines->proc~parse_from_lines proc~post_parse_validate post_parse_validate proc~schema_parse_lines->proc~post_parse_validate proc~reset_state reset_state proc~schema_parse_lines->proc~reset_state proc~add_err add_err proc~parse_from_lines->proc~add_err proc~dispatch_group dispatch_group proc~parse_from_lines->proc~dispatch_group proc~make_prefix make_prefix proc~parse_from_lines->proc~make_prefix proc~next_amp next_amp proc~parse_from_lines->proc~next_amp proc~read_group_name read_group_name proc~parse_from_lines->proc~read_group_name proc~skip_to_slash skip_to_slash proc~parse_from_lines->proc~skip_to_slash proc~post_parse_validate->error proc~post_parse_validate->proc~error_ring_push proc~post_parse_validate->proc~add_err proc~group_add nml_group_t%group_add proc~register_boundary->proc~group_add proc~nml_enum nml_enum proc~register_boundary->proc~nml_enum proc~nml_int nml_int proc~register_boundary->proc~nml_int proc~nml_real nml_real proc~register_boundary->proc~nml_real proc~nml_real_array nml_real_array proc~register_boundary->proc~nml_real_array proc~schema_add_group nml_schema_t%schema_add_group proc~register_boundary->proc~schema_add_group proc~register_conv->proc~group_add proc~nml_logical nml_logical proc~register_conv->proc~nml_logical proc~register_conv->proc~nml_real proc~register_conv->proc~schema_add_group proc~register_ddiff->proc~group_add proc~register_ddiff->proc~nml_logical proc~register_ddiff->proc~nml_real proc~register_ddiff->proc~schema_add_group proc~register_epbl->proc~group_add proc~register_epbl->proc~nml_enum proc~register_epbl->proc~nml_int proc~register_epbl->proc~nml_logical proc~register_epbl->proc~nml_real proc~register_epbl->proc~schema_add_group proc~register_foxkemper->proc~group_add proc~register_foxkemper->proc~nml_logical proc~register_foxkemper->proc~nml_real proc~register_foxkemper->proc~schema_add_group proc~register_gm->proc~group_add proc~register_gm->proc~nml_logical proc~register_gm->proc~nml_real proc~register_gm->proc~schema_add_group proc~register_grid->proc~group_add proc~register_grid->proc~nml_int proc~register_grid->proc~nml_real proc~register_grid->proc~schema_add_group proc~register_initial_condition->proc~group_add proc~register_initial_condition->proc~nml_real proc~register_initial_condition->proc~schema_add_group proc~register_kappa_shear->proc~group_add proc~register_kappa_shear->proc~nml_int proc~register_kappa_shear->proc~nml_logical proc~register_kappa_shear->proc~nml_real proc~register_kappa_shear->proc~schema_add_group proc~register_logging->proc~group_add proc~register_logging->proc~nml_enum proc~register_logging->proc~nml_real proc~register_logging->proc~schema_add_group proc~register_meke->proc~group_add proc~register_meke->proc~nml_logical proc~register_meke->proc~nml_real proc~register_meke->proc~schema_add_group proc~register_mpi->proc~group_add proc~register_mpi->proc~nml_int proc~register_mpi->proc~schema_add_group proc~register_nonhydrostatic->proc~group_add proc~register_nonhydrostatic->proc~nml_int proc~register_nonhydrostatic->proc~nml_logical proc~register_nonhydrostatic->proc~nml_real proc~register_nonhydrostatic->proc~schema_add_group proc~register_ocean_bc->proc~group_add proc~register_ocean_bc->proc~nml_enum proc~register_ocean_bc->proc~nml_int proc~register_ocean_bc->proc~nml_logical proc~register_ocean_bc->proc~nml_real proc~register_ocean_bc->proc~nml_real_array proc~register_ocean_bc->proc~schema_add_group proc~register_ocean_bdrag->proc~group_add proc~register_ocean_bdrag->proc~nml_enum proc~register_ocean_bdrag->proc~nml_logical proc~register_ocean_bdrag->proc~nml_real proc~register_ocean_bdrag->proc~schema_add_group proc~register_ocean_bt->proc~group_add proc~register_ocean_bt->proc~nml_enum proc~register_ocean_bt->proc~nml_int proc~register_ocean_bt->proc~nml_logical proc~register_ocean_bt->proc~nml_real proc~nml_string nml_string proc~register_ocean_bt->proc~nml_string proc~register_ocean_bt->proc~schema_add_group proc~register_ocean_cavity_dyn->proc~group_add proc~register_ocean_cavity_dyn->proc~nml_enum proc~register_ocean_cavity_dyn->proc~nml_logical proc~register_ocean_cavity_dyn->proc~nml_real proc~register_ocean_cavity_dyn->proc~nml_string proc~register_ocean_cavity_dyn->proc~schema_add_group proc~register_ocean_cavity_melt->proc~group_add proc~register_ocean_cavity_melt->proc~nml_enum proc~register_ocean_cavity_melt->proc~nml_logical proc~register_ocean_cavity_melt->proc~nml_real proc~register_ocean_cavity_melt->proc~schema_add_group proc~register_ocean_continuity->proc~group_add proc~register_ocean_continuity->proc~nml_logical proc~register_ocean_continuity->proc~nml_real proc~register_ocean_continuity->proc~schema_add_group proc~register_ocean_coriolis->proc~group_add proc~register_ocean_coriolis->proc~nml_enum proc~register_ocean_coriolis->proc~nml_logical proc~register_ocean_coriolis->proc~schema_add_group proc~register_ocean_data->proc~group_add proc~register_ocean_data->proc~nml_int proc~register_ocean_data->proc~nml_logical proc~register_ocean_data->proc~schema_add_group proc~add_dataovr_entry add_dataovr_entry proc~register_ocean_dataovr->proc~add_dataovr_entry proc~register_ocean_dataovr->proc~group_add proc~register_ocean_dataovr->proc~nml_enum proc~register_ocean_dataovr->proc~nml_logical proc~register_ocean_dataovr->proc~nml_real proc~register_ocean_dataovr->proc~schema_add_group proc~register_ocean_debug->proc~group_add proc~register_ocean_debug->proc~nml_int proc~register_ocean_debug->proc~nml_logical proc~register_ocean_debug->proc~schema_add_group proc~register_ocean_diag->proc~group_add proc~register_ocean_diag->proc~nml_enum proc~register_ocean_diag->proc~nml_int proc~register_ocean_diag->proc~nml_logical proc~register_ocean_diag->proc~nml_real proc~register_ocean_diag->proc~nml_real_array proc~register_ocean_diag->proc~nml_string proc~register_ocean_diag->proc~schema_add_group proc~register_ocean_eos->proc~group_add proc~register_ocean_eos->proc~nml_enum proc~register_ocean_eos->proc~nml_real proc~register_ocean_eos->proc~schema_add_group proc~register_ocean_forcing->proc~group_add proc~register_ocean_forcing->proc~nml_logical proc~register_ocean_forcing->proc~schema_add_group proc~register_ocean_geothermal->proc~group_add proc~register_ocean_geothermal->proc~nml_logical proc~register_ocean_geothermal->proc~nml_real proc~register_ocean_geothermal->proc~schema_add_group proc~register_ocean_grid->proc~group_add proc~register_ocean_grid->proc~nml_enum proc~register_ocean_grid->proc~nml_real proc~register_ocean_grid->proc~nml_string proc~register_ocean_grid->proc~schema_add_group proc~register_ocean_hdiff->proc~group_add proc~register_ocean_hdiff->proc~nml_real proc~register_ocean_hdiff->proc~schema_add_group proc~register_ocean_hvisc->proc~group_add proc~register_ocean_hvisc->proc~nml_enum proc~register_ocean_hvisc->proc~nml_int proc~register_ocean_hvisc->proc~nml_logical proc~register_ocean_hvisc->proc~nml_real proc~register_ocean_hvisc->proc~nml_real_array proc~register_ocean_hvisc->proc~schema_add_group proc~register_ocean_ic->proc~group_add proc~register_ocean_ic->proc~nml_enum proc~register_ocean_ic->proc~nml_int proc~register_ocean_ic->proc~nml_real proc~register_ocean_ic->proc~nml_real_array proc~register_ocean_ic->proc~schema_add_group proc~register_ocean_ice->proc~group_add proc~register_ocean_ice->proc~nml_int proc~register_ocean_ice->proc~nml_logical proc~register_ocean_ice->proc~nml_real proc~register_ocean_ice->proc~nml_real_array proc~register_ocean_ice->proc~schema_add_group proc~register_ocean_ice_ic->proc~group_add proc~register_ocean_ice_ic->proc~nml_enum proc~register_ocean_ice_ic->proc~nml_real proc~register_ocean_ice_ic->proc~schema_add_group proc~register_ocean_isopycnal->proc~group_add proc~register_ocean_isopycnal->proc~nml_logical proc~register_ocean_isopycnal->proc~nml_real proc~register_ocean_isopycnal->proc~schema_add_group proc~register_ocean_mpi->proc~group_add proc~register_ocean_mpi->proc~nml_logical proc~register_ocean_mpi->proc~schema_add_group proc~register_ocean_pgf->proc~group_add proc~register_ocean_pgf->proc~nml_enum proc~register_ocean_pgf->proc~nml_int proc~register_ocean_pgf->proc~nml_logical proc~register_ocean_pgf->proc~nml_real proc~register_ocean_pgf->proc~schema_add_group proc~register_ocean_psurf->proc~group_add proc~register_ocean_psurf->proc~nml_logical proc~register_ocean_psurf->proc~nml_real proc~register_ocean_psurf->proc~schema_add_group proc~register_ocean_restore->proc~group_add proc~register_ocean_restore->proc~nml_logical proc~register_ocean_restore->proc~nml_real proc~register_ocean_restore->proc~schema_add_group proc~register_ocean_sponge->proc~group_add proc~register_ocean_sponge->proc~nml_enum proc~register_ocean_sponge->proc~nml_int proc~register_ocean_sponge->proc~nml_logical proc~register_ocean_sponge->proc~nml_real proc~register_ocean_sponge->proc~schema_add_group proc~register_ocean_tdrag->proc~group_add proc~register_ocean_tdrag->proc~nml_enum proc~register_ocean_tdrag->proc~nml_logical proc~register_ocean_tdrag->proc~nml_real proc~register_ocean_tdrag->proc~schema_add_group proc~register_ocean_thermo->proc~group_add proc~register_ocean_thermo->proc~nml_enum proc~register_ocean_thermo->proc~nml_logical proc~register_ocean_thermo->proc~nml_real proc~register_ocean_thermo->proc~schema_add_group proc~register_ocean_tides->proc~group_add proc~register_ocean_tides->proc~nml_logical proc~register_ocean_tides->proc~nml_real proc~register_ocean_tides->proc~nml_string proc~register_ocean_tides->proc~schema_add_group proc~register_ocean_topo->proc~group_add proc~register_ocean_topo->proc~nml_enum proc~register_ocean_topo->proc~nml_real proc~register_ocean_topo->proc~schema_add_group proc~register_ocean_tracers->proc~group_add proc~register_ocean_tracers->proc~nml_logical proc~register_ocean_tracers->proc~nml_real proc~register_ocean_tracers->proc~schema_add_group proc~register_ocean_vdiff->proc~group_add proc~register_ocean_vdiff->proc~nml_logical proc~register_ocean_vdiff->proc~nml_real proc~register_ocean_vdiff->proc~schema_add_group proc~register_ocean_vmix->proc~group_add proc~register_ocean_vmix->proc~nml_enum proc~register_ocean_vmix->proc~nml_int proc~register_ocean_vmix->proc~nml_logical proc~register_ocean_vmix->proc~nml_real proc~register_ocean_vmix->proc~schema_add_group proc~register_ocean_wetdry->proc~group_add proc~register_ocean_wetdry->proc~nml_logical proc~register_ocean_wetdry->proc~nml_real proc~register_ocean_wetdry->proc~schema_add_group proc~register_ocean_zinit->proc~group_add proc~register_ocean_zinit->proc~nml_enum proc~register_ocean_zinit->proc~nml_logical proc~register_ocean_zinit->proc~nml_real proc~register_ocean_zinit->proc~nml_string proc~register_ocean_zinit->proc~schema_add_group proc~register_output->proc~group_add proc~register_output->proc~nml_int proc~register_output->proc~nml_logical proc~register_output->proc~nml_real proc~register_output->proc~nml_string proc~register_output->proc~schema_add_group proc~register_physics->proc~group_add proc~register_physics->proc~nml_real proc~register_physics->proc~schema_add_group proc~register_porous->proc~group_add proc~register_porous->proc~nml_enum proc~register_porous->proc~nml_logical proc~register_porous->proc~nml_real proc~register_porous->proc~schema_add_group proc~register_redi->proc~group_add proc~register_redi->proc~nml_logical proc~register_redi->proc~nml_real proc~register_redi->proc~schema_add_group proc~register_sim->proc~group_add proc~register_sim->proc~nml_enum proc~register_sim->proc~schema_add_group proc~register_slopes->proc~group_add proc~register_slopes->proc~nml_logical proc~register_slopes->proc~nml_real proc~register_slopes->proc~schema_add_group proc~register_tidal_mixing->proc~group_add proc~register_tidal_mixing->proc~nml_logical proc~register_tidal_mixing->proc~nml_real proc~register_tidal_mixing->proc~schema_add_group proc~register_time->proc~group_add proc~register_time->proc~nml_int proc~register_time->proc~nml_real proc~register_time->proc~nml_string proc~register_time->proc~schema_add_group proc~register_tracer->proc~group_add proc~register_tracer->proc~nml_real proc~register_tracer->proc~schema_add_group proc~register_varmix->proc~group_add proc~register_varmix->proc~nml_int proc~register_varmix->proc~nml_logical proc~register_varmix->proc~nml_real proc~register_varmix->proc~schema_add_group proc~register_vcoord->proc~group_add proc~register_vcoord->proc~nml_enum proc~register_vcoord->proc~nml_int proc~register_vcoord->proc~nml_logical proc~register_vcoord->proc~nml_real proc~register_vcoord->proc~nml_real_array proc~register_vcoord->proc~schema_add_group proc~register_wavespeed->proc~group_add proc~register_wavespeed->proc~nml_int proc~register_wavespeed->proc~nml_logical proc~register_wavespeed->proc~nml_real proc~register_wavespeed->proc~schema_add_group

Called by

proc~~build_pending_handle~~CalledByGraph proc~build_pending_handle build_pending_handle proc~rdb_ocean_create_from_string rdb_ocean_create_from_string proc~rdb_ocean_create_from_string->proc~build_pending_handle proc~rdb_ocean_create_pending rdb_ocean_create_pending proc~rdb_ocean_create_pending->proc~build_pending_handle

Variables

Type Visibility Attributes Name Initial
integer, private :: hstat
integer, private :: ierr

Source Code

   subroutine build_pending_handle(text, c_handle, h, status)
      !! Shared prefix of `rdb_ocean_create_from_string` AND
      !! `rdb_ocean_create_pending` (P2.5): allocate a handle, parse +
      !! validate the config, check `dt_fixed`. Does NOT touch
      !! `g_handle_live` — callers set it themselves once they know which
      !! of the two flows they are in (immediate `complete_ocean_create` vs
      !! staying pending for geometry injection).
      !!
      !! On success: `c_handle`/`h` are a valid, freshly allocated handle
      !! (`h%is_pending`/`h%is_initialised` both still `.false.`).
      !! On failure: the handle has ALREADY been destroyed (matches the F9
      !! "destroy the whole handle on any failure" contract) — `c_handle`
      !! is left as returned by `handle_create`/`handle_destroy` (the
      !! caller must not touch it further) and `h` is null.
      character(len=*), intent(in) :: text
      type(c_ptr), intent(out) :: c_handle
      type(ocean_handle_t), pointer, intent(out) :: h
      integer(c_int), intent(out) :: status

      integer :: ierr, hstat

      ! Bring the comm env up before ANYTHING touches it.  The API is
      ! single-rank by design (compute_rank=0, compute_size=1), but
      ! "single-rank" is not "no MPI": in an RDB_ENABLE_MPI=ON build the
      ! setup path reaches `comm_world()`, and reaching it before MPI is
      ! initialised is not a soft failure --
      !
      !   *** The MPI_Comm_f2c() function was called before MPI_INIT was
      !   *** invoked.  This is disallowed by the MPI standard.
      !
      ! -- the process aborts.  Both create entry points funnel through
      ! here, so this is the one place that needs it, and `comm_env_init`
      ! is idempotent, so paying it per create costs nothing.
      !
      ! NOT a fix for being embedded in a host that has ALREADY called
      ! MPI_Init (mpi4py, a C driver of its own).  `pic_mpi_init` calls
      ! `MPI_Init_thread` unconditionally and pic-mpi exposes no
      ! `MPI_Initialized` wrapper to guard on, so that case would still
      ! double-initialise.  Closing it needs an upstream wrapper: the
      ! `no-mpi-in-rdb` rule means this file cannot ask MPI directly.
      call comm_env_init()

      c_handle = handle_create()
      hstat = handle_check(c_handle, h)
      if (hstat /= HANDLE_OK) then
         ! Unreachable in practice (we just created it), but never trust a
         ! resolve blindly — fail loud rather than dereference a null h.
         call handle_destroy(c_handle)
         h => null()
         status = int(OCEAN_STATUS_ERR_BAD_HANDLE, c_int)
         return
      end if

      call read_config_from_string(text, h%cfg, ierr=ierr)
      if (ierr /= OCEAN_STATUS_OK) then
         status = int(ierr, c_int)
         call handle_destroy(c_handle)
         h => null()
         return
      end if

      call validate_config(h%cfg, ierr=ierr)
      if (ierr /= OCEAN_STATUS_OK) then
         status = int(ierr, c_int)
         call handle_destroy(c_handle)
         h => null()
         return
      end if

      if (h%cfg%dt_fixed <= 0.0_wp) then
         status = int(OCEAN_STATUS_ERR_CONFIG_VALIDATE, c_int)
         call handle_destroy(c_handle)
         h => null()
         return
      end if

      status = int(OCEAN_STATUS_OK, c_int)
   end subroutine build_pending_handle