diff --git a/ProcessLib/PhaseField/PhaseFieldFEM-impl.h b/ProcessLib/PhaseField/PhaseFieldFEM-impl.h new file mode 100644 index 0000000000000000000000000000000000000000..25db542f1081d1207e429a378e5b0956925a095f --- /dev/null +++ b/ProcessLib/PhaseField/PhaseFieldFEM-impl.h @@ -0,0 +1,159 @@ +/** + * \copyright + * Copyright (c) 2012-2018, 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 PhaseFieldFEM-impl.h + * Created on January 8, 2018, 3:00 PM + */ +#pragma once + +namespace ProcessLib +{ +namespace PhaseField +{ +template <typename ShapeFunction, typename IntegrationMethod, + int DisplacementDim> +void PhaseFieldLocalAssembler<ShapeFunction, IntegrationMethod, + DisplacementDim>:: + assembleWithJacobianForStaggeredScheme( + double const t, std::vector<double> const& local_xdot, + const double dxdot_dx, const double dx_dx, + std::vector<double>& local_M_data, std::vector<double>& local_K_data, + std::vector<double>& local_b_data, std::vector<double>& local_Jac_data, + LocalCoupledSolutions const& local_coupled_solutions) +{ + // For the equations with phase field. + if (local_coupled_solutions.process_id == 0) + { + assembleWithJacobianPhaseFiledEquations( + t, local_xdot, dxdot_dx, dx_dx, local_M_data, local_K_data, + local_b_data, local_Jac_data, local_coupled_solutions); + return; + } + + // For the equations with deformation + assembleWithJacobianForDeformationEquations( + t, local_xdot, dxdot_dx, dx_dx, local_M_data, local_K_data, + local_b_data, local_Jac_data, local_coupled_solutions); +} + +template <typename ShapeFunction, typename IntegrationMethod, + int DisplacementDim> +void PhaseFieldLocalAssembler<ShapeFunction, IntegrationMethod, + DisplacementDim>:: + assembleWithJacobianForDeformationEquations( + double const t, std::vector<double> const& local_xdot, + const double dxdot_dx, const double dx_dx, + std::vector<double>& local_M_data, std::vector<double>& local_K_data, + std::vector<double>& local_b_data, std::vector<double>& local_Jac_data, + LocalCoupledSolutions const& local_coupled_solutions) const +{ + auto const& local_d = local_coupled_solutions.local_coupled_xs[0]; + auto const& local_u = local_coupled_solutions.local_coupled_xs[1]; + assert(local_d.size() == phasefield_size); + assert(local_u.size() == displacement_size); + + auto const local_matrix_size = local_u.size(); + auto d = Eigen::Map< + typename ShapeMatricesType::template VectorType<phasefield_size> const>( + local_d.data(), phasefield_size); + + auto u = Eigen::Map<typename ShapeMatricesType::template VectorType< + displacement_size> const>(local_u.data(), displacement_size); + + // May not needed: auto d_dot = Eigen::Map< + // typename ShapeMatricesType::template VectorType<phasefield_size> + // const>( + // local_xdot.data(), phasefield_size); + + auto local_Jac = MathLib::createZeroedMatrix<JacobianMatrix>( + local_Jac_data, local_matrix_size, local_matrix_size); + + auto local_rhs = + MathLib::createZeroedVector<RhsVector>(local_b_data, local_matrix_size); + + typename ShapeMatricesType::template MatrixType<displacement_size, + phasefield_size> + Kud; + Kud.setZero(displacement_size, phasefield_size); + + double const& dt = _process_data.dt; + + SpatialPosition x_position; + x_position.setElementID(_element.getID()); + + int const n_integration_points = _integration_method.getNumberOfPoints(); + for (int ip = 0; ip < n_integration_points; ip++) + { + x_position.setIntegrationPoint(ip); + auto const& w = _ip_data[ip].integration_weight; + auto const& N = _ip_data[ip].N; + auto const& dNdx = _ip_data[ip].dNdx; + } +} + +template <typename ShapeFunction, typename IntegrationMethod, + int DisplacementDim> +void PhaseFieldLocalAssembler<ShapeFunction, IntegrationMethod, + DisplacementDim>:: + assembleWithJacobianPhaseFiledEquations( + double const t, std::vector<double> const& local_xdot, + const double dxdot_dx, const double dx_dx, + std::vector<double>& local_M_data, std::vector<double>& local_K_data, + std::vector<double>& local_b_data, std::vector<double>& local_Jac_data, + LocalCoupledSolutions const& local_coupled_solutions) const +{ + auto const& local_d = local_coupled_solutions.local_coupled_xs[0]; + auto const& local_u = local_coupled_solutions.local_coupled_xs[1]; + assert(local_d.size() == phasefield_size); + assert(local_u.size() == displacement_size); + + auto const local_matrix_size = local_d.size(); + auto d = Eigen::Map< + typename ShapeMatricesType::template VectorType<phasefield_size> const>( + local_d.data(), phasefield_size); + + auto u = Eigen::Map<typename ShapeMatricesType::template VectorType< + displacement_size> const>(local_u.data(), displacement_size); + + auto d_dot = Eigen::Map< + typename ShapeMatricesType::template VectorType<phasefield_size> const>( + local_xdot.data(), phasefield_size); + + auto local_Jac = MathLib::createZeroedMatrix<JacobianMatrix>( + local_Jac_data, local_matrix_size, local_matrix_size); + + auto local_rhs = + MathLib::createZeroedVector<RhsVector>(local_b_data, local_matrix_size); + + typename ShapeMatricesType::template MatrixType<phasefield_size, + displacement_size> + Kdu; + Kdu.setZero(phasefield_size, displacement_size); + + typename ShapeMatricesType::NodalMatrixType Kdd; + Kdd.setZero(phasefield_size, phasefield_size); + + typename ShapeMatricesType::NodalMatrixType Ddd; + Ddd.setZero(phasefield_size, phasefield_size); + + double const& dt = _process_data.dt; + + SpatialPosition x_position; + x_position.setElementID(_element.getID()); + + int const n_integration_points = _integration_method.getNumberOfPoints(); + for (int ip = 0; ip < n_integration_points; ip++) + { + x_position.setIntegrationPoint(ip); + auto const& w = _ip_data[ip].integration_weight; + auto const& N = _ip_data[ip].N; + auto const& dNdx = _ip_data[ip].dNdx; + } +} + +} // namespace PhaseField +} // namespace ProcessLib \ No newline at end of file diff --git a/ProcessLib/PhaseField/PhaseFieldFEM.h b/ProcessLib/PhaseField/PhaseFieldFEM.h index c9bde13feaba2385cff617d1b59af6ecdcf7bce7..976fa94a78bdc2f04f913e00efd6576883f6dbaa 100644 --- a/ProcessLib/PhaseField/PhaseFieldFEM.h +++ b/ProcessLib/PhaseField/PhaseFieldFEM.h @@ -101,7 +101,6 @@ class PhaseFieldLocalAssembler : public PhaseFieldLocalAssemblerInterface public: using ShapeMatricesType = ShapeMatrixPolicyType<ShapeFunction, DisplacementDim>; - // Types for displacement. // (Higher order elements = ShapeFunction). using ShapeMatrices = typename ShapeMatricesType::ShapeMatrices; @@ -366,6 +365,13 @@ public: .noalias() += Kdu; } + void assembleWithJacobianForStaggeredScheme( + double const t, std::vector<double> const& local_xdot, + const double dxdot_dx, const double dx_dx, + std::vector<double>& local_M_data, std::vector<double>& local_K_data, + std::vector<double>& local_b_data, std::vector<double>& local_Jac_data, + LocalCoupledSolutions const& local_coupled_solutions) override; + void preTimestepConcrete(std::vector<double> const& /*local_x*/, double const /*t*/, double const /*delta_t*/) override @@ -535,6 +541,20 @@ private: return cache; } + void assembleWithJacobianPhaseFiledEquations( + double const t, std::vector<double> const& local_xdot, + const double dxdot_dx, const double dx_dx, + std::vector<double>& local_M_data, std::vector<double>& local_K_data, + std::vector<double>& local_b_data, std::vector<double>& local_Jac_data, + LocalCoupledSolutions const& local_coupled_solutions) const; + + void assembleWithJacobianForDeformationEquations( + double const t, std::vector<double> const& local_xdot, + const double dxdot_dx, const double dx_dx, + std::vector<double>& local_M_data, std::vector<double>& local_K_data, + std::vector<double>& local_b_data, std::vector<double>& local_Jac_data, + LocalCoupledSolutions const& local_coupled_solutions) const; + PhaseFieldProcessData<DisplacementDim>& _process_data; std::vector< @@ -557,3 +577,5 @@ private: } // namespace PhaseField } // namespace ProcessLib + +#include "PhaseFieldFEM-impl.h"