Języki Programowania. Dobre praktyki. Wojciech Sobieski

Podobne dokumenty
Języki Programowania. Instrukcje języków programowania. Wojciech Sobieski

Programowanie w języku Python. Grażyna Koba

Języki Programowania. Elementy języków programowania. Wojciech Sobieski

Spis treści. I. Skuteczne. Od autora... Obliczenia inżynierskie i naukowe... Ostrzeżenia...XVII

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Programowanie w Turbo Pascal

Wstęp do programowania

do MATLABa programowanie WYKŁAD Piotr Ciskowski

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

1 Przygotował: mgr inż. Maciej Lasota

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Zad. 5: Układ równań liniowych liczb zespolonych

1 Podstawy c++ w pigułce.

Skrypty i funkcje Zapisywane są w m-plikach Wywoływane są przez nazwę m-pliku, w którym są zapisane (bez rozszerzenia) M-pliki mogą zawierać

Mathcad c.d. - Macierze, wykresy 3D, rozwiązywanie równań, pochodne i całki, animacje

1 Podstawy c++ w pigułce.

Wstęp do programowania

Zad. 3: Układ równań liniowych

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Pętle iteracyjne i decyzyjne

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Podstawy języka C++ Maciej Trzebiński. Praktyki studenckie na LHC IFJ PAN. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. M. Trzebiński C++ 1/16

Analiza leksykalna 1. Teoria kompilacji. Dr inż. Janusz Majewski Katedra Informatyki

Wstęp do programowania. Wykład 1

Elementy języków programowania

WYDZIAŁ ELEKTROTECHNIKI, AUTOMATYKI I INFORMATYKI INSTYTUT AUTOMATYKI I INFORMATYKI KIERUNEK AUTOMATYKA I ROBOTYKA STUDIA STACJONARNE I STOPNIA

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Podstawy MATLABA, cd.

Bash - wprowadzenie. Bash - wprowadzenie 1/39

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

Zmienne i struktury dynamiczne

Podstawy Programowania.

Informacja o języku. Osadzanie skryptów. Instrukcje, komentarze, zmienne, typy, stałe. Operatory. Struktury kontrolne. Tablice.

Programowanie w języku C++ Grażyna Koba

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Zad. 3: Rotacje 2D. Demonstracja przykładu problemu skończonej reprezentacji binarnej liczb

Algorytmika i Programowanie VBA 1 - podstawy

Styl programowania. Olsztyn Wojciech Sobieski

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Podstawy VBA cz. 1. Programowanie komputerowe

Od żłobka do przedszkola - mini szkolenie z użytkowania pakietu OpenFOAM. Karol Wędołowski

Programowanie. programowania. Klasa 3 Lekcja 9 PASCAL & C++

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

Analiza leksykalna 1. Języki formalne i automaty. Dr inż. Janusz Majewski Katedra Informatyki

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Podstawy Programowania

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

//warunki początkowe m=500; T=30; c=0.4; t=linspace(0,t,m); y0=[-2.5;2.5];

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Część 4 życie programu

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 5

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

zajęcia 2 Definiowanie wektorów:

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Podstawy i języki programowania

Podstawy Programowania C++

Projekt 6: Równanie Poissona - rozwiązanie metodą algebraiczną.

Zajęcia nr 1 Podstawy programowania. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

Elementy metod numerycznych - zajęcia 9

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

Podstawy programowania. Wykład 3 Konstrukcje sterujące. Krzysztof Banaś Podstawy programowania 1

System operacyjny Linux

TEST KOŃCOWY DLA KLASY III GIMNAZJUM- POGRAMOWANIE. Szkoła Podstawowa Nr 5. im. Księcia Mazowieckiego Siemowita IV w Gostyninie.

Prof. Danuta Makowiec Instytut Fizyki Teoretycznej i Astrofizyki pok. 353, tel danuta.makowiec at gmail.com

Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD

Python wprowadzenie. Warszawa, 24 marca PROGRAMOWANIE I SZKOLENIA

#include <stdio.h> void main(void) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Podstawy programowania

Wizualizacja danych 2D i 3D - Gnuplot

Podstawy programowania skrót z wykładów:

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Zad. 4: Rotacje 2D. 1 Cel ćwiczenia. 2 Program zajęć. 3 Opis zadania programowego

Programowanie strukturalne i obiektowe

Obliczenia iteracyjne

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Język programowania PASCAL

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Praktyka Programowania

Spis treści WSTĘP CZĘŚĆ I. PASCAL WPROWADZENIE DO PROGRAMOWANIA STRUKTURALNEGO. Rozdział 1. Wybór i instalacja kompilatora języka Pascal

Laboratorium 3: Preprocesor i funkcje ze zmienną liczbą argumentów. mgr inż. Arkadiusz Chrobot

Ćwiczenie 2 Numeryczna symulacja swobodnego spadku ciała w ośrodku lepkim (Instrukcja obsługi interfejsu użytkownika)

Programowanie w C++ Wykład 1. Katarzyna Grzelak. 25 luty K.Grzelak (Wykład 1) Programowanie w C++ 1 / 38

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

Wykład 5. Metoda eliminacji Gaussa

Warsztaty dla nauczycieli

Instrukcje sterujące. Programowanie Proceduralne 1

Przedmiot : Programowanie w języku wewnętrznym. Ćwiczenie nr 4

Język C zajęcia nr 7. Uwagi dotyczące stylu programowania

Pascal. 1. Pliki tekstowe. Przykład 1.1. Zapis do pliku tekstowego

Różniczkowanie numeryczne

Układy równań liniowych. Ax = b (1)

Język ludzki kod maszynowy

I. KARTA PRZEDMIOTU CEL PRZEDMIOTU WYMAGANIA WSTĘPNE W ZAKRESIE WIEDZY, UMIEJĘTNOŚCI I INNYCH KOMPETENCJI EFEKTY KSZTAŁCENIA

Język C : programowanie dla początkujących : przewodnik dla adeptów programowania / Greg Perry, Dean Miller. Gliwice, cop

Transkrypt:

Języki Programowania Dobre praktyki Wojciech Sobieski Olsztyn, 2001-2016

Dobre praktyki zasady pisania kodu źródłowego: poprawiające czytelność ułatwiające wprowadzenie zmian i modyfikacji (nawet po dłuższym czasie) ułatwiające wykorzystywanie tych samych rozwiązań (nawet fragmentów kodu), w różnych programach przyspieszające pisanie programów pozytywnie wpływające na końcową jakość programów... Im więcej aspektów się kontroluje, tym lepsza jest jakość programu! Skromny, działający program jest bardziej użyteczny niż program imponujący, ale niedokończony

jawna deklaracja typów zmiennych program test x = 2.45 y = 3.78 n = x + y print *, n read * end przykład błędnego wyniku (6 zamiast 6.23), będącego skutkiem niejawnej deklaracji typu aby uniknąć podobnych sytuacji należy stosować instrukcję IMPLICIN NONE

kontrola typu wyniku program test implicit none integer(kind=4) :: n = 12 print *, n/3. print *, n/3 read * end przykład wpływu sposobu zapisu liczby na typ wyniku: może prowadzić do błędów

nawiasy program test implicit none real(kind=4) :: x = 1. real(kind=4) :: y = 2. real(kind=4) :: z = 3. print *, x/y*z print *, x/(y*z) read * end przykład błędnych obliczeń wynikających z braku nawiasów

przemyślana i logiczna struktura nazw nazewnictwo adekwatne do dziedziny (np. F, l, zamiast a, b) program test implicit none real(kind=4) :: real(kind=4) :: real(kind=4) :: real(kind=4) :: real(kind=4) :: a = 100. b = 10. c = 2.e-6 d = 2.08e11 e = (a*b)/(c*d) a b c d e przykład złego nazewnictwa identyfikatorów: trudno odgadnąć, co liczy ten program i jakie jest znaczenie poszczególnych zmiennych (w rzeczywistości program liczy wydłużenie pręta na podstawie prawa Hooka) print '(A,F6.2)', 'wynik : ', e*1000. read * end

możliwie krótkie nazwy zmiennych (styl wielbłąda) program test implicit none real(kind=4) :: MaksymalnaTemperaturaRoczna real(kind=4) :: MinimalnaTemperaturaRoczna MaksymalnaTemperaturaRoczna = 32 MinimalnaTemperaturaRoczna = -28 print *, 'zakres = ', MaksymalnaTemperaturaRoczna - MinimalnaTemperaturaRoczna read * end przykład zbyt długich nazw, utrudniających pisanie wyrażeń lepiej by było: T_Rok_Max, T_Rok_Min lub T_max, T_min

jedna instrukcja w jednym wierszu wersja 1: program test;implicit none;real(kind=4)::x(1:20,1:30); integer(kind=4)::i,j;do,i=1,20;do,j=1,30;x(i,j)=0.;enddo;enddo;read *;end wersja 2: program test implicit none real(kind=4) :: x(1:20,1:30) integer(kind=4) :: i,j do, i = 1, 20 do, j = 1, 30 x(i,j)=0. end do end do obie wersje są poprawne, ale druga jest znacznie czytelniejsza read * end

analogiczna symbolika w różnych programach realizujących podobne algorytmy (np. lx, ly, nx, ny, dx, dy, t, dt, n_iter) real(kind=8) real(kind=8) :: lx = 10.0!dlugosc na kierunku x :: ly = 10.0!dlugosc na kierunku y integer(kind=8) :: nx = 50 integer(kind=8) :: ny = 50!liczba komorek siatki na kierunku x!liczba komorek siatki na kierunku y real(kind=8) :: dx!krok na kierunku x real(kind=8) :: dy!krok na kierunku y patrząc na ten fragment kodu, widać, że w programie będzie generowana dwuwymiarowa siatka obliczeniowa (fragment programu Dyfuzja2D)

komentowanie znaczenia zmiennych (najlepiej wraz z jednostką)!wczytanie parametrow zadania: open(unit=1,file='dane/input.dat') read(1,*) ro!gestosc read(1,*) mi!wspolczynnik lepkosci dynamicznej read(1,*) lref!dlugosc charakterystyczna dla liczby Reynoldsa read(1,*) uref!predkosc charakterystyczna dla liczby Reynoldsa read(1,*) alx!aktualna dlugosc domeny w kierunku x read(1,*) aly!aktualna dlugosc domeny w kierunku y... close(1) przykład stosowania opisów zmiennych w miejscu ich odczytywania z pliku: zrobiono tak, gdyż deklaracje zmiennych zapisane są w osobnym pliku tekstowym, dołączanym instrukcją INCLUDE i opisu zmiennych nie widać w głównym kodzie źródłowym (fragment programu Mac)

grupowanie nazw wg logicznych kryteriów integer(kind=8) :: sc_n!liczba zrodel integer(kind=8),allocatable :: sc_i(:)!indeks x komorki, w ktorej ma dzialac zrodlo integer(kind=8),allocatable :: sc_j(:)!indeks y komorki, w ktorej ma dzialac zrodlo integer(kind=8),allocatable :: sc_k(:)!indeks z komorki, w ktorej ma dzialac zrodlo real(kind=8),allocatable :: sc_t_start(:)!poczatkowy czas dzialania zrodla real(kind=8),allocatable :: sc_t_stop(:)!koncowy czas dzialania zrodla real(kind=8),allocatable :: sc_f(:)!wartosc zrodla integer(kind=8) :: sc_l!licznik zrodel przykład grupowania nazw: wszystkie zmienne dotyczące tzw. źródeł (tu: źródeł ciepła) rozpoczynają się od tych samych liter (fragment programu Dyfuzja3D)

deklarowanie zmiennych w blokach tematycznych (np. zmienne dotyczące siatki obliczeniowej, warunków brzegowych, warunków początkowych, metod rozwiązywania równań itp.) integer(kind=4) :: n!licznba punktow na wykresach integer(kind=4) :: i,j!liczniki petli real(kind=4) :: Re_min!poczatek zakresu liczb Reynoldsa real(kind=4) :: Re_max!koniec zakresu liczb Reynoldsa real(kind=4),allocatable :: x(:) real(kind=4),allocatable :: y(:)!tablica punktow x!tablica punktow y real(kind=4) :: dx!krok przestrzenny real(kind=4) :: f1,f2,f3,f4!funkcja pomocnicze (Almedeij) real(kind=4) :: a!funkcja pomocnicza (FlammerBlanks) real(kind=4) :: dana!bieazaca wartosc Re real(kind=4) :: wynik(15)!tablica wynikow dla danego Re

deklarowanie stałych w jednym miejscu programu (najlepiej na samym początku lub w pliku dołączanym) przykład zastosowania pliku dołączanego, służącego do definicji podstawowych parametrów programu (tu stosowane jest statyczne przypisanie pamięci)

parametryzacja programu (np. rozmiaru zadania) program test implicit none real(kind=4) :: x(1:20,1:30) integer(kind=4) :: i,j do, i = 1, 20 do, j = 1, 30 x(i,j) = 0. end do end do read * end przykład niepoprawnej budowy kodu źródłowego: zmiana rozmiaru siatki obliczeniowej wymaga korekty wszystkich pętli w programie: należy wprowadzić dodatkowe parametry (np. nx i ny)

stosowanie parametrów wywołania!saving arguments of the software calling: if (command_argument_count() == 2) then call getarg(1,dir) dir = trim(dir) call getarg(2,tmp) read(tmp,*) ns else print '(/a$)', read * stop end if ' No arguments... ' przykład zastosowania parametrów wywołania: przekazanie nazwy przykładu, który ma być analizowany oraz jego rozmiaru (fragment programu PathFinder)

dynamiczne zarządzanie pamięcią integer(kind=8) :: ns!the total number of spheres in the bed integer(kind=8),allocatable :: n(:)!the numbers of all spheres real(kind=8),allocatable :: x(:)!the X-coordinates of sphere centers real(kind=8),allocatable :: y(:)!the Y-coordinates of sphere centers real(kind=8),allocatable :: z(:)!the Z-coordinates of sphere centers real(kind=8),allocatable :: d(:)!the diameters of all spheres logical(kind=4),allocatable :: flag(:)!the particle "flag" przykład zastosowania dynamicznej alokacji pamięci: rozmiar układu został określony przez parametr wywołania i nie trzeba kompilować programu oddzielnie dla każdego przypadku obliczeniowego (fragment programu PathFinder)

komentarze!poczatek petli po czasie do i = 1, n!wybor stalej tlumienia w zaleznosci od kierunku ruchu: if (u.gt.0) then c = cd else c = cg end if!obliczenie pochodnych: dydt = u dudt = -g-(k/m)*(y-w0)-c*u*abs(u)/m!obliczenie nowych wartosci zmiennych: y = y+dydt*dt u = u+dudt*dt t = t+dt!zakonczenie petli po czasie: end do przykład komentarzy w kodzie źródłowym (fragment programu Drgania)

komentarze nagłówkowe!-----------------------------------------------------------------------! autor: wojciech sobieski! kontakt: wojciech.sobieski@uwm.edu.pl! data utworzenia: 2005-09-14! ostatnia modyfikacja: 2016-09-19!----------------------------------------------------------------------- program powierzchnia_swobodna implicit none integer :: n integer :: m real,allocatable :: x(:) real,allocatable :: z(:) real,allocatable :: zr(:)!liczba wezlow!liczba iteracji w cyklu!tablica wspolrzednych x!tablica wspolrzednych z!tablica wspolrzednych z dla rysunku przykład komentarza nagłówkowego w kodzie źródłowym (fragment programu Powierzchnia)

komentarze nagłówkowe!-----------------------------------------------------------------------! Program Fourier v. 1.4 (C) Sobieski & Trykozko 2014!! ver. 1.0 (W.S.) scianka jednowarstwowa (rozwiazanie klasyczne),! siatka regularna, wizualizacja Gnuplot! ver. 1.1 (W.S.,A.T.) scianka jednowarstwowa (rozwiazanie macierzowe),! siatka regularna, wizualizacja Gnuplot! ver. 1.2 (W.S.,A.T.) scianka wielowarstwowa (rozwiazanie macierzowe),! siatka regularna, wizualizacja Gnuplot! ver. 1.3 (W.S.,A.T.) scianka wielowarstwowa (rozwiazanie macierzowe),! siatka nieregularna, wizualizacja Gnuplot i ParaView! ver. 1.4 (W.S.) scianka wielowarstwowa (rozwiazanie macierzowe),! siatka nieregularna, wizualizacja Gnuplot I! ParaView, obliczenia ciepla, sledzenie zbieznosci! obliczen, rozne metody rozwiazywania ukladow rownan!! ostatnia zmiana: 21 grudnia 2015!----------------------------------------------------------------------- przykład komentarzy w kodzie źródłowym (fragment programu Fourier 1D, FVM)

Komentarze nagłówkowe bywają mocno rozbudowane i zawierają: opis działania programu sposób użycia jak wywołać program listę i opis ważniejszych zmiennych opis plików WE/WY nazwy używanych podprogramów nazwy wszelkich specjalnych metod, które zostały użyte, wraz ze wskazaniem, gdzie można znaleźć dalsze informacje informacje o czasie działania (jeśli ma to znaczenie) wymagania sprzętowe i systemowe opis specjalnych poleceń dla operatora / użytkownika informacje o autorach i kontaktach datę napisania (ew. datę ostatniej modyfikacji lub numer wersji)

przykład rozbudowanego komentarza wstępnego (komponent mxprotector do środowiska Delphi)

komentarze podprogramów!-----------------------------------------------------------------------! funkcja liczy pole powierzchni pod krzywa:!----------------------------------------------------------------------- real function calka(x,n,dx) implicit none real :: x(n) real :: dx integer :: n integer :: i!odstep miedzy punktami na kierunku x!liczba przedzialow dyskretyzacji!licznik petli calka=0 do i=2,n calka = calka+((x(i)+x(i-1))/2.)*dx end do end function calka przykład opisu funkcji: łatwiej ją znaleźć w kodzie źródłowym i od razu wiadomo, jakie jest jej zadanie (fragment programu Powierzchnia)

odstępy pionowe program test implicit none real(kind=4) :: l!dlugosc [m] real(kind=4) :: dl!zmiana dlugosci [m] real(kind=4) :: F!sila [N] real(kind=4) :: A!pole przekroju [m^2] real(kind=4) :: E!modul Younga [N/m^2] l = 10. dl = 0. F = 100. A = 2.e-6 E = 2.08e11 dl = (F*l)/(A*E) print '(A,F6.2,A)', 'Pret wydluzy sie o : ', dl*1000., ' [mm]' read * end program byłby czytelniejszy, gdyby dodać puste linie pomiędzy fragmentami realizującymi różne zadania

wcięcia i odstępy poziome!nalozenie biezacych zrodel: ------------------------------------------------------ do i = 1, nx do j = 1, ny do k = 1, nz do sc_l = 1, sc_n if (sc_i(sc_l) == i.and. sc_j(sc_l) == j.and. sc_k(sc_l) == k) then if (t > sc_t_start(sc_l).and. t < sc_t_stop(sc_l)) f(i,j,k) = sc_f(sc_l) end if end do end do end do end do dzięki wcięciom wyraźniej widać gdzie jest początek i koniec danej pętli (fragment programu Dyfuzja 3D)

etykiety (rosnące ze skokiem > 1)!parametry domyslne ukladu (jak zawiedzie plik): 20 continue g = 9.81 m = 0.5 l = 2. ax = pi/8.!8 ay = pi/12.!12 dt = 0.01 print '(a)', ' przyjeto wartosci domyslne: '!wyswietlenie parametrow: 30 continue print '(/a35,f12.6)', ' przyspieszenie ziemskie [m/s^2] :', g print '(a35,f12.6)', ' masa ciezarka [kg] : ', m print '(a35,f12.6)', ' dlugosc liny [m] : ', l print '(a35,f12.6)', ' poczatkowe wychylenie na x [m] : ', ax print '(a35,f12.6)', ' poczatkowe wychylenie na y [m] : ', ay przykład poprawnego nadawania etykiet: jeśli zajdzie potrzeba, można wstawić etykietę między dwa inne bloki (fragment programu Lissajous)

podział algorytmu na niezależne od siebie części elementarne (najlepiej z wykorzystaniem funkcji i procedur)!definicja siatki: call define_grid(lx,ly,gn_x,gn_y,gc_x,gc_y)!definicja warunkow brzegowych: call define_boundary(gc_x,gc_y,s,b_s,b_n,b_e,b_w)!definicja dodatkowych zrodel: call define_source(s,sx_min,sx_max,sy_min,sy_max,source)!pobranie liczby iteracji: print '(/A$)', ' podaj liczbe iteracji: ' read (*,*,err=10) iter print *, ''!uruchomienie obliczen: call solver_mrs(gc_x,gc_y,s,b_s,b_n,b_e,b_w,iter,sx_min,sx_max,sy_min,sy_max,source) przykład budowy kodu z podziałem na jednostkowe zadania (fragment programu Poisson jest to większość programu głównego, reszta zdefiniowana jest w odseparowanych procedurach)

rozwiązywanie danego zadania tylko raz (najlepiej z wykorzystaniem funkcji i procedur) program test implicit none include 'hook_types.inc' oblicz(f,l,a,e) = (F*l)/(A*E) include 'hook_values.inc' dl = oblicz(f,l,a,e) print '(A,F6.2,A)', 'Pret wydluzy sie o : ', dl*1000., ' [mm]' read * end przykład zastosowania funkcji lokalnej do obliczania wydłużenia pręta zgodnie z prawem Hooka: gdyby zaszła potrzeba modyfikacji wzoru obliczeniowego, wystarczy zmienić funkcję

tworzenie uniwersalnych rozwiązań (najlepiej z wykorzystaniem funkcji i procedur)... call gaussj(ac,bt,t_nowe,n_c-2)...!-----------------------------------------------------------------------! Metoda Gauss-Jordan!----------------------------------------------------------------------- subroutine gaussj(a,b,x,n) implicit none include 'fourier.prec'!plik definiujacy precyzje obliczen... integer(kind=prec) real(kind=prec) real(kind=prec) real(kind=prec) :: n :: a(n,n) :: b(n) :: x(n) przykład procedury rozwiązującej układ równań liniowych metodą bezpośrednią Gaussa-Jordana posiada ona uniwersalne nazwy zmiennych, odwołujące się do symboliki matematycznej: a macierz współczynników, b wektor prawej strony, x wektor wartości szukanych, n rozmiar układu (procedura użyta w programie Profil, Mac oraz Fourier 1D)

przewidywanie wszystkich możliwych sytuacji program test implicit none real(kind=4) :: delta = -4 if (delta > 0) then print *, ' dwa miejsca zerowe' else if (delta == 0) then print *, ' jedno miejsce zerowe' end if read * end przykład błędnej instrukcji warunkowej (wyobraźmy sobie, że program wylicza miejsca zerowe funkcji): gdy delta jest mniejsza od zera to nie ma rozwiązania, ale program powinien jakoś sensownie zareagować tu będzie wykonywał się dalej

ciągłe testowanie kodu! Definicja wezlow tworzacych scianki: is_solid_node = 0 do i = 1, lx is_solid_node(i,1) = 1 is_solid_node(i,ly) = 1 end do! Definicja wezlow tworzacych przeszkode: is_solid_node(int(lx/2),int(ly/2)) = 1 is_solid_node(int(lx/2-1),int(ly/2)) = 1 is_solid_node(int(lx/2),int(ly/2-1)) = 1 is_solid_node(int(lx/2-1),int(ly/2-1)) = 1 is_solid_node(int(lx/2+1),int(ly/2)) = 1 is_solid_node(int(lx/2),int(ly/2+1)) = 1 is_solid_node(int(lx/2+1),int(ly/2+1)) = 1 is_solid_node(int(lx/2-1),int(ly/2+1)) = 1 is_solid_node(int(lx/2+1),int(ly/2-1)) = 1 is_solid_node(int(lx/2-2),int(ly/2)) = 1 is_solid_node(int(lx/2+2),int(ly/2)) = 1 is_solid_node(int(lx/2),int(ly/2-2)) = 1 is_solid_node(int(lx/2),int(ly/2+2)) = 1 przykład sprawdzenia, czy dany fragment programu działa poprawnie: po zdefiniowaniu węzłów odbijających, tablica is_solid_node została zapisana do pliku i przedstawiona za pomocą środowiska Gnuplot ponieważ efekt jest zgodny z oczekiwaniami, program można pisać dalej

wieloplatformowość rozwiązań (Fortran)!pobiera sciezke biezacego katalogu: call getcwd(tmp) if (trim(tmp(:1)) == '/') then print *, 'Linux' sign = '/' call system('clear') else print *, 'Windows' sign = '\' call system('cls') end if przykład programu uwzględniającego możliwość kompilacji i działania w różnych systemach operacyjnych: w systemach Windows oraz UNIX\Linux inne są znaki łączące katalogi i pliki w ścieżkach oraz inne są polecenia systemowe (fragment programu PathFinder)

wieloplatformowość rozwiązań (Lazarus) {$IFDEF Windows} WriteLn(tmp,'win'); sign := '\'; {$ENDIF Windows} {$IFDEF Unix} WriteLn(tmp,'lin'); sign := '/'; {$ENDIF Unix} przykład programu wykorzystującego specjalne dyrektywy, których realizacja zależy od rodzaju systemu operacyjnego, w którym program jest wykonywany (fragment programu fouriergui napisanego w środowisku Lazarus)

wieloplatformowość rozwiązań (Gnuplot) set title 'Wykres zbieznosci - porownanie' set xlabel 'Numer iteracji' set ylabel 'x[n+1] - x[n]' set yrange [0.0:0.0001] set grid plot 'zbieznosc-jacobi.txt' title 'Jacobi' with lines lt 1, \ 'zbieznosc-gauss-seidel.txt' title 'Gauss-Seidel' with lines lt 2, \ 'zbieznosc-sor.txt' title 'SOR' with lines lt 3 set terminal png set output '!zbieznosc-suma.png' replot pause mouse 'Wykres zapisano do pliku...' exit gnuplot przykład skryptu Gnuplota działającego tak samo w różnych systemach operacyjnych (fragment programu Profil) UWAGI: unikać terminala windows; sposób wyświetlania (rodzaje linii, kolory) mogą być różne w różnych systemach operacyjnych

wieloplatformowość rozwiązań (VTK)!saving the input data in VTK format for ParaView: open(1,file=trim(dir)//sign//trim(dir)//'.in.vtk') write(1,'(a)') '# vtk DataFile Version 2.1' write(1,'(a)') 'The bed' write(1,'(a)') 'ASCII' write(1,'(a)') '' write(1,'(a)') 'DATASET UNSTRUCTURED_GRID' write(unit=tmp,fmt='(i6)') ns write(1,'(a)') 'POINTS '//trim(tmp)//' double' do i = 1, ns write(1,'(3f16.8)') x(i),y(i),z(i) end do write(1,'(a)') 'POINT_DATA '//trim(tmp) write(1,'(a)') 'SCALARS Diameter double' write(1,'(a)') 'LOOKUP_TABLE default' do i = 1, ns write(1,'(f16.8)') d(i) end do close(1) przykład zapisu danych do standardowego pliku VTK (fragment programu PathFinder)

otwartość stosowanych narzędzi gfortran Free Pascal & Lazarus BPL / SH Gnuplot ParaView & VTK programy obliczeniowe nakładki na programy obliczeniowe programy obliczeniowe wykorzystywanie specjalistycznych bibliotek wizualizacja wyników wspomagające skrypty powłoki wykresy 2D i 3D (w tym animacje) wizualizacje 3D (w tym animacje) Inne: Python, C, Scilab,...

Dziękuję Wojciech Sobieski Olsztyn, 2001-2016