84class DivergencePenaltyKernel
87 typedef CellIntegrator<dim, dim, Number> IntegratorCell;
89 typedef dealii::LinearAlgebra::distributed::Vector<Number> VectorType;
91 typedef dealii::VectorizedArray<Number> scalar;
94 DivergencePenaltyKernel()
95 : matrix_free(
nullptr), dof_index(0), quad_index(0), array_penalty_parameter(0)
100 reinit(dealii::MatrixFree<dim, Number>
const & matrix_free,
101 unsigned int const dof_index,
102 unsigned int const quad_index,
105 this->matrix_free = &matrix_free;
107 this->dof_index = dof_index;
108 this->quad_index = quad_index;
112 unsigned int n_cells = matrix_free.n_cell_batches() + matrix_free.n_ghost_cell_batches();
113 array_penalty_parameter.resize(n_cells);
123 get_integrator_flags()
const
127 flags.cell_evaluate = dealii::EvaluationFlags::gradients;
128 flags.cell_integrate = dealii::EvaluationFlags::gradients;
140 flags.cells = dealii::update_JxW_values | dealii::update_gradients;
148 calculate_penalty_parameter(VectorType
const & velocity)
150 velocity.update_ghost_values();
152 IntegratorCell integrator(*matrix_free, dof_index, quad_index);
154 dealii::AlignedVector<scalar> JxW_values(integrator.n_q_points);
156 ElementType
const element_type =
157 get_element_type(matrix_free->get_dof_handler(dof_index).get_triangulation());
159 unsigned int n_cells = matrix_free->n_cell_batches() + matrix_free->n_ghost_cell_batches();
160 for(
unsigned int cell = 0; cell < n_cells; ++cell)
162 scalar tau_convective = dealii::make_vectorized_array<Number>(0.0);
163 scalar tau_viscous = dealii::make_vectorized_array<Number>(data.viscosity);
165 if(data.type_penalty_parameter == TypePenaltyParameter::ConvectiveTerm or
166 data.type_penalty_parameter == TypePenaltyParameter::ViscousAndConvectiveTerms)
168 integrator.reinit(cell);
169 integrator.read_dof_values(velocity);
170 integrator.evaluate(dealii::EvaluationFlags::values);
172 scalar volume = dealii::make_vectorized_array<Number>(0.0);
173 scalar norm_U_mean = dealii::make_vectorized_array<Number>(0.0);
174 for(
unsigned int q = 0; q < integrator.n_q_points; ++q)
176 volume += integrator.JxW(q);
177 norm_U_mean += integrator.JxW(q) * integrator.get_value(q).norm();
179 norm_U_mean /= volume;
184 tau_convective = norm_U_mean * h_eff;
187 if(data.type_penalty_parameter == TypePenaltyParameter::ConvectiveTerm)
189 array_penalty_parameter[cell] = data.penalty_factor * tau_convective;
191 else if(data.type_penalty_parameter == TypePenaltyParameter::ViscousTerm)
193 array_penalty_parameter[cell] = data.penalty_factor * tau_viscous;
195 else if(data.type_penalty_parameter == TypePenaltyParameter::ViscousAndConvectiveTerms)
197 array_penalty_parameter[cell] = data.penalty_factor * (tau_convective + tau_viscous);
203 reinit_cell(IntegratorCell & integrator)
const
205 tau = integrator.read_cell_data(array_penalty_parameter);
211 inline DEAL_II_ALWAYS_INLINE
213 get_volume_flux(IntegratorCell
const & integrator,
unsigned int const q)
const
215 return tau * integrator.get_divergence(q);
219 dealii::MatrixFree<dim, Number>
const * matrix_free;
221 unsigned int dof_index;
222 unsigned int quad_index;
226 dealii::AlignedVector<scalar> array_penalty_parameter;
244class DivergencePenaltyOperator
247 typedef DivergencePenaltyOperator<dim, Number> This;
249 typedef dealii::LinearAlgebra::distributed::Vector<Number> VectorType;
251 typedef std::pair<unsigned int, unsigned int> Range;
253 typedef CellIntegrator<dim, dim, Number> IntegratorCell;
258 DivergencePenaltyOperator();
261 initialize(dealii::MatrixFree<dim, Number>
const & matrix_free,
263 std::shared_ptr<Kernel>
const kernel);
266 update(VectorType
const & velocity);
269 apply(VectorType & dst, VectorType
const & src)
const;
272 apply_add(VectorType & dst, VectorType
const & src)
const;
276 cell_loop(dealii::MatrixFree<dim, Number>
const & matrix_free,
278 VectorType
const & src,
279 Range
const & range)
const;
282 do_cell_integral(IntegratorCell & integrator)
const;
284 dealii::MatrixFree<dim, Number>
const * matrix_free;
288 std::shared_ptr<Operators::DivergencePenaltyKernel<dim, Number>> kernel;