Monday, May 14, 2018

The Splash of Coffee Drop



 http://www.ift.uni.wroc.pl/~maq/fig/plb2.png



Free surface fluid flow done in the Lattice Boltzmann method based Palabos solver with external PovRay visualization.
I've made this animation especially for the Palabos Challenge Entry in 2012.

See animated version here.

Tuesday, April 24, 2018

GUI w terminalu i ncurses - PL



Piszesz programy z użyciem cin/cout? Chciał(a)byś dodać do programów interfejs użytkownika w konsoli? Ten artykuł jest dla Ciebie, opiszę w nim najważniejsze i najbardziej podstawowe wiadomości nt biblioteki ncurses.
Na tą chwilę najnowsza wersja biblioteki nosi numer 6.1 i została wydana 27. stycznia 2018 r.

Aby rozpocząć zabawę z GUI w terminalu należy dołączyć plik nagłówkowy

ncurses.h do swojego programu. Dodatkowo, program kompilujemy z użyciem flagi: -lcurses (gcc/g++).

Podstawową strukturą używaną w programie będzie WINDOW i wskaźnik na obiekt te struktury będzie przekazywany do funkcji biblioteki ncurses.


Pierwszy program z ncurses

Nasz pierwszy przykładowy program jest bardzo prosty (uwaga, ten i kolejne przykłady zaczerpnięte będą m.in. z [1] - nie jestem specjalistą od ncurses, sam uczę się pisząc ten mini tekst, dlatego mam nadzieję takie zapoiżyczenie jest w porządku):

-------------------------------------------
#inlcude <ncurses.h>

int main()
{
   initscr();                      // inicjalizuj okno
   printw("Hi\n");             // wypisz napis "Hi"
   refresh();                     // umieść całość w konsoli
   getch();                        // poczekaj na klawisz z klawiatury
   endwin();                     // wyjdź
   return 0;
}
-------------------------------------------

Program otwiera nowe okno (to nie jest faktycznie okno GUI, ale wirtualny ekran w konsoli), wyświetla tam napis (printw), następnie ten wirtualny ekran jest pokazywany (refresh), a po naciśnięciu klawisza (getch()) zamyka otwarty ekran i powraca do widoku konsoli sprzed otwarcia okna. Brzmi skomplikowanie, ale jest w sumie proste, efekt działania poniżej na obrazku.

Pierwszy, najprostrzy program w C++.

Obsługa klawiszy - program drugi

Zajmiemy się teraz podstawową obsługą klawiszy. To będze przykład, który wyświetla znaki z klawiatury, ale tak aby były pogrubione, lub "F1", jeśli ktoś wcisnął F1. W komentarzach umieszczam minimum informacji, aby zrozumieć przykład:

-------------------------------------------
#include <ncurses.h>

int main()
{
    int ch;       // wartość wciśniętego klawisza
    initscr();
    raw();        // "return" nie jest już potrzebny

    keypad(stdscr, TRUE);  
                    // można odczytywać
                    // "nieznakowe" klawisze,
                    // strzałki, etc.

    noecho();  // nie wypisuj wciśniętych klawiszy

     printw("Napisz dowolny znak\n");   
                   // komunikat, "w" dlatego, że piszemy
                   // na ekranie wirtualnym
    ch = getch();  // nie trzeba "return", bo było wywołane
                          // "raw"
    if(ch == KEY_F(1))   // F1?
        printw("Wcisnales F1");
    else    {    printw("Wcisnales: ");
        attron(A_BOLD);  // pogrubienie
        printw("%c", ch); // wypisz co wcisnął użytkownik
        attroff(A_BOLD);
    }
    refresh();            // przerzuć na główny ekran w konsoli
        getch();          // czekaj na naciśnięcie klawisza
    endwin();           // koniec trybu "ncourses"

    return 0;
}
-------------------------------------------

To tyle na pierwszy raz, jeśli będzie zainteresowanie tym postem rozwinę opis ncurses dalej, zachęcam przede wszystkim do zapoznania z [1], [2] oraz [3].




Źródła:
1. http://tldp.org/HOWTO/NCURSES-Programming-HOWTO/
2. http://www.linuxfocus.org/English/March2002/article233.shtml#233lfindex1
3. https://www.viget.com/articles/game-programming-in-c-with-the-ncurses-library/



Wednesday, March 28, 2018

FELP.PL - Physics Apps for Kids


  
 http://felp.pl

I recently gave two lectures about physics and computer science in my kids school (2018-02). The lecture covered simple physics experiments plus some software show and self playing.

The kids were very OK with it and - because this is hard for them to type and find internet adresses of those many scattered web toy I made simple linking website, named it felp.pl and published. Enjoy!

I would say these apps are for children at age 2-102. Keep in mind, not all the apps here are mine - some of them I wrote by myself but to some of them I simply link there. Anyway, I will be happy to get some feedback on that and ideas what more to include here!



Wednesday, March 14, 2018

Mean Square Displacement in 1D Random Walk

Mean Square Displacement in 1D Random Walk

by Maciej Matyka

I realized that calculating MSD (mean square displacement) may be a little tricky for students and beginners. Have a look here, this may help to demistify it a little bit. It is a C++ implementation based on simple 1D random walk.

Reference: https://en.wikipedia.org/wiki/Mean_squared_displacement


-------------------------------------------------------------------------------------------


Results:

Exeplary trajectory of particle in 1D
MSD calculated with the code in this post.



-------------------------------------------------------------------------------------------

/**
 * Mean Square Displacement
 * Definition: https://en.wikipedia.org/wiki/Mean_squared_displacement
 * Implementation by Maciej Matyka
 * 14-03-2018 http://panoramix.ift.uni.wroc.pl/~maq/eng/
 **/

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main(void)
{
   srand(time(NULL));

   float x0=0, y0=0;
   float x=x0,y=y0;

   float xn = 0;            // position at step n
   int STEPS = 100000;
   float averagex =0;
   float msd = 0;

   for(int N=0; N<1000; N++)
   {
        averagex =0;
        msd = 0;

        for(int s=0; s<STEPS;s++)
        {
            x=x0;
            for(int t=0; t<N; t++)
            {
                float dx = rand()/float(RAND_MAX);      // 1d random walk
                if(dx>0.5) dx=1; else dx=-1;
                x = x+dx;
            }  
            averagex = averagex + x;
            msd = msd + (x-x0)*(x-x0);
       }
       averagex/=(float)STEPS;
       msd/=(float)STEPS;
       cout << N << "\t" << averagex << "\t" << msd << endl;
   }
}
-------------------------------------------------------------------------------------------