Přeskočit na obsah

Cviření

Projekt: simulace molekulární dynamiky

  • kód by měl dodržovat zásady čistého kódu a měl by být dobře zdokumentován
  • nejměné po každém cvičení commitujte změny
  • ideálně po každém cvičení odesílejte pull request na GitHub

Cíl projektu

Cílem projektu je napsat kód pro simulaci molekulární dynamiky (MD), která modeluje interakce mezi atomy v daném systému a umožní prozkoumat vlastnosti systému za různých podmínek. Tento projekt pokryje pokročilé koncepty programování včetně pokročilých operací s poli, dynamické alokace, pure a přetížených funkcí, modulů, objektově orientovaného programování (OOP), funkčního programování (FP) a coarrays pro paralelní zpracování. Budete používat Git pro správu verzí a budete pravidelně odesílat pull requesty na GitHub.

Cvičení 1 - Git

  • projděte a zkuste si příklady z kapitol 1-4 na https://git-scm.com/book/cs/v2
  • Project začněte klonování repozitáře: git clone https://github.com/msvbd/fortran_2_project_md

Cvičení 2 - třída Atom

  • zopakujte si uživatelský typ type, projděte si kapitolu “Objektově orientované programování v jazyce Fortran” a vytvořte třídu Atom pro reprezentaci atomu
  • třída Atom bude mít pro začátek následující atributy:
    • polohový vektor r (2D nebo 3D pole)
    • rychlost v (2D nebo 3D pole)
    • síla f (2D nebo 3D pole)
    • hmotnost m

Cvičení 3 - inicializace

  • vytvořte novou třídu Box pro reprezentaci simulačního boxu
  • třída Box bude mít následující atributy:
    • rozměry boxu L (2D nebo 3D pole)
    • počet částic n
    • pole částic atoms (pole tříd Atom)
  • třída Box bude mít následující metody:
    • init_atoms pro inicializaci poloh a rychlostí částic

Cvičení 4 - výpočet síly

  • vytvořte nový modul pro výpočet sil mezi částicemi
  • modul bude mít následující funkce:
    • init_force pro inicializaci výpočtu sil - funkce bude jako vstup brát funkci pro výpočet síly mezi dvěma částicemi

    • compute_force pro výpočet sil mezi dvěma částicemi - argumentem budou dvě částice a výstupem síla

    • compute_forces pro výpočet sil mezi všemi částicemi v boxu - funkce spočátá síly částic

    • pří výpočtu vzdálenosti je třeba brát v úvahu periodické okrajové podmínky (https://en.wikipedia.org/wiki/Periodic_boundary_conditions) a počítat interakci od nejbližšího obrazu

    • všechny funkce by měly být pure a nemělo by záležet zda počítáme ve 2D nebo 3D

    • napište funkce lennard_jones, která bude jako argumet brát vzdálenost mezi částicemi a vracet sílu mezi nimi

Cvičení 5 - integrace pohybových rovnic

  • v třídě Box vytvořte metodu pro integraci pohybových rovnic
    • Implementujte Verletův rychlostí algoritmus pro řešení pohybových rovnic [https://en.wikipedia.org/wiki/Verlet_integration#Velocity_Verlet](https://en.wikipedia. org/wiki/Verlet_integration#Velocity_Verlet)
      • funce budou muset být dvě, jedna pro výpočet polohy a druhá pro výpočet rychlosti
      • funkce pro výpočet polohy musí brát v úvahu periodické okrajové podmínky (https://en.wikipedia.org/wiki/Periodic_boundary_conditions)
      • pro výpočet polohy a rychlosti můžete využít znalosti z částí “Funkcionální programování v jazyce Fortran” nebo použít funkci elemental
    • vytvořte subroutinu update pro aktualizaci poloh a rychlostí částic
      • funkce bude brát jako vstup pole částic
      • funkce bude kombinovat funkce pro výpočet sil a integraci pohybových rovnic

Cvičení 7 - paralelní zpracování

  • Vytvořte paralelní verzi simulace s využitím coarrays pro distribuované zpracování.
  • nejpomalší části kódu je výpočet sil mezi částicemi, zkuste tuto část paralelizovat

Cvičení 8 - měření a výstup

  • Implementujte modul pro zápis výsledků simulace do souboru.

  • vytvořte funkce či subroutiny pro výpočet a výpist statistik, např. teploty a energie. Můžete také tlaku.

    • statistiky zapisujte do souboru a zobrazte v grafu
  • dále můžete implementovat výpis poloh částic do souboru .xyz, který lze zobrazit v programu VMD

    • polohy zapisujte do souboru .xyz
    • výsledky simulace zobrazte v programu VMD a zkuste si vytvořit animaci