/** * \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 * * Created on May 4, 2020, 10:27 AM */ #pragma once #include #include #include "MathLib/KelvinVector.h" #include "MathLib/LinAlg/Eigen/EigenMapTools.h" #include "NumLib/Function/Interpolation.h" namespace ProcessLib { template std::vector const& getIntegrationPointKelvinVectorData( std::vector> const& ip_data, MemberType member, std::vector& cache) { constexpr int kelvin_vector_size = MathLib::KelvinVector::KelvinVectorDimensions::value; auto const n_integration_points = ip_data.size(); cache.clear(); auto cache_mat = MathLib::createZeroedMatrix>( cache, kelvin_vector_size, n_integration_points); for (unsigned ip = 0; ip < n_integration_points; ++ip) { auto const& kelvin_vector = ip_data[ip].*member; cache_mat.col(ip) = MathLib::KelvinVector::kelvinVectorToSymmetricTensor(kelvin_vector); } return cache; } template std::vector getIntegrationPointKelvinVectorData( std::vector> const& ip_data, MemberType member) { constexpr int kelvin_vector_size = MathLib::KelvinVector::KelvinVectorDimensions::value; auto const n_integration_points = ip_data.size(); std::vector ip_kelvin_vector_values; auto cache_mat = MathLib::createZeroedMatrix>( ip_kelvin_vector_values, n_integration_points, kelvin_vector_size); for (unsigned ip = 0; ip < n_integration_points; ++ip) { auto const& ip_member = ip_data[ip].*member; cache_mat.row(ip) = MathLib::KelvinVector::kelvinVectorToSymmetricTensor(ip_member); } return ip_kelvin_vector_values; } template std::size_t setIntegrationPointKelvinVectorData( double const* values, std::vector>& ip_data, MemberType member) { constexpr int kelvin_vector_size = MathLib::KelvinVector::KelvinVectorDimensions::value; auto const n_integration_points = ip_data.size(); auto kelvin_vector_values = Eigen::Map const>( values, kelvin_vector_size, n_integration_points); for (unsigned ip = 0; ip < n_integration_points; ++ip) { ip_data[ip].*member = MathLib::KelvinVector::symmetricTensorToKelvinVector( kelvin_vector_values.col(ip)); } return n_integration_points; } template std::vector const& getIntegrationPointScalarData( std::vector> const& ip_data, MemberType member, std::vector& cache) { auto const n_integration_points = ip_data.size(); cache.clear(); auto cache_mat = MathLib::createZeroedMatrix< Eigen::Matrix>( cache, 1, n_integration_points); for (unsigned ip = 0; ip < n_integration_points; ++ip) { cache_mat[ip] = ip_data[ip].*member; } return cache; } template std::size_t setIntegrationPointScalarData( double const* values, std::vector>& ip_data, MemberType member) { auto const n_integration_points = ip_data.size(); for (unsigned ip = 0; ip < n_integration_points; ++ip) { ip_data[ip].*member = values[ip]; } return n_integration_points; } } // namespace ProcessLib