30
living knowledge WWU Münster WESTFÄLISCHE WILHELMS-UNIVERSITÄT MÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 1 /30 Outline Ziele dieser Uebung Eine Matrix-Klasse Dateien Aufgaben Ausblick Christoph Lehrenfeld

Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) · Fuer ein groesseres C++-Programm macht es Sinn Definition und Deklaration von Klassen zu trennen. I Deklarationen wird

Embed Size (px)

Citation preview

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 1 /30

Outline

Ziele dieser Uebung

Eine Matrix-Klasse

Dateien

Aufgaben

Ausblick

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 2 /30

Überblick

Ziele dieser Uebung

Eine Matrix-Klasse

Dateien

Aufgaben

Ausblick

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 3 /30

Einleitung

Wir wenden uns der Implementierung von Datenstrukturen mittelsobjekt-orientierter Programmierung zu.

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 4 /30

Die Ziele dieser Uebung sind

I Projekt-Strukturen mit MakefilesI [C++] Konzept der Vererbung inklusive Ueberladung von

OperatorenI Implementierung einer Matrix-Klasse

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 5 /30

Neue Funktionalitaet

Objekt-orientiertes Programmieren, d.h. Arbeiten mit Klassen,private- und public-Methoden und Attributen und demUeberladen von Methoden.

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 6 /30

Überblick

Ziele dieser Uebung

Eine Matrix-Klasse

Dateien

Aufgaben

Ausblick

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 7 /30

Anforderungen an eine Matrix

Eine Matrix ist eine lineare Abbildung von Rn nach Rm

D.h. sie realisiert eine Operation “Matrix-Vektor-Multiplikation” mitdem Eingang “Vektor der Laenge n” und dem Ausgang “Vektor derLaenge m”.

I Mit Matrizen koennen zusaetzliche Operationen realisiertwerden (transponierte Multiplikation, Inverse, Determinante).

I Wir fordern jedoch fuer eine Implementierung zunaechst nurdie lineare Abbildung!

I Wir nehmen an, dass die Vektoren vom Typstd::valarray<double> sind. Wir werden dies spaeterverallgemeinern (Templates..).

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 8 /30

Klassen in C++

Klassen kapseln Funktionalitaet und bilden diese ab. Fuer dieMatrix-Klasse erwarten wir:

I Einen Konstruktor (der eine Matrix erzeugt)I Eine Funktion Rows(), die die Anzahl der Zeilen zurueckgibtI Eine Funktion Cols(), die die Anzahl der Spalten zurueckgibtI Eine Funktion Mult(... ,... ), die die Abbildung

ausfuehrt

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 9 /30

Klassen in C++

Zum Beispiel koennte diese Klasse so aussehen:

class Matrixpublic:

// constructor (creates an object based on input arguments)Matrix();// returns number of colsint Cols() const;// returns number of rowsint Rows() const;// implementation of the multiplicationvoid Mult( const Vector & x, Vector & y ) const;

;

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 10 /30

Aufteilen von Definition und Deklaration (1)

Definition und Deklaration

Fuer ein groesseres C++-Programm macht es Sinn Definition undDeklaration von Klassen zu trennen.

I Deklarationen wird waehrend der Compile-Zeit benoetigt wird,um zu wissen, dass die Funktionalitaet existiert

I Definition wird erst zur Link-Zeit benoetigt, um dieFunktionalitaet verfuegbar zu haben

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 11 /30

Aufteilen von Definition und Deklaration (2)

Datei-Endungen

I Deklarationen werden ueblicherweise in header-Dateien mitder Endung .hh (oder .h oder .hpp) hinterlegt.

I Definition werden ueblicherweise in Dateien mit der Endung.cc (oder .cpp) hinterlegt.

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 12 /30

matrix.h (1)

1 // This file is part of the Praktikum zur Vorl. Num. PDGL, Wintersemester 2015/20162 // http://dune-project.uni-muenster.de/repos/projects/praktikum-numpde-2015-2016.git3 // Copyright holders: Christoph Lehrenfeld, Felix Schindler4 // License: BSD 2-Clause License (http://opensource.org/licenses/BSD-2-Clause)56 #pragma once78 #include <valarray>9 #include <iostream>

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 13 /30

matrix.h (2)

10 typedef std::valarray<double> Vector;1112 class Matrix13 14 public:15 // constructor (creates an object based on input arguments)16 Matrix();17 // returns number of cols18 int Cols() const;19 // returns number of rows20 int Rows() const;21 // implementation of the multiplication22 void Mult( const Vector & x, Vector & y ) const;23 ;

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 14 /30

matrix.cc (1)

Zunaechst rufen wir uns die Definition aus matrix.hh hervor mit#include:

1 // This file is part of the Praktikum zur Vorl. Num. PDGL, Wintersemester 2015/20162 // http://dune-project.uni-muenster.de/repos/projects/praktikum-numpde-2015-2016.git3 // Copyright holders: Christoph Lehrenfeld, Felix Schindler4 // License: BSD 2-Clause License (http://opensource.org/licenses/BSD-2-Clause)56 #include "matrix.hh"

und implementieren dann die erforderlichen Methoden..

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 15 /30

matrix.cc (2) - Der Konstruktor

Zunaechst macht der Konstruktor gar nichts spannendes:

7 Matrix::Matrix()8 9 std::cout << " I am creating an empty object of class \"Matrix\" " << std::endl;

10

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 16 /30

matrix.cc (3) - Member-Funktionen Cols=/=Rows

Die Rueckgabe-Funktionen Cols() und Rows() geben nur dieDimensionen zurueck. Diese Funktionen sind als const markiert,d.h. es ist garantiert, dass innerhalb der Methode wird dasaufrufende Objekt nicht veraendert.

11 int Matrix::Cols() const12 13 return 0;14 1516 int Matrix::Rows() const17 18 return 0;19

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 17 /30

matrix.cc (4) - Member-Funktion Mult

Die Kern-Funktion der Matrix-Klasse ist Mult welche die lineareAbbildung realisiert. Auch diese Funktion aendert die Matrix nicht.

20 void Matrix::Mult(const Vector & x, Vector & y) const21 22 if (Cols() == Rows())23 y = x;24 else25 26 std::cerr << " no meaningful implementation of Mult, yet. " << std::endl;27 y = 0.0;28 29

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 18 /30

main.cc (1)Wir benutzen ein Minimal-Programm um unsere Implementierungzu testen. Hier inkludieren wir die neue Funktionalitaet ausmatrix.hh1 // This file is part of the Praktikum zur Vorl. Num. PDGL, Wintersemester 2015/20162 // http://dune-project.uni-muenster.de/repos/projects/praktikum-numpde-2015-2016.git3 // Copyright holders: Christoph Lehrenfeld, Felix Schindler4 // License: BSD 2-Clause License (http://opensource.org/licenses/BSD-2-Clause)56 #include <iostream>7 #include <fstream>8 #include <vector>9 #include <cmath>

1011 #include "matrix.hh"1213 using namespace std;

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 19 /30

main.cc (2)Als Minimal-Beispiel betrachten wir die Funktion

14 int main(int argc, char* argv[])15 16 Matrix A;17 Vector y(10);18 Vector x(10);19 x = 1.0;20 cout << "A.Rows() = " << A.Rows() << endl;2122 A.Mult(x,y);23 cout << "x = " << endl;;24 for (auto entry : x )25 cout << entry << endl;26

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 20 /30

Das Makefile

1 CXX_FLAGS = -O0 -Wall -g --std=c++0x23 PROGS=main45 all: $(PROGS)67 clean: ; rm -f *.o data* *.unc-* $(PROGS)8 uncrustify: ; uncrustify -c uncrust.cfg --replace *.hh *.cc9

10 %.o: %.cc; $(CXX) -c $< $(CXX_FLAGS)1112 OBJECTS = matrix.o main.o1314 default:1516 main: $(OBJECTS); $(CXX) -o $@ $(OBJECTS) $(CXX_FLAGS)

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 21 /30

Überblick

Ziele dieser Uebung

Eine Matrix-Klasse

Dateien

Aufgaben

Ausblick

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 22 /30

Ausgangspunkt fuer diese Uebung

Wir beginnen diese Uebung von Null. Die oben ausgefuehrtenProgrammzeilen sind zusammengepackt zur Verfuegung gestellt,sowie die obige Dokumentation in unterschiedlichen Formaten:

I lesson03_src.tar.gzI matrix.pdfI matrix.beamer.pdfI matrix.html

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 23 /30

Überblick

Ziele dieser Uebung

Eine Matrix-Klasse

Dateien

Aufgaben

Ausblick

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 24 /30

Programmierung (1):

Wir wollen verschiedene Arten von Matrizen zulassen. Und Dafuereine Basis-Klasse verwenden. Diese soll Matrix heissen. MachenSie die Klasse abstrakt.

I Von abstrakten Klassen koennen keine Objekte erzeugtwerden.

I Hierfuer genuegt es eine Methode als abstrakt zu definieren:

virtual void Mult( const Vector & x, Vector & y ) const = 0;

D.h. es wird keine Implementierung der Funktion dieser Klassegeben. virtual reicht die Definition der Klasse an Kinder-Klassenweiter

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 25 /30

Programmierung(2):

Schreiben Sie eine Matrix-Klasse, die der Einheitsmatrix einergegebenen Groesse implementiert.

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 26 /30

Programmierung(3):

Ueberladen Sie den Operator * (operator*) indem Sie auf Multumleiten:

Vector operator* (const Matrix & A, const Vector & x)

Vector y(A.Rows());A.Mult(x,y);return y;

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 27 /30

Programmierung(4):

Gegeben seien die Gitterweite h, die Anzahl der Zellen N (oderPunkte n = N + 1). Schreiben Sie jeweils eine Matrix-Klasse fuer:

I Eine Finite-Differenzen Approximation von−aδxxI Eine Finite-Differenzen Approximation von−bδx

(links/rechts/zentral)I Eine Finite-Differenzen Approximation fuer−aδxx + bδx mit der

“guten” Wahl aus der letzten Uebung.

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 28 /30

Programmierung(5):

Benutzen Sie die Matrix-Vektor-Darstellung um dasFinite-Differenzen-Problem aus der letzten Uebung erneut zuloesen.

∂tu(x, t)− a ∂xxu(x, t) + b ∂xu(x, t) = f (x, t), x ∈ Ω, t ∈ (0, T ]

D.h. Das Problem laesst sich dann umformulieren zu

∂tu = F − Au− Cu

wobei F ein Vektor, A die Matrix zur Diffusion und C die Matrix zurKonvektion ist.

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 29 /30

Überblick

Ziele dieser Uebung

Eine Matrix-Klasse

Dateien

Aufgaben

Ausblick

Christoph Lehrenfeld

livin

gkn

owle

dge

WW

UM

ünst

er

WESTFÄLISCHEWILHELMS-UNIVERSITÄTMÜNSTER Praktikum zu NumPDGL - Uebung 02 (Convection Diffusion) 30 /30

Diskretisierung / Loeser:

I Finite ElementeI Aufstellen und Loesen von Gleichungssystemen

Christoph Lehrenfeld