function config = normalize_config(config) %NORMALIZE_CONFIG Normalize legacy GUI/runtime config to the current schema. if nargin == 0 || isempty(config) config = create_empty_config(); return; end defaults = create_empty_config(); config = merge_struct_defaults(config, defaults); config.model.grid_model = first_nonempty_scalar(config.model.grid_model, 1); config.model.flow_model = first_nonempty_scalar(config.model.flow_model, 1); config.flow.gas_water.gas_model = 1; config.flow.multi_component.gas_model = 1; legacy_model_fields = {'modelflag'}; legacy_fracture_fields = {'input_style', 'fractureLines', 'fractureHeights', 'flowBarrierFlags'}; for i = 1:numel(legacy_model_fields) field_name = legacy_model_fields{i}; if isfield(config.model, field_name) config.model = rmfield(config.model, field_name); end end for i = 1:numel(legacy_fracture_fields) field_name = legacy_fracture_fields{i}; if isfield(config.fracture, field_name) config.fracture = rmfield(config.fracture, field_name); end end end function s = merge_struct_defaults(s, defaults) default_fields = fieldnames(defaults); for i = 1:numel(default_fields) field_name = default_fields{i}; if ~isfield(s, field_name) || isempty(s.(field_name)) s.(field_name) = defaults.(field_name); elseif isstruct(defaults.(field_name)) && isstruct(s.(field_name)) s.(field_name) = merge_struct_defaults(s.(field_name), defaults.(field_name)); end end end function value = first_nonempty_scalar(raw_value, fallback) if isempty(raw_value) value = fallback; elseif isscalar(raw_value) value = raw_value; else value = raw_value(1); end end