From fc006b5b5012520e730e84f80651a3eea0f8dd3c Mon Sep 17 00:00:00 2001 From: Adrian Kummerlaender Date: Mon, 14 Jan 2019 16:25:06 +0100 Subject: Preliminarily conclude implementation overview section --- code/coarseCoupler2d.cpp | 8 ++++++++ code/coupler2d.cpp | 27 +++++++++++++++++++++++++ code/fineCoupler2d.cpp | 15 ++++++++++++++ content.tex | 52 +++++++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 code/coarseCoupler2d.cpp create mode 100644 code/coupler2d.cpp create mode 100644 code/fineCoupler2d.cpp diff --git a/code/coarseCoupler2d.cpp b/code/coarseCoupler2d.cpp new file mode 100644 index 0000000..9bc5383 --- /dev/null +++ b/code/coarseCoupler2d.cpp @@ -0,0 +1,8 @@ +template class DESCRIPTOR> +class CoarseCoupler2D : public Coupler2D { +public: + CoarseCoupler2D(Grid2D& coarse, Grid2D& fine, + Vector origin, Vector extend); + + void couple(); +}; diff --git a/code/coupler2d.cpp b/code/coupler2d.cpp new file mode 100644 index 0000000..7f2b8a8 --- /dev/null +++ b/code/coupler2d.cpp @@ -0,0 +1,27 @@ +template class DESCRIPTOR> +class Coupler2D { +protected: + Grid2D& _coarse; + Grid2D& _fine; + + const int _coarseSize; + const int _fineSize; + const bool _vertical; + + Vector _physOrigin; + + const Vector& getFineLatticeR(int y) const; + const Vector& getCoarseLatticeR(int y) const; + + T getScalingFactor() const; + T getInvScalingFactor() const; + +private: + std::vector> _coarseLatticeR; + std::vector> _fineLatticeR; + +public: + Coupler2D(Grid2D& coarse, Grid2D& fine, + Vector origin, Vector extend); + +}; diff --git a/code/fineCoupler2d.cpp b/code/fineCoupler2d.cpp new file mode 100644 index 0000000..4cde254 --- /dev/null +++ b/code/fineCoupler2d.cpp @@ -0,0 +1,15 @@ +template class DESCRIPTOR> +class FineCoupler2D : public Coupler2D { +private: + std::vector _c2f_rho; + std::vector> _c2f_u; + std::vector::q>> _c2f_fneq; + +public: + FineCoupler2D(Grid2D& coarse, Grid2D& fine, + Vector origin, Vector extend); + + void store(); + void interpolate(); + void couple(); +}; diff --git a/content.tex b/content.tex index e592db4..3f59e20 100644 --- a/content.tex +++ b/content.tex @@ -692,16 +692,66 @@ Während sich die Realisierung dieser Signatur als einfache Konstruktion der erl \label{lst:GridCollideAndStream} \end{listing} -Wie in Kapitel~\ref{kap:Algorithmus} dargelegt, müssen zur Gitterkopplung nach jedem Kollisions- und Strömungsschritt verschiedene Schritte durchführt werden. So ist die Durchführung von Kollisions- und Strömungsschritten auf dem feinen Gitter zusammen mit der jeweiligen Vor- und Nacharbeit strikt an die Nacharbeit von Kollisions- und Strömungsschritten auf dem groben Gitter gebunden. +Wie in Kapitel~\ref{kap:Algorithmus} dargelegt, müssen zur Gitterkopplung nach jedem Kollisions- und Strömungsschritt verschiedene Schritte durchführt werden. So ist die Ausführung von Kollisions- und Strömungsschritten auf dem feinen Gitter zusammen mit der jeweiligen Vor- und Nacharbeit strikt an die Nacharbeit von Kollisions- und Strömungsschritten auf dem groben Gitter gebunden. Wurde das grobe Gitter um einen Zeitschritt weiterentwickelt, muss der Zustand des feinen Gitters ebenfalls um entsprechend zwei feine Zeitschritte weiterentwickelt werden, damit die groben Verteilungsfunktionen vervollständigt werden können. Es liegt somit nahe, die Aufrufe von \method{SuperLattice2D::collideAndStream} in einer Methode \method{Grid2D::collideAndStream} zu kapseln und auf diese Weise die Aufrufe von \class{Coupler2D} an den korrekten Stellen durchzuführen. Konkret erhalten wir in Listing~\ref{lst:GridCollideAndStream} bei Verwaltung der von \method{Grid2D::refine} erstellten feinen Gitter und den zugehörigen Kopplern in Listen eine der Algorithmenübersicht in Abbildung~\ref{fig:AlgorithmBirdsEye} nicht unähnliche Implementierung von \method{Grid2D::collideAndStream}. Zu bemerken ist, dass die Konstellation aus dieser Methode zusammen mit \method{Grid2D::refine} durch Selbstaufruf bereits die freie Schachtelung von Verfeinerungsbereichen erlaubt. +\begin{listing}[H] +\begin{minted}[fontsize=\footnotesize,mathescape]{cpp} +// Initialisiere gröbstes Gitter mit gewünschten Fluidkonstanten +Grid2D coarseGrid(coarseDomain, resolution, tau, Re); +prepareGeometry(coarseGrid); + +// Verfeinere ein Einheitsquadrat beginnend bei $(0.5,0.5) \in \R^2$ +auto fineGrid = coarseGrid.refine({0.5, 0.5}, {1.0, 1.0}); +prepareGeometry(fineGrid); + +// Schließe den feinen Bereich auf dem groben Gitter aus (optional) +auto refinedOverlap = fineGrid.getRefinedOverlap(); +coarseGrid->getSuperGeometry().rename(1,0,*refinedOverlap); + +// Binde Dynamics und Randkonditionen an die beiden Gitter +prepareLattice(coarseGrid); +prepareLattice(fineGrid); + +// Simulationsschleife mit Ausgabe +for (int iT = 0; iT < coarseGrid->getConverter().getLatticeTime(100); ++iT) { + coarseGrid->collideAndStream(); + + getResults(coarseGrid, iT); + getResults(fineGrid, iT); +} +\end{minted} +\caption{Beispielhafte Nutzung von \class{Grid2D}} +\label{lst:RefinementUsageExample} +\end{listing} + +Wie in diesem leicht vereinfachten Listing zu sehen, kann Gitterverfeinerung mit dem beschriebenen Framework schon erfreulich kompakt formuliert werden. Tatsächlich fehlt zum Etappenziel der einzeilig aktivierbaren manuell positionierten Gitterverfeinerung nur eine weitere Abstraktion von von \method{prepareGeometry} und \method{prepareLattice}. + +\bigskip +Zur umfassenden Beschreibung des Gitterverfeinerungsframework fehlt uns jetzt nur noch die Definition der \class{Coupler2D} Objekte. Da diese die Einzelheiten des Verfeinerungsverfahrens umsetzen, werden sie im Rahmen des folgenden Kapitels zur Implementierung des Verfahrens von Lagrava et al. näher beleuchtet werden. + \newpage \subsection{Umsetzung des Verfahrens von Lagrava et al.} +\begin{listing}[H] +\inputminted[fontsize=\footnotesize,mathescape]{cpp}{code/coupler2d.cpp} +\caption{Gemeinsame Struktur beider Übergangsrichtungen} +\end{listing} + +\begin{listing}[H] +\inputminted[fontsize=\footnotesize,mathescape]{cpp}{code/fineCoupler2d.cpp} +\caption{Struktur des Kopplers von grob nach fein} +\end{listing} + +\begin{listing}[H] +\inputminted[fontsize=\footnotesize,mathescape]{cpp}{code/coarseCoupler2d.cpp} +\caption{Struktur des Kopplers von fein nach grob} +\end{listing} + \newpage \section{Evaluierung} -- cgit v1.2.3