FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
poisson_assembler.cpp
1// FEAT3: Finite Element Analysis Toolbox, Version 3
2// Copyright (C) 2010 by Stefan Turek & the FEAT group
3// FEAT3 is released under the GNU General Public License version 3,
4// see the file 'copyright.txt' in the top level directory for details.
5
6#include <kernel/voxel_assembly/poisson_assembler.hpp>
7#include <kernel/lafem/matrix_gather_scatter_helper.hpp>
8
9namespace FEAT
10{
11 namespace VoxelAssembly
12 {
13 namespace Kernel
14 {
15
16 template<typename Space_, typename DT_, typename IT_, FEAT::Intern::MatrixGatherScatterPolicy pol_ = FEAT::Intern::MatrixGatherScatterPolicy::useLocalOps>
17 void poisson_assembler_matrix1_csr_host(DT_* matrix_data,
18 const IT_* matrix_row_ptr, const IT_* matrix_col_idx, Index matrix_num_rows, Index matrix_num_cols,
20 const DT_* cub_wg, int num_cubs, DT_ alpha,
21 const IT_* cell_to_dof, [[maybe_unused]] Index cell_num,
22 const Tiny::Vector<DT_, Space_::world_dim>* nodes, [[maybe_unused]] Index node_size,
23 const int* coloring_map, Index coloring_size,
24 const IT_* cell_to_dof_sorter)
25 {
26 // define types
27 typedef Space_ SpaceType;
28 typedef DT_ DataType;
29 typedef IT_ IndexType;
30
32
33 constexpr int dim = SpaceHelp::dim;
34
35 // define local sizes
36 constexpr int num_loc_dofs = SpaceType::DofMappingType::dof_count;
37 // get number of nodes per element
38 constexpr int num_loc_verts = SpaceType::MeshType::template IndexSet<dim, 0>::Type::num_indices;
39 // Our local matrix type
41
42
43 FEAT_PRAGMA_OMP(parallel for)
44 for(Index idx = 0; idx < coloring_size; ++idx)
45 {
46 // define local coefficients
48 // and local matrix
50 // now do work for this cell
51 IndexType cell = IndexType(coloring_map[idx]);
52 // std::cout << "Starting with cell " << cell << "\n";
53 const IndexSetWrapper<IndexType> local_dofs_w{cell_to_dof, IndexType(num_loc_dofs)};
54 const IndexType* local_dofs = cell_to_dof + cell*num_loc_dofs;
55 const IndexType* local_dof_sorter = cell_to_dof_sorter + cell*num_loc_dofs;
56
57 SpaceHelp::set_coefficients(local_coeffs, local_dofs_w, nodes, cell);
58
59 // To minimize code repetition, we call the same kernel from cuda and non cuda build...
60 VoxelAssembly::Kernel::poisson_assembly_kernel<SpaceHelp, LocMatType>(loc_mat, local_coeffs, cub_pt, cub_wg, num_cubs);
61
62 // scatter
63 LAFEM::template MatrixGatherScatterHelper<SpaceType, DataType, IndexType, pol_>::scatter_matrix_csr(loc_mat, matrix_data, local_dofs, local_dofs, IndexType(matrix_num_rows), IndexType(matrix_num_cols), matrix_row_ptr, matrix_col_idx, alpha, local_dof_sorter);
64 }
65
66
67 }
68 }
69
70 namespace Arch
71 {
72 template<typename Space_, typename DT_, typename IT_>
73 void assemble_poisson_csr_host([[maybe_unused]] const Space_& space,
74 const CSRMatrixData<DT_, IT_>& matrix_data,
75 const AssemblyCubatureData<DT_>& cubature,
76 const AssemblyMappingData<DT_, IT_>& dof_mapping,
77 const std::vector<int*>& coloring_maps,
78 const std::vector<Index>& coloring_map_sizes,
79 DT_ alpha)
80 {
81 for(Index col = 0; col < Index(coloring_maps.size()); ++col)
82 {
83 VoxelAssembly::Kernel::template poisson_assembler_matrix1_csr_host<Space_, DT_, IT_, FEAT::Intern::MatrixGatherScatterPolicy::useLocalSortHelper>(
84 matrix_data.data, matrix_data.row_ptr, matrix_data.col_idx, matrix_data.num_rows, matrix_data.num_cols,
85 (const typename Tiny::Vector<DT_, Space_::world_dim>*) cubature.cub_pt,
86 cubature.cub_wg, cubature.num_cubs, alpha, dof_mapping.cell_to_dof, dof_mapping.cell_num,
87 (const typename Tiny::Vector<DT_, Space_::world_dim>*) dof_mapping.nodes, dof_mapping.node_size,
88 (const int*) coloring_maps[col], coloring_map_sizes[col], dof_mapping.cell_to_dof_sorter
89 );
90 }
91 }
92 }
93 }
94}
95
96//instantiate the templates
97using namespace FEAT;
98using namespace FEAT::VoxelAssembly;
99
100
101/*--------------------Poisson Assembler Q2Quad-------------------------------------------------*/
102template void Arch::assemble_poisson_csr_host(const Q2StandardQuad&, const CSRMatrixData<double, std::uint32_t>&, const AssemblyCubatureData<double>&, const AssemblyMappingData<double, std::uint32_t>&,
103 const std::vector<int*>&, const std::vector<Index>&, double);
104template void Arch::assemble_poisson_csr_host(const Q2StandardQuad&, const CSRMatrixData<float, std::uint32_t>&, const AssemblyCubatureData<float>&, const AssemblyMappingData<float, std::uint32_t>&,
105 const std::vector<int*>&, const std::vector<Index>&, float);
106template void Arch::assemble_poisson_csr_host(const Q2StandardQuad&, const CSRMatrixData<double, std::uint64_t>&, const AssemblyCubatureData<double>&, const AssemblyMappingData<double, std::uint64_t>&,
107 const std::vector<int*>&, const std::vector<Index>&, double);
108template void Arch::assemble_poisson_csr_host(const Q2StandardQuad&, const CSRMatrixData<float, std::uint64_t>&, const AssemblyCubatureData<float>&, const AssemblyMappingData<float, std::uint64_t>&,
109 const std::vector<int*>&, const std::vector<Index>&, float);
110
111
112/*---------------------Poisson Assembler Q2Hexa------------------------------------------------------*/
113template void Arch::assemble_poisson_csr_host(const Q2StandardHexa&, const CSRMatrixData<double, std::uint32_t>&, const AssemblyCubatureData<double>&, const AssemblyMappingData<double, std::uint32_t>&,
114 const std::vector<int*>&, const std::vector<Index>&, double);
115template void Arch::assemble_poisson_csr_host(const Q2StandardHexa&, const CSRMatrixData<float, std::uint32_t>&, const AssemblyCubatureData<float>&, const AssemblyMappingData<float, std::uint32_t>&,
116 const std::vector<int*>&, const std::vector<Index>&, float);
117template void Arch::assemble_poisson_csr_host(const Q2StandardHexa&, const CSRMatrixData<double, std::uint64_t>&, const AssemblyCubatureData<double>&, const AssemblyMappingData<double, std::uint64_t>&,
118 const std::vector<int*>&, const std::vector<Index>&, double);
119template void Arch::assemble_poisson_csr_host(const Q2StandardHexa&, const CSRMatrixData<float, std::uint64_t>&, const AssemblyCubatureData<float>&, const AssemblyMappingData<float, std::uint64_t>&,
120 const std::vector<int*>&, const std::vector<Index>&, float);
Standard Lagrange-2 Finite-Element space class template.
Definition: element.hpp:39
Tiny Matrix class template.
Tiny Vector class template.
Namespace for different voxel based assembly methods.
FEAT namespace.
Definition: adjactor.hpp:12
std::uint64_t Index
Index data type.
const void * cub_pt
The cubature point data array.
A data field for all necessary values that define the dof mapping for assembly.
const IT_ * cell_to_dof
The cell to dof, where cell_to_dof[i],..., cell_to_dof[i+cell_dofs-1] are the dofs of one cell.
const IT_ * cell_to_dof_sorter
Array of sortingindices of cell_to_dof.
const void * nodes
An array of the nodes fitting to the cell_to_dof mapping.