51 typedef dealii::LinearAlgebra::distributed::Vector<Number> VectorType;
53 typedef dealii::VectorizedArray<Number> scalar;
54 typedef dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> vector;
56 typedef CellIntegrator<dim, 1, Number> IntegratorCell;
57 typedef FaceIntegrator<dim, 1, Number> IntegratorFace;
60 DiffusiveKernel() : degree(1), tau(dealii::make_vectorized_array<Number>(0.0))
65 reinit(dealii::MatrixFree<dim, Number>
const & matrix_free,
67 unsigned int const dof_index)
71 dealii::FiniteElement<dim>
const & fe = matrix_free.get_dof_handler(dof_index).get_fe();
74 calculate_penalty_parameter(matrix_free, dof_index);
76 AssertThrow(data.diffusivity > (0.0 - std::numeric_limits<double>::epsilon()),
77 dealii::ExcMessage(
"Diffusivity is not set!"));
81 calculate_penalty_parameter(dealii::MatrixFree<dim, Number>
const & matrix_free,
82 unsigned int const dof_index)
84 IP::calculate_penalty_parameter<dim, Number>(array_penalty_parameter, matrix_free, dof_index);
88 get_integrator_flags()
const
92 flags.cell_evaluate = dealii::EvaluationFlags::gradients;
93 flags.cell_integrate = dealii::EvaluationFlags::gradients;
95 flags.face_evaluate = dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients;
96 flags.face_integrate = dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients;
102 get_mapping_flags(
bool const compute_interior_face_integrals,
103 bool const compute_boundary_face_integrals)
107 flags.cells = dealii::update_gradients | dealii::update_JxW_values;
108 if(compute_interior_face_integrals)
110 dealii::update_gradients | dealii::update_JxW_values | dealii::update_normal_vectors;
111 if(compute_boundary_face_integrals)
112 flags.boundary_faces = dealii::update_gradients | dealii::update_JxW_values |
113 dealii::update_normal_vectors | dealii::update_quadrature_points;
119 reinit_face(IntegratorFace & integrator_m,
120 IntegratorFace & integrator_p,
121 unsigned int const dof_index)
const
123 tau = std::max(integrator_m.read_cell_data(array_penalty_parameter),
124 integrator_p.read_cell_data(array_penalty_parameter)) *
125 IP::get_penalty_factor<dim, Number>(
128 integrator_m.get_matrix_free().get_dof_handler(dof_index).get_triangulation()),
133 reinit_boundary_face(IntegratorFace & integrator_m,
unsigned int const dof_index)
const
135 tau = integrator_m.read_cell_data(array_penalty_parameter) *
136 IP::get_penalty_factor<dim, Number>(
139 integrator_m.get_matrix_free().get_dof_handler(dof_index).get_triangulation()),
144 reinit_face_cell_based(dealii::types::boundary_id
const boundary_id,
145 IntegratorFace & integrator_m,
146 IntegratorFace & integrator_p,
147 unsigned int const dof_index)
const
149 if(boundary_id == dealii::numbers::internal_face_boundary_id)
151 tau = std::max(integrator_m.read_cell_data(array_penalty_parameter),
152 integrator_p.read_cell_data(array_penalty_parameter)) *
153 IP::get_penalty_factor<dim, Number>(
156 integrator_m.get_matrix_free().get_dof_handler(dof_index).get_triangulation()),
161 tau = integrator_m.read_cell_data(array_penalty_parameter) *
162 IP::get_penalty_factor<dim, Number>(
165 integrator_m.get_matrix_free().get_dof_handler(dof_index).get_triangulation()),
171 inline DEAL_II_ALWAYS_INLINE
173 calculate_gradient_flux(scalar
const & value_m, scalar
const & value_p)
const
175 return -0.5 * data.diffusivity * (value_m - value_p);
183 inline DEAL_II_ALWAYS_INLINE
185 calculate_value_flux(scalar
const & normal_gradient_m,
186 scalar
const & normal_gradient_p,
187 scalar
const & value_m,
188 scalar
const & value_p)
const
190 return data.diffusivity *
191 (0.5 * (normal_gradient_m + normal_gradient_p) - tau * (value_m - value_p));
197 inline DEAL_II_ALWAYS_INLINE
199 get_volume_flux(IntegratorCell & integrator,
unsigned int const q)
const
201 return integrator.get_gradient(q) * data.diffusivity;
209 dealii::AlignedVector<scalar> array_penalty_parameter;
234 typedef OperatorBase<dim, Number, 1> Base;
236 typedef typename Base::IntegratorCell IntegratorCell;
237 typedef typename Base::IntegratorFace IntegratorFace;
239 typedef dealii::VectorizedArray<Number> scalar;
240 typedef dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> vector;
244 initialize(dealii::MatrixFree<dim, Number>
const & matrix_free,
245 dealii::AffineConstraints<Number>
const & affine_constraints,
254 reinit_face_derived(IntegratorFace & integrator_m,
255 IntegratorFace & integrator_p,
256 unsigned int const face)
const final;
259 reinit_boundary_face_derived(IntegratorFace & integrator_m,
unsigned int const face)
const final;
262 reinit_face_cell_based_derived(IntegratorFace & integrator_m,
263 IntegratorFace & integrator_p,
264 unsigned int const cell,
265 unsigned int const face,
266 dealii::types::boundary_id
const boundary_id)
const final;
269 do_cell_integral(IntegratorCell & integrator)
const final;
272 do_face_integral(IntegratorFace & integrator_m, IntegratorFace & integrator_p)
const final;
275 do_face_int_integral(IntegratorFace & integrator_m, IntegratorFace & integrator_p)
const final;
278 do_face_ext_integral(IntegratorFace & integrator_m, IntegratorFace & integrator_p)
const final;
281 do_boundary_integral(IntegratorFace & integrator_m,
282 OperatorType
const & operator_type,
283 dealii::types::boundary_id
const & boundary_id)
const final;
287 std::shared_ptr<Operators::DiffusiveKernel<dim, Number>> kernel;