libMesh
string_to_enum.C
Go to the documentation of this file.
1 // The libMesh Finite Element Library.
2 // Copyright (C) 2002-2025 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  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 
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  {"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 
152 std::map<ElemType, std::string> enum_to_elem_type =
153  build_reverse_map(elem_type_to_enum);
154 
155 
156 std::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 
162 std::map<ElemMappingType, std::string> enum_to_elem_mapping_type =
163  build_reverse_map(elem_mapping_type_to_enum);
164 
165 
166 std::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 
218 std::map<Order, std::string> enum_to_order =
219  build_reverse_map(order_to_enum);
220 
221 
222 std::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 
251 std::map<FEFamily, std::string> enum_to_fefamily =
252  build_reverse_map(fefamily_to_enum);
253 
254 
255 std::map<std::string, InfMapType> inf_map_type_to_enum {
256  {"CARTESIAN" , CARTESIAN},
257  {"SPHERICAL" , SPHERICAL},
258  {"ELLIPSOIDAL", ELLIPSOIDAL}
259  };
260 
261 std::map<InfMapType, std::string> enum_to_inf_map_type =
262  build_reverse_map(inf_map_type_to_enum);
263 
264 
265 std::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 
281 std::map<QuadratureType, std::string> enum_to_quadrature_type =
282  build_reverse_map(quadrature_type_to_enum);
283 
284 
285 std::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 
308 std::map<PartitionerType, std::string> enum_to_partitioner_type =
309  build_reverse_map(partitioner_type_to_enum);
310 
311 
312 std::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 
349 std::map<PreconditionerType, std::string> enum_to_preconditioner_type =
350  build_reverse_map(preconditioner_type_to_enum);
351 
352 
353 #ifdef LIBMESH_ENABLE_AMR
354 std::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 
365 std::map<Elem::RefinementState, std::string> enum_to_refinementstate_type =
366  build_reverse_map(refinementstate_type_to_enum);
367 #endif // LIBMESH_ENABLE_AMR
368 
369 
370 std::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 
380 std::map<EigenSolverType, std::string> enum_to_eigensolvertype =
381  build_reverse_map(eigensolvertype_to_enum);
382 
383 
384 std::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 
407 std::map<SolverType, std::string> enum_to_solvertype =
408  build_reverse_map(solvertype_to_enum);
409 
410 
411 std::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 
433 std::map<ElemQuality, std::string> enum_to_elemquality =
434  build_reverse_map(elemquality_to_enum);
435 
436 
437 std::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 
448 std::map<IOPackage, std::string> enum_to_iopackage =
449  build_reverse_map(iopackage_to_enum);
450 
451 
452 std::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 
481 std::map<FEMNormType, std::string> enum_to_norm_type =
482  build_reverse_map(norm_type_to_enum);
483 
484 
485 std::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 
493 std::map<ParallelType, std::string> enum_to_parallel_type =
494  build_reverse_map(parallel_type_to_enum);
495 
496 
497 std::map<std::string, PointLocatorType> point_locator_type_to_enum {
498  {"TREE" , TREE},
499  {"INVALID_LOCATOR" , INVALID_LOCATOR},
500  };
501 
502 std::map<PointLocatorType, std::string> enum_to_point_locator_type =
503  build_reverse_map(point_locator_type_to_enum);
504 
505 
506 std::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 
516 std::map<SolverPackage, std::string> enum_to_solverpackage_type =
517  build_reverse_map(solverpackage_type_to_enum);
518 
519 
520 std::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 
526 std::map<SubsetSolveMode, std::string> enum_to_subset_solve_mode =
527  build_reverse_map(subset_solve_mode_to_enum);
528 
529 
530 std::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 
538 std::map<XdrMODE, std::string> enum_to_xdr_mode =
539  build_reverse_map(xdr_mode_to_enum);
540 
541 
542 std::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 
566 std::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
576 namespace 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 
616 INSTANTIATE_STRING_TO_ENUM(ElemType,elem_type)
617 INSTANTIATE_STRING_TO_ENUM(ElemMappingType,elem_mapping_type)
618 INSTANTIATE_STRING_TO_ENUM(Order,order)
619 INSTANTIATE_STRING_TO_ENUM(FEFamily,fefamily)
620 INSTANTIATE_STRING_TO_ENUM(InfMapType,inf_map_type)
621 INSTANTIATE_STRING_TO_ENUM(QuadratureType,quadrature_type)
622 INSTANTIATE_STRING_TO_ENUM(PartitionerType,partitioner_type)
623 INSTANTIATE_STRING_TO_ENUM(PreconditionerType,preconditioner_type)
624 
625 #ifdef LIBMESH_ENABLE_AMR
626 INSTANTIATE_STRING_TO_ENUM(Elem::RefinementState,refinementstate_type)
627 #endif // LIBMESH_ENABLE_AMR
628 
629 INSTANTIATE_STRING_TO_ENUM(SolverType,solvertype)
630 INSTANTIATE_STRING_TO_ENUM(EigenSolverType,eigensolvertype)
631 INSTANTIATE_STRING_TO_ENUM(ElemQuality,elemquality)
632 INSTANTIATE_STRING_TO_ENUM(IOPackage,iopackage)
633 INSTANTIATE_STRING_TO_ENUM(FEMNormType, norm_type)
634 INSTANTIATE_STRING_TO_ENUM(ParallelType, parallel_type)
635 INSTANTIATE_STRING_TO_ENUM(PointLocatorType, point_locator_type)
636 INSTANTIATE_STRING_TO_ENUM(SolverPackage,solverpackage_type)
637 INSTANTIATE_STRING_TO_ENUM(SubsetSolveMode,subset_solve_mode)
638 INSTANTIATE_STRING_TO_ENUM(XdrMODE,xdr_mode)
639 INSTANTIATE_STRING_TO_ENUM(LinearConvergenceReason, linear_convergence_reason)
640 
641 #undef INSTANTIATE_STRING_TO_ENUM
642 
643 } // namespace Utility
644 
645 } // 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:1452
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.