diff options
-rw-r--r-- | code/coarseCoupler2d.cpp | 8 | ||||
-rw-r--r-- | code/coupler2d.cpp | 27 | ||||
-rw-r--r-- | code/fineCoupler2d.cpp | 15 | ||||
-rw-r--r-- | content.tex | 52 |
4 files changed, 101 insertions, 1 deletions
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 <typename T, template<typename> class DESCRIPTOR> +class CoarseCoupler2D : public Coupler2D<T,DESCRIPTOR> { +public: + CoarseCoupler2D(Grid2D<T,DESCRIPTOR>& coarse, Grid2D<T,DESCRIPTOR>& fine, + Vector<T,2> origin, Vector<T,2> 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 <typename T, template<typename> class DESCRIPTOR> +class Coupler2D { +protected: + Grid2D<T,DESCRIPTOR>& _coarse; + Grid2D<T,DESCRIPTOR>& _fine; + + const int _coarseSize; + const int _fineSize; + const bool _vertical; + + Vector<T,2> _physOrigin; + + const Vector<int,3>& getFineLatticeR(int y) const; + const Vector<int,3>& getCoarseLatticeR(int y) const; + + T getScalingFactor() const; + T getInvScalingFactor() const; + +private: + std::vector<Vector<int,3>> _coarseLatticeR; + std::vector<Vector<int,3>> _fineLatticeR; + +public: + Coupler2D(Grid2D<T,DESCRIPTOR>& coarse, Grid2D<T,DESCRIPTOR>& fine, + Vector<T,2> origin, Vector<T,2> 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 <typename T, template<typename> class DESCRIPTOR> +class FineCoupler2D : public Coupler2D<T,DESCRIPTOR> { +private: + std::vector<T> _c2f_rho; + std::vector<Vector<T,2>> _c2f_u; + std::vector<Vector<T,DESCRIPTOR<T>::q>> _c2f_fneq; + +public: + FineCoupler2D(Grid2D<T,DESCRIPTOR>& coarse, Grid2D<T,DESCRIPTOR>& fine, + Vector<T,2> origin, Vector<T,2> 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<T,DESCRIPTOR> 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}
|