-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathamgxsolver_8hpp_source.html
530 lines (528 loc) · 81.2 KB
/
amgxsolver_8hpp_source.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
<!-- HTML header for doxygen 1.9.6-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.11.0"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>MFEM: linalg/amgxsolver.hpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="cookie.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
window.MathJax = {
options: {
ignoreHtmlClass: 'tex2jax_ignore',
processHtmlClass: 'tex2jax_process'
},
loader: {
load: ['[tex]/ams']
},
tex: {
macros: {},
packages: ['base','configmacros','ams']
}
};
</script>
<script type="text/javascript" id="MathJax-script" async="async" src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen-awesome.css" rel="stylesheet" type="text/css"/>
<link href="customization.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="doxygen-awesome-darkmode-toggle.js"></script>
<script type="text/javascript">
DoxygenAwesomeDarkModeToggle.init()
</script>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr id="projectrow">
<td id="projectlogo"><img alt="Logo" src="logo-small.png"/></td>
<td id="projectalign">
<div id="projectname">MFEM<span id="projectnumber"> v4.8.0</span>
</div>
<div id="projectbrief">Finite element discretization library</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.11.0 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search/",'.html');
/* @license-end */
</script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
$(function() { codefold.init(0); });
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
$(function() {
initMenu('',true,false,'search.php','Search',false);
$(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
$(function(){ initResizable(false); });
/* @license-end */
</script>
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<div id="MSearchResults">
<div class="SRPage">
<div id="SRIndex">
<div id="SRResults"></div>
<div class="SRStatus" id="Loading">Loading...</div>
<div class="SRStatus" id="Searching">Searching...</div>
<div class="SRStatus" id="NoMatches">No Matches</div>
</div>
</div>
</div>
</div>
<div id="nav-path" class="navpath">
<ul>
<li class="navelem"><a class="el" href="dir_c1845e5bf011c2136883d0d7188f50e9.html">linalg</a></li> </ul>
</div>
</div><!-- top -->
<div id="doc-content">
<div class="header">
<div class="headertitle"><div class="title">amgxsolver.hpp</div></div>
</div><!--header-->
<div class="contents">
<a href="amgxsolver_8hpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a id="l00001" name="l00001"></a><span class="lineno"> 1</span><span class="comment">// Copyright (c) 2010-2025, Lawrence Livermore National Security, LLC. Produced</span></div>
<div class="line"><a id="l00002" name="l00002"></a><span class="lineno"> 2</span><span class="comment">// at the Lawrence Livermore National Laboratory. All Rights reserved. See files</span></div>
<div class="line"><a id="l00003" name="l00003"></a><span class="lineno"> 3</span><span class="comment">// LICENSE and NOTICE for details. LLNL-CODE-806117.</span></div>
<div class="line"><a id="l00004" name="l00004"></a><span class="lineno"> 4</span><span class="comment">//</span></div>
<div class="line"><a id="l00005" name="l00005"></a><span class="lineno"> 5</span><span class="comment">// This file is part of the MFEM library. For more information and source code</span></div>
<div class="line"><a id="l00006" name="l00006"></a><span class="lineno"> 6</span><span class="comment">// availability visit https://mfem.org.</span></div>
<div class="line"><a id="l00007" name="l00007"></a><span class="lineno"> 7</span><span class="comment">//</span></div>
<div class="line"><a id="l00008" name="l00008"></a><span class="lineno"> 8</span><span class="comment">// MFEM is free software; you can redistribute it and/or modify it under the</span></div>
<div class="line"><a id="l00009" name="l00009"></a><span class="lineno"> 9</span><span class="comment">// terms of the BSD-3 license. We welcome feedback and contributions, see file</span></div>
<div class="line"><a id="l00010" name="l00010"></a><span class="lineno"> 10</span><span class="comment">// CONTRIBUTING.md for details.</span></div>
<div class="line"><a id="l00011" name="l00011"></a><span class="lineno"> 11</span> </div>
<div class="line"><a id="l00012" name="l00012"></a><span class="lineno"> 12</span><span class="preprocessor">#ifndef MFEM_AMGX_SOLVER</span></div>
<div class="line"><a id="l00013" name="l00013"></a><span class="lineno"> 13</span><span class="preprocessor">#define MFEM_AMGX_SOLVER</span></div>
<div class="line"><a id="l00014" name="l00014"></a><span class="lineno"> 14</span> </div>
<div class="line"><a id="l00015" name="l00015"></a><span class="lineno"> 15</span><span class="preprocessor">#include "<a class="code" href="config_8hpp.html">../config/config.hpp</a>"</span></div>
<div class="line"><a id="l00016" name="l00016"></a><span class="lineno"> 16</span> </div>
<div class="line"><a id="l00017" name="l00017"></a><span class="lineno"> 17</span><span class="preprocessor">#ifdef MFEM_USE_AMGX</span></div>
<div class="line"><a id="l00018" name="l00018"></a><span class="lineno"> 18</span> </div>
<div class="line"><a id="l00019" name="l00019"></a><span class="lineno"> 19</span><span class="preprocessor">#include <amgx_c.h></span></div>
<div class="line"><a id="l00020" name="l00020"></a><span class="lineno"> 20</span><span class="preprocessor">#ifdef MFEM_USE_MPI</span></div>
<div class="line"><a id="l00021" name="l00021"></a><span class="lineno"> 21</span><span class="preprocessor">#include <mpi.h></span></div>
<div class="line"><a id="l00022" name="l00022"></a><span class="lineno"> 22</span><span class="preprocessor">#include "<a class="code" href="hypre_8hpp.html">hypre.hpp</a>"</span></div>
<div class="line"><a id="l00023" name="l00023"></a><span class="lineno"> 23</span><span class="preprocessor">#else</span></div>
<div class="line"><a id="l00024" name="l00024"></a><span class="lineno"> 24</span><span class="preprocessor">#include "<a class="code" href="linalg_2operator_8hpp.html">operator.hpp</a>"</span></div>
<div class="line"><a id="l00025" name="l00025"></a><span class="lineno"> 25</span><span class="preprocessor">#include "<a class="code" href="sparsemat_8hpp.html">sparsemat.hpp</a>"</span></div>
<div class="line"><a id="l00026" name="l00026"></a><span class="lineno"> 26</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00027" name="l00027"></a><span class="lineno"> 27</span> </div>
<div class="line"><a id="l00028" name="l00028"></a><span class="lineno"> 28</span><span class="keyword">namespace </span><a class="code hl_namespace" href="namespacemfem.html">mfem</a></div>
<div class="line"><a id="l00029" name="l00029"></a><span class="lineno"> 29</span>{</div>
<div class="line"><a id="l00030" name="l00030"></a><span class="lineno"> 30</span><span class="comment"></span> </div>
<div class="line"><a id="l00031" name="l00031"></a><span class="lineno"> 31</span><span class="comment">/** @brief</span></div>
<div class="line"><a id="l00032" name="l00032"></a><span class="lineno"> 32</span><span class="comment"> MFEM wrapper for Nvidia's multigrid library, AmgX (github.com/NVIDIA/AMGX)</span></div>
<div class="line"><a id="l00033" name="l00033"></a><span class="lineno"> 33</span><span class="comment"></span> </div>
<div class="line"><a id="l00034" name="l00034"></a><span class="lineno"> 34</span><span class="comment"> AmgX requires building MFEM with CUDA, and AMGX enabled. For distributed</span></div>
<div class="line"><a id="l00035" name="l00035"></a><span class="lineno"> 35</span><span class="comment"> memory parallism, MPI and Hypre (version 16.0+) are also required. Although</span></div>
<div class="line"><a id="l00036" name="l00036"></a><span class="lineno"> 36</span><span class="comment"> CUDA is required for building, the AmgX solver is compatible with a MFEM CPU</span></div>
<div class="line"><a id="l00037" name="l00037"></a><span class="lineno"> 37</span><span class="comment"> device configuration.</span></div>
<div class="line"><a id="l00038" name="l00038"></a><span class="lineno"> 38</span><span class="comment"></span> </div>
<div class="line"><a id="l00039" name="l00039"></a><span class="lineno"> 39</span><span class="comment"> The AmgXSolver class is designed to work as a solver or preconditioner for</span></div>
<div class="line"><a id="l00040" name="l00040"></a><span class="lineno"> 40</span><span class="comment"> existing MFEM solvers. The AmgX solver class may be configured in one of</span></div>
<div class="line"><a id="l00041" name="l00041"></a><span class="lineno"> 41</span><span class="comment"> three ways:</span></div>
<div class="line"><a id="l00042" name="l00042"></a><span class="lineno"> 42</span><span class="comment"></span> </div>
<div class="line"><a id="l00043" name="l00043"></a><span class="lineno"> 43</span><span class="comment"> Serial - Takes a SparseMatrix solves on a single GPU and assumes no MPI</span></div>
<div class="line"><a id="l00044" name="l00044"></a><span class="lineno"> 44</span><span class="comment"> communication.</span></div>
<div class="line"><a id="l00045" name="l00045"></a><span class="lineno"> 45</span><span class="comment"></span> </div>
<div class="line"><a id="l00046" name="l00046"></a><span class="lineno"> 46</span><span class="comment"> Exclusive GPU - Takes a HypreParMatrix and assumes each MPI rank is paired</span></div>
<div class="line"><a id="l00047" name="l00047"></a><span class="lineno"> 47</span><span class="comment"> with an Nvidia GPU.</span></div>
<div class="line"><a id="l00048" name="l00048"></a><span class="lineno"> 48</span><span class="comment"></span> </div>
<div class="line"><a id="l00049" name="l00049"></a><span class="lineno"> 49</span><span class="comment"> MPI Teams - Takes a HypreParMatrix and enables flexibility between number of</span></div>
<div class="line"><a id="l00050" name="l00050"></a><span class="lineno"> 50</span><span class="comment"> MPI ranks, and GPUs. Specifically, MPI ranks are grouped with GPUs and a</span></div>
<div class="line"><a id="l00051" name="l00051"></a><span class="lineno"> 51</span><span class="comment"> matrix consolidation step is taken so the MPI root of each team performs the</span></div>
<div class="line"><a id="l00052" name="l00052"></a><span class="lineno"> 52</span><span class="comment"> necessary AmgX library calls. The solution is then broadcasted to appropriate</span></div>
<div class="line"><a id="l00053" name="l00053"></a><span class="lineno"> 53</span><span class="comment"> ranks. This is particularly useful when configuring MFEM's device as</span></div>
<div class="line"><a id="l00054" name="l00054"></a><span class="lineno"> 54</span><span class="comment"> CPU. This work is based on the AmgXWrapper of Chuang and Barba. Routines were</span></div>
<div class="line"><a id="l00055" name="l00055"></a><span class="lineno"> 55</span><span class="comment"> adopted and modified for setting up MPI communicators.</span></div>
<div class="line"><a id="l00056" name="l00056"></a><span class="lineno"> 56</span><span class="comment"></span> </div>
<div class="line"><a id="l00057" name="l00057"></a><span class="lineno"> 57</span><span class="comment"> Examples 1/1p in the examples/amgx directory demonstrate configuring the</span></div>
<div class="line"><a id="l00058" name="l00058"></a><span class="lineno"> 58</span><span class="comment"> wrapper as a solver and preconditioner, as well as configuring and running</span></div>
<div class="line"><a id="l00059" name="l00059"></a><span class="lineno"> 59</span><span class="comment"> with exclusive GPU or MPI teams modes.</span></div>
<div class="line"><a id="l00060" name="l00060"></a><span class="lineno"> 60</span><span class="comment"></span> </div>
<div class="line"><a id="l00061" name="l00061"></a><span class="lineno"> 61</span><span class="comment"> This work is partially based on:</span></div>
<div class="line"><a id="l00062" name="l00062"></a><span class="lineno"> 62</span><span class="comment"></span> </div>
<div class="line"><a id="l00063" name="l00063"></a><span class="lineno"> 63</span><span class="comment"> Pi-Yueh Chuang and Lorena A. Barba (2017).</span></div>
<div class="line"><a id="l00064" name="l00064"></a><span class="lineno"> 64</span><span class="comment"> AmgXWrapper: An interface between PETSc and the NVIDIA AmgX library.</span></div>
<div class="line"><a id="l00065" name="l00065"></a><span class="lineno"> 65</span><span class="comment"> J. Open Source Software, 2(16):280, doi:10.21105/joss.00280</span></div>
<div class="line"><a id="l00066" name="l00066"></a><span class="lineno"> 66</span><span class="comment"></span> </div>
<div class="line"><a id="l00067" name="l00067"></a><span class="lineno"> 67</span><span class="comment"> See https://github.com/barbagroup/AmgXWrapper.</span></div>
<div class="line"><a id="l00068" name="l00068"></a><span class="lineno"> 68</span><span class="comment">*/</span></div>
<div class="foldopen" id="foldopen00069" data-start="{" data-end="};">
<div class="line"><a id="l00069" name="l00069"></a><span class="lineno"><a class="line" href="classmfem_1_1AmgXSolver.html"> 69</a></span><span class="keyword">class </span><a class="code hl_class" href="classmfem_1_1AmgXSolver.html">AmgXSolver</a> : <span class="keyword">public</span> <a class="code hl_class" href="classmfem_1_1Solver.html">Solver</a></div>
<div class="line"><a id="l00070" name="l00070"></a><span class="lineno"> 70</span>{</div>
<div class="line"><a id="l00071" name="l00071"></a><span class="lineno"> 71</span><span class="keyword">public</span>:</div>
<div class="line"><a id="l00072" name="l00072"></a><span class="lineno"> 72</span><span class="comment"></span> </div>
<div class="line"><a id="l00073" name="l00073"></a><span class="lineno"> 73</span><span class="comment"> /// Flags to configure AmgXSolver as a solver or preconditioner</span></div>
<div class="foldopen" id="foldopen00074" data-start="{" data-end="};">
<div class="line"><a id="l00074" name="l00074"></a><span class="lineno"><a class="line" href="classmfem_1_1AmgXSolver.html#a928145b29da0d55511c56c0e3068752c"> 74</a></span><span class="comment"></span> <span class="keyword">enum</span> <a class="code hl_enumeration" href="classmfem_1_1AmgXSolver.html#a928145b29da0d55511c56c0e3068752c">AMGX_MODE</a></div>
<div class="line"><a id="l00075" name="l00075"></a><span class="lineno"> 75</span> {<span class="comment"></span></div>
<div class="line"><a id="l00076" name="l00076"></a><span class="lineno"> 76</span><span class="comment"> /// Use the preconditioned conjugate gradient method with the AMG</span></div>
<div class="line"><a id="l00077" name="l00077"></a><span class="lineno"> 77</span><span class="comment"> /// V-cycle used as a proconditioner. With the default configuration</span></div>
<div class="line"><a id="l00078" name="l00078"></a><span class="lineno"> 78</span><span class="comment"> /// a block Jacobi smoother is used.</span></div>
<div class="line"><a id="l00079" name="l00079"></a><span class="lineno"><a class="line" href="classmfem_1_1AmgXSolver.html#a928145b29da0d55511c56c0e3068752cae833eebaaef842ff2639069ec568b2c7"> 79</a></span><span class="comment"></span> <a class="code hl_enumvalue" href="classmfem_1_1AmgXSolver.html#a928145b29da0d55511c56c0e3068752cae833eebaaef842ff2639069ec568b2c7">SOLVER</a>,<span class="comment"></span></div>
<div class="line"><a id="l00080" name="l00080"></a><span class="lineno"> 80</span><span class="comment"> /// Directly apply iterations of the AMG V cycle to the matrix</span></div>
<div class="line"><a id="l00081" name="l00081"></a><span class="lineno"> 81</span><span class="comment"> /// With the default configuration this will be 2 iterations</span></div>
<div class="line"><a id="l00082" name="l00082"></a><span class="lineno"> 82</span><span class="comment"> /// with block Jacobi smoother.</span></div>
<div class="line"><a id="l00083" name="l00083"></a><span class="lineno"> 83</span><span class="comment"></span> <a class="code hl_enumvalue" href="classmfem_1_1AmgXSolver.html#a928145b29da0d55511c56c0e3068752caf7bc0614eb0effa62a53b6799a87f554">PRECONDITIONER</a></div>
<div class="line"><a id="l00084" name="l00084"></a><span class="lineno"><a class="line" href="classmfem_1_1AmgXSolver.html#a928145b29da0d55511c56c0e3068752caf7bc0614eb0effa62a53b6799a87f554"> 84</a></span> };</div>
</div>
<div class="line"><a id="l00085" name="l00085"></a><span class="lineno"> 85</span><span class="comment"></span> </div>
<div class="line"><a id="l00086" name="l00086"></a><span class="lineno"> 86</span><span class="comment"> /// Flag to check for convergence</span></div>
<div class="line"><a id="l00087" name="l00087"></a><span class="lineno"><a class="line" href="classmfem_1_1AmgXSolver.html#a1088fe38c4f36f22ea70550e4272a450"> 87</a></span><span class="comment"></span> <span class="keywordtype">bool</span> <a class="code hl_variable" href="classmfem_1_1AmgXSolver.html#a1088fe38c4f36f22ea70550e4272a450">ConvergenceCheck</a>;</div>
<div class="line"><a id="l00088" name="l00088"></a><span class="lineno"> 88</span><span class="comment"></span> </div>
<div class="line"><a id="l00089" name="l00089"></a><span class="lineno"> 89</span><span class="comment"> /** @brief</span></div>
<div class="line"><a id="l00090" name="l00090"></a><span class="lineno"> 90</span><span class="comment"> Flags to determine whether user solver settings are defined internally in</span></div>
<div class="line"><a id="l00091" name="l00091"></a><span class="lineno"> 91</span><span class="comment"> the source code or will be read through an external JSON file.</span></div>
<div class="line"><a id="l00092" name="l00092"></a><span class="lineno"> 92</span><span class="comment"> */</span></div>
<div class="foldopen" id="foldopen00093" data-start="{" data-end="};">
<div class="line"><a id="l00093" name="l00093"></a><span class="lineno"><a class="line" href="classmfem_1_1AmgXSolver.html#a1159aab911bcfd9c5b6d2cbe842987a7"> 93</a></span> <span class="keyword">enum</span> <a class="code hl_enumeration" href="classmfem_1_1AmgXSolver.html#a1159aab911bcfd9c5b6d2cbe842987a7">CONFIG_SRC</a></div>
<div class="line"><a id="l00094" name="l00094"></a><span class="lineno"> 94</span> {<span class="comment"></span></div>
<div class="line"><a id="l00095" name="l00095"></a><span class="lineno"> 95</span><span class="comment"> /// Configuration will be read directly from a string</span></div>
<div class="line"><a id="l00096" name="l00096"></a><span class="lineno"><a class="line" href="classmfem_1_1AmgXSolver.html#a1159aab911bcfd9c5b6d2cbe842987a7a62959275e2c5b6e76efc2f969873b392"> 96</a></span><span class="comment"></span> <a class="code hl_enumvalue" href="classmfem_1_1AmgXSolver.html#a1159aab911bcfd9c5b6d2cbe842987a7a62959275e2c5b6e76efc2f969873b392">INTERNAL</a>,<span class="comment"></span></div>
<div class="line"><a id="l00097" name="l00097"></a><span class="lineno"> 97</span><span class="comment"> /// Configure will be read from a specified file</span></div>
<div class="line"><a id="l00098" name="l00098"></a><span class="lineno"><a class="line" href="classmfem_1_1AmgXSolver.html#a1159aab911bcfd9c5b6d2cbe842987a7a0ccf63c071b521277393fcaf498a8633"> 98</a></span><span class="comment"></span> <a class="code hl_enumvalue" href="classmfem_1_1AmgXSolver.html#a1159aab911bcfd9c5b6d2cbe842987a7a0ccf63c071b521277393fcaf498a8633">EXTERNAL</a>,</div>
<div class="line"><a id="l00099" name="l00099"></a><span class="lineno"> 99</span> <a class="code hl_enumvalue" href="classmfem_1_1AmgXSolver.html#a1159aab911bcfd9c5b6d2cbe842987a7a8992692012c523ccbaf88e41c2524588">UNDEFINED</a></div>
<div class="line"><a id="l00100" name="l00100"></a><span class="lineno"><a class="line" href="classmfem_1_1AmgXSolver.html#a1159aab911bcfd9c5b6d2cbe842987a7a8992692012c523ccbaf88e41c2524588"> 100</a></span> };</div>
</div>
<div class="line"><a id="l00101" name="l00101"></a><span class="lineno"> 101</span> </div>
<div class="line"><a id="l00102" name="l00102"></a><span class="lineno"> 102</span> <a class="code hl_function" href="classmfem_1_1AmgXSolver.html#aed974448d0c033b937e1401959eeacd7">AmgXSolver</a>();</div>
<div class="line"><a id="l00103" name="l00103"></a><span class="lineno"> 103</span><span class="comment"></span> </div>
<div class="line"><a id="l00104" name="l00104"></a><span class="lineno"> 104</span><span class="comment"> /** @brief</span></div>
<div class="line"><a id="l00105" name="l00105"></a><span class="lineno"> 105</span><span class="comment"> Configures AmgX with a default configuration based on the AmgX mode, and</span></div>
<div class="line"><a id="l00106" name="l00106"></a><span class="lineno"> 106</span><span class="comment"> verbosity. Assumes no MPI parallelism.</span></div>
<div class="line"><a id="l00107" name="l00107"></a><span class="lineno"> 107</span><span class="comment"> */</span></div>
<div class="line"><a id="l00108" name="l00108"></a><span class="lineno"> 108</span> <a class="code hl_function" href="classmfem_1_1AmgXSolver.html#aed974448d0c033b937e1401959eeacd7">AmgXSolver</a>(<span class="keyword">const</span> <a class="code hl_enumeration" href="classmfem_1_1AmgXSolver.html#a928145b29da0d55511c56c0e3068752c">AMGX_MODE</a> amgxMode_, <span class="keyword">const</span> <span class="keywordtype">bool</span> verbose);</div>
<div class="line"><a id="l00109" name="l00109"></a><span class="lineno"> 109</span><span class="comment"></span> </div>
<div class="line"><a id="l00110" name="l00110"></a><span class="lineno"> 110</span><span class="comment"> /** @brief Initialize the AmgX library for serial execution once</span></div>
<div class="line"><a id="l00111" name="l00111"></a><span class="lineno"> 111</span><span class="comment"> the solver configuration has been established through either the</span></div>
<div class="line"><a id="l00112" name="l00112"></a><span class="lineno"> 112</span><span class="comment"> AmgXSolver::ReadParameters method or the constructor. The constructor</span></div>
<div class="line"><a id="l00113" name="l00113"></a><span class="lineno"> 113</span><span class="comment"> will make this call.</span></div>
<div class="line"><a id="l00114" name="l00114"></a><span class="lineno"> 114</span><span class="comment"> */</span></div>
<div class="line"><a id="l00115" name="l00115"></a><span class="lineno"> 115</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classmfem_1_1AmgXSolver.html#a796f9fc1771f96a4e7a04241014d4095">InitSerial</a>();</div>
<div class="line"><a id="l00116" name="l00116"></a><span class="lineno"> 116</span> </div>
<div class="line"><a id="l00117" name="l00117"></a><span class="lineno"> 117</span><span class="preprocessor">#ifdef MFEM_USE_MPI</span></div>
<div class="line"><a id="l00118" name="l00118"></a><span class="lineno"> 118</span><span class="comment"></span> </div>
<div class="line"><a id="l00119" name="l00119"></a><span class="lineno"> 119</span><span class="comment"> /** @brief</span></div>
<div class="line"><a id="l00120" name="l00120"></a><span class="lineno"> 120</span><span class="comment"> Configures AmgX with a default configuration based on the AMGX_MODE</span></div>
<div class="line"><a id="l00121" name="l00121"></a><span class="lineno"> 121</span><span class="comment"> (AmgXSolver::SOLVER, AmgXSolver::PRECONDITIONER)</span></div>
<div class="line"><a id="l00122" name="l00122"></a><span class="lineno"> 122</span><span class="comment"> and verbosity. Pairs each MPI rank with one GPU.</span></div>
<div class="line"><a id="l00123" name="l00123"></a><span class="lineno"> 123</span><span class="comment"> */</span></div>
<div class="line"><a id="l00124" name="l00124"></a><span class="lineno"> 124</span> <a class="code hl_function" href="classmfem_1_1AmgXSolver.html#aed974448d0c033b937e1401959eeacd7">AmgXSolver</a>(<span class="keyword">const</span> MPI_Comm &comm, <span class="keyword">const</span> <a class="code hl_enumeration" href="classmfem_1_1AmgXSolver.html#a928145b29da0d55511c56c0e3068752c">AMGX_MODE</a> amgxMode_,</div>
<div class="line"><a id="l00125" name="l00125"></a><span class="lineno"> 125</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> verbose);</div>
<div class="line"><a id="l00126" name="l00126"></a><span class="lineno"> 126</span><span class="comment"></span> </div>
<div class="line"><a id="l00127" name="l00127"></a><span class="lineno"> 127</span><span class="comment"> /** @brief</span></div>
<div class="line"><a id="l00128" name="l00128"></a><span class="lineno"> 128</span><span class="comment"> Configures AmgX with a default configuration based on the AMGX_MODE</span></div>
<div class="line"><a id="l00129" name="l00129"></a><span class="lineno"> 129</span><span class="comment"> (AmgXSolver::SOLVER, AmgXSolver::PRECONDITIONER)</span></div>
<div class="line"><a id="l00130" name="l00130"></a><span class="lineno"> 130</span><span class="comment"> and verbosity. Creates MPI teams around GPUs to support more ranks than</span></div>
<div class="line"><a id="l00131" name="l00131"></a><span class="lineno"> 131</span><span class="comment"> GPUs. Consolidates linear solver data to avoid multiple ranks sharing</span></div>
<div class="line"><a id="l00132" name="l00132"></a><span class="lineno"> 132</span><span class="comment"> GPUs. Requires specifying the number of devices in each compute node as</span></div>
<div class="line"><a id="l00133" name="l00133"></a><span class="lineno"> 133</span><span class="comment"> @a nDevs.</span></div>
<div class="line"><a id="l00134" name="l00134"></a><span class="lineno"> 134</span><span class="comment"> */</span></div>
<div class="line"><a id="l00135" name="l00135"></a><span class="lineno"> 135</span> <a class="code hl_function" href="classmfem_1_1AmgXSolver.html#aed974448d0c033b937e1401959eeacd7">AmgXSolver</a>(<span class="keyword">const</span> MPI_Comm &comm, <span class="keyword">const</span> <span class="keywordtype">int</span> nDevs,</div>
<div class="line"><a id="l00136" name="l00136"></a><span class="lineno"> 136</span> <span class="keyword">const</span> <a class="code hl_enumeration" href="classmfem_1_1AmgXSolver.html#a928145b29da0d55511c56c0e3068752c">AMGX_MODE</a> amgx_Mode_, <span class="keyword">const</span> <span class="keywordtype">bool</span> verbose);</div>
<div class="line"><a id="l00137" name="l00137"></a><span class="lineno"> 137</span><span class="comment"></span> </div>
<div class="line"><a id="l00138" name="l00138"></a><span class="lineno"> 138</span><span class="comment"> /** @brief Initialize the AmgX library in parallel mode with exactly one</span></div>
<div class="line"><a id="l00139" name="l00139"></a><span class="lineno"> 139</span><span class="comment"> GPU per rank after the solver configuration has been established,</span></div>
<div class="line"><a id="l00140" name="l00140"></a><span class="lineno"> 140</span><span class="comment"> either through the constructor or the AmgXSolver::ReadParameters</span></div>
<div class="line"><a id="l00141" name="l00141"></a><span class="lineno"> 141</span><span class="comment"> method. If configuring with a constructor, the constructor will make</span></div>
<div class="line"><a id="l00142" name="l00142"></a><span class="lineno"> 142</span><span class="comment"> this call.</span></div>
<div class="line"><a id="l00143" name="l00143"></a><span class="lineno"> 143</span><span class="comment"> */</span></div>
<div class="line"><a id="l00144" name="l00144"></a><span class="lineno"> 144</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classmfem_1_1AmgXSolver.html#ae94c512c1587e04ea421fa68af9df3a5">InitExclusiveGPU</a>(<span class="keyword">const</span> MPI_Comm &comm);</div>
<div class="line"><a id="l00145" name="l00145"></a><span class="lineno"> 145</span><span class="comment"></span> </div>
<div class="line"><a id="l00146" name="l00146"></a><span class="lineno"> 146</span><span class="comment"> /** @brief Initialize the AmgX library and create MPI teams based on the</span></div>
<div class="line"><a id="l00147" name="l00147"></a><span class="lineno"> 147</span><span class="comment"> number of devices on each node @a nDevs. If configuring with a</span></div>
<div class="line"><a id="l00148" name="l00148"></a><span class="lineno"> 148</span><span class="comment"> constructor, the constructor will make this call, otherwise this will need</span></div>
<div class="line"><a id="l00149" name="l00149"></a><span class="lineno"> 149</span><span class="comment"> to be called after the solver configuration has been established through</span></div>
<div class="line"><a id="l00150" name="l00150"></a><span class="lineno"> 150</span><span class="comment"> the AmgXSolver::ReadParameters call.</span></div>
<div class="line"><a id="l00151" name="l00151"></a><span class="lineno"> 151</span><span class="comment"> */</span></div>
<div class="line"><a id="l00152" name="l00152"></a><span class="lineno"> 152</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classmfem_1_1AmgXSolver.html#aa7b9914286b7df6144e9c5c01bae52dd">InitMPITeams</a>(<span class="keyword">const</span> MPI_Comm &comm,</div>
<div class="line"><a id="l00153" name="l00153"></a><span class="lineno"> 153</span> <span class="keyword">const</span> <span class="keywordtype">int</span> nDevs);</div>
<div class="line"><a id="l00154" name="l00154"></a><span class="lineno"> 154</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00155" name="l00155"></a><span class="lineno"> 155</span><span class="comment"></span> </div>
<div class="line"><a id="l00156" name="l00156"></a><span class="lineno"> 156</span><span class="comment"> /** @brief Sets the Operator that is going to be solved via AmgX.</span></div>
<div class="line"><a id="l00157" name="l00157"></a><span class="lineno"> 157</span><span class="comment"> Supports operators based on either an MFEM SparseMatrix or</span></div>
<div class="line"><a id="l00158" name="l00158"></a><span class="lineno"> 158</span><span class="comment"> HypreParMatrix.</span></div>
<div class="line"><a id="l00159" name="l00159"></a><span class="lineno"> 159</span><span class="comment"> */</span></div>
<div class="line"><a id="l00160" name="l00160"></a><span class="lineno"> 160</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classmfem_1_1AmgXSolver.html#afc8308596f99d592c49b03de585116d6">SetOperator</a>(<span class="keyword">const</span> <a class="code hl_class" href="classmfem_1_1Operator.html">Operator</a> &op) <span class="keyword">override</span>;</div>
<div class="line"><a id="l00161" name="l00161"></a><span class="lineno"> 161</span><span class="comment"></span> </div>
<div class="line"><a id="l00162" name="l00162"></a><span class="lineno"> 162</span><span class="comment"> /** @brief Change the input operator that is being solved via AmgX.</span></div>
<div class="line"><a id="l00163" name="l00163"></a><span class="lineno"> 163</span><span class="comment"> Supports operators based on either an MFEM SparseMatrix or</span></div>
<div class="line"><a id="l00164" name="l00164"></a><span class="lineno"> 164</span><span class="comment"> HypreParMatrix.</span></div>
<div class="line"><a id="l00165" name="l00165"></a><span class="lineno"> 165</span><span class="comment"> */</span></div>
<div class="line"><a id="l00166" name="l00166"></a><span class="lineno"> 166</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classmfem_1_1AmgXSolver.html#af720485af2f2b22de2023643560625dc">UpdateOperator</a>(<span class="keyword">const</span> <a class="code hl_class" href="classmfem_1_1Operator.html">Operator</a> &op);</div>
<div class="line"><a id="l00167" name="l00167"></a><span class="lineno"> 167</span><span class="comment"></span> </div>
<div class="line"><a id="l00168" name="l00168"></a><span class="lineno"> 168</span><span class="comment"> /** @brief Utilize the AmgX library to solve the linear system</span></div>
<div class="line"><a id="l00169" name="l00169"></a><span class="lineno"> 169</span><span class="comment"> where the "matrix" is the AMG approximation to the operator set</span></div>
<div class="line"><a id="l00170" name="l00170"></a><span class="lineno"> 170</span><span class="comment"> by AmgXSolver::SetOperator. If the mode is set to</span></div>
<div class="line"><a id="l00171" name="l00171"></a><span class="lineno"> 171</span><span class="comment"> AmgXSolver::PRECONDITIONER the initial guess for the</span></div>
<div class="line"><a id="l00172" name="l00172"></a><span class="lineno"> 172</span><span class="comment"> @a x vector will be set to zero, otherwise the value of @a x passed</span></div>
<div class="line"><a id="l00173" name="l00173"></a><span class="lineno"> 173</span><span class="comment"> in will be used.</span></div>
<div class="line"><a id="l00174" name="l00174"></a><span class="lineno"> 174</span><span class="comment"> */</span></div>
<div class="line"><a id="l00175" name="l00175"></a><span class="lineno"> 175</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classmfem_1_1AmgXSolver.html#ac2cb9ce8f818def630f5e6a03624c911">Mult</a>(<span class="keyword">const</span> <a class="code hl_class" href="classmfem_1_1Vector.html">Vector</a>& <a class="code hl_variable" href="lissajous_8cpp.html#a17e5a28fa31f790a17bbf2b0d84e8324">b</a>, <a class="code hl_class" href="classmfem_1_1Vector.html">Vector</a>& x) <span class="keyword">const override</span>;</div>
<div class="line"><a id="l00176" name="l00176"></a><span class="lineno"> 176</span><span class="comment"></span> </div>
<div class="line"><a id="l00177" name="l00177"></a><span class="lineno"> 177</span><span class="comment"> /** @brief Return the number of iterations that were executed during the</span></div>
<div class="line"><a id="l00178" name="l00178"></a><span class="lineno"> 178</span><span class="comment"> last solve phase. */</span></div>
<div class="line"><a id="l00179" name="l00179"></a><span class="lineno"> 179</span> <span class="keywordtype">int</span> <a class="code hl_function" href="classmfem_1_1AmgXSolver.html#a0f01eb69c61485a394e98ee794a08624">GetNumIterations</a>();</div>
<div class="line"><a id="l00180" name="l00180"></a><span class="lineno"> 180</span><span class="comment"></span> </div>
<div class="line"><a id="l00181" name="l00181"></a><span class="lineno"> 181</span><span class="comment"> /** @brief Read in the AmgX parameters either through a file or directly</span></div>
<div class="line"><a id="l00182" name="l00182"></a><span class="lineno"> 182</span><span class="comment"> through a properly formated string. If @a source is set to</span></div>
<div class="line"><a id="l00183" name="l00183"></a><span class="lineno"> 183</span><span class="comment"> AmgXSolver::EXTERNAL the parameters are loaded from a filename set by</span></div>
<div class="line"><a id="l00184" name="l00184"></a><span class="lineno"> 184</span><span class="comment"> @a config. If @a source is set to AmgXSolver::INTERNAL the parameters</span></div>
<div class="line"><a id="l00185" name="l00185"></a><span class="lineno"> 185</span><span class="comment"> are set directly by the string defined by @a config.</span></div>
<div class="line"><a id="l00186" name="l00186"></a><span class="lineno"> 186</span><span class="comment"> */</span></div>
<div class="line"><a id="l00187" name="l00187"></a><span class="lineno"> 187</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classmfem_1_1AmgXSolver.html#ab55d8190a4305532e025dab81362503d">ReadParameters</a>(<span class="keyword">const</span> std::string config, <a class="code hl_enumeration" href="classmfem_1_1AmgXSolver.html#a1159aab911bcfd9c5b6d2cbe842987a7">CONFIG_SRC</a> <a class="code hl_function" href="ex25_8cpp.html#aafef765e6aa140d0a04f5bedd532dc19">source</a>);</div>
<div class="line"><a id="l00188" name="l00188"></a><span class="lineno"> 188</span><span class="comment"></span> </div>
<div class="line"><a id="l00189" name="l00189"></a><span class="lineno"> 189</span><span class="comment"> /** @brief Set up the AmgX library with the default paramaters.</span></div>
<div class="line"><a id="l00190" name="l00190"></a><span class="lineno"> 190</span><span class="comment"> @param [in] amgxMode_ AmgXSolver::PRECONDITIONER,</span></div>
<div class="line"><a id="l00191" name="l00191"></a><span class="lineno"> 191</span><span class="comment"> AmgXSolver::SOLVER.</span></div>
<div class="line"><a id="l00192" name="l00192"></a><span class="lineno"> 192</span><span class="comment"></span> </div>
<div class="line"><a id="l00193" name="l00193"></a><span class="lineno"> 193</span><span class="comment"> @param [in] verbose true, false. Specifies the level</span></div>
<div class="line"><a id="l00194" name="l00194"></a><span class="lineno"> 194</span><span class="comment"> of verbosity.</span></div>
<div class="line"><a id="l00195" name="l00195"></a><span class="lineno"> 195</span><span class="comment"></span> </div>
<div class="line"><a id="l00196" name="l00196"></a><span class="lineno"> 196</span><span class="comment"> When configured as a preconditioner, the default configuration is to apply</span></div>
<div class="line"><a id="l00197" name="l00197"></a><span class="lineno"> 197</span><span class="comment"> two iterations of an AMG V cycle with AmgX's default smoother (block</span></div>
<div class="line"><a id="l00198" name="l00198"></a><span class="lineno"> 198</span><span class="comment"> Jacobi).</span></div>
<div class="line"><a id="l00199" name="l00199"></a><span class="lineno"> 199</span><span class="comment"></span> </div>
<div class="line"><a id="l00200" name="l00200"></a><span class="lineno"> 200</span><span class="comment"> When configured as a solver the preconditioned conjugate gradient method</span></div>
<div class="line"><a id="l00201" name="l00201"></a><span class="lineno"> 201</span><span class="comment"> is used with the AMG V-cycle and a block Jacobi smoother is used as a</span></div>
<div class="line"><a id="l00202" name="l00202"></a><span class="lineno"> 202</span><span class="comment"> preconditioner.</span></div>
<div class="line"><a id="l00203" name="l00203"></a><span class="lineno"> 203</span><span class="comment"> */</span></div>
<div class="line"><a id="l00204" name="l00204"></a><span class="lineno"> 204</span> <span class="keywordtype">void</span> <a class="code hl_function" href="classmfem_1_1AmgXSolver.html#a5e521c91e81fe2e883608d9e1976c7a5">DefaultParameters</a>(<span class="keyword">const</span> <a class="code hl_enumeration" href="classmfem_1_1AmgXSolver.html#a928145b29da0d55511c56c0e3068752c">AMGX_MODE</a> amgxMode_, <span class="keyword">const</span> <span class="keywordtype">bool</span> verbose);</div>
<div class="line"><a id="l00205" name="l00205"></a><span class="lineno"> 205</span><span class="comment"></span> </div>
<div class="line"><a id="l00206" name="l00206"></a><span class="lineno"> 206</span><span class="comment"> /// Add a check for convergence after applying Mult.</span></div>
<div class="line"><a id="l00207" name="l00207"></a><span class="lineno"> 207</span><span class="comment"></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classmfem_1_1AmgXSolver.html#aa629f0dc1ab3e1e7f4fe7871d1d61bec">SetConvergenceCheck</a>(<span class="keywordtype">bool</span> setConvergenceCheck_=<span class="keyword">true</span>);</div>
<div class="line"><a id="l00208" name="l00208"></a><span class="lineno"> 208</span><span class="comment"></span> </div>
<div class="line"><a id="l00209" name="l00209"></a><span class="lineno"> 209</span><span class="comment"> /// Close down the AmgX library and free up any MPI Comms set up for it</span></div>
<div class="line"><a id="l00210" name="l00210"></a><span class="lineno"> 210</span><span class="comment"></span> <a class="code hl_function" href="classmfem_1_1AmgXSolver.html#a62817c3f75f4a82320109a0e41c7c3a9">~AmgXSolver</a>();</div>
<div class="line"><a id="l00211" name="l00211"></a><span class="lineno"> 211</span><span class="comment"></span> </div>
<div class="line"><a id="l00212" name="l00212"></a><span class="lineno"> 212</span><span class="comment"> /// Close down the AmgX library and free up any MPI Comms set up for it</span></div>
<div class="line"><a id="l00213" name="l00213"></a><span class="lineno"> 213</span><span class="comment"></span> <span class="keywordtype">void</span> <a class="code hl_function" href="classmfem_1_1AmgXSolver.html#a14c1e13d205932df6677b30611db747a">Finalize</a>();</div>
<div class="line"><a id="l00214" name="l00214"></a><span class="lineno"> 214</span> </div>
<div class="line"><a id="l00215" name="l00215"></a><span class="lineno"> 215</span><span class="keyword">private</span>:</div>
<div class="line"><a id="l00216" name="l00216"></a><span class="lineno"> 216</span> </div>
<div class="line"><a id="l00217" name="l00217"></a><span class="lineno"> 217</span> <a class="code hl_enumeration" href="classmfem_1_1AmgXSolver.html#a928145b29da0d55511c56c0e3068752c">AMGX_MODE</a> amgxMode;</div>
<div class="line"><a id="l00218" name="l00218"></a><span class="lineno"> 218</span> </div>
<div class="line"><a id="l00219" name="l00219"></a><span class="lineno"> 219</span> std::string amgx_config = <span class="stringliteral">""</span>;</div>
<div class="line"><a id="l00220" name="l00220"></a><span class="lineno"> 220</span> </div>
<div class="line"><a id="l00221" name="l00221"></a><span class="lineno"> 221</span> <a class="code hl_enumeration" href="classmfem_1_1AmgXSolver.html#a1159aab911bcfd9c5b6d2cbe842987a7">CONFIG_SRC</a> configSrc = <a class="code hl_enumvalue" href="classmfem_1_1AmgXSolver.html#a1159aab911bcfd9c5b6d2cbe842987a7a8992692012c523ccbaf88e41c2524588">UNDEFINED</a>;</div>
<div class="line"><a id="l00222" name="l00222"></a><span class="lineno"> 222</span> </div>
<div class="line"><a id="l00223" name="l00223"></a><span class="lineno"> 223</span><span class="preprocessor">#ifdef MFEM_USE_MPI</span><span class="comment"></span></div>
<div class="line"><a id="l00224" name="l00224"></a><span class="lineno"> 224</span><span class="comment"> /** @brief Consolidates matrix diagonal and off diagonal data and uploads</span></div>
<div class="line"><a id="l00225" name="l00225"></a><span class="lineno"> 225</span><span class="comment"> matrix to AmgX. */</span><span class="preprocessor"></span></div>
<div class="line"><a id="l00226" name="l00226"></a><span class="lineno"> 226</span> <span class="keywordtype">void</span> SetMatrixMPIGPUExclusive(<span class="keyword">const</span> <a class="code hl_class" href="classmfem_1_1HypreParMatrix.html">HypreParMatrix</a> &A,</div>
<div class="line"><a id="l00227" name="l00227"></a><span class="lineno"> 227</span> <span class="keyword">const</span> <a class="code hl_class" href="classmfem_1_1Array.html">Array<double></a> &loc_A,</div>
<div class="line"><a id="l00228" name="l00228"></a><span class="lineno"> 228</span> <span class="keyword">const</span> <a class="code hl_class" href="classmfem_1_1Array.html">Array<int></a> &loc_I,</div>
<div class="line"><a id="l00229" name="l00229"></a><span class="lineno"> 229</span> <span class="keyword">const</span> <a class="code hl_class" href="classmfem_1_1Array.html">Array<int64_t></a> &loc_J,</div>
<div class="line"><a id="l00230" name="l00230"></a><span class="lineno"> 230</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> update_mat = <span class="keyword">false</span>);</div>
<div class="line"><a id="l00231" name="l00231"></a><span class="lineno"> 231</span><span class="comment"></span> </div>
<div class="line"><a id="l00232" name="l00232"></a><span class="lineno"> 232</span><span class="comment"> /** @brief Consolidates matrix diagonal and off diagonal data for all ranks</span></div>
<div class="line"><a id="l00233" name="l00233"></a><span class="lineno"> 233</span><span class="comment"> in an MPI team. Root rank of each MPI team holds the consolidated</span></div>
<div class="line"><a id="l00234" name="l00234"></a><span class="lineno"> 234</span><span class="comment"> data and matrix. */</span></div>
<div class="line"><a id="l00235" name="l00235"></a><span class="lineno"> 235</span> <span class="keywordtype">void</span> SetMatrixMPITeams(<span class="keyword">const</span> <a class="code hl_class" href="classmfem_1_1HypreParMatrix.html">HypreParMatrix</a> &A, <span class="keyword">const</span> <a class="code hl_class" href="classmfem_1_1Array.html">Array<double></a> &loc_A,</div>
<div class="line"><a id="l00236" name="l00236"></a><span class="lineno"> 236</span> <span class="keyword">const</span> <a class="code hl_class" href="classmfem_1_1Array.html">Array<int></a> &loc_I, <span class="keyword">const</span> <a class="code hl_class" href="classmfem_1_1Array.html">Array<int64_t></a> &loc_J,</div>
<div class="line"><a id="l00237" name="l00237"></a><span class="lineno"> 237</span> <span class="keyword">const</span> <span class="keywordtype">bool</span> update_mat = <span class="keyword">false</span>);</div>
<div class="line"><a id="l00238" name="l00238"></a><span class="lineno"> 238</span><span class="comment"></span> </div>
<div class="line"><a id="l00239" name="l00239"></a><span class="lineno"> 239</span><span class="comment"> /// Consolidate array data to the root node in a MPI team.</span></div>
<div class="line"><a id="l00240" name="l00240"></a><span class="lineno"> 240</span><span class="comment"></span> <span class="keywordtype">void</span> GatherArray(<span class="keyword">const</span> <a class="code hl_class" href="classmfem_1_1Array.html">Array<double></a> &inArr, <a class="code hl_class" href="classmfem_1_1Array.html">Array<double></a> &outArr,</div>
<div class="line"><a id="l00241" name="l00241"></a><span class="lineno"> 241</span> <span class="keyword">const</span> <span class="keywordtype">int</span> mpiTeamSz, <span class="keyword">const</span> MPI_Comm &mpiTeam) <span class="keyword">const</span>;</div>
<div class="line"><a id="l00242" name="l00242"></a><span class="lineno"> 242</span><span class="comment"></span> </div>
<div class="line"><a id="l00243" name="l00243"></a><span class="lineno"> 243</span><span class="comment"> /// Consolidate array data to the root node in a MPI team.</span></div>
<div class="line"><a id="l00244" name="l00244"></a><span class="lineno"> 244</span><span class="comment"></span> <span class="keywordtype">void</span> GatherArray(<span class="keyword">const</span> <a class="code hl_class" href="classmfem_1_1Vector.html">Vector</a> &inArr, <a class="code hl_class" href="classmfem_1_1Vector.html">Vector</a> &outArr,</div>
<div class="line"><a id="l00245" name="l00245"></a><span class="lineno"> 245</span> <span class="keyword">const</span> <span class="keywordtype">int</span> mpiTeamSz, <span class="keyword">const</span> MPI_Comm &mpiTeam) <span class="keyword">const</span>;</div>
<div class="line"><a id="l00246" name="l00246"></a><span class="lineno"> 246</span><span class="comment"></span> </div>
<div class="line"><a id="l00247" name="l00247"></a><span class="lineno"> 247</span><span class="comment"> /// Consolidate array data to the root node in a MPI team.</span></div>
<div class="line"><a id="l00248" name="l00248"></a><span class="lineno"> 248</span><span class="comment"></span> <span class="keywordtype">void</span> GatherArray(<span class="keyword">const</span> <a class="code hl_class" href="classmfem_1_1Array.html">Array<int></a> &inArr, <a class="code hl_class" href="classmfem_1_1Array.html">Array<int></a> &outArr,</div>
<div class="line"><a id="l00249" name="l00249"></a><span class="lineno"> 249</span> <span class="keyword">const</span> <span class="keywordtype">int</span> mpiTeamSz, <span class="keyword">const</span> MPI_Comm &mpiTeam) <span class="keyword">const</span>;</div>
<div class="line"><a id="l00250" name="l00250"></a><span class="lineno"> 250</span><span class="comment"></span> </div>
<div class="line"><a id="l00251" name="l00251"></a><span class="lineno"> 251</span><span class="comment"> /// Consolidate array data to the root node in a MPI team.</span></div>
<div class="line"><a id="l00252" name="l00252"></a><span class="lineno"> 252</span><span class="comment"></span> <span class="keywordtype">void</span> GatherArray(<span class="keyword">const</span> <a class="code hl_class" href="classmfem_1_1Array.html">Array<int64_t></a> &inArr, <a class="code hl_class" href="classmfem_1_1Array.html">Array<int64_t></a> &outArr,</div>
<div class="line"><a id="l00253" name="l00253"></a><span class="lineno"> 253</span> <span class="keyword">const</span> <span class="keywordtype">int</span> mpiTeamSz, <span class="keyword">const</span> MPI_Comm &mpiTeam) <span class="keyword">const</span>;</div>
<div class="line"><a id="l00254" name="l00254"></a><span class="lineno"> 254</span><span class="comment"></span> </div>
<div class="line"><a id="l00255" name="l00255"></a><span class="lineno"> 255</span><span class="comment"> /** @brief Consolidate array data to the root node in a MPI</span></div>
<div class="line"><a id="l00256" name="l00256"></a><span class="lineno"> 256</span><span class="comment"> team as well as store array partitions and displacements in</span></div>
<div class="line"><a id="l00257" name="l00257"></a><span class="lineno"> 257</span><span class="comment"> @a Apart and @a Adisp.</span></div>
<div class="line"><a id="l00258" name="l00258"></a><span class="lineno"> 258</span><span class="comment"> */</span></div>
<div class="line"><a id="l00259" name="l00259"></a><span class="lineno"> 259</span> <span class="keywordtype">void</span> GatherArray(<span class="keyword">const</span> <a class="code hl_class" href="classmfem_1_1Vector.html">Vector</a> &inArr, <a class="code hl_class" href="classmfem_1_1Vector.html">Vector</a> &outArr,</div>
<div class="line"><a id="l00260" name="l00260"></a><span class="lineno"> 260</span> <span class="keyword">const</span> <span class="keywordtype">int</span> mpiTeamSz, <span class="keyword">const</span> MPI_Comm &mpiTeamComm,</div>
<div class="line"><a id="l00261" name="l00261"></a><span class="lineno"> 261</span> <a class="code hl_class" href="classmfem_1_1Array.html">Array<int></a> &Apart, <a class="code hl_class" href="classmfem_1_1Array.html">Array<int></a> &Adisp) <span class="keyword">const</span>;</div>
<div class="line"><a id="l00262" name="l00262"></a><span class="lineno"> 262</span> </div>
<div class="line"><a id="l00263" name="l00263"></a><span class="lineno"> 263</span> <span class="keywordtype">void</span> ScatterArray(<span class="keyword">const</span> <a class="code hl_class" href="classmfem_1_1Vector.html">Vector</a> &inArr, <a class="code hl_class" href="classmfem_1_1Vector.html">Vector</a> &outArr,</div>
<div class="line"><a id="l00264" name="l00264"></a><span class="lineno"> 264</span> <span class="keyword">const</span> <span class="keywordtype">int</span> mpiTeamSz, <span class="keyword">const</span> MPI_Comm &mpi_comm,</div>
<div class="line"><a id="l00265" name="l00265"></a><span class="lineno"> 265</span> <a class="code hl_class" href="classmfem_1_1Array.html">Array<int></a> &Apart, <a class="code hl_class" href="classmfem_1_1Array.html">Array<int></a> &Adisp) <span class="keyword">const</span>;</div>
<div class="line"><a id="l00266" name="l00266"></a><span class="lineno"> 266</span> </div>
<div class="line"><a id="l00267" name="l00267"></a><span class="lineno"> 267</span> <span class="keywordtype">void</span> SetMatrix(<span class="keyword">const</span> <a class="code hl_class" href="classmfem_1_1HypreParMatrix.html">HypreParMatrix</a> &A, <span class="keyword">const</span> <span class="keywordtype">bool</span> update_mat = <span class="keyword">false</span>);</div>
<div class="line"><a id="l00268" name="l00268"></a><span class="lineno"> 268</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00269" name="l00269"></a><span class="lineno"> 269</span> </div>
<div class="line"><a id="l00270" name="l00270"></a><span class="lineno"> 270</span> <span class="keywordtype">void</span> SetMatrix(<span class="keyword">const</span> <a class="code hl_class" href="classmfem_1_1SparseMatrix.html">SparseMatrix</a> &A, <span class="keyword">const</span> <span class="keywordtype">bool</span> update_mat = <span class="keyword">false</span>);</div>
<div class="line"><a id="l00271" name="l00271"></a><span class="lineno"> 271</span> </div>
<div class="line"><a id="l00272" name="l00272"></a><span class="lineno"> 272</span> <span class="keyword">static</span> <span class="keywordtype">int</span> count;</div>
<div class="line"><a id="l00273" name="l00273"></a><span class="lineno"> 273</span> </div>
<div class="line"><a id="l00274" name="l00274"></a><span class="lineno"> 274</span> <span class="comment">// Indicate if this instance has been initialized.</span></div>
<div class="line"><a id="l00275" name="l00275"></a><span class="lineno"> 275</span> <span class="keywordtype">bool</span> isInitialized = <span class="keyword">false</span>;</div>
<div class="line"><a id="l00276" name="l00276"></a><span class="lineno"> 276</span> </div>
<div class="line"><a id="l00277" name="l00277"></a><span class="lineno"> 277</span><span class="preprocessor">#ifdef MFEM_USE_MPI</span></div>
<div class="line"><a id="l00278" name="l00278"></a><span class="lineno"> 278</span> <span class="comment">// The name of the node that this MPI process belongs to.</span></div>
<div class="line"><a id="l00279" name="l00279"></a><span class="lineno"> 279</span> std::string nodeName;</div>
<div class="line"><a id="l00280" name="l00280"></a><span class="lineno"> 280</span> </div>
<div class="line"><a id="l00281" name="l00281"></a><span class="lineno"> 281</span> <span class="comment">// Number of local GPU devices used by AmgX.</span></div>
<div class="line"><a id="l00282" name="l00282"></a><span class="lineno"> 282</span> <span class="keywordtype">int</span> nDevs;</div>
<div class="line"><a id="l00283" name="l00283"></a><span class="lineno"> 283</span> </div>
<div class="line"><a id="l00284" name="l00284"></a><span class="lineno"> 284</span> <span class="comment">// The ID of corresponding GPU device used by this MPI process.</span></div>
<div class="line"><a id="l00285" name="l00285"></a><span class="lineno"> 285</span> <span class="keywordtype">int</span> devID;</div>
<div class="line"><a id="l00286" name="l00286"></a><span class="lineno"> 286</span> </div>
<div class="line"><a id="l00287" name="l00287"></a><span class="lineno"> 287</span> <span class="comment">// A flag indicating if this process will invoke AmgX</span></div>
<div class="line"><a id="l00288" name="l00288"></a><span class="lineno"> 288</span> <span class="keywordtype">int</span> gpuProc = MPI_UNDEFINED;</div>
<div class="line"><a id="l00289" name="l00289"></a><span class="lineno"> 289</span> </div>
<div class="line"><a id="l00290" name="l00290"></a><span class="lineno"> 290</span> <span class="comment">// Communicator for all MPI ranks</span></div>
<div class="line"><a id="l00291" name="l00291"></a><span class="lineno"> 291</span> MPI_Comm globalCpuWorld = MPI_COMM_NULL;</div>
<div class="line"><a id="l00292" name="l00292"></a><span class="lineno"> 292</span> </div>
<div class="line"><a id="l00293" name="l00293"></a><span class="lineno"> 293</span> <span class="comment">// Communicator for ranks in same node</span></div>
<div class="line"><a id="l00294" name="l00294"></a><span class="lineno"> 294</span> MPI_Comm localCpuWorld;</div>
<div class="line"><a id="l00295" name="l00295"></a><span class="lineno"> 295</span> </div>
<div class="line"><a id="l00296" name="l00296"></a><span class="lineno"> 296</span> <span class="comment">// Communicator for ranks sharing a device</span></div>
<div class="line"><a id="l00297" name="l00297"></a><span class="lineno"> 297</span> MPI_Comm devWorld;</div>
<div class="line"><a id="l00298" name="l00298"></a><span class="lineno"> 298</span> </div>
<div class="line"><a id="l00299" name="l00299"></a><span class="lineno"> 299</span> <span class="comment">// A communicator for MPI processes that will launch AmgX (root of devWorld)</span></div>
<div class="line"><a id="l00300" name="l00300"></a><span class="lineno"> 300</span> MPI_Comm gpuWorld;</div>
<div class="line"><a id="l00301" name="l00301"></a><span class="lineno"> 301</span> </div>
<div class="line"><a id="l00302" name="l00302"></a><span class="lineno"> 302</span> <span class="comment">// Global number of MPI procs + rank id</span></div>
<div class="line"><a id="l00303" name="l00303"></a><span class="lineno"> 303</span> <span class="keywordtype">int</span> globalSize;</div>
<div class="line"><a id="l00304" name="l00304"></a><span class="lineno"> 304</span> </div>
<div class="line"><a id="l00305" name="l00305"></a><span class="lineno"> 305</span> <span class="keywordtype">int</span> myGlobalRank;</div>
<div class="line"><a id="l00306" name="l00306"></a><span class="lineno"> 306</span> </div>
<div class="line"><a id="l00307" name="l00307"></a><span class="lineno"> 307</span> <span class="comment">// Total number of MPI procs in a node + rank id</span></div>
<div class="line"><a id="l00308" name="l00308"></a><span class="lineno"> 308</span> <span class="keywordtype">int</span> localSize;</div>
<div class="line"><a id="l00309" name="l00309"></a><span class="lineno"> 309</span> </div>
<div class="line"><a id="l00310" name="l00310"></a><span class="lineno"> 310</span> <span class="keywordtype">int</span> myLocalRank;</div>
<div class="line"><a id="l00311" name="l00311"></a><span class="lineno"> 311</span> </div>
<div class="line"><a id="l00312" name="l00312"></a><span class="lineno"> 312</span> <span class="comment">// Total number of MPI ranks sharing a device + rank id</span></div>
<div class="line"><a id="l00313" name="l00313"></a><span class="lineno"> 313</span> <span class="keywordtype">int</span> devWorldSize;</div>
<div class="line"><a id="l00314" name="l00314"></a><span class="lineno"> 314</span> </div>
<div class="line"><a id="l00315" name="l00315"></a><span class="lineno"> 315</span> <span class="keywordtype">int</span> myDevWorldRank;</div>
<div class="line"><a id="l00316" name="l00316"></a><span class="lineno"> 316</span> </div>
<div class="line"><a id="l00317" name="l00317"></a><span class="lineno"> 317</span> <span class="comment">// Total number of MPI procs calling AmgX + rank id</span></div>
<div class="line"><a id="l00318" name="l00318"></a><span class="lineno"> 318</span> <span class="keywordtype">int</span> gpuWorldSize;</div>
<div class="line"><a id="l00319" name="l00319"></a><span class="lineno"> 319</span> </div>
<div class="line"><a id="l00320" name="l00320"></a><span class="lineno"> 320</span> <span class="keywordtype">int</span> myGpuWorldRank;</div>
<div class="line"><a id="l00321" name="l00321"></a><span class="lineno"> 321</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00322" name="l00322"></a><span class="lineno"> 322</span> </div>
<div class="line"><a id="l00323" name="l00323"></a><span class="lineno"> 323</span> <span class="comment">// A parameter used by AmgX.</span></div>
<div class="line"><a id="l00324" name="l00324"></a><span class="lineno"> 324</span> <span class="keywordtype">int</span> ring;</div>
<div class="line"><a id="l00325" name="l00325"></a><span class="lineno"> 325</span> </div>
<div class="line"><a id="l00326" name="l00326"></a><span class="lineno"> 326</span> <span class="comment">// Sets AmgX precision (currently on double is supported)</span></div>
<div class="line"><a id="l00327" name="l00327"></a><span class="lineno"> 327</span> AMGX_Mode precision_mode = AMGX_mode_dDDI;</div>
<div class="line"><a id="l00328" name="l00328"></a><span class="lineno"> 328</span> </div>
<div class="line"><a id="l00329" name="l00329"></a><span class="lineno"> 329</span> <span class="comment">// AmgX config object.</span></div>
<div class="line"><a id="l00330" name="l00330"></a><span class="lineno"> 330</span> AMGX_config_handle cfg = <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00331" name="l00331"></a><span class="lineno"> 331</span> </div>
<div class="line"><a id="l00332" name="l00332"></a><span class="lineno"> 332</span> <span class="comment">// AmgX matrix object.</span></div>
<div class="line"><a id="l00333" name="l00333"></a><span class="lineno"> 333</span> AMGX_matrix_handle AmgXA = <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00334" name="l00334"></a><span class="lineno"> 334</span> </div>
<div class="line"><a id="l00335" name="l00335"></a><span class="lineno"> 335</span> <span class="comment">// AmgX vector object representing unknowns.</span></div>
<div class="line"><a id="l00336" name="l00336"></a><span class="lineno"> 336</span> AMGX_vector_handle AmgXP = <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00337" name="l00337"></a><span class="lineno"> 337</span> </div>
<div class="line"><a id="l00338" name="l00338"></a><span class="lineno"> 338</span> <span class="comment">// AmgX vector object representing RHS.</span></div>
<div class="line"><a id="l00339" name="l00339"></a><span class="lineno"> 339</span> AMGX_vector_handle AmgXRHS = <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00340" name="l00340"></a><span class="lineno"> 340</span> </div>
<div class="line"><a id="l00341" name="l00341"></a><span class="lineno"> 341</span> <span class="comment">// AmgX solver object.</span></div>
<div class="line"><a id="l00342" name="l00342"></a><span class="lineno"> 342</span> AMGX_solver_handle solver = <span class="keyword">nullptr</span>;</div>
<div class="line"><a id="l00343" name="l00343"></a><span class="lineno"> 343</span> </div>
<div class="line"><a id="l00344" name="l00344"></a><span class="lineno"> 344</span> <span class="comment">// AmgX resource object.</span></div>
<div class="line"><a id="l00345" name="l00345"></a><span class="lineno"> 345</span> <span class="keyword">static</span> AMGX_resources_handle rsrc;</div>
<div class="line"><a id="l00346" name="l00346"></a><span class="lineno"> 346</span><span class="comment"></span> </div>
<div class="line"><a id="l00347" name="l00347"></a><span class="lineno"> 347</span><span class="comment"> /// Set the ID of the corresponding GPU used by this process.</span></div>
<div class="line"><a id="l00348" name="l00348"></a><span class="lineno"> 348</span><span class="comment"></span> <span class="keywordtype">void</span> SetDeviceIDs(<span class="keyword">const</span> <span class="keywordtype">int</span> nDevs);</div>
<div class="line"><a id="l00349" name="l00349"></a><span class="lineno"> 349</span><span class="comment"></span> </div>
<div class="line"><a id="l00350" name="l00350"></a><span class="lineno"> 350</span><span class="comment"> /// Initialize all MPI communicators.</span></div>
<div class="line"><a id="l00351" name="l00351"></a><span class="lineno"> 351</span><span class="comment"></span><span class="preprocessor">#ifdef MFEM_USE_MPI</span></div>
<div class="line"><a id="l00352" name="l00352"></a><span class="lineno"> 352</span> <span class="keywordtype">void</span> InitMPIcomms(<span class="keyword">const</span> MPI_Comm &comm, <span class="keyword">const</span> <span class="keywordtype">int</span> nDevs);</div>
<div class="line"><a id="l00353" name="l00353"></a><span class="lineno"> 353</span><span class="preprocessor">#endif</span></div>
<div class="line"><a id="l00354" name="l00354"></a><span class="lineno"> 354</span> </div>
<div class="line"><a id="l00355" name="l00355"></a><span class="lineno"> 355</span> <span class="keywordtype">void</span> InitAmgX();</div>
<div class="line"><a id="l00356" name="l00356"></a><span class="lineno"> 356</span> </div>
<div class="line"><a id="l00357" name="l00357"></a><span class="lineno"> 357</span> <span class="comment">// Row partition for the HypreParMatrix</span></div>
<div class="line"><a id="l00358" name="l00358"></a><span class="lineno"> 358</span> int64_t mat_local_rows;</div>
<div class="line"><a id="l00359" name="l00359"></a><span class="lineno"> 359</span> </div>
<div class="line"><a id="l00360" name="l00360"></a><span class="lineno"> 360</span> std::string mpi_gpu_mode;</div>
<div class="line"><a id="l00361" name="l00361"></a><span class="lineno"> 361</span>};</div>
</div>
<div class="line"><a id="l00362" name="l00362"></a><span class="lineno"> 362</span>}</div>
<div class="line"><a id="l00363" name="l00363"></a><span class="lineno"> 363</span><span class="preprocessor">#endif </span><span class="comment">// MFEM_USE_AMGX</span></div>
<div class="line"><a id="l00364" name="l00364"></a><span class="lineno"> 364</span><span class="preprocessor">#endif </span><span class="comment">// MFEM_AMGX_SOLVER</span></div>
<div class="ttc" id="aclassmfem_1_1AmgXSolver_html"><div class="ttname"><a href="classmfem_1_1AmgXSolver.html">mfem::AmgXSolver</a></div><div class="ttdoc">MFEM wrapper for Nvidia's multigrid library, AmgX (github.com/NVIDIA/AMGX)</div><div class="ttdef"><b>Definition</b> <a href="#l00069">amgxsolver.hpp:70</a></div></div>
<div class="ttc" id="aclassmfem_1_1AmgXSolver_html_a0f01eb69c61485a394e98ee794a08624"><div class="ttname"><a href="classmfem_1_1AmgXSolver.html#a0f01eb69c61485a394e98ee794a08624">mfem::AmgXSolver::GetNumIterations</a></div><div class="ttdeci">int GetNumIterations()</div><div class="ttdoc">Return the number of iterations that were executed during the last solve phase.</div><div class="ttdef"><b>Definition</b> <a href="amgxsolver_8cpp_source.html#l00987">amgxsolver.cpp:987</a></div></div>
<div class="ttc" id="aclassmfem_1_1AmgXSolver_html_a1088fe38c4f36f22ea70550e4272a450"><div class="ttname"><a href="classmfem_1_1AmgXSolver.html#a1088fe38c4f36f22ea70550e4272a450">mfem::AmgXSolver::ConvergenceCheck</a></div><div class="ttdeci">bool ConvergenceCheck</div><div class="ttdoc">Flag to check for convergence.</div><div class="ttdef"><b>Definition</b> <a href="#l00087">amgxsolver.hpp:87</a></div></div>
<div class="ttc" id="aclassmfem_1_1AmgXSolver_html_a1159aab911bcfd9c5b6d2cbe842987a7"><div class="ttname"><a href="classmfem_1_1AmgXSolver.html#a1159aab911bcfd9c5b6d2cbe842987a7">mfem::AmgXSolver::CONFIG_SRC</a></div><div class="ttdeci">CONFIG_SRC</div><div class="ttdoc">Flags to determine whether user solver settings are defined internally in the source code or will be ...</div><div class="ttdef"><b>Definition</b> <a href="#l00093">amgxsolver.hpp:94</a></div></div>
<div class="ttc" id="aclassmfem_1_1AmgXSolver_html_a1159aab911bcfd9c5b6d2cbe842987a7a0ccf63c071b521277393fcaf498a8633"><div class="ttname"><a href="classmfem_1_1AmgXSolver.html#a1159aab911bcfd9c5b6d2cbe842987a7a0ccf63c071b521277393fcaf498a8633">mfem::AmgXSolver::EXTERNAL</a></div><div class="ttdeci">@ EXTERNAL</div><div class="ttdoc">Configure will be read from a specified file.</div><div class="ttdef"><b>Definition</b> <a href="#l00098">amgxsolver.hpp:98</a></div></div>
<div class="ttc" id="aclassmfem_1_1AmgXSolver_html_a1159aab911bcfd9c5b6d2cbe842987a7a62959275e2c5b6e76efc2f969873b392"><div class="ttname"><a href="classmfem_1_1AmgXSolver.html#a1159aab911bcfd9c5b6d2cbe842987a7a62959275e2c5b6e76efc2f969873b392">mfem::AmgXSolver::INTERNAL</a></div><div class="ttdeci">@ INTERNAL</div><div class="ttdoc">Configuration will be read directly from a string.</div><div class="ttdef"><b>Definition</b> <a href="#l00096">amgxsolver.hpp:96</a></div></div>
<div class="ttc" id="aclassmfem_1_1AmgXSolver_html_a1159aab911bcfd9c5b6d2cbe842987a7a8992692012c523ccbaf88e41c2524588"><div class="ttname"><a href="classmfem_1_1AmgXSolver.html#a1159aab911bcfd9c5b6d2cbe842987a7a8992692012c523ccbaf88e41c2524588">mfem::AmgXSolver::UNDEFINED</a></div><div class="ttdeci">@ UNDEFINED</div><div class="ttdef"><b>Definition</b> <a href="#l00100">amgxsolver.hpp:99</a></div></div>
<div class="ttc" id="aclassmfem_1_1AmgXSolver_html_a14c1e13d205932df6677b30611db747a"><div class="ttname"><a href="classmfem_1_1AmgXSolver.html#a14c1e13d205932df6677b30611db747a">mfem::AmgXSolver::Finalize</a></div><div class="ttdeci">void Finalize()</div><div class="ttdoc">Close down the AmgX library and free up any MPI Comms set up for it.</div><div class="ttdef"><b>Definition</b> <a href="amgxsolver_8cpp_source.html#l00994">amgxsolver.cpp:994</a></div></div>
<div class="ttc" id="aclassmfem_1_1AmgXSolver_html_a5e521c91e81fe2e883608d9e1976c7a5"><div class="ttname"><a href="classmfem_1_1AmgXSolver.html#a5e521c91e81fe2e883608d9e1976c7a5">mfem::AmgXSolver::DefaultParameters</a></div><div class="ttdeci">void DefaultParameters(const AMGX_MODE amgxMode_, const bool verbose)</div><div class="ttdoc">Set up the AmgX library with the default paramaters.</div><div class="ttdef"><b>Definition</b> <a href="amgxsolver_8cpp_source.html#l00202">amgxsolver.cpp:202</a></div></div>
<div class="ttc" id="aclassmfem_1_1AmgXSolver_html_a62817c3f75f4a82320109a0e41c7c3a9"><div class="ttname"><a href="classmfem_1_1AmgXSolver.html#a62817c3f75f4a82320109a0e41c7c3a9">mfem::AmgXSolver::~AmgXSolver</a></div><div class="ttdeci">~AmgXSolver()</div><div class="ttdoc">Close down the AmgX library and free up any MPI Comms set up for it.</div><div class="ttdef"><b>Definition</b> <a href="amgxsolver_8cpp_source.html#l00084">amgxsolver.cpp:84</a></div></div>
<div class="ttc" id="aclassmfem_1_1AmgXSolver_html_a796f9fc1771f96a4e7a04241014d4095"><div class="ttname"><a href="classmfem_1_1AmgXSolver.html#a796f9fc1771f96a4e7a04241014d4095">mfem::AmgXSolver::InitSerial</a></div><div class="ttdeci">void InitSerial()</div><div class="ttdoc">Initialize the AmgX library for serial execution once the solver configuration has been established t...</div><div class="ttdef"><b>Definition</b> <a href="amgxsolver_8cpp_source.html#l00089">amgxsolver.cpp:89</a></div></div>
<div class="ttc" id="aclassmfem_1_1AmgXSolver_html_a928145b29da0d55511c56c0e3068752c"><div class="ttname"><a href="classmfem_1_1AmgXSolver.html#a928145b29da0d55511c56c0e3068752c">mfem::AmgXSolver::AMGX_MODE</a></div><div class="ttdeci">AMGX_MODE</div><div class="ttdoc">Flags to configure AmgXSolver as a solver or preconditioner.</div><div class="ttdef"><b>Definition</b> <a href="#l00074">amgxsolver.hpp:75</a></div></div>
<div class="ttc" id="aclassmfem_1_1AmgXSolver_html_a928145b29da0d55511c56c0e3068752cae833eebaaef842ff2639069ec568b2c7"><div class="ttname"><a href="classmfem_1_1AmgXSolver.html#a928145b29da0d55511c56c0e3068752cae833eebaaef842ff2639069ec568b2c7">mfem::AmgXSolver::SOLVER</a></div><div class="ttdeci">@ SOLVER</div><div class="ttdef"><b>Definition</b> <a href="#l00079">amgxsolver.hpp:79</a></div></div>
<div class="ttc" id="aclassmfem_1_1AmgXSolver_html_a928145b29da0d55511c56c0e3068752caf7bc0614eb0effa62a53b6799a87f554"><div class="ttname"><a href="classmfem_1_1AmgXSolver.html#a928145b29da0d55511c56c0e3068752caf7bc0614eb0effa62a53b6799a87f554">mfem::AmgXSolver::PRECONDITIONER</a></div><div class="ttdeci">@ PRECONDITIONER</div><div class="ttdef"><b>Definition</b> <a href="#l00084">amgxsolver.hpp:83</a></div></div>
<div class="ttc" id="aclassmfem_1_1AmgXSolver_html_aa629f0dc1ab3e1e7f4fe7871d1d61bec"><div class="ttname"><a href="classmfem_1_1AmgXSolver.html#aa629f0dc1ab3e1e7f4fe7871d1d61bec">mfem::AmgXSolver::SetConvergenceCheck</a></div><div class="ttdeci">void SetConvergenceCheck(bool setConvergenceCheck_=true)</div><div class="ttdoc">Add a check for convergence after applying Mult.</div><div class="ttdef"><b>Definition</b> <a href="amgxsolver_8cpp_source.html#l00197">amgxsolver.cpp:197</a></div></div>
<div class="ttc" id="aclassmfem_1_1AmgXSolver_html_aa7b9914286b7df6144e9c5c01bae52dd"><div class="ttname"><a href="classmfem_1_1AmgXSolver.html#aa7b9914286b7df6144e9c5c01bae52dd">mfem::AmgXSolver::InitMPITeams</a></div><div class="ttdeci">void InitMPITeams(const MPI_Comm &comm, const int nDevs)</div><div class="ttdoc">Initialize the AmgX library and create MPI teams based on the number of devices on each node nDevs....</div><div class="ttdef"><b>Definition</b> <a href="amgxsolver_8cpp_source.html#l00153">amgxsolver.cpp:153</a></div></div>
<div class="ttc" id="aclassmfem_1_1AmgXSolver_html_ab55d8190a4305532e025dab81362503d"><div class="ttname"><a href="classmfem_1_1AmgXSolver.html#ab55d8190a4305532e025dab81362503d">mfem::AmgXSolver::ReadParameters</a></div><div class="ttdeci">void ReadParameters(const std::string config, CONFIG_SRC source)</div><div class="ttdoc">Read in the AmgX parameters either through a file or directly through a properly formated string....</div><div class="ttdef"><b>Definition</b> <a href="amgxsolver_8cpp_source.html#l00190">amgxsolver.cpp:190</a></div></div>
<div class="ttc" id="aclassmfem_1_1AmgXSolver_html_ac2cb9ce8f818def630f5e6a03624c911"><div class="ttname"><a href="classmfem_1_1AmgXSolver.html#ac2cb9ce8f818def630f5e6a03624c911">mfem::AmgXSolver::Mult</a></div><div class="ttdeci">void Mult(const Vector &b, Vector &x) const override</div><div class="ttdoc">Utilize the AmgX library to solve the linear system where the "matrix" is the AMG approximation to th...</div><div class="ttdef"><b>Definition</b> <a href="amgxsolver_8cpp_source.html#l00906">amgxsolver.cpp:906</a></div></div>
<div class="ttc" id="aclassmfem_1_1AmgXSolver_html_ae94c512c1587e04ea421fa68af9df3a5"><div class="ttname"><a href="classmfem_1_1AmgXSolver.html#ae94c512c1587e04ea421fa68af9df3a5">mfem::AmgXSolver::InitExclusiveGPU</a></div><div class="ttdeci">void InitExclusiveGPU(const MPI_Comm &comm)</div><div class="ttdoc">Initialize the AmgX library in parallel mode with exactly one GPU per rank after the solver configura...</div><div class="ttdef"><b>Definition</b> <a href="amgxsolver_8cpp_source.html#l00124">amgxsolver.cpp:124</a></div></div>
<div class="ttc" id="aclassmfem_1_1AmgXSolver_html_aed974448d0c033b937e1401959eeacd7"><div class="ttname"><a href="classmfem_1_1AmgXSolver.html#aed974448d0c033b937e1401959eeacd7">mfem::AmgXSolver::AmgXSolver</a></div><div class="ttdeci">AmgXSolver()</div><div class="ttdef"><b>Definition</b> <a href="amgxsolver_8cpp_source.html#l00037">amgxsolver.cpp:37</a></div></div>
<div class="ttc" id="aclassmfem_1_1AmgXSolver_html_af720485af2f2b22de2023643560625dc"><div class="ttname"><a href="classmfem_1_1AmgXSolver.html#af720485af2f2b22de2023643560625dc">mfem::AmgXSolver::UpdateOperator</a></div><div class="ttdeci">void UpdateOperator(const Operator &op)</div><div class="ttdoc">Change the input operator that is being solved via AmgX. Supports operators based on either an MFEM S...</div><div class="ttdef"><b>Definition</b> <a href="amgxsolver_8cpp_source.html#l00886">amgxsolver.cpp:886</a></div></div>
<div class="ttc" id="aclassmfem_1_1AmgXSolver_html_afc8308596f99d592c49b03de585116d6"><div class="ttname"><a href="classmfem_1_1AmgXSolver.html#afc8308596f99d592c49b03de585116d6">mfem::AmgXSolver::SetOperator</a></div><div class="ttdeci">void SetOperator(const Operator &op) override</div><div class="ttdoc">Sets the Operator that is going to be solved via AmgX. Supports operators based on either an MFEM Spa...</div><div class="ttdef"><b>Definition</b> <a href="amgxsolver_8cpp_source.html#l00863">amgxsolver.cpp:863</a></div></div>
<div class="ttc" id="aclassmfem_1_1Array_html"><div class="ttname"><a href="classmfem_1_1Array.html">mfem::Array</a></div><div class="ttdef"><b>Definition</b> <a href="array_8hpp_source.html#l00046">array.hpp:47</a></div></div>
<div class="ttc" id="aclassmfem_1_1HypreParMatrix_html"><div class="ttname"><a href="classmfem_1_1HypreParMatrix.html">mfem::HypreParMatrix</a></div><div class="ttdoc">Wrapper for hypre's ParCSR matrix class.</div><div class="ttdef"><b>Definition</b> <a href="hypre_8hpp_source.html#l00407">hypre.hpp:408</a></div></div>
<div class="ttc" id="aclassmfem_1_1Operator_html"><div class="ttname"><a href="classmfem_1_1Operator.html">mfem::Operator</a></div><div class="ttdoc">Abstract operator.</div><div class="ttdef"><b>Definition</b> <a href="linalg_2operator_8hpp_source.html#l00024">operator.hpp:25</a></div></div>
<div class="ttc" id="aclassmfem_1_1Solver_html"><div class="ttname"><a href="classmfem_1_1Solver.html">mfem::Solver</a></div><div class="ttdoc">Base class for solvers.</div><div class="ttdef"><b>Definition</b> <a href="linalg_2operator_8hpp_source.html#l00779">operator.hpp:780</a></div></div>
<div class="ttc" id="aclassmfem_1_1SparseMatrix_html"><div class="ttname"><a href="classmfem_1_1SparseMatrix.html">mfem::SparseMatrix</a></div><div class="ttdoc">Data type sparse matrix.</div><div class="ttdef"><b>Definition</b> <a href="sparsemat_8hpp_source.html#l00050">sparsemat.hpp:51</a></div></div>
<div class="ttc" id="aclassmfem_1_1Vector_html"><div class="ttname"><a href="classmfem_1_1Vector.html">mfem::Vector</a></div><div class="ttdoc">Vector data type.</div><div class="ttdef"><b>Definition</b> <a href="vector_8hpp_source.html#l00081">vector.hpp:82</a></div></div>
<div class="ttc" id="aconfig_8hpp_html"><div class="ttname"><a href="config_8hpp.html">config.hpp</a></div></div>
<div class="ttc" id="aex25_8cpp_html_aafef765e6aa140d0a04f5bedd532dc19"><div class="ttname"><a href="ex25_8cpp.html#aafef765e6aa140d0a04f5bedd532dc19">source</a></div><div class="ttdeci">void source(const Vector &x, Vector &f)</div><div class="ttdef"><b>Definition</b> <a href="ex25_8cpp_source.html#l00620">ex25.cpp:620</a></div></div>
<div class="ttc" id="ahypre_8hpp_html"><div class="ttname"><a href="hypre_8hpp.html">hypre.hpp</a></div></div>
<div class="ttc" id="alinalg_2operator_8hpp_html"><div class="ttname"><a href="linalg_2operator_8hpp.html">operator.hpp</a></div></div>
<div class="ttc" id="alissajous_8cpp_html_a17e5a28fa31f790a17bbf2b0d84e8324"><div class="ttname"><a href="lissajous_8cpp.html#a17e5a28fa31f790a17bbf2b0d84e8324">b</a></div><div class="ttdeci">real_t b</div><div class="ttdef"><b>Definition</b> <a href="lissajous_8cpp_source.html#l00042">lissajous.cpp:42</a></div></div>
<div class="ttc" id="anamespacemfem_html"><div class="ttname"><a href="namespacemfem.html">mfem</a></div><div class="ttdef"><b>Definition</b> <a href="CodeDocumentation_8dox_source.html#l00001">CodeDocumentation.dox:1</a></div></div>
<div class="ttc" id="asparsemat_8hpp_html"><div class="ttname"><a href="sparsemat_8hpp.html">sparsemat.hpp</a></div></div>
</div><!-- fragment --></div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated on Wed Apr 9 2025 16:53:04 for MFEM by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.11.0
</small></address>
</div><!-- doc-content -->
</body>
</html>