9.1
general documentation
cs_renumber.h
Go to the documentation of this file.
1#ifndef __CS_RENUMBER_H__
2#define __CS_RENUMBER_H__
3
4/*============================================================================
5 * Optional mesh renumbering
6 *============================================================================*/
7
8/*
9 This file is part of code_saturne, a general-purpose CFD tool.
10
11 Copyright (C) 1998-2025 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 "base/cs_base.h"
35#include "mesh/cs_mesh.h"
36
37/*----------------------------------------------------------------------------*/
38
40
41/*============================================================================
42 * Macro definitions
43 *============================================================================*/
44
45/*============================================================================
46 * Type definitions
47 *============================================================================*/
48
49/* Renumbering algorithms */
50
51typedef enum {
52
53 CS_RENUMBER_CELLS_SCOTCH_PART, /* SCOTCH partitioning */
54 CS_RENUMBER_CELLS_SCOTCH_ORDER, /* SCOTCH ordering */
55 CS_RENUMBER_CELLS_METIS_PART, /* METIS partitioning */
56 CS_RENUMBER_CELLS_METIS_ORDER, /* METIS ordering */
57 CS_RENUMBER_CELLS_MORTON, /* Morton/Lebesgue space filling curve */
58 CS_RENUMBER_CELLS_HILBERT, /* Hilbert space filling curve */
59 CS_RENUMBER_CELLS_RCM, /* Reverse Cuthill-McKee */
60 CS_RENUMBER_CELLS_NONE /* No cells renumbering */
61
63
64typedef enum {
65
66 CS_RENUMBER_I_FACES_BLOCK, /* No shared cell in block */
67 CS_RENUMBER_I_FACES_MULTIPASS, /* Use multipass face numbering */
68 CS_RENUMBER_I_FACES_SIMD, /* Renumber for vector (SIMD) operations */
69 CS_RENUMBER_I_FACES_NONE /* No interior face numbering */
70
72
73typedef enum {
74
75 CS_RENUMBER_B_FACES_THREAD, /* No cell shared between threads */
76 CS_RENUMBER_B_FACES_SIMD, /* Renumber for vector (SIMD) operations */
77 CS_RENUMBER_B_FACES_NONE /* No boundary face numbering */
78
80
81typedef enum {
82
83 CS_RENUMBER_VERTICES_BY_CELL_ADJ, /* Renumbering based on cell adjacency */
84 CS_RENUMBER_VERTICES_BY_FACE_ADJ, /* Renumbering based on face adjacency */
85 CS_RENUMBER_VERTICES_NONE /* No vertex numbering */
86
88
89/* Ordering options for adjacency arrays */
90
91typedef enum {
92
93 CS_RENUMBER_ADJACENT_LOW, /* Lowest adjacent id first */
94 CS_RENUMBER_ADJACENT_HIGH /* Highest adjacent id first */
95
97
98/*=============================================================================
99 * Public function prototypes
100 *============================================================================*/
101
102/*----------------------------------------------------------------------------
103 * Set the target number of threads for mesh renumbering.
104 *
105 * By default, the target number of threads is set to cs_glob_n_threads,
106 * but the value may be forced using this function. This is mainly useful
107 * for testing purposes.
108 *
109 * parameters:
110 * n_threads <-- target number of threads for mesh numbering
111 *----------------------------------------------------------------------------*/
112
113void
114cs_renumber_set_n_threads(int n_threads);
115
116/*----------------------------------------------------------------------------
117 * Return the target number of threads for mesh renumbering.
118 *
119 * returns:
120 * the target number of threads for mesh numbering
121 *----------------------------------------------------------------------------*/
122
123int
125
126/*----------------------------------------------------------------------------
127 * Set the minimum sunset sizes when renumbering for threads.
128 *
129 * parameters:
130 * min_i_subset_size <-- minimum number of interior faces per
131 * thread per group
132 * min_b_subset_size <-- minimum number of boundary faces per
133 * thread per group
134 *----------------------------------------------------------------------------*/
135
136void
138 cs_lnum_t min_b_subset_size);
139
140/*----------------------------------------------------------------------------
141 * Get the minimum sunset sizes when renumbering for threads.
142 *
143 * min_i_subset_size --> minimum number of interior faces per
144 * thread per group, or NULL
145 * min_b_subset_size --> minimum number of boundary faces per
146 * thread per group, or NULL
147 *----------------------------------------------------------------------------*/
148
149void
151 cs_lnum_t *min_b_subset_size);
152
153/*----------------------------------------------------------------------------*/
154/*
155 * \brief Set the relaxtion factor for rebalancing with the
156 * multipass algorithm.
157 *
158 * A relaxation factor of 0 disables rebalancing.
159 *
160 * Depending on the mesh numbering, rebalancing may interfere with the
161 * multigrid algorithm's coarsening, especially in the presence of
162 * cell renumbering. In some cases, the coarsening will be less constrained
163 * and lead to better aggregation (and performance) when combining
164 * cells renumbering and multipass interior faces renumbering with no
165 * reblancing (i. e. with a relaxation factor of 0).
166 *
167 * \param[in] relaxation factor multipass renumbering rebalance step
168 * relaxation factor.
169 */
170/*----------------------------------------------------------------------------*/
171
172void
173cs_renumber_set_multipass_rebalance_factor(float relaxation_factor);
174
175/*----------------------------------------------------------------------------*/
182/*----------------------------------------------------------------------------*/
183
184float
186
187/*----------------------------------------------------------------------------*/
188/*
189 * \brief Select the algorithm for mesh renumbering.
190 *
191 * \param[in] halo_adjacent_cells_last if true, cells adjacent to ghost cells
192 * will be placed last
193 * (after pre-numbering)
194 * \param[in] halo_adjacent_faces_last if true, interior faces adjacent to
195 * ghost cells will be placed last
196 * (after pre-numbering)
197 * \param[in] i_faces_base_ordering pre-ordering of interior faces by
198 * lowest or highest adjacent cell id
199 * \param[in] cells_pre_numbering algorithm for cells pre-numbering
200 * \param[in] cells_numbering algorithm for cells numbering
201 * \param[in] i_faces_numbering algorithm for interior faces numbering
202 * \param[in] b_faces_numbering algorithm for boundary faces numbering
203 * \param[in] vertices_numbering algorithm for vertices numbering
204 */
205/*----------------------------------------------------------------------------*/
206
207void
208cs_renumber_set_algorithm(bool halo_adjacent_cells_last,
209 bool halo_adjacent_faces_last,
210 cs_renumber_ordering_t i_faces_base_ordering,
211 cs_renumber_cells_type_t cells_pre_numbering,
212 cs_renumber_cells_type_t cells_numbering,
213 cs_renumber_i_faces_type_t i_faces_numbering,
214 cs_renumber_b_faces_type_t b_faces_numbering,
215 cs_renumber_vertices_type_t vertices_numbering);
216
217/*----------------------------------------------------------------------------*/
218/*
219 * \brief Return the algorithms for mesh renumbering.
220 *
221 * Any argument may be passed NULL if this option is not queried.
222 *
223 * \param[out] halo_adjacent_cells_last if true, cells adjacent to ghost cells
224 * will be placed last
225 * (after pre-numbering)
226 * \param[out] halo_adjacent_faces_last if true, interior faces adjacent to
227 * ghost cells will be placed last
228 * (after pre-numbering)
229 * \param[out] i_faces_base_ordering pre-ordering of interior faces by
230 * lowest or highest adjacent cell id
231 * \param[out] cells_pre_numbering algorithm for cells pre-numbering
232 * \param[out] cells_numbering algorithm for cells numbering
233 * \param[out] i_faces_numbering algorithm for interior faces numbering
234 * \param[out] b_faces_numbering algorithm for boundary faces numbering
235 * \param[out] vertices_numbering algorithm for vertices numbering
236 */
237/*----------------------------------------------------------------------------*/
238
239void
240cs_renumber_get_algorithm(bool *halo_adjacent_cells_last,
241 bool *halo_adjacent_faces_last,
242 cs_renumber_ordering_t *i_faces_base_ordering,
243 cs_renumber_cells_type_t *cells_pre_numbering,
244 cs_renumber_cells_type_t *cells_numbering,
245 cs_renumber_i_faces_type_t *i_faces_numbering,
246 cs_renumber_b_faces_type_t *b_faces_numbering,
247 cs_renumber_vertices_type_t *vertices_numbering);
248
249/*----------------------------------------------------------------------------
250 * Renumber mesh elements for vectorization or threading depending on code
251 * options and target machine.
252 *
253 * Renumbering cells may also allow improving locality (and favor faces
254 * renumbering).
255 * It is also possible to place cells connected to ghost cells last,
256 * which may be useful to enable computation/communication overlap.
257 *
258 * parameters:
259 * mesh <-> pointer to global mesh structure
260 *----------------------------------------------------------------------------*/
261
262void
264
265/*----------------------------------------------------------------------------*/
274/*----------------------------------------------------------------------------*/
275
276void
278
279/*----------------------------------------------------------------------------
280 * Renumber interior faces for vectorization or threading depending on code
281 * options and target machine.
282 *
283 * parameters:
284 * mesh <-> pointer to global mesh structure
285 *----------------------------------------------------------------------------*/
286
287void
289
290/*----------------------------------------------------------------------------
291 * Renumber interior faces by global number.
292 *
293 * This effectively resets the interior faces to their initial numbering.
294 *
295 * parameters:
296 * mesh <-> pointer to global mesh structure
297 *----------------------------------------------------------------------------*/
298
299void
301
302/*----------------------------------------------------------------------------
303 * Renumber boundary faces for vectorization or threading depending on code
304 * options and target machine.
305 *
306 * parameters:
307 * mesh <-> pointer to global mesh structure
308 *----------------------------------------------------------------------------*/
309
310void
312
313/*----------------------------------------------------------------------------
314 * Renumber boundary faces by global number.
315 *
316 * This effectively resets the boundary faces to their initial numbering.
317 *
318 * parameters:
319 * mesh <-> pointer to global mesh structure
320 *----------------------------------------------------------------------------*/
321
322void
324
325/*----------------------------------------------------------------------------*/
338/*----------------------------------------------------------------------------*/
339
340void
342 cs_lnum_t n_faces,
343 const cs_lnum_t face_ids[]);
344
345/*----------------------------------------------------------------------------*/
354/*----------------------------------------------------------------------------*/
355
356void
358
359/*----------------------------------------------------------------------------*/
360
362
363#endif /* __CS_RENUMBER_H__ */
#define BEGIN_C_DECLS
Definition: cs_defs.h:554
#define END_C_DECLS
Definition: cs_defs.h:555
int cs_lnum_t
local mesh entity id
Definition: cs_defs.h:350
void cs_renumber_mesh(cs_mesh_t *mesh)
Renumber mesh elements for vectorization or threading depending on code options and target machine.
Definition: cs_renumber.cpp:5976
void cs_renumber_get_min_subset_size(cs_lnum_t *min_i_subset_size, cs_lnum_t *min_b_subset_size)
Get the minimum sunset sizes when renumbering for threads.
Definition: cs_renumber.cpp:5817
void cs_renumber_set_n_threads(int n_threads)
Set the target number of threads for mesh renumbering.
Definition: cs_renumber.cpp:5757
void cs_renumber_b_faces(cs_mesh_t *mesh)
Renumber boundary faces for vectorization or threading depending on code options and target machine.
Definition: cs_renumber.cpp:6143
cs_renumber_i_faces_type_t
Definition: cs_renumber.h:64
@ CS_RENUMBER_I_FACES_MULTIPASS
Definition: cs_renumber.h:67
@ CS_RENUMBER_I_FACES_SIMD
Definition: cs_renumber.h:68
@ CS_RENUMBER_I_FACES_BLOCK
Definition: cs_renumber.h:66
@ CS_RENUMBER_I_FACES_NONE
Definition: cs_renumber.h:69
void cs_renumber_set_algorithm(bool halo_adjacent_cells_last, bool halo_adjacent_faces_last, cs_renumber_ordering_t i_faces_base_ordering, cs_renumber_cells_type_t cells_pre_numbering, cs_renumber_cells_type_t cells_numbering, cs_renumber_i_faces_type_t i_faces_numbering, cs_renumber_b_faces_type_t b_faces_numbering, cs_renumber_vertices_type_t vertices_numbering)
Select the algorithm for mesh renumbering.
Definition: cs_renumber.cpp:5887
void cs_renumber_b_faces_select_ignore(cs_mesh_t *mesh, cs_lnum_t n_faces, const cs_lnum_t face_ids[])
Renumber boundary faces such that selected faces appear last and will be ignored.
Definition: cs_renumber.cpp:6231
void cs_renumber_set_multipass_rebalance_factor(float relaxation_factor)
Set the relaxtion factor for rebalancing with the multipass algorithm.
Definition: cs_renumber.cpp:5846
void cs_renumber_i_faces_by_gnum(cs_mesh_t *mesh)
Definition: cs_renumber.cpp:6107
cs_renumber_ordering_t
Definition: cs_renumber.h:91
@ CS_RENUMBER_ADJACENT_LOW
Definition: cs_renumber.h:93
@ CS_RENUMBER_ADJACENT_HIGH
Definition: cs_renumber.h:94
cs_renumber_cells_type_t
Definition: cs_renumber.h:51
@ CS_RENUMBER_CELLS_METIS_PART
Definition: cs_renumber.h:55
@ CS_RENUMBER_CELLS_SCOTCH_PART
Definition: cs_renumber.h:53
@ CS_RENUMBER_CELLS_RCM
Definition: cs_renumber.h:59
@ CS_RENUMBER_CELLS_NONE
Definition: cs_renumber.h:60
@ CS_RENUMBER_CELLS_MORTON
Definition: cs_renumber.h:57
@ CS_RENUMBER_CELLS_METIS_ORDER
Definition: cs_renumber.h:56
@ CS_RENUMBER_CELLS_HILBERT
Definition: cs_renumber.h:58
@ CS_RENUMBER_CELLS_SCOTCH_ORDER
Definition: cs_renumber.h:54
cs_renumber_vertices_type_t
Definition: cs_renumber.h:81
@ CS_RENUMBER_VERTICES_BY_FACE_ADJ
Definition: cs_renumber.h:84
@ CS_RENUMBER_VERTICES_BY_CELL_ADJ
Definition: cs_renumber.h:83
@ CS_RENUMBER_VERTICES_NONE
Definition: cs_renumber.h:85
float cs_renumber_get_multipass_rebalance_factor(void)
Get the relaxtion factor for rebalancing with the multipass algorithm.
Definition: cs_renumber.cpp:5861
cs_renumber_b_faces_type_t
Definition: cs_renumber.h:73
@ CS_RENUMBER_B_FACES_THREAD
Definition: cs_renumber.h:75
@ CS_RENUMBER_B_FACES_NONE
Definition: cs_renumber.h:77
@ CS_RENUMBER_B_FACES_SIMD
Definition: cs_renumber.h:76
void cs_renumber_b_faces_by_gnum(cs_mesh_t *mesh)
Definition: cs_renumber.cpp:6189
void cs_renumber_cells(cs_mesh_t *mesh)
Renumber cells depending on code options and target machine.
Definition: cs_renumber.cpp:6011
void cs_renumber_get_algorithm(bool *halo_adjacent_cells_last, bool *halo_adjacent_faces_last, cs_renumber_ordering_t *i_faces_base_ordering, cs_renumber_cells_type_t *cells_pre_numbering, cs_renumber_cells_type_t *cells_numbering, cs_renumber_i_faces_type_t *i_faces_numbering, cs_renumber_b_faces_type_t *b_faces_numbering, cs_renumber_vertices_type_t *vertices_numbering)
Return the algorithms for mesh renumbering.
Definition: cs_renumber.cpp:5930
void cs_renumber_set_min_subset_size(cs_lnum_t min_i_subset_size, cs_lnum_t min_b_subset_size)
Set the minimum sunset sizes when renumbering for threads.
Definition: cs_renumber.cpp:5798
int cs_renumber_get_n_threads(void)
Return the target number of threads for mesh renumbering.
Definition: cs_renumber.cpp:5778
void cs_renumber_vertices(cs_mesh_t *mesh)
Renumber vertices depending on code options and target machine.
Definition: cs_renumber.cpp:6381
void cs_renumber_i_faces(cs_mesh_t *mesh)
Renumber interior faces for vectorization or threading depending on code options and target machine.
Definition: cs_renumber.cpp:6061
Definition: mesh.f90:26
Definition: cs_mesh.h:85