All Classes Namespaces Files Functions Variables Typedefs Friends Macros Groups
extendedFaceStencilFormVfValues.H
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  Copyright (C) 2019 OpenCFD Ltd.
10  Copyright (C) 2016-2019 ISP RAS (www.ispras.ru) UniCFD Group (www.unicfd.ru)
11 -------------------------------------------------------------------------------
12 License
13  This file is part of QGDsolver library, based on OpenFOAM+.
14  OpenFOAM is free software: you can redistribute it and/or modify it
15  under the terms of the GNU General Public License as published by
16  the Free Software Foundation, either version 3 of the License, or
17  (at your option) any later version.
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  You should have received a copy of the GNU General Public License
23  along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
24 Class
25  Foam::fvsc::leastSquaresOpt::extendedFaceStencilFormVfValues
26 Description
27  Function for filling of array which contain which will contain
28  the cells necessary for use by several processors.
29 Source file
30  extendedFaceStencilScalarDer.C
31  extendedFaceStencilScalarGradOpt.C
32  leastSquaresStencilOpt.C
33 \*---------------------------------------------------------------------------*/
34 
35 void formVfValues (const volScalarField& iF,List3<scalar>& procVfValues)
36 {
37  label cellId = -1;
38  forAll(procPairs_, patchI)
39  {
40  if (procPairs_[patchI] > -1)
41  {
42  procVfValues[patchI].resize(procWf2_[patchI].size());
43  forAll(procVfValues[patchI], faceI)
44  {
45  procVfValues[patchI][faceI].resize(procWf2_[patchI][faceI].size());
46  procVfValues[patchI][faceI] = 0.0; //make values zero
47  forAll(myProcPatchCells_[patchI][faceI], cellI)
48  {
49  cellId = myProcPatchCells_[patchI][faceI][cellI];
50  procVfValues[patchI][faceI][cellI] = iF.primitiveField()[cellId];
51  }
52  }
53  }
54  }
55 
56  //Step 1. Send field data to neighbouring processors (non-blocking mode)
57  PstreamBuffers pBuffers(Pstream::commsTypes::nonBlocking);
58  forAll(procPairs_, procI)
59  {
60  label procId = neigProcs_[procI];
61  DynamicList<scalar> locVf;
62 
63  if (procPairs_[procI] > -1) //patch proc pair
64  {
65  forAll(procVfValues[procI], faceI)
66  {
67  for(
68  label
69  cellI = 0;
70  cellI <= ownEnd_[procI][faceI];
71  cellI++
72  )
73  {
74  locVf.append(procVfValues[procI][faceI][cellI]);
75  }
76  }
77  }
78  else //corner connected process
79  {
80  label cellId = -1;
81  label addrId = corProcIds_[procId];
82  forAll(corCellIds_[addrId], iCellId)
83  {
84  cellId = corCellIds_[addrId][iCellId];
85  locVf.append(iF.primitiveField()[cellId]);
86  }
87  }
88 
89  UOPstream oProcStr(procId, pBuffers);
90  oProcStr << locVf;
91  }
92 
93  //Step 2. Recieve field data from neighbouring processors
94  pBuffers.finishedSends();
95  label iCorProc = 0;
96  forAll(procPairs_, procI)
97  {
98  //data size from processor, that is neighbouring through the patch
99  label procId = neigProcs_[procI];
100 
101  UIPstream iProcStr(procId, pBuffers);
102  List<scalar> locVf (iProcStr);
103 
104  if (procPairs_[procI] > -1)
105  {
106  label iVf = 0;
107  forAll(neiStart_[procI], iFace)
108  {
109  for(
110  label
111  iCell=neiStart_[procI][iFace];
112  iCell<=neiEnd_[procI][iFace];
113  iCell++
114  )
115  {
116  procVfValues[procI][iFace][iCell] =
117  locVf[iVf];
118  iVf++;
119  }
120  }
121  }
122  else
123  {
124  label patchNo = -1;
125  label faceNo = -1;
126  label cellNo = -1;
127  label offset = -1;
128 
129  const List<Triple<label> >& addr = corAddr_[iCorProc];
130 // Pout << "corAddr for scalar: " << "corAddt["<< iCorProc << "] = " << corAddr_[iCorProc] << endl;
131 
132  forAll(addr, iVal)
133  {
134  patchNo = addr[iVal][0];
135  faceNo = addr[iVal][1];
136  cellNo = addr[iVal][2];
137 
138  offset = corStart_[patchNo][faceNo];
139  procVfValues[patchNo][faceNo][cellNo+offset] = locVf[iVal];
140  }
141  iCorProc++;
142  }
143 
144  }
145 
146 // Info << "procVfValues = " << procVfValues << endl;
147 }
148 
149 
150 template<class FieldType>
151 void formVfValues (const GeometricField<FieldType, fvPatchField, volMesh>& iF,List<List3<scalar>>& procVfValues)
152 {
153  //set values from this domain
154  label cellId = -1;
155  label nComps = pTraits<FieldType>::nComponents;
156 
157  procVfValues.resize(nComps);
158  for(label compI = 0;compI <= nComps-1;compI++)
159  {
160  forAll(procPairs_, patchI)
161  {
162  if (procPairs_[patchI] > -1)
163  {
164  procVfValues[compI].resize(procVfValues[compI].size()+1);
165  procVfValues[compI][patchI].resize(procWf2_[patchI].size());
166 
167  forAll(procVfValues[compI][patchI], faceI)
168  {
169  procVfValues[compI][patchI][faceI].resize(procWf2_[patchI][faceI].size());
170 // procVfValues[patchI][faceI] = 0.0; //make values zero
171  forAll(procVfValues[compI][patchI][faceI], cellI)
172  {
173  procVfValues[compI][patchI][faceI][cellI] =0.0; //make values zero
174 
175 // cellId = myProcPatchCells_[patchI][faceI][cellI];
176  procVfValues[compI][patchI][faceI][cellI] = iF.primitiveField()[cellId].component(compI);
177 
178 
179  }
180  }
181  }
182  }
183  }
184 
185  //Step 1. Send field data to neighbouring processors (non-blocking mode)
186 
187  PstreamBuffers pBuffers(Pstream::commsTypes::nonBlocking);
188 
189  forAll(procPairs_, procI)
190  {
191  label procId = neigProcs_[procI];
192  List<DynamicList<scalar>> locVf;
193  locVf.resize(nComps);
194 
195  for(label compI = 0;compI <= nComps-1;compI++)
196  {
197  if (procPairs_[procI] > -1) //patch proc pair
198  {
199  forAll(procVfValues[compI][procI], faceI)
200  {
201  for(
202  label
203  cellI = 0;
204  cellI <= ownEnd_[procI][faceI];
205  cellI++
206  )
207  {
208 
209  locVf[compI].append(procVfValues[compI][procI][faceI][cellI]);
210  }
211  }
212 
213  }
214 
215  else //corner connected process
216  {
217  label cellId = -1;
218  label addrId = corProcIds_[procId];
219  forAll(corCellIds_[addrId], iCellId)
220  {
221  cellId = corCellIds_[addrId][iCellId];
222  locVf[compI].append(iF.primitiveField()[cellId].component(compI));
223  }
224  }
225  }
226  UOPstream oProcStr(procId, pBuffers);
227  oProcStr << locVf;
228  }
229  pBuffers.finishedSends();
230  //Step 2. Recieve field data from neighbouring processors
231  label iCorProc = 0;
232  forAll(procPairs_, procI)
233  {
234 // data size from processor, that is neighbouring through the patch
235 
236  label procId = neigProcs_[procI];
237 
238  UIPstream iProcStr(procId, pBuffers);
239 
240  List<List<scalar>> locVf(iProcStr);
241 
242  if (procPairs_[procI] > -1)
243  {
244  label iVf = 0;
245  forAll(neiStart_[procI], iFace)
246  {
247  for(
248  label
249  iCell=neiStart_[procI][iFace];
250  iCell<=neiEnd_[procI][iFace];
251  iCell++
252  )
253  {
254  for(label compI = 0;compI <= nComps-1;compI++)
255  procVfValues[compI][procI][iFace][iCell] =
256  locVf[compI][iVf];
257  iVf++;
258  }
259  }
260  }
261  else
262  {
263  label patchNo = -1;
264  label faceNo = -1;
265  label cellNo = -1;
266  label offset = -1;
267 
268  const List<Triple<label> >& addr = corAddr_[iCorProc];
269 
270 // Pout << "corAddr for template: " << "corAddt["<< iCorProc << "] = " << corAddr_[iCorProc] << endl;
271  forAll(addr, iVal)
272  {
273  patchNo = addr[iVal][0];
274  faceNo = addr[iVal][1];
275  cellNo = addr[iVal][2];
276  offset = corStart_[patchNo][faceNo];
277 
278  for(label compI = 0;compI <= nComps-1;compI++)
279  procVfValues[compI][patchNo][faceNo][cellNo+offset] = locVf[compI][iVal];
280  }
281  iCorProc++;
282 
283  }
284  }
285 
286 };
void formVfValues(const volScalarField &iF, List3< scalar > &procVfValues)
forAll(Y, i)
Definition: QGDYEqn.H:36