From 8752120ad55552510c48416f53531d6a1b7135dd Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@esi-group.com>
Date: Mon, 12 Nov 2018 16:39:55 +0100
Subject: [PATCH] COMP: use hard-coded values for fieldTypes (issue #1068)

- this seems to be the only reliable means of obtaining the values.

  Using typeName_() yields the wrong value.

  Using the typeName causes initialization issues
  (segfault when executing on some systems).
---
 applications/test/fieldTypes/Make/files       |  3 +
 applications/test/fieldTypes/Make/options     |  9 +++
 .../test/fieldTypes/Test-fieldTypes.C         | 63 +++++++++++++++++++
 src/OpenFOAM/fields/Fields/fieldTypes.C       | 20 +++---
 .../GeometricFields/pointFields/pointFields.C | 12 ++--
 src/finiteArea/fields/areaFields/areaFields.C | 12 ++--
 src/finiteVolume/fields/volFields/volFields.C | 22 ++++---
 7 files changed, 109 insertions(+), 32 deletions(-)
 create mode 100644 applications/test/fieldTypes/Make/files
 create mode 100644 applications/test/fieldTypes/Make/options
 create mode 100644 applications/test/fieldTypes/Test-fieldTypes.C

diff --git a/applications/test/fieldTypes/Make/files b/applications/test/fieldTypes/Make/files
new file mode 100644
index 00000000000..03262d28e46
--- /dev/null
+++ b/applications/test/fieldTypes/Make/files
@@ -0,0 +1,3 @@
+Test-fieldTypes.C
+
+EXE = $(FOAM_USER_APPBIN)/Test-fieldTypes
diff --git a/applications/test/fieldTypes/Make/options b/applications/test/fieldTypes/Make/options
new file mode 100644
index 00000000000..3a7088aeeac
--- /dev/null
+++ b/applications/test/fieldTypes/Make/options
@@ -0,0 +1,9 @@
+EXE_INC = \
+    -I$(LIB_SRC)/finiteArea/lnInclude \
+    -I${LIB_SRC}/finiteVolume/lnInclude \
+    -I${LIB_SRC}/meshTools/lnInclude \
+
+EXE_LIBS = \
+    -lfiniteArea \
+    -lfiniteVolume \
+    -lmeshTools
diff --git a/applications/test/fieldTypes/Test-fieldTypes.C b/applications/test/fieldTypes/Test-fieldTypes.C
new file mode 100644
index 00000000000..f46f936c567
--- /dev/null
+++ b/applications/test/fieldTypes/Test-fieldTypes.C
@@ -0,0 +1,63 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2018 OpenCFD Ltd.
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Application
+    Test-fieldTypes
+
+Description
+    Print fieldTypes
+
+\*---------------------------------------------------------------------------*/
+
+#include "fvCFD.H"
+#include "argList.H"
+#include "IOobject.H"
+#include "IOstreams.H"
+
+#include "areaFields.H"
+#include "fieldTypes.H"
+#include "pointFields.H"
+#include "volFields.H"
+
+using namespace Foam;
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+// Main program:
+
+int main(int argc, char *argv[])
+{
+    argList::noParallel();
+
+    Info<< "basic:    " << flatOutput(fieldTypes::basic) << nl
+        << "area:     " << flatOutput(fieldTypes::area) << nl
+        << "volume:   " << flatOutput(fieldTypes::volume) << nl
+        << "internal: " << flatOutput(fieldTypes::internal) << nl
+        << "point:    " << flatOutput(fieldTypes::point) << nl
+        << endl;
+
+    Info<< "\nEnd\n" << endl;
+    return 0;
+}
+
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/fields/Fields/fieldTypes.C b/src/OpenFOAM/fields/Fields/fieldTypes.C
index 9c1a8a55469..207aff1af08 100644
--- a/src/OpenFOAM/fields/Fields/fieldTypes.C
+++ b/src/OpenFOAM/fields/Fields/fieldTypes.C
@@ -24,23 +24,19 @@ License
 \*---------------------------------------------------------------------------*/
 
 #include "fieldTypes.H"
-#include "labelIOField.H"
-#include "scalarIOField.H"
-#include "vectorIOField.H"
-#include "sphericalTensorIOField.H"
-#include "symmTensorIOField.H"
-#include "tensorIOField.H"
 
 // * * * * * * * * * * * * * * * * Global Data * * * * * * * * * * * * * * * //
 
+// Note hard-coded values are more reliable than other alternatives
+
 const Foam::wordList Foam::fieldTypes::basic
 ({
-    Foam::labelIOField::typeName_(),
-    Foam::scalarIOField::typeName_(),
-    Foam::vectorIOField::typeName_(),
-    Foam::sphericalTensorIOField::typeName_(),
-    Foam::symmTensorIOField::typeName_(),
-    Foam::tensorIOField::typeName_()
+    "labelField",               //< labelIOField
+    "scalarField",              //< scalarIOField
+    "vectorField",              //< vectorOField
+    "sphericalTensorField",     //< sphericalTensorIOField
+    "symmTensorField",          //< symmTensorIOField
+    "tensorField"               //< tensorIOField
 });
 
 
diff --git a/src/OpenFOAM/fields/GeometricFields/pointFields/pointFields.C b/src/OpenFOAM/fields/GeometricFields/pointFields/pointFields.C
index c115a066fc2..16e0dabef5b 100644
--- a/src/OpenFOAM/fields/GeometricFields/pointFields/pointFields.C
+++ b/src/OpenFOAM/fields/GeometricFields/pointFields/pointFields.C
@@ -56,13 +56,15 @@ namespace Foam
 
 // * * * * * * * * * * * * * * * * Global Data * * * * * * * * * * * * * * * //
 
+// Note hard-coded values are more reliable than other alternatives
+
 const Foam::wordList Foam::fieldTypes::point
 ({
-    Foam::pointScalarField::typeName_(),
-    Foam::pointVectorField::typeName_(),
-    Foam::pointSphericalTensorField::typeName_(),
-    Foam::pointSymmTensorField::typeName_(),
-    Foam::pointTensorField::typeName_()
+    "pointScalarField",
+    "pointVectorField",
+    "pointSphericalTensorField",
+    "pointSymmTensorField",
+    "pointTensorField"
 });
 
 
diff --git a/src/finiteArea/fields/areaFields/areaFields.C b/src/finiteArea/fields/areaFields/areaFields.C
index 2090d7bb461..4f4705c2d29 100644
--- a/src/finiteArea/fields/areaFields/areaFields.C
+++ b/src/finiteArea/fields/areaFields/areaFields.C
@@ -79,13 +79,15 @@ void GeometricField<scalar, faPatchField, areaMesh>::replace
 
 // * * * * * * * * * * * * * * * * Global Data * * * * * * * * * * * * * * * //
 
+// Note hard-coded values are more reliable than other alternatives
+
 const Foam::wordList Foam::fieldTypes::area
 ({
-    Foam::areaScalarField::typeName_(),
-    Foam::areaVectorField::typeName_(),
-    Foam::areaSphericalTensorField::typeName_(),
-    Foam::areaSymmTensorField::typeName_(),
-    Foam::areaTensorField::typeName_()
+    "areaScalarField",
+    "areaVectorField",
+    "areaSphericalTensorField",
+    "areaSymmTensorField",
+    "areaTensorField"
 });
 
 
diff --git a/src/finiteVolume/fields/volFields/volFields.C b/src/finiteVolume/fields/volFields/volFields.C
index 30b1de4c45c..3ee98c4de7a 100644
--- a/src/finiteVolume/fields/volFields/volFields.C
+++ b/src/finiteVolume/fields/volFields/volFields.C
@@ -85,23 +85,25 @@ void GeometricField<scalar, fvPatchField, volMesh>::replace
 
 // * * * * * * * * * * * * * * * * Global Data * * * * * * * * * * * * * * * //
 
+// Note hard-coded values are more reliable than other alternatives
+
 const Foam::wordList Foam::fieldTypes::internal
 ({
-    Foam::volScalarField::Internal::typeName_(),
-    Foam::volVectorField::Internal::typeName_(),
-    Foam::volSphericalTensorField::Internal::typeName_(),
-    Foam::volSymmTensorField::Internal::typeName_(),
-    Foam::volTensorField::Internal::typeName_()
+    "volScalarField::Internal",
+    "volVectorField::Internal",
+    "volSphericalTensorField::Internal",
+    "volSymmTensorField::Internal",
+    "volTensorField::Internal"
 });
 
 
 const Foam::wordList Foam::fieldTypes::volume
 ({
-    Foam::volScalarField::typeName_(),
-    Foam::volVectorField::typeName_(),
-    Foam::volSphericalTensorField::typeName_(),
-    Foam::volSymmTensorField::typeName_(),
-    Foam::volTensorField::typeName_()
+    "volScalarField",
+    "volVectorField",
+    "volSphericalTensorField",
+    "volSymmTensorField",
+    "volTensorField"
 });
 
 
-- 
GitLab