wv 2018-12-01 - 1 ------------------------ In xbeachlibrary; regel 221 (ca) in roelvink.F90: s%Qb(i,:) = 1 + 4/(3*sqrt(par%px)) * (R**3 + 3/2*R) * exp(-R**2) - xerf(R) veranderd in: s%Qb(i,:) = 1 + 4/(3*sqrt(par%px)) * (R**3 + 1.5d0*R) * exp(-R**2) - xerf(R) Reden: 3/2*R is altijd gelijk aan R, dat zal niet de bedoeling zijn - 2 -------------- in templates: alle .f90 files hernoemd naar .mako Reden: van een .f90 file mag je verwachten dat een fortran compiler er iets mee kan, en uiteraard is dat niet het geval met de files in templates. - 3 ---------------- In xbeachlibrary: variables.f90 hernoemd naar variables.def Reden: van een .f90 file mag je verwachten dat een fortran compiler er iets mee kan, en uiteraard is en dat is niet het geval met variables.f90 - 4 --------------- In xbeachlibrary: een file params.def ge-extraheerd uit params.F90, deze params.def functioneert als input voor mako (net zoals variables.def) Params.F90 include nu een file paramsdecl.inc, gegenereerd door mako, en genereert een foutmelding als er iets mis is. Reden: oorspronkelijk gebruikte mako de file params.F90 in zijn geheel als input, dat kan vervelende consequenties hebben als er buiten het definieren van de parameters (voor par%...) regels ten onrechte worden geparst. - 5 --------------- In xbeachlibrary: xbeach_bmi werkt nu ook parallel. De betekenis van 'istop' en dergelijke moet nu anders worden geinterpreteerd: het kan zijn dat een rij weliswaar aan de rand zit, maar wordt ingevuld door een omliggend domein. Daarom in alle code waar nodig de volgende vervangingen doorgevoerd: istop -> manage_lowx isbot -> manage_highx isleft -> manage_lowy isright -> manage_highy Dus: als in een proces manage_lowx is .true., dan worden de punten met lage x-waarden (1 en vaak ook 2) uitgerekend in dit proces. istop en dergelijke zijn vervangen door de wat duidelijker islowx etc: istop -> xmpi_islowx isbot -> xmpi_ishighx isleft -> xmpi_islowy isright -> xmpi_ishighy Zie ook xbeach-bmi.pdf - 6 ------------------------ Overal: Alle modules hebben nu een 'private' en een 'save' statement en een expliciete 'public' statement voor de zaken die publiek moeten zijn. Alle 'use' statements zijn nu voorzien van 'only', bijvoorbeeld: use xmpi_module, only: xmpi_m, xmpi_n Uitzondering: de netcdf module, de mpi module en paramsconst Reden: eenvoudiger debuggen. Was het vroeger zo dat je alle modules langs moest om bijvoorbeeld de herkomst van 'iteratedispersion' te achterhalen, nu is het zo dat deze wordt vermeld in het betreffende use statement: use wave_functions_module, only: iteratedispersion, dispersion 'save': het lijkt zo te zijn, dat het run-time systeem de vrijheid heeft een module te verwijderen als hij 'uit zicht' is: m.a.w: er is op een bepaald moment geen subroutine geladen die de module gebruikt. Dat is in xbeach niet de bedoeling: de waarden die aan module variabelen worden gegeven, moeten gedurende de loop van het programma geldig blijven. Dit wordt bereikt door de 'save' statement. - 7 ---------------------------------- Overal: Ongebruikte variabelen verwijderd en variabelen expliciet een waarde gegeven als de compiler vermoedt (ten rechte of ten onrechte) dat een variable ongeinitialiseerd wordt gebruikt. Reden: Ik zie graag een warning-vrije compilatie, ook met alle warning flags aan (-Wall voor gfortran), zodat nog niet gefixde warning opvallen. - 8 ----------------------------- xbeachlibrary: in het type 'parameters' werden px (3.14...) en compi ( (0.0d0,1.0d0), zuiver imaginaire 1) gedefinieerd. compi kreeg een waarde in params.F90. Ik heb px en compi verwijderd uit 'parameters' en in constants.F90 pi en compi gedefinieerd en de overige .F90 files navenant aangepast. Reden: mathematische constanten (pi, e, ...) horen niet thuis in 'parameters'. In constants.F90 zijn pi en compi gedefinieerd als 'parameter' (sic!), dus ze kunnen niet ergens elders abusievelijk een verkeerde waarde krijgen. PS: in constants.F90 heb ik dp en sp veranderd in resp. dpkind en spkind omdat dp in nonh.F90 een array is. Overigens wordt nergens gebruik gemaakt van dpkind en spkind, behalve in constants.F90 zelf. - 9 --------------------------------- xbeachlibrary: Vele xmpi routines bepalen nu zelf of er message passing moet worden gedaan of niet, m.a.w: ze kijken nu zelf naar de waarde van USEMPI. Reden: beter leesbare code, bijvoorbeeld: #ifdef USEMPI cal xmpi_bcast(...) #endif is nu vervangen door: call xmpi_bcast(...) - 10 -------------------------------- scripts/generate.py: dit script is aangepast: - enkele bugs, met name bij het parsen van params.def (vroeger params.F90), opgelost - generate.py kan nu worden aangeroepen met een of meer .mako files als argument. In dat geval produceert het alleen de betreffende .inc files. Zonder parameters genereert het nog steeds alle .inc files. Reden: wanneer een .mako file of een .def file is aangepast, worden automatisch de vereiste .inc files opnieuw gegenereerd, zodat een correcte xbeach wordt gebouwd. - 11 ------------------------------ scripts/makefdeps.py: Dit script genereert de dependencies, gebaseerd op het definieren en gebruiken van modules. Reden: er hoeft niet meer met de hand te worden uitgezocht in welke volgorde de sources moeten worden gecompileerd. Belangrijker nog: nu is een parallele make mogelijk: make -j6 waardoor het bouwen veel sneller gaat. (zie ook './configure --help' zoek naar 'makefdeps' - 12 ------------------------------ xbeach/Makefile.am, xbeachlibrary/Makefile.am, configure.ac: de optie voor 'configure' '--with-makefdepsn' gecreerd (zie ./configure --help) Reden: deze optie zorgt ervoor, dat alvorens alle sources die op grond van de dependencies opnieuw zouden moeten worden gecompileerd, er eerst wordt bepaald of de interfaces van de betreffende modules zijn veranderd. Als dat niet zo is, behoeven de sources die de module gebruiken niet opnieuw te worden gecompileerd. Dit werkt voor de gfortran compiler, maar niet voor ifort. Configure houdt daar rekening mee. Voorbeeld: a.f90: module moda contains subroutine suba print *,'suba' end subroutine end module Als de print statement wordt veranderd, bijvoorbeeld: print *'dit is suba' dan hoeven source files die deze module gebruiken niet opnieuw te worden gecompileerd. Als de subroutine statement wordt veranderd: subroutine suba(x) dan moeten de source files die deze module gebruiken wel opnieuw worden gecompileerd. - 13 -------------------- configure.ac, Makefile.am's positie onafhankelijk compileren: Het is nu mogelijk een andere directory dan 'trunk' te gebruiken om te compileren, en de python-afhankelijke files (dependencies (deps), .inc files (gegenereerd uit .mako files) zijn in de distributie tar-file aanwezig. Reden: je kunt nu twee verschillende xbeachen (bijvoorbeeld mpi en serial) onafhankelijk van elkaar bouwen. Voorbeeld: de trunk directory staat in /home/user/xbeach/trunk. We willen een mpi versie in /home/user/myxbeach/mpi en een seriele versie in /home/use/myxbeach/serial $ mkdir -p /home/user/myxbeach/mpi /home/user/myxbeach/serial $ cd /home/user/myxbeach/mpi $ /home/xbeach/trunk/configure --with-mpi --prefix=/home/user/myxbeach/mpi $ make -j4 install $ cd /home/user/myxbeach/serial $ /home/xbeach/trunk/configure --prefix=/home/user/myxbeach/serial $ make -j4 install Als alles goed gaat, is nu een mpi-xbeach aanwezig in /home/user/myxbeach/mpi/bin en een serial-xbeach in /home/user/myxbeach/serial/bin In /home/user/xbeach/trunk is niets veranderd of toegevoegd. Python: omdat de benodigde door mako en python gegenereerde files aanwezig zijn, hoeven gebruikers die alleen willen compileren niet over python of mako te beschikken. Uiteraard, als de gebruiker iets in de source wordt gewijzigd, dan dan zijn python en mako noodzakelijk. Nog een reden: na $ ./bootstrap $ ./maketar is er een tar-file die gereed is voor distributie. - 14 ------------------------ src/version.txt: De enige plek waar de versie van xbeach wordt vermeld is nu in src/version.txt Deze file wordt gebruikt bij het bouwen van xbeach en het maken van de distributie tar file. Reden: voorheen was de versie enigszins verscholen in de source en werd niet altijd consequent gebruikt. Nu verschijnt de versie ook in de naam van de distributie tar file na './maketar' - 15 --------------------- configure.ac src/xbeachlibrary/Makefile.am toegevoegd: --with-no_opt hierdoor worden spaceparams.F90 en xbeach_bmi.F90 met flag -O0 gecompileerd Reden: genoemde sources bevatten lange gegenereerde 'select case' statements die veel tijd vragen om te compileren met -O2. Dit geldt zowel voor de gnu als voor de intel compilers. Met -O0 gaat het compileren veel sneller, en het heeft geen gevolgen voor de performance van xbeach.