91 label localTriFaceI = 0;
93 for (
const label patchI : includePatches)
108 f.triangles(
points, nTri, triFaces);
110 forAll(triFaces, triFaceI)
112 const face&
f = triFaces[triFaceI];
121 finalAgglom[patchI][patchFaceI]
122 + coarsePatches[patchI].start()
140 rawSurface.localFaces(),
141 rawSurface.localPoints()
145 surface.patches().setSize(newPatchI);
149 for (
const label patchI : includePatches)
153 surface.patches()[newPatchI].index() = patchI;
154 surface.patches()[newPatchI].name() =
patch.name();
155 surface.patches()[newPatchI].geometricType() =
patch.type();
179 const labelList visFaces = visibleFaceFaces[faceI];
180 forAll(visFaces, faceRemote)
182 label compactI = visFaces[faceRemote];
183 const point& remoteFc = compactCf[compactI];
189 str <<
"l " << vertI-1 <<
' ' << vertI <<
nl;
196 scalar calculateViewFactorFij
205 scalar rMag =
mag(r);
209 scalar dAiMag =
mag(dAi);
210 scalar dAjMag =
mag(dAj);
214 scalar cosThetaJ =
mag(nj & r)/rMag;
215 scalar cosThetaI =
mag(ni & r)/rMag;
219 (cosThetaI*cosThetaJ*dAjMag*dAiMag)
230 void insertMatrixElements
233 const label fromProcI,
239 forAll(viewFactors, faceI)
242 const labelList& globalFaces = globalFaceFaces[faceI];
244 label globalI = globalNumbering.
toGlobal(fromProcI, faceI);
247 matrix[globalI][globalFaces[i]] = vf[i];
255 int main(
int argc,
char *argv[])
259 "Calculate view factors from face agglomeration array."
260 " The finalAgglom generated by faceAgglomerate utility."
281 const word viewFactorWall(
"viewFactorWall");
283 const bool writeViewFactors =
284 viewFactorDict.getOrDefault(
"writeViewFactorMatrix",
false);
286 const bool dumpRays =
287 viewFactorDict.getOrDefault(
"dumpRays",
false);
289 const label
debug = viewFactorDict.getOrDefault<label>(
"debug", 0);
310 Pout <<
"\nCreating single cell mesh..." <<
endl;
329 Pout <<
"\nCreated single cell mesh..." <<
endl;
336 label nCoarseFaces = 0;
337 label nFineFaces = 0;
343 for (
const label patchi : viewFactorsPatches)
345 nCoarseFaces += coarsePatches[patchi].size();
346 nFineFaces +=
patches[patchi].size();
350 label totalNCoarseFaces = nCoarseFaces;
356 Info <<
"\nTotal number of coarse faces: "<< totalNCoarseFaces <<
endl;
361 Pout <<
"\nView factor patches included in the calculation : "
362 << viewFactorsPatches <<
endl;
373 for (
const label
patchID : viewFactorsPatches)
380 if (agglom.size() > 0)
382 label nAgglom =
max(agglom)+1;
385 coarseMesh.patchFaceMap()[
patchID];
388 coarseMesh.Cf().boundaryField()[
patchID];
390 coarseMesh.Sf().boundaryField()[
patchID];
394 point cf = coarseCf[faceI];
396 const label coarseFaceI = coarsePatchFace[faceI];
397 const labelList& fineFaces = coarseToFine[coarseFaceI];
398 const label agglomI =
410 upp.faceCentres().size()
411 + upp.localPoints().size()
417 upp.faceCentres().size()
418 ) = upp.faceCentres();
423 upp.localPoints().size(),
424 upp.faceCentres().size()
425 ) = upp.localPoints();
429 forAll(availablePoints, iPoint)
431 point cfFine = availablePoints[iPoint];
432 if (
mag(cfFine-cfo) < dist)
434 dist =
mag(cfFine-cfo);
439 point sf = coarseSf[faceI];
440 localCoarseCf.append(cf);
441 localCoarseSf.append(sf);
442 localAgg.append(agglomI);
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];
547 if (agglom.size() > 0)
549 label nAgglom =
max(agglom)+1;
552 coarseMesh.patchFaceMap()[
patchID];
554 forAll(coarseToFine, coarseI)
556 compactPatchId.append(
patchID);
560 const label coarseFaceI = coarsePatchFace[coarseI];
561 const labelList& fineFaces = coarseToFine[coarseFaceI];
563 fineCf.
setSize(fineFaces.size());
564 fineSf.
setSize(fineFaces.size());
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);
619 label totalPatches = coarsePatches.size();
633 Info<<
"\nCalculating view factors..." <<
endl;
638 forAll(localCoarseSf, coarseFaceI)
640 const List<point>& localFineSf = compactFineSf[coarseFaceI];
642 const List<point>& localFineCf = compactFineCf[coarseFaceI];
643 const label fromPatchId = compactPatchId[coarseFaceI];
644 patchArea[fromPatchId] +=
mag(Ai);
646 const labelList& visCoarseFaces = visibleFaceFaces[coarseFaceI];
648 forAll(visCoarseFaces, visCoarseFaceI)
650 F[coarseFaceI].setSize(visCoarseFaces.size());
651 label compactJ = visCoarseFaces[visCoarseFaceI];
652 const List<point>& remoteFineSj = compactFineSf[compactJ];
653 const List<point>& remoteFineCj = compactFineCf[compactJ];
655 const label toPatchId = compactPatchId[compactJ];
660 const vector& dAi = localFineSf[i];
661 const vector& dCi = localFineCf[i];
665 const vector& dAj = remoteFineSj[j];
666 const vector& dCj = remoteFineCj[j];
668 scalar dIntFij = calculateViewFactorFij
679 F[coarseFaceI][visCoarseFaceI] = Fij/
mag(Ai);
680 sumViewFactorPatch[fromPatchId][toPatchId] += Fij;
697 scalar wideBy2 = (box.
span() & emptyDir)*2.0;
699 forAll(localCoarseSf, coarseFaceI)
701 const vector& Ai = localCoarseSf[coarseFaceI];
702 const vector& Ci = localCoarseCf[coarseFaceI];
704 vector R1i = Ci + (
mag(Ai)/wideBy2)*(Ain ^ emptyDir);
705 vector R2i = Ci - (
mag(Ai)/wideBy2)*(Ain ^ emptyDir) ;
707 const label fromPatchId = compactPatchId[coarseFaceI];
708 patchArea[fromPatchId] +=
mag(Ai);
710 const labelList& visCoarseFaces = visibleFaceFaces[coarseFaceI];
711 forAll(visCoarseFaces, visCoarseFaceI)
713 F[coarseFaceI].setSize(visCoarseFaces.size());
714 label compactJ = visCoarseFaces[visCoarseFaceI];
715 const vector& Aj = compactCoarseSf[compactJ];
716 const vector& Cj = compactCoarseCf[compactJ];
718 const label toPatchId = compactPatchId[compactJ];
721 vector R1j = Cj + (
mag(Aj)/wideBy2)*(Ajn ^ emptyDir);
722 vector R2j = Cj - (
mag(Aj)/wideBy2)*(Ajn ^ emptyDir);
724 scalar d1 =
mag(R1i - R2j);
725 scalar d2 =
mag(R2i - R1j);
726 scalar s1 =
mag(R1i - R1j);
727 scalar s2 =
mag(R2i - R2j);
729 scalar Fij =
mag((d1 + d2) - (s1 + s2))/(4.0*
mag(Ai)/wideBy2);
731 F[coarseFaceI][visCoarseFaceI] = Fij;
732 sumViewFactorPatch[fromPatchId][toPatchId] += Fij*
mag(Ai);
739 Info <<
"Writing view factor matrix..." <<
endl;
751 forAll(viewFactorsPatches, i)
753 label patchI = viewFactorsPatches[i];
754 forAll(viewFactorsPatches, i)
756 label patchJ = viewFactorsPatches[i];
757 Info <<
"F" << patchI << patchJ <<
": "
758 << sumViewFactorPatch[patchI][patchJ]/patchArea[patchI]
765 if (writeViewFactors)
784 forAll(viewFactorsPatches, i)
786 label
patchID = viewFactorsPatches[i];
788 if (agglom.size() > 0)
790 label nAgglom =
max(agglom)+1;
793 coarseMesh.patchFaceMap()[
patchID];
795 forAll(coarseToFine, coarseI)
797 const scalar Fij =
sum(
F[compactI]);
798 const label coarseFaceID = coarsePatchFace[coarseI];
799 const labelList& fineFaces = coarseToFine[coarseFaceID];
802 const label faceID = fineFaces[fineId];
809 viewFactorField.write();
816 labelList compactToGlobal(map.constructSize());
819 for (label i = 0; i < globalNumbering.
localSize(); i++)
821 compactToGlobal[i] = globalNumbering.
toGlobal(i);
827 const Map<label>& localToCompactMap = compactMap[procI];
831 compactToGlobal[*iter] = globalNumbering.
toGlobal
844 forAll(globalFaceFaces, faceI)
849 visibleFaceFaces[faceI]
864 std::move(globalFaceFaces)
866 IOglobalFaceFaces.write();
880 std::move(visibleFaceFaces)
882 IOvisibleFaceFaces.write();