public subroutine read_config(filename, cfg, schema, ierr)
Read simulation configuration from a namelist file.
Groups still read natively (read(nml=)) are seeded from the
cfg defaults, read, and copied back as before. Groups that
have migrated to the strict schema (rdb_nml_schema) are
validated and applied here, AFTER the native reads, by building
a local schema (defaults captured from cfg’s pristine field
initialisers) and strict-parsing the file — so error stop on
any unknown key / range / enum violation fires for every caller
(driver, FFI, unit tests), not just the production entry points.
When schema is present the built schema is returned for the
caller’s parameter-doc dumps. Its key pointers alias into
cfg; both entry points keep their cfg alive (and target),
so returning it is safe.
Arguments
Type
Intent Optional Attributes
Name
character(len=*),
intent(in)
::
filename
Path to the namelist input file
type(config_t ),
intent(out),
target
::
cfg
Populated configuration
type(nml_schema_t ),
intent(out),
optional
::
schema
Built + parsed schema (aliases into cfg); for doc dumps.
integer,
intent(out),
optional
::
ierr
Non-zero on a strict-parse failure (unknown group/key,
range/enum violation) when present; absent behaves as today
(error stop).
proc~~read_config~~CallsGraph
proc~read_config
read_config
proc~read_config_impl
read_config_impl
proc~read_config->proc~read_config_impl
debug
debug
proc~read_config_impl->debug
error
error
proc~read_config_impl->error
parse_errors
parse_errors
proc~read_config_impl->parse_errors
proc~apply_cartesian_degrees
apply_cartesian_degrees
proc~read_config_impl->proc~apply_cartesian_degrees
proc~apply_time_unit_cascade
apply_time_unit_cascade
proc~read_config_impl->proc~apply_time_unit_cascade
proc~build_rdb_schema
build_rdb_schema
proc~read_config_impl->proc~build_rdb_schema
proc~error_ring_push
error_ring_push
proc~read_config_impl->proc~error_ring_push
proc~schema_parse
nml_schema_t%schema_parse
proc~read_config_impl->proc~schema_parse
proc~apply_cartesian_degrees->error
info
info
proc~apply_cartesian_degrees->info
to_string
to_string
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_file
parse_file
proc~schema_parse->proc~parse_file
proc~post_parse_validate
post_parse_validate
proc~schema_parse->proc~post_parse_validate
proc~reset_state
reset_state
proc~schema_parse->proc~reset_state
proc~add_err
add_err
proc~parse_file->proc~add_err
proc~parse_from_lines
parse_from_lines
proc~parse_file->proc~parse_from_lines
proc~read_lines
read_lines
proc~parse_file->proc~read_lines
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
proc~add_dataovr_entry->proc~group_add
proc~add_dataovr_entry->proc~nml_real
proc~add_dataovr_entry->proc~nml_string
proc~group_add->error
proc~lower
lower
proc~group_add->proc~lower
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~schema_add_group->error
proc~schema_add_group->proc~lower
proc~move_group
move_group
proc~schema_add_group->proc~move_group
Nodes of different colours represent the following:
Graph Key
Subroutine
Subroutine
Function
Function
Interface
Interface
Type Bound Procedure
Type Bound Procedure
Unknown Procedure Type
Unknown Procedure Type
Program
Program
This Page's Entity
This Page's Entity
Solid arrows point from a procedure to one which it calls. Dashed
arrows point from an interface to procedures which implement that interface.
This could include the module procedures in a generic interface or the
implementation in a submodule of an interface in a parent module.
Where possible, edges connecting nodes are
given different colours to make them easier to distinguish in
large graphs.
Source Code
subroutine read_config ( filename , cfg , schema , ierr )
!! Read simulation configuration from a namelist file.
!!
!! Groups still read natively (`read(nml=)`) are seeded from the
!! `cfg` defaults, read, and copied back as before. Groups that
!! have migrated to the strict schema (`rdb_nml_schema`) are
!! validated and applied here, AFTER the native reads, by building
!! a local schema (defaults captured from `cfg`'s pristine field
!! initialisers) and strict-parsing the file — so `error stop` on
!! any unknown key / range / enum violation fires for every caller
!! (driver, FFI, unit tests), not just the production entry points.
!!
!! When `schema` is present the built schema is returned for the
!! caller's parameter-doc dumps. Its key pointers alias into
!! `cfg`; both entry points keep their `cfg` alive (and `target`),
!! so returning it is safe.
character ( len =* ), intent ( in ) :: filename
!! Path to the namelist input file
type ( config_t ), target , intent ( out ) :: cfg
!! Populated configuration
type ( nml_schema_t ), intent ( out ), optional :: schema
!! Built + parsed schema (aliases into `cfg`); for doc dumps.
integer , intent ( out ), optional :: ierr
!! Non-zero on a strict-parse failure (unknown group/key,
!! range/enum violation) when present; absent behaves as today
!! (`error stop`).
! Dispatch so the schema is built DIRECTLY into the caller's
! variable when requested — never copied. Intrinsic assignment of
! nml_schema_t deep-copies polymorphic allocatable key boxes, which
! NVHPC miscompiles (heap corruption in the FFI tests); building in
! place sidesteps it and is cheaper anyway.
if ( present ( schema )) then
call read_config_impl ( filename , cfg , schema , ierr = ierr )
else
block
type ( nml_schema_t ) :: sch
call read_config_impl ( filename , cfg , sch , ierr = ierr )
end block
end if
end subroutine read_config