TrioCFD 1.9.8
TrioCFD documentation
Loading...
Searching...
No Matches
Operateur_IJK_base.h
1/****************************************************************************
2* Copyright (c) 2015 - 2016, CEA
3* All rights reserved.
4*
5* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
6* 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7* 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8* 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
9*
10* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
11* IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
12* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
13*
14*****************************************************************************/
15
16#ifndef Operateur_IJK_base_included
17#define Operateur_IJK_base_included
18
19#include <IJK_Field.h>
20#include <IJK_ptr.h>
21#include <IJK_Field_vector.h>
22#include <IJK_Field_simd_tools.h>
23#include <Domaine_IJK.h>
24#include <Operateur_IJK_data_channel.h>
25#include <Corrige_flux_FT_base.h>
26#include <IJK_Navier_Stokes_tools.h>
27
28inline void putzero(IJK_Field_local_double& flux)
29{
30 const int vsize = Simd_double::size();
31 const int ni = flux.ni();
32 const int nj = flux.nj();
33 double *ptr = &flux(0,0,0);
34 double *end_ptr = &flux(ni-1,nj-1,0);
35 const int n = (int)(end_ptr - ptr + 1);
36 Simd_double zero = 0.;
37 for (int i = 0; i < n; i += vsize)
38 SimdPut(ptr+i, zero);
39}
40
41// Base class for operators on velocity field.
42// It provides the structure for "conservative finite volume" operators:
43// The operator computes fluxes between the control volumes, then computes the
44// divergence of the fluxes (div_set() and div_add() method).
45// The derived class must implement a public "compute" method that will call compute_set()
46// or compute_add() (see for example OpDiffTurbIJK_double and OpConvCentre4IJK_double)
47// It must also implement the compute_flux...() methods to compute fluxes between the control volumes.
49{
50 Declare_base( Operateur_IJK_faces_base_double );
51
52public:
53 virtual double compute_dtstab_convection_local(IJK_Field_double& dvx, IJK_Field_double& dvy, IJK_Field_double& dvz);
54 void compute_set(IJK_Field_double& dvx, IJK_Field_double& dvy, IJK_Field_double& dvz);
55 void compute_add(IJK_Field_double& dvx, IJK_Field_double& dvy, IJK_Field_double& dvz);
56protected:
57 // The derived class must implement the computation of fluxes (9 methods)
58 // See for example classes OpDiffTurbIJK_double and OpConvCentre4IJK_double.
59 virtual void Operator_IJK_div(const IJK_Field_local_double& flux_x, const IJK_Field_local_double& flux_y,
60 const IJK_Field_local_double& flux_zmin, const IJK_Field_local_double& flux_zmax,
61 IJK_Field_double& resu, int k_layer, bool add);
62 virtual void correct_flux(IJK_Field_local_double *const flux, const int k_layer, const int dir, const int compo);
63 virtual void correct_flux_spherical(Simd_double& a, Simd_double& b, const int k_layer , const int dir) { ; };
64 virtual void compute_flux_x_vx(IJK_Field_local_double& resu, const int k_layer) = 0;
65 virtual void compute_flux_x_vy(IJK_Field_local_double& resu, const int k_layer) = 0;
66 virtual void compute_flux_x_vz(IJK_Field_local_double& resu, const int k_layer) = 0;
67 virtual void compute_flux_y_vx(IJK_Field_local_double& resu, const int k_layer) = 0;
68 virtual void compute_flux_y_vy(IJK_Field_local_double& resu, const int k_layer) = 0;
69 virtual void compute_flux_y_vz(IJK_Field_local_double& resu, const int k_layer) = 0;
70 virtual void compute_flux_z_vx(IJK_Field_local_double& resu, const int k_layer) = 0;
71 virtual void compute_flux_z_vy(IJK_Field_local_double& resu, const int k_layer) = 0;
72 virtual void compute_flux_z_vz(IJK_Field_local_double& resu, const int k_layer) = 0;
73
74 // The derived class might implement (optional) supplemental computations,
75 // the method is called after computing the divergence of the flux
76 // (example, use it to add velocity * divergence(velocity) for compressible flows)
77 // Default implementation does nothing.
78 virtual void exec_after_divergence_flux_x(IJK_Field_double& resu, const int k_layer) { };
79 virtual void exec_after_divergence_flux_y(IJK_Field_double& resu, const int k_layer) { };
80 virtual void exec_after_divergence_flux_z(IJK_Field_double& resu, const int k_layer) { };
81
82private:
83 void compute_(IJK_Field_double& dvx, IJK_Field_double& dvy, IJK_Field_double& dvz, bool add);
84
85};
86
87// Same, but base class for operator on cell centered scalar datapeeb
89{
90 Declare_base( Operateur_IJK_elem_base_double );
91
92public:
93 virtual void initialize(const Domaine_IJK& splitting)=0;
94 void set_runge_kutta(int rk_step, double dt_tot, IJK_Field_vector3_double& current_fluxes, IJK_Field_vector3_double& RK3_F_fluxes);
95 virtual void compute_set(IJK_Field_double& dx);
96 virtual void compute_add(IJK_Field_double& dx);
97 virtual void compute_grad(IJK_Field_vector3_double& dx);
98 virtual void compute_grad_x(IJK_Field_double& dx);
99 virtual void compute_grad_y(IJK_Field_double& dx);
100 virtual void compute_grad_z(IJK_Field_double& dx);
101protected:
102 // The derived class must implement the computation of fluxes (3 fluxes, one per direction)
103 virtual void Operator_IJK_div(const IJK_Field_local_double& flux_x, const IJK_Field_local_double& flux_y,
104 const IJK_Field_local_double& flux_zmin, const IJK_Field_local_double& flux_zmax,
105 IJK_Field_double& resu, int k_layer, bool add);
106 virtual void correct_flux(IJK_Field_local_double *const flux, const int k_layer, const int dir);
107 virtual void correct_flux_spherical(Simd_double& a, Simd_double& b, const int& i, const int& j, int k_layer, int dir) { ; };
108
109 virtual void compute_flux_x(IJK_Field_local_double& resu, const int k_layer) = 0;
110 virtual void compute_flux_y(IJK_Field_local_double& resu, const int k_layer) = 0;
111 virtual void compute_flux_z(IJK_Field_local_double& resu, const int k_layer) = 0;
112 virtual double compute_flux_local_x(int i, int j, int k) { return -DMINFLOAT; };
113 virtual double compute_flux_local_y(int i, int j, int k) { return -DMINFLOAT; };
114 virtual double compute_flux_local_z(int i, int j, int k) { return -DMINFLOAT; };
115
117 int rk_step_ = -1;
118 double dt_tot_ = 0.;
119 IJK_Field_vector3_double *current_fluxes_;
120 IJK_Field_vector3_double *RK3_F_fluxes_;
121
122private:
123 void compute_(IJK_Field_double& dx, bool add);
124 virtual void fill_grad_field_x_y_(IJK_Field_local_double& flux, IJK_Field_double& resu, int k, int dir) { ; };
125 virtual void fill_grad_field_z_(IJK_Field_local_double& flux_min, IJK_Field_local_double& flux_max, IJK_Field_double& resu, int k) { ; };
126 void fill_grad_field_x_(IJK_Field_local_double& flux, IJK_Field_vector3_double& resu, int k);
127 void fill_grad_field_y_(IJK_Field_local_double& flux, IJK_Field_vector3_double& resu, int k);
128 void fill_grad_field_z_(IJK_Field_local_double& flux_min, IJK_Field_local_double& flux_max, IJK_Field_vector3_double& resu, int k);
129};
130
131#endif
This class encapsulates all the information related to the eulerian mesh for TrioIJK.
Definition Domaine_IJK.h:47
Objet_U()
Constructeur par defaut : attribue un numero d'identifiant unique a l'objet (object_id_),...
Definition Objet_U.cpp:55
virtual double compute_flux_local_x(int i, int j, int k)
virtual void Operator_IJK_div(const IJK_Field_local_double &flux_x, const IJK_Field_local_double &flux_y, const IJK_Field_local_double &flux_zmin, const IJK_Field_local_double &flux_zmax, IJK_Field_double &resu, int k_layer, bool add)
virtual void compute_add(IJK_Field_double &dx)
virtual double compute_flux_local_y(int i, int j, int k)
virtual void initialize(const Domaine_IJK &splitting)=0
virtual void compute_flux_z(IJK_Field_local_double &resu, const int k_layer)=0
virtual double compute_flux_local_z(int i, int j, int k)
virtual void compute_grad(IJK_Field_vector3_double &dx)
virtual void compute_set(IJK_Field_double &dx)
virtual void correct_flux(IJK_Field_local_double *const flux, const int k_layer, const int dir)
virtual void compute_flux_y(IJK_Field_local_double &resu, const int k_layer)=0
virtual void compute_flux_x(IJK_Field_local_double &resu, const int k_layer)=0
virtual void compute_grad_x(IJK_Field_double &dx)
virtual void compute_grad_y(IJK_Field_double &dx)
void set_runge_kutta(int rk_step, double dt_tot, IJK_Field_vector3_double &current_fluxes, IJK_Field_vector3_double &RK3_F_fluxes)
IJK_Field_vector3_double * current_fluxes_
virtual void compute_grad_z(IJK_Field_double &dx)
IJK_Field_vector3_double * RK3_F_fluxes_
virtual void correct_flux_spherical(Simd_double &a, Simd_double &b, const int &i, const int &j, int k_layer, int dir)
virtual void compute_flux_y_vy(IJK_Field_local_double &resu, const int k_layer)=0
virtual void compute_flux_y_vx(IJK_Field_local_double &resu, const int k_layer)=0
virtual void exec_after_divergence_flux_y(IJK_Field_double &resu, const int k_layer)
virtual void compute_flux_x_vx(IJK_Field_local_double &resu, const int k_layer)=0
virtual void exec_after_divergence_flux_x(IJK_Field_double &resu, const int k_layer)
virtual void compute_flux_z_vz(IJK_Field_local_double &resu, const int k_layer)=0
virtual void correct_flux(IJK_Field_local_double *const flux, const int k_layer, const int dir, const int compo)
void compute_set(IJK_Field_double &dvx, IJK_Field_double &dvy, IJK_Field_double &dvz)
virtual double compute_dtstab_convection_local(IJK_Field_double &dvx, IJK_Field_double &dvy, IJK_Field_double &dvz)
virtual void compute_flux_x_vz(IJK_Field_local_double &resu, const int k_layer)=0
virtual void compute_flux_y_vz(IJK_Field_local_double &resu, const int k_layer)=0
virtual void correct_flux_spherical(Simd_double &a, Simd_double &b, const int k_layer, const int dir)
virtual void compute_flux_x_vy(IJK_Field_local_double &resu, const int k_layer)=0
virtual void compute_flux_z_vy(IJK_Field_local_double &resu, const int k_layer)=0
virtual void compute_flux_z_vx(IJK_Field_local_double &resu, const int k_layer)=0
void compute_add(IJK_Field_double &dvx, IJK_Field_double &dvy, IJK_Field_double &dvz)
virtual void exec_after_divergence_flux_z(IJK_Field_double &resu, const int k_layer)
virtual void Operator_IJK_div(const IJK_Field_local_double &flux_x, const IJK_Field_local_double &flux_y, const IJK_Field_local_double &flux_zmin, const IJK_Field_local_double &flux_zmax, IJK_Field_double &resu, int k_layer, bool add)