[sim] TOML テーブルを sim_config へ適用する。
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(app_config), | intent(inout) | :: | cfg | |||
| type(toml_table), | intent(inout) | :: | table | |||
| type(sim_authoring_spec), | intent(inout) | :: | sim_auth |
subroutine apply_sim_toml_table(cfg, table, sim_auth) type(app_config), intent(inout) :: cfg type(toml_table), intent(inout) :: table type(sim_authoring_spec), intent(inout) :: sim_auth type(toml_key), allocatable :: keys(:) integer :: ikey character(len=:), allocatable :: k call table%get_keys(keys) do ikey = 1, size(keys) k = lower_ascii(trim(keys(ikey)%key)) select case (trim(k)) case ('dt') call get_toml_real(table, keys(ikey), cfg%sim%dt, 'sim.dt') case ('rng_seed') call get_toml_int(table, keys(ikey), cfg%sim%rng_seed, 'sim.rng_seed') case ('batch_count') call get_toml_int(table, keys(ikey), cfg%sim%batch_count, 'sim.batch_count') case ('batch_duration') call get_toml_real(table, keys(ikey), cfg%sim%batch_duration, 'sim.batch_duration') cfg%sim%has_batch_duration = .true. case ('batch_duration_step') call get_toml_real(table, keys(ikey), cfg%sim%batch_duration_step, 'sim.batch_duration_step') cfg%sim%has_batch_duration_step = .true. case ('max_step') call get_toml_int(table, keys(ikey), cfg%sim%max_step, 'sim.max_step') case ('tol_rel') call get_toml_real(table, keys(ikey), cfg%sim%tol_rel, 'sim.tol_rel') case ('q_floor') call get_toml_real(table, keys(ikey), cfg%sim%q_floor, 'sim.q_floor') case ('softening') call get_toml_real(table, keys(ikey), cfg%sim%softening, 'sim.softening') case ('field_solver') call get_toml_string(table, keys(ikey), cfg%sim%field_solver, 'sim.field_solver') cfg%sim%field_solver = lower_ascii(trim(cfg%sim%field_solver)) case ('field_normalization') call get_toml_string(table, keys(ikey), cfg%sim%field_normalization, 'sim.field_normalization') cfg%sim%field_normalization = lower_ascii(trim(cfg%sim%field_normalization)) case ('field_length_scale') call get_toml_real(table, keys(ikey), cfg%sim%field_length_scale, 'sim.field_length_scale') case ('field_bc_mode') call get_toml_string(table, keys(ikey), cfg%sim%field_bc_mode, 'sim.field_bc_mode') cfg%sim%field_bc_mode = lower_ascii(trim(cfg%sim%field_bc_mode)) case ('field_periodic_image_layers') call get_toml_int(table, keys(ikey), cfg%sim%field_periodic_image_layers, 'sim.field_periodic_image_layers') case ('field_periodic_far_correction') call get_toml_string( & table, keys(ikey), cfg%sim%field_periodic_far_correction, 'sim.field_periodic_far_correction' & ) cfg%sim%field_periodic_far_correction = lower_ascii(trim(cfg%sim%field_periodic_far_correction)) case ('field_periodic_ewald_alpha') call get_toml_real(table, keys(ikey), cfg%sim%field_periodic_ewald_alpha, 'sim.field_periodic_ewald_alpha') case ('field_periodic_ewald_layers') call get_toml_int(table, keys(ikey), cfg%sim%field_periodic_ewald_layers, 'sim.field_periodic_ewald_layers') case ('tree_theta') call get_toml_real(table, keys(ikey), cfg%sim%tree_theta, 'sim.tree_theta') cfg%sim%has_tree_theta = .true. case ('tree_leaf_max') call get_toml_int(table, keys(ikey), cfg%sim%tree_leaf_max, 'sim.tree_leaf_max') cfg%sim%has_tree_leaf_max = .true. case ('tree_min_nelem') call get_toml_int(table, keys(ikey), cfg%sim%tree_min_nelem, 'sim.tree_min_nelem') case ('e0') call get_toml_real3(table, keys(ikey), cfg%sim%e0, 'sim.e0') cfg%sim%has_e0_vector = .true. case ('e0_abs') call get_toml_real(table, keys(ikey), cfg%sim%e0_abs, 'sim.e0_abs') cfg%sim%has_e0_abs = .true. case ('e0_phi_xy_deg') call get_toml_real(table, keys(ikey), cfg%sim%e0_phi_xy_deg, 'sim.e0_phi_xy_deg') cfg%sim%has_e0_phi_xy_deg = .true. case ('e0_phi_z_deg') call get_toml_real(table, keys(ikey), cfg%sim%e0_phi_z_deg, 'sim.e0_phi_z_deg') cfg%sim%has_e0_phi_z_deg = .true. case ('b0') call get_toml_real3(table, keys(ikey), cfg%sim%b0, 'sim.b0') case ('reservoir_potential_model') call get_toml_string(table, keys(ikey), cfg%sim%reservoir_potential_model, 'sim.reservoir_potential_model') cfg%sim%reservoir_potential_model = lower_ascii(trim(cfg%sim%reservoir_potential_model)) case ('phi_infty') call get_toml_real(table, keys(ikey), cfg%sim%phi_infty, 'sim.phi_infty') case ('open_boundary_model') call get_toml_string(table, keys(ikey), cfg%sim%open_boundary_model, 'sim.open_boundary_model') cfg%sim%open_boundary_model = lower_ascii(trim(cfg%sim%open_boundary_model)) case ('injection_face_phi_grid_n') call get_toml_int(table, keys(ikey), cfg%sim%injection_face_phi_grid_n, 'sim.injection_face_phi_grid_n') case ('raycast_max_bounce') call get_toml_int(table, keys(ikey), cfg%sim%raycast_max_bounce, 'sim.raycast_max_bounce') case ('sheath_injection_model') call get_toml_string(table, keys(ikey), cfg%sim%sheath_injection_model, 'sim.sheath_injection_model') cfg%sim%sheath_injection_model = lower_ascii(trim(cfg%sim%sheath_injection_model)) case ('sheath_alpha_deg') call get_toml_real(table, keys(ikey), cfg%sim%sheath_alpha_deg, 'sim.sheath_alpha_deg') case ('sheath_photoelectron_ref_density_cm3') call get_toml_real( & table, keys(ikey), cfg%sim%sheath_photoelectron_ref_density_cm3, & 'sim.sheath_photoelectron_ref_density_cm3' & ) case ('sheath_reference_coordinate') call get_toml_real(table, keys(ikey), cfg%sim%sheath_reference_coordinate, 'sim.sheath_reference_coordinate') cfg%sim%has_sheath_reference_coordinate = .true. case ('sheath_electron_drift_mode') call get_toml_string(table, keys(ikey), cfg%sim%sheath_electron_drift_mode, 'sim.sheath_electron_drift_mode') cfg%sim%sheath_electron_drift_mode = lower_ascii(trim(cfg%sim%sheath_electron_drift_mode)) case ('sheath_ion_drift_mode') call get_toml_string(table, keys(ikey), cfg%sim%sheath_ion_drift_mode, 'sim.sheath_ion_drift_mode') cfg%sim%sheath_ion_drift_mode = lower_ascii(trim(cfg%sim%sheath_ion_drift_mode)) case ('use_box') call get_toml_logical(table, keys(ikey), cfg%sim%use_box, 'sim.use_box') case ('box_min') call get_toml_real3(table, keys(ikey), cfg%sim%box_min, 'sim.box_min') sim_auth%has_box_min = .true. case ('box_max') call get_toml_real3(table, keys(ikey), cfg%sim%box_max, 'sim.box_max') sim_auth%has_box_max = .true. case ('box_origin') call get_toml_real3(table, keys(ikey), sim_auth%box_origin, 'sim.box_origin') sim_auth%has_box_origin = .true. case ('box_size') call get_toml_real3(table, keys(ikey), sim_auth%box_size, 'sim.box_size') sim_auth%has_box_size = .true. case ('bc_x_low') call get_toml_boundary_mode(table, keys(ikey), cfg%sim%bc_low(1), 'sim.bc_x_low') case ('bc_x_high') call get_toml_boundary_mode(table, keys(ikey), cfg%sim%bc_high(1), 'sim.bc_x_high') case ('bc_y_low') call get_toml_boundary_mode(table, keys(ikey), cfg%sim%bc_low(2), 'sim.bc_y_low') case ('bc_y_high') call get_toml_boundary_mode(table, keys(ikey), cfg%sim%bc_high(2), 'sim.bc_y_high') case ('bc_z_low') call get_toml_boundary_mode(table, keys(ikey), cfg%sim%bc_low(3), 'sim.bc_z_low') case ('bc_z_high') call get_toml_boundary_mode(table, keys(ikey), cfg%sim%bc_high(3), 'sim.bc_z_high') case default error stop 'Unknown key in [sim]: '//trim(keys(ikey)%key) end select end do end subroutine apply_sim_toml_table