/* SPDX-FileCopyrightText: Copyright (c) 2016 - 2025, the adamantine authors. * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception */ #ifndef THERMAL_OPERATOR_DEVICE_HH #define THERMAL_OPERATOR_DEVICE_HH #include #include #include #include #include namespace adamantine { template class ThermalOperatorDevice final : public ThermalOperatorBase { public: ThermalOperatorDevice( MPI_Comm const &communicator, Boundary const &boundary, MaterialProperty &material_properties); void reinit(dealii::DoFHandler const &dof_handler, dealii::AffineConstraints const &affine_constraints, dealii::hp::QCollection<1> const &q_collection) override; void compute_inverse_mass_matrix( dealii::DoFHandler const &dof_handler, dealii::AffineConstraints const &affine_constraints) override; void clear() override; dealii::types::global_dof_index m() const override; dealii::types::global_dof_index n() const override; dealii::Portable::MatrixFree const &get_matrix_free() const; void vmult(dealii::LA::distributed::Vector &dst, dealii::LA::distributed::Vector const &src) const override; void vmult_add(dealii::LA::distributed::Vector &dst, dealii::LA::distributed::Vector const &src) const override; std::shared_ptr> get_inverse_mass_matrix() const override; void initialize_dof_vector( dealii::LA::distributed::Vector &vector) const override; void update_boundary_material_properties( dealii::LA::distributed::Vector const &state); void get_state_from_material_properties() override; void set_state_to_material_properties() override; /** * Set the deposition cosine and sine angles and convert the data from * std::vector to Kokkos::View. */ void set_material_deposition_orientation( std::vector const &deposition_cos, std::vector const &deposition_sin) override; void set_time(double) override { // TODO } /** * Update \f$ \frac{1}{\rho C_p} \f$ on the cells using the values computed at * the quadrature points. */ void update_inv_rho_cp_cell(); /** * Return the value of \f$ \frac{1}{\rho C_p} \f$ for a given cell and * quadrature point. */ double get_inv_rho_cp(typename dealii::DoFHandler::cell_iterator const &cell, unsigned int q) const; private: using kokkos_default = dealii::MemorySpace::Default::kokkos_space; /** * MPI communicator. */ MPI_Comm const &_communicator; /** * Flag set to true if all the boundary conditions are adiabatic. It is set to * false otherwise. */ bool _adiabatic_only_bc = true; dealii::types::global_dof_index _m; unsigned int _n_owned_cells; typename dealii::Portable::MatrixFree::AdditionalData _matrix_free_data; /** * Material properties associated with the domain. */ MaterialProperty &_material_properties; dealii::Portable::MatrixFree _matrix_free; Kokkos::View _liquid_ratio; Kokkos::View _powder_ratio; Kokkos::View _material_id; Kokkos::View _inv_rho_cp; Kokkos::View _deposition_cos; Kokkos::View _deposition_sin; std::map::cell_iterator, std::vector> _cell_it_to_mf_pos; std::shared_ptr> _inverse_mass_matrix; std::map::cell_iterator, double> _inv_rho_cp_cells; }; template inline dealii::types::global_dof_index ThermalOperatorDevice::m() const { return _m; } template inline dealii::types::global_dof_index ThermalOperatorDevice::n() const { // Operator must be square return _m; } template inline std::shared_ptr> ThermalOperatorDevice::get_inverse_mass_matrix() const { return _inverse_mass_matrix; } template inline dealii::Portable::MatrixFree const & ThermalOperatorDevice::get_matrix_free() const { return _matrix_free; } template inline double ThermalOperatorDevice:: get_inv_rho_cp(typename dealii::DoFHandler::cell_iterator const &cell, unsigned int) const { auto inv_rho_cp = _inv_rho_cp_cells.find(cell); ASSERT(inv_rho_cp != _inv_rho_cp_cells.end(), "Internal error"); return inv_rho_cp->second; } } // namespace adamantine #endif