fvcSurfaceIntegrate.C
Go to the documentation of this file.
1 /*---------------------------------------------------------------------------*\
2  ========= |
3  \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4  \\ / O peration | Website: https://openfoam.org
5  \\ / A nd | Copyright (C) 2011-2025 OpenFOAM Foundation
6  \\/ M anipulation |
7 -------------------------------------------------------------------------------
8 License
9  This file is part of OpenFOAM.
10 
11  OpenFOAM is free software: you can redistribute it and/or modify it
12  under the terms of the GNU General Public License as published by
13  the Free Software Foundation, either version 3 of the License, or
14  (at your option) any later version.
15 
16  OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18  FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19  for more details.
20 
21  You should have received a copy of the GNU General Public License
22  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
23 
24 \*---------------------------------------------------------------------------*/
25 
26 #include "fvcSurfaceIntegrate.H"
27 #include "fvMesh.H"
29 
30 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
31 
32 namespace Foam
33 {
34 
35 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
36 
37 namespace fvc
38 {
39 
40 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
41 
42 template<class Type>
44 (
45  Field<Type>& ivf,
46  const SurfaceField<Type>& ssf
47 )
48 {
49  const fvMesh& mesh = ssf.mesh();
50 
51  const labelUList& owner = mesh.owner();
52  const labelUList& neighbour = mesh.neighbour();
53 
54  const Field<Type>& issf = ssf;
55 
56  forAll(owner, facei)
57  {
58  ivf[owner[facei]] += issf[facei];
59  ivf[neighbour[facei]] -= issf[facei];
60  }
61 
63  {
64  const labelUList& pFaceCells =
65  mesh.boundary()[patchi].faceCells();
66 
67  const fvsPatchField<Type>& pssf = ssf.boundaryField()[patchi];
68 
69  forAll(mesh.boundary()[patchi], facei)
70  {
71  ivf[pFaceCells[facei]] += pssf[facei];
72  }
73  }
74 
75  ivf /= mesh.Vsc();
76 }
77 
78 
79 template<class Type>
82 (
83  const SurfaceField<Type>& ssf
84 )
85 {
86  const fvMesh& mesh = ssf.mesh();
87 
89  (
91  (
92  "surfaceIntegrate("+ssf.name()+')',
93  mesh,
95  (
96  "0",
97  ssf.dimensions()/dimVolume,
98  Zero
99  )
100  )
101  );
102  VolInternalField<Type>& vf = tvf.ref();
103 
104  surfaceIntegrate(vf.primitiveFieldRef(), ssf);
105 
106  return tvf;
107 }
108 
109 
110 template<class Type>
113 (
114  const tmp<SurfaceField<Type>>& tssf
115 )
116 {
118  (
119  fvc::surfaceIntegrate(tssf())
120  );
121  tssf.clear();
122  return tvf;
123 }
124 
125 
126 template<class Type>
129 (
130  const SurfaceField<Type>& ssf
131 )
132 {
133  const fvMesh& mesh = ssf.mesh();
134 
135  tmp<VolField<Type>> tvf
136  (
138  (
139  "surfaceIntegrate("+ssf.name()+')',
140  mesh,
142  (
143  "0",
144  ssf.dimensions()/dimVolume,
145  Zero
146  ),
148  )
149  );
150  VolField<Type>& vf = tvf.ref();
151 
154 
155  return tvf;
156 }
157 
158 
159 template<class Type>
162 (
163  const tmp<SurfaceField<Type>>& tssf
164 )
165 {
166  tmp<VolField<Type>> tvf
167  (
169  );
170  tssf.clear();
171  return tvf;
172 }
173 
174 
175 template<class Type>
177 {
178  const fvMesh& mesh = ssf.mesh();
179 
181  (
183  (
184  "surfaceSum("+ssf.name()+')',
185  mesh,
186  dimensioned<Type>("0", ssf.dimensions(), Zero)
187  )
188  );
189  VolInternalField<Type>& vf = tvf.ref();
190 
191  const labelUList& owner = mesh.owner();
192  const labelUList& neighbour = mesh.neighbour();
193 
194  forAll(owner, facei)
195  {
196  vf[owner[facei]] += ssf[facei];
197  vf[neighbour[facei]] += ssf[facei];
198  }
199 
201  {
202  const labelUList& pFaceCells =
203  mesh.boundary()[patchi].faceCells();
204 
205  const fvsPatchField<Type>& pssf = ssf.boundaryField()[patchi];
206 
207  forAll(mesh.boundary()[patchi], facei)
208  {
209  vf[pFaceCells[facei]] += pssf[facei];
210  }
211  }
212 
213  return tvf;
214 }
215 
216 
217 template<class Type>
219 (
220  const tmp<SurfaceField<Type>>& tssf
221 )
222 {
223  tmp<VolInternalField<Type>> tvf = surfaceSum(tssf());
224  tssf.clear();
225  return tvf;
226 }
227 
228 
229 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
230 
231 } // End namespace fvc
232 
233 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
234 
235 } // End namespace Foam
236 
237 // ************************************************************************* //
#define forAll(list, i)
Loop across all elements in list.
Definition: UList.H:433
const dimensionSet & dimensions() const
Return dimensions.
const Mesh & mesh() const
Return mesh.
Pre-declare SubField and related Field type.
Definition: Field.H:83
Generic GeometricField class.
const Boundary & boundaryField() const
Return const-reference to the boundary field.
Internal::FieldType & primitiveFieldRef()
Return a reference to the primitive field.
void correctBoundaryConditions()
Correct boundary field.
const word & name() const
Return name.
Definition: IOobject.H:307
Generic dimensioned Type class.
This boundary condition applies a zero-gradient condition from the patch internal field onto the patc...
Mesh data needed to do the Finite Volume discretisation.
Definition: fvMesh.H:96
const labelUList & owner() const
Internal face owner.
Definition: fvMesh.H:471
const fvBoundaryMesh & boundary() const
Return reference to boundary mesh.
Definition: fvMesh.C:962
const labelUList & neighbour() const
Internal face neighbour.
Definition: fvMesh.H:477
tmp< DimensionedField< scalar, volMesh > > Vsc() const
Return sub-cycle cell volumes.
An abstract base class with a fat-interface to all derived classes covering all possible ways in whic...
Definition: fvsPatchField.H:86
A class for managing temporary objects.
Definition: tmp.H:55
T & ref() const
Return non-const reference or generate a fatal error.
Definition: tmpI.H:197
Foam::fvMesh mesh(Foam::IOobject(regionName, runTime.name(), runTime, Foam::IOobject::MUST_READ), false)
Surface integrate surfaceField creating a volField. Surface sum a surfaceField creating a volField.
label patchi
void surfaceIntegrate(Field< Type > &ivf, const SurfaceField< Type > &ssf)
tmp< VolField< Type > > surfaceIntegrateExtrapolate(const SurfaceField< Type > &ssf)
tmp< VolInternalField< Type > > surfaceSum(const SurfaceField< Type > &ssf)
Namespace for OpenFOAM.
static const zero Zero
Definition: zero.H:97
const dimensionSet dimVolume
typename VolField< Type >::Internal VolInternalField
Definition: volFieldsFwd.H:59