diff --git a/ProcessLib/PhaseField/LocalAssemblerInterface.h b/ProcessLib/PhaseField/LocalAssemblerInterface.h index e8d6a46ae1b2c42a3576203545d554656490b67f..b0953d7ab36aa04e7d28d31ebee4b9fd76a9598c 100644 --- a/ProcessLib/PhaseField/LocalAssemblerInterface.h +++ b/ProcessLib/PhaseField/LocalAssemblerInterface.h @@ -22,73 +22,13 @@ struct PhaseFieldLocalAssemblerInterface : public ProcessLib::LocalAssemblerInterface, public NumLib::ExtrapolatableElement { - virtual std::vector<double> const& getIntPtSigmaXX( + virtual std::vector<double> const& getIntPtSigma( const double /*t*/, GlobalVector const& /*current_solution*/, NumLib::LocalToGlobalIndexMap const& /*dof_table*/, std::vector<double>& cache) const = 0; - virtual std::vector<double> const& getIntPtSigmaYY( - const double /*t*/, - GlobalVector const& /*current_solution*/, - NumLib::LocalToGlobalIndexMap const& /*dof_table*/, - std::vector<double>& cache) const = 0; - - virtual std::vector<double> const& getIntPtSigmaZZ( - const double /*t*/, - GlobalVector const& /*current_solution*/, - NumLib::LocalToGlobalIndexMap const& /*dof_table*/, - std::vector<double>& cache) const = 0; - - virtual std::vector<double> const& getIntPtSigmaXY( - const double /*t*/, - GlobalVector const& /*current_solution*/, - NumLib::LocalToGlobalIndexMap const& /*dof_table*/, - std::vector<double>& cache) const = 0; - - virtual std::vector<double> const& getIntPtSigmaXZ( - const double /*t*/, - GlobalVector const& /*current_solution*/, - NumLib::LocalToGlobalIndexMap const& /*dof_table*/, - std::vector<double>& cache) const = 0; - - virtual std::vector<double> const& getIntPtSigmaYZ( - const double /*t*/, - GlobalVector const& /*current_solution*/, - NumLib::LocalToGlobalIndexMap const& /*dof_table*/, - std::vector<double>& cache) const = 0; - - virtual std::vector<double> const& getIntPtEpsilonXX( - const double /*t*/, - GlobalVector const& /*current_solution*/, - NumLib::LocalToGlobalIndexMap const& /*dof_table*/, - std::vector<double>& cache) const = 0; - - virtual std::vector<double> const& getIntPtEpsilonYY( - const double /*t*/, - GlobalVector const& /*current_solution*/, - NumLib::LocalToGlobalIndexMap const& /*dof_table*/, - std::vector<double>& cache) const = 0; - - virtual std::vector<double> const& getIntPtEpsilonZZ( - const double /*t*/, - GlobalVector const& /*current_solution*/, - NumLib::LocalToGlobalIndexMap const& /*dof_table*/, - std::vector<double>& cache) const = 0; - - virtual std::vector<double> const& getIntPtEpsilonXY( - const double /*t*/, - GlobalVector const& /*current_solution*/, - NumLib::LocalToGlobalIndexMap const& /*dof_table*/, - std::vector<double>& cache) const = 0; - - virtual std::vector<double> const& getIntPtEpsilonXZ( - const double /*t*/, - GlobalVector const& /*current_solution*/, - NumLib::LocalToGlobalIndexMap const& /*dof_table*/, - std::vector<double>& cache) const = 0; - - virtual std::vector<double> const& getIntPtEpsilonYZ( + virtual std::vector<double> const& getIntPtEpsilon( const double /*t*/, GlobalVector const& /*current_solution*/, NumLib::LocalToGlobalIndexMap const& /*dof_table*/, diff --git a/ProcessLib/PhaseField/PhaseFieldFEM.h b/ProcessLib/PhaseField/PhaseFieldFEM.h index f524a65d3a15d8e4d940f377d6315531b12c4db8..c168e0f8089fe25feed65af7c57f6f056d6fbc65 100644 --- a/ProcessLib/PhaseField/PhaseFieldFEM.h +++ b/ProcessLib/PhaseField/PhaseFieldFEM.h @@ -237,148 +237,54 @@ public: return Eigen::Map<const Eigen::RowVectorXd>(N.data(), N.size()); } - std::vector<double> const& getIntPtSigmaXX( - const double /*t*/, - GlobalVector const& /*current_solution*/, - NumLib::LocalToGlobalIndexMap const& /*dof_table*/, - std::vector<double>& cache) const override - { - return getIntPtSigma(cache, 0); - } - - std::vector<double> const& getIntPtSigmaYY( - const double /*t*/, - GlobalVector const& /*current_solution*/, - NumLib::LocalToGlobalIndexMap const& /*dof_table*/, - std::vector<double>& cache) const override - { - return getIntPtSigma(cache, 1); - } - - std::vector<double> const& getIntPtSigmaZZ( - const double /*t*/, - GlobalVector const& /*current_solution*/, - NumLib::LocalToGlobalIndexMap const& /*dof_table*/, - std::vector<double>& cache) const override - { - return getIntPtSigma(cache, 2); - } - - std::vector<double> const& getIntPtSigmaXY( - const double /*t*/, - GlobalVector const& /*current_solution*/, - NumLib::LocalToGlobalIndexMap const& /*dof_table*/, - std::vector<double>& cache) const override - { - return getIntPtSigma(cache, 3); - } - - std::vector<double> const& getIntPtSigmaYZ( - const double /*t*/, - GlobalVector const& /*current_solution*/, - NumLib::LocalToGlobalIndexMap const& /*dof_table*/, - std::vector<double>& cache) const override - { - assert(DisplacementDim == 3); - return getIntPtSigma(cache, 4); - } - - std::vector<double> const& getIntPtSigmaXZ( - const double /*t*/, - GlobalVector const& /*current_solution*/, - NumLib::LocalToGlobalIndexMap const& /*dof_table*/, - std::vector<double>& cache) const override - { - assert(DisplacementDim == 3); - return getIntPtSigma(cache, 5); - } - - std::vector<double> const& getIntPtEpsilonXX( - const double /*t*/, - GlobalVector const& /*current_solution*/, - NumLib::LocalToGlobalIndexMap const& /*dof_table*/, - std::vector<double>& cache) const override - { - return getIntPtEpsilon(cache, 0); - } - - std::vector<double> const& getIntPtEpsilonYY( +private: + std::vector<double> const& getIntPtSigma( const double /*t*/, GlobalVector const& /*current_solution*/, NumLib::LocalToGlobalIndexMap const& /*dof_table*/, std::vector<double>& cache) const override { - return getIntPtEpsilon(cache, 1); - } + static const int kelvin_vector_size = + MathLib::KelvinVector::KelvinVectorDimensions< + DisplacementDim>::value; + auto const num_intpts = _ip_data.size(); - std::vector<double> const& getIntPtEpsilonZZ( - const double /*t*/, - GlobalVector const& /*current_solution*/, - NumLib::LocalToGlobalIndexMap const& /*dof_table*/, - std::vector<double>& cache) const override - { - return getIntPtEpsilon(cache, 2); - } + cache.clear(); + auto cache_mat = MathLib::createZeroedMatrix<Eigen::Matrix< + double, kelvin_vector_size, Eigen::Dynamic, Eigen::RowMajor>>( + cache, kelvin_vector_size, num_intpts); - std::vector<double> const& getIntPtEpsilonXY( - const double /*t*/, - GlobalVector const& /*current_solution*/, - NumLib::LocalToGlobalIndexMap const& /*dof_table*/, - std::vector<double>& cache) const override - { - return getIntPtEpsilon(cache, 3); - } + for (unsigned ip = 0; ip < num_intpts; ++ip) + { + auto const& sigma = _ip_data[ip].sigma_real; + cache_mat.col(ip) = + MathLib::KelvinVector::kelvinVectorToSymmetricTensor(sigma); + } - std::vector<double> const& getIntPtEpsilonYZ( - const double /*t*/, - GlobalVector const& /*current_solution*/, - NumLib::LocalToGlobalIndexMap const& /*dof_table*/, - std::vector<double>& cache) const override - { - assert(DisplacementDim == 3); - return getIntPtEpsilon(cache, 4); + return cache; } - std::vector<double> const& getIntPtEpsilonXZ( + virtual std::vector<double> const& getIntPtEpsilon( const double /*t*/, GlobalVector const& /*current_solution*/, NumLib::LocalToGlobalIndexMap const& /*dof_table*/, std::vector<double>& cache) const override { - assert(DisplacementDim == 3); - return getIntPtEpsilon(cache, 5); - } + auto const kelvin_vector_size = + MathLib::KelvinVector::KelvinVectorDimensions< + DisplacementDim>::value; + auto const num_intpts = _ip_data.size(); -private: - std::vector<double> const& getIntPtSigma(std::vector<double>& cache, - std::size_t const component) const - { - cache.clear(); - cache.reserve(_ip_data.size()); - - for (auto const& ip_data : _ip_data) - { - if (component < 3) // xx, yy, zz components - cache.push_back(ip_data.sigma_real[component]); - else // mixed xy, yz, xz components - cache.push_back(ip_data.sigma_real[component] / std::sqrt(2)); - } - - return cache; - } - - std::vector<double> const& getIntPtEpsilon( - std::vector<double>& cache, std::size_t const component) const - { cache.clear(); - cache.reserve(_ip_data.size()); + auto cache_mat = MathLib::createZeroedMatrix<Eigen::Matrix< + double, kelvin_vector_size, Eigen::Dynamic, Eigen::RowMajor>>( + cache, kelvin_vector_size, num_intpts); - for (auto const& ip_data : _ip_data) + for (unsigned ip = 0; ip < num_intpts; ++ip) { - if (component < 3) // xx, yy, zz components - cache.push_back(ip_data.eps[component]); - else // mixed xy, yz, xz components - cache.push_back(ip_data.eps[component] / std::sqrt(2)); + auto const& eps = _ip_data[ip].eps; + cache_mat.col(ip) = + MathLib::KelvinVector::kelvinVectorToSymmetricTensor(eps); } return cache; diff --git a/ProcessLib/PhaseField/PhaseFieldProcess-impl.h b/ProcessLib/PhaseField/PhaseFieldProcess-impl.h index e1d44b98c92269a273e9612abb5ba3d8dea21517..1f49952126b504ec14a73f1c2fe86bf13be79838 100644 --- a/ProcessLib/PhaseField/PhaseFieldProcess-impl.h +++ b/ProcessLib/PhaseField/PhaseFieldProcess-impl.h @@ -165,70 +165,14 @@ void PhaseFieldProcess<DisplacementDim>::initializeConcreteProcess( mesh.isAxiallySymmetric(), integration_order, _process_data); Base::_secondary_variables.addSecondaryVariable( - "sigma_xx", + "sigma", makeExtrapolator(1, getExtrapolator(), _local_assemblers, - &LocalAssemblerInterface::getIntPtSigmaXX)); + &LocalAssemblerInterface::getIntPtSigma)); Base::_secondary_variables.addSecondaryVariable( - "sigma_yy", + "epsilon", makeExtrapolator(1, getExtrapolator(), _local_assemblers, - &LocalAssemblerInterface::getIntPtSigmaYY)); - - Base::_secondary_variables.addSecondaryVariable( - "sigma_zz", - makeExtrapolator(1, getExtrapolator(), _local_assemblers, - &LocalAssemblerInterface::getIntPtSigmaZZ)); - - Base::_secondary_variables.addSecondaryVariable( - "sigma_xy", - makeExtrapolator(1, getExtrapolator(), _local_assemblers, - &LocalAssemblerInterface::getIntPtSigmaXY)); - - if (DisplacementDim == 3) - { - Base::_secondary_variables.addSecondaryVariable( - "sigma_xz", - makeExtrapolator(1, getExtrapolator(), _local_assemblers, - &LocalAssemblerInterface::getIntPtSigmaXZ)); - - Base::_secondary_variables.addSecondaryVariable( - "sigma_yz", - makeExtrapolator(1, getExtrapolator(), _local_assemblers, - &LocalAssemblerInterface::getIntPtSigmaYZ)); - } - - Base::_secondary_variables.addSecondaryVariable( - "epsilon_xx", - makeExtrapolator(1, getExtrapolator(), _local_assemblers, - &LocalAssemblerInterface::getIntPtEpsilonXX)); - - Base::_secondary_variables.addSecondaryVariable( - "epsilon_yy", - makeExtrapolator(1, getExtrapolator(), _local_assemblers, - &LocalAssemblerInterface::getIntPtEpsilonYY)); - - Base::_secondary_variables.addSecondaryVariable( - "epsilon_zz", - makeExtrapolator(1, getExtrapolator(), _local_assemblers, - &LocalAssemblerInterface::getIntPtEpsilonZZ)); - - Base::_secondary_variables.addSecondaryVariable( - "epsilon_xy", - makeExtrapolator(1, getExtrapolator(), _local_assemblers, - &LocalAssemblerInterface::getIntPtEpsilonXY)); - - if (DisplacementDim == 3) - { - Base::_secondary_variables.addSecondaryVariable( - "epsilon_yz", - makeExtrapolator(1, getExtrapolator(), _local_assemblers, - &LocalAssemblerInterface::getIntPtEpsilonYZ)); - - Base::_secondary_variables.addSecondaryVariable( - "epsilon_xz", - makeExtrapolator(1, getExtrapolator(), _local_assemblers, - &LocalAssemblerInterface::getIntPtEpsilonXZ)); - } + &LocalAssemblerInterface::getIntPtEpsilon)); } template <int DisplacementDim>