diff --git a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricBoundaryField.C b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricBoundaryField.C index 2cf2da25fd13ffaaa81aa52e19c7cfd786c840ae..90870379b30227bc041b596668e69f6e011e2925 100644 --- a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricBoundaryField.C +++ b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricBoundaryField.C @@ -6,7 +6,7 @@ \\/ M anipulation | ------------------------------------------------------------------------------- Copyright (C) 2011-2017 OpenFOAM Foundation - Copyright (C) 2016-2018 OpenCFD Ltd. + Copyright (C) 2016-2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -32,8 +32,7 @@ License #include "cyclicPolyPatch.H" template<class Type, template<class> class PatchField, class GeoMesh> -void Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary:: -readField +void Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary::readField ( const DimensionedField<Type, GeoMesh>& field, const dictionary& dict @@ -182,8 +181,7 @@ readField // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // template<class Type, template<class> class PatchField, class GeoMesh> -Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary:: -Boundary +Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary::Boundary ( const BoundaryMesh& bmesh ) @@ -194,8 +192,7 @@ Boundary template<class Type, template<class> class PatchField, class GeoMesh> -Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary:: -Boundary +Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary::Boundary ( const BoundaryMesh& bmesh, const DimensionedField<Type, GeoMesh>& field, @@ -224,8 +221,7 @@ Boundary template<class Type, template<class> class PatchField, class GeoMesh> -Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary:: -Boundary +Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary::Boundary ( const BoundaryMesh& bmesh, const DimensionedField<Type, GeoMesh>& field, @@ -289,8 +285,7 @@ Boundary template<class Type, template<class> class PatchField, class GeoMesh> -Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary:: -Boundary +Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary::Boundary ( const BoundaryMesh& bmesh, const DimensionedField<Type, GeoMesh>& field, @@ -310,12 +305,10 @@ Boundary template<class Type, template<class> class PatchField, class GeoMesh> -Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary:: -Boundary +Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary::Boundary ( const DimensionedField<Type, GeoMesh>& field, - const typename GeometricField<Type, PatchField, GeoMesh>:: - Boundary& btf + const typename GeometricField<Type, PatchField, GeoMesh>::Boundary& btf ) : FieldField<PatchField, Type>(btf.size()), @@ -331,11 +324,47 @@ Boundary template<class Type, template<class> class PatchField, class GeoMesh> -Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary:: -Boundary +Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary::Boundary ( - const typename GeometricField<Type, PatchField, GeoMesh>:: - Boundary& btf + const DimensionedField<Type, GeoMesh>& field, + const typename GeometricField<Type, PatchField, GeoMesh>::Boundary& btf, + const labelList& patchIDs, + const word& patchFieldType +) +: + FieldField<PatchField, Type>(btf.size()), + bmesh_(btf.bmesh_) +{ + DebugInFunction << nl; + + for (const label patchi : patchIDs) + { + this->set + ( + patchi, + PatchField<Type>::New + ( + patchFieldType, + bmesh_[patchi], + field + ) + ); + } + + forAll(bmesh_, patchi) + { + if (!this->set(patchi)) + { + this->set(patchi, btf[patchi].clone(field)); + } + } +} + + +template<class Type, template<class> class PatchField, class GeoMesh> +Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary::Boundary +( + const typename GeometricField<Type, PatchField, GeoMesh>::Boundary& btf ) : FieldField<PatchField, Type>(btf), @@ -346,8 +375,7 @@ Boundary template<class Type, template<class> class PatchField, class GeoMesh> -Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary:: -Boundary +Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary::Boundary ( const BoundaryMesh& bmesh, const DimensionedField<Type, GeoMesh>& field, @@ -364,8 +392,7 @@ Boundary // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // template<class Type, template<class> class PatchField, class GeoMesh> -void Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary:: -updateCoeffs() +void Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary::updateCoeffs() { DebugInFunction << nl; @@ -377,8 +404,7 @@ updateCoeffs() template<class Type, template<class> class PatchField, class GeoMesh> -void Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary:: -evaluate() +void Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary::evaluate() { DebugInFunction << nl; @@ -441,8 +467,7 @@ evaluate() template<class Type, template<class> class PatchField, class GeoMesh> Foam::wordList -Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary:: -types() const +Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary::types() const { const FieldField<PatchField, Type>& pff = *this; @@ -477,8 +502,7 @@ boundaryInternalField() const template<class Type, template<class> class PatchField, class GeoMesh> Foam::LduInterfaceFieldPtrsList<Type> -Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary:: -interfaces() const +Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary::interfaces() const { LduInterfaceFieldPtrsList<Type> interfaces(this->size()); @@ -528,8 +552,11 @@ scalarInterfaces() const template<class Type, template<class> class PatchField, class GeoMesh> -void Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary:: -writeEntry(const word& keyword, Ostream& os) const +void Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary::writeEntry +( + const word& keyword, + Ostream& os +) const { os.beginBlock(keyword); this->writeEntries(os); @@ -540,8 +567,10 @@ writeEntry(const word& keyword, Ostream& os) const template<class Type, template<class> class PatchField, class GeoMesh> -void Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary:: -writeEntries(Ostream& os) const +void Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary::writeEntries +( + Ostream& os +) const { forAll(*this, patchi) { @@ -555,8 +584,7 @@ writeEntries(Ostream& os) const // * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // template<class Type, template<class> class PatchField, class GeoMesh> -void Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary:: -operator= +void Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary::operator= ( const typename GeometricField<Type, PatchField, GeoMesh>:: Boundary& bf @@ -567,8 +595,7 @@ operator= template<class Type, template<class> class PatchField, class GeoMesh> -void Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary:: -operator= +void Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary::operator= ( const FieldField<PatchField, Type>& ptff ) @@ -578,8 +605,7 @@ operator= template<class Type, template<class> class PatchField, class GeoMesh> -void Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary:: -operator= +void Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary::operator= ( const Type& t ) @@ -589,8 +615,7 @@ operator= template<class Type, template<class> class PatchField, class GeoMesh> -void Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary:: -operator== +void Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary::operator== ( const typename GeometricField<Type, PatchField, GeoMesh>:: Boundary& bf @@ -604,8 +629,7 @@ operator== template<class Type, template<class> class PatchField, class GeoMesh> -void Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary:: -operator== +void Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary::operator== ( const FieldField<PatchField, Type>& ptff ) @@ -618,8 +642,7 @@ operator== template<class Type, template<class> class PatchField, class GeoMesh> -void Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary:: -operator== +void Foam::GeometricField<Type, PatchField, GeoMesh>::Boundary::operator== ( const Type& t ) diff --git a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.C b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.C index 05a695ab7e971981fd25dfbf66da39582cd0d8f8..e6282a24d9744b2ca03852a75f3ec3dc2d787bc6 100644 --- a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.C +++ b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.C @@ -660,6 +660,37 @@ Foam::GeometricField<Type, PatchField, GeoMesh>::GeometricField } +template<class Type, template<class> class PatchField, class GeoMesh> +Foam::GeometricField<Type, PatchField, GeoMesh>::GeometricField +( + const IOobject& io, + const GeometricField<Type, PatchField, GeoMesh>& gf, + const labelList& patchIDs, + const word& patchFieldType +) +: + Internal(io, gf), + timeIndex_(gf.timeIndex()), + field0Ptr_(nullptr), + fieldPrevIterPtr_(nullptr), + boundaryField_(*this, gf.boundaryField_, patchIDs, patchFieldType) +{ + DebugInFunction + << "Copy construct, resetting IO params and setting patchFieldType " + << "for patchIDs" << nl + << this->info() << endl; + + if (!readIfPresent() && gf.field0Ptr_) + { + field0Ptr_ = new GeometricField<Type, PatchField, GeoMesh> + ( + io.name() + "_0", + *gf.field0Ptr_ + ); + } +} + + template<class Type, template<class> class PatchField, class GeoMesh> Foam::GeometricField<Type, PatchField, GeoMesh>::GeometricField ( diff --git a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.H b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.H index bcba5d4a25dde26b77e7f3f715c8f4806de9c72c..320c31939080fdffe3d69bbb18469a698ca3675a 100644 --- a/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.H +++ b/src/OpenFOAM/fields/GeometricFields/GeometricField/GeometricField.H @@ -100,15 +100,15 @@ public: //- Type of mesh on which this GeometricField is instantiated typedef typename GeoMesh::Mesh Mesh; - //- Type of boundary mesh on which this - // GeometricField::Boundary is instantiated + //- Type of boundary mesh on which this GeometricField::Boundary is + //- instantiated typedef typename GeoMesh::BoundaryMesh BoundaryMesh; //- Type of the internal field from which this GeometricField is derived typedef DimensionedField<Type, GeoMesh> Internal; - //- Type of the patch field of which the - // GeometricField::Boundary is composed + //- Type of the patch field of which the GeometricField::Boundary is + //- composed typedef PatchField<Type> Patch; @@ -129,9 +129,8 @@ public: //- Construct from a BoundaryMesh Boundary(const BoundaryMesh& bmesh); - //- Construct from a BoundaryMesh, - // reference to the internal field - // and a patch type + //- Construct from a BoundaryMesh, reference to the internal field + //- and a patch type Boundary ( const BoundaryMesh& bmesh, @@ -139,10 +138,9 @@ public: const word& patchFieldType ); - //- Construct from a BoundaryMesh, - // reference to the internal field - // and a wordList of patch types and optional the actual patch - // types (to override constraint patches) + //- Construct from a BoundaryMesh, reference to the internal field + //- and a wordList of patch types and optional the actual patch + //- types (to override constraint patches) Boundary ( const BoundaryMesh& bmesh, @@ -151,9 +149,8 @@ public: const wordList& actualPatchTypes = wordList() ); - //- Construct from a BoundaryMesh, - // reference to the internal field - // and a PtrList<PatchField<Type>> + //- Construct from a BoundaryMesh, reference to the internal field + //- and a PtrList<PatchField<Type>> Boundary ( const BoundaryMesh& bmesh, @@ -168,6 +165,16 @@ public: const Boundary& btf ); + //- Construct as copy setting the reference to the internal field + //- and resetting type of field for given patch IDs + Boundary + ( + const Internal& field, + const Boundary& btf, + const labelList& patchIDs, + const word& patchFieldName + ); + //- Construct as copy // Dangerous because Field may be set to a field which gets deleted // Need new type of BoundaryField, one which is part of a geometric @@ -206,15 +213,15 @@ public: wordList types() const; //- Return BoundaryField of the cell values neighbouring - // the boundary + //- the boundary Boundary boundaryInternalField() const; //- Return a list of pointers for each patch field with only those - // pointing to interfaces being set + //- pointing to interfaces being set LduInterfaceFieldPtrsList<Type> interfaces() const; //- Return a list of pointers for each patch field with only those - // pointing to interfaces being set + //- pointing to interfaces being set lduInterfaceFieldPtrsList scalarInterfaces() const; //- Write boundary field as dictionary entry @@ -259,7 +266,7 @@ private: //- Pointer to old time field mutable GeometricField<Type, PatchField, GeoMesh>* field0Ptr_; - //- Pointer to previous iteration (used for under-relaxation) + //- Pointer to previous iteration (used for under-relaxation) mutable GeometricField<Type, PatchField, GeoMesh>* fieldPrevIterPtr_; //- Boundary Type field containing boundary field values @@ -441,6 +448,16 @@ public: const word& patchFieldType ); + //- Construct as copy resetting IO parameters and boundary type + //- for selected patchIDs + GeometricField + ( + const IOobject& io, + const GeometricField<Type, PatchField, GeoMesh>& gf, + const labelList& patchIDs, + const word& patchFieldType + ); + //- Construct as copy resetting IO parameters and boundary types GeometricField (