programmer's documentation
cs_mesh_quantities.h
Go to the documentation of this file.
1 #ifndef __CS_MESH_QUANTITIES_H__
2 #define __CS_MESH_QUANTITIES_H__
3 
4 /*============================================================================
5  * Management of mesh quantities
6  *============================================================================*/
7 
8 /*
9  This file is part of Code_Saturne, a general-purpose CFD tool.
10 
11  Copyright (C) 1998-2018 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_mesh.h"
36 #include "cs_internal_coupling.h"
37 
38 /*----------------------------------------------------------------------------*/
39 
41 
42 /*=============================================================================
43  * Macro definitions
44  *============================================================================*/
45 
52 /*
53  * Cell quantities correction types
54  */
55 
57 #define CS_BAD_CELLS_WARPED_CORRECTION (1 << 0)
58 
60 #define CS_BAD_CELLS_REGULARISATION (1 << 1)
61 
63 #define CS_CELL_FACE_CENTER_CORRECTION (1 << 2)
64 
66 #define CS_CELL_CENTER_CORRECTION (1 << 3)
67 
69 #define CS_FACE_DISTANCE_CLIP (1 << 4)
70 
72 #define CS_FACE_RECONSTRUCTION_CLIP (1 << 5)
73 
75 #define CS_CELL_VOLUME_RATIO_CORRECTION (1 << 6)
76 
80 #define CS_FACE_CENTER_REFINE (1 << 7)
81 
84 /*============================================================================
85  * Type definition
86  *============================================================================*/
87 
88 /* Structure associated to mesh quantities management */
89 
90 typedef struct {
91 
92  cs_real_t *cell_cen; /* Cell center coordinates */
93  cs_real_t *cell_vol; /* Cell volume */
94  cs_real_t *cell_f_vol; /* Cell fluid volume */
95 
96  cs_real_t *i_face_normal; /* Surface normal of interior faces.
97  (L2 norm equals area of the face) */
98  cs_real_t *b_face_normal; /* Surface normal of border faces.
99  (L2 norm equals area of the face) */
100  cs_real_t *i_f_face_normal;/* Fluid Surface normal of interior faces.
101  (L2 norm equals area of the face) */
102  cs_real_t *b_f_face_normal;/* Fluid Surface normal of border faces.
103  (L2 norm equals area of the face) */
104  cs_real_t *i_face_cog; /* Center of gravity of interior faces */
105  cs_real_t *b_face_cog; /* Center of gravity of border faces */
106 
107  cs_real_t *i_face_surf; /* Surface of interior faces. */
108  cs_real_t *b_face_surf; /* Surface of boundary faces. */
109 
110  cs_real_t *i_f_face_surf; /* Fluid surface of interior faces. */
111  cs_real_t *b_f_face_surf; /* Fluid surface of boundary faces. */
112 
113  cs_real_2_t *i_f_face_factor;/* Fluid surface factor of interior faces. */
114  cs_real_t *b_f_face_factor;/* Fluid surface factor of boundary faces. */
115 
116  cs_real_t *dijpf; /* Vector I'J' for interior faces */
117  cs_real_t *diipb; /* Vector II' for border faces */
118  cs_real_t *dofij; /* Vector OF for interior faces */
119  cs_real_t *diipf; /* Vector II' for interior faces */
120  cs_real_t *djjpf; /* Vector JJ' for interior faces */
121 
122  cs_real_t *i_dist; /* Distance between the cell center and
123  the center of gravity of interior faces */
124  cs_real_t *b_dist; /* Distance between the cell center and
125  the center of gravity of border faces */
126 
127  cs_real_t *weight; /* Interior faces weighting factor */
128 
129  cs_real_t min_vol; /* Minimum cell volume */
130  cs_real_t max_vol; /* Maximum cell volume */
131  cs_real_t tot_vol; /* Total volume */
132 
133  cs_real_t min_f_vol; /* Minimum cell volume */
134  cs_real_t max_f_vol; /* Maximum cell volume */
135  cs_real_t tot_f_vol; /* Total volume */
136 
137  cs_real_33_t *cocgb_s_it; /* coupling of gradient components for
138  iterative reconstruction at boundary */
139  cs_real_33_t *cocg_s_it; /* coupling of gradient components for
140  iterative reconstruction */
141  cs_real_33_t *cocgb_s_lsq; /* coupling of gradient components for
142  least-square reconstruction at boundary */
143 
144  cs_real_33_t *cocg_it; /* Interleaved cocg matrix
145  for iterative gradients */
146  cs_real_33_t *cocg_lsq; /* Interleaved cocg matrix
147  for least square gradients */
148 
149  cs_real_t *corr_grad_lin_det; /* Determinant of geometrical matrix
150  linear gradient correction */
151  cs_real_33_t *corr_grad_lin; /* Geometrical matrix
152  linear gradient correction */
153 
154  cs_int_t *b_sym_flag; /* Symmetry flag for boundary faces */
155  cs_int_t *c_solid_flag; /* Is the fluid volume 0 flag */
156  unsigned *bad_cell_flag; /* Flag (mask) for bad cells detected */
157 
159 
160 /*============================================================================
161  * Static global variables
162  *============================================================================*/
163 
164 /* Pointer to mesh quantities structure associated to the main mesh */
165 
167 
168 /* Flag (mask) to activate bad cells correction */
169 extern unsigned cs_glob_mesh_quantities_flag;
170 
171 /* Choice of the porous model */
172 extern int cs_glob_porous_model;
173 
174 /*============================================================================
175  * Public function prototypes for API Fortran
176  *============================================================================*/
177 
178 /*----------------------------------------------------------------------------
179  * Set behavior for computing the cocg matrixes for the iterative algo
180  * and for the Least square method for scalar and vector gradients.
181  *
182  * Fortran interface :
183  *
184  * subroutine comcoc (imrgra)
185  * *****************
186  *
187  * integer imrgra : <-- : gradient reconstruction option
188  *----------------------------------------------------------------------------*/
189 
190 void
191 CS_PROCF (comcoc, COMCOC) (const cs_int_t *const imrgra);
192 
193 /*----------------------------------------------------------------------------
194  * Set porous model
195  *
196  * Fortran interface :
197  *
198  * subroutine compor (iporos)
199  * *****************
200  *
201  * integer iporos : <-- : porous model
202  *----------------------------------------------------------------------------*/
203 
204 void
205 CS_PROCF (compor, COMPOR) (const cs_int_t *const iporos);
206 
207 /*=============================================================================
208  * Public function prototypes
209  *============================================================================*/
210 
211 /*----------------------------------------------------------------------------*/
221 /*----------------------------------------------------------------------------*/
222 
223 int
224 cs_mesh_quantities_cell_cen_choice(int algo_choice);
225 
226 /*----------------------------------------------------------------------------*/
237 /*----------------------------------------------------------------------------*/
238 
239 int
240 cs_mesh_quantities_face_cog_choice(int algo_choice);
241 
242 /*----------------------------------------------------------------------------
243  * Compute cocg for iterative gradient reconstruction for scalars.
244  *
245  * parameters:
246  * gradient_option <-- gradient option (Fortran IMRGRA)
247  *----------------------------------------------------------------------------*/
248 
249 void
250 cs_mesh_quantities_set_cocg_options(int gradient_option);
251 
252 /*----------------------------------------------------------------------------
253  * Compute Fluid volumes and fluid surface in addition to cell volume and surfaces.
254  *
255  * parameters:
256  * porous_model <-- gradient option (Fortran iporos)
257  *----------------------------------------------------------------------------*/
258 
259 void
260 cs_mesh_quantities_set_porous_model(int porous_model);
261 
262 /*----------------------------------------------------------------------------*/
268 /*----------------------------------------------------------------------------*/
269 
272 
273 /*----------------------------------------------------------------------------*/
281 /*----------------------------------------------------------------------------*/
282 
285 
286 /*----------------------------------------------------------------------------*/
292 /*----------------------------------------------------------------------------*/
293 
294 void
296 
297 /*----------------------------------------------------------------------------*/
304 /*----------------------------------------------------------------------------*/
305 
306 void
308  cs_mesh_quantities_t *mesh_quantities);
309 
310 /*----------------------------------------------------------------------------*/
317 /*----------------------------------------------------------------------------*/
318 
319 void
321  cs_mesh_quantities_t *mesh_quantities);
322 
323 /*----------------------------------------------------------------------------
324  * Compute fluid mesh quantities
325  *
326  * parameters:
327  * mesh <-- pointer to a cs_mesh_t structure
328  * mesh_quantities <-> pointer to a cs_mesh_quantities_t structure
329  *----------------------------------------------------------------------------*/
330 
331 void
333  cs_mesh_quantities_t *mesh_quantities);
334 
335 /*----------------------------------------------------------------------------
336  * Compute fluid section mesh quantities at the initial step
337  *
338  * parameters:
339  * mesh <-- pointer to a cs_mesh_t structure
340  * mesh_quantities <-> pointer to a cs_mesh_quantities_t structure
341  *----------------------------------------------------------------------------*/
342 
343 void
345  cs_mesh_quantities_t *mesh_quantities);
346 
347 /*----------------------------------------------------------------------------
348  * Compute mesh quantities
349  *
350  * parameters:
351  * mesh <-- pointer to a cs_mesh_t structure
352  * mesh_quantities <-> pointer to a cs_mesh_quantities_t structure
353  *----------------------------------------------------------------------------*/
354 
355 void
357  cs_mesh_quantities_t *mesh_quantities);
358 
359 /*----------------------------------------------------------------------------
360  * Compute internal and border face normal.
361  *
362  * parameters:
363  * mesh <-- pointer to a cs_mesh_t structure
364  * p_i_face_normal <-> pointer to the internal face normal array
365  * p_b_face_normal <-> pointer to the border face normal array
366  *----------------------------------------------------------------------------*/
367 
368 void
370  cs_real_t *p_i_face_normal[],
371  cs_real_t *p_b_face_normal[]);
372 
373 /*----------------------------------------------------------------------------
374  * Compute interior face centers and normals.
375  *
376  * The corresponding arrays are allocated by this function, and it is the
377  * caller's responsibility to free them when they are no longer needed.
378  *
379  * parameters:
380  * mesh <-- pointer to a cs_mesh_t structure
381  * p_i_face_cog <-> pointer to the interior face center array
382  * p_i_face_normal <-> pointer to the interior face normal array
383  *----------------------------------------------------------------------------*/
384 
385 void
387  cs_real_t *p_i_face_cog[],
388  cs_real_t *p_i_face_normal[]);
389 
390 /*----------------------------------------------------------------------------
391  * Compute border face centers and normals.
392  *
393  * The corresponding arrays are allocated by this function, and it is the
394  * caller's responsibility to free them when they are no longer needed.
395  *
396  * parameters:
397  * mesh <-- pointer to a cs_mesh_t structure
398  * p_b_face_cog <-> pointer to the border face center array
399  * p_b_face_normal <-> pointer to the border face normal array
400  *----------------------------------------------------------------------------*/
401 
402 void
404  cs_real_t *p_b_face_cog[],
405  cs_real_t *p_b_face_normal[]);
406 
407 /*----------------------------------------------------------------------------*/
427 /*----------------------------------------------------------------------------*/
428 
429 void
431  const cs_real_t i_face_norm[],
432  const cs_real_t i_face_cog[],
433  const cs_real_t b_face_norm[],
434  const cs_real_t b_face_cog[],
435  cs_real_t cell_cen[]);
436 
437 /*----------------------------------------------------------------------------
438  * Compute cell volumes.
439  *
440  * The corresponding array is allocated by this function, and it is the
441  * caller's responsability to free it when they are no longer needed.
442  *
443  * parameters:
444  * mesh <-- pointer to a cs_mesh_t structure
445  *
446  * return:
447  * pointer to newly allocated cell volumes array
448  *----------------------------------------------------------------------------*/
449 
450 cs_real_t *
452 
453 /*----------------------------------------------------------------------------
454  * Check that no negative volumes are present, and exit on error otherwise.
455  *
456  * parameters:
457  * mesh <-- pointer to mesh structure
458  * mesh_quantities <-- pointer to mesh quantities structure
459  * allow_error <-- 1 if errors are allowed, 0 otherwise
460  *----------------------------------------------------------------------------*/
461 
462 void
464  const cs_mesh_quantities_t *mesh_quantities,
465  int allow_error);
466 
467 /*----------------------------------------------------------------------------
468  * Update mesh quantities relative to extended ghost cells when the
469  * neighborhood is reduced.
470  *
471  * parameters:
472  * mesh <-- pointer to a cs_mesh_t structure
473  * mesh_quantities <-> pointer to a cs_mesh_quantities_t structure
474  *----------------------------------------------------------------------------*/
475 
476 void
478  cs_mesh_quantities_t *mesh_quantities);
479 
480 /*----------------------------------------------------------------------------
481  * Return the number of times mesh quantities have been computed.
482  *
483  * returns:
484  * number of times mesh quantities have been computed
485  *----------------------------------------------------------------------------*/
486 
487 int
489 
490 /*----------------------------------------------------------------------------*/
500 /*----------------------------------------------------------------------------*/
501 
502 void
504  const cs_mesh_quantities_t *mq,
505  int n_passes,
506  cs_real_t b_thickness[]);
507 
508 /*----------------------------------------------------------------------------*/
517 /*----------------------------------------------------------------------------*/
518 
519 void
521  const cs_mesh_quantities_t *mq,
522  int n_passes,
523  cs_real_t b_thickness[]);
524 
525 /*----------------------------------------------------------------------------*/
529 /*----------------------------------------------------------------------------*/
530 
531 void
533 
534 /*----------------------------------------------------------------------------
535  * Dump a cs_mesh_quantities_t structure
536  *
537  * parameters:
538  * mesh <-- pointer to a cs_mesh_t structure
539  * mesh_quantities <-- pointer to a cs_mesh_quantities_t structure
540  *----------------------------------------------------------------------------*/
541 
542 void
544  const cs_mesh_quantities_t *mesh_quantities);
545 
546 /*----------------------------------------------------------------------------
547  * Compute 3x3 matrix cocg for the scalar gradient least squares algorithm
548  * adapted for internal coupling.
549  *
550  * parameters:
551  * m <-- mesh
552  * fvq <-> mesh quantities
553  * ce <-> coupling
554  *----------------------------------------------------------------------------*/
555 
556 void
560 
561 /*----------------------------------------------------------------------------
562  * Compute 3x3 matrix cocg for the scalar gradient iterative algorithm
563  * adapted for internal coupling.
564  *
565  * parameters:
566  * m <-- mesh
567  * fvq <-> mesh quantities
568  * ce <-> coupling
569  *----------------------------------------------------------------------------*/
570 
571 void
575 
576 /*----------------------------------------------------------------------------*/
577 
579 
580 #endif /* __CS_MESH_QUANTITIES_H__ */
void cs_mesh_quantities_check_vol(const cs_mesh_t *mesh, const cs_mesh_quantities_t *mesh_quantities, int allow_error)
Definition: cs_mesh_quantities.c:3643
cs_real_33_t * cocgb_s_lsq
Definition: cs_mesh_quantities.h:141
void cs_mesh_quantities_reduce_extended(const cs_mesh_t *mesh, cs_mesh_quantities_t *mesh_quantities)
Definition: cs_mesh_quantities.c:3695
void cs_mesh_quantities_dump(const cs_mesh_t *mesh, const cs_mesh_quantities_t *mesh_quantities)
Definition: cs_mesh_quantities.c:3905
cs_real_t cs_real_2_t[2]
vector of 2 floating-point values
Definition: cs_defs.h:309
cs_real_t * b_dist
Definition: cs_mesh_quantities.h:124
void cs_mesh_quantities_b_thickness_v(const cs_mesh_t *m, const cs_mesh_quantities_t *mq, int n_passes, cs_real_t b_thickness[])
Determine local boundary thickness around each vertex.
Definition: cs_mesh_quantities.c:3728
cs_real_t * corr_grad_lin_det
Definition: cs_mesh_quantities.h:149
integer, save iporos
Definition: optcal.f90:1085
cs_real_t * cell_f_vol
Definition: cs_mesh_quantities.h:94
cs_real_t * b_face_surf
Definition: cs_mesh_quantities.h:108
cs_real_t * cs_mesh_quantities_cell_volume(const cs_mesh_t *mesh)
Definition: cs_mesh_quantities.c:3602
cs_real_t * djjpf
Definition: cs_mesh_quantities.h:120
void cs_mesh_quantities_compute_preprocess(const cs_mesh_t *mesh, cs_mesh_quantities_t *mesh_quantities)
Compute mesh quantities needed for preprocessing.
Definition: cs_mesh_quantities.c:2821
cs_real_t min_f_vol
Definition: cs_mesh_quantities.h:133
cs_int_t * c_solid_flag
Definition: cs_mesh_quantities.h:155
Definition: cs_internal_coupling.h:62
cs_real_t max_f_vol
Definition: cs_mesh_quantities.h:134
#define BEGIN_C_DECLS
Definition: cs_defs.h:462
int cs_int_t
Fortran-compatible integer.
Definition: cs_defs.h:296
void cs_compute_cell_cocg_it_coupling(const cs_mesh_t *m, cs_mesh_quantities_t *fvq, cs_internal_coupling_t *ce)
Definition: cs_mesh_quantities.c:4020
cs_real_33_t * corr_grad_lin
Definition: cs_mesh_quantities.h:151
cs_mesh_quantities_t * cs_mesh_quantities_destroy(cs_mesh_quantities_t *mesh_quantities)
Destroy a mesh quantities structure.
Definition: cs_mesh_quantities.c:2751
int cs_mesh_quantities_face_cog_choice(int algo_choice)
Query or modification of the option for computing face centers.
Definition: cs_mesh_quantities.c:2612
cs_real_t * diipf
Definition: cs_mesh_quantities.h:119
cs_real_t * dofij
Definition: cs_mesh_quantities.h:118
cs_real_t * b_face_cog
Definition: cs_mesh_quantities.h:105
double cs_real_t
Floating-point value.
Definition: cs_defs.h:297
void cs_mesh_quantities_face_normal(const cs_mesh_t *mesh, cs_real_t *p_i_face_normal[], cs_real_t *p_b_face_normal[])
Definition: cs_mesh_quantities.c:3351
cs_real_t max_vol
Definition: cs_mesh_quantities.h:130
unsigned * bad_cell_flag
Definition: cs_mesh_quantities.h:156
Definition: cs_mesh.h:63
void cs_mesh_quantities_free_all(cs_mesh_quantities_t *mq)
Reset a mesh quantities structure to its empty initial state.
Definition: cs_mesh_quantities.c:2769
cs_real_33_t * cocg_s_it
Definition: cs_mesh_quantities.h:139
cs_real_t * i_f_face_normal
Definition: cs_mesh_quantities.h:100
void cs_mesh_init_fluid_sections(const cs_mesh_t *mesh, cs_mesh_quantities_t *mesh_quantities)
Definition: cs_mesh_quantities.c:3271
int cs_mesh_quantities_cell_cen_choice(int algo_choice)
Query or modification of the option for computing cell centers.
Definition: cs_mesh_quantities.c:2590
cs_real_t tot_vol
Definition: cs_mesh_quantities.h:131
cs_real_t tot_f_vol
Definition: cs_mesh_quantities.h:135
void cs_mesh_quantities_set_cocg_options(int gradient_option)
Definition: cs_mesh_quantities.c:2628
cs_real_t * dijpf
Definition: cs_mesh_quantities.h:116
void cs_mesh_quantities_b_faces(const cs_mesh_t *mesh, cs_real_t *p_b_face_cog[], cs_real_t *p_b_face_normal[])
Definition: cs_mesh_quantities.c:3431
cs_real_t * cell_cen
Definition: cs_mesh_quantities.h:92
cs_mesh_quantities_t * cs_glob_mesh_quantities
cs_real_t * i_dist
Definition: cs_mesh_quantities.h:122
cs_real_t * i_face_normal
Definition: cs_mesh_quantities.h:96
Definition: cs_mesh_quantities.h:90
cs_real_2_t * i_f_face_factor
Definition: cs_mesh_quantities.h:113
cs_real_33_t * cocgb_s_it
Definition: cs_mesh_quantities.h:137
int cs_glob_porous_model
cs_mesh_quantities_t * cs_mesh_quantities_create(void)
Create a mesh quantities structure.
Definition: cs_mesh_quantities.c:2697
void comcoc(const cs_int_t *const imrgra)
Definition: cs_mesh_quantities.c:2551
unsigned cs_glob_mesh_quantities_flag
void cs_mesh_quantities_log_setup(void)
Log mesh quantities options to setup file.
Definition: cs_mesh_quantities.c:3860
cs_real_t * b_f_face_surf
Definition: cs_mesh_quantities.h:111
cs_real_t * weight
Definition: cs_mesh_quantities.h:127
cs_real_t * b_f_face_factor
Definition: cs_mesh_quantities.h:114
cs_real_t min_vol
Definition: cs_mesh_quantities.h:129
#define END_C_DECLS
Definition: cs_defs.h:463
cs_real_33_t * cocg_it
Definition: cs_mesh_quantities.h:144
void cs_mesh_quantities_cell_faces_cog(const cs_mesh_t *mesh, const cs_real_t i_face_norm[], const cs_real_t i_face_cog[], const cs_real_t b_face_norm[], const cs_real_t b_face_cog[], cs_real_t cell_cen[])
Compute approximate cells centers as the mean of the given face centers weighted by the associated su...
Definition: cs_mesh_quantities.c:3474
cs_real_t * i_f_face_surf
Definition: cs_mesh_quantities.h:110
void cs_compute_cell_cocg_lsq_coupling(const cs_mesh_t *m, cs_mesh_quantities_t *fvq, cs_internal_coupling_t *ce)
Definition: cs_mesh_quantities.c:4002
#define CS_PROCF(x, y)
Definition: cs_defs.h:476
void cs_mesh_quantities_fluid_compute(const cs_mesh_t *mesh, cs_mesh_quantities_t *mesh_quantities)
Definition: cs_mesh_quantities.c:3255
cs_real_t cs_real_33_t[3][3]
3x3 matrix of floating-point values
Definition: cs_defs.h:316
cs_real_t * b_face_normal
Definition: cs_mesh_quantities.h:98
cs_real_t * diipb
Definition: cs_mesh_quantities.h:117
cs_real_t * cell_vol
Definition: cs_mesh_quantities.h:93
void cs_mesh_quantities_b_thickness_f(const cs_mesh_t *m, const cs_mesh_quantities_t *mq, int n_passes, cs_real_t b_thickness[])
Determine local boundary thickness around each boundary face.
Definition: cs_mesh_quantities.c:3818
void cs_mesh_quantities_compute(const cs_mesh_t *mesh, cs_mesh_quantities_t *mesh_quantities)
Compute mesh quantities.
Definition: cs_mesh_quantities.c:3055
void cs_mesh_quantities_sup_vectors(const cs_mesh_t *mesh, cs_mesh_quantities_t *mesh_quantities)
Definition: cs_mesh_quantities.c:3317
void compor(const cs_int_t *const iporos)
Definition: cs_mesh_quantities.c:2568
cs_real_t * i_face_surf
Definition: cs_mesh_quantities.h:107
int cs_mesh_quantities_compute_count(void)
Definition: cs_mesh_quantities.c:3710
cs_real_t * i_face_cog
Definition: cs_mesh_quantities.h:104
cs_int_t * b_sym_flag
Definition: cs_mesh_quantities.h:154
Definition: mesh.f90:26
integer(c_int), pointer, save imrgra
type of gradient reconstruction
Definition: optcal.f90:286
cs_real_33_t * cocg_lsq
Definition: cs_mesh_quantities.h:146
cs_real_t * b_f_face_normal
Definition: cs_mesh_quantities.h:102
void cs_mesh_quantities_set_porous_model(int porous_model)
Definition: cs_mesh_quantities.c:2683
void cs_mesh_quantities_i_faces(const cs_mesh_t *mesh, cs_real_t *p_i_face_cog[], cs_real_t *p_i_face_normal[])
Definition: cs_mesh_quantities.c:3398