Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 #include <finiteVolume/fvCFD.H>
00064 #include <OpenFOAM/pointFields.H>
00065 #include <OpenFOAM/emptyPolyPatch.H>
00066 #include <OpenFOAM/symmetryPolyPatch.H>
00067 #include <OpenFOAM/wedgePolyPatch.H>
00068 #include <OpenFOAM/OSspecific.H>
00069
00070
00071
00072
00073 int main(int argc, char *argv[])
00074 {
00075 timeSelector::addOptions();
00076
00077 # include <OpenFOAM/setRootCase.H>
00078 # include <OpenFOAM/createTime.H>
00079
00080 instantList timeDirs = timeSelector::select0(runTime, args);
00081
00082 # include <OpenFOAM/createMeshNoClear.H>
00083
00084 pointMesh pMesh(mesh);
00085
00086 forAll(timeDirs, timeI)
00087 {
00088 runTime.setTime(timeDirs[timeI], timeI);
00089
00090 Info<< nl << "Time: " << runTime.timeName() << endl;
00091
00092 IOobject phiHeader
00093 (
00094 "phi",
00095 runTime.timeName(),
00096 mesh,
00097 IOobject::NO_READ
00098 );
00099
00100 if (phiHeader.headerOk())
00101 {
00102 mesh.readUpdate();
00103
00104 Info<< nl << "Reading field phi" << endl;
00105
00106 surfaceScalarField phi
00107 (
00108 IOobject
00109 (
00110 "phi",
00111 runTime.timeName(),
00112 mesh,
00113 IOobject::MUST_READ,
00114 IOobject::NO_WRITE
00115 ),
00116 mesh
00117 );
00118
00119 pointScalarField streamFunction
00120 (
00121 IOobject
00122 (
00123 "streamFunction",
00124 runTime.timeName(),
00125 mesh,
00126 IOobject::NO_READ,
00127 IOobject::NO_WRITE
00128 ),
00129 pMesh,
00130 dimensionedScalar("zero", phi.dimensions(), 0.0)
00131 );
00132
00133 labelList visitedPoint(mesh.nPoints());
00134 forAll (visitedPoint, pointI)
00135 {
00136 visitedPoint[pointI] = 0;
00137 }
00138 label nVisited = 0;
00139 label nVisitedOld = 0;
00140
00141 const unallocFaceList& faces = mesh.faces();
00142 const pointField& points = mesh.points();
00143
00144 label nInternalFaces = mesh.nInternalFaces();
00145
00146 vectorField unitAreas = mesh.faceAreas();
00147 unitAreas /= mag(unitAreas);
00148
00149 const polyPatchList& patches = mesh.boundaryMesh();
00150
00151 bool finished = true;
00152
00153
00154
00155 bool found = false;
00156
00157 do
00158 {
00159 found = false;
00160
00161 forAll (patches, patchI)
00162 {
00163 const primitivePatch& bouFaces = patches[patchI];
00164
00165 if (!isType<emptyPolyPatch>(patches[patchI]))
00166 {
00167 forAll (bouFaces, faceI)
00168 {
00169 if
00170 (
00171 magSqr(phi.boundaryField()[patchI][faceI])
00172 < SMALL
00173 )
00174 {
00175 const labelList& zeroPoints = bouFaces[faceI];
00176
00177
00178 found = true;
00179
00180 forAll (zeroPoints, pointI)
00181 {
00182 if (visitedPoint[zeroPoints[pointI]] == 1)
00183 {
00184 found = false;
00185 break;
00186 }
00187 }
00188
00189 if (found)
00190 {
00191 Info<< "Zero face: patch: " << patchI
00192 << " face: " << faceI << endl;
00193
00194 forAll (zeroPoints, pointI)
00195 {
00196 streamFunction[zeroPoints[pointI]] = 0;
00197 visitedPoint[zeroPoints[pointI]] = 1;
00198 nVisited++;
00199 }
00200
00201 break;
00202 }
00203 }
00204 }
00205 }
00206
00207 if (found) break;
00208 }
00209
00210 if (!found)
00211 {
00212 Info<< "zero flux boundary face not found. "
00213 << "Using cell as a reference."
00214 << endl;
00215
00216 const cellList& c = mesh.cells();
00217
00218 forAll (c, cI)
00219 {
00220 labelList zeroPoints = c[cI].labels(mesh.faces());
00221
00222 bool found = true;
00223
00224 forAll (zeroPoints, pointI)
00225 {
00226 if (visitedPoint[zeroPoints[pointI]] == 1)
00227 {
00228 found = false;
00229 break;
00230 }
00231 }
00232
00233 if (found)
00234 {
00235 forAll (zeroPoints, pointI)
00236 {
00237 streamFunction[zeroPoints[pointI]] = 0.0;
00238 visitedPoint[zeroPoints[pointI]] = 1;
00239 nVisited++;
00240 }
00241
00242 break;
00243 }
00244 else
00245 {
00246 FatalErrorIn(args.executable())
00247 << "Cannot find initialisation face or a cell."
00248 << abort(FatalError);
00249 }
00250 }
00251 }
00252
00253
00254
00255
00256
00257
00258 do
00259 {
00260 finished = true;
00261
00262 for
00263 (
00264 label faceI = nInternalFaces;
00265 faceI<faces.size();
00266 faceI++
00267 )
00268 {
00269 const labelList& curBPoints = faces[faceI];
00270 bool bPointFound = false;
00271
00272 scalar currentBStream = 0.0;
00273 vector currentBStreamPoint(0, 0, 0);
00274
00275 forAll (curBPoints, pointI)
00276 {
00277
00278 if (visitedPoint[curBPoints[pointI]] == 1)
00279 {
00280
00281 currentBStream =
00282 streamFunction[curBPoints[pointI]];
00283 currentBStreamPoint =
00284 points[curBPoints[pointI]];
00285
00286 bPointFound = true;
00287
00288 break;
00289 }
00290 }
00291
00292 if (bPointFound)
00293 {
00294
00295 forAll (curBPoints, pointI)
00296 {
00297
00298 if (visitedPoint[curBPoints[pointI]] == 0)
00299 {
00300 label patchNo =
00301 mesh.boundaryMesh().whichPatch(faceI);
00302
00303 if
00304 (
00305 !isType<emptyPolyPatch>
00306 (patches[patchNo])
00307 && !isType<symmetryPolyPatch>
00308 (patches[patchNo])
00309 && !isType<wedgePolyPatch>
00310 (patches[patchNo])
00311 )
00312 {
00313 label faceNo =
00314 mesh.boundaryMesh()[patchNo]
00315 .whichFace(faceI);
00316
00317 vector edgeHat =
00318 points[curBPoints[pointI]]
00319 - currentBStreamPoint;
00320 edgeHat.replace(vector::Z, 0);
00321 edgeHat /= mag(edgeHat);
00322
00323 vector nHat = unitAreas[faceI];
00324
00325 if (edgeHat.y() > VSMALL)
00326 {
00327 visitedPoint[curBPoints[pointI]] =
00328 1;
00329 nVisited++;
00330
00331 streamFunction[curBPoints[pointI]]
00332 =
00333 currentBStream
00334 + phi.boundaryField()
00335 [patchNo][faceNo]
00336 *sign(nHat.x());
00337 }
00338 else if (edgeHat.y() < -VSMALL)
00339 {
00340 visitedPoint[curBPoints[pointI]] =
00341 1;
00342 nVisited++;
00343
00344 streamFunction[curBPoints[pointI]]
00345 =
00346 currentBStream
00347 - phi.boundaryField()
00348 [patchNo][faceNo]
00349 *sign(nHat.x());
00350 }
00351 else
00352 {
00353 if (edgeHat.x() > VSMALL)
00354 {
00355 visitedPoint
00356 [curBPoints[pointI]] = 1;
00357 nVisited++;
00358
00359 streamFunction
00360 [curBPoints[pointI]] =
00361 currentBStream
00362 + phi.boundaryField()
00363 [patchNo][faceNo]
00364 *sign(nHat.y());
00365 }
00366 else if (edgeHat.x() < -VSMALL)
00367 {
00368 visitedPoint
00369 [curBPoints[pointI]] = 1;
00370 nVisited++;
00371
00372 streamFunction
00373 [curBPoints[pointI]] =
00374 currentBStream
00375 - phi.boundaryField()
00376 [patchNo][faceNo]
00377 *sign(nHat.y());
00378 }
00379 }
00380 }
00381 }
00382 }
00383 }
00384 else
00385 {
00386 finished = false;
00387 }
00388 }
00389
00390 for (label faceI=0; faceI<nInternalFaces; faceI++)
00391 {
00392
00393 const labelList& curPoints = faces[faceI];
00394
00395 bool pointFound = false;
00396
00397 scalar currentStream = 0.0;
00398 point currentStreamPoint(0, 0, 0);
00399
00400 forAll (curPoints, pointI)
00401 {
00402
00403 if (visitedPoint[curPoints[pointI]] == 1)
00404 {
00405
00406 currentStream =
00407 streamFunction[curPoints[pointI]];
00408 currentStreamPoint =
00409 points[curPoints[pointI]];
00410 pointFound = true;
00411
00412 break;
00413 }
00414 }
00415
00416 if (pointFound)
00417 {
00418
00419 forAll (curPoints, pointI)
00420 {
00421
00422 if (visitedPoint[curPoints[pointI]] == 0)
00423 {
00424 vector edgeHat =
00425 points[curPoints[pointI]]
00426 - currentStreamPoint;
00427
00428 edgeHat.replace(vector::Z, 0);
00429 edgeHat /= mag(edgeHat);
00430
00431 vector nHat = unitAreas[faceI];
00432
00433 if (edgeHat.y() > VSMALL)
00434 {
00435 visitedPoint[curPoints[pointI]] = 1;
00436 nVisited++;
00437
00438 streamFunction[curPoints[pointI]] =
00439 currentStream
00440 + phi[faceI]*sign(nHat.x());
00441 }
00442 else if (edgeHat.y() < -VSMALL)
00443 {
00444 visitedPoint[curPoints[pointI]] = 1;
00445 nVisited++;
00446
00447 streamFunction[curPoints[pointI]] =
00448 currentStream
00449 - phi[faceI]*sign(nHat.x());
00450 }
00451 }
00452 }
00453 }
00454 else
00455 {
00456 finished = false;
00457 }
00458 }
00459
00460 Info<< ".";
00461
00462
00463 if (nVisited == nVisitedOld)
00464 {
00465
00466
00467 Info<< nl << "Exhausted a seed. Looking for new seed "
00468 << "(this is correct for multiply connected "
00469 << "domains).";
00470
00471 break;
00472 }
00473 else
00474 {
00475 nVisitedOld = nVisited;
00476 }
00477 } while (!finished);
00478
00479 Info << endl;
00480 } while (!finished);
00481
00482 streamFunction.boundaryField() = 0.0;
00483 streamFunction.write();
00484 }
00485 else
00486 {
00487 WarningIn(args.executable())
00488 << "Flux field does not exist."
00489 << " Stream function not calculated" << endl;
00490 }
00491 }
00492
00493 Info<< "\nEnd\n" << endl;
00494
00495 return 0;
00496 }
00497
00498
00499