54 #include "uindirectPrimitivePatch.H"
88 label localTriFaceI = 0;
92 const label patchI = iter.key();
100 const face&
f = patch[patchFaceI];
106 f.triangles(
points, nTri, triFaces);
108 forAll(triFaces, triFaceI)
110 const face&
f = triFaces[triFaceI];
119 finalAgglom[patchI][patchFaceI]
120 + coarsePatches[patchI].start()
138 rawSurface.localFaces(),
139 rawSurface.localPoints()
143 surface.patches().setSize(newPatchI);
149 const label patchI = iter.key();
152 surface.patches()[newPatchI].index() = patchI;
154 surface.patches()[newPatchI].geometricType() = patch.type();
178 const labelList visFaces = visibleFaceFaces[faceI];
179 forAll(visFaces, faceRemote)
181 label compactI = visFaces[faceRemote];
182 const point& remoteFc = compactCf[compactI];
188 str <<
"l " << vertI-1 <<
' ' << vertI <<
nl;
191 string cmd(
"objToVTK " + fName +
" " + fName.
lessExt() +
".vtk");
197 scalar calculateViewFactorFij
206 scalar rMag =
mag(r);
210 scalar dAiMag =
mag(dAi);
211 scalar dAjMag =
mag(dAj);
215 scalar cosThetaJ =
mag(nj & r)/rMag;
216 scalar cosThetaI =
mag(ni & r)/rMag;
220 (cosThetaI*cosThetaJ*dAjMag*dAiMag)
231 void insertMatrixElements
234 const label fromProcI,
240 forAll(viewFactors, faceI)
243 const labelList& globalFaces = globalFaceFaces[faceI];
248 matrix[globalI][globalFaces[i]] = vf[i];
256 int main(
int argc,
char *argv[])
276 const word viewFactorWall(
"viewFactorWall");
278 const bool writeViewFactors =
279 viewFactorDict.lookupOrDefault<
bool>(
"writeViewFactorMatrix",
false);
281 const bool dumpRays =
282 viewFactorDict.lookupOrDefault<
bool>(
"dumpRays",
false);
284 const label debug = viewFactorDict.lookupOrDefault<
label>(
"debug", 0);
305 Pout <<
"\nCreating single cell mesh..." <<
endl;
324 Pout <<
"\nCreated single cell mesh..." <<
endl;
331 label nCoarseFaces = 0;
332 label nFineFaces = 0;
338 forAll (viewFactorsPatches, i)
340 label patchI = viewFactorsPatches[i];
341 nCoarseFaces += coarsePatches[patchI].
size();
342 nFineFaces +=
patches[patchI].size();
346 label totalNCoarseFaces = nCoarseFaces;
352 Info <<
"\nTotal number of coarse faces: "<< totalNCoarseFaces <<
endl;
357 Pout <<
"\nView factor patches included in the calculation : "
358 << viewFactorsPatches <<
endl;
370 forAll(viewFactorsPatches, i)
372 const label patchID = viewFactorsPatches[i];
375 const labelList& agglom = finalAgglom[patchID];
377 includePatches.
insert(patchID);
379 if (agglom.
size() > 0)
384 coarseMesh.patchFaceMap()[patchID];
387 coarseMesh.Cf().boundaryField()[patchID];
389 coarseMesh.Sf().boundaryField()[patchID];
393 point cf = coarseCf[faceI];
395 const label coarseFaceI = coarsePatchFace[faceI];
396 const labelList& fineFaces = coarseToFine[coarseFaceI];
397 const label agglomI =
398 agglom[fineFaces[0]] + coarsePatches[patchID].start();
410 upp.faceCentres().size()
411 + upp.localPoints().size()
417 upp.faceCentres().size()
418 ).
assign(upp.faceCentres());
423 upp.localPoints().size(),
424 upp.faceCentres().size()
425 ).
assign(upp.localPoints());
429 forAll(availablePoints, iPoint)
431 point cfFine = availablePoints[iPoint];
432 if (
mag(cfFine-cfo) < dist)
434 dist =
mag(cfFine-cfo);
440 localCoarseCf.append(cf);
441 localCoarseSf.append(
sf);
442 localAgg.append(agglomI);
486 labelList nVisibleFaceFaces(nCoarseFaces, 0);
490 nVisibleFaceFaces[rayStartFace[i]]++;
495 label nViewFactors = 0;
496 forAll(nVisibleFaceFaces, faceI)
498 visibleFaceFaces[faceI].
setSize(nVisibleFaceFaces[faceI]);
499 nViewFactors += nVisibleFaceFaces[faceI];
516 nVisibleFaceFaces = 0;
519 label faceI = rayStartFace[i];
520 label compactI = rayEndFace[i];
521 visibleFaceFaces[faceI][nVisibleFaceFaces[faceI]++] = compactI;
542 forAll(viewFactorsPatches, i)
544 label patchID = viewFactorsPatches[i];
546 const labelList& agglom = finalAgglom[patchID];
547 if (agglom.
size() > 0)
552 coarseMesh.patchFaceMap()[patchID];
554 forAll(coarseToFine, coarseI)
556 compactPatchId.append(patchID);
560 const label coarseFaceI = coarsePatchFace[coarseI];
561 const labelList& fineFaces = coarseToFine[coarseFaceI];
569 coarseToFine[coarseFaceI]
574 coarseToFine[coarseFaceI]
581 map.distribute(compactCoarseSf);
582 map.distribute(compactCoarseCf);
583 map.distribute(compactFineCf);
584 map.distribute(compactFineSf);
586 map.distribute(compactPatchId);
594 runTime.path()/
"allVisibleFaces.obj",
619 label totalPatches = coarsePatches.
size();
634 Info<<
"\nCalculating view factors..." <<
endl;
639 forAll (localCoarseSf, coarseFaceI)
641 const List<point>& localFineSf = compactFineSf[coarseFaceI];
643 const List<point>& localFineCf = compactFineCf[coarseFaceI];
644 const label fromPatchId = compactPatchId[coarseFaceI];
645 patchArea[fromPatchId] +=
mag(Ai);
647 const labelList& visCoarseFaces = visibleFaceFaces[coarseFaceI];
649 forAll(visCoarseFaces, visCoarseFaceI)
651 F[coarseFaceI].setSize(visCoarseFaces.
size());
652 label compactJ = visCoarseFaces[visCoarseFaceI];
653 const List<point>& remoteFineSj = compactFineSf[compactJ];
654 const List<point>& remoteFineCj = compactFineCf[compactJ];
656 const label toPatchId = compactPatchId[compactJ];
661 const vector& dAi = localFineSf[i];
662 const vector& dCi = localFineCf[i];
666 const vector& dAj = remoteFineSj[j];
667 const vector& dCj = remoteFineCj[j];
669 scalar dIntFij = calculateViewFactorFij
680 F[coarseFaceI][visCoarseFaceI] = Fij/
mag(Ai);
681 sumViewFactorPatch[fromPatchId][toPatchId] += Fij;
698 scalar wideBy2 = (box.
span() & emptyDir)*2.0;
700 forAll(localCoarseSf, coarseFaceI)
702 const vector& Ai = localCoarseSf[coarseFaceI];
703 const vector& Ci = localCoarseCf[coarseFaceI];
705 vector R1i = Ci + (
mag(Ai)/wideBy2)*(Ain ^ emptyDir);
706 vector R2i = Ci - (
mag(Ai)/wideBy2)*(Ain ^ emptyDir) ;
708 const label fromPatchId = compactPatchId[coarseFaceI];
709 patchArea[fromPatchId] +=
mag(Ai);
711 const labelList& visCoarseFaces = visibleFaceFaces[coarseFaceI];
712 forAll (visCoarseFaces, visCoarseFaceI)
714 F[coarseFaceI].setSize(visCoarseFaces.
size());
715 label compactJ = visCoarseFaces[visCoarseFaceI];
716 const vector& Aj = compactCoarseSf[compactJ];
717 const vector& Cj = compactCoarseCf[compactJ];
719 const label toPatchId = compactPatchId[compactJ];
722 vector R1j = Cj + (
mag(Aj)/wideBy2)*(Ajn ^ emptyDir);
723 vector R2j = Cj - (
mag(Aj)/wideBy2)*(Ajn ^ emptyDir);
725 scalar d1 =
mag(R1i - R2j);
726 scalar d2 =
mag(R2i - R1j);
727 scalar s1 =
mag(R1i - R1j);
728 scalar s2 =
mag(R2i - R2j);
730 scalar Fij =
mag((d1 + d2) - (s1 + s2))/(4.0*
mag(Ai)/wideBy2);
732 F[coarseFaceI][visCoarseFaceI] = Fij;
733 sumViewFactorPatch[fromPatchId][toPatchId] += Fij*
mag(Ai);
740 Info <<
"Writing view factor matrix..." <<
endl;
752 forAll(viewFactorsPatches, i)
754 label patchI = viewFactorsPatches[i];
755 forAll(viewFactorsPatches, i)
757 label patchJ = viewFactorsPatches[i];
758 Info <<
"F" << patchI << patchJ <<
": "
759 << sumViewFactorPatch[patchI][patchJ]/patchArea[patchI]
766 if (writeViewFactors)
783 forAll(viewFactorsPatches, i)
785 label patchID = viewFactorsPatches[i];
786 const labelList& agglom = finalAgglom[patchID];
787 if (agglom.
size() > 0)
792 coarseMesh.patchFaceMap()[patchID];
794 forAll(coarseToFine, coarseI)
796 const scalar Fij =
sum(
F[compactI]);
797 const label coarseFaceID = coarsePatchFace[coarseI];
798 const labelList& fineFaces = coarseToFine[coarseFaceID];
799 forAll (fineFaces, fineId)
801 const label faceID = fineFaces[fineId];
802 viewFactorField.boundaryField()[patchID][faceID] = Fij;
808 viewFactorField.write();
815 labelList compactToGlobal(map.constructSize());
820 compactToGlobal[i] = globalNumbering.
toGlobal(i);
826 const Map<label>& localToCompactMap = compactMap[procI];
830 compactToGlobal[iter()] = globalNumbering.
toGlobal
843 forAll(globalFaceFaces, faceI)
848 visibleFaceFaces[faceI]
865 IOglobalFaceFaces.write();
881 IOvisibleFaceFaces.write();