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);
201 velocity.zero_out_ghost_values();
205 reinit_cell(IntegratorCell & integrator)
const
207 tau = integrator.read_cell_data(array_penalty_parameter);
213 inline DEAL_II_ALWAYS_INLINE
215 get_volume_flux(IntegratorCell
const & integrator,
unsigned int const q)
const
217 return tau * integrator.get_divergence(q);
221 dealii::MatrixFree<dim, Number>
const * matrix_free;
223 unsigned int dof_index;
224 unsigned int quad_index;
228 dealii::AlignedVector<scalar> array_penalty_parameter;
246class DivergencePenaltyOperator
249 typedef DivergencePenaltyOperator<dim, Number> This;
251 typedef dealii::LinearAlgebra::distributed::Vector<Number> VectorType;
253 typedef std::pair<unsigned int, unsigned int> Range;
255 typedef CellIntegrator<dim, dim, Number> IntegratorCell;
260 DivergencePenaltyOperator();
263 initialize(dealii::MatrixFree<dim, Number>
const & matrix_free,
265 std::shared_ptr<Kernel>
const kernel);
268 update(VectorType
const & velocity);
271 apply(VectorType & dst, VectorType
const & src)
const;
274 apply_add(VectorType & dst, VectorType
const & src)
const;
278 cell_loop(dealii::MatrixFree<dim, Number>
const & matrix_free,
280 VectorType
const & src,
281 Range
const & range)
const;
284 do_cell_integral(IntegratorCell & integrator)
const;
286 dealii::MatrixFree<dim, Number>
const * matrix_free;
290 std::shared_ptr<Operators::DivergencePenaltyKernel<dim, Number>> kernel;