FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
defo_assembler.hpp
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#pragma once
7
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_bcsr.hpp>
15#include <kernel/trafo/standard/mapping.hpp>
16#include <kernel/geometry/conformal_mesh.hpp>
17#include <kernel/util/tiny_algebra.hpp>
18
19#ifdef FEAT_HAVE_CUDA
20#include <kernel/util/cuda_util.hpp>
21#endif
22
23namespace FEAT
24{
25 namespace VoxelAssembly
26 {
36 template<typename Space_, typename DT_, typename IT_>
37 class VoxelDefoAssembler DOXY({});
38
39 namespace Kernel
40 {
41 template<typename SpaceHelp_, typename LocMatType_, int dim_, int num_verts_>
42 CUDA_HOST_DEVICE void defo_assembly_kernel(LocMatType_& loc_mat, const Tiny::Matrix<typename SpaceHelp_::DataType, dim_, num_verts_>& local_coeffs,
43 const typename SpaceHelp_::DomainPointType* cub_pt, const typename SpaceHelp_::DataType* cub_wg, const int num_cubs,
44 const typename SpaceHelp_::DataType nu)
45 {
46 typedef SpaceHelp_ SpaceHelp;
47 // constexpr int dim = SpaceHelp::dim;
48 typedef typename SpaceHelp::SpaceType SpaceType;
49 typedef typename SpaceHelp::DataType DataType;
50
51 //define local sizes
52 constexpr int num_loc_dofs = SpaceType::DofMappingType::dof_count;
53 //get number of nodes per element
54 // constexpr int num_loc_verts = SpaceType::MeshType::template IndexSet<dim, 0>::Type::num_indices;
55 // define local arrays
56 typename SpaceHelp::JacobianMatrixType loc_jac, loc_jac_inv;
57 typename SpaceHelp::DomainPointType dom_point;
58 typename SpaceHelp::EvalData basis_data;
59
60 loc_mat.format();
61 for(int cub_ind = 0; cub_ind < num_cubs; ++cub_ind)
62 {
63 dom_point = cub_pt[cub_ind];
64 // NewSpaceHelp::map_point(img_point, dom_point, local_coeffs);
65 SpaceHelp::calc_jac_mat(loc_jac, dom_point, local_coeffs);
66 loc_jac_inv.set_inverse(loc_jac);
67
68 SpaceHelp::eval_ref_gradients(basis_data, dom_point);
69 SpaceHelp::trans_gradients(basis_data, loc_jac_inv);
70
71 const DataType weight = loc_jac.det() * cub_wg[cub_ind];
72 for(int i = 0; i < num_loc_dofs; ++i)
73 {
74 for(int j = 0; j < num_loc_dofs; ++j)
75 {
76 //now assemble outer and inner products
77 loc_mat[i][j].add_scalar_main_diag(nu * weight * Tiny::dot(basis_data.phi[i].grad, basis_data.phi[j].grad));
78 loc_mat[i][j].add_outer_product(basis_data.phi[j].grad, basis_data.phi[i].grad, nu * weight);
79 }
80 }
81
82 }
83
84 }
85 }
86
87 namespace Arch
88 {
89 #ifdef FEAT_HAVE_CUDA
90 template<typename Space_, typename DT_, typename IT_>
91 void assemble_defo_csr(const Space_& space,
92 const CSRMatrixData<DT_, IT_>& matrix_data,
93 const AssemblyCubatureData<DT_>& cubature,
94 const AssemblyMappingData<DT_, IT_>& dof_mapping,
95 const std::vector<int*>& coloring_maps,
96 const std::vector<Index>& coloring_map_sizes,
97 DT_ alpha, DT_ nu
98 );
99 #endif
100
101 template<typename Space_, typename DT_, typename IT_>
102 void assemble_defo_csr_host(const Space_& space,
103 const CSRMatrixData<DT_, IT_>& matrix_data,
104 const AssemblyCubatureData<DT_>& cubature,
105 const AssemblyMappingData<DT_, IT_>& dof_mapping,
106 const std::vector<int*>& coloring_maps,
107 const std::vector<Index>& coloring_map_sizes,
108 DT_ alpha, DT_ nu
109 );
110 }
111
112#ifndef __CUDACC__
113 //specialize for Q2Lagrange with standard Trafo
114 template<int dim_, typename DT_, typename IT_>
116 {
117 public:
122 typedef typename SpaceHelp::ShapeType ShapeType;
123 typedef typename SpaceHelp::DataType DataType;
124 typedef typename SpaceHelp::IndexType IndexType;
125
127 static constexpr int dim = SpaceHelp::dim;
128
129 typedef typename SpaceHelp::DomainPointType DomainPointType;
130 typedef typename SpaceHelp::ImagePointType ImagePointType;
131 typedef typename SpaceHelp::ValueType ValueType;
132 typedef typename SpaceHelp::JacobianMatrixType JacobianMatrixType;
133
136
138 DataType nu;
139
140
141 public:
142 explicit VoxelDefoAssembler() = default;
143
144 template<typename ColoringType_>
145 explicit VoxelDefoAssembler(const SpaceType& space, const ColoringType_& coloring, int hint = -1) :
146 mesh_data(space, coloring, hint), nu(DataType(0.))
147 {
148 #ifdef FEAT_HAVE_CUDA
149 #ifdef DEBUG
150 const std::size_t stack_limit = Util::cuda_get_max_cache_thread();
151 const std::size_t stack_limit_target = sizeof(DataType) * (dim == 3 ? 8096u : 1012u);
152 if(stack_limit < stack_limit_target)
153 Util::cuda_set_max_cache_thread(stack_limit_target);
154 #endif
155 #endif
156 }
157
158 // rule of 5
159 VoxelDefoAssembler(const VoxelDefoAssembler&) = delete;
160
161 VoxelDefoAssembler& operator=(const VoxelDefoAssembler&) = delete;
162
164
165 VoxelDefoAssembler& operator=(VoxelDefoAssembler&&) = delete;
166
168
169
170 template<typename CubatureFactory_>
171 void assemble_matrix1(LAFEM::SparseMatrixBCSR<DataType, IndexType, dim, dim>& matrix, const SpaceType& space, const CubatureFactory_& cubature_factory, DataType alpha = DataType(1)) const
172 {
173 XASSERTM(matrix.rows() == space.get_num_dofs(), "invalid matrix dimensions");
174 XASSERTM(matrix.columns() == space.get_num_dofs(), "invalid matrix dimensions");
175
176 //define cubature
177 typedef Cubature::Rule<ShapeType, DataType, DataType> CubatureRuleType;
178 CubatureRuleType cubature(Cubature::ctor_factory, cubature_factory);
179
180 //get cubature points and weights
181 int num_cubs = cubature.get_num_points();
182 typename CubatureRuleType::PointType* cub_pt = cubature.get_points();
183 DataType* cub_wg = cubature.get_weights();
184
185 BACKEND_SKELETON_VOID(assemble_matrix1_cuda, assemble_matrix1_generic, assemble_matrix1_generic, matrix, space, cub_pt, cub_wg, num_cubs, alpha)
186 }
187
188
189 void assemble_matrix1_generic(LAFEM::SparseMatrixBCSR<DataType, IndexType, dim, dim>& matrix, const SpaceType& space, typename Cubature::Rule<ShapeType, DataType, DataType>::PointType* cub_pt, const DataType* cub_wg, int num_cubs, DataType alpha) const
190 {
191 CSRMatrixData<DataType, IndexType> mat_data = {matrix.template val<LAFEM::Perspective::pod>(), matrix.row_ptr(), matrix.col_ind(), matrix.rows(), matrix.columns()};
192
193 AssemblyCubatureData<DataType> cub_data = {(void*)cub_pt, cub_wg, num_cubs};
194 AssemblyMappingData<DataType, IndexType> mapping_data = mesh_data.get_assembly_field();
195
196
197 VoxelAssembly::Arch::assemble_defo_csr_host(space, mat_data, cub_data, mapping_data, mesh_data.get_coloring_maps(), mesh_data.get_color_map_sizes(), alpha, nu);
198 }
199
200 #ifdef FEAT_HAVE_CUDA
201 void assemble_matrix1_cuda(LAFEM::SparseMatrixBCSR<DataType, IndexType, dim, dim>& matrix, const SpaceType& space, typename Cubature::Rule<ShapeType, DataType, DataType>::PointType* cub_pt, const DataType* cub_wg, int num_cubs, DataType alpha) const
202 {
203 VoxelAssembly::CSRMatrixData<DataType, IndexType> mat_data = {matrix.template val<LAFEM::Perspective::pod>(), matrix.row_ptr(), matrix.col_ind(), matrix.rows(), matrix.columns()};
204
205 typedef typename Cubature::Rule<ShapeType, DataType, DataType>::PointType CubPointType;
206 //initialize all necessary pointer arrays and values //maybe more sense to specify cubature rule and set this to a const mem location?
207 void* cub_pt_device = Util::cuda_malloc(num_cubs * sizeof(CubPointType));
208 Util::cuda_copy_host_to_device(cub_pt_device, (void*)cub_pt, num_cubs * sizeof(CubPointType));
209
210 void* cub_wg_device = Util::cuda_malloc(num_cubs * sizeof(DataType));
211 Util::cuda_copy_host_to_device(cub_wg_device, (void*)cub_wg, num_cubs * sizeof(DataType));
212
213 VoxelAssembly::AssemblyCubatureData<DataType> d_cub_data = {cub_pt_device, (DataType*)cub_wg_device, num_cubs};
214 VoxelAssembly::AssemblyMappingData<DataType, IndexType> d_mapping_data = mesh_data.get_assembly_field();
215
216
217 VoxelAssembly::Arch::assemble_defo_csr(space, mat_data, d_cub_data, d_mapping_data, mesh_data.get_coloring_maps(), mesh_data.get_color_map_sizes(), alpha, nu);
218 //free resources
219 Util::cuda_free(cub_wg_device);
220 Util::cuda_free(cub_pt_device);
221 }
222
223 #else //FEAT_HAVE_CUDA
224 void assemble_matrix1_cuda(LAFEM::SparseMatrixBCSR<DataType, IndexType, dim, dim>& 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
225 {
226 XABORTM("What in the nine hells are you doing here?");
227 }
228 #endif
229
230 }; //class GPUPoissonAssembler
231
232 #endif // __CUDACC__
233
234
235 }
236}
#define XABORTM(msg)
Abortion macro definition with custom message.
Definition: assertion.hpp:192
#define XASSERTM(expr, msg)
Assertion macro definition with custom message.
Definition: assertion.hpp:263
FEAT Kernel base header.
Cubature Rule class template.
Definition: rule.hpp:38
CSR based blocked sparse matrix.
Index rows() const
Retrieve matrix row count.
Index columns() const
Retrieve matrix column count.
Standard Lagrange-2 Finite-Element space class template.
Definition: element.hpp:39
Tiny Matrix class template.
Data handler for Lagrange based FE spaces.
Deformation Voxel Assembly template.
CUDA_HOST_DEVICE T_ dot(const T_ &a, const T_ &b)
Computes the dot-product of two scalars.
FEAT namespace.
Definition: adjactor.hpp:12
@ dom_point
specifies whether the trafo should supply domain point coordinates