dlaczego? (1) dlaczego? (2) Modelowanie numeryczne w fizyce atmosfery Sylwester Arabas (ćwiczenia do wykładu dr. hab. inż. Lecha Łobockiego) Instytut Geofizyki, Wydział Fizyki Uniwersytetu Warszawskiego 20. października 2011 r.
O zajęciach Prowadzący dlaczego? (1) dlaczego? (2) o mnie: http://www.igf.fuw.edu.pl/ slayoo/ kontakt: sarabas@igf.fuw.edu.pl / pok. 424A, IV piętro IGF (w ramach pracowni geofizycznej) Całkowanie numeryczne równania adwekcji z wykorzystaniem obliczeń równoległych Zasady zaliczenia, napisanie programu, programu testującego, dokumentacji programu i raportu z doświadczenia numerycznego język: dowolny obiektowy (, Python, Fortran 90... ) na ćwiczeniach/konsultacjach: przykłady w Materiały do ćwiczeń http://www.igf.fuw.edu.pl/ slayoo/mnfa2011/
(w kontekście pracowni geofiz.) dlaczego? (1) dlaczego? (2) organizacja ćwiczeń: 6 2h (z 24h reszta samodzielnie) części składowe projektu (termin: 4 tyg. od ostatnich ćw.): program (może być kod prezentowany na ćwiczeniach) całkowanie 1-wymiarowego równania adwekcji co najmniej dwoma schematami (np. upsteam, leapfrog, MPDATA) możliwość wykonania obliczeń w trybie szeregowym lub równoległym (np. OpenMP, wątki, procesy, MPI) wybór schematu całkowania, dokładności numerycznej (float/double/...), metody zrównoleglenia i parametrów domeny bez potrzeby rekompilacji np. opcje linii komend program/skrypt testujący (- -) automatyczna weryfikacja poprawności obliczeń (np. dla C=1) dla szeregu kombinacji wartości parametrów programu dokumentacja programu np. na podstawie komentarzy w kodzie raport z doświadczenia numerycznego porównanie odstępstw od rozwiązania analitycznego dla różnych schematów całkowania i różnych liczb Couranta porównanie czasu wykonania programu dla różnych metod zrównoleglenia i różnych rozmiarów domeny
(w kontekście pracowni geofiz.) dlaczego? (1) dlaczego? (2) organizacja ćwiczeń: 6 2h (z 24h reszta samodzielnie) części składowe projektu (termin: 4 tyg. od ostatnich ćw.): program (może być kod prezentowany na ćwiczeniach) całkowanie 1-wymiarowego równania adwekcji co najmniej dwoma schematami (np. upsteam, leapfrog, MPDATA) możliwość wykonania obliczeń w trybie szeregowym lub równoległym (np. OpenMP, wątki, procesy, MPI) wybór schematu całkowania, dokładności numerycznej (float/double/...), metody zrównoleglenia i parametrów domeny bez potrzeby rekompilacji np. opcje linii komend program/skrypt testujący (- -) automatyczna weryfikacja poprawności obliczeń (np. dla C=1) dla szeregu kombinacji wartości parametrów programu dokumentacja programu np. na podstawie komentarzy w kodzie raport z doświadczenia numerycznego porównanie odstępstw od rozwiązania analitycznego dla różnych schematów całkowania i różnych liczb Couranta porównanie czasu wykonania programu dla różnych metod zrównoleglenia i różnych rozmiarów domeny
(w kontekście pracowni geofiz.) dlaczego? (1) dlaczego? (2) organizacja ćwiczeń: 6 2h (z 24h reszta samodzielnie) części składowe projektu (termin: 4 tyg. od ostatnich ćw.): program (może być kod prezentowany na ćwiczeniach) całkowanie 1-wymiarowego równania adwekcji co najmniej dwoma schematami (np. upsteam, leapfrog, MPDATA) możliwość wykonania obliczeń w trybie szeregowym lub równoległym (np. OpenMP, wątki, procesy, MPI) wybór schematu całkowania, dokładności numerycznej (float/double/...), metody zrównoleglenia i parametrów domeny bez potrzeby rekompilacji np. opcje linii komend program/skrypt testujący (- -) automatyczna weryfikacja poprawności obliczeń (np. dla C=1) dla szeregu kombinacji wartości parametrów programu dokumentacja programu np. na podstawie komentarzy w kodzie raport z doświadczenia numerycznego porównanie odstępstw od rozwiązania analitycznego dla różnych schematów całkowania i różnych liczb Couranta porównanie czasu wykonania programu dla różnych metod zrównoleglenia i różnych rozmiarów domeny
(w kontekście pracowni geofiz.) dlaczego? (1) dlaczego? (2) organizacja ćwiczeń: 6 2h (z 24h reszta samodzielnie) części składowe projektu (termin: 4 tyg. od ostatnich ćw.): program (może być kod prezentowany na ćwiczeniach) całkowanie 1-wymiarowego równania adwekcji co najmniej dwoma schematami (np. upsteam, leapfrog, MPDATA) możliwość wykonania obliczeń w trybie szeregowym lub równoległym (np. OpenMP, wątki, procesy, MPI) wybór schematu całkowania, dokładności numerycznej (float/double/...), metody zrównoleglenia i parametrów domeny bez potrzeby rekompilacji np. opcje linii komend program/skrypt testujący (- -) automatyczna weryfikacja poprawności obliczeń (np. dla C=1) dla szeregu kombinacji wartości parametrów programu dokumentacja programu np. na podstawie komentarzy w kodzie raport z doświadczenia numerycznego porównanie odstępstw od rozwiązania analitycznego dla różnych schematów całkowania i różnych liczb Couranta porównanie czasu wykonania programu dla różnych metod zrównoleglenia i różnych rozmiarów domeny
(w kontekście pracowni geofiz.) dlaczego? (1) dlaczego? (2) organizacja ćwiczeń: 6 2h (z 24h reszta samodzielnie) części składowe projektu (termin: 4 tyg. od ostatnich ćw.): program (może być kod prezentowany na ćwiczeniach) całkowanie 1-wymiarowego równania adwekcji co najmniej dwoma schematami (np. upsteam, leapfrog, MPDATA) możliwość wykonania obliczeń w trybie szeregowym lub równoległym (np. OpenMP, wątki, procesy, MPI) wybór schematu całkowania, dokładności numerycznej (float/double/...), metody zrównoleglenia i parametrów domeny bez potrzeby rekompilacji np. opcje linii komend program/skrypt testujący (- -) automatyczna weryfikacja poprawności obliczeń (np. dla C=1) dla szeregu kombinacji wartości parametrów programu dokumentacja programu np. na podstawie komentarzy w kodzie raport z doświadczenia numerycznego porównanie odstępstw od rozwiązania analitycznego dla różnych schematów całkowania i różnych liczb Couranta porównanie czasu wykonania programu dla różnych metod zrównoleglenia i różnych rozmiarów domeny
Schemat całkowania upstream równanie adwekcji pola ψ dla stałej prędkości u dlaczego? (1) dlaczego? (2) ψ t = u x ψ ψ t C = u t x = u ψ x (l. Couranta) schemat całkowania numerycznego upstream / upwind ψ n+1 i = ψ n i C ( ) ψ n i ψi 1 n C > 0 ( ) ψ n i+1 ψi n C 0
dlaczego? (1) dlaczego? (2) 43 for (int n=0; n < 2; ++n) psi[n] = new Array<quant, 44 adv_upstream *adv = new adv_upstream(); szkic 45 kodu 46 // initial condition 47 (*psi[0])(range(nx/4, nx/2)) = 1; 48 49 // integration loop 50 for (int t = 0; t < nt; ++t) 51 { 52 // output 53 cout << *psi[0] << endl << endl; 54 55 // copying data from psi[n] -> psi[n+1] 56 *psi[1] = *psi[0]; 57 58 // periodic boundary 59 (*psi[1])(range(-1)) = (*psi[0])(range(nx-1)); 60 (*psi[1])(range(nx)) = (*psi[0])(range(0)); 61 62 // advection operator 63 adv->op(psi, Range(0, nx-1), 0, C); 64 65 // swapping arrays 66 cyclearrays(*psi[0], *psi[1]); 67 } 68 }
przykładowy wykres: (> call cw1.gpi ) dlaczego? (1) dlaczego? (2)
Dlaczego? (a nie FORTRAN) (1/2) w kontekście naszych ćwiczeń dlaczego? (1) dlaczego? (2) doświadczenia z zajęć z na Hożej dostępność bezpłatnych, otwartych i aktualnie rozwijanych bibliotek: do analizy wymiarowej kodu podczas kompilacji (każda zmienna/stała/wyrażenie mają przyporządkowane jednostki fizyczne, których spójność jest sprawdzana w czasie kompilacji, bez wpływu na wydajność kodu wynikowego) do czytelnego (dla człowieka) i łatwego do optymalizacji (dla kompilatora) opisywania operacji na macierzach bez użycia pętli (integralna część języka w Fortranie 90) do obliczeń równoległych (wątki, procesy, OpenMP, MPI) wygodne mechanizmy podziału kodu programu na części (klasy, wzorce), interakcji z systemem operacyjnym (POSIX) i obsługi błędów (wyjątki) od autora (B. Stroustrup, ref. na slajdzie )... physics... is a field where performance is essential. If a program in this field is significantly slower than a conventional Fortran program, it will be discarded.... and modern programming techniques have met that challenge. Using generic programming techniques, vector and matrix libraries have equaled and exceeded the performance of classical Fortran code (for example, POOMA, MTL and ROOT).
Dlaczego? (a nie FORTRAN) (1/2) w kontekście naszych ćwiczeń dlaczego? (1) dlaczego? (2) doświadczenia z zajęć z na Hożej dostępność bezpłatnych, otwartych i aktualnie rozwijanych bibliotek: do analizy wymiarowej kodu podczas kompilacji (każda zmienna/stała/wyrażenie mają przyporządkowane jednostki fizyczne, których spójność jest sprawdzana w czasie kompilacji, bez wpływu na wydajność kodu wynikowego) do czytelnego (dla człowieka) i łatwego do optymalizacji (dla kompilatora) opisywania operacji na macierzach bez użycia pętli (integralna część języka w Fortranie 90) do obliczeń równoległych (wątki, procesy, OpenMP, MPI) wygodne mechanizmy podziału kodu programu na części (klasy, wzorce), interakcji z systemem operacyjnym (POSIX) i obsługi błędów (wyjątki) od autora (B. Stroustrup, ref. na slajdzie )... physics... is a field where performance is essential. If a program in this field is significantly slower than a conventional Fortran program, it will be discarded.... and modern programming techniques have met that challenge. Using generic programming techniques, vector and matrix libraries have equaled and exceeded the performance of classical Fortran code (for example, POOMA, MTL and ROOT).
Dlaczego? (a nie FORTRAN) (1/2) w kontekście naszych ćwiczeń dlaczego? (1) dlaczego? (2) doświadczenia z zajęć z na Hożej dostępność bezpłatnych, otwartych i aktualnie rozwijanych bibliotek: do analizy wymiarowej kodu podczas kompilacji (każda zmienna/stała/wyrażenie mają przyporządkowane jednostki fizyczne, których spójność jest sprawdzana w czasie kompilacji, bez wpływu na wydajność kodu wynikowego) do czytelnego (dla człowieka) i łatwego do optymalizacji (dla kompilatora) opisywania operacji na macierzach bez użycia pętli (integralna część języka w Fortranie 90) do obliczeń równoległych (wątki, procesy, OpenMP, MPI) wygodne mechanizmy podziału kodu programu na części (klasy, wzorce), interakcji z systemem operacyjnym (POSIX) i obsługi błędów (wyjątki) od autora (B. Stroustrup, ref. na slajdzie )... physics... is a field where performance is essential. If a program in this field is significantly slower than a conventional Fortran program, it will be discarded.... and modern programming techniques have met that challenge. Using generic programming techniques, vector and matrix libraries have equaled and exceeded the performance of classical Fortran code (for example, POOMA, MTL and ROOT).
Dlaczego? (a nie FORTRAN) (1/2) w kontekście naszych ćwiczeń dlaczego? (1) dlaczego? (2) doświadczenia z zajęć z na Hożej dostępność bezpłatnych, otwartych i aktualnie rozwijanych bibliotek: do analizy wymiarowej kodu podczas kompilacji (każda zmienna/stała/wyrażenie mają przyporządkowane jednostki fizyczne, których spójność jest sprawdzana w czasie kompilacji, bez wpływu na wydajność kodu wynikowego) do czytelnego (dla człowieka) i łatwego do optymalizacji (dla kompilatora) opisywania operacji na macierzach bez użycia pętli (integralna część języka w Fortranie 90) do obliczeń równoległych (wątki, procesy, OpenMP, MPI) wygodne mechanizmy podziału kodu programu na części (klasy, wzorce), interakcji z systemem operacyjnym (POSIX) i obsługi błędów (wyjątki) od autora (B. Stroustrup, ref. na slajdzie )... physics... is a field where performance is essential. If a program in this field is significantly slower than a conventional Fortran program, it will be discarded.... and modern programming techniques have met that challenge. Using generic programming techniques, vector and matrix libraries have equaled and exceeded the performance of classical Fortran code (for example, POOMA, MTL and ROOT).
Dlaczego? (a nie FORTRAN) (1/2) w kontekście naszych ćwiczeń dlaczego? (1) dlaczego? (2) doświadczenia z zajęć z na Hożej dostępność bezpłatnych, otwartych i aktualnie rozwijanych bibliotek: do analizy wymiarowej kodu podczas kompilacji (każda zmienna/stała/wyrażenie mają przyporządkowane jednostki fizyczne, których spójność jest sprawdzana w czasie kompilacji, bez wpływu na wydajność kodu wynikowego) do czytelnego (dla człowieka) i łatwego do optymalizacji (dla kompilatora) opisywania operacji na macierzach bez użycia pętli (integralna część języka w Fortranie 90) do obliczeń równoległych (wątki, procesy, OpenMP, MPI) wygodne mechanizmy podziału kodu programu na części (klasy, wzorce), interakcji z systemem operacyjnym (POSIX) i obsługi błędów (wyjątki) od autora (B. Stroustrup, ref. na slajdzie )... physics... is a field where performance is essential. If a program in this field is significantly slower than a conventional Fortran program, it will be discarded.... and modern programming techniques have met that challenge. Using generic programming techniques, vector and matrix libraries have equaled and exceeded the performance of classical Fortran code (for example, POOMA, MTL and ROOT).
Dlaczego? (a nie FORTRAN) (1/2) w kontekście naszych ćwiczeń dlaczego? (1) dlaczego? (2) doświadczenia z zajęć z na Hożej dostępność bezpłatnych, otwartych i aktualnie rozwijanych bibliotek: do analizy wymiarowej kodu podczas kompilacji (każda zmienna/stała/wyrażenie mają przyporządkowane jednostki fizyczne, których spójność jest sprawdzana w czasie kompilacji, bez wpływu na wydajność kodu wynikowego) do czytelnego (dla człowieka) i łatwego do optymalizacji (dla kompilatora) opisywania operacji na macierzach bez użycia pętli (integralna część języka w Fortranie 90) do obliczeń równoległych (wątki, procesy, OpenMP, MPI) wygodne mechanizmy podziału kodu programu na części (klasy, wzorce), interakcji z systemem operacyjnym (POSIX) i obsługi błędów (wyjątki) od autora (B. Stroustrup, ref. na slajdzie )... physics... is a field where performance is essential. If a program in this field is significantly slower than a conventional Fortran program, it will be discarded.... and modern programming techniques have met that challenge. Using generic programming techniques, vector and matrix libraries have equaled and exceeded the performance of classical Fortran code (for example, POOMA, MTL and ROOT).
Dlaczego? (a nie FORTRAN) (1/2) w kontekście naszych ćwiczeń dlaczego? (1) dlaczego? (2) doświadczenia z zajęć z na Hożej dostępność bezpłatnych, otwartych i aktualnie rozwijanych bibliotek: do analizy wymiarowej kodu podczas kompilacji (każda zmienna/stała/wyrażenie mają przyporządkowane jednostki fizyczne, których spójność jest sprawdzana w czasie kompilacji, bez wpływu na wydajność kodu wynikowego) do czytelnego (dla człowieka) i łatwego do optymalizacji (dla kompilatora) opisywania operacji na macierzach bez użycia pętli (integralna część języka w Fortranie 90) do obliczeń równoległych (wątki, procesy, OpenMP, MPI) wygodne mechanizmy podziału kodu programu na części (klasy, wzorce), interakcji z systemem operacyjnym (POSIX) i obsługi błędów (wyjątki) od autora (B. Stroustrup, ref. na slajdzie )... physics... is a field where performance is essential. If a program in this field is significantly slower than a conventional Fortran program, it will be discarded.... and modern programming techniques have met that challenge. Using generic programming techniques, vector and matrix libraries have equaled and exceeded the performance of classical Fortran code (for example, POOMA, MTL and ROOT).
Dlaczego? (a nie FORTRAN) (2/2) Numerical Recipes (http://nr.com/) dlaczego? (1) dlaczego? (2)... the Third Edition... Its code is wholeheartedly object oriented, demonstrating diverse techniques for using the full power of.... Numerical Recipes in Fortran 90 (Second Edition) and Numerical Recipes in Fortran 77 (Second Edition) will be available for a short while after the Third Edition is published, but these too are planned to go out of print eventually. LLNL (https://computation.llnl.gov/casc/sundials/)... a general movement away from FORTRAN and toward C in scientific computing is apparent. CERN (np. http://root.cern.ch/)... CERN itself use and have created a code base of an estimated 50 million lines of code. Tens years, thousands of developers. About 10,000 people using... OpenFOAM (http://openfoam.com/)... inheritance, template classes, virtual functions and operator overloading. These features are not available in many languages that purport to be object-orientated but actually have very limited object-orientated capability, such as FORTRAN-90., however, possesses all these features...
Dlaczego? (a nie FORTRAN) (2/2) Numerical Recipes (http://nr.com/) dlaczego? (1) dlaczego? (2)... the Third Edition... Its code is wholeheartedly object oriented, demonstrating diverse techniques for using the full power of.... Numerical Recipes in Fortran 90 (Second Edition) and Numerical Recipes in Fortran 77 (Second Edition) will be available for a short while after the Third Edition is published, but these too are planned to go out of print eventually. LLNL (https://computation.llnl.gov/casc/sundials/)... a general movement away from FORTRAN and toward C in scientific computing is apparent. CERN (np. http://root.cern.ch/)... CERN itself use and have created a code base of an estimated 50 million lines of code. Tens years, thousands of developers. About 10,000 people using... OpenFOAM (http://openfoam.com/)... inheritance, template classes, virtual functions and operator overloading. These features are not available in many languages that purport to be object-orientated but actually have very limited object-orientated capability, such as FORTRAN-90., however, possesses all these features...
Dlaczego? (a nie FORTRAN) (2/2) Numerical Recipes (http://nr.com/) dlaczego? (1) dlaczego? (2)... the Third Edition... Its code is wholeheartedly object oriented, demonstrating diverse techniques for using the full power of.... Numerical Recipes in Fortran 90 (Second Edition) and Numerical Recipes in Fortran 77 (Second Edition) will be available for a short while after the Third Edition is published, but these too are planned to go out of print eventually. LLNL (https://computation.llnl.gov/casc/sundials/)... a general movement away from FORTRAN and toward C in scientific computing is apparent. CERN (np. http://root.cern.ch/)... CERN itself use and have created a code base of an estimated 50 million lines of code. Tens years, thousands of developers. About 10,000 people using... OpenFOAM (http://openfoam.com/)... inheritance, template classes, virtual functions and operator overloading. These features are not available in many languages that purport to be object-orientated but actually have very limited object-orientated capability, such as FORTRAN-90., however, possesses all these features...
Dlaczego? (a nie FORTRAN) (2/2) Numerical Recipes (http://nr.com/) dlaczego? (1) dlaczego? (2)... the Third Edition... Its code is wholeheartedly object oriented, demonstrating diverse techniques for using the full power of.... Numerical Recipes in Fortran 90 (Second Edition) and Numerical Recipes in Fortran 77 (Second Edition) will be available for a short while after the Third Edition is published, but these too are planned to go out of print eventually. LLNL (https://computation.llnl.gov/casc/sundials/)... a general movement away from FORTRAN and toward C in scientific computing is apparent. CERN (np. http://root.cern.ch/)... CERN itself use and have created a code base of an estimated 50 million lines of code. Tens years, thousands of developers. About 10,000 people using... OpenFOAM (http://openfoam.com/)... inheritance, template classes, virtual functions and operator overloading. These features are not available in many languages that purport to be object-orientated but actually have very limited object-orientated capability, such as FORTRAN-90., however, possesses all these features...
: polecana Bjarne Stroustrup 1 (autor, AT&T) The Programming Language Paweł Klimczewski 2 (FUW/IFT/KMMF) Programowanie w języku w środowisku systemu UNIX S. Paoli et al. (CERN) CERN Coding Standard Spec. 3 dlaczego? (1) dlaczego? (2) 1: strona domowa BS: http://www.research.att.com/ bs/ 2: wykłady o na stronie domowej PK: http://www.fuw.edu.pl/ pablo/programowanie1/wyklad.php 3: http://pst.cern.ch/handbookworkbook/handbook/programming/codingstandard/c++standard.pdf
Kompilatory w sieci pracowniczej IGF otwarte/bezpłatne dostępne na wizardzie LLVM Clang: clang++ (/APPS/llvm/bin/clang++) GNU Compiler Collection: g++ 4.3.3 (obsługuje OpenMP) (/opt/gcc/gcc-4.3.3/bin/g++) GNU Compiler Collection: g++ 4.1.2 (/usr/bin/g++) dlaczego? (1) dlaczego? (2) kompilacja do obliczeń równoległych przy użyciu MPI OpenMPI + g++ 4.3.3 (/opt/openmpi/bin/mpic++) MPICH2 + g++ 4.3.3 (/EXPORT/gdl/Linux-x86 64/bin/mpic++) LAM/MPI + g++ 4.3.3 (/opt/lam-mpi/bin/mpic++)
: przeciążanie operatorów dlaczego? (1) dlaczego? (2) przykład: «strawne dla a ~/Private/IGF-PhD/Dydaktyka/MNFA2011/cwiczenia/Cwiczenie_1/kod/cw1.cpp.html 1 # include <boost/units/systems/si.hpp> 2 using namespace boost::units; 3 4 # include <blitz/array.h> 5 using namespace blitz; 6 7 typedef double real_t; 8 typedef quantity<si::dimensionless, real_t> quant; 9 10 /// -digestible output for Blitz 11 ostream& operator<<(ostream& os, const Array<quant, 1>& x) 12 { 13 for (int i=x.lbound(0); i<=x.ubound(0); ++i) os << real_t(x(i)) << endl; 14 return os; 15 } 16 17 // advection operator 18 class adv_upstream 19 { 20 public: void op(array<quant, 1> *psi[], const Range &i, 21 int n, const quantity<si::dimensionless, real_t> &C) 22 { 23 (*psi[n+1])(i) -= C * ( 10/19/
dlaczego? (1) dlaczego? (2) 9 10 /// -digestible output for Blitz 11 ostream& operator<<(ostream& os, const Array<quant, 1>& x) 12 { 13 for (int i=x.lbound(0); i<=x.ubound(0); ++i) os << real_t(x( 14 return os; 15 } : 16 17 // advection operator 18 class adv_upstream 19 { 20 public: void op(array<quant, 1> *psi[], const Range &i, 21 int n, const quantity<si::dimensionless, real_t> &C) 22 { 23 (*psi[n+1])(i) -= C * ( 24 C > 0. 25? (*psi[n])(i) - (*psi[n])(i-1) 26 : (*psi[n])(i+1) - (*psi[n])(i) 27 ); 28 } 29 }; 30 przykład: schemat adwekcyjny upstream 31 // main 32 int main() 33 { (ψi n ψi 1) n C > 0 34 // parameters (FIXME: should be taken from command-line opti ψ n+1 i = ψ n i C (ψ n i+1 ψ n i ) C 0 35 int nx = 32, nt = 64; 36 quantity<si::length, real_t> dx = 1 * si::metres; 37 quantity<si::time, real_t> dt = 1 * si::seconds; 38 quantity<si::velocity, real_t> u = -.1 * si::metres / si::se 39 quantity<si::dimensionless, real_t> C = u * dt / dx;
Stroustrup: Programming Styles and Libraries 1 dlaczego? (1) dlaczego? (2) Without a good library, most interesting tasks are hard to do in ; but given a good library, almost any task can be made easy. Here easy means that the programming language isn t a source of significant complexity so that a programmer can concentrate on the fundamental problems of the task in hand. 1 http://www2.research.att.com/ bs/style and libraries.pdf
dlaczego? (1) dlaczego? (2) 18 class adv_upstream 18 class adv_upstream 19 19 { 20 : public: void wydajne op(array<quant, (optymalizacja 1> *psi[], const przez Range &i, kompilator) 21 20 public: int n, void const op(array<quant, quantity<si::dimensionless, 1> *psi[], const real_t> Range &C) &i, 22 21 int n, const quantity<si::dimensionless, real_t> &C) 22 i czytelne { (dla człowieka) operacje macierzowe 23 (*psi[n+1])(i) -= 24 23 (*psi[n+1])(i) 0. -= C * ( 25 24 C > (*psi[n])(i) 0. - (*psi[n])(i-1) 26 25? (*psi[n])(i+1) (*psi[n])(i) - - (*psi[n])(i-1) (*psi[n])(i) 27 26 ); : (*psi[n])(i+1) - (*psi[n])(i) 28 27 ); 29 28 }; } 30 29 }; 31 30 1 // # main include <boost/units/systems/si.hpp> dokumentacja: http://www.oonumerics.org/blitz/docs/ podobne w : Boost.MultiArray, Armadillo, MTL,... w innych językach: część Fortrana 90,... a przykład: 32 31 2 int using // main main() namespace alokacjaboost::units; dwóch tablic i warunek początkowy 33 32 3 { int main() 34 33 4 #{ // include parameters <blitz/array.h> (FIXME: should be taken from command-line options) 35 34 5 using int // parameters nx namespace = 32, nt blitz; (FIXME: = 64; should be taken from command-line options) 36 35 6 quantity<si::length, int nx = 32, = 64; real_t> dx = 1 * si::metres; 37 36 7 typedef quantity<si::time, quantity<si::length, double real_t; real_t> real_t> dt dx = 1 = * 1 si::seconds; * si::metres; 38 37 8 typedef quantity<si::velocity, quantity<si::time, quantity<si::dimensionless, real_t> real_t> dt = u 1 = real_t> *-.1 si::seconds; * si::metres quant; / si::seconds; 39 38 9 quantity<si::dimensionless, quantity<si::velocity, real_t> real_t> u = -.1 C = * u si::metres * dt / dx; / si::seconds;. 40 10. 39. /// quantity<si::dimensionless, -digestible output for real_t> BlitzC = u * dt / dx; 41 11 40 ostream& // memory operator<<(ostream& allocation (FIXME: os, no const deallocation Array<quant, yet!) 1>& x) 42 12 41 { Array<quant, // memory allocation 1> *psi[2]; (FIXME: no deallocation yet!) 43 13 42 for Array<quant, (int n=0; i=x.lbound(0); 1> n < *psi[2]; 2; ++n) i<=x.ubound(0); psi[n] = new Array<quant, ++i) os << real_t(x(i)) 1>(Range(-1,nx)); << endl; 44 14 43 adv_upstream return for (int os; n=0; *adv n < = 2; new ++n) adv_upstream(); psi[n] = new Array<quant, 1>(Range(-1,nx));. 45 15. 44. } adv_upstream *adv = new adv_upstream(); 46 16 45 // initial condition 47 17 46 //(*psi[0])(range(nx/4, advection initial operator condition nx/2)) = 1; 48 18 47 class (*psi[0])(range(nx/4, adv_upstream nx/2)) = 1; 49 19 48 { // integration loop 50 20 49 for public: // integration (int void t = 0; op(array<quant, loop t < nt; ++t) 1> *psi[], const Range &i, 51 21 50 a dla { for Pythona int (int n, istnieje const t = np. 0; numexpr quantity<si::dimensionless, t < nt; (http://code.google.com/p/numexpr/) ++t) real_t> ale tu &C) optymalizacja następuje w czasie 52 22 51 wykonania, { // output a nie w czasie kompilacji mniej wydajne; dla 53 23 52 C# istnieje cout (*psi[n+1])(i) // np. output << dynmatrixmath *psi[0] -= (http://www.codeproject.com/kb/recipes/dynmatrixmath.aspx) << C endl * ( << endl; 54 24 53 cout C > << 0. *psi[0] << endl << endl;
dlaczego? (1) dlaczego? (2) 11 ostream& operator<<(ostream& os, const Array<quant, 1>& x) 12 { 13 for (int i=x.lbound(0); i<=x.ubound(0); ++i) os << real_t(x(i)) << endl 14 return os; 15 } 16 17 // advection operator : analiza wymiarowa podczas kompilacji dokumentacja: http://www.boost.org/doc/libs/release/libs/units/ 18 class adv_upstream 19 { 20 public: void op(array<quant, 1> *psi[], const Range &i, 21 int n, const quantity<si::dimensionless, real_t> odpowiedniki w innych językach: brak? 2 &C) 22 { 23 (*psi[n+1])(i) -= C * ( 24 C > 0. przykład: 25 liczba? (*psi[n])(i) Couranta, - (*psi[n])(i-1) X, t, U 26 : (*psi[n])(i+1) - (*psi[n])(i) 27 1 # include ); <boost/units/systems/si.hpp> 28 2 using } namespace boost::units; 29 };. 3 30.. 31 4 #// main include <blitz/array.h> 32 5 using int main() namespace blitz; 33 6 { 34 7 typedef // parameters double (FIXME: real_t; should be taken from command-line options) 35 8 typedef int nx = quantity<si::dimensionless, 32, = 64; real_t> quant; 36 quantity<si::length, real_t> dx = 1 * si::metres; 9 37 quantity<si::time, real_t> dt = 1 * si::seconds; 10 38 /// quantity<si::velocity, -digestible real_t> output u for = -.1 Blitz * si::metres / si::seconds; 11 39 ostream& quantity<si::dimensionless, operator<<(ostream& real_t> os, C const = u * Array<quant, dt / dx; 1>& x) 12 40 { 13 41 // for memory (int allocation i=x.lbound(0); (FIXME: i<=x.ubound(0); no deallocation yet!) ++i) os << real_t(x(i 14 42 Array<quant, return os; 1> *psi[2]; 15 43 } for (int n=0; n < 2; ++n) psi[n] = new Array<quant, 1>(Range(-1,nx)); 44 adv_upstream *adv = new adv_upstream(); 16 2 45 dla Pythona istnieje np. DimPy (http://dimpy.sf.net/), a dla F90 np. PHYSUNITS 17 (http://rime.aos.wisc.edu/gpetty/physunits.html) 46 advection initial condition operator ale ich wykorzystanie wpływa na wydajność obliczeń
Gnuplot: różne wskazówki dlaczego? (1) dlaczego? (2) wykreślanie danych ze standardowego wyjścia innego programu > help special-filenames > plot < for i in {1,3,2}; do echo $i; done; with linesp numery kolumn o specjalnym znaczeniu > help pseudocolumns 0 numer rekordu w zbiorze danych -2 numer zbioru danych prosty wykres 3D przydatny w zadaniu 1 set xlabel "x" 2 set ylabel "t" 3 set zlabel "psi" 4 splot "<./a.out " using 0:-2:1 notitle with lines palette