1. Fortranã®åºæ¬ãšã©ã€ãã©ãªã®åœ¹å²
Fortranã¯ããã®å§ãŸãã1950幎代ã«ããã®ãŒããæãå€ãããã°ã©ãã³ã°èšèªã®1ã€ã§ãããããŠãç§åŠæè¡èšç®ã®åéã§ã¯ãŸã åºã䜿ãããŠããŸãããããããã®æ±ãã¯ãç¹ã«ã©ã€ãã©ãªã®ååšãšçµã¿èŸŒã¿æ¹ãç解ããããšãéèŠã«ãªã£ãŠããŸãã
1.1 Fortranã®åºæ¬æŠå¿µ
Fortranã¯å³å¯ãªåœ¢åŒã®ããã°ã©ãã³ã°èšèªã§ãéåžžã«é·ã寿åœãæã£ãŠããŸãããã®ã¹ã¿ã€ã«ãšèšèšå²åŠã¯ãäž»ã«ç§åŠæè¡èšç®ã«ãããæ°å€èšç®ã容æã«ããããšã«çŠç¹ãåœãŠãŠããŸãã
Fortranã¯ããŒããŠã§ã¢ãžã®çŽæ¥çãªã¢ã¯ã»ã¹ããããŠã¬ãã«ã®ããã°ã©ãã³ã°æ©èœã¯æäŸããŠããŸããããã®ä»£ããã«é«ã¬ãã«ã®æœè±¡åãæäŸããŠããŸãã
ãã®èšèªã®äž»ãªãŠãŒã¹ã±ãŒã¹ã¯ã倧èŠæš¡ãªæ°å€èšç®ãã·ãã¥ã¬ãŒã·ã§ã³ã§ãããããã«ã¯ç§åŠæè¡èšç®ãéèã¢ããªã³ã°ã倩åäºå ±ãªã©ãå«ãŸããŸãã
1.2 ããã°ã©ã å ã§ã®ã©ã€ãã©ãªã®äœçœ®ã¥ã
ã©ã€ãã©ãªã¯ããã°ã©ãã³ã°ã«ãããéèŠãªèŠçŽ ã§ãè€æ°ã®ãœãŒã¹ã³ãŒããåå©çšå¯èœãªåœ¢ã«ãŸãšãããã®ã§ããããããã®ã©ã€ãã©ãªã¯ãç¹å®ã®æ©èœãæã£ãŠããŸãã
Fortranã®ã©ã€ãã©ãªã¯ãäžè¬çã«ããã°ã©ã ã®äžéšãšããŠãªã³ã¯ããããããã®æ©èœããµãã«ãŒãã³ãå©çšå¯èœã«ããŸããããªãã¡ãããã°ã©ãã³ã°èšèªãšããŠã®Fortranèªäœã®æ©èœãæ¡åŒµããç¹å®ã®ç®çãéæããã®ã«åœ¹ç«ã€ããŒã«é¡ãæäŸããã®ãã©ã€ãã©ãªã®åœ¹å²ã§ãã
ãããã®ã©ã€ãã©ãªã¯ãç·åœ¢ä»£æ°ã©ã€ãã©ãªãä¹±æ°çæã©ã€ãã©ãªãããŒã¿åæã©ã€ãã©ãªãªã©ãããããç§åŠæè¡èšç®ã®ããŒãºã«å¯Ÿå¿ããããã®ãã®ããããŸãã
1.3 ã©ã€ãã©ãªã䜿çšããã¡ãªãã
Fortranã®ã©ã€ãã©ãªã®äœ¿çšã¯ãèšç®èœåã®åäžãã³ãŒãã®åå©çšããšã©ãŒã®äœæžãªã©ããŸããŸãªã¡ãªããããããããŸããæ¢åã®ã©ã€ãã©ãªã䜿çšããããšã§ããããã®æ©èœã«ã€ããŠã®æ°ããªã³ãŒãã®èšè¿°ãé¿ããããšãå¯èœã«ãªããŸãã
ããã«ãäžåºŠãã¹ããšæ€èšŒãè¡ãããã©ã€ãã©ãªã䜿çšããããšã§ããœãããŠã§ã¢ã®ä¿¡é Œæ§ãåäžãããããšãã§ããŸãããŸããæé©åãããã©ã€ãã©ãªã䜿çšããããšã§ããœãããŠã§ã¢ã®ããã©ãŒãã³ã¹ãåäžãããããšãã§ããŸãã
æåŸã«ãæ±çšæ§ãããã©ã€ãã©ãªãå©çšããããšã§ãæ°ããç§åŠçãªåé¡ã«å¯Ÿå¿ããããã®ããã°ã©ã ãè¿ éã«éçºããããšãã§ããŸããããããã¹ãŠã®ã¡ãªããããFortranã®ã©ã€ãã©ãªã®å€§ããªäŸ¡å€ã圢æããŠããŸãã
1.4 ã©ã€ãã©ãªã®æ§é ãšåäœåç
Fortranã®ã©ã€ãã©ãªã¯éåžžãæ©èœããšã«æŽçããããµãã«ãŒãã³ãšé¢æ°ã®éãŸãã§æ§æãããŸãããããã¯ãå ±éã®ç®çãæã€äžé£ã®ããã°ã©ã ãæäŸããŸãã
ã©ã€ãã©ãªãFortranããã°ã©ã ã«ãªã³ã¯ããããšããã³ã³ãã€ã©ãšãªã³ã«ã¯ãã®ã©ã€ãã©ãªå ã®é¢æ°ãšãµãã«ãŒãã³ãèªåçã«æ€çŽ¢ããããããããã°ã©ã å ããçŽæ¥åŒã³åºããããã«ããŸãã
ãããã®ã©ã€ãã©ãªã¯ãFortranã®ããã°ã©ãã³ã°ã«ãããŠå€§ããªå¹çæ§ãšåŒ·åãªæ©èœãæäŸãããã®ããFortranãç§åŠæè¡èšç®ã®åéã§åºãæ¡çšãããŠããäž»èŠãªçç±ã®äžã€ã§ãã
2. Fortranã®ä»£è¡šçãªã©ã€ãã©ãªçŽ¹ä»
Fortranãšããã°ãç§åŠæè¡èšç®ã«åªããããã°ã©ãã³ã°èšèªãšããŠåºãç¥ãããŠããŸããããã®åãåŒãåºãã®ãã©ã€ãã©ãªã§ããããã§ã¯ãFortranã§ããå©çšããã代衚çãªã©ã€ãã©ãªãããã€ãã玹ä»ããŸãã
ãããã®ã©ã€ãã©ãªã䜿ãããšã§ãFortranã®æã€èšç®èœåãããã«ãã¯ãŒã¢ãããããããšãå¯èœã§ããæ°å€èšç®ãã¯ãããšããåçš®ã®èšç®ã«é¢ããã©ã€ãã©ãªããããŒã¿åæãã°ã©ãã£ã«ã«ãªè¡šçŸãå®çŸããã©ã€ãã©ãªãªã©ãæ§ã ãªå Žé¢ã§åœ¹ç«ãŠãããšãã§ããŸãã
ããã§ã¯å ·äœçã«ã©ã®ãããªã©ã€ãã©ãªãããã®ããäžã€ãã€èŠãŠãããŸãããã
2.1 æ°å€èšç®ã©ã€ãã©ãª
ãŸãã¯æ°å€èšç®ã©ã€ãã©ãªããã§ããFortranã¯å ã ç§åŠæè¡èšç®åãã«éçºãããèšèªã§ããããæ°å€èšç®çšã®ã©ã€ãã©ãªãå å®ããŠããŸãã
ãã®äžã§ã代衚çãªã®ãBLAS (Basic Linear Algebra Subprograms)ã§ããBLASã¯ç·åœ¢ä»£æ°ïŒãã¯ãã«ãè¡åã®æŒç®ïŒã®åºæ¬çãªã«ãŒãã³ãæäŸããŸãã
ããäžã€ãã䜿çšãããã®ãLAPACK (Linear Algebra PACKage)ã§ããLAPACKã¯BLASãåºã«ãããããã«é«ã¬ãã«ãªç·åœ¢ä»£æ°èšç®ã®ã«ãŒãã³ãæäŸããŸããè¡åå解ãåºæå€èšç®ãšãã£ãè€éãªèšç®ããã®ã©ã€ãã©ãªã§è¡ãããšãã§ããŸãã
2.2 è¡åèšç®ã©ã€ãã©ãª
次ã«ãè¡åèšç®ã©ã€ãã©ãªã«ã€ããŠèª¬æããŸãããã®çš®ã®ã©ã€ãã©ãªã¯ãç¹ã«ç·åœ¢ä»£æ°ã解æååŠãªã©ã§é »ç¹ã«çšããããŸãã
代衚çãªãã®ãšããŠã¯ãåè¿°ã®LAPACKããããŸãããŸããEISPACKïŒEigen system packageïŒãIMSL Libraryãããçšããããåºæå€èšç®ãè¡åã®å解ãªã©ãããå°éçãªè¡åèšç®ã«äœ¿ãããŸãã
ãããã®ã©ã€ãã©ãªã䜿ãã°ãè€éãªè¡åèšç®ãè¿ éã«äžã€ç²Ÿç¢ºã«è¡ãããšãå¯èœãšãªããŸãã
2.3 ããŒã¿è§£æã©ã€ãã©ãª
ããã«ãFortranã«ã¯ããŒã¿è§£æã«åªããã©ã€ãã©ãªããããŸãã
ãã®äžã§å®çžŸããããä¿¡é Œæ§ã®é«ãã©ã€ãã©ãªã«FFTW (Fastest Fourier Transform in the West)ããããŸããããŒãªãšå€æãé«éã«è¡ãããšãã§ããä¿¡å·åŠçãé³å£°è§£æãªã©ã«äœ¿çšãããŸãã
ãŸãHDF5(Hierarchical Data Format version 5)ã¯ã倧éã®ç§åŠæè¡ããŒã¿ãå¹çããæ±ãããã®ã©ã€ãã©ãªã§ããããŒã¿ã®å ¥åºåã管çãé«éã«è¡ãããšãå¯èœã§ã倧èŠæš¡ãªããŒã¿è§£æã«ã¯æ¬ ãããŸããã
2.4 ã°ã©ãã£ãã¯ã©ã€ãã©ãª
æåŸã«ãFortranãžã®ããŒã¿ã®èŠèŠåãæ¯æŽããã°ã©ãã£ãã¯ã©ã€ãã©ãªã玹ä»ããŸãã
DISLINã¯ãããŒã¿ãæ§ã ãªæ¹æ³ã§ã°ã©ãåããããã®åŒ·åãªã©ã€ãã©ãªã§ãã2次å ã»3次å ã®ã°ã©ã衚瀺ã¯ãã¡ãããå°å³ãçå€ç·å³ã®è¡šç€ºãå¯èœãªã©æ©èœãè±ãã§ãã
ãŸãPGPLOTã¯ãç§åŠæè¡èšç®çµæã®ã°ã©ãæç»ãçéããããããããã®ã©ã€ãã©ãªã§ã2次å ã®ã°ã©ãæç»ãäž»ãªç¹æ§ãšããŠããŸãã
3. ã©ã€ãã©ãªéžå®ã®ã³ã
Fortranã®ã©ã€ãã©ãªéžå®ã¯ãããã°ã©ãã³ã°ã®å¹çãšå®å šæ§ãçŽæ¥æ±ºå®ããŸãããã®ç« ã§ã¯ããã®ããã®éžå®ã³ãã«ã€ããŠè©³ãã解説ããŸãã
é©åãªã©ã€ãã©ãªã®éžå®ã«ã¯ãããã€ãã®èŠç¹ãå¿ èŠã§ããããããã®æé ã¯å¥ã ãããããŸããããå šãŠåãããŠæ€èšããããšãéèŠã§ãã
åã©ã€ãã©ãªã®ç¹æ§ãç解ãã€ã€ããŠãŒã¹ã±ãŒã¹ã«æé©ãªã©ã€ãã©ãªãæ¢ãåºãããšãæåã®éµãšãªããŸãã
3.1 å¿ èŠãªæ©èœãèŠæ¥µãã
æåã«éèŠãªã®ã¯ãèŠä»¶ã«å³ããæ©èœãã©ã€ãã©ãªã«ååšãããã©ããã確èªããããšã§ããFortranã®ã©ã€ãã©ãªã¯å€å²ã«ãããé åãã«ããŒããŠããããã該åœé åã®ã©ã€ãã©ãªãå ã«ããã¯ã¢ããããŠã¿ãŸãããã
æ©èœã ãã§ãªãããã®å®è£ ã«çŽåŸã§ãããã©ããããã§ãã¯ãã€ã³ãã§ããäžã«ã¯è£œåã®å質ãå·Šå³ãããããªæ©èœãæºåãããŠããã©ã€ãã©ãªããããŸãã
ãŸããç¹å®ã®æ©èœããªãå Žåã§ããéåžžã¯è£å®å¯èœã§ãããã®éã«ã¯ãä»ã®ã©ã€ãã©ãªãšã®äºææ§ãè©äŸ¡ããããšãå¿ããã«ã
3.2 ããã¥ã¡ã³ããŒã·ã§ã³ã®å å®åºŠããã§ãã¯
ã©ã€ãã©ãªéžå®ã«ãããŠéèŠãªã®ããå å®ããããã¥ã¡ã³ããŒã·ã§ã³ã§ããçè«çãªèª¬æã ãã§ãªããå ·äœçãªäœ¿çšäŸãå¶éäºé ãããŒãžã§ã³æ å ±ãªã©ãæèšãããŠããã確èªããŸãããã
äžå šãªçŸå Žã§ã¯ãç¹ã«æ°äººæè²ã«ãããŠããã¥ã¡ã³ããŒã·ã§ã³ã¯ç¡ããŠã¯ãªããªãååšã§ããããã¥ã¡ã³ããŒã·ã§ã³ã®è³ªãé«ãã©ã€ãã©ãªãéžã¶ããšã§ãããŒã å šäœã®å¹çåãå®çŸããããšãå¯èœã«ãªããŸãã
ãŸããããã¥ã¡ã³ããŒã·ã§ã³ã®æŽæ°é »åºŠãè©äŸ¡ã®éèŠãªææšã®äžã€ã§ããå®æçã«æŽæ°ãããŠããããšã¯ãã©ã€ãã©ãªã掻çºã«éçºã»ã¡ã³ããã³ã¹ãããŠããè¯ããµã€ã³ã§ãã
3.3 å®è£ ãããã¢ã«ãŽãªãºã ã®é©çšç¯å²ãç解ãã
ã©ã€ãã©ãªãæäŸããã¢ã«ãŽãªãºã ã®é©çšç¯å²ãææ¡ããããšããéžå®ã®éèŠãªãã€ã³ãã§ããã©ã®ãããªåé¡èšå®ã§ãã©ã®çšåºŠã®ç²ŸåºŠãéæã§ããããç解ããããšãæ±ããããŸãã
é©çšç¯å²ãé©åã«è©äŸ¡ããããšã§ããããžã§ã¯ãå šäœã®å¹çãšçµæå質ã®åäžã«ç¹ãããŸãã
ããã«ãã¢ã«ãŽãªãºã ã®é©çšç¯å²ã¯ãæã«çç®ãã¹ãããã©ãŒãã³ã¹ææšã«ããªãããšããããŸãããã®ããã©ã€ãã©ãªã®ã¢ã«ãŽãªãºã ããç®æããœãªã¥ãŒã·ã§ã³ãšäžèŽããŠãããããã£ãããšç¢ºèªããå¿ èŠããããŸãã
3.4 ã©ã€ãã©ãªã®æŽæ°é »åºŠãšéçºäœå¶ã調ã¹ã
ã©ã€ãã©ãªã®æŽ»çºãªæŽæ°é »åºŠãšå¥å šãªéçºäœå¶ã¯ããã®è£œåã®é·æçãªå¯çšæ§ãä¿èšŒããŸãããã°ä¿®æ£ãæ°æ©èœã®è¿œå ã¯ãã¡ãããæã«ã¯ã»ãã¥ãªãã£ã®è匱æ§ãæ¹åãããŸãã
éçºäœå¶ã¯ã©ã€ãã©ãªã®å質ãšç¶ç¶çãªæ¯æã瀺ãéèŠãªè±¡åŸŽã§ããããã確èªããããšã§ãäžæž¬ã®äºæ ã«çŽé¢ããå Žåãæ°ããªèŠä»¶ãåºããšãã«è¿ éã«å¯Ÿå¿ã§ãããã©ãããå€æããããšãå¯èœãšãªããŸãã
以äžãèžãŸããŠé©åãªã©ã€ãã©ãªãéžå®ããããšã§ãäœæ¥ã®å¹çåãšå質åäžãå³ãããšãå¯èœãšãªããŸãããããã®ãã€ã³ãããã£ãããšæŒãããŠãæé©ãªã©ã€ãã©ãªãéžã³ãŸãããã
4. ã©ã€ãã©ãªã®ã€ã³ã¹ããŒã«ãšäœ¿çšæ¹æ³
Fortranã®ã©ã€ãã©ãªã¯ãããã°ã©ã éçºãããå¹çåããã³ãŒãã£ã³ã°ãã·ã³ãã«ã«ããããã®åŒ·åãªããŒã«ã§ããããããããããé©åã«äœ¿çšããããã«ã¯ãããŠã³ããŒããšã€ã³ã¹ããŒã«ããããŠåŒã³åºãæ¹æ³ãç解ããããšãéèŠã§ãããšã©ãŒãã©ãã«ã·ã¥ãŒãã£ã³ã°ããã¹ã¿ãŒããããšã§ãããã°ã©ã éçºã®ã¹ãã¬ã¹ã軜æžã§ããŸãã
4.1 ã©ã€ãã©ãªã®ããŠã³ããŒããšã€ã³ã¹ããŒã«
ãŸãæåã«, Fortranã®ã©ã€ãã©ãªãããŠã³ããŒãããã€ã³ã¹ããŒã«ããæ¹æ³ã解説ããŸããå€ãã®Fortranã©ã€ãã©ãªã¯ãå ¬åŒãŠã§ããµã€ããGitHubãªã©ããããŠã³ããŒãããããšãã§ããŸããããŠã³ããŒããããã¡ã€ã«ã¯éåžž.tgzãŸãã¯.zip圢åŒã§ã解ååŸã€ã³ã¹ããŒã«ãè¡ã圢ãäžè¬çã§ãã
端æ«ã䜿ã£ãŠè§£åãã€ã³ã¹ããŒã«ãè¡ããŸãã解å㯔tar -xzf [filename]”ã”unzip [filename]”ãšãã£ãã³ãã³ãã䜿ããŸãããã®åŸã解åãããã£ã¬ã¯ããªã«ç§»åã㊔./configure”ã”make”ãªã©ã®ã³ãã³ãã䜿ã£ãŠã€ã³ã¹ããŒã«ãé²ããŸãã
ããããã®ã©ã€ãã©ãªã¯åœŒãç¬èªã®ã€ã³ã¹ããŒã«æé ãæã£ãŠãããããå ¬åŒããã¥ã¡ã³ããŒã·ã§ã³ãGithubã®READMEããã£ãããšèªã¿ãæ瀺ã«åŸãããšãéèŠã§ãã
4.2 ã©ã€ãã©ãªãå©çšããããã°ã©ã ã®æ§æ
ã©ã€ãã©ãªã®å©çšã«ã¯äºã€ã®åºæ¬çãªã¹ãããããããŸãããŸãã¯ãé©åãªããããŒãã¡ã€ã«ãããã°ã©ã ã«å«ããããšã§ãããã㯠“include” ã¹ããŒãã¡ã³ãã䜿çšããŠè¡ããŸãã次ã«ãé¢æ°ãŸãã¯ãµãã«ãŒãã³ãé©åã«åŒã³åºãããšã§ãã
äŸãã°ãããã©ã€ãã©ãªãæäŸããé¢æ°ã䜿çšããããšããå ŽåããŸããã®é¢æ°ãå«ãŸããããããŒãã¡ã€ã«ãæå®ããŸãã次ã«ããã®é¢æ°ãåŒã³åºããå¿ èŠãªãã©ã¡ãŒã¿ãäŸçµŠããããšã§ãããã°ã©ã ã®äžã§ãã®æ©èœãå©çšããããšãã§ããŸãã
ãã ããããã©ã€ãã©ãªãæäŸããé¢æ°ããµãã«ãŒãã³ãå©çšããããã«ã¯ããããã®ä»æ§ãç解ããããšãå¿ èŠã§ããå ·äœçã«ã¯ãã©ã®ãããªãã©ã¡ãŒã¿ãå¿ èŠãšããã©ã®ãããªçµæãè¿ãã®ãããšãã£ãæ å ±ãææ¡ããŠããã¹ãã§ãã
4.3 é©åãªåŒã³åºãæ¹æ³ãšã¯
äžè¬çã«ãFortranã®ã©ã€ãã©ãªã®ã³ãŒã«ã¯ããã°ã©ã ã®ã¡ã€ã³éšåã§è¡ãããŸããé¢æ°ããµãã«ãŒãã³ãåŒã³åºãéã¯ãæäŸããããã©ã¡ãŒã¿ã®æ°ãšçš®é¡ãæ£ç¢ºã§ããããšãæ±ããããŸãããŸãããµãã«ãŒãã³ãé¢æ°ãè¿ãçµæãæ ŒçŽããããã®é©åãªå€æ°ãå¿ èŠãšãªããŸãã
é¢æ°ã®åŒã³åºãã¯éåžžãèšç®åŒãæ¡ä»¶åŒã®äžéšãšããŠè¡ããŸããããã«å¯Ÿãããµãã«ãŒãã³ã®åŒã³åºãã¯éåžžãããèªäœãäžã€ã®ã¹ããŒãã¡ã³ããšãªããŸãã
“CALL” ã¹ããŒãã¡ã³ãã䜿çšããŠãµãã«ãŒãã³ãåŒã³åºããæ»ãå€ãããå Žåã¯é¢æ°åœ¢åŒã§åŒã³åºããŸãããªããFortranã§ã¯é¢æ°åãšãµãã«ãŒãã³åã¯ç¬ç«ããŠãããããåãååã§ãäºãã«åºå¥ããããšãã§ããŸãã
4.4 ãšã©ãŒæã®å¯ŸåŠæ³
Fortranã©ã€ãã©ãªã®ãšã©ãŒã¡ãã»ãŒãžã¯äžè¬çã«è©³çŽ°ã§ãåé¡ãäœã§ãããã瀺ããŸãããããã®ã¡ãã»ãŒãžã¯ããç解ããããšã§ããšã©ãŒã®åå ãè¿ éã«ç¹å®ãã察åŠããããšãã§ããŸãã
ãšã©ãŒãçºçããå ŽåããŸãã¯ãšã©ãŒã¡ãã»ãŒãžã詳现ã«èªã¿ãŸãããããšã©ãŒãã©ã®éšåã§çºçãããïŒãã¬ãŒã ã¯ãŒã¯ãã©ã€ãã©ãªããŠãŒã¶ãŒã³ãŒããªã©ïŒãã©ã®ãããªæäœãè©Šã¿ãçµæãšã©ãŒãçºçããããªã©ã®æ å ±ã¯ãåé¡è§£æ±ºã«éèŠã§ãã
ãã察åŠæ³ãããããªãå Žåã¯ããªã³ã©ã€ã³ã®ã³ãã¥ããã£ããã©ãŒã©ã ã«æçš¿ããããšã§è§£æ±ºçãèŠã€ããããšãå¯èœã§ãããŸããã©ã€ãã©ãªãGithubã§ç®¡çãããŠããå Žåãissueã起祚ããããšã§éçºè ããçŽæ¥ãã£ãŒãããã¯ãåŸãããšãã§ããŸãã
5. å®éã®ã³ãŒãã£ã³ã°äŸãšãã®è§£èª¬
ãã®ã»ã¯ã·ã§ã³ã§ã¯ãFortran ã©ã€ãã©ãªã䜿çšããå ·äœçãªã³ãŒãã£ã³ã°äŸãšãã®è§£èª¬ãè¡ããŸããå ·äœäŸãšããŠã¯ãç°¡åãªæ°å€èšç®ãè€éãªããŒã¿è§£æã倧èŠæš¡ããŒã¿ã®åãæ±ãããããŠãããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ã®èãæ¹ãåŠã³ãŸãã
ããããã®ããŒãã¯ãFortranã©ã€ãã©ãªãæ倧éã«æŽ»çšããããã®å®è·µçãªãã¢ã³ã¹ãã¬ãŒã·ã§ã³ã§ãããå·§åŠãªã¢ããªã±ãŒã·ã§ã³éçºãè¡ãéã®éèŠãªã¬ã€ãã©ã€ã³ãæäŸããŸãã
5.1 ç°¡åãªæ°å€èšç®ã®äŸ
æåã«ãç°¡åãªæ°å€èšç®ã®äŸããå§ããŸãããã次ã®ã³ãŒãã¯ãLAPACKã©ã€ãã©ãªã䜿çšããŠãè¡åã®åºæå€ãèšç®ããåºæ¬çãªFortranããã°ã©ã ã§ãã
! 5x5 matrix A computation
real, dimension (5, 5) :: A
real, dimension (5) :: w
real, dimension (5, 5) :: v
! using LAPACK library
call dsyev ('V', 'U', 5, A, 5, w, v, 5*5, info)
end
ããã§æ³šæããã¹ãã¯ãLAPACKã©ã€ãã©ãªã䜿çšããŠããç¹ã§ããLAPACKã¯ãç·åœ¢ä»£æ°ã®åé¡ãå¹ççã«è§£ãããã®å€æ°ã®ã«ãŒãã³ãæäŸããŠããŸãã
dsyevé¢æ°ã¯ãå®å¯Ÿç§°è¡åã®å šãŠã®åºæå€ãèšç®ããŸãã
5.2 è€éãªããŒã¿è§£æã®äŸ
次ã«ãè€éãªããŒã¿è§£æã®äŸãèŠãŠã¿ãŸãããã以äžã®ã³ãŒãã¯ãNetCDF ãã©ãŒãããã®ããŒã¿ãã¡ã€ã«ãã枩床ããŒã¿ãèªã¿èŸŒã¿ããã®å¹³åå€ãšæšæºåå·®ãèšç®ããFortranããã°ã©ã ã®äžéšã§ãã
use netcdf
...
integer, dimension(:), allocatable :: varid, start, count
double precision, dimension(:), allocatable :: temp, avg, std_dev
...
ncid = nf_open('inputdata.nc', NF_NOWRITE)
...
varid = nf_inq_varid(ncid, "temperature")
...
count = (/nx, ny, nz/)
allocate(temp(count))
call nf_get_vara_double(ncid, varid, start, count, temp)
...
NetCDFã©ã€ãã©ãªã¯ãFortranã§ç§åŠããŒã¿ãå¹ççã«æ±ãããã®ãã¯ãã«ãªããŒã«ã§ããããã¯ç§åŠããŒã¿ã«å¯Ÿããå¹ççãªèªã¿æžããããŒã¿ã®åæãšèŠèŠåãå®çŸããŸãã
ããã§ã¯ã枩床ããŒã¿ãèªã¿èŸŒã¿ããããã®å¹³åå€ãšæšæºåå·®ãèšç®ããŠããŸãã
5.3 倧èŠæš¡ããŒã¿ã®åãæ±ã
ä»åºŠã¯ã倧èŠæš¡ãªããŒã¿ã»ããã®åãæ±ãäŸã§ãããã®ã³ãŒãã¯ãHDF5ãã©ãŒãããã䜿çšããŠå€§ããªããŒã¿ã»ãããèªã¿æžãããäŸã§ãã
use hdf5
...
integer(HID_T) :: file_id, dataset_id, dataspace_id
integer(HSIZE_T), dimension(2) :: dims
real(HREAL_T), dimension(:,:), allocatable :: data_out
dims = (/1000, 2000/)
...
file_id = h5fcreate_f(filename, H5F_ACC_TRUNC_F, error)
dataspace_id = h5screate_simple_f(2, dims, error)
dataset_id = h5dcreate_f(file_id, datasetname, H5T_NATIVE_REAL, dataspace_id, error)
allocate(data_out(dims(1), dims(2)))
! Writing the data to the dataset
call h5dwrite_f(dataset_id, H5T_NATIVE_REAL, data_out, dims, error)
...
HDF5ã¯ã倧èŠæš¡ãªããŒã¿ãå¹ççã«æ±ãããã®ãã©ãŒããããšã©ã€ãã©ãªãæäŸããŸããç§åŠæè¡ã®åéã§ã¯ãäžæ¬¡å ã®é åããå€æ¬¡å ã®ã°ãªããããŒã¿ãŸã§ãããŸããŸãªåœ¢åŒã®ããŒã¿ãæ±ãããšãå¯èœã§ãã
ãã®äŸã§ã¯ãHDF5ã䜿ã£ãŠã倧ããªããŒã¿ã»ãããäœæããããã«æžã蟌ãã§ããŸãã
5.4 ããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ã®èãæ¹
æåŸã«ãOpenMPã䜿çšããããã©ãŒãã³ã¹ãã¥ãŒãã³ã°ã®èãæ¹ã玹ä»ããŸãã
!$OMP PARALLEL DO
do i=1,n
a(i) = b(i) + c(i)
end do
!$OMP END PARALLEL DO
OpenMPã¯ãã·ã§ã¢ã¡ã¢ãªåã®äžŠååã容æã«è¡ãããã®APIã®äžã€ã§ããäžèšã®ã³ãŒãã¯ãOpenMPã®äžŠååãã£ã¬ã¯ãã£ãã䜿çšããç°¡åãªäŸã§ãã
ãã®ããã«ãFortranã©ã€ãã©ãªãé©åã«äœ¿çšããããšã§ãèšç®å¹çãé£èºçã«åäžãããããšãå¯èœã«ãªããŸãã
6. Fortranã©ã€ãã©ãªã®å°æ¥æ§ãšå±æ
è¿å¹Žãããã°ã©ãã³ã°ã®äžçã§ã¯æ°ããæè¡ã次ã ãšåºãŠããŠããŸãããFortranã¯åæã®ããã°ã©ãã³ã°èšèªã§ãããªãããã®äŸ¡å€ãä¿ã¡ç¶ããŠããŸããäžã§ãFortranã®ã©ã€ãã©ãªã¯ããã®æ§èœãæ±çšæ§ããå€ãã®å°é家ã«æ¯æãããŠãããããããããã®å°äœãä¿ã€ããšã§ããããããã§ã¯ãFortranã©ã€ãã©ãªã®ä»åŸã®å±æããã®äžã§ç¹ã«æ³šç®ãã¹ããã¬ã³ãã«ã€ããŠè©³ãã解説ããŸãã
6.1 çŸç¶ã®Fortranã©ã€ãã©ãªã®æœ®æµ
ç§åŠæè¡èšç®ãå§ããšããFortranã®äžå¿ã¯ãäŸç¶ãšããŠé«æ§èœãªæ°å€èšç®ã©ã€ãã©ãªãäžå¿ã§ãã
ãã®ãããªã©ã€ãã©ãªã®å€ãã¯ãé·å¹Žã®ç 究éçºãçµãŠæŽç·Žãããæè¿ã§ã¯äžŠåèšç®ã«ã察å¿ãããã®ãå€ãã§ãã
ãŸããFortranã®ã³ã³ãã€ã©ã«ããé©çšãããã©ã€ãã©ãªã¯ãå¹ççãªå®è¡ã確ä¿ããããã«ç°ãªãã¢ãŒããã¯ãã£ã«å¯ŸããŠæé©åãè¡ã£ãŠããŸãã
ãããã®é²æ©ã«ãããFortranã¯ææ°ã®ããŒããŠã§ã¢ããã«ã«æŽ»çšããäºãå¯èœãšãªã£ãŠããŸãã
6.2 æè¿ã®éçºãã¬ã³ã
æè¿ã§ããPythonãRãªã©ã®æ°èèšèªã®å©çšçãå¢ããŠããŠããŸãããFortranã®åŒ·åºãªæ§èœã¯å¥åšã§ãã
ç¹ã«ãç§åŠèšç®ã®é åã§ã¯ã倧éã®ããŒã¿ãé«éã§åŠçããããFortranã®å©çšãèŠéããªãååšãªã®ã§ãã
ãŸããè¿å¹Žã¯ãªãŒãã³ãœãŒã¹ã®Fortranã©ã€ãã©ãªãå¢ããŠããŠããŸãã
ãããã®ã©ã€ãã©ãªã¯ãéçºè ã®æéãæžããã ãã§ãªããã³ãŒãã®å質ãåäžããããšããå©ç¹ããããŸãã
6.3 ä»åŸæ±ããããã©ã€ãã©ãªã®ç¹æ§
Fortranã®ã©ã€ãã©ãªãããããã©ã®ããã«çºå±ããŠããã®ãããã®ãã³ããšãªãèŠçŽ ã«ã¯æ¬¡ã®ãããªãã®ããããŸãã
ãŸããã©ã€ãã©ãªã®äžæ žããªãæ°å€èšç®ã®é«éåã«ã¯ãåŒãç¶ãç 究éçºãå¿ èŠãšãªã£ãŠããŸãã
ãã®äžã§ãFortranã©ã€ãã©ãªã®ãŠãŒã¶ããªãã£åäžãæ±ããããŠããŸãã
å ·äœçã«ã¯ãæ±çšçãªæ©èœããå¯èœãªéãå°éçãªæ©èœãŸã§å¯Ÿå¿ãããããªã©ã€ãã©ãªãéå®ãããã§ãããã
6.4 Fortranãšä»ã®ããã°ã©ãã³ã°èšèªãšã®é¢ãã
Fortranãšä»ã®ããã°ã©ãã³ã°èšèªãšã®é¢é£æ§ããä»åŸã®ã©ã€ãã©ãªèšèšã«ãããŠéèŠãªèŠçŽ ãšãªããŸãã
å®éãå€ãã®ããã°ã©ãã³ã°èšèªãFortranã®ã©ã€ãã©ãªãå©çšããŠããŸãã
ããã¯Fortranãç§åŠæè¡èšç®ã«ãããåªããæ§èœãæã€ããã§ãããããããããã®å°äœã¯æºãããªãã§ãããã
éã«ãPythonãRãã¯ãããšããä»ã®èšèªã®ã©ã€ãã©ãªããFortranãžã®åœ±é¿ãèŠéããŸããã
ãããã®èšèªã¯ãŠãŒã¶ããªãã£ãéçºè ã®å¹çåã«éãã眮ããŠãããFortranã©ã€ãã©ãªã«ããã®åœ±é¿ãåæ ãããŠããŸãã
ãããã®ãã¬ã³ããåãå ¥ããããšã§ãFortranã©ã€ãã©ãªã¯æ°ããªäŸ¡å€ãçã¿åºãå¯èœæ§ãç§ããŠããŸãã