Loading...
Searching...
No Matches
extendedFaceToCellStencilTemplates.C
Go to the documentation of this file.
1/*---------------------------------------------------------------------------*\
2 ========= |
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4 \\ / O peration |
5 \\ / A nd | www.openfoam.com
6 \\/ M anipulation |
7-------------------------------------------------------------------------------
8 Copyright (C) 2011-2016 OpenFOAM Foundation
9-------------------------------------------------------------------------------
10License
11 This file is part of OpenFOAM.
12
13 OpenFOAM is free software: you can redistribute it and/or modify it
14 under the terms of the GNU General Public License as published by
15 the Free Software Foundation, either version 3 of the License, or
16 (at your option) any later version.
17
18 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
19 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
21 for more details.
22
23 You should have received a copy of the GNU General Public License
24 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
25
26\*---------------------------------------------------------------------------*/
27
29
30// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
31
32template<class Type>
34(
35 const mapDistribute& map,
36 const labelListList& stencil,
38 List<List<Type>>& stencilFld
39)
40{
41 // 1. Construct face data in compact addressing
42 List<Type> flatFld(map.constructSize(), Zero);
43
44 // Insert my internal values
45 forAll(fld, celli)
46 {
47 flatFld[celli] = fld[celli];
48 }
49 // Insert my boundary values
50 forAll(fld.boundaryField(), patchi)
51 {
52 const fvsPatchField<Type>& pfld = fld.boundaryField()[patchi];
53
54 label nCompact = pfld.patch().start();
55
56 forAll(pfld, i)
57 {
58 flatFld[nCompact++] = pfld[i];
59 }
60 }
61
62 // Do all swapping
63 map.distribute(flatFld);
64
65 // 2. Pull to stencil
66 stencilFld.setSize(stencil.size());
67
68 forAll(stencil, facei)
69 {
70 const labelList& compactCells = stencil[facei];
71
72 stencilFld[facei].setSize(compactCells.size());
73
74 forAll(compactCells, i)
75 {
76 stencilFld[facei][i] = flatFld[compactCells[i]];
77 }
78 }
79}
80
81
82template<class Type>
83Foam::tmp<Foam::GeometricField<Type, Foam::fvPatchField, Foam::volMesh>>
85(
86 const mapDistribute& map,
87 const labelListList& stencil,
89 const List<List<scalar>>& stencilWeights
90)
91{
92 const fvMesh& mesh = fld.mesh();
93
94 // Collect internal and boundary values
95 List<List<Type>> stencilFld;
96 collectData(map, stencil, fld, stencilFld);
97
99 (
101 (
103 (
104 fld.name(),
105 mesh.time().timeName(),
106 mesh
107 ),
108 mesh,
109 dimensioned<Type>(fld.dimensions(), Zero)
110 )
111 );
113
114 // cells
115 forAll(sf, celli)
116 {
117 const List<Type>& stField = stencilFld[celli];
118 const List<scalar>& stWeight = stencilWeights[celli];
119
120 forAll(stField, i)
121 {
122 sf[celli] += stField[i]*stWeight[i];
123 }
124 }
125
126 // Boundaries values?
127
128 return tsfCorr;
129}
130
131
132// ************************************************************************* //
Info<< nl;Info<< "Write faMesh in vtk format:"<< nl;{ vtk::uindirectPatchWriter writer(aMesh.patch(), fileName(aMesh.time().globalPath()/vtkBaseFileName));writer.writeGeometry();globalIndex procAddr(aMesh.nFaces());labelList cellIDs;if(UPstream::master()) { cellIDs.resize(procAddr.totalSize());for(const labelRange &range :procAddr.ranges()) { auto slice=cellIDs.slice(range);slice=identity(range);} } writer.beginCellData(4);writer.writeProcIDs();writer.write("cellID", cellIDs);writer.write("area", aMesh.S().field());writer.write("normal", aMesh.faceAreaNormals());writer.beginPointData(1);writer.write("normal", aMesh.pointAreaNormals());Info<< " "<< writer.output().name()<< nl;}{ vtk::lineWriter writer(aMesh.points(), aMesh.edges(), fileName(aMesh.time().globalPath()/(vtkBaseFileName+"-edges")));writer.writeGeometry();writer.beginCellData(4);writer.writeProcIDs();{ Field< scalar > fld(faMeshTools::flattenEdgeField(aMesh.magLe(), true))
Generic GeometricField class.
Internal & ref(const bool updateAccessTime=true)
Same as internalFieldRef().
Defines the attributes of an object for which implicit objectRegistry management is supported,...
Definition IOobject.H:191
A 1D array of objects of type <T>, where the size of the vector is known and used for subscript bound...
Definition List.H:72
void setSize(label n)
Alias for resize().
Definition List.H:536
static word timeName(const scalar t, const int precision=precision_)
Return a time name for the given scalar time value formatted with the given precision.
Definition Time.C:714
void size(const label n)
Older name for setAddressableSize.
Definition UList.H:118
Generic dimensioned Type class.
static void collectData(const mapDistribute &map, const labelListList &stencil, const GeometricField< T, fvsPatchField, surfaceMesh > &fld, List< List< T > > &stencilFld)
Use map to get the data into stencil order.
static tmp< GeometricField< Type, fvPatchField, volMesh > > weightedSum(const mapDistribute &map, const labelListList &stencil, const GeometricField< Type, fvsPatchField, surfaceMesh > &fld, const List< List< scalar > > &stencilWeights)
Sum surface field contributions to create cell values.
Mesh data needed to do the Finite Volume discretisation.
Definition fvMesh.H:85
const Time & time() const
Return the top-level database.
Definition fvMesh.H:360
label start() const noexcept
The patch start within the polyMesh face list.
Definition fvPatch.H:226
const fvPatch & patch() const noexcept
Return the patch.
An abstract base class with a fat-interface to all derived classes covering all possible ways in whic...
label constructSize() const noexcept
Constructed data size.
Class containing processor-to-processor mapping information.
void distribute(List< T > &fld, const bool dummyTransform=true, const int tag=UPstream::msgType()) const
Distribute List data using default commsType, default flip/negate operator.
A class for managing temporary objects.
Definition tmp.H:75
T & ref() const
Return non-const reference to the contents of a non-null managed pointer.
Definition tmpI.H:235
dynamicFvMesh & mesh
List< labelList > labelListList
List of labelList.
Definition labelList.H:38
List< label > labelList
A List of labels.
Definition List.H:62
static constexpr const zero Zero
Global zero (0).
Definition zero.H:127
#define forAll(list, i)
Loop across all elements in list.
Definition stdFoam.H:299