diff --git a/src/OpenFOAM/fields/Fields/Field/PrecisionAdaptor/PrecisionAdaptor.H b/src/OpenFOAM/fields/Fields/Field/PrecisionAdaptor/PrecisionAdaptor.H index 0c33ed7388..39c9deae2b 100644 --- a/src/OpenFOAM/fields/Fields/Field/PrecisionAdaptor/PrecisionAdaptor.H +++ b/src/OpenFOAM/fields/Fields/Field/PrecisionAdaptor/PrecisionAdaptor.H @@ -36,6 +36,7 @@ Description #ifndef PrecisionAdaptor_H #define PrecisionAdaptor_H +#include "tmpNrc.H" #include "Field.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -44,34 +45,34 @@ namespace Foam { //- A const Field wrapper with possible data conversion -template +template class Container = Field> class ConstPrecisionAdaptor : - public tmp> + public tmpNrc> { // Private Member Functions //- Copy in field - void copyInput(const Field& input) + void copyInput(const Container& input) { this->clear(); - Field* p = new Field(input.size()); + Container* p = new Container(input.size()); this->reset(p); std::copy(input.cbegin(), input.cend(), p->begin()); } //- Construct from tmp Field, copy/move as required - void moveInput(tmp>& input) + void moveInput(tmp>& input) { if (std::is_same::value) { - auto& tinput = reinterpret_cast&>(input); + auto& tinput = reinterpret_cast>&>(input); if (tinput.isTmp()) { - this->clear(); - this->swap(tinput); + // Reset to tmp + this->reset(tinput.ptr()); } else { @@ -89,15 +90,15 @@ class ConstPrecisionAdaptor public: //- The adapted field type - typedef Field FieldType; + typedef Container FieldType; // Constructors - //- Construct from Field, copying on input as required - ConstPrecisionAdaptor(const Field& input) + //- Construct from Container, copying on input as required + ConstPrecisionAdaptor(const Container& input) : - tmp>() + tmpNrc>() { if (std::is_same::value) { @@ -110,31 +111,31 @@ public: } - //- Construct from tmp Field, copy/move as required - ConstPrecisionAdaptor(tmp>&& input) + //- Construct from tmp Container, copy/move as required + ConstPrecisionAdaptor(tmp>&& input) : - tmp>() + tmpNrc>() { this->moveInput(input); } - //- Construct from tmp Field, copy/move as required - ConstPrecisionAdaptor(const tmp>& input) + //- Construct from tmp Container, copy/move as required + ConstPrecisionAdaptor(const tmp>& input) : - tmp>() + tmpNrc>() { - this->moveInput(const_cast>&>(input)); + this->moveInput(const_cast>&>(input)); } // Member Functions //- Return the field - static const Field& get + static const Container& get ( - const Field& input, - Field& dst + const Container& input, + Container& dst ) { if (std::is_same::value) @@ -152,25 +153,23 @@ public: //- A Field wrapper with possible data conversion -template +template class Container = Field> class PrecisionAdaptor : - public tmp> + public tmpNrc> { // Private Data //- Reference to underlying field - Field& ref_; + Container& ref_; // Private Member Functions //- Copy in field - void copyInput(const Field& input) + void copyInput(const Container& input) { - this->clear(); - - Field* p = new Field(input.size()); + Container* p = new Container(input.size()); this->reset(p); std::copy(input.cbegin(), input.cend(), p->begin()); } @@ -179,15 +178,15 @@ class PrecisionAdaptor public: //- The adapted field type - typedef Field FieldType; + typedef Container FieldType; // Constructors - //- Construct from Field, copying on input as required - PrecisionAdaptor(Field& input) + //- Construct from Container, copying on input as required + PrecisionAdaptor(Container& input) : - tmp>(), + tmpNrc>(), ref_(input) { if (std::is_same::value) diff --git a/src/OpenFOAM/memory/tmp/tmpNrc.H b/src/OpenFOAM/memory/tmp/tmpNrc.H index d5a3b7b6f7..7617af3712 100644 --- a/src/OpenFOAM/memory/tmp/tmpNrc.H +++ b/src/OpenFOAM/memory/tmp/tmpNrc.H @@ -42,6 +42,7 @@ See also #include "refCount.H" #include "word.H" +#include "tmp.H" #include // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -229,6 +230,9 @@ public: //- Transfer ownership of the managed pointer. // Fatal for a null managed pointer or if the object is const. inline void operator=(const tmpNrc& t); + + //- Conversion to tmp + inline operator tmp(); }; diff --git a/src/OpenFOAM/memory/tmp/tmpNrcI.H b/src/OpenFOAM/memory/tmp/tmpNrcI.H index 4f8148b039..1e3a7136d7 100644 --- a/src/OpenFOAM/memory/tmp/tmpNrcI.H +++ b/src/OpenFOAM/memory/tmp/tmpNrcI.H @@ -427,4 +427,18 @@ inline void Foam::tmpNrc::operator=(const tmpNrc& t) } +template +inline Foam::tmpNrc::operator tmp() +{ + if (isTmp()) + { + return tmp(ptr()); + } + else + { + return tmp(cref()); + } +} + + // ************************************************************************* // diff --git a/src/parallel/decompose/metisDecomp/metisDecomp.C b/src/parallel/decompose/metisDecomp/metisDecomp.C index 4ae0306956..dc3b24eb50 100644 --- a/src/parallel/decompose/metisDecomp/metisDecomp.C +++ b/src/parallel/decompose/metisDecomp/metisDecomp.C @@ -28,6 +28,7 @@ License #include "metisDecomp.H" #include "addToRunTimeSelectionTable.H" #include "Time.H" +#include "PrecisionAdaptor.H" // Probably not needed... #define MPICH_SKIP_MPICXX @@ -39,13 +40,13 @@ License // // Metis has an 'idx_t' type, but the IDXTYPEWIDTH define is perhaps // more future-proof? -#ifdef IDXTYPEWIDTH -static_assert -( - sizeof(Foam::label) == (IDXTYPEWIDTH/8), - "sizeof(Foam::label) == (IDXTYPEWIDTH/8), check your metis headers" -); -#endif +//#ifdef IDXTYPEWIDTH +//static_assert +//( +// sizeof(Foam::label) == (IDXTYPEWIDTH/8), +// "sizeof(Foam::label) == (IDXTYPEWIDTH/8), check your metis headers" +//); +//#endif // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -86,10 +87,10 @@ Foam::label Foam::metisDecomp::decomposeSerial const dictionary* coeffsDictPtr = decompDict_.findDict("metisCoeffs"); - label numCells = xadj.size()-1; + idx_t numCells = xadj.size()-1; // Decomposition options - List