83class DivergencePenaltyKernel
86 typedef CellIntegrator<dim, dim, Number> IntegratorCell;
88 typedef dealii::LinearAlgebra::distributed::Vector<Number> VectorType;
90 typedef dealii::VectorizedArray<Number> scalar;
93 DivergencePenaltyKernel()
94 : matrix_free(
nullptr), dof_index(0), quad_index(0), array_penalty_parameter(0)
99 reinit(dealii::MatrixFree<dim, Number>
const & matrix_free,
100 unsigned int const dof_index,
101 unsigned int const quad_index,
104 this->matrix_free = &matrix_free;
106 this->dof_index = dof_index;
107 this->quad_index = quad_index;
111 unsigned int n_cells = matrix_free.n_cell_batches() + matrix_free.n_ghost_cell_batches();
112 array_penalty_parameter.resize(n_cells);
122 get_integrator_flags()
const
126 flags.cell_evaluate = dealii::EvaluationFlags::gradients;
127 flags.cell_integrate = dealii::EvaluationFlags::gradients;
139 flags.cells = dealii::update_JxW_values | dealii::update_gradients;
147 calculate_penalty_parameter(VectorType
const & velocity)
149 velocity.update_ghost_values();
151 IntegratorCell integrator(*matrix_free, dof_index, quad_index);
153 dealii::AlignedVector<scalar> JxW_values(integrator.n_q_points);
155 ElementType
const element_type =
156 get_element_type(matrix_free->get_dof_handler(dof_index).get_triangulation());
158 unsigned int n_cells = matrix_free->n_cell_batches() + matrix_free->n_ghost_cell_batches();
159 for(
unsigned int cell = 0; cell < n_cells; ++cell)
161 scalar tau_convective = dealii::make_vectorized_array<Number>(0.0);
162 scalar tau_viscous = dealii::make_vectorized_array<Number>(data.viscosity);
164 if(data.type_penalty_parameter == TypePenaltyParameter::ConvectiveTerm or
165 data.type_penalty_parameter == TypePenaltyParameter::ViscousAndConvectiveTerms)
167 integrator.reinit(cell);
168 integrator.read_dof_values(velocity);
169 integrator.evaluate(dealii::EvaluationFlags::values);
171 scalar volume = dealii::make_vectorized_array<Number>(0.0);
172 scalar norm_U_mean = dealii::make_vectorized_array<Number>(0.0);
173 for(
unsigned int q = 0; q < integrator.n_q_points; ++q)
175 volume += integrator.JxW(q);
176 norm_U_mean += integrator.JxW(q) * integrator.get_value(q).norm();
178 norm_U_mean /= volume;
183 tau_convective = norm_U_mean * h_eff;
186 if(data.type_penalty_parameter == TypePenaltyParameter::ConvectiveTerm)
188 array_penalty_parameter[cell] = data.penalty_factor * tau_convective;
190 else if(data.type_penalty_parameter == TypePenaltyParameter::ViscousTerm)
192 array_penalty_parameter[cell] = data.penalty_factor * tau_viscous;
194 else if(data.type_penalty_parameter == TypePenaltyParameter::ViscousAndConvectiveTerms)
196 array_penalty_parameter[cell] = data.penalty_factor * (tau_convective + tau_viscous);
202 reinit_cell(IntegratorCell & integrator)
const
204 tau = integrator.read_cell_data(array_penalty_parameter);
210 inline DEAL_II_ALWAYS_INLINE
212 get_volume_flux(IntegratorCell
const & integrator,
unsigned int const q)
const
214 return tau * integrator.get_divergence(q);
218 dealii::MatrixFree<dim, Number>
const * matrix_free;
220 unsigned int dof_index;
221 unsigned int quad_index;
225 dealii::AlignedVector<scalar> array_penalty_parameter;
243class DivergencePenaltyOperator
246 typedef DivergencePenaltyOperator<dim, Number> This;
248 typedef dealii::LinearAlgebra::distributed::Vector<Number> VectorType;
250 typedef std::pair<unsigned int, unsigned int> Range;
252 typedef CellIntegrator<dim, dim, Number> IntegratorCell;
257 DivergencePenaltyOperator();
260 initialize(dealii::MatrixFree<dim, Number>
const & matrix_free,
262 std::shared_ptr<Kernel>
const kernel);
265 update(VectorType
const & velocity);
268 apply(VectorType & dst, VectorType
const & src)
const;
271 apply_add(VectorType & dst, VectorType
const & src)
const;
275 cell_loop(dealii::MatrixFree<dim, Number>
const & matrix_free,
277 VectorType
const & src,
278 Range
const & range)
const;
281 do_cell_integral(IntegratorCell & integrator)
const;
283 dealii::MatrixFree<dim, Number>
const * matrix_free;
287 std::shared_ptr<Operators::DivergencePenaltyKernel<dim, Number>> kernel;