diff --git a/Applications/ApplicationsLib/ProjectData.cpp b/Applications/ApplicationsLib/ProjectData.cpp index ee6def405cadd9aab92075516ebc83ae65375dcd..4c32723f64ad2fcd7590bcb57a8b6f55bc2b5746 100644 --- a/Applications/ApplicationsLib/ProjectData.cpp +++ b/Applications/ApplicationsLib/ProjectData.cpp @@ -383,6 +383,34 @@ std::vector<int> parseMaterialIdString( return BaseLib::splitMaterialIdString(material_id_string); } +template <typename T, typename CreateMedium> +requires std::convertible_to<decltype(std::declval<CreateMedium>()( + std::declval<int>())), + std::shared_ptr<T>> +void createMediumForId(int const id, + std::map<int, std::shared_ptr<T>>& _media, + std::vector<int> const& material_ids_of_this_medium, + CreateMedium&& create_medium) +{ + if (_media.find(id) != end(_media)) + { + OGS_FATAL( + "Multiple media were specified for the same material id " + "'{:d}'. Keep in mind, that if no material id is " + "specified, it is assumed to be 0 by default.", + id); + } + + if (id == material_ids_of_this_medium[0]) + { + _media[id] = create_medium(id); + } + else + { + _media[id] = _media[material_ids_of_this_medium[0]]; + } +} + } // namespace ProjectData::ProjectData() = default; @@ -588,7 +616,16 @@ void ProjectData::parseMedia( //! \ogs_file_param{prj__media__medium} media_config->getConfigSubtreeList("medium")) { - auto material_id_string = + auto create_medium = [dim = _mesh_vec[0]->getDimension(), + &medium_config, this](int const id) + { + return MaterialPropertyLib::createMedium( + id, _mesh_vec[0]->getDimension(), medium_config, _parameters, + _local_coordinate_system ? &*_local_coordinate_system : nullptr, + _curves); + }; + + auto const material_id_string = //! \ogs_file_attr{prj__media__medium__id} medium_config.getConfigAttribute<std::string>("id", "0"); @@ -598,31 +635,8 @@ void ProjectData::parseMedia( for (auto const& id : material_ids_of_this_medium) { - if (_media.find(id) != end(_media)) - { - OGS_FATAL( - "Multiple media were specified for the same material id " - "'{:d}'. Keep in mind, that if no material id is " - "specified, it is assumed to be 0 by default.", - id); - } - - if (id == material_ids_of_this_medium[0]) - { - _media[id] = MaterialPropertyLib::createMedium( - id, _mesh_vec[0]->getDimension(), medium_config, - _parameters, - _local_coordinate_system ? &*_local_coordinate_system - : nullptr, - _curves); - } - else - { - // This medium has multiple material IDs assigned and this is - // not the first material ID. Therefore we can reuse the medium - // we created before. - _media[id] = _media[material_ids_of_this_medium[0]]; - } + createMediumForId(id, _media, material_ids_of_this_medium, + create_medium); } }