8.1
general documentation
cs_internal_coupling.h
Go to the documentation of this file.
1 #ifndef __CS_INTERNAL_COUPLING_H__
2 #define __CS_INTERNAL_COUPLING_H__
3 
4 /*============================================================================
5  * Internal coupling: coupling for one instance of code_saturne
6  *============================================================================*/
7 
8 /*
9  This file is part of code_saturne, a general-purpose CFD tool.
10 
11  Copyright (C) 1998-2023 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  * PLE library headers
32  *----------------------------------------------------------------------------*/
33 
34 #include <ple_locator.h>
35 
36 /*----------------------------------------------------------------------------
37  * Local headers
38  *----------------------------------------------------------------------------*/
39 
40 #include "cs_defs.h"
41 
42 #include "cs_base.h"
43 #include "cs_field.h"
44 #include "cs_matrix_assembler.h"
45 #include "cs_mesh.h"
46 #include "cs_mesh_quantities.h"
47 #include "cs_parameters.h"
48 
49 /*----------------------------------------------------------------------------*/
50 
52 
53 /*=============================================================================
54  * Macro definitions
55  *============================================================================*/
56 
57 /*============================================================================
58  * Type definitions
59  *============================================================================*/
60 
61 /* Internal coupling structure definition */
62 
63 typedef struct {
64 
65  /* Id */
66  int id;
67 
68  /* Locator + tag for exchanging variables */
69  ple_locator_t *locator;
70  int *c_tag;
71 
72  /* Selection criteria for coupled domains */
75 
78 
79  /* Associated zone ids */
80 
83 
84  cs_lnum_t n_local; /* Number of faces */
85  cs_lnum_t *faces_local; /* Coupling boundary faces, numbered 0..n-1 */
86 
87  cs_lnum_t n_distant; /* Number of faces in faces_distant */
88  cs_lnum_t *faces_distant; /* Distant boundary faces associated with locator */
89 
90  /* Face i is coupled in this entity if coupled_faces[i] = true */
92 
93  /* Geometrical weights around coupling interface */
95 
96  /* IJ vectors */
98 
99  /* OF vectors */
101 
103 
104 /*============================================================================
105  * Public function prototypes
106  *============================================================================*/
107 
108 /*----------------------------------------------------------------------------*/
114 /*----------------------------------------------------------------------------*/
115 
116 int
118 
119 /*----------------------------------------------------------------------------*/
128 /*----------------------------------------------------------------------------*/
129 
130 void
131 cs_internal_coupling_add(const char criteria_cells[],
132  const char criteria_faces[]);
133 
134 /*----------------------------------------------------------------------------*/
141 /*----------------------------------------------------------------------------*/
142 
143 void
144 cs_internal_coupling_add_volume(const char criteria_cells[]);
145 
146 /*----------------------------------------------------------------------------*/
153 /*----------------------------------------------------------------------------*/
154 
155 void
157 
158 /*----------------------------------------------------------------------------*/
166 /*----------------------------------------------------------------------------*/
167 
168 void
170  const int zone_ids[]);
171 
172 /*----------------------------------------------------------------------------*/
188 /*----------------------------------------------------------------------------*/
189 
190 void
192  const char *interior_name,
193  const char *exterior_name);
194 
195 /*----------------------------------------------------------------------------*/
201 /*----------------------------------------------------------------------------*/
202 
203 void
204 cs_internal_coupling_bcs(int bc_type[]);
205 
206 /*----------------------------------------------------------------------------*/
210 /*----------------------------------------------------------------------------*/
211 
212 void
214 
215 /*----------------------------------------------------------------------------*/
223 /*----------------------------------------------------------------------------*/
224 
226 cs_internal_coupling_by_id(int coupling_id);
227 
228 /*----------------------------------------------------------------------------*/
238 /*----------------------------------------------------------------------------*/
239 
240 void
242  int stride,
243  cs_real_t distant[],
244  cs_real_t local[]);
245 
246 /*----------------------------------------------------------------------------*/
255 /*----------------------------------------------------------------------------*/
256 
257 void
259  int stride,
260  const cs_real_t tab[],
261  cs_real_t local[]);
262 
263 /*----------------------------------------------------------------------------*/
272 /*----------------------------------------------------------------------------*/
273 
274 void
276  int stride,
277  const cs_real_t tab[],
278  cs_real_t local[]);
279 
280 /*----------------------------------------------------------------------------
281  * Modify iterative COCG matrix to include internal coupling
282  *
283  * parameters:
284  * cpl <-- pointer to coupling entity
285  * cocg <-> cocg matrix modified
286  *----------------------------------------------------------------------------*/
287 
288 void
290  cs_real_33_t cocg[]);
291 
292 /*----------------------------------------------------------------------------*/
296 /*----------------------------------------------------------------------------*/
297 
298 void
300 
301 /*----------------------------------------------------------------------------*/
305 /*----------------------------------------------------------------------------*/
306 
307 void
309 
310 /*----------------------------------------------------------------------------*/
321 /*----------------------------------------------------------------------------*/
322 
323 void
325  const cs_internal_coupling_t *cpl,
326  const cs_real_t c_weight[],
327  cs_real_3_t *restrict grad,
328  const cs_real_t pvar[],
329  cs_real_3_t rhs[]);
330 
331 /*----------------------------------------------------------------------------*/
342 /*----------------------------------------------------------------------------*/
343 
344 void
346  const cs_internal_coupling_t *cpl,
347  const cs_real_t c_weight[],
348  cs_real_33_t *restrict grad,
349  const cs_real_3_t pvar[],
350  cs_real_33_t rhs[]);
351 
352 /*----------------------------------------------------------------------------*/
363 /*----------------------------------------------------------------------------*/
364 
365 void
367  const cs_internal_coupling_t *cpl,
368  const cs_real_t c_weight[],
369  cs_real_63_t *restrict grad,
370  const cs_real_6_t pvar[],
371  cs_real_63_t rhs[]);
372 
373 /*----------------------------------------------------------------------------*/
382 /*----------------------------------------------------------------------------*/
383 
384 void
386  const cs_internal_coupling_t *cpl,
387  cs_real_3_t *restrict r_grad,
388  cs_real_3_t grad[]);
389 
390 /*----------------------------------------------------------------------------*/
399 /*----------------------------------------------------------------------------*/
400 
401 void
403  const cs_internal_coupling_t *cpl,
404  cs_real_33_t *restrict r_grad,
405  cs_real_33_t grad[]);
406 
407 /*----------------------------------------------------------------------------*/
416 /*----------------------------------------------------------------------------*/
417 
418 void
420  const cs_internal_coupling_t *cpl,
421  cs_real_63_t *restrict r_grad,
422  cs_real_63_t grad[]);
423 
424 /*----------------------------------------------------------------------------*/
439 /*----------------------------------------------------------------------------*/
440 
441 void
443  const cs_internal_coupling_t *cpl,
444  cs_halo_type_t halo_type,
445  int w_stride,
446  double clip_coeff,
447  cs_real_t *bc_coeff_a,
448  cs_real_t *bc_coeff_b,
449  const cs_real_t *var,
450  const cs_real_t *c_weight);
451 
452 /*----------------------------------------------------------------------------*/
466 /*----------------------------------------------------------------------------*/
467 
468 void
470  const cs_internal_coupling_t *cpl,
471  cs_halo_type_t halo_type,
472  double clip_coeff,
473  cs_real_t bc_coeff_a[][3],
474  cs_real_t bc_coeff_b[][3][3],
475  const cs_real_3_t *var,
476  const cs_real_t *c_weight);
477 
478 /*----------------------------------------------------------------------------
479  * Addition to matrix-vector product in case of internal coupling.
480  *
481  * parameters:
482  * exclude_diag <-- extra diagonal flag
483  * f <-- associated field pointer
484  * x <-- vector x in m * x = y
485  * y <-> vector y in m * x = y
486  *----------------------------------------------------------------------------*/
487 
488 void
490  const cs_field_t *f,
491  const cs_real_t *restrict x,
492  cs_real_t *restrict y);
493 
494 /*----------------------------------------------------------------------------
495  * Add coupling term coordinates to matrix assembler.
496  *
497  * parameters:
498  * coupling_id
499  * r_g_id <-- global row ids (per cell)
500  * ma <-> matrix assembler
501  *----------------------------------------------------------------------------*/
502 
503 void
505  const cs_gnum_t *r_g_id,
507 
508 /*----------------------------------------------------------------------------
509  * Add coupling terms to matrix values assembly.
510  *
511  * parameters:
512  * f <-- associated field
513  * db_size <-- diagonal block size
514  * eb_size <-- extra-diagonal block size
515  * r_g_id <-- global row ids (per cell)
516  * mav <-> matrix values assembler
517  *----------------------------------------------------------------------------*/
518 
519 void
521  cs_lnum_t db_size,
522  cs_lnum_t eb_size,
523  const cs_gnum_t r_g_id[],
525 
526 /*----------------------------------------------------------------------------
527  * Return pointers to coupling components
528  *
529  * parameters:
530  * cpl <-- pointer to coupling entity
531  * n_local --> NULL or pointer to component n_local
532  * faces_local --> NULL or pointer to component faces_local
533  * n_distant --> NULL or pointer to component n_distant
534  * faces_distant --> NULL or pointer to component faces_distant
535  *----------------------------------------------------------------------------*/
536 
537 void
539  cs_lnum_t *n_local,
540  const cs_lnum_t *faces_local[],
541  cs_lnum_t *n_distant,
542  const cs_lnum_t *faces_distant[]);
543 
544 /*----------------------------------------------------------------------------
545  * Log information about a given internal coupling entity
546  *
547  * parameters:
548  * cpl <-- pointer to coupling entity
549  *----------------------------------------------------------------------------*/
550 
551 void
553 
554 /*----------------------------------------------------------------------------
555  * Print informations about all coupling entities
556  *
557  * parameters:
558  * cpl <-- pointer to coupling entity
559  *----------------------------------------------------------------------------*/
560 
561 void
563 
564 /*----------------------------------------------------------------------------
565  * Add preprocessing operations required by coupling volume using given
566  * criteria.
567  *
568  * The volume is separated from the rest of the domain with inserted
569  * boundaries.
570  *
571  * parameters:
572  * mesh <-> pointer to mesh structure to modify
573  *----------------------------------------------------------------------------*/
574 
575 void
577 
578 /*----------------------------------------------------------------------------
579  * Define face to face mappings for internal couplings.
580  *
581  * parameters:
582  * mesh <-> pointer to mesh structure to modify
583  *----------------------------------------------------------------------------*/
584 
585 void
587 
588 /*----------------------------------------------------------------------------
589  * Define coupling entity using given criteria.
590  *
591  * parameters:
592  * f_id <-- id of the field
593  *----------------------------------------------------------------------------*/
594 
595 void
597 
598 /*----------------------------------------------------------------------------*/
608 /*----------------------------------------------------------------------------*/
609 
610 void
612  const cs_internal_coupling_t *cpl,
613  const cs_real_t c_weight[],
614  const cs_real_t pvar[],
615  cs_real_3_t *restrict grad);
616 
617 /*----------------------------------------------------------------------------*/
627 /*----------------------------------------------------------------------------*/
628 
629 void
631  const cs_internal_coupling_t *cpl,
632  const cs_real_t c_weight[],
633  const cs_real_3_t pvar[],
634  cs_real_33_t *restrict grad);
635 
636 
637 /*----------------------------------------------------------------------------*/
647 /*----------------------------------------------------------------------------*/
648 
649 void
651  const cs_internal_coupling_t *cpl,
652  const cs_real_t c_weight[],
653  const cs_real_6_t pvar[],
654  cs_real_63_t *restrict grad);
655 
656 /*----------------------------------------------------------------------------*/
664 /*----------------------------------------------------------------------------*/
665 
666 void
668  const cs_real_t *hbnd);
669 
670 /*----------------------------------------------------------------------------*/
680 /*----------------------------------------------------------------------------*/
681 
682 void
683 cs_ic_field_dist_data_by_face_id(const int field_id,
684  int stride,
685  const cs_real_t tab_distant[],
686  cs_real_t tab_local[]);
687 
688 /*----------------------------------------------------------------------------*/
689 
691 
692 #endif /* __CS_INTERNAL_COUPLING_H__ */
#define restrict
Definition: cs_defs.h:139
#define BEGIN_C_DECLS
Definition: cs_defs.h:514
double cs_real_t
Floating-point value.
Definition: cs_defs.h:319
cs_real_t cs_real_3_t[3]
vector of 3 floating-point values
Definition: cs_defs.h:334
unsigned long cs_gnum_t
global mesh entity number
Definition: cs_defs.h:298
cs_real_t cs_real_6_t[6]
vector of 6 floating-point values
Definition: cs_defs.h:336
#define END_C_DECLS
Definition: cs_defs.h:515
cs_real_t cs_real_33_t[3][3]
3x3 matrix of floating-point values
Definition: cs_defs.h:343
int cs_lnum_t
local mesh entity id
Definition: cs_defs.h:313
cs_real_t cs_real_63_t[6][3]
Definition: cs_defs.h:351
cs_halo_type_t
Definition: cs_halo.h:56
void cs_internal_coupling_reconstruct_vector_gradient(const cs_internal_coupling_t *cpl, cs_real_33_t *restrict r_grad, cs_real_33_t grad[])
Add internal coupling contribution for reconstruction of the gradient of a vector.
Definition: cs_internal_coupling.c:1747
void cs_internal_coupling_preprocess(cs_mesh_t *mesh)
Definition: cs_internal_coupling.c:2784
void cs_internal_coupling_matrix_add_ids(int coupling_id, const cs_gnum_t *r_g_id, cs_matrix_assembler_t *ma)
Definition: cs_internal_coupling.c:2433
void cs_internal_coupling_log(const cs_internal_coupling_t *cpl)
Definition: cs_internal_coupling.c:2711
void cs_internal_coupling_add_volume_zone(const cs_zone_t *z)
Define coupling volume using a cs_zone_t. Then, this volume will be separated from the rest of the do...
Definition: cs_internal_coupling.c:999
void cs_internal_coupling_add_boundary_groups(cs_internal_coupling_t *cpl, const char *interior_name, const char *exterior_name)
Define internal coupling volume boundary group names.
Definition: cs_internal_coupling.c:1062
void cs_internal_coupling_reconstruct_scalar_gradient(const cs_internal_coupling_t *cpl, cs_real_3_t *restrict r_grad, cs_real_3_t grad[])
Add internal coupling contribution for reconstruction of the gradient of a scalar.
void cs_internal_coupling_initialize(void)
Initialize internal coupling related structures.
Definition: cs_internal_coupling.c:2694
void cs_internal_coupling_update_bc_coeff_v(cs_field_bc_coeffs_t *bc_coeffs, const cs_internal_coupling_t *cpl, cs_halo_type_t halo_type, double clip_coeff, cs_real_t bc_coeff_a[][3], cs_real_t bc_coeff_b[][3][3], const cs_real_3_t *var, const cs_real_t *c_weight)
Update vector boundary condition coefficients for internal coupling.
Definition: cs_internal_coupling.c:2214
void cs_internal_coupling_initialize_scalar_gradient(const cs_internal_coupling_t *cpl, const cs_real_t c_weight[], const cs_real_t pvar[], cs_real_3_t *restrict grad)
Add contribution from coupled faces (internal coupling) to initialisation for iterative scalar gradie...
Definition: cs_internal_coupling.c:1117
void cs_internal_coupling_exchange_var(const cs_internal_coupling_t *cpl, int stride, cs_real_t distant[], cs_real_t local[])
Exchange quantities from distant to local (update local using distant).
Definition: cs_internal_coupling.c:1946
void cs_internal_coupling_finalize(void)
Destruction of all internal coupling related structures.
Definition: cs_internal_coupling.c:1901
void cs_internal_coupling_initialize_tensor_gradient(const cs_internal_coupling_t *cpl, const cs_real_t c_weight[], const cs_real_6_t pvar[], cs_real_63_t *restrict grad)
Add contribution from coupled faces (internal coupling) to initialisation for iterative symmetric ten...
Definition: cs_internal_coupling.c:1284
void cs_internal_coupling_coupled_faces(const cs_internal_coupling_t *cpl, cs_lnum_t *n_local, const cs_lnum_t *faces_local[], cs_lnum_t *n_distant, const cs_lnum_t *faces_distant[])
Definition: cs_internal_coupling.c:2061
void cs_internal_coupling_iterative_scalar_gradient(const cs_internal_coupling_t *cpl, const cs_real_t c_weight[], cs_real_3_t *restrict grad, const cs_real_t pvar[], cs_real_3_t rhs[])
Add internal coupling rhs contribution for iterative gradient calculation.
Definition: cs_internal_coupling.c:1372
void cs_internal_coupling_reconstruct_tensor_gradient(const cs_internal_coupling_t *cpl, cs_real_63_t *restrict r_grad, cs_real_63_t grad[])
Add internal coupling contribution for reconstruction of the gradient of a symmetric tensor.
Definition: cs_internal_coupling.c:1808
void cs_internal_coupling_bcs(int bc_type[])
Impose wall BCs to internal coupled faces if not yet defined.
Definition: cs_internal_coupling.c:1086
void cs_internal_coupling_matrix_add_values(const cs_field_t *f, cs_lnum_t db_size, cs_lnum_t eb_size, const cs_gnum_t r_g_id[], cs_matrix_assembler_values_t *mav)
Definition: cs_internal_coupling.c:2506
void cs_internal_coupling_add_volume_zones(int n_zones, const int zone_ids[])
Define coupling volume using given cs_zone_t. Then, this volume will be separated from the rest of th...
Definition: cs_internal_coupling.c:1017
cs_internal_coupling_t * cs_internal_coupling_by_id(int coupling_id)
Return the coupling associated with a given coupling_id.
Definition: cs_internal_coupling.c:1923
void cs_internal_coupling_it_cocg_contribution(const cs_internal_coupling_t *cpl, cs_real_33_t cocg[])
Definition: cs_internal_coupling.c:1866
int cs_internal_coupling_n_couplings(void)
Return number of defined internal couplings.
Definition: cs_internal_coupling.c:923
void cs_ic_field_dist_data_by_face_id(const int field_id, int stride, const cs_real_t tab_distant[], cs_real_t tab_local[])
Get distant data using face id at all coupling faces for a given field id.
Definition: cs_internal_coupling.c:2901
void cs_internal_coupling_exchange_by_cell_id(const cs_internal_coupling_t *cpl, int stride, const cs_real_t tab[], cs_real_t local[])
Exchange variable between groups using cell id.
Definition: cs_internal_coupling.c:1972
void cs_internal_coupling_iterative_vector_gradient(const cs_internal_coupling_t *cpl, const cs_real_t c_weight[], cs_real_33_t *restrict grad, const cs_real_3_t pvar[], cs_real_33_t rhs[])
Add internal coupling rhs contribution for iterative vector gradient calculation.
Definition: cs_internal_coupling.c:1476
void cs_internal_coupling_exchange_by_face_id(const cs_internal_coupling_t *cpl, int stride, const cs_real_t tab[], cs_real_t local[])
Exchange variable between groups using face id.
Definition: cs_internal_coupling.c:2021
void cs_internal_coupling_update_bc_coeff_s(cs_field_bc_coeffs_t *bc_coeffs, const cs_internal_coupling_t *cpl, cs_halo_type_t halo_type, int w_stride, double clip_coeff, cs_real_t *bc_coeff_a, cs_real_t *bc_coeff_b, const cs_real_t *var, const cs_real_t *c_weight)
Compute scalar boundary condition coefficients for internal coupling.
Definition: cs_internal_coupling.c:2095
void cs_internal_coupling_map(cs_mesh_t *mesh)
Definition: cs_internal_coupling.c:2805
void cs_internal_coupling_add_volume(const char criteria_cells[])
Define coupling volume using given criteria. Then, this volume will be separated from the rest of the...
Definition: cs_internal_coupling.c:968
void cs_ic_field_set_exchcoeff(const cs_field_t *f, const cs_real_t *hbnd)
Update internal coupling coefficients of the field of the given id using given boundary exchange coef...
Definition: cs_internal_coupling.c:2855
void cs_internal_coupling_dump(void)
Definition: cs_internal_coupling.c:2757
void cs_internal_coupling_spmv_contribution(bool exclude_diag, const cs_field_t *f, const cs_real_t *restrict x, cs_real_t *restrict y)
Definition: cs_internal_coupling.c:2329
void cs_internal_coupling_add_entity(int f_id)
Definition: cs_internal_coupling.c:2825
void cs_internal_coupling_iterative_tensor_gradient(const cs_internal_coupling_t *cpl, const cs_real_t c_weight[], cs_real_63_t *restrict grad, const cs_real_6_t pvar[], cs_real_63_t rhs[])
Add internal coupling rhs contribution for iterative tensor gradient calculation.
Definition: cs_internal_coupling.c:1584
void cs_internal_coupling_setup(void)
Setup internal coupling related parameters.
Definition: cs_internal_coupling.c:2638
void cs_internal_coupling_add(const char criteria_cells[], const char criteria_faces[])
Define coupling volume using given selection criteria.
Definition: cs_internal_coupling.c:940
void cs_internal_coupling_initialize_vector_gradient(const cs_internal_coupling_t *cpl, const cs_real_t c_weight[], const cs_real_3_t pvar[], cs_real_33_t *restrict grad)
Add contribution from coupled faces (internal coupling) to initialisation for iterative vector gradie...
Definition: cs_internal_coupling.c:1198
struct _cs_matrix_assembler_t cs_matrix_assembler_t
Definition: cs_matrix_assembler.h:61
struct _cs_matrix_assembler_values_t cs_matrix_assembler_values_t
Definition: cs_matrix_assembler.h:65
Definition: mesh.f90:26
Field boundary condition descriptor (for variables)
Definition: cs_field.h:104
Field descriptor.
Definition: cs_field.h:131
Definition: cs_internal_coupling.h:63
ple_locator_t * locator
Definition: cs_internal_coupling.h:69
cs_lnum_t * faces_local
Definition: cs_internal_coupling.h:85
cs_lnum_t * faces_distant
Definition: cs_internal_coupling.h:88
int n_volume_zones
Definition: cs_internal_coupling.h:81
bool * coupled_faces
Definition: cs_internal_coupling.h:91
int * c_tag
Definition: cs_internal_coupling.h:70
int id
Definition: cs_internal_coupling.h:66
char * interior_faces_group_name
Definition: cs_internal_coupling.h:76
cs_real_3_t * ci_cj_vect
Definition: cs_internal_coupling.h:97
char * exterior_faces_group_name
Definition: cs_internal_coupling.h:77
char * cells_criteria
Definition: cs_internal_coupling.h:73
cs_real_3_t * offset_vect
Definition: cs_internal_coupling.h:100
cs_lnum_t n_distant
Definition: cs_internal_coupling.h:87
cs_lnum_t n_local
Definition: cs_internal_coupling.h:84
char * faces_criteria
Definition: cs_internal_coupling.h:74
cs_real_t * g_weight
Definition: cs_internal_coupling.h:94
int * volume_zone_ids
Definition: cs_internal_coupling.h:82
Definition: cs_mesh.h:85
Definition: cs_zone.h:55