9#include <kernel/backend.hpp>
10#include <kernel/voxel_assembly/voxel_assembly_common.hpp>
11#include <kernel/voxel_assembly/helper/data_handler.hpp>
12#include <kernel/voxel_assembly/helper/space_helper.hpp>
13#include <kernel/cubature/rule.hpp>
14#include <kernel/lafem/sparse_matrix_csr.hpp>
15#include <kernel/trafo/standard/mapping.hpp>
16#include <kernel/geometry/conformal_mesh.hpp>
17#include <kernel/util/tiny_algebra.hpp>
20#include <kernel/util/cuda_util.hpp>
25 namespace VoxelAssembly
37 template<
typename Space_,
typename DT_,
typename IT_>
46 template<
typename SpaceHelp_,
typename LocMatType_,
int dim_,
int num_verts_>
48 const typename SpaceHelp_::DomainPointType* cub_pt,
const typename SpaceHelp_::DataType* cub_wg,
const int num_cubs)
50 typedef SpaceHelp_ SpaceHelp;
52 typedef typename SpaceHelp::SpaceType SpaceType;
53 typedef typename SpaceHelp::DataType DataType;
56 constexpr int num_loc_dofs = SpaceType::DofMappingType::dof_count;
60 typename SpaceHelp::JacobianMatrixType loc_jac, loc_jac_inv;
61 typename SpaceHelp::DomainPointType
dom_point;
62 typename SpaceHelp::EvalData basis_data;
66 for(
int cub_ind = 0; cub_ind < num_cubs; ++cub_ind)
70 SpaceHelp::calc_jac_mat(loc_jac,
dom_point, local_coeffs);
71 loc_jac_inv.set_inverse(loc_jac);
74 SpaceHelp::eval_ref_gradients(basis_data,
dom_point);
75 SpaceHelp::trans_gradients(basis_data, loc_jac_inv);
77 for(
int i = 0; i < num_loc_dofs; ++i)
79 for(
int j = 0; j < num_loc_dofs; ++j)
96 template<
typename Space_,
typename DT_,
typename IT_>
97 void assemble_poisson_csr(
const Space_& space,
98 const CSRMatrixData<DT_, IT_>& matrix_data,
99 const AssemblyCubatureData<DT_>& cubature,
100 const AssemblyMappingData<DT_, IT_>& dof_mapping,
101 const std::vector<int*>& coloring_maps,
102 const std::vector<Index>& coloring_map_sizes,
107 template<
typename Space_,
typename DT_,
typename IT_>
108 void assemble_poisson_csr_host(
const Space_& space,
109 const CSRMatrixData<DT_, IT_>& matrix_data,
110 const AssemblyCubatureData<DT_>& cubature,
111 const AssemblyMappingData<DT_, IT_>& dof_mapping,
112 const std::vector<int*>& coloring_maps,
113 const std::vector<Index>& coloring_map_sizes,
121 template<
int dim_,
typename DT_,
typename IT_>
129 typedef typename SpaceHelp::ShapeType ShapeType;
130 typedef typename SpaceHelp::DataType DataType;
131 typedef typename SpaceHelp::IndexType IndexType;
134 static constexpr int dim = SpaceHelp::dim;
136 typedef typename SpaceHelp::DomainPointType DomainPointType;
137 typedef typename SpaceHelp::ImagePointType ImagePointType;
138 typedef typename SpaceHelp::ValueType ValueType;
139 typedef typename SpaceHelp::JacobianMatrixType JacobianMatrixType;
148 template<
typename ColoringType_>
150 mesh_data(space, coloring, hint)
152 #ifdef FEAT_HAVE_CUDA
154 const std::size_t stack_limit = Util::cuda_get_max_cache_thread();
155 const std::size_t stack_limit_target =
sizeof(DataType) * (dim == 3 ? 8096u : 1012u);
156 if(stack_limit < stack_limit_target)
157 Util::cuda_set_max_cache_thread(stack_limit_target);
173 template<
typename CubatureFactory_>
176 XASSERTM(matrix.
rows() == space.get_num_dofs(),
"invalid matrix dimensions");
177 XASSERTM(matrix.
columns() == space.get_num_dofs(),
"invalid matrix dimensions");
181 CubatureRuleType cubature(Cubature::ctor_factory, cubature_factory);
184 int num_cubs = cubature.get_num_points();
185 typename CubatureRuleType::PointType* cub_pt = cubature.get_points();
186 DataType* cub_wg = cubature.get_weights();
188 BACKEND_SKELETON_VOID(assemble_matrix1_cuda, assemble_matrix1_generic, assemble_matrix1_generic, matrix, space, cub_pt, cub_wg, num_cubs, alpha)
192 void assemble_matrix1_generic(LAFEM::SparseMatrixCSR<DataType, IndexType>& matrix,
const SpaceType& space,
typename Cubature::Rule<ShapeType, DataType, DataType>::PointType* cub_pt,
const DataType* cub_wg,
int num_cubs, DataType alpha)
const
194 CSRMatrixData<DataType, IndexType> mat_data = {matrix.val(), matrix.row_ptr(), matrix.col_ind(), matrix.rows(), matrix.columns()};
196 AssemblyCubatureData<DataType> cub_data = {(
void*)cub_pt, cub_wg, num_cubs};
197 AssemblyMappingData<DataType, IndexType> mapping_data = mesh_data.get_assembly_field();
200 VoxelAssembly::Arch::assemble_poisson_csr_host(space, mat_data, cub_data, mapping_data, mesh_data.get_coloring_maps(), mesh_data.get_color_map_sizes(), alpha);
203 #ifdef FEAT_HAVE_CUDA
204 void assemble_matrix1_cuda(LAFEM::SparseMatrixCSR<DataType, IndexType>& matrix,
const SpaceType& space,
typename Cubature::Rule<ShapeType, DataType, DataType>::PointType* cub_pt,
const DataType* cub_wg,
int num_cubs, DataType alpha)
const
206 VoxelAssembly::CSRMatrixData<DataType, IndexType> mat_data = {matrix.val(), matrix.row_ptr(), matrix.col_ind(), matrix.rows(), matrix.columns()};
208 typedef typename Cubature::Rule<ShapeType, DataType, DataType>::PointType CubPointType;
210 void* cub_pt_device = Util::cuda_malloc(std::size_t(num_cubs) *
sizeof(CubPointType));
211 Util::cuda_copy_host_to_device(cub_pt_device, (
void*)cub_pt, std::size_t(num_cubs) *
sizeof(CubPointType));
213 void* cub_wg_device = Util::cuda_malloc(std::size_t(num_cubs) *
sizeof(DataType));
214 Util::cuda_copy_host_to_device(cub_wg_device, (
const void*)cub_wg, std::size_t(num_cubs) *
sizeof(DataType));
216 VoxelAssembly::AssemblyCubatureData<DataType> d_cub_data = {cub_pt_device, (DataType*)cub_wg_device, num_cubs};
217 VoxelAssembly::AssemblyMappingData<DataType, IndexType> d_mapping_data = mesh_data.get_assembly_field();
220 VoxelAssembly::Arch::assemble_poisson_csr(space, mat_data, d_cub_data, d_mapping_data, mesh_data.get_coloring_maps(), mesh_data.get_color_map_sizes(), alpha);
222 Util::cuda_free(cub_wg_device);
223 Util::cuda_free(cub_pt_device);
227 void assemble_matrix1_cuda(LAFEM::SparseMatrixCSR<DataType, IndexType>& DOXY(matrix),
const SpaceType& DOXY(space),
typename Cubature::Rule<ShapeType, DataType, DataType>::PointType* DOXY(cub_pt),
const DataType* DOXY(cub_wg),
int DOXY(num_cubs), DataType DOXY(alpha))
const
229 XABORTM(
"What in the nine hells are you doing here?");
#define XABORTM(msg)
Abortion macro definition with custom message.
#define XASSERTM(expr, msg)
Assertion macro definition with custom message.
Cubature Rule class template.
Index rows() const
Retrieve matrix row count.
Index columns() const
Retrieve matrix column count.
Standard Lagrange-2 Finite-Element space class template.
Tiny Matrix class template.
Data handler for Lagrange based FE spaces.
Q2StandardHyperCube< dim_ > SpaceType
typedefs
DataHandler mesh_data
The datahandler.
Poisson Voxel Assembly template.
CUDA_HOST_DEVICE T_ dot(const T_ &a, const T_ &b)
Computes the dot-product of two scalars.
CUDA_HOST_DEVICE void axpy(T_ &y, const T_ &x, const T_ &alpha)
Performs an AXPY of two scalars.
@ dom_point
specifies whether the trafo should supply domain point coordinates
@ jac_det
specifies whether the trafo should supply jacobian determinants