Skip to content

Commit 59cc71e

Browse files
committed
Consistency fixes and cleanup in linear solvers handling.
Also attempt to tune some defaul k-cycle parameters. This includes adding a flexible congugate gradient, similar to the incomplete congugate gradient, but grouping global reductions into a single step.
1 parent e36a834 commit 59cc71e

10 files changed

+882
-506
lines changed

docs/style/csbiblio.bib

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -980,6 +980,16 @@ @article{Kahan:1965
980980
author = "Kahan, W.",
981981
}
982982

983+
@article{Notay:2015,
984+
title = "A massively parallel solver for discrete Poisson-like problems",
985+
journal = "J. Comput. Physiscs",
986+
volume = "281",
987+
pages = "237 - 250",
988+
year = "2015",
989+
doi = "https://doi.org/10.1016/j.jcp.2014.10.043",
990+
author = "Notay, Y. and Napov, A.",
991+
}
992+
983993
% Examples
984994
@InProceedings{Toto:2000b,
985995
author = {Toto, T.},

gui/Pages/NumericalParamEquationModel.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,6 +574,7 @@ def setSolverChoice(self, name, value):
574574
""" Put choice of solver for variable labelled name """
575575
self.isInList(value, ('multigrid', 'multigrid_k_cycle',
576576
'conjugate_gradient',
577+
'flexible_conjugate_gradient',
577578
'inexact_conjugate_gradient', 'jacobi',
578579
'bi_cgstab', 'bi_cgstab2', 'gmres', 'automatic',
579580
'gauss_seidel', 'symmetric_gauss_seidel', 'PCR3'))

gui/Pages/NumericalParamEquationView.py

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ def createEditor(self, parent, option, index):
121121
mg = index.model().dataSolver[index.row()]['mg']
122122
editor.addItem("Automatic")
123123
editor.addItem("Conjugate gradient")
124+
editor.addItem("Flexible conjugate gradient")
124125
editor.addItem("Inexact conjugate gradient")
125126
editor.addItem("Jacobi")
126127
editor.addItem("BiCGstab")
@@ -139,16 +140,17 @@ def createEditor(self, parent, option, index):
139140
def setEditorData(self, comboBox, index):
140141
dico = {"automatic": 0,
141142
"conjugate_gradient": 1,
142-
"inexact_conjugate_gradient": 2,
143-
"jacobi": 3,
144-
"bi_cgstab": 4,
145-
"bi_cgstab2": 5,
146-
"gmres": 6,
147-
"gauss_seidel": 7,
148-
"symmetric_gauss_seidel": 8,
149-
"PCR3": 9,
150-
"multigrid": 10,
151-
"multigrid_k_cycle": 11}
143+
"flexible_conjugate_gradient": 2,
144+
"inexact_conjugate_gradient": 3,
145+
"jacobi": 4,
146+
"bi_cgstab": 5,
147+
"bi_cgstab2": 6,
148+
"gmres": 7,
149+
"gauss_seidel": 8,
150+
"symmetric_gauss_seidel": 9,
151+
"PCR3": 10,
152+
"multigrid": 11,
153+
"multigrid_k_cycle": 12}
152154
row = index.row()
153155
string = index.model().dataSolver[row]['iresol']
154156
idx = dico[string]
@@ -511,7 +513,8 @@ def populateModel(self):
511513
self.dicoV2M= {"Multigrid, V-cycle" : 'multigrid',
512514
"Multigrid, K-cycle" : 'multigrid_k_cycle',
513515
"Conjugate gradient" : 'conjugate_gradient',
514-
"Inexact conjugate gradient" : 'inexact_conjugate_gradient',
516+
"Flexible conjugate gradient" : 'flexible_conjugate_gradient',
517+
"Inexact conjugate gradient" : 'inexact_conjugate_gradient',
515518
"Jacobi" : 'jacobi',
516519
"BiCGstab" : 'bi_cgstab',
517520
"BiCGstab2" : 'bi_cgstab2',
@@ -525,7 +528,8 @@ def populateModel(self):
525528
self.dicoM2V= {"multigrid" : 'Multigrid, V-cycle',
526529
"multigrid_k_cycle" : 'Multigrid, K-cycle',
527530
"conjugate_gradient" : 'Conjugate gradient',
528-
"inexact_conjugate_gradient" : 'Inexact conjugate gradient',
531+
"inexact_conjugate_gradient" : 'Inexact conjugate gradient',
532+
"flexible_conjugate_gradient" : 'Flexible conjugate gradient',
529533
"jacobi" : 'Jacobi',
530534
"bi_cgstab" : 'BiCGstab',
531535
"bi_cgstab2" : 'BiCGstab2',

po/fr.po

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ msgid ""
77
msgstr ""
88
"Project-Id-Version: code-saturne\n"
99
"Report-Msgid-Bugs-To: [email protected]\n"
10-
"POT-Creation-Date: 2018-08-14 00:10+0200\n"
10+
"POT-Creation-Date: 2018-08-19 03:59+0200\n"
1111
"PO-Revision-Date: 2012-01-26 12:00+0100\n"
1212
"Last-Translator: Code_Saturne <[email protected]>\n"
1313
"Language-Team: French <[email protected]>\n"
@@ -3943,6 +3943,9 @@ msgstr "Gradient conjugué"
39433943
msgid "Inexact Preconditioned Conjugate Gradient"
39443944
msgstr "Gradient conjugué préconditioné inexact"
39453945

3946+
msgid "Flexible Conjugate Gradient"
3947+
msgstr "Gradient conjugué flexible"
3948+
39463949
msgid "Jacobi"
39473950
msgstr "Jacobi"
39483951

@@ -3955,11 +3958,17 @@ msgstr "BiCGstab2"
39553958
msgid "GMRES"
39563959
msgstr ""
39573960

3958-
msgid "Local Gauss-Seidel"
3959-
msgstr "Gauss-Seidel local"
3961+
msgid "Gauss-Seidel"
3962+
msgstr "Gauss-Seidel"
3963+
3964+
msgid "Symmetric Gauss-Seidel"
3965+
msgstr "Gauss-Seidel symmétrique"
3966+
3967+
msgid "Local forward Gauss-Seidel"
3968+
msgstr "Gauss-Seidel local avant"
39603969

3961-
msgid "Local symmetric Gauss-Seidel"
3962-
msgstr "Gauss-Seidel symmétrique local"
3970+
msgid "Local backwards Gauss-Seidel"
3971+
msgstr "Gauss-Seidel local arrière"
39633972

39643973
msgid "3-layer conjugate residual"
39653974
msgstr "Résidu conjugué à 3 couches"
@@ -4096,22 +4105,22 @@ msgstr ""
40964105
" Préparation du solveur pour le système linéaire \"%s\"\n"
40974106

40984107
#, c-format
4099-
msgid ""
4100-
" RHS norm: %11.4e\n"
4101-
"\n"
4108+
msgid "GMRES not supported with block_size > 1 (%s)."
41024109
msgstr ""
4103-
" Norme du second-membre : %11.4e\n"
4104-
"\n"
41054110

41064111
#, c-format
4107-
msgid "GMRES not supported with block_size > 1 (%s)."
4112+
msgid ""
4113+
"Setup of linear equation on \"%s\"\n"
4114+
"with solver type %d, which is not defined)."
41084115
msgstr ""
41094116

41104117
#, c-format
41114118
msgid ""
4112-
"Resolution of linear equation on \"%s\"\n"
4113-
"with solver type %d, which is not defined)."
4119+
" RHS norm: %11.4e\n"
4120+
"\n"
41144121
msgstr ""
4122+
" Norme du second-membre : %11.4e\n"
4123+
"\n"
41154124

41164125
#, c-format
41174126
msgid ""

src/alge/cs_grid.c

Lines changed: 75 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2599,9 +2599,11 @@ _automatic_aggregation_mx_native(const cs_grid_t *f,
25992599
}
26002600

26012601
/* Check if the line seems penalized or not. */
2602-
for (cs_lnum_t ii = 0; ii < f_n_rows; ii++) {
2603-
if (d_val[ii] > _penalization_threshold * sum[ii])
2604-
penalize[ii] = true;
2602+
if (f->level == 0) {
2603+
for (cs_lnum_t ii = 0; ii < f_n_rows; ii++) {
2604+
if (d_val[ii] > _penalization_threshold * sum[ii])
2605+
penalize[ii] = true;
2606+
}
26052607
}
26062608
BFT_FREE(sum);
26072609

@@ -2722,6 +2724,7 @@ _automatic_aggregation_mx_msr(const cs_grid_t *f,
27222724
int _max_aggregation = 1, npass = 0;
27232725

27242726
const cs_lnum_t f_n_rows = f->n_rows;
2727+
const cs_real_t p_test = (f->level == 0) ? 1. : -1;
27252728

27262729
cs_lnum_t aggr_count = f_n_rows;
27272730
cs_lnum_t *c_aggr_count;
@@ -2792,7 +2795,7 @@ _automatic_aggregation_mx_msr(const cs_grid_t *f,
27922795
}
27932796

27942797
/* Check if the line seems penalized or not. */
2795-
if (d_val[ii] > _penalization_threshold * sum)
2798+
if (d_val[ii]*p_test > _penalization_threshold * sum)
27962799
penalize[ii] = true;
27972800

27982801
}
@@ -5110,8 +5113,6 @@ cs_grid_restrict_row_var(const cs_grid_t *f,
51105113
const cs_real_t *f_var,
51115114
cs_real_t *c_var)
51125115
{
5113-
int i;
5114-
51155116
cs_lnum_t f_n_rows = f->n_rows;
51165117
cs_lnum_t c_n_cols_ext = c->n_elts_r[1];
51175118

@@ -5130,21 +5131,38 @@ cs_grid_restrict_row_var(const cs_grid_t *f,
51305131

51315132
cs_lnum_t _c_n_cols_ext = c_n_cols_ext*db_size[0];
51325133

5133-
# pragma omp parallel for private(i) if(_c_n_cols_ext > CS_THR_MIN)
5134+
# pragma omp parallel for if(_c_n_cols_ext > CS_THR_MIN)
51345135
for (cs_lnum_t ii = 0; ii < _c_n_cols_ext; ii++)
51355136
c_var[ii] = 0.;
51365137

5137-
if (db_size[0] == 1) {
5138-
for (cs_lnum_t ii = 0; ii < f_n_rows; ii++) {
5139-
i = coarse_row[ii];
5140-
if (i >= 0)
5141-
c_var[i] += f_var[ii];
5138+
if (f->level == 0) { /* possible penalization at first level */
5139+
5140+
if (db_size[0] == 1) {
5141+
for (cs_lnum_t ii = 0; ii < f_n_rows; ii++) {
5142+
cs_lnum_t i = coarse_row[ii];
5143+
if (i >= 0)
5144+
c_var[i] += f_var[ii];
5145+
}
5146+
}
5147+
else {
5148+
for (cs_lnum_t ii = 0; ii < f_n_rows; ii++) {
5149+
cs_lnum_t i = coarse_row[ii];
5150+
if (i >= 0) {
5151+
for (cs_lnum_t j = 0; j < db_size[0]; j++)
5152+
c_var[i*db_size[1]+j] += f_var[ii*db_size[1]+j];
5153+
}
5154+
}
51425155
}
51435156
}
5157+
51445158
else {
5145-
for (cs_lnum_t ii = 0; ii < f_n_rows; ii++) {
5146-
i = coarse_row[ii];
5147-
if (i >= 0) {
5159+
if (db_size[0] == 1) {
5160+
for (cs_lnum_t ii = 0; ii < f_n_rows; ii++)
5161+
c_var[coarse_row[ii]] += f_var[ii];
5162+
}
5163+
else {
5164+
for (cs_lnum_t ii = 0; ii < f_n_rows; ii++) {
5165+
cs_lnum_t i = coarse_row[ii];
51485166
for (cs_lnum_t j = 0; j < db_size[0]; j++)
51495167
c_var[i*db_size[1]+j] += f_var[ii*db_size[1]+j];
51505168
}
@@ -5198,7 +5216,6 @@ cs_grid_prolong_row_num(const cs_grid_t *c,
51985216
int *c_num,
51995217
int *f_num)
52005218
{
5201-
cs_lnum_t ii;
52025219
const cs_lnum_t *coarse_row;
52035220
const int *_c_num = c_num;
52045221

@@ -5214,12 +5231,12 @@ cs_grid_prolong_row_num(const cs_grid_t *c,
52145231
_scatter_row_num(c, c_num);
52155232
#endif
52165233

5217-
/* Set fine values */
5234+
/* Set fine values (possible penalization at first level) */
52185235

52195236
coarse_row = c->coarse_row;
52205237

52215238
# pragma omp parallel for if(f_n_rows > CS_THR_MIN)
5222-
for (ii = 0; ii < f_n_rows; ii++){
5239+
for (cs_lnum_t ii = 0; ii < f_n_rows; ii++) {
52235240
cs_lnum_t i = coarse_row[ii];
52245241
if (i >= 0)
52255242
f_num[ii] = _c_num[i];
@@ -5288,34 +5305,56 @@ cs_grid_prolong_row_var(const cs_grid_t *c,
52885305

52895306
#endif /* defined(HAVE_MPI) */
52905307

5291-
/* Set fine values */
5308+
/* Set fine values (possible penalization at first level) */
52925309

52935310
coarse_row = c->coarse_row;
52945311

5295-
if (db_size[0] == 1) {
5296-
# pragma omp parallel if(f_n_rows > CS_THR_MIN)
5297-
for (cs_lnum_t ii = 0; ii < f_n_rows; ii++) {
5298-
cs_lnum_t ic = coarse_row[ii];
5299-
if (ic >= 0) {
5300-
f_var[ii] = _c_var[ic];
5312+
if (f->level == 0) {
5313+
5314+
if (db_size[0] == 1) {
5315+
# pragma omp parallel if(f_n_rows > CS_THR_MIN)
5316+
for (cs_lnum_t ii = 0; ii < f_n_rows; ii++) {
5317+
cs_lnum_t ic = coarse_row[ii];
5318+
if (ic >= 0) {
5319+
f_var[ii] = _c_var[ic];
5320+
}
5321+
else
5322+
f_var[ii] = 0;
53015323
}
5302-
else
5303-
f_var[ii] = 0;
53045324
}
5325+
else {
5326+
# pragma omp parallel if(f_n_rows > CS_THR_MIN)
5327+
for (cs_lnum_t ii = 0; ii < f_n_rows; ii++) {
5328+
cs_lnum_t ic = coarse_row[ii];
5329+
if (ic >= 0) {
5330+
for (cs_lnum_t i = 0; i < db_size[0]; i++)
5331+
f_var[ii*db_size[1]+i] = _c_var[ic*db_size[1]+i];
5332+
}
5333+
else {
5334+
for (cs_lnum_t i = 0; i < db_size[0]; i++)
5335+
f_var[ii*db_size[1]+i] = 0;
5336+
}
5337+
}
5338+
}
5339+
53055340
}
5306-
else {
5307-
# pragma omp parallel if(f_n_rows > CS_THR_MIN)
5308-
for (cs_lnum_t ii = 0; ii < f_n_rows; ii++) {
5309-
cs_lnum_t ic = coarse_row[ii];
5310-
if (ic >= 0) {
5341+
5342+
else { /* coarser levels, no need for penaliation tests */
5343+
5344+
if (db_size[0] == 1) {
5345+
# pragma omp parallel if(f_n_rows > CS_THR_MIN)
5346+
for (cs_lnum_t ii = 0; ii < f_n_rows; ii++)
5347+
f_var[ii] = _c_var[coarse_row[ii]];
5348+
}
5349+
else {
5350+
# pragma omp parallel if(f_n_rows > CS_THR_MIN)
5351+
for (cs_lnum_t ii = 0; ii < f_n_rows; ii++) {
5352+
cs_lnum_t ic = coarse_row[ii];
53115353
for (cs_lnum_t i = 0; i < db_size[0]; i++)
53125354
f_var[ii*db_size[1]+i] = _c_var[ic*db_size[1]+i];
53135355
}
5314-
else {
5315-
for (cs_lnum_t i = 0; i < db_size[0]; i++)
5316-
f_var[ii*db_size[1]+i] = 0;
5317-
}
53185356
}
5357+
53195358
}
53205359
}
53215360

0 commit comments

Comments
 (0)