ExaDG
Loading...
Searching...
No Matches
spatial_operator_base.h
1/* ______________________________________________________________________
2 *
3 * ExaDG - High-Order Discontinuous Galerkin for the Exa-Scale
4 *
5 * Copyright (C) 2021 by the ExaDG authors
6 *
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 * ______________________________________________________________________
20 */
21
22#ifndef EXADG_INCOMPRESSIBLE_NAVIER_STOKES_SPATIAL_DISCRETIZATION_SPATIAL_OPERATOR_BASE_H_
23#define EXADG_INCOMPRESSIBLE_NAVIER_STOKES_SPATIAL_DISCRETIZATION_SPATIAL_OPERATOR_BASE_H_
24
25// deal.II
26#include <deal.II/fe/fe_dgq.h>
27#include <deal.II/fe/fe_raviart_thomas.h>
28#include <deal.II/fe/fe_simplex_p.h>
29#include <deal.II/fe/fe_system.h>
30#include <deal.II/lac/la_parallel_block_vector.h>
31#include <deal.II/lac/la_parallel_vector.h>
32
33
34// ExaDG
35#include <exadg/grid/grid.h>
36#include <exadg/incompressible_navier_stokes/spatial_discretization/calculators/streamfunction_calculator_rhs_operator.h>
37#include <exadg/incompressible_navier_stokes/spatial_discretization/generalized_newtonian_model.h>
38#include <exadg/incompressible_navier_stokes/spatial_discretization/operators/convective_operator.h>
39#include <exadg/incompressible_navier_stokes/spatial_discretization/operators/divergence_operator.h>
40#include <exadg/incompressible_navier_stokes/spatial_discretization/operators/gradient_operator.h>
41#include <exadg/incompressible_navier_stokes/spatial_discretization/operators/momentum_operator.h>
42#include <exadg/incompressible_navier_stokes/spatial_discretization/operators/projection_operator.h>
43#include <exadg/incompressible_navier_stokes/spatial_discretization/operators/rhs_operator.h>
44#include <exadg/incompressible_navier_stokes/spatial_discretization/operators/viscous_operator.h>
45#include <exadg/incompressible_navier_stokes/spatial_discretization/turbulence_model.h>
46#include <exadg/incompressible_navier_stokes/spatial_discretization/viscosity_model_base.h>
47#include <exadg/incompressible_navier_stokes/user_interface/boundary_descriptor.h>
48#include <exadg/incompressible_navier_stokes/user_interface/field_functions.h>
49#include <exadg/incompressible_navier_stokes/user_interface/parameters.h>
50#include <exadg/matrix_free/matrix_free_data.h>
51#include <exadg/operators/inverse_mass_operator.h>
52#include <exadg/operators/mass_operator.h>
53#include <exadg/operators/navier_stokes_calculators.h>
54#include <exadg/poisson/preconditioners/multigrid_preconditioner.h>
55#include <exadg/poisson/spatial_discretization/laplace_operator.h>
56#include <exadg/solvers_and_preconditioners/preconditioners/preconditioner_base.h>
57#include <exadg/time_integration/interpolate.h>
58
59namespace ExaDG
60{
61namespace IncNS
62{
63template<int dim, typename Number>
65
66template<int dim, typename Number>
67class SpatialOperatorBase : public dealii::EnableObserverPointer
68{
69protected:
70 typedef dealii::LinearAlgebra::distributed::Vector<Number> VectorType;
71 typedef dealii::LinearAlgebra::distributed::BlockVector<Number> BlockVectorType;
72
73 typedef SpatialOperatorBase<dim, Number> This;
74
75 typedef dealii::VectorizedArray<Number> scalar;
76 typedef dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> vector;
77 typedef dealii::Tensor<2, dim, dealii::VectorizedArray<Number>> tensor;
78
79 typedef std::pair<unsigned int, unsigned int> Range;
80
81 typedef FaceIntegrator<dim, dim, Number> FaceIntegratorU;
82 typedef FaceIntegrator<dim, 1, Number> FaceIntegratorP;
83
84 typedef typename Poisson::MultigridPreconditioner<dim, Number, 1> MultigridPoisson;
85
86public:
87 /*
88 * Constructor.
89 */
90 SpatialOperatorBase(std::shared_ptr<Grid<dim> const> grid,
91 std::shared_ptr<dealii::Mapping<dim> const> mapping,
92 std::shared_ptr<MultigridMappings<dim, Number>> const multigrid_mappings,
93 std::shared_ptr<BoundaryDescriptor<dim> const> boundary_descriptor,
94 std::shared_ptr<FieldFunctions<dim> const> field_functions,
95 Parameters const & parameters,
96 std::string const & field,
97 MPI_Comm const & mpi_comm);
98
99 /*
100 * Destructor.
101 */
102 virtual ~SpatialOperatorBase(){};
103
104 void
105 fill_matrix_free_data(MatrixFreeData<dim, Number> & matrix_free_data) const;
106
110 void
111 setup();
112
119 void
120 setup(std::shared_ptr<dealii::MatrixFree<dim, Number> const> matrix_free,
121 std::shared_ptr<MatrixFreeData<dim, Number> const> matrix_free_data,
122 std::string const & dof_index_temperature = "");
123
124protected:
125 /*
126 * This function initializes operators, preconditioners, and solvers related to the solution of
127 * (non-)linear systems of equation required for implicit formulations. It has to be extended
128 * by derived classes if necessary.
129 */
130 virtual void
131 setup_preconditioners_and_solvers()
132 {
133 }
134
135private:
139 virtual void
140 setup_derived() = 0;
141
142public:
143 /*
144 * Getters and setters.
145 */
146 dealii::MatrixFree<dim, Number> const &
147 get_matrix_free() const;
148
149 std::string
150 get_dof_name_velocity() const;
151
152 unsigned int
153 get_dof_index_velocity() const;
154
155 unsigned int
156 get_dof_index_pressure() const;
157
158 unsigned int
159 get_quad_index_velocity_standard() const;
160
161 unsigned int
162 get_quad_index_pressure() const;
163
164protected:
165 unsigned int
166 get_dof_index_velocity_scalar() const;
167
168 unsigned int
169 get_quad_index_velocity_overintegration() const;
170
171 unsigned int
172 get_quad_index_velocity_nodal_points() const;
173
174 unsigned int
175 get_quad_index_pressure_nodal_points() const;
176
177 unsigned int
178 get_quad_index_velocity_linearized() const;
179
180public:
181 std::shared_ptr<dealii::Mapping<dim> const>
182 get_mapping() const;
183
184 dealii::FiniteElement<dim> const &
185 get_fe_u() const;
186
187 dealii::FiniteElement<dim> const &
188 get_fe_p() const;
189
190 dealii::DoFHandler<dim> const &
191 get_dof_handler_u() const;
192
193 dealii::DoFHandler<dim> const &
194 get_dof_handler_u_scalar() const;
195
196 dealii::DoFHandler<dim> const &
197 get_dof_handler_p() const;
198
199 dealii::AffineConstraints<Number> const &
200 get_constraint_p() const;
201
202 dealii::AffineConstraints<Number> const &
203 get_constraint_u() const;
204
205 dealii::types::global_dof_index
206 get_number_of_dofs() const;
207
208 dealii::VectorizedArray<Number>
209 get_viscosity_boundary_face(unsigned int const face, unsigned int const q) const;
210
211 // Multiphysics coupling via "Cached" boundary conditions
212 std::shared_ptr<ContainerInterfaceData<1, dim, double>>
213 get_container_interface_data();
214
215 void
216 set_velocity_ptr(VectorType const & velocity) const;
217
218 /*
219 * Initialization of vectors.
220 */
221 void
222 initialize_vector_velocity(VectorType & src) const;
223
224 void
225 initialize_vector_velocity_scalar(VectorType & src) const;
226
227 void
228 initialize_vector_pressure(VectorType & src) const;
229
230 void
231 initialize_block_vector_velocity_pressure(BlockVectorType & src) const;
232
233 /*
234 * Prescribe initial conditions using a specified analytical/initial solution function.
235 */
236 void
237 prescribe_initial_conditions(VectorType & velocity,
238 VectorType & pressure,
239 double const time) const;
240
241 /*
242 * De-/serialization of the solution components.
243 */
244 void
245 serialize_vectors(std::vector<VectorType const *> & vectors_velocity,
246 std::vector<VectorType const *> & vectors_pressure) const;
247
248 void
249 deserialize_vectors(std::vector<VectorType *> & vectors_velocity,
250 std::vector<VectorType *> & vectors_pressure);
251
252 /*
253 * Interpolate given functions to the corresponding vectors.
254 */
255 void
256 interpolate_functions(VectorType & velocity,
257 std::shared_ptr<dealii::Function<dim>> const & f_velocity,
258 VectorType & pressure,
259 std::shared_ptr<dealii::Function<dim>> const & f_pressure,
260 double const time) const;
261
262 /*
263 * Interpolate analytical solution functions.
264 */
265 void
266 interpolate_analytical_solution(VectorType & velocity,
267 VectorType & pressure,
268 double const time) const;
269
270 // FSI: coupling fluid -> structure
271 // fills a DoF-vector (velocity) with values of traction on fluid-structure interface
272 void
273 interpolate_stress_bc(VectorType & stress,
274 VectorType const & velocity,
275 VectorType const & pressure) const;
276
277 /*
278 * Time step calculation.
279 */
280
281 /*
282 * Calculate time step size according to maximum efficiency criterion
283 */
284 double
285 calculate_time_step_max_efficiency(unsigned int const order_time_integrator) const;
286
287 // global CFL criterion
288 double
289 calculate_time_step_cfl_global() const;
290
291 // Calculate time step size according to local CFL criterion
292 double
293 calculate_time_step_cfl(VectorType const & velocity) const;
294
295 // Calculate CFL numbers of cells
296 void
297 calculate_cfl_from_time_step(VectorType & cfl,
298 VectorType const & velocity,
299 double const time_step_size) const;
300
301 /*
302 * Returns characteristic element length for high-order elements / shape functions
303 */
304 double
305 get_characteristic_element_length() const;
306
307 /*
308 * For certain setups and types of boundary conditions, the pressure field is only defined up to
309 * an additive constant which originates from the fact that only the derivative of the pressure
310 * appears in the incompressible Navier-Stokes equations. Examples of such a scenario are problems
311 * where the velocity is prescribed on the whole boundary or periodic boundaries.
312 */
313
314 // This function can be used to query whether the pressure level is undefined.
315 bool
316 is_pressure_level_undefined() const;
317
318 // This function adjust the pressure level, where different options are available to fix the
319 // pressure level. The method selected by this function depends on the specified parameter.
320 void
321 adjust_pressure_level_if_undefined(VectorType & pressure, double const & time) const;
322
323 /*
324 * Boussinesq approximation
325 */
326 void
327 set_temperature(VectorType const & temperature);
328
329 /*
330 * Computation of derived quantities which is needed for postprocessing but some of them are also
331 * needed, e.g., for special splitting-type time integration schemes.
332 */
333
334 // vorticity
335 void
336 compute_vorticity(VectorType & dst, VectorType const & src) const;
337
338 // divergence
339 void
340 compute_divergence(VectorType & dst, VectorType const & src) const;
341
342 // shear rate
343 void
344 compute_shear_rate(VectorType & dst, VectorType const & src) const;
345
346 // velocity_magnitude
347 void
348 compute_velocity_magnitude(VectorType & dst, VectorType const & src) const;
349
350 // vorticity_magnitude
351 void
352 compute_vorticity_magnitude(VectorType & dst, VectorType const & src) const;
353
354 // streamfunction
355 void
356 compute_streamfunction(VectorType & dst, VectorType const & src) const;
357
358 // Q criterion
359 void
360 compute_q_criterion(VectorType & dst, VectorType const & src) const;
361
362 // get the current visosity field as vector
363 void
364 access_viscosity(VectorType & dst) const;
365
366 /*
367 * Operators.
368 */
369
370 // mass operator
371 void
372 apply_mass_operator(VectorType & dst, VectorType const & src) const;
373
374 void
375 apply_mass_operator_add(VectorType & dst, VectorType const & src) const;
376
377 // body force term
378 void
379 evaluate_add_body_force_term(VectorType & dst, double const time) const;
380
381 // convective term
382 void
383 evaluate_convective_term(VectorType & dst, VectorType const & src, Number const time) const;
384
385 // pressure gradient term
386 void
387 evaluate_pressure_gradient_term(VectorType & dst,
388 VectorType const & src,
389 double const time) const;
390
391 // velocity divergence
392 void
393 evaluate_velocity_divergence_term(VectorType & dst,
394 VectorType const & src,
395 double const time) const;
396
397 // inverse velocity mass operator
398 unsigned int
399 apply_inverse_mass_operator(VectorType & dst, VectorType const & src) const;
400
401 /*
402 * Update variable viscosity.
403 */
404 void
405 update_viscosity(VectorType const & velocity) const;
406
407 /*
408 * Projection step.
409 */
410 void
411 update_projection_operator(VectorType const & velocity, double const time_step_size) const;
412
413 void
414 rhs_add_projection_operator(VectorType & dst, double const time) const;
415
416 unsigned int
417 solve_projection(VectorType & dst,
418 VectorType const & src,
419 bool const & update_preconditioner) const;
420
421 /*
422 * Postprocessing.
423 */
424 double
425 calculate_dissipation_convective_term(VectorType const & velocity, double const time) const;
426
427 double
428 calculate_dissipation_viscous_term(VectorType const & velocity) const;
429
430 double
431 calculate_dissipation_divergence_term(VectorType const & velocity) const;
432
433 double
434 calculate_dissipation_continuity_term(VectorType const & velocity) const;
435
436 /*
437 * Updates operators after grid has been moved.
438 */
439 virtual void
440 update_after_grid_motion(bool const update_matrix_free);
441
442 /*
443 * Sets the grid velocity.
444 */
445 void
446 set_grid_velocity(VectorType const & velocity);
447
448 /*
449 * Calls constraint_u.distribute(u) and updates the constrained DoFs of the velocity field
450 */
451 void
452 distribute_constraint_u(VectorType & velocity) const;
453
454protected:
455 /*
456 * Projection step.
457 */
458 void
459 setup_projection_solver();
460
461 bool
462 unsteady_problem_has_to_be_solved() const;
463
464 /*
465 * Grid
466 */
467 std::shared_ptr<Grid<dim> const> grid;
468
469 /*
470 * dealii::Mapping (In case of moving meshes (ALE), this is the dynamic mapping describing the
471 * deformed configuration.)
472 */
473 std::shared_ptr<dealii::Mapping<dim> const> mapping;
474
475 std::shared_ptr<MultigridMappings<dim, Number>> const multigrid_mappings;
476
477 /*
478 * User interface: Boundary conditions and field functions.
479 */
480 std::shared_ptr<BoundaryDescriptor<dim> const> boundary_descriptor;
481 std::shared_ptr<FieldFunctions<dim> const> field_functions;
482
483 /*
484 * List of parameters.
485 */
486 Parameters const & param;
487
488 /*
489 * A name describing the field being solved.
490 */
491 std::string const field;
492
493 /*
494 * In case of projection type incompressible Navier-Stokes solvers this variable is needed to
495 * solve the pressure Poisson equation. However, this variable is also needed in case of a
496 * coupled solution approach. In that case, it is used for the block preconditioner (or more
497 * precisely for the Schur-complement preconditioner and the preconditioner used to approximately
498 * invert the Laplace operator).
499 *
500 * While the functions specified in BoundaryDescriptorLaplace are relevant for projection-type
501 * solvers (pressure Poisson equation has to be solved), the function specified in
502 * BoundaryDescriptorLaplace are irrelevant for a coupled solution approach (since the pressure
503 * Poisson operator is only needed for preconditioning, and hence, only the homogeneous part of
504 * the operator has to be evaluated so that the boundary conditions are never applied).
505 *
506 */
507 std::shared_ptr<Poisson::BoundaryDescriptor<0, dim>> boundary_descriptor_laplace;
508
509 /*
510 * Special case: pure Dirichlet boundary conditions.
511 */
512 dealii::Point<dim> first_point;
513 dealii::types::global_dof_index dof_index_first_point;
514
515 /*
516 * Element variable used to store the current physical time. This variable is needed for the
517 * evaluation of certain integrals or weak forms.
518 */
519 mutable double evaluation_time;
520
521private:
522 /*
523 * Basic finite element ingredients.
524 */
525 std::shared_ptr<dealii::FiniteElement<dim>> fe_u;
526 std::shared_ptr<dealii::FiniteElement<dim>> fe_p;
527 std::shared_ptr<dealii::FiniteElement<dim>> fe_u_scalar;
528 std::shared_ptr<dealii::FiniteElement<dim>> fe_mapping;
529
530 dealii::DoFHandler<dim> dof_handler_u;
531 dealii::DoFHandler<dim> dof_handler_p;
532 dealii::DoFHandler<dim> dof_handler_u_scalar;
533 std::shared_ptr<dealii::DoFHandler<dim>> dof_handler_mapping;
534
535 dealii::AffineConstraints<Number> constraint_u, constraint_p, constraint_u_scalar;
536
537 std::string const dof_index_u = "velocity";
538 std::string const dof_index_p = "pressure";
539 std::string const dof_index_u_scalar = "velocity_scalar";
540
541 std::string const quad_index_u = "velocity";
542 std::string const quad_index_p = "pressure";
543 std::string const quad_index_u_overintegration = "velocity_overintegration";
544 std::string const quad_index_u_nodal_points = "velocity_nodal_points";
545 std::string const quad_index_p_nodal_points = "pressure_nodal_points";
546
547 std::shared_ptr<MatrixFreeData<dim, Number> const> matrix_free_data;
548 std::shared_ptr<dealii::MatrixFree<dim, Number> const> matrix_free;
549
550 // If we want to be able to update the mapping, we need a pointer to a non-const MatrixFree
551 // object. In case this object is created, we let the above object called matrix_free point to
552 // matrix_free_own_storage. This variable is needed for ALE formulations.
553 std::shared_ptr<dealii::MatrixFree<dim, Number>> matrix_free_own_storage;
554
555 bool pressure_level_is_undefined;
556
557 /*
558 * Interface coupling
559 */
560 std::shared_ptr<ContainerInterfaceData<1, dim, double>> interface_data_dirichlet_cached;
561
562protected:
563 /*
564 * Operator kernels.
565 */
566 Operators::ConvectiveKernelData convective_kernel_data;
567 Operators::ViscousKernelData viscous_kernel_data;
568
569 std::shared_ptr<Operators::ConvectiveKernel<dim, Number>> convective_kernel;
570 std::shared_ptr<Operators::ViscousKernel<dim, Number>> viscous_kernel;
571
572 std::shared_ptr<Operators::DivergencePenaltyKernel<dim, Number>> div_penalty_kernel;
573 std::shared_ptr<Operators::ContinuityPenaltyKernel<dim, Number>> conti_penalty_kernel;
574
575 /*
576 * Basic operators.
577 */
578 MassOperator<dim, dim, Number> mass_operator;
579 ConvectiveOperator<dim, Number> convective_operator;
580 ViscousOperator<dim, Number> viscous_operator;
581 RHSOperator<dim, Number> rhs_operator;
582 GradientOperator<dim, Number> gradient_operator;
583 DivergenceOperator<dim, Number> divergence_operator;
584
585 DivergencePenaltyOperator<dim, Number> div_penalty_operator;
586 ContinuityPenaltyOperator<dim, Number> conti_penalty_operator;
587
588 /*
589 * Linear(ized) momentum operator.
590 */
591 mutable MomentumOperator<dim, Number> momentum_operator;
592
593 /*
594 * Inverse mass operator.
595 */
596 InverseMassOperator<dim, dim, Number> inverse_mass_velocity;
597 InverseMassOperator<dim, 1, Number> inverse_mass_velocity_scalar;
598
599 /*
600 * Projection operator.
601 */
602 typedef ProjectionOperator<dim, Number> ProjOperator;
603 std::shared_ptr<ProjOperator> projection_operator;
604
605 /*
606 * Projection solver.
607 */
608
609 // Elementwise solver/preconditioner used in case that only the divergence penalty term is used
610 // and the system of equations is block-diagonal.
611 typedef Elementwise::OperatorBase<dim, Number, ProjOperator> ELEMENTWISE_PROJ_OPERATOR;
612 std::shared_ptr<ELEMENTWISE_PROJ_OPERATOR> elementwise_projection_operator;
613
615 ELEMENTWISE_PRECONDITIONER;
616 std::shared_ptr<ELEMENTWISE_PRECONDITIONER> elementwise_preconditioner_projection;
617
618 // global solver/preconditioner to be used if the continuity penalty term is applied.
619 std::shared_ptr<Krylov::SolverBase<VectorType>> projection_solver;
620 std::shared_ptr<PreconditionerBase<Number>> preconditioner_projection;
621
622 /*
623 * Calculators used to obtain derived quantities.
624 */
625 VorticityCalculator<dim, Number> vorticity_calculator;
626 DivergenceCalculator<dim, Number> divergence_calculator;
627 ShearRateCalculator<dim, Number> shear_rate_calculator;
628 ViscosityCalculator<dim, Number> viscosity_calculator;
629 MagnitudeCalculator<dim, Number> magnitude_calculator;
630 QCriterionCalculator<dim, Number> q_criterion_calculator;
631
632 MPI_Comm const mpi_comm;
633
634 dealii::ConditionalOStream pcout;
635
636private:
637 std::shared_ptr<dealii::FiniteElement<dim>>
638 setup_fe_u(SpatialDiscretization const spatial_discretization,
639 ElementType const element_type,
640 unsigned int const degree) const;
641
642 // Minimum element length h_min required for global CFL condition.
643 double
644 calculate_minimum_element_length() const;
645
646 /*
647 * Initialization functions called during setup phase.
648 */
649 void
650 initialize_boundary_descriptor_laplace();
651
652 void
653 initialize_dof_handler_and_constraints();
654
655 void
656 initialize_dirichlet_cached_bc();
657
658 void
659 initialize_operators(std::string const & dof_index_temperature);
660
661 void
662 initialize_calculators_for_derived_quantities();
663
664 void
665 initialization_pure_dirichlet_bc();
666
667 void
668 cell_loop_empty(dealii::MatrixFree<dim, Number> const &,
669 VectorType &,
670 VectorType const &,
671 Range const &) const
672 {
673 }
674
675 void
676 face_loop_empty(dealii::MatrixFree<dim, Number> const &,
677 VectorType &,
678 VectorType const &,
679 Range const &) const
680 {
681 }
682
683 void
684 local_interpolate_stress_bc_boundary_face(dealii::MatrixFree<dim, Number> const & matrix_free,
685 VectorType & dst,
686 VectorType const & src,
687 Range const & face_range) const;
688
689 // Interpolation of stress requires velocity and pressure, but the MatrixFree interface
690 // only provides one argument, so we store pointers to have access to both velocity and
691 // pressure.
692 mutable VectorType const * velocity_ptr;
693 mutable VectorType const * pressure_ptr;
694
695 /*
696 * Variable viscosity models.
697 */
698 mutable TurbulenceModel<dim, Number> turbulence_model;
699 mutable GeneralizedNewtonianModel<dim, Number> generalized_newtonian_model;
700};
701
702} // namespace IncNS
703} // namespace ExaDG
704
705#endif /* EXADG_INCOMPRESSIBLE_NAVIER_STOKES_SPATIAL_DISCRETIZATION_SPATIAL_OPERATOR_BASE_H_ \
706 */
Definition navier_stokes_calculators.h:36
Definition elementwise_operator.h:34
Definition elementwise_preconditioners.h:41
Definition grid.h:40
Definition continuity_penalty_operator.h:299
Definition convective_operator.h:987
Definition divergence_operator.h:123
Definition divergence_penalty_operator.h:245
Definition generalized_newtonian_model.h:37
Definition gradient_operator.h:123
Definition momentum_operator.h:61
Definition parameters.h:46
Definition projection_operator.h:79
Definition rhs_operator.h:141
Definition spatial_operator_base.h:68
void setup()
Definition spatial_operator_base.cpp:683
Definition turbulence_model.h:37
Definition viscous_operator.h:606
Definition navier_stokes_calculators.h:192
Definition mass_operator.h:53
Definition grid.h:84
Definition multigrid_preconditioner.h:39
Definition navier_stokes_calculators.h:233
Definition navier_stokes_calculators.h:73
Definition navier_stokes_calculators.h:151
Definition navier_stokes_calculators.h:115
Definition driver.cpp:33
Definition boundary_descriptor.h:240
Definition field_functions.h:31
Definition convective_operator.h:38
Definition viscous_operator.h:41
Definition matrix_free_data.h:40