/** * \copyright * Copyright (c) 2012-2021, OpenGeoSys Community (http://www.opengeosys.org) * Distributed under a Modified BSD License. * See accompanying file LICENSE.txt or * http://www.opengeosys.org/project/license * * \file * Created on July 10, 2018, 12:09 PM */ #include "CreateConstitutiveRelation.h" #include "CreateCreepBGRa.h" #include "CreateEhlers.h" #include "CreateLinearElasticIsotropic.h" #include "CreateLinearElasticOrthotropic.h" #include "CreateLubby2.h" #ifdef OGS_USE_MFRONT #include "MFront/CreateMFront.h" #endif // OGS_USE_MFRONT #include "MechanicsBase.h" #include "BaseLib/ConfigTree.h" #include "BaseLib/Error.h" #include "ParameterLib/Parameter.h" namespace MaterialLib { namespace Solids { template std::unique_ptr> createConstitutiveRelation( std::vector> const& parameters, std::optional const& local_coordinate_system, BaseLib::ConfigTree const& config) { auto const type = //! \ogs_file_param{material__solid__constitutive_relation__type} config.peekConfigParameter("type"); if (type == "Ehlers") { return MaterialLib::Solids::Ehlers::createEhlers( parameters, config); } if (type == "LinearElasticIsotropic") { const bool skip_type_checking = false; return MaterialLib::Solids::createLinearElasticIsotropic< DisplacementDim>(parameters, config, skip_type_checking); } if (type == "LinearElasticOrthotropic") { const bool skip_type_checking = false; return MaterialLib::Solids::createLinearElasticOrthotropic< DisplacementDim>( parameters, local_coordinate_system, config, skip_type_checking); } if (type == "Lubby2") { return MaterialLib::Solids::Lubby2::createLubby2( parameters, config); } if (type == "CreepBGRa") { return MaterialLib::Solids::Creep::createCreepBGRa( parameters, config); } if (type == "MFront") { #ifdef OGS_USE_MFRONT return MaterialLib::Solids::MFront::createMFront( parameters, local_coordinate_system, config); #else // OGS_USE_MFRONT OGS_FATAL( "OGS is compiled without MFront support. See OGS_USE_MFRONT CMake " "option."); #endif // OGS_USE_MFRONT } OGS_FATAL("Cannot construct constitutive relation of given type '{:s}'.", type); } template std::map>> createConstitutiveRelations( std::vector> const& parameters, std::optional const& local_coordinate_system, BaseLib::ConfigTree const& config) { auto const constitutive_relation_configs = //! \ogs_file_param{material__solid__constitutive_relation} config.getConfigSubtreeList("constitutive_relation"); std::map>> constitutive_relations; for (auto const& constitutive_relation_config : constitutive_relation_configs) { int const material_id = //! \ogs_file_attr{material__solid__constitutive_relation__id} constitutive_relation_config.getConfigAttribute("id", 0); if (constitutive_relations.find(material_id) != constitutive_relations.end()) { OGS_FATAL( "Multiple constitutive relations 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.", material_id); } constitutive_relations.emplace( material_id, createConstitutiveRelation( parameters, local_coordinate_system, constitutive_relation_config)); } DBUG("Found {:d} constitutive relations.", constitutive_relations.size()); return constitutive_relations; } template std::map>> createConstitutiveRelations<2>( std::vector> const& parameters, std::optional const& local_coordinate_system, BaseLib::ConfigTree const& config); template std::map>> createConstitutiveRelations<3>( std::vector> const& parameters, std::optional const& local_coordinate_system, BaseLib::ConfigTree const& config); } // namespace Solids } // namespace MaterialLib