libMesh
Loading...
Searching...
No Matches
string_to_enum.C
Go to the documentation of this file.
1// The libMesh Finite Element Library.
2// Copyright (C) 2002-2026 Benjamin S. Kirk, John W. Peterson, Roy H. Stogner
3
4// This library is free software; you can redistribute it and/or
5// modify it under the terms of the GNU Lesser General Public
6// License as published by the Free Software Foundation; either
7// version 2.1 of the License, or (at your option) any later version.
8
9// This library is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12// Lesser General Public License for more details.
13
14// You should have received a copy of the GNU Lesser General Public
15// License along with this library; if not, write to the Free Software
16// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
18
19
20// C++ includes
21#include <algorithm>
22#include <map>
23
24// Local includes
25#include "libmesh/libmesh_common.h"
26#include "libmesh/string_to_enum.h"
27#include "libmesh/enum_to_string.h"
28#include "libmesh/enum_convergence_flags.h"
29#include "libmesh/enum_elem_quality.h"
30#include "libmesh/enum_elem_type.h"
31#include "libmesh/enum_eigen_solver_type.h"
32#include "libmesh/enum_fe_family.h"
33#include "libmesh/enum_inf_map_type.h"
34#include "libmesh/enum_io_package.h"
35#include "libmesh/enum_norm_type.h"
36#include "libmesh/enum_order.h"
37#include "libmesh/enum_parallel_type.h"
38#include "libmesh/enum_partitioner_type.h"
39#include "libmesh/enum_point_locator_type.h"
40#include "libmesh/enum_preconditioner_type.h"
41#include "libmesh/enum_quadrature_type.h"
42#include "libmesh/enum_solver_package.h"
43#include "libmesh/enum_solver_type.h"
44#include "libmesh/enum_subset_solve_mode.h"
45#include "libmesh/enum_xdr_mode.h"
46#include "libmesh/elem.h"
47
48namespace libMesh
49{
50
51// ------------------------------------------------------------
52// Anonymous namespace to hold local data & methods
53namespace {
54
55
56// Reverse a map
57template <class MapType>
58inline
59std::map<typename MapType::mapped_type, typename MapType::key_type>
60build_reverse_map (const MapType & forward)
61{
62 std::map<typename MapType::mapped_type, typename MapType::key_type> reverse;
63
64 for (auto & [key, val] : forward)
65 {
66 // If the forward map is not invertible, we might already have
67 // found a preimage of val. Choose the "largest"
68 // preimage according to operator<; for std::string this will
69 // give us the longest, hopefully most specific name
70 // corresponding to an enum.
71 if (auto preimage = reverse.find(val);
72 preimage == reverse.end())
73 reverse.emplace (val, key);
74 else if (preimage->second < key)
75 preimage->second = key;
76 }
77
78 return reverse;
79}
80
81std::map<std::string, ElemType> elem_type_to_enum {
82 {"EDGE" , EDGE2},
83 {"EDGE2" , EDGE2},
84 {"EDGE2" , EDGE2},
85 {"EDGE3" , EDGE3},
86 {"EDGE4" , EDGE4},
87
88 {"TRI" , TRI3},
89 {"TRI3" , TRI3},
90 {"TRISHELL3" , TRISHELL3},
91 {"TRI3SUBDIVISION", TRI3SUBDIVISION},
92 {"TRI6" , TRI6},
93 {"TRI7" , TRI7},
94
95 {"QUAD" , QUAD4},
96 {"QUAD4" , QUAD4},
97 {"QUADSHELL4" , QUADSHELL4},
98 {"QUAD8" , QUAD8},
99 {"QUADSHELL8" , QUADSHELL8},
100 {"QUAD9" , QUAD9},
101 {"QUADSHELL9" , QUADSHELL9},
102
103 {"C0POLYGON" , C0POLYGON},
104
105 {"C0POLYHEDRON" , C0POLYHEDRON},
106
107 {"TET" , TET4},
108 {"TET4" , TET4},
109 {"TET10" , TET10},
110 {"TET14" , TET14},
111
112 {"HEX" , HEX8},
113 {"HEX8" , HEX8},
114 {"HEX20" , HEX20},
115 {"HEX27" , HEX27},
116
117 {"PRISM" , PRISM6},
118 {"PRISM6" , PRISM6},
119 {"PRISM15" , PRISM15},
120 {"PRISM18" , PRISM18},
121 {"PRISM20" , PRISM20},
122 {"PRISM21" , PRISM21},
123
124 {"PYRAMID" , PYRAMID5},
125 {"PYRAMID5" , PYRAMID5},
126 {"PYRAMID13" , PYRAMID13},
127 {"PYRAMID14" , PYRAMID14},
128 {"PYRAMID18" , PYRAMID18},
129
130 {"INFEDGE" , INFEDGE2},
131 {"INFEDGE2" , INFEDGE2},
132
133 {"INFQUAD" , INFQUAD4},
134 {"INFQUAD4" , INFQUAD4},
135 {"INFQUAD6" , INFQUAD6},
136
137 {"INFHEX" , INFHEX8},
138 {"INFHEX8" , INFHEX8},
139 {"INFHEX16" , INFHEX16},
140 {"INFHEX18" , INFHEX18},
141
142 {"INFPRISM" , INFPRISM6},
143 {"INFPRISM6" , INFPRISM6},
144 {"INFPRISM12" , INFPRISM12},
145
146 {"NODE" , NODEELEM},
147 {"NODEELEM" , NODEELEM},
148
149 {"INVALID_ELEM" , INVALID_ELEM}
150 };
151
152std::map<ElemType, std::string> enum_to_elem_type =
153 build_reverse_map(elem_type_to_enum);
154
155
156std::map<std::string, ElemMappingType> elem_mapping_type_to_enum {
157 {"LAGRANGE_MAP" , LAGRANGE_MAP},
158 {"RATIONAL_BERNSTEIN_MAP", RATIONAL_BERNSTEIN_MAP},
159 {"INVALID_MAP" , INVALID_MAP}
160 };
161
162std::map<ElemMappingType, std::string> enum_to_elem_mapping_type =
163 build_reverse_map(elem_mapping_type_to_enum);
164
165
166std::map<std::string, Order> order_to_enum {
167 {"CONSTANT" , CONSTANT},
168 {"FIRST" , FIRST},
169 {"SECOND" , SECOND},
170 {"THIRD" , THIRD},
171 {"FOURTH" , FOURTH},
172 {"FIFTH" , FIFTH},
173 {"SIXTH" , SIXTH},
174 {"SEVENTH" , SEVENTH},
175 {"EIGHTH" , EIGHTH},
176 {"NINTH" , NINTH},
177 {"TENTH" , TENTH},
178
179 {"ELEVENTH" , ELEVENTH},
180 {"TWELFTH" , TWELFTH},
181 {"THIRTEENTH" , THIRTEENTH},
182 {"FOURTEENTH" , FOURTEENTH},
183 {"FIFTEENTH" , FIFTEENTH},
184 {"SIXTEENTH" , SIXTEENTH},
185 {"SEVENTEENTH" , SEVENTEENTH},
186 {"EIGHTTEENTH" , EIGHTTEENTH},
187 {"NINETEENTH" , NINETEENTH},
188 {"TWENTIETH" , TWENTIETH},
189
190 {"TWENTYFIRST" , TWENTYFIRST},
191 {"TWENTYSECOND" , TWENTYSECOND},
192 {"TWENTYTHIRD" , TWENTYTHIRD},
193 {"TWENTYFOURTH" , TWENTYFOURTH},
194 {"TWENTYFIFTH" , TWENTYFIFTH},
195 {"TWENTYSIXTH" , TWENTYSIXTH},
196 {"TWENTYSEVENTH", TWENTYSEVENTH},
197 {"TWENTYEIGHTH" , TWENTYEIGHTH},
198 {"TWENTYNINTH" , TWENTYNINTH},
199 {"THIRTIETH" , THIRTIETH},
200
201 {"THIRTYFIRST" , THIRTYFIRST},
202 {"THIRTYSECOND" , THIRTYSECOND},
203 {"THIRTYTHIRD" , THIRTYTHIRD},
204 {"THIRTYFOURTH" , THIRTYFOURTH},
205 {"THIRTYFIFTH" , THIRTYFIFTH},
206 {"THIRTYSIXTH" , THIRTYSIXTH},
207 {"THIRTYSEVENTH", THIRTYSEVENTH},
208 {"THIRTYEIGHTH" , THIRTYEIGHTH},
209 {"THIRTYNINTH" , THIRTYNINTH},
210 {"FORTIETH" , FORTIETH},
211
212 {"FORTYFIRST" , FORTYFIRST},
213 {"FORTYSECOND" , FORTYSECOND},
214 {"FORTYTHIRD" , FORTYTHIRD},
215 {"MAXIMUM" , MAXIMUM}
216 };
217
218std::map<Order, std::string> enum_to_order =
219 build_reverse_map(order_to_enum);
220
221
222std::map<std::string, FEFamily> fefamily_to_enum {
223 {"LAGRANGE" , LAGRANGE},
224 {"LAGRANGE_VEC" , LAGRANGE_VEC},
225 {"L2_LAGRANGE" , L2_LAGRANGE},
226 {"L2_LAGRANGE_VEC" , L2_LAGRANGE_VEC},
227 {"HIERARCHIC" , HIERARCHIC},
228 {"HIERARCHIC_VEC" , HIERARCHIC_VEC},
229 {"L2_HIERARCHIC" , L2_HIERARCHIC},
230 {"L2_HIERARCHIC_VEC" , L2_HIERARCHIC_VEC},
231 {"SIDE_HIERARCHIC" , SIDE_HIERARCHIC},
232 {"MONOMIAL" , MONOMIAL},
233 {"MONOMIAL_VEC" , MONOMIAL_VEC},
234 {"SCALAR" , SCALAR},
235 {"XYZ" , XYZ},
236 {"BERNSTEIN" , BERNSTEIN},
237 {"RATIONAL_BERNSTEIN", RATIONAL_BERNSTEIN},
238 {"SZABAB" , SZABAB},
239 {"INFINITE_MAP" , INFINITE_MAP},
240 {"JACOBI_20_00" , JACOBI_20_00},
241 {"JACOBI_30_00" , JACOBI_30_00},
242 {"LEGENDRE" , LEGENDRE},
243 {"CLOUGH" , CLOUGH},
244 {"HERMITE" , HERMITE},
245 {"SUBDIVISION" , SUBDIVISION},
246 {"NEDELEC_ONE" , NEDELEC_ONE},
247 {"RAVIART_THOMAS" , RAVIART_THOMAS},
248 {"L2_RAVIART_THOMAS" , L2_RAVIART_THOMAS}
249 };
250
251std::map<FEFamily, std::string> enum_to_fefamily =
252 build_reverse_map(fefamily_to_enum);
253
254
255std::map<std::string, InfMapType> inf_map_type_to_enum {
256 {"CARTESIAN" , CARTESIAN},
257 {"SPHERICAL" , SPHERICAL},
258 {"ELLIPSOIDAL", ELLIPSOIDAL}
259 };
260
261std::map<InfMapType, std::string> enum_to_inf_map_type =
262 build_reverse_map(inf_map_type_to_enum);
263
264
265std::map<std::string, QuadratureType> quadrature_type_to_enum {
266 {"QCLOUGH" , QCLOUGH},
267 {"QCOMPOSITE" , QCOMPOSITE},
268 {"QCONICAL" , QCONICAL},
269 {"QGAUSS" , QGAUSS},
270 {"QGAUSS_LOBATTO" , QGAUSS_LOBATTO},
271 {"QGRID" , QGRID},
272 {"QGRUNDMANN_MOLLER", QGRUNDMANN_MOLLER},
273 {"QJACOBI_1_0" , QJACOBI_1_0},
274 {"QJACOBI_2_0" , QJACOBI_2_0},
275 {"QMONOMIAL" , QMONOMIAL},
276 {"QNODAL" , QNODAL},
277 {"QSIMPSON" , QSIMPSON},
278 {"QTRAP" , QTRAP}
279 };
280
281std::map<QuadratureType, std::string> enum_to_quadrature_type =
282 build_reverse_map(quadrature_type_to_enum);
283
284
285std::map<std::string, PartitionerType> partitioner_type_to_enum {
286 {"CENTROID_PARTITIONER" , CENTROID_PARTITIONER},
287 {"LINEAR_PARTITIONER" , LINEAR_PARTITIONER},
288 {"SFC_PARTITIONER" , SFC_PARTITIONER},
289 {"HILBERT_SFC_PARTITIONER" , HILBERT_SFC_PARTITIONER},
290 {"MORTON_SFC_PARTITIONER" , MORTON_SFC_PARTITIONER},
291 {"METIS_PARTITIONER" , METIS_PARTITIONER},
292 {"PARMETIS_PARTITIONER" , PARMETIS_PARTITIONER},
293 {"SUBDOMAIN_PARTITIONER" , SUBDOMAIN_PARTITIONER},
294 {"MAPPED_SUBDOMAIN_PARTITIONER", MAPPED_SUBDOMAIN_PARTITIONER},
295
296 //shorter
297 {"CENTROID" , CENTROID_PARTITIONER},
298 {"LINEAR" , LINEAR_PARTITIONER},
299 {"SFC" , SFC_PARTITIONER},
300 {"HILBERT_SFC" , HILBERT_SFC_PARTITIONER},
301 {"MORTON_SFC" , MORTON_SFC_PARTITIONER},
302 {"METIS" , METIS_PARTITIONER},
303 {"PARMETIS" , PARMETIS_PARTITIONER},
304 {"SUBDOMAIN" , SUBDOMAIN_PARTITIONER},
305 {"MAPPED_SUBDOMAIN" , MAPPED_SUBDOMAIN_PARTITIONER},
306 };
307
308std::map<PartitionerType, std::string> enum_to_partitioner_type =
309 build_reverse_map(partitioner_type_to_enum);
310
311
312std::map<std::string, PreconditionerType> preconditioner_type_to_enum {
313 {"IDENTITY_PRECOND" , IDENTITY_PRECOND},
314 {"JACOBI_PRECOND" , JACOBI_PRECOND},
315 {"BLOCK_JACOBI_PRECOND" , BLOCK_JACOBI_PRECOND},
316 {"SOR_PRECOND" , SOR_PRECOND},
317 {"SSOR_PRECOND" , SSOR_PRECOND},
318 {"EISENSTAT_PRECOND" , EISENSTAT_PRECOND},
319 {"ASM_PRECOND" , ASM_PRECOND},
320 {"CHOLESKY_PRECOND" , CHOLESKY_PRECOND},
321 {"ICC_PRECOND" , ICC_PRECOND},
322 {"ILU_PRECOND" , ILU_PRECOND},
323 {"LU_PRECOND" , LU_PRECOND},
324 {"USER_PRECOND" , USER_PRECOND},
325 {"SHELL_PRECOND" , SHELL_PRECOND},
326 {"AMG_PRECOND" , AMG_PRECOND},
327 {"SVD_PRECOND" , SVD_PRECOND},
328 {"INVALID_PRECONDITIONER", INVALID_PRECONDITIONER},
329
330 //shorter
331 {"IDENTITY" , IDENTITY_PRECOND},
332 {"JACOBI" , JACOBI_PRECOND},
333 {"BLOCK_JACOBI", BLOCK_JACOBI_PRECOND},
334 {"SOR" , SOR_PRECOND},
335 {"SSOR" , SSOR_PRECOND},
336 {"EISENSTAT" , EISENSTAT_PRECOND},
337 {"ASM" , ASM_PRECOND},
338 {"CHOLESKY" , CHOLESKY_PRECOND},
339 {"ICC" , ICC_PRECOND},
340 {"ILU" , ILU_PRECOND},
341 {"LU" , LU_PRECOND},
342 {"USER" , USER_PRECOND},
343 {"SHELL" , SHELL_PRECOND},
344 {"AMG" , AMG_PRECOND},
345 {"SVD" , SVD_PRECOND},
346 {"INVALID" , INVALID_PRECONDITIONER},
347 };
348
349std::map<PreconditionerType, std::string> enum_to_preconditioner_type =
350 build_reverse_map(preconditioner_type_to_enum);
351
352
353#ifdef LIBMESH_ENABLE_AMR
354std::map<std::string, Elem::RefinementState> refinementstate_type_to_enum {
355 {"COARSEN" , Elem::COARSEN},
356 {"DO_NOTHING" , Elem::DO_NOTHING},
357 {"REFINE" , Elem::REFINE},
358 {"JUST_REFINED" , Elem::JUST_REFINED},
359 {"JUST_COARSENED" , Elem::JUST_COARSENED},
360 {"INACTIVE" , Elem::INACTIVE},
361 {"COARSEN_INACTIVE" , Elem::COARSEN_INACTIVE},
362 {"INVALID_REFINEMENTSTATE", Elem::INVALID_REFINEMENTSTATE},
363 };
364
365std::map<Elem::RefinementState, std::string> enum_to_refinementstate_type =
366 build_reverse_map(refinementstate_type_to_enum);
367#endif // LIBMESH_ENABLE_AMR
368
369
370std::map<std::string, EigenSolverType> eigensolvertype_to_enum {
371 {"POWER" , POWER},
372 {"LAPACK" , LAPACK},
373 {"SUBSPACE" , SUBSPACE},
374 {"ARNOLDI" , ARNOLDI},
375 {"LANCZOS" , LANCZOS},
376 {"KRYLOVSCHUR" , KRYLOVSCHUR},
377 {"INVALID_EIGENSOLVER", INVALID_EIGENSOLVER},
378 };
379
380std::map<EigenSolverType, std::string> enum_to_eigensolvertype =
381 build_reverse_map(eigensolvertype_to_enum);
382
383
384std::map<std::string, SolverType> solvertype_to_enum {
385 {"CG" , CG},
386 {"CGN" , CGN},
387 {"CGS" , CGS},
388 {"CR" , CR},
389 {"QMR" , QMR},
390 {"TCQMR" , TCQMR},
391 {"TFQMR" , TFQMR},
392 {"BICG" , BICG},
393 {"BICGSTAB" , BICGSTAB},
394 {"MINRES" , MINRES},
395 {"GMRES" , GMRES},
396 {"LSQR" , LSQR},
397 {"JACOBI" , JACOBI},
398 {"SOR_FORWARD" , SOR_FORWARD},
399 {"SOR_BACKWARD" , SOR_BACKWARD},
400 {"SSOR" , SSOR},
401 {"RICHARDSON" , RICHARDSON},
402 {"CHEBYSHEV" , CHEBYSHEV},
403 {"SPARSELU" , SPARSELU},
404 {"INVALID_SOLVER", INVALID_SOLVER},
405 };
406
407std::map<SolverType, std::string> enum_to_solvertype =
408 build_reverse_map(solvertype_to_enum);
409
410
411std::map<std::string, ElemQuality> elemquality_to_enum {
412 {"ASPECT_RATIO" , ASPECT_RATIO},
413 {"SKEW" , SKEW},
414 {"SHEAR" , SHEAR},
415 {"SHAPE" , SHAPE},
416 {"MAX_ANGLE" , MAX_ANGLE},
417 {"MIN_ANGLE" , MIN_ANGLE},
418 {"MAX_DIHEDRAL_ANGLE" , MAX_DIHEDRAL_ANGLE},
419 {"MIN_DIHEDRAL_ANGLE" , MIN_DIHEDRAL_ANGLE},
420 {"CONDITION" , CONDITION},
421 {"DISTORTION" , DISTORTION},
422 {"TAPER" , TAPER},
423 {"WARP" , WARP},
424 {"STRETCH" , STRETCH},
425 {"DIAGONAL" , DIAGONAL},
426 {"ASPECT_RATIO_BETA" , ASPECT_RATIO_BETA},
427 {"ASPECT_RATIO_GAMMA" , ASPECT_RATIO_GAMMA},
428 {"SIZE" , SIZE},
429 {"JACOBIAN" , JACOBIAN},
430 {"TWIST" , TWIST},
431 };
432
433std::map<ElemQuality, std::string> enum_to_elemquality =
434 build_reverse_map(elemquality_to_enum);
435
436
437std::map<std::string, IOPackage> iopackage_to_enum {
438 {"TECPLOT" , TECPLOT},
439 {"GMV" , GMV},
440 {"GMSH" , GMSH},
441 {"VTK" , VTK},
442 {"DIVA" , DIVA},
443 {"TETGEN" , TETGEN},
444 {"UCD" , UCD},
445 {"LIBMESH" , LIBMESH},
446 };
447
448std::map<IOPackage, std::string> enum_to_iopackage =
449 build_reverse_map(iopackage_to_enum);
450
451
452std::map<std::string, FEMNormType> norm_type_to_enum {
453 {"L2" , L2},
454 {"H1" , H1},
455 {"H2" , H2},
456 {"HCURL" , HCURL},
457 {"HDIV" , HDIV},
458
459 {"L1" , L1},
460 {"L_INF" , L_INF},
461
462 {"H1_SEMINORM" , H1_SEMINORM},
463 {"H2_SEMINORM" , H2_SEMINORM},
464 {"HCURL_SEMINORM" , HCURL_SEMINORM},
465 {"HDIV_SEMINORM" , HDIV_SEMINORM},
466
467 {"W1_INF_SEMINORM", W1_INF_SEMINORM},
468 {"W2_INF_SEMINORM", W2_INF_SEMINORM},
469
470 {"DISCRETE_L1" , DISCRETE_L1},
471 {"DISCRETE_L2" , DISCRETE_L2},
472 {"DISCRETE_L_INF" , DISCRETE_L_INF},
473
474 {"H1_X_SEMINORM" , H1_X_SEMINORM},
475 {"H1_Y_SEMINORM" , H1_Y_SEMINORM},
476 {"H1_Z_SEMINORM" , H1_Z_SEMINORM},
477
478 {"INVALID_NORM" , INVALID_NORM},
479 };
480
481std::map<FEMNormType, std::string> enum_to_norm_type =
482 build_reverse_map(norm_type_to_enum);
483
484
485std::map<std::string, ParallelType> parallel_type_to_enum {
486 {"AUTOMATIC" , AUTOMATIC},
487 {"SERIAL" , SERIAL},
488 {"PARALLEL" , PARALLEL},
489 {"GHOSTED" , GHOSTED},
490 {"INVALID_PARALLELIZATION" , INVALID_PARALLELIZATION},
491 };
492
493std::map<ParallelType, std::string> enum_to_parallel_type =
494 build_reverse_map(parallel_type_to_enum);
495
496
497std::map<std::string, PointLocatorType> point_locator_type_to_enum {
498 {"TREE" , TREE},
499 {"INVALID_LOCATOR" , INVALID_LOCATOR},
500 };
501
502std::map<PointLocatorType, std::string> enum_to_point_locator_type =
503 build_reverse_map(point_locator_type_to_enum);
504
505
506std::map<std::string, SolverPackage> solverpackage_type_to_enum {
507 {"PETSC_SOLVERS" , PETSC_SOLVERS},
508 {"TRILINOS_SOLVERS" , TRILINOS_SOLVERS},
509 {"LASPACK_SOLVERS" , LASPACK_SOLVERS},
510 {"SLEPC_SOLVERS" , SLEPC_SOLVERS},
511 {"EIGEN_SOLVERS" , EIGEN_SOLVERS},
512 {"NLOPT_SOLVERS" , NLOPT_SOLVERS},
513 {"INVALID_SOLVER_PACKAGE" , INVALID_SOLVER_PACKAGE},
514 };
515
516std::map<SolverPackage, std::string> enum_to_solverpackage_type =
517 build_reverse_map(solverpackage_type_to_enum);
518
519
520std::map<std::string, SubsetSolveMode> subset_solve_mode_to_enum {
521 {"SUBSET_ZERO" , SUBSET_ZERO},
522 {"SUBSET_COPY_RHS" , SUBSET_COPY_RHS},
523 {"SUBSET_DONT_TOUCH" , SUBSET_DONT_TOUCH},
524 };
525
526std::map<SubsetSolveMode, std::string> enum_to_subset_solve_mode =
527 build_reverse_map(subset_solve_mode_to_enum);
528
529
530std::map<std::string, XdrMODE> xdr_mode_to_enum {
531 {"UNKNOWN" , UNKNOWN},
532 {"ENCODE" , ENCODE},
533 {"DECODE" , DECODE},
534 {"WRITE" , WRITE},
535 {"READ" , READ},
536 };
537
538std::map<XdrMODE, std::string> enum_to_xdr_mode =
539 build_reverse_map(xdr_mode_to_enum);
540
541
542std::map<std::string, LinearConvergenceReason> linear_convergence_reason_to_enum {
543 {"CONVERGED_RTOL_NORMAL", CONVERGED_RTOL_NORMAL},
544 {"CONVERGED_ATOL_NORMAL", CONVERGED_ATOL_NORMAL},
545 {"CONVERGED_RTOL", CONVERGED_RTOL},
546 {"CONVERGED_ATOL", CONVERGED_ATOL},
547 {"CONVERGED_ITS", CONVERGED_ITS},
548 {"CONVERGED_CG_NEG_CURVE", CONVERGED_CG_NEG_CURVE},
549 {"CONVERGED_CG_CONSTRAINED", CONVERGED_CG_CONSTRAINED},
550 {"CONVERGED_STEP_LENGTH", CONVERGED_STEP_LENGTH},
551 {"CONVERGED_HAPPY_BREAKDOWN", CONVERGED_HAPPY_BREAKDOWN},
552 {"DIVERGED_NULL", DIVERGED_NULL},
553 {"DIVERGED_ITS", DIVERGED_ITS},
554 {"DIVERGED_DTOL", DIVERGED_DTOL},
555 {"DIVERGED_BREAKDOWN", DIVERGED_BREAKDOWN},
556 {"DIVERGED_BREAKDOWN_BICG", DIVERGED_BREAKDOWN_BICG},
557 {"DIVERGED_NONSYMMETRIC", DIVERGED_NONSYMMETRIC},
558 {"DIVERGED_INDEFINITE_PC", DIVERGED_INDEFINITE_PC},
559 {"DIVERGED_NAN", DIVERGED_NAN},
560 {"DIVERGED_INDEFINITE_MAT", DIVERGED_INDEFINITE_MAT},
561 {"DIVERGED_PCSETUP_FAILED", DIVERGED_PCSETUP_FAILED},
562 {"CONVERGED_ITERATING", CONVERGED_ITERATING},
563 {"UNKNOWN_FLAG", UNKNOWN_FLAG},
564 };
565
566std::map<LinearConvergenceReason, std::string> enum_to_linear_convergence_reason =
567 build_reverse_map(linear_convergence_reason_to_enum);
568
569} // end anonymous namespace
570
571
572
573// ------------------------------------------------------
574// Utility::string_to_enum<> & Utility::enum_to_string<>
575// full specializations
576namespace Utility {
577
578#define INSTANTIATE_STRING_TO_ENUM(ENUM_NAME,VAR_NAME) \
579 template <> \
580 ENUM_NAME string_to_enum<ENUM_NAME> (std::string_view s) \
581 { \
582 std::string upper(s); \
583 std::transform(upper.begin(), upper.end(), upper.begin(), ::toupper); \
584 \
585 if (!VAR_NAME##_to_enum.count(upper)) \
586 { \
587 libmesh_error_msg("No " #ENUM_NAME " named " << s << " found."); \
588 } \
589 \
590 return VAR_NAME##_to_enum[upper]; \
591 } \
592 \
593 template <> \
594 ENUM_NAME string_to_enum<ENUM_NAME> (const std::string & s) \
595 { \
596 return string_to_enum<ENUM_NAME>(std::string_view(s)); \
597 } \
598 \
599 template <> \
600 ENUM_NAME string_to_enum<ENUM_NAME> (const char * s) \
601 { \
602 return string_to_enum<ENUM_NAME>(std::string_view(s)); \
603 } \
604 \
605 template <> \
606 std::string enum_to_string<ENUM_NAME> (const ENUM_NAME e) \
607 { \
608 if (!enum_to_##VAR_NAME .count(e)) \
609 libmesh_error_msg("No " #ENUM_NAME " with enumeration " << e << " found."); \
610 \
611 return enum_to_##VAR_NAME [e]; \
612 }
613
614
615
616INSTANTIATE_STRING_TO_ENUM(ElemType,elem_type)
617INSTANTIATE_STRING_TO_ENUM(ElemMappingType,elem_mapping_type)
618INSTANTIATE_STRING_TO_ENUM(Order,order)
619INSTANTIATE_STRING_TO_ENUM(FEFamily,fefamily)
620INSTANTIATE_STRING_TO_ENUM(InfMapType,inf_map_type)
621INSTANTIATE_STRING_TO_ENUM(QuadratureType,quadrature_type)
622INSTANTIATE_STRING_TO_ENUM(PartitionerType,partitioner_type)
623INSTANTIATE_STRING_TO_ENUM(PreconditionerType,preconditioner_type)
624
625#ifdef LIBMESH_ENABLE_AMR
626INSTANTIATE_STRING_TO_ENUM(Elem::RefinementState,refinementstate_type)
627#endif // LIBMESH_ENABLE_AMR
628
629INSTANTIATE_STRING_TO_ENUM(SolverType,solvertype)
630INSTANTIATE_STRING_TO_ENUM(EigenSolverType,eigensolvertype)
631INSTANTIATE_STRING_TO_ENUM(ElemQuality,elemquality)
632INSTANTIATE_STRING_TO_ENUM(IOPackage,iopackage)
633INSTANTIATE_STRING_TO_ENUM(FEMNormType, norm_type)
634INSTANTIATE_STRING_TO_ENUM(ParallelType, parallel_type)
635INSTANTIATE_STRING_TO_ENUM(PointLocatorType, point_locator_type)
636INSTANTIATE_STRING_TO_ENUM(SolverPackage,solverpackage_type)
637INSTANTIATE_STRING_TO_ENUM(SubsetSolveMode,subset_solve_mode)
638INSTANTIATE_STRING_TO_ENUM(XdrMODE,xdr_mode)
639INSTANTIATE_STRING_TO_ENUM(LinearConvergenceReason, linear_convergence_reason)
640
641#undef INSTANTIATE_STRING_TO_ENUM
642
643} // namespace Utility
644
645} // namespace libMesh
RefinementState
Enumeration of possible element refinement states.
Definition elem.h:1446
@ COARSEN_INACTIVE
Definition elem.h:1452
@ INVALID_REFINEMENTSTATE
Definition elem.h:1453
@ JUST_COARSENED
Definition elem.h:1450
The libMesh namespace provides an interface to certain functionality in the library.
PartitionerType
Defines an enum for mesh partitioner types.
ParallelType
Defines an enum for parallel data structure types.
IOPackage
libMesh interfaces with several different software packages for the purposes of creating,...
ElemType
Defines an enum for geometric element types.
SubsetSolveMode
defines an enum for the question what happens to the dofs outside the given subset when a system is s...
ElemMappingType
Enumeration of possible element master->physical mapping types.
@ RATIONAL_BERNSTEIN_MAP
SolverPackage
Defines an enum for various linear solver packages.
ElemQuality
Defines an enum for element quality metrics.
QuadratureType
Defines an enum for currently available quadrature rules.
PointLocatorType
defines an enum for the types of point locators (given a point with global coordinates,...
@ L2_RAVIART_THOMAS
@ L2_HIERARCHIC_VEC
@ RATIONAL_BERNSTEIN
PreconditionerType
Defines an enum for preconditioner types.
SolverType
Defines an enum for iterative solver types.
EigenSolverType
Defines an enum for iterative eigenproblem solver types.
@ TWENTYSECOND
Definition enum_order.h:64
@ THIRTYFOURTH
Definition enum_order.h:76
@ TWENTYSIXTH
Definition enum_order.h:68
@ SEVENTEENTH
Definition enum_order.h:58
@ FORTYFIRST
Definition enum_order.h:83
@ TWENTYFIRST
Definition enum_order.h:63
@ FORTYSECOND
Definition enum_order.h:84
@ TWENTYEIGHTH
Definition enum_order.h:70
@ THIRTYFIRST
Definition enum_order.h:73
@ THIRTYSECOND
Definition enum_order.h:74
@ SIXTEENTH
Definition enum_order.h:57
@ FORTYTHIRD
Definition enum_order.h:85
@ THIRTYNINTH
Definition enum_order.h:81
@ THIRTYSEVENTH
Definition enum_order.h:79
@ THIRTYSIXTH
Definition enum_order.h:78
@ THIRTYEIGHTH
Definition enum_order.h:80
@ TWENTYSEVENTH
Definition enum_order.h:69
@ TWENTIETH
Definition enum_order.h:62
@ TWENTYNINTH
Definition enum_order.h:71
@ THIRTIETH
Definition enum_order.h:72
@ TWENTYTHIRD
Definition enum_order.h:65
@ TWENTYFIFTH
Definition enum_order.h:67
@ FIFTEENTH
Definition enum_order.h:56
@ FOURTEENTH
Definition enum_order.h:55
@ THIRTYFIFTH
Definition enum_order.h:77
@ EIGHTTEENTH
Definition enum_order.h:59
@ TWENTYFOURTH
Definition enum_order.h:66
@ NINETEENTH
Definition enum_order.h:61
@ THIRTYTHIRD
Definition enum_order.h:75
@ THIRTEENTH
Definition enum_order.h:54
XdrMODE
Defines an enum for read/write mode in Xdr format.
LinearConvergenceReason
Linear solver convergence flags (taken from the PETSc flags).