rdb_ocean_create_from_string Function

public function rdb_ocean_create_from_string(nml_text, nml_len, handle_out) result(status) bind(c, name="rdb_ocean_create_from_string")

Build a config from an in-memory namelist string (no filesystem touch), set up the ocean dyn-core exactly as bench_ocean / driver_run_ocean do, map it onto the device, and hand back an opaque handle. On ANY failure, handle_out is c_null_ptr and the partially-built handle (if one was allocated) is freed — never a half-initialised handle escaping to the caller.

Arguments

Type IntentOptional Attributes Name
character(kind=c_char, len=1), intent(in) :: nml_text(nml_len)
integer(kind=c_int), intent(in), value :: nml_len
type(c_ptr), intent(out) :: handle_out

Return Value integer(kind=c_int)


Calls

proc~~rdb_ocean_create_from_string~~CallsGraph proc~rdb_ocean_create_from_string rdb_ocean_create_from_string proc~build_pending_handle build_pending_handle proc~rdb_ocean_create_from_string->proc~build_pending_handle proc~c_to_f_string c_to_f_string proc~rdb_ocean_create_from_string->proc~c_to_f_string proc~complete_ocean_create complete_ocean_create proc~rdb_ocean_create_from_string->proc~complete_ocean_create proc~error_ring_clear error_ring_clear proc~rdb_ocean_create_from_string->proc~error_ring_clear proc~error_ring_push error_ring_push proc~rdb_ocean_create_from_string->proc~error_ring_push 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 proc~complete_ocean_create->proc~error_ring_push proc~engine_enter_data engine_enter_data proc~complete_ocean_create->proc~engine_enter_data proc~engine_setup engine_setup proc~complete_ocean_create->proc~engine_setup proc~complete_ocean_create->proc~handle_destroy comm_world comm_world proc~comm_env_init->comm_world pic_mpi_init pic_mpi_init proc~comm_env_init->pic_mpi_init interface~ocean_halo_face_x ocean_halo_face_x proc~engine_enter_data->interface~ocean_halo_face_x proc~ocean_dyn_enable_bt_wide ocean_dyn_enable_bt_wide proc~engine_enter_data->proc~ocean_dyn_enable_bt_wide proc~ocean_halo_bt_group_2d ocean_halo_bt_group_2d proc~engine_enter_data->proc~ocean_halo_bt_group_2d proc~ocean_halo_bt_group_2d_wide ocean_halo_bt_group_2d_wide proc~engine_enter_data->proc~ocean_halo_bt_group_2d_wide proc~ocean_halo_exchange_ml_state ocean_halo_exchange_ml_state proc~engine_enter_data->proc~ocean_halo_exchange_ml_state proc~ocean_state_enter_data ocean_state_enter_data proc~engine_enter_data->proc~ocean_state_enter_data f_rows f_rows proc~engine_setup->f_rows info info proc~engine_setup->info interface~ocean_fold_north_corner ocean_fold_north_corner proc~engine_setup->interface~ocean_fold_north_corner interface~ocean_halo_centre ocean_halo_centre proc~engine_setup->interface~ocean_halo_centre proc~engine_setup->interface~ocean_halo_face_x proc~bt_halo_auto_exclusion bt_halo_auto_exclusion proc~engine_setup->proc~bt_halo_auto_exclusion proc~configure_ocean_bc configure_ocean_bc proc~engine_setup->proc~configure_ocean_bc proc~configure_ocean_bt configure_ocean_bt proc~engine_setup->proc~configure_ocean_bt proc~configure_ocean_bt_split configure_ocean_bt_split proc~engine_setup->proc~configure_ocean_bt_split proc~configure_ocean_cavity configure_ocean_cavity proc~engine_setup->proc~configure_ocean_cavity proc~configure_ocean_cavity_melt configure_ocean_cavity_melt proc~engine_setup->proc~configure_ocean_cavity_melt proc~configure_ocean_closed_faces configure_ocean_closed_faces proc~engine_setup->proc~configure_ocean_closed_faces proc~configure_ocean_drag configure_ocean_drag proc~engine_setup->proc~configure_ocean_drag proc~configure_ocean_forcing configure_ocean_forcing proc~engine_setup->proc~configure_ocean_forcing proc~configure_ocean_hdiff configure_ocean_hdiff proc~engine_setup->proc~configure_ocean_hdiff proc~configure_ocean_k_bot configure_ocean_k_bot proc~engine_setup->proc~configure_ocean_k_bot proc~configure_ocean_k_top configure_ocean_k_top proc~engine_setup->proc~configure_ocean_k_top proc~configure_ocean_land_mask configure_ocean_land_mask proc~engine_setup->proc~configure_ocean_land_mask proc~configure_ocean_lateral configure_ocean_lateral proc~engine_setup->proc~configure_ocean_lateral proc~configure_ocean_metrics configure_ocean_metrics proc~engine_setup->proc~configure_ocean_metrics proc~configure_ocean_p_surf configure_ocean_p_surf proc~engine_setup->proc~configure_ocean_p_surf proc~configure_ocean_pgf configure_ocean_pgf proc~engine_setup->proc~configure_ocean_pgf proc~configure_ocean_porous configure_ocean_porous proc~engine_setup->proc~configure_ocean_porous proc~configure_ocean_reference_density configure_ocean_reference_density proc~engine_setup->proc~configure_ocean_reference_density proc~configure_ocean_sponge configure_ocean_sponge proc~engine_setup->proc~configure_ocean_sponge proc~configure_ocean_tides configure_ocean_tides proc~engine_setup->proc~configure_ocean_tides proc~configure_ocean_top_drag configure_ocean_top_drag proc~engine_setup->proc~configure_ocean_top_drag proc~configure_ocean_tracers configure_ocean_tracers proc~engine_setup->proc~configure_ocean_tracers proc~configure_ocean_vmix configure_ocean_vmix proc~engine_setup->proc~configure_ocean_vmix proc~configure_ocean_wave_drag configure_ocean_wave_drag proc~engine_setup->proc~configure_ocean_wave_drag proc~configure_ocean_wetdry configure_ocean_wetdry proc~engine_setup->proc~configure_ocean_wetdry proc~configure_ocean_z_fixed_profile configure_ocean_z_fixed_profile proc~engine_setup->proc~configure_ocean_z_fixed_profile proc~decomp_auto_factor decomp_auto_factor proc~engine_setup->proc~decomp_auto_factor proc~decomp_init_from_config decomp_init_from_config proc~engine_setup->proc~decomp_init_from_config proc~decomp_log_summary decomp_log_summary proc~engine_setup->proc~decomp_log_summary proc~engine_configure_diag engine_configure_diag proc~engine_setup->proc~engine_configure_diag proc~fail fail proc~engine_setup->proc~fail proc~grid_init hgrid_t%grid_init proc~engine_setup->proc~grid_init proc~ice_evp_params_from_config ice_evp_params_from_config proc~engine_setup->proc~ice_evp_params_from_config proc~ice_ic_params_from_config ice_ic_params_from_config proc~engine_setup->proc~ice_ic_params_from_config proc~ice_init_apply ice_init_apply proc~engine_setup->proc~ice_init_apply proc~ice_ocean_stress_resume_apply ice_ocean_stress_resume_apply proc~engine_setup->proc~ice_ocean_stress_resume_apply proc~isopycnal_vanish_tol isopycnal_vanish_tol proc~engine_setup->proc~isopycnal_vanish_tol proc~metrics_assemble_from_supergrid_arrays metrics_assemble_from_supergrid_arrays proc~engine_setup->proc~metrics_assemble_from_supergrid_arrays proc~metrics_finalize metrics_finalize proc~engine_setup->proc~metrics_finalize proc~metrics_fold_periodic_ghosts metrics_fold_periodic_ghosts proc~engine_setup->proc~metrics_fold_periodic_ghosts proc~ocean_bc_state_set_edges ocean_bc_state_set_edges proc~engine_setup->proc~ocean_bc_state_set_edges proc~ocean_bc_state_set_topology ocean_bc_state_set_topology proc~engine_setup->proc~ocean_bc_state_set_topology proc~ocean_bc_type_from_string ocean_bc_type_from_string proc~engine_setup->proc~ocean_bc_type_from_string proc~ocean_data_forcing_configure ocean_data_forcing_configure proc~engine_setup->proc~ocean_data_forcing_configure proc~ocean_fold_exchange_init ocean_fold_exchange_init proc~engine_setup->proc~ocean_fold_exchange_init proc~ocean_fold_exchange_reserve ocean_fold_exchange_reserve proc~engine_setup->proc~ocean_fold_exchange_reserve proc~ocean_fold_wrap_eta_2d ocean_fold_wrap_eta_2d proc~engine_setup->proc~ocean_fold_wrap_eta_2d proc~ocean_fold_wrap_state ocean_fold_wrap_state proc~engine_setup->proc~ocean_fold_wrap_state proc~ocean_halo_exchange_ice_state ocean_halo_exchange_ice_state proc~engine_setup->proc~ocean_halo_exchange_ice_state proc~engine_setup->proc~ocean_halo_exchange_ml_state proc~ocean_halo_init ocean_halo_init proc~engine_setup->proc~ocean_halo_init proc~ocean_halo_reserve ocean_halo_reserve proc~engine_setup->proc~ocean_halo_reserve proc~ocean_kappa_shear_init_vertex ocean_kappa_shear_t%ocean_kappa_shear_init_vertex proc~engine_setup->proc~ocean_kappa_shear_init_vertex proc~ocean_periodic_wrap_centre_2d ocean_periodic_wrap_centre_2d proc~engine_setup->proc~ocean_periodic_wrap_centre_2d proc~ocean_periodic_wrap_state ocean_periodic_wrap_state proc~engine_setup->proc~ocean_periodic_wrap_state proc~ocean_pressure_force_set_bathymetry ocean_pressure_force_t%ocean_pressure_force_set_bathymetry proc~engine_setup->proc~ocean_pressure_force_set_bathymetry proc~ocean_sponge_snapshot_reference ocean_sponge_snapshot_reference proc~engine_setup->proc~ocean_sponge_snapshot_reference proc~ocean_stability_audit ocean_stability_audit proc~engine_setup->proc~ocean_stability_audit proc~ocean_state_init_from_config ocean_state_t%ocean_state_init_from_config proc~engine_setup->proc~ocean_state_init_from_config proc~ocean_state_restart_read ocean_state_restart_read proc~engine_setup->proc~ocean_state_restart_read proc~ocean_state_seed_from_cfg ocean_state_seed_from_cfg proc~engine_setup->proc~ocean_state_seed_from_cfg proc~ocean_surfflux_set_components ocean_surface_flux_t%ocean_surfflux_set_components proc~engine_setup->proc~ocean_surfflux_set_components proc~ocean_surfflux_set_const ocean_surface_flux_t%ocean_surfflux_set_const proc~engine_setup->proc~ocean_surfflux_set_const proc~ocean_surfflux_set_p_surf_const ocean_surface_flux_t%ocean_surfflux_set_p_surf_const proc~engine_setup->proc~ocean_surfflux_set_p_surf_const proc~ocean_surfflux_set_restore ocean_surface_flux_t%ocean_surfflux_set_restore proc~engine_setup->proc~ocean_surfflux_set_restore proc~ocean_surfflux_set_sw ocean_surface_flux_t%ocean_surfflux_set_sw proc~engine_setup->proc~ocean_surfflux_set_sw proc~ocean_vcoord_build_zref_full ocean_vcoord_t%ocean_vcoord_build_zref_full proc~engine_setup->proc~ocean_vcoord_build_zref_full proc~output_rank_filename output_rank_filename proc~engine_setup->proc~output_rank_filename proc~parse_ocean_vcoord_type parse_ocean_vcoord_type proc~engine_setup->proc~parse_ocean_vcoord_type proc~parse_remap_method parse_remap_method proc~engine_setup->proc~parse_remap_method proc~register_default_tracers register_default_tracers proc~engine_setup->proc~register_default_tracers proc~resolve_bt_halo resolve_bt_halo proc~engine_setup->proc~resolve_bt_halo proc~setup_failed setup_failed proc~engine_setup->proc~setup_failed to_string to_string proc~engine_setup->to_string warning warning proc~engine_setup->warning proc~read_config_from_string_impl read_config_from_string_impl proc~read_config_from_string->proc~read_config_from_string_impl proc~validate_config->proc~error_ring_push cav_dz cav_dz proc~validate_config->cav_dz error error proc~validate_config->error 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~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~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 proc~validate_config->to_string proc~validate_config->warning zf_dz zf_dz proc~validate_config->zf_dz

Variables

Type Visibility Attributes Name Initial
type(c_ptr), private :: c_handle
type(ocean_handle_t), private, pointer :: h
character(len=:), private, allocatable :: text

Source Code

   function rdb_ocean_create_from_string(nml_text, nml_len, handle_out) &
      result(status) bind(c, name="rdb_ocean_create_from_string")
      !! Build a config from an in-memory namelist string (no filesystem
      !! touch), set up the ocean dyn-core exactly as `bench_ocean` /
      !! `driver_run_ocean` do, map it onto the device, and hand back an
      !! opaque handle. On ANY failure, `handle_out` is `c_null_ptr` and the
      !! partially-built handle (if one was allocated) is freed — never a
      !! half-initialised handle escaping to the caller.
      integer(c_int), intent(in), value :: nml_len
      character(kind=c_char), intent(in) :: nml_text(nml_len)
      type(c_ptr), intent(out) :: handle_out
      integer(c_int) :: status

      type(c_ptr) :: c_handle
      type(ocean_handle_t), pointer :: h
      character(len=:), allocatable :: text

      handle_out = c_null_ptr
      call error_ring_clear()

      if (g_handle_live) then
         call error_ring_push("rdb_ocean_create_from_string: a live ocean handle "// &
                              "already exists in this process (multi-instance is not "// &
                              "supported) — destroy it before creating another")
         status = int(OCEAN_STATUS_ERR_ALREADY_EXISTS, c_int)
         return
      end if

      call c_to_f_string(nml_text, nml_len, text)

      call build_pending_handle(text, c_handle, h, status)
      if (status /= int(OCEAN_STATUS_OK, c_int)) return   ! already destroyed
      g_handle_live = .true.

      ! ---- Setup (P2.4) — driver_run_ocean's exact 21-stage sequence,
      ! via the shared engine. Single-rank: compute_rank=0, compute_size=1
      ! (defaults); no restart on the C ABI yet (a future phase's concern,
      ! not silently dropped — `engine_setup`'s `restart_file` is simply
      ! not passed here). This is where the API used to run its OWN
      ! independent 9-stage subset (configure_ocean_metrics/_forcing/
      ! _drag/_vmix/_lateral/_pgf/_bt/_bt_split/_land_mask only) — every
      ! other stage (bc/diag/hdiff/porous/p_surf/sponge/tides/tracers/
      ! wave_drag/wetdry/dataovr/halo_init) is now reachable through here
      ! too. No geometry staged on this single-call path (P2.5's
      ! rdb_ocean_create_pending + rdb_ocean_stage_* do that) — so
      ! engine_setup falls through to its ordinary namelist-driven path,
      ! byte-identical to before P2.5. ----
      call complete_ocean_create(c_handle, h, status)
      handle_out = c_handle   ! c_null_ptr iff complete_ocean_create failed
   end function rdb_ocean_create_from_string