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