diff --git a/MeshLib/IO/MPI_IO/NodePartitionedMeshReader.cpp b/MeshLib/IO/MPI_IO/NodePartitionedMeshReader.cpp index 785714776aba55ace772c3ae027c5abe27e8ff29..3a526472cc669d8af9ebb89613e5b5dc89f7599d 100644 --- a/MeshLib/IO/MPI_IO/NodePartitionedMeshReader.cpp +++ b/MeshLib/IO/MPI_IO/NodePartitionedMeshReader.cpp @@ -216,7 +216,9 @@ void NodePartitionedMeshReader::readPropertiesBinary( std::ifstream is(fname_cfg.c_str(), std::ios::binary | std::ios::in); if (!is) { - WARN("Could not open file '%s' in binary mode.", fname_cfg.c_str()); + WARN("Could not open file '%s'.\n" + "\tYou can ignore this warning if the mesh does not contain %s-" + "wise property data.", fname_cfg.c_str(), item_type.data()); return; } std::size_t number_of_properties = 0; @@ -269,7 +271,9 @@ void NodePartitionedMeshReader::readPropertiesBinary( is.open(fname_val.c_str(), std::ios::binary | std::ios::in); if (!is) { - ERR("Could not open file '%s' in binary mode.", fname_val.c_str()); + ERR("Could not open file '%s'\n." + "\tYou can ignore this warning if the mesh does not contain %s-" + "wise property data.", fname_val.c_str(), item_type.data()); } readDomainSpecificPartOfPropertyVectors(vec_pvmd, *pvpmd, t, is, p); diff --git a/ProcessLib/ThermoMechanics/CreateLocalAssemblers.h b/ProcessLib/ThermoMechanics/CreateLocalAssemblers.h deleted file mode 100644 index 7a4103b84f10c39b62c5166d32dd5a86a47f1c2a..0000000000000000000000000000000000000000 --- a/ProcessLib/ThermoMechanics/CreateLocalAssemblers.h +++ /dev/null @@ -1,100 +0,0 @@ -/** - * \copyright - * Copyright (c) 2012-2017, OpenGeoSys Community (http://www.opengeosys.org) - * Distributed under a Modified BSD License. - * See accompanying file LICENSE.txt or - * http://www.opengeosys.org/project/license - */ - -#pragma once - -#include <vector> - -#include <logog/include/logog.hpp> - -#include "NumLib/DOF/LocalToGlobalIndexMap.h" - -#include "LocalDataInitializer.h" - -namespace ProcessLib -{ -namespace ThermoMechanics -{ -namespace detail -{ -template <unsigned GlobalDim, int DisplacementDim, - template <typename, typename, unsigned, int> - class LocalAssemblerImplementation, - typename LocalAssemblerInterface, typename... ExtraCtorArgs> -void createLocalAssemblers( - NumLib::LocalToGlobalIndexMap const& dof_table, - std::vector<MeshLib::Element*> const& mesh_elements, - std::vector<std::unique_ptr<LocalAssemblerInterface>>& local_assemblers, - ExtraCtorArgs&&... extra_ctor_args) -{ - // Shape matrices initializer - using LocalDataInitializer = - LocalDataInitializer<LocalAssemblerInterface, - LocalAssemblerImplementation, GlobalDim, - DisplacementDim, ExtraCtorArgs...>; - - DBUG("Create local assemblers."); - // Populate the vector of local assemblers. - local_assemblers.resize(mesh_elements.size()); - - LocalDataInitializer initializer(dof_table); - - DBUG("Calling local assembler builder for all mesh elements."); - GlobalExecutor::transformDereferenced( - initializer, mesh_elements, local_assemblers, - std::forward<ExtraCtorArgs>(extra_ctor_args)...); -} - -} // namespace detail - -/*! Creates local assemblers for each element of the given \c mesh. - * - * \tparam LocalAssemblerImplementation the individual local assembler type - * \tparam LocalAssemblerInterface the general local assembler interface - * \tparam ExtraCtorArgs types of additional constructor arguments. - * Those arguments will be passed to the constructor of - * \c LocalAssemblerImplementation. - * - * The first two template parameters cannot be deduced from the arguments. - * Therefore they always have to be provided manually. - */ -template <int DisplacementDim, template <typename, typename, unsigned, int> - class LocalAssemblerImplementation, - typename LocalAssemblerInterface, typename... ExtraCtorArgs> -void createLocalAssemblers( - const unsigned dimension, - std::vector<MeshLib::Element*> const& mesh_elements, - NumLib::LocalToGlobalIndexMap const& dof_table, - std::vector<std::unique_ptr<LocalAssemblerInterface>>& local_assemblers, - ExtraCtorArgs&&... extra_ctor_args) -{ - DBUG("Create local assemblers."); - - switch (dimension) - { - case 2: - detail::createLocalAssemblers<2, DisplacementDim, - LocalAssemblerImplementation>( - dof_table, mesh_elements, local_assemblers, - std::forward<ExtraCtorArgs>(extra_ctor_args)...); - break; - case 3: - detail::createLocalAssemblers<3, DisplacementDim, - LocalAssemblerImplementation>( - dof_table, mesh_elements, local_assemblers, - std::forward<ExtraCtorArgs>(extra_ctor_args)...); - break; - default: - OGS_FATAL( - "Meshes with dimension different than two and three are not " - "supported."); - } -} -} // ThermoMechanics - -} // ProcessLib diff --git a/ProcessLib/ThermoMechanics/LocalDataInitializer.h b/ProcessLib/ThermoMechanics/LocalDataInitializer.h deleted file mode 100644 index 3e766a497563b8d916d11d5476783c9c81628afa..0000000000000000000000000000000000000000 --- a/ProcessLib/ThermoMechanics/LocalDataInitializer.h +++ /dev/null @@ -1,306 +0,0 @@ -/** - * \copyright - * Copyright (c) 2012-2017, OpenGeoSys Community (http://www.opengeosys.org) - * Distributed under a Modified BSD License. - * See accompanying file LICENSE.txt or - * http://www.opengeosys.org/project/license - * - */ - -#pragma once - -#include <functional> -#include <memory> -#include <type_traits> -#include <typeindex> -#include <typeinfo> -#include <unordered_map> - -#include "MeshLib/Elements/Elements.h" -#include "NumLib/DOF/LocalToGlobalIndexMap.h" -#include "NumLib/Fem/Integration/GaussIntegrationPolicy.h" - -#ifndef OGS_MAX_ELEMENT_DIM -static_assert(false, "The macro OGS_MAX_ELEMENT_DIM is undefined."); -#endif - -#ifndef OGS_MAX_ELEMENT_ORDER -static_assert(false, "The macro OGS_MAX_ELEMENT_ORDER is undefined."); -#endif - -// The following macros decide which element types will be compiled, i.e. -// which element types will be available for use in simulations. - -#ifdef OGS_ENABLE_ELEMENT_SIMPLEX -#define ENABLED_ELEMENT_TYPE_SIMPLEX 1u -#else -#define ENABLED_ELEMENT_TYPE_SIMPLEX 0u -#endif - -#ifdef OGS_ENABLE_ELEMENT_CUBOID -#define ENABLED_ELEMENT_TYPE_CUBOID 1u << 1 -#else -#define ENABLED_ELEMENT_TYPE_CUBOID 0u -#endif - -#ifdef OGS_ENABLE_ELEMENT_PRISM -#define ENABLED_ELEMENT_TYPE_PRISM 1u << 2 -#else -#define ENABLED_ELEMENT_TYPE_PRISM 0u -#endif - -#ifdef OGS_ENABLE_ELEMENT_PYRAMID -#define ENABLED_ELEMENT_TYPE_PYRAMID 1u << 3 -#else -#define ENABLED_ELEMENT_TYPE_PYRAMID 0u -#endif - -// Dependent element types. -// Faces of tets, pyramids and prisms are triangles -#define ENABLED_ELEMENT_TYPE_TRI \ - ((ENABLED_ELEMENT_TYPE_SIMPLEX) | (ENABLED_ELEMENT_TYPE_PYRAMID) | \ - (ENABLED_ELEMENT_TYPE_PRISM)) -// Faces of hexes, pyramids and prisms are quads -#define ENABLED_ELEMENT_TYPE_QUAD \ - ((ENABLED_ELEMENT_TYPE_CUBOID) | (ENABLED_ELEMENT_TYPE_PYRAMID) | \ - (ENABLED_ELEMENT_TYPE_PRISM)) - -// All enabled element types -#define OGS_ENABLED_ELEMENTS \ - ((ENABLED_ELEMENT_TYPE_SIMPLEX) | (ENABLED_ELEMENT_TYPE_CUBOID) | \ - (ENABLED_ELEMENT_TYPE_PYRAMID) | (ENABLED_ELEMENT_TYPE_PRISM)) - -// Include only what is needed (Well, the conditions are not sharp). -#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_SIMPLEX) != 0 -#include "NumLib/Fem/ShapeFunction/ShapeTet10.h" -#include "NumLib/Fem/ShapeFunction/ShapeTet4.h" -#endif - -#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_TRI) != 0 -#include "NumLib/Fem/ShapeFunction/ShapeTri3.h" -#include "NumLib/Fem/ShapeFunction/ShapeTri6.h" -#endif - -#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_CUBOID) != 0 -#include "NumLib/Fem/ShapeFunction/ShapeHex20.h" -#include "NumLib/Fem/ShapeFunction/ShapeHex8.h" -#endif - -#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_QUAD) != 0 -#include "NumLib/Fem/ShapeFunction/ShapeQuad4.h" -#include "NumLib/Fem/ShapeFunction/ShapeQuad8.h" -#include "NumLib/Fem/ShapeFunction/ShapeQuad9.h" -#endif - -#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PRISM) != 0 -#include "NumLib/Fem/ShapeFunction/ShapePrism15.h" -#include "NumLib/Fem/ShapeFunction/ShapePrism6.h" -#endif - -#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PYRAMID) != 0 -#include "NumLib/Fem/ShapeFunction/ShapePyra13.h" -#include "NumLib/Fem/ShapeFunction/ShapePyra5.h" -#endif - -namespace ProcessLib -{ -namespace ThermoMechanics -{ -/// The LocalDataInitializer is a functor creating a local assembler data with -/// corresponding to the mesh element type shape functions and calling -/// initialization of the new local assembler data. -/// For example for MeshLib::Quad a local assembler data with template argument -/// NumLib::ShapeQuad4 is created. -template <typename LocalAssemblerInterface, - template <typename, typename, unsigned, int> class LocalAssemblerData, - unsigned GlobalDim, int DisplacementDim, typename... ConstructorArgs> -class LocalDataInitializer final -{ -public: - using LADataIntfPtr = std::unique_ptr<LocalAssemblerInterface>; - - explicit LocalDataInitializer( - NumLib::LocalToGlobalIndexMap const& dof_table) - : _dof_table(dof_table) - { -// /// Quads and Hexahedra /////////////////////////////////// - -#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_QUAD) != 0 && \ - OGS_MAX_ELEMENT_DIM >= 2 && OGS_MAX_ELEMENT_ORDER >= 1 - _builder[std::type_index(typeid(MeshLib::Quad))] = - makeLocalAssemblerBuilder<NumLib::ShapeQuad4>(); -#endif - -#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_CUBOID) != 0 && \ - OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 1 - _builder[std::type_index(typeid(MeshLib::Hex))] = - makeLocalAssemblerBuilder<NumLib::ShapeHex8>(); -#endif - -#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_QUAD) != 0 && \ - OGS_MAX_ELEMENT_DIM >= 2 && OGS_MAX_ELEMENT_ORDER >= 2 - _builder[std::type_index(typeid(MeshLib::Quad8))] = - makeLocalAssemblerBuilder<NumLib::ShapeQuad8>(); - _builder[std::type_index(typeid(MeshLib::Quad9))] = - makeLocalAssemblerBuilder<NumLib::ShapeQuad9>(); -#endif - -#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_CUBOID) != 0 && \ - OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 2 - _builder[std::type_index(typeid(MeshLib::Hex20))] = - makeLocalAssemblerBuilder<NumLib::ShapeHex20>(); -#endif - -// /// Simplices //////////////////////////////////////////////// - -#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_TRI) != 0 && \ - OGS_MAX_ELEMENT_DIM >= 2 && OGS_MAX_ELEMENT_ORDER >= 1 - _builder[std::type_index(typeid(MeshLib::Tri))] = - makeLocalAssemblerBuilder<NumLib::ShapeTri3>(); -#endif - -#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_SIMPLEX) != 0 && \ - OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 1 - _builder[std::type_index(typeid(MeshLib::Tet))] = - makeLocalAssemblerBuilder<NumLib::ShapeTet4>(); -#endif - -#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_TRI) != 0 && \ - OGS_MAX_ELEMENT_DIM >= 2 && OGS_MAX_ELEMENT_ORDER >= 2 - _builder[std::type_index(typeid(MeshLib::Tri6))] = - makeLocalAssemblerBuilder<NumLib::ShapeTri6>(); -#endif - -#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_SIMPLEX) != 0 && \ - OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 2 - _builder[std::type_index(typeid(MeshLib::Tet10))] = - makeLocalAssemblerBuilder<NumLib::ShapeTet10>(); -#endif - -// /// Prisms //////////////////////////////////////////////////// - -#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PRISM) != 0 && \ - OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 1 - _builder[std::type_index(typeid(MeshLib::Prism))] = - makeLocalAssemblerBuilder<NumLib::ShapePrism6>(); -#endif - -#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PRISM) != 0 && \ - OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 2 - _builder[std::type_index(typeid(MeshLib::Prism15))] = - makeLocalAssemblerBuilder<NumLib::ShapePrism15>(); -#endif - -// /// Pyramids ////////////////////////////////////////////////// - -#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PYRAMID) != 0 && \ - OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 1 - _builder[std::type_index(typeid(MeshLib::Pyramid))] = - makeLocalAssemblerBuilder<NumLib::ShapePyra5>(); -#endif - -#if (OGS_ENABLED_ELEMENTS & ENABLED_ELEMENT_TYPE_PYRAMID) != 0 && \ - OGS_MAX_ELEMENT_DIM >= 3 && OGS_MAX_ELEMENT_ORDER >= 2 - _builder[std::type_index(typeid(MeshLib::Pyramid13))] = - makeLocalAssemblerBuilder<NumLib::ShapePyra13>(); -#endif - } - - /// Sets the provided \c data_ptr to the newly created local assembler data. - /// - /// \attention - /// The index \c id is not necessarily the mesh item's id. Especially when - /// having multiple meshes it will differ from the latter. - void operator()(std::size_t const id, - MeshLib::Element const& mesh_item, - LADataIntfPtr& data_ptr, - ConstructorArgs&&... args) const - { - auto const type_idx = std::type_index(typeid(mesh_item)); - auto const it = _builder.find(type_idx); - - if (it != _builder.end()) - { - auto const num_local_dof = _dof_table.getNumberOfElementDOF(id); - data_ptr = it->second(mesh_item, num_local_dof, - std::forward<ConstructorArgs>(args)...); - } - else - { - OGS_FATAL( - "You are trying to build a local assembler for an unknown mesh " - "element type (%s)." - " Maybe you have disabled this mesh element type in your build " - "configuration or this process requires higher order elements.", - type_idx.name()); - } - } - -private: - using LADataBuilder = - std::function<LADataIntfPtr(MeshLib::Element const& e, - std::size_t const local_matrix_size, - ConstructorArgs&&...)>; - - template <typename ShapeFunction> - using IntegrationMethod = typename NumLib::GaussIntegrationPolicy< - typename ShapeFunction::MeshElement>::IntegrationMethod; - - template <typename ShapeFunction> - using LAData = - LocalAssemblerData<ShapeFunction, IntegrationMethod<ShapeFunction>, - GlobalDim, DisplacementDim>; - - /// A helper forwarding to the correct version of makeLocalAssemblerBuilder - /// depending whether the global dimension is less than the shape function's - /// dimension or not. - template <typename ShapeFunction> - static LADataBuilder makeLocalAssemblerBuilder() - { - return makeLocalAssemblerBuilder<ShapeFunction>( - static_cast<std::integral_constant< - bool, (GlobalDim >= ShapeFunction::DIM)>*>(nullptr)); - } - - /// Mapping of element types to local assembler constructors. - std::unordered_map<std::type_index, LADataBuilder> _builder; - - NumLib::LocalToGlobalIndexMap const& _dof_table; - - // local assembler builder implementations. -private: - /// Generates a function that creates a new LocalAssembler of type - /// LAData<ShapeFunction>. Only functions with shape function's dimension - /// less or equal to the global dimension are instantiated, e.g. following - /// combinations of shape functions and global dimensions: (Line2, 1), - /// (Line2, 2), (Line2, 3), (Hex20, 3) but not (Hex20, 2) or (Hex20, 1). - template <typename ShapeFunction> - static LADataBuilder makeLocalAssemblerBuilder(std::true_type*) - { - return [](MeshLib::Element const& e, - std::size_t const local_matrix_size, - ConstructorArgs&&... args) { - return LADataIntfPtr{new LAData<ShapeFunction>{ - e, local_matrix_size, std::forward<ConstructorArgs>(args)...}}; - }; - } - - /// Returns nullptr for shape functions whose dimensions are less than the - /// global dimension. - template <typename ShapeFunction> - static LADataBuilder makeLocalAssemblerBuilder(std::false_type*) - { - return nullptr; - } -}; - -} // namespace ThermoMechanics -} // namespace ProcessLib - -#undef ENABLED_ELEMENT_TYPE_SIMPLEX -#undef ENABLED_ELEMENT_TYPE_CUBOID -#undef ENABLED_ELEMENT_TYPE_PYRAMID -#undef ENABLED_ELEMENT_TYPE_PRISM -#undef ENABLED_ELEMENT_TYPE_TRI -#undef ENABLED_ELEMENT_TYPE_QUAD -#undef OGS_ENABLED_ELEMENTS diff --git a/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.h b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.h index abf3837395987b822a3b4d29bd01602b80bfec83..b2cf8df0b0303c6853939d39738aafb899383f90 100644 --- a/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.h +++ b/ProcessLib/ThermoMechanics/ThermoMechanicsProcess.h @@ -13,7 +13,7 @@ #include "NumLib/DOF/DOFTableUtil.h" #include "ProcessLib/Process.h" -#include "ProcessLib/ThermoMechanics/CreateLocalAssemblers.h" +#include "ProcessLib/SmallDeformation/CreateLocalAssemblers.h" #include "ThermoMechanicsFEM.h" #include "ThermoMechanicsProcessData.h" @@ -61,11 +61,10 @@ private: MeshLib::Mesh const& mesh, unsigned const integration_order) override { - ProcessLib::ThermoMechanics::createLocalAssemblers<DisplacementDim, - LocalAssemblerData>( - mesh.getDimension(), mesh.getElements(), dof_table, - _local_assemblers, mesh.isAxiallySymmetric(), integration_order, - _process_data); + ProcessLib::SmallDeformation::createLocalAssemblers< + DisplacementDim, ThermoMechanicsLocalAssembler>( + mesh.getElements(), dof_table, _local_assemblers, + mesh.isAxiallySymmetric(), integration_order, _process_data); // TODO move the two data members somewhere else. // for extrapolation of secondary variables