/** * \file * \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 * */ #pragma once #include "MathLib/KelvinVector.h" #include "NumLib/Fem/ShapeMatrixPolicy.h" namespace ProcessLib { /// An implementation of B-Matrix policy using same matrix and vector types /// (fixed size or dynamic) as in the ShapeMatrixPolicyType. template class BMatrixPolicyType { private: /// Reusing the ShapeMatrixPolicy vector type. template using VectorType = typename ShapeMatrixPolicyType::template VectorType; /// Reusing the ShapeMatrixPolicy matrix type. template using MatrixType = typename ShapeMatrixPolicyType< ShapeFunction, DisplacementDim>::template MatrixType; // Dimensions of specific b-matrix for n-points and displacement dimension. static int const _number_of_dof = ShapeFunction::NPOINTS * DisplacementDim; static int const _kelvin_vector_size = MathLib::KelvinVector::kelvin_vector_dimensions(DisplacementDim); public: using StiffnessMatrixType = MatrixType<_number_of_dof, _number_of_dof>; /// Rhs residual using NodalForceVectorType = VectorType<_number_of_dof>; /// This type can be different (fixed vs. dynamic size) from the /// MathLib::KelvinVector::KelvinVectorType. using KelvinVectorType = VectorType<_kelvin_vector_size>; /// This type can be different (fixed vs. dynamic size) from the /// MathLib::KelvinVector::KelvinMatrixType. using KelvinMatrixType = MatrixType<_kelvin_vector_size, _kelvin_vector_size>; using BMatrixType = MatrixType<_kelvin_vector_size, _number_of_dof>; }; } // namespace ProcessLib