7.1
general documentation
cs_cdo_quantities.h
Go to the documentation of this file.
1 #ifndef __CS_CDO_QUANTITIES_H__
2 #define __CS_CDO_QUANTITIES_H__
3 
4 /*============================================================================
5  * Manage geometrical quantities needed in CDO schemes
6  *============================================================================*/
7 
8 /*
9  This file is part of Code_Saturne, a general-purpose CFD tool.
10 
11  Copyright (C) 1998-2021 EDF S.A.
12 
13  This program is free software; you can redistribute it and/or modify it under
14  the terms of the GNU General Public License as published by the Free Software
15  Foundation; either version 2 of the License, or (at your option) any later
16  version.
17 
18  This program is distributed in the hope that it will be useful, but WITHOUT
19  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
20  FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
21  details.
22 
23  You should have received a copy of the GNU General Public License along with
24  this program; if not, write to the Free Software Foundation, Inc., 51 Franklin
25  Street, Fifth Floor, Boston, MA 02110-1301, USA.
26 */
27 
28 /*----------------------------------------------------------------------------*/
29 
30 /*----------------------------------------------------------------------------
31  * Local headers
32  *----------------------------------------------------------------------------*/
33 
34 #include "cs_base.h"
35 #include "cs_cdo_connect.h"
36 #include "cs_flag.h"
37 #include "cs_math.h"
38 #include "cs_mesh.h"
39 #include "cs_mesh_quantities.h"
40 
41 /*----------------------------------------------------------------------------*/
42 
44 
45 /*============================================================================
46  * Macro definitions
47  *============================================================================*/
48 
49 /*============================================================================
50  * Type definitions
51  *============================================================================*/
52 
67 typedef enum {
68 
72 
74 
94 typedef enum {
95 
96  /* Set of geometrical quantities related to CDO schemes */
97 
98  CS_CDO_QUANTITIES_EB_SCHEME = 1<<0, /* = 1 */
99  CS_CDO_QUANTITIES_FB_SCHEME = 1<<1, /* = 2 */
101  CS_CDO_QUANTITIES_VB_SCHEME = 1<<3, /* = 8 */
102  CS_CDO_QUANTITIES_VCB_SCHEME = 1<<4, /* = 16 */
103 
105 
106 
107 /* Structure storing information about variation of entities across the
108  mesh for a given type of entity (cell, face and edge) */
109 typedef struct {
110 
111  /* Measure is either a volume for cells, a surface for faces or a length
112  for edges */
113  double meas_min; /* Min. value of the entity measure */
114  double meas_max; /* Max. value of the entity measure */
115  double h_min; /* Estimation of the min. value of the diameter */
116  double h_max; /* Estimation of the max. value of the diameter */
117 
119 
120 /* For primal vector quantities (edge or face) */
121 typedef struct {
122 
123  double meas; /* length or area */
124  double unitv[3]; /* unitary vector: tangent or normal to the element */
125  double center[3];
126 
127 } cs_quant_t;
128 
129 typedef struct { /* Specific mesh quantities */
130 
131  /* Keep the information about the removal of boundary faces in case of 2D
132  computations */
134 
135  /* Global mesh quantities */
136  double vol_tot;
137 
138  /* Cell-based quantities */
139  /* ===================== */
140 
141  cs_lnum_t n_cells; /* Local number of cells */
142  cs_gnum_t n_g_cells; /* Global number of cells */
143  cs_real_t *cell_centers; /* May be shared according to options */
144  const cs_real_t *cell_vol; /* Shared with cs_mesh_quantities_t */
145 
147 
148  /* Face-based quantities */
149  /* ===================== */
150 
151  cs_lnum_t n_faces; /* n_i_faces + n_b_faces */
152  cs_lnum_t n_i_faces; /* Local number of interior faces */
153  cs_lnum_t n_b_faces; /* Local number of border faces */
154  cs_gnum_t n_g_faces; /* Global number of faces */
155 
156  /* Remark: cs_quant_t structure attached to a face (interior or border) can
157  be built on-the-fly calling the function cs_quant_set_face(f_id, cdoq).
158  See \ref cs_quant_set_face for more details.
159 
160  In order to reduce the memory consumption one shares face quantities with
161  the ones defined in the legacy part and stored in the cs_mesh_quantities_t
162  structure that's why a distinction is made between interior and border
163  faces.
164 
165  cs_nvec3_t structure associated to a face can also be built on-the-fly
166  using cs_quant_set_face_nvec(f_id, cdoq).
167  See \ref cs_quant_set_face_nvec for more details.
168  */
169 
170  const cs_real_t *i_face_normal; /* Shared with cs_mesh_quantities_t */
171  const cs_real_t *i_face_center; /* Shared with cs_mesh_quantities_t */
172  const cs_real_t *i_face_surf; /* Shared with cs_mesh_quantities_t */
173 
174  const cs_real_t *b_face_normal; /* Shared with cs_mesh_quantities_t */
175  const cs_real_t *b_face_center; /* Shared with cs_mesh_quantities_t */
176  const cs_real_t *b_face_surf; /* Shared with cs_mesh_quantities_t */
177 
178  /* Remark: cs_nvec3_t structure attached to a dual edge can be built
179  on-the-fly to access to its length and its unit tangential vector using
180  the function cs_quant_set_dedge_nvec(shift, cdoq)
181 
182  One recalls that a dual edge is associated to a primal face and is shared
183  with two cells for an interior face and shared with one cell for a
184  boundary face. Scan this quantity with the c2f connectivity.
185  */
186 
187  cs_real_t *dedge_vector; /* Allocation to 3*c2f->idx[n_faces] */
188 
189  cs_real_t *pvol_fc; /* Portion of volume surrounding a face
190  * in each cell. This is a pyramid of
191  * base the face and apex the cell center
192  * Scanned with the c2f adjacency.
193  * Not always allocated.
194  */
196 
197  /* Edge-based quantities */
198  /* ===================== */
199 
200  cs_lnum_t n_edges; /* Local number of edges */
201  cs_gnum_t n_g_edges; /* Global number of edges */
202 
203  cs_real_t *edge_vector; /* Allocation to 3*n_edges
204  Norm of the vector is equal to the
205  distance between two vertices.
206  Unit vector is the tangential direction
207  attached to the edge */
208 
209  /* For each edge e belonging to a cell c, the dual face is built from the
210  contributions of two triangles s(x_c, x_f, x_e) and s(x_c, x_f', x_e) with
211  the faces f and f' belonging to F_e \cap F_c
212  Scan this quantity with the c2e connectivity */
213 
214  cs_real_t *dface_normal; /* Vector-valued normal for each dual face
215  * inside a cell associated to an edge */
216  cs_real_t *pvol_ec; /* Portion of volume surrounding an edge
217  * in each cell. Scanned with the c2e
218  * adjacency.
219  * Not always allocated. */
220 
222 
223  /* Vertex-based quantities */
224  /* ======================= */
225 
226  cs_lnum_t n_vertices; /* Local number of vertices */
227  cs_gnum_t n_g_vertices; /* Global number of vertices */
228 
229  cs_real_t *dcell_vol; /* Dual volume related to each vertex.
230  * Scanned with the c2v adjacency.
231  * Not always allocated.
232  */
233  const cs_real_t *vtx_coord; /* Shared with the cs_mesh_t structure */
234 
236 
237 /*============================================================================
238  * Global variables
239  *============================================================================*/
240 
241 /*============================================================================
242  * Public function prototypes
243  *============================================================================*/
244 
245 /*----------------------------------------------------------------------------*/
255 /*----------------------------------------------------------------------------*/
256 
257 static inline double
258 cs_compute_area_from_quant(const cs_quant_t qa,
259  const cs_real_t *xb)
260 {
261  const double xab[3] = {xb[0] - qa.center[0],
262  xb[1] - qa.center[1],
263  xb[2] - qa.center[2]};
264  const double cp[3] = {qa.unitv[1]*xab[2] - qa.unitv[2]*xab[1],
265  qa.unitv[2]*xab[0] - qa.unitv[0]*xab[2],
266  qa.unitv[0]*xab[1] - qa.unitv[1]*xab[0]};
267 
268  return 0.5 * qa.meas * cs_math_3_norm(cp);
269 }
270 
271 /*----------------------------------------------------------------------------*/
278 /*----------------------------------------------------------------------------*/
279 
280 void
281 cs_cdo_quantities_set(cs_flag_t option_flag);
282 
283 /*----------------------------------------------------------------------------*/
289 /*----------------------------------------------------------------------------*/
290 
291 void
293 
294 /*----------------------------------------------------------------------------*/
306 /*----------------------------------------------------------------------------*/
307 
310  const cs_mesh_quantities_t *mq,
311  const cs_cdo_connect_t *topo);
312 
313 /*----------------------------------------------------------------------------*/
321 /*----------------------------------------------------------------------------*/
322 
325 
326 /*----------------------------------------------------------------------------*/
333 /*----------------------------------------------------------------------------*/
334 
335 void
337 
338 /*----------------------------------------------------------------------------*/
345 /*----------------------------------------------------------------------------*/
346 
347 void
349 
350 /*----------------------------------------------------------------------------*/
362 /*----------------------------------------------------------------------------*/
363 
364 void
366  const cs_adjacency_t *c2f,
367  cs_real_t **p_pvol_fc);
368 
369 /*----------------------------------------------------------------------------*/
380 /*----------------------------------------------------------------------------*/
381 
382 void
384  const cs_adjacency_t *c2e,
385  cs_real_t **p_pvol_ec);
386 
387 /*----------------------------------------------------------------------------*/
395 /*----------------------------------------------------------------------------*/
396 
397 void
399  const cs_adjacency_t *c2v,
400  cs_real_t *dual_vol);
401 
402 /*----------------------------------------------------------------------------*/
414 /*----------------------------------------------------------------------------*/
415 
416 void
418  const cs_cdo_quantities_t *cdoq,
419  cs_lnum_t f_id,
420  cs_real_t tef[]);
421 
422 /*----------------------------------------------------------------------------*/
434 /*----------------------------------------------------------------------------*/
435 
436 void
438  const cs_cdo_quantities_t *cdoq,
439  cs_lnum_t bf_id,
440  cs_real_t tef[]);
441 
442 /*----------------------------------------------------------------------------*/
454 /*----------------------------------------------------------------------------*/
455 
456 void
458  const cs_cdo_quantities_t *cdoq,
459  cs_lnum_t f_id,
460  cs_real_t wvf[]);
461 
462 /*----------------------------------------------------------------------------*/
474 /*----------------------------------------------------------------------------*/
475 
476 void
478  const cs_cdo_quantities_t *cdoq,
479  cs_lnum_t bf_id,
480  cs_real_t wvf[]);
481 
482 /*----------------------------------------------------------------------------*/
492 /*----------------------------------------------------------------------------*/
493 
494 inline static const cs_real_t *
495 cs_quant_get_face_vector_area(cs_lnum_t f_id,
496  const cs_cdo_quantities_t *cdoq)
497 {
498  if (f_id < cdoq->n_i_faces) /* Interior face */
499  return cdoq->i_face_normal + 3*f_id;
500  else /* Border face */
501  return cdoq->b_face_normal + 3*(f_id - cdoq->n_i_faces);
502 }
503 
504 /*----------------------------------------------------------------------------*/
513 /*----------------------------------------------------------------------------*/
514 
515 inline static const cs_real_t *
516 cs_quant_get_face_center(cs_lnum_t f_id,
517  const cs_cdo_quantities_t *cdoq)
518 {
519  if (f_id < cdoq->n_i_faces) /* Interior face */
520  return cdoq->i_face_center + 3*f_id;
521  else /* Border face */
522  return cdoq->b_face_center + 3*(f_id - cdoq->n_i_faces);
523 }
524 
525 /*----------------------------------------------------------------------------*/
534 /*----------------------------------------------------------------------------*/
535 
538  const cs_cdo_quantities_t *cdoq);
539 
540 /*----------------------------------------------------------------------------*/
550 /*----------------------------------------------------------------------------*/
551 
554  const cs_cdo_quantities_t *cdoq);
555 
556 /*----------------------------------------------------------------------------*/
565 /*----------------------------------------------------------------------------*/
566 
569  const cs_cdo_quantities_t *cdoq);
570 
571 /*----------------------------------------------------------------------------*/
580 /*----------------------------------------------------------------------------*/
581 
584  const cs_cdo_quantities_t *cdoq);
585 
586 /*----------------------------------------------------------------------------*/
594 /*----------------------------------------------------------------------------*/
595 
596 void
597 cs_quant_dump(FILE *f,
598  cs_lnum_t num,
599  const cs_quant_t q);
600 
601 /*----------------------------------------------------------------------------*/
602 
604 
605 #endif /* __CS_CDO_QUANTITIES_H__ */
const cs_real_t * b_face_center
Definition: cs_cdo_quantities.h:175
unsigned long cs_gnum_t
global mesh entity number
Definition: cs_defs.h:301
cs_real_t * dedge_vector
Definition: cs_cdo_quantities.h:187
Definition: cs_cdo_quantities.h:102
double center[3]
Definition: cs_cdo_quantities.h:125
cs_gnum_t n_g_cells
Definition: cs_cdo_quantities.h:142
void cs_cdo_quantities_compute_dual_volumes(const cs_cdo_quantities_t *cdoq, const cs_adjacency_t *c2v, cs_real_t *dual_vol)
Compute the dual volume surrounding each vertex.
Definition: cs_cdo_quantities.c:1422
cs_cdo_quantities_t * cs_cdo_quantities_build(const cs_mesh_t *m, const cs_mesh_quantities_t *mq, const cs_cdo_connect_t *topo)
Build a cs_cdo_quantities_t structure. Some quantities are shared with the cs_mesh_quantities_t struc...
Definition: cs_cdo_quantities.c:1004
cs_real_t * cell_centers
Definition: cs_cdo_quantities.h:143
cs_cdo_quantities_t * cs_cdo_quantities_free(cs_cdo_quantities_t *q)
Destroy a cs_cdo_quantities_t structure.
Definition: cs_cdo_quantities.c:1144
const cs_real_t * i_face_normal
Definition: cs_cdo_quantities.h:170
void cs_quant_dump(FILE *f, cs_lnum_t num, const cs_quant_t q)
Dump a cs_quant_t structure.
Definition: cs_cdo_quantities.c:1750
void cs_cdo_quantities_compute_pvol_ec(const cs_cdo_quantities_t *cdoq, const cs_adjacency_t *c2e, cs_real_t **p_pvol_ec)
Compute the portion of volume surrounding each edge of a cell The computed quantity is scanned with t...
Definition: cs_cdo_quantities.c:1366
cs_cdo_quantities_cell_center_algo_t
Type of algorithm used to compute the cell centers.
Definition: cs_cdo_quantities.h:67
cs_quant_info_t edge_info
Definition: cs_cdo_quantities.h:221
Definition: cs_mesh_adjacencies.h:68
cs_real_t * dcell_vol
Definition: cs_cdo_quantities.h:229
void cs_cdo_quantities_set_algo_ccenter(cs_cdo_quantities_cell_center_algo_t algo)
Set the type of algorithm to use for computing the cell center.
Definition: cs_cdo_quantities.c:984
double h_max
Definition: cs_cdo_quantities.h:116
double meas_min
Definition: cs_cdo_quantities.h:113
void cs_cdo_quantities_set(cs_flag_t option_flag)
Set which quantities have to be computed. Additionnal quantities are added to cs_cdo_quantities_flag ...
Definition: cs_cdo_quantities.c:970
#define BEGIN_C_DECLS
Definition: cs_defs.h:510
cs_lnum_t n_edges
Definition: cs_cdo_quantities.h:200
double meas
Definition: cs_cdo_quantities.h:123
Definition: cs_cdo_quantities.h:109
cs_cdo_quantities_bit_t
Bit values for setting which quantities to compute.
Definition: cs_cdo_quantities.h:94
double h_min
Definition: cs_cdo_quantities.h:115
Definition: cs_cdo_connect.h:79
Definition: cs_field_pointer.h:100
double vol_tot
Definition: cs_cdo_quantities.h:136
Definition: cs_cdo_quantities.h:69
double cs_real_t
Floating-point value.
Definition: cs_defs.h:322
Definition: cs_cdo_quantities.h:129
Definition: cs_defs.h:368
Definition: cs_mesh.h:84
cs_lnum_t n_faces
Definition: cs_cdo_quantities.h:151
cs_real_t * edge_vector
Definition: cs_cdo_quantities.h:203
void cs_cdo_quantities_compute_b_wvf(const cs_cdo_connect_t *connect, const cs_cdo_quantities_t *cdoq, cs_lnum_t bf_id, cs_real_t wvf[])
Compute the weight related to each vertex of a face. This weight ensures a 2nd order approximation if...
Definition: cs_cdo_quantities.c:1586
const cs_real_t * i_face_surf
Definition: cs_cdo_quantities.h:172
void cs_cdo_quantities_compute_pvol_fc(const cs_cdo_quantities_t *cdoq, const cs_adjacency_t *c2f, cs_real_t **p_pvol_fc)
Compute the portion of volume surrounding each face of a cell. This volume corresponds to a pyramid w...
Definition: cs_cdo_quantities.c:1312
cs_real_t * dface_normal
Definition: cs_cdo_quantities.h:214
const cs_real_t * cell_vol
Definition: cs_cdo_quantities.h:144
void cs_cdo_quantities_dump(const cs_cdo_quantities_t *cdoq)
Dump a cs_cdo_quantities_t structure.
Definition: cs_cdo_quantities.c:1230
bool remove_boundary_faces
Definition: cs_cdo_quantities.h:133
Definition: cs_mesh_quantities.h:89
cs_quant_info_t face_info
Definition: cs_cdo_quantities.h:195
cs_lnum_t n_b_faces
Definition: cs_cdo_quantities.h:153
cs_gnum_t n_g_edges
Definition: cs_cdo_quantities.h:201
double meas_max
Definition: cs_cdo_quantities.h:114
cs_nvec3_t cs_quant_set_dedge_nvec(cs_lnum_t shift, const cs_cdo_quantities_t *cdoq)
Get the two normalized vector associated to a dual edge.
Definition: cs_cdo_quantities.c:1730
void cs_cdo_quantities_summary(const cs_cdo_quantities_t *quant)
Summarize generic information about the cdo mesh quantities.
Definition: cs_cdo_quantities.c:1180
const cs_real_t * i_face_center
Definition: cs_cdo_quantities.h:171
cs_lnum_t n_vertices
Definition: cs_cdo_quantities.h:226
cs_gnum_t n_g_faces
Definition: cs_cdo_quantities.h:154
Definition: cs_cdo_quantities.h:121
int cs_lnum_t
local mesh entity id
Definition: cs_defs.h:316
void cs_cdo_quantities_compute_b_tef(const cs_cdo_connect_t *connect, const cs_cdo_quantities_t *cdoq, cs_lnum_t bf_id, cs_real_t tef[])
Compute the area of the triangles with basis each edge of the face and apex the face center...
Definition: cs_cdo_quantities.c:1495
const cs_real_t * b_face_normal
Definition: cs_cdo_quantities.h:174
double unitv[3]
Definition: cs_cdo_quantities.h:124
void cs_cdo_quantities_compute_i_wvf(const cs_cdo_connect_t *connect, const cs_cdo_quantities_t *cdoq, cs_lnum_t f_id, cs_real_t wvf[])
Compute the weight related to each vertex of a face. This weight ensures a 2nd order approximation if...
Definition: cs_cdo_quantities.c:1537
cs_lnum_t n_i_faces
Definition: cs_cdo_quantities.h:152
const cs_real_t * b_face_surf
Definition: cs_cdo_quantities.h:176
cs_real_t * pvol_ec
Definition: cs_cdo_quantities.h:216
#define END_C_DECLS
Definition: cs_defs.h:511
unsigned short int cs_flag_t
Definition: cs_defs.h:324
cs_lnum_t n_cells
Definition: cs_cdo_quantities.h:141
cs_quant_t cs_quant_set_face(cs_lnum_t f_id, const cs_cdo_quantities_t *cdoq)
Define a cs_quant_t structure for a primal face (interior or border)
Definition: cs_cdo_quantities.c:1632
const cs_real_t * vtx_coord
Definition: cs_cdo_quantities.h:233
cs_nvec3_t cs_quant_set_edge_nvec(cs_lnum_t e_id, const cs_cdo_quantities_t *cdoq)
Get the normalized vector associated to a primal edge.
Definition: cs_cdo_quantities.c:1709
Definition: cs_cdo_quantities.h:71
Definition: cs_cdo_quantities.h:100
Definition: cs_cdo_quantities.h:70
void cs_cdo_quantities_compute_i_tef(const cs_cdo_connect_t *connect, const cs_cdo_quantities_t *cdoq, cs_lnum_t f_id, cs_real_t tef[])
Compute the area of the triangles with basis each edge of the face and apex the face center...
Definition: cs_cdo_quantities.c:1453
cs_nvec3_t cs_quant_set_face_nvec(cs_lnum_t f_id, const cs_cdo_quantities_t *cdoq)
Retrieve the face surface and its unit normal vector for a primal face (interior or border) ...
Definition: cs_cdo_quantities.c:1684
cs_gnum_t n_g_vertices
Definition: cs_cdo_quantities.h:227
Definition: cs_cdo_quantities.h:101
Definition: cs_cdo_quantities.h:98
cs_quant_info_t cell_info
Definition: cs_cdo_quantities.h:146
cs_real_t * pvol_fc
Definition: cs_cdo_quantities.h:189
Definition: cs_cdo_quantities.h:99