{"id":17654145,"url":"https://github.com/pnavaro/fortran-vs-julia","last_synced_at":"2025-07-15T18:47:21.298Z","repository":{"id":41957918,"uuid":"135690513","full_name":"pnavaro/fortran-vs-julia","owner":"pnavaro","description":"Fortran-Julia syntax comparison and Maxwell Solver in 2D using Yee numerical scheme and MPI topology","archived":false,"fork":false,"pushed_at":"2024-03-25T12:25:14.000Z","size":5234,"stargazers_count":17,"open_issues_count":1,"forks_count":5,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-07T09:13:47.717Z","etag":null,"topics":["cheatsheet","fdtd","fortran","fortran90","julia","julia-language","language-comparison","maxwell","maxwell-equations-solver","mpi"],"latest_commit_sha":null,"homepage":"https://pnavaro.github.io/fortran-vs-julia/","language":"Fortran","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pnavaro.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-06-01T08:31:07.000Z","updated_at":"2025-03-25T12:32:01.000Z","dependencies_parsed_at":"2025-03-10T22:42:30.981Z","dependency_job_id":null,"html_url":"https://github.com/pnavaro/fortran-vs-julia","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/pnavaro/fortran-vs-julia","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pnavaro%2Ffortran-vs-julia","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pnavaro%2Ffortran-vs-julia/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pnavaro%2Ffortran-vs-julia/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pnavaro%2Ffortran-vs-julia/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pnavaro","download_url":"https://codeload.github.com/pnavaro/fortran-vs-julia/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pnavaro%2Ffortran-vs-julia/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265451746,"owners_count":23767818,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cheatsheet","fdtd","fortran","fortran90","julia","julia-language","language-comparison","maxwell","maxwell-equations-solver","mpi"],"created_at":"2024-10-23T12:08:50.035Z","updated_at":"2025-07-15T18:47:21.259Z","avatar_url":"https://github.com/pnavaro.png","language":"Fortran","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Julia Syntax: Comparison with Fortran\n\nThis is a simple cheatsheet and some performance comparison for scientific programmers who are interested in discover Julia.\nIt is not an exhaustive list. This page is inspired from [A Cheatsheet for Fortran 2008 Syntax: Comparison with Python 3](https://github.com/wusunlab/fortran-vs-python/).\n\n\u003ctable width=\"100%\"\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003c/td\u003e\n        \u003ctd\u003eFortran\u003c/td\u003e\n        \u003ctd\u003eJulia\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eTop-level constructs\u003c/td\u003e\n        \u003ctd\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ethe main program\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nprogram my_program\n    ...\nend program\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\u003cpre lang=\"julia\"\u003e\nfunction my_program()\n    ...\nend\nmy_program()\n\u003c/pre\u003e\nNot required but it is recommended to use a function for your main program  \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003emodules\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nmodule my_module\n    ...\nend module my_module\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n      \u003cpre lang=\"julia\"\u003e\nmodule MyModule\n    ...\nend\n\u003c/pre\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003esubroutines\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nsubroutine my_subroutine\n    ...\nend subroutine my_subroutine\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\u003cpre lang=\"fortran\"\u003e\nfunction my_subroutine!\n    ...\nend\n\u003c/pre\u003e\n      The bang in the function name is a convention if a function mutates one or more of its arguments. The convention is that the modified arguments should (if possible) come first.   \n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003efunctions\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nfunction f(x) result(res)\n    res = ...\nend function f\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nfunction my_function(x)\n    ...\n    return res\nend\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n        \u003ctr\u003e\n        \u003ctd\u003eGeneric interface\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nmodule cube_root_functions\ninterface cube_root\n    function s_cube_root(x)\n      real :: s_cube_root\n      real, intent(in) :: x\n    end function s_cube_root\n    function d_cube_root(x)\n      double precision :: d_cube_root\n      double precision, intent(in) :: x\n    end function d_cube_root\n  end interface\nend module cube_root_functions\nfunction s_cube_root(x)\n    real :: s_cube_root\n    real, intent(in) :: x\n    s_cube_root = x ** (1.0/3.0)\nend function s_cube_root\nfunction d_cube_root(x)\n    double precision :: d_cube_root\n    double precision, intent(in) :: x\n    d_cube_root = x ** (1.0d0/3.0d0)\nend function d_cube_root\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\ncube_root( x :: Float32 ) :: Float32 = x^(1/3)\ncube_root( x :: Float64 ) :: Float64 = x^(1/3)\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003esubmodules\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nmodule main_module\n    ...\ncontains\n\u0026lt;\u003ci\u003esubmodule statements\u003c/i\u003e\u0026gt;\nend module main_module\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\u003cpre lang=\"julia\"\u003e\nmodule MainModule\n    ...\n    module SubModule \n        ...\n    end\nend\n\u003c/pre\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eimport statement\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nuse my_module\nuse my_module, only : fun1, var1\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nusing MyModule\nimport MyModule: fun1, var1\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ecall subroutines and functions\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\ncall my_subroutine(\u003ci\u003eargs\u003c/i\u003e)\nmy_function(\u003ci\u003eargs\u003c/i\u003e)\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nmy_function(\u003ci\u003eargs\u003c/i\u003e)\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eabort a program\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nstop\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nexit()\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003einline comments\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\n! This is a comment\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\n# This is a comment\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003einclude external source files\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\ninclude \u003ci\u003e'source_file_name'\u003c/i\u003e\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\u003cpre lang=\"julia\"\u003e\ninclude(\u003ci\u003e\"source_file_name\"\u003c/i\u003e)\n\u003c/pre\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eControl flow patterns\u003c/td\u003e\n        \u003ctd\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eif\u003c/code\u003e construct\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nif \u003ci\u003e\u0026lt;logical expr\u0026gt;\u003c/i\u003e then\n    ...\nelse if \u003ci\u003e\u0026lt;logical expr\u0026gt;\u003c/i\u003e then\n    ...\nelse\n    ...\nend if\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nif \u003ci\u003e\u0026lt;logical expr\u0026gt;\u003c/i\u003e\n    ...\nelseif \u003ci\u003e\u0026lt;logical expr\u0026gt;\u003c/i\u003e\n    ...\nelse\n    ...\nend\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003ecase\u003c/code\u003e construct\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nselect case \u003ci\u003e\u0026lt;expr\u0026gt;\u003c/i\u003e\n    case \u003ci\u003e\u0026lt;value\u0026gt;\u003c/i\u003e\n        ...\n    case \u003ci\u003e\u0026lt;value\u0026gt;\u003c/i\u003e\n        ...\n    case default\n        ...\nend select\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eNot supported. Possible alternative is to use the ternary \u003cpre\u003e ? : \u003c/pre\u003e syntax:\n\u003cpre lang=\"julia\"\u003e\nfunction case(x)\n    x == 1     ? println(1) : \n    x + 1 == 3 ? println(2) :\n    x == 3     ? println(3) :\n    println(\"greater than 3\")\nend\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003edo\u003c/code\u003e construct\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\ndo \u003ci\u003ei = start_value\u003c/i\u003e, \u003ci\u003eend_value\u003c/i\u003e, \u003ci\u003estep\u003c/i\u003e\n    ...\nend do\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nfor i in start:step:end\n    ...\nend\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003edo while\u003c/code\u003e construct\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\ndo while \u003ci\u003e\u0026lt;logical expr\u0026gt;\u003c/i\u003e\n    ...\nend do\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nwhile \u003ci\u003e\u0026lt;logical expr\u0026gt;\u003c/i\u003e\n    ...\nend\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ebreak from a loop\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nexit\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nbreak\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eleave this iteration and continue to the next iteration\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\ncycle\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\ncontinue\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eData types\u003c/td\u003e\n        \u003ctd\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003edeclaration\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\ninteger(kind=8) :: n = 0\nreal(kind=8) :: x = 0.\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nn = 0\nn :: Int64 = 0\nx = 0.\nx :: Float64 = 0.\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003enamed constants\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\ninteger, parameter :: answer = 42\nreal(8), parameter :: pi = 4d0 * atan(1d0)\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n      \u003cpre lang=\"julia\"\u003e\nconst answer = 42\n\u003c/pre\u003e\n            \u003ci\u003epi\u003c/i\u003e is a named constant in Julia standard.\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ecomplex number\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\ncomplex :: z = (1., -1.)\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nz = 1 - 1im\nz = complex(1, -1)\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003estring\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\ncharacter(len=10) :: str_fixed_length\ncharacter(len=:), allocatable :: str_var_length\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nstring = \"this is a string\"\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003epointer\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nreal, pointer :: p\nreal, target :: r\np =\u003e r\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n          \u003cpre lang=\"julia\"\u003e\np = Ref(r)\n\u003c/pre\u003e\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eboolean\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\n.true.\n.false.\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\ntrue\nfalse\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003elogical operators\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\n.not.\n.and.\n.or.\n.eqv.\n.neqv.\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\n!\n\u0026\u0026\n||\n\u003c/pre\u003e\nOther logical operators do not have built-in support.\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eequal to\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\n==, .eq.\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\n==\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003enot equal to\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\n/=, .ne.\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\n!==\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003egreater than\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\n\u003e, .gt.\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\n\u003e\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eless than\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\n\u003c, .lt.\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\n\u003c\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003egreater than or equal to\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\n\u003e=, .ge.\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\n\u003e=\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eless than or equal to\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\n\u003c=, .ge.\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\n\u003c=\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003earray declaration\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nreal(8), dimension(3) :: a = [1., 2., 3.]\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\na = [1., 2., 3.]\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003estring array declaration\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\ncharacter(len=20), dimension(3, 4) :: char_arr\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nchar_arr = String[]\npush!(char_arr, new_string)\n\u003c/pre\u003e\nThere is no easy way to preallocate space for strings.\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eelementwise array operations\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\na \u003ci\u003eop\u003c/i\u003e b\n\u003c/pre\u003e\n\u003ci\u003e\u003ccode\u003eop\u003c/code\u003e\u003c/i\u003e can be \u003ccode\u003e+, -, *, /, **, =, ==\u003c/code\u003e, etc.\u003cbr\u003e\nThis is supported since the Fortran 90 standard.\n        \u003c/td\u003e\n        \u003ctd\u003eSupported by using the broadcast operator `.`and the `f.(x)` syntax\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003efirst element\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\na(1)\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\na[1] (or a[begin] for general indexing) \n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eslicing\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\na(1:5)\n\u003c/pre\u003e\nThis slice includes \u003ccode\u003ea(5)\u003c/code\u003e.\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\na[1:5] (or @view(a[1:5]) for non-allocating slicing)\n\u003c/pre\u003e\nThis slice includes \u003ccode\u003ea[5]\u003c/code\u003e.\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eslicing with steps\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\na(1:100:2)\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\na[1:2:100]\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003esize\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nsize(a)\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nlength(a)\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eshape\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nshape(a)\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nsize(a)\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eshape along a dimension\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nsize(a, dim)\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nsize(a, dim)\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eType conversion\u003c/td\u003e\n        \u003ctd\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eto integer by truncation\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nint(x)\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\ntrunc(Int, x )\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eto integer by rounding\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nnint()\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nround()\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003einteger to float\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nreal(a[, kind])\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nfloat()\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ecomplex to real\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nreal(z[, kind])\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nreal()\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eto complex\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\ncmplx(x [, y [, kind]])\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\ncomplex()\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eto boolean\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nlogical()\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nBool()\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eDerived data types\u003c/td\u003e\n        \u003ctd\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003edefinition\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\ntype Point\n    real(8) :: x, y\nend type Point\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nstruct Point\n    x :: Float64\n    y :: Float64\nend\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003einstantiation\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\ntype(Point) :: point1 = Point(-1., 1.)\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\npoint1 = Point(-1., 1.)\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eget attributes\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\npoint1%x\npoint1%y\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\npoint1.x\npoint1.y\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003earray of derived type\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\ntype(Point), dimension(:), allocatable :: point_arr\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\u003cpre lang=\"julia\"\u003e\npoint_arr = Vector{Point}\n\u003c/pre\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003etype bound procedures (aka class method)\u003c/td\u003e\n        \u003ctd\u003eAssume that \u003ccode\u003eCircle\u003c/code\u003e has a type bound procedure (subroutine) \u003ccode\u003eprint_area\u003c/code\u003e.\n\u003cpre lang=\"fortran\"\u003e\ntype(Circle) :: c\ncall c%print_area\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eAssume that \u003ccode\u003eCircle\u003c/code\u003e has a method \u003ccode\u003eprint_area(c :: Circle)\u003c/code\u003e.\n\u003cpre lang=\"python\"\u003e\nc = Circle()\nprint_area(c)\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n    \u003ctd\u003eBuilt-in mathematical functions\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003efunctions with the same names\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nabs(), cos(), cosh(), exp(), floor(), log(),\nlog10(), max(), min(), sin(), sinh(), sqrt(),\nsum(), tan(), tanh(), acos(), asin(), atan()\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eHave the same name in Julia.\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003efunctions with different names\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\naimag()\natan2(x, y)\nceiling()\nconjg(z)\nmodulo()\ncall random_number()\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nimag()\natan(x, y)\nceil()\nconj()\nmod(), %\nRandom.rand()\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eBuilt-in string functions\u003c/td\u003e\n        \u003ctd\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003estring length\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nlen()\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nlength()\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003estring to ASCII code\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\niachar()\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nInt()\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eASCII code to string\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nachar()\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nString()\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003estring slicing\u003c/td\u003e\n        \u003ctd\u003eSame as 1D array slicing.\u003c/td\u003e\n        \u003ctd\u003eSame as 1D array slicing.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003efind the position of a substring\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nindex(string, substring)\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nfindfirst(substring, string)\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003estring concatenation\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\n\"hello\" // \"world\"\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\n\"hello\" * \"world\"\nstring(\"hello\", \"world\")\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eArray constructs\u003c/td\u003e\n        \u003ctd\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003ewhere\u003c/code\u003e construct\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nwhere a \u003e 0\n    b = 0\nelsewhere\n    b = 1\nend where\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nb[a .\u003e 0] .= 0\nb[a .\u003c= 0] .= 1\n\u003c/pre\u003e\nor (faster - does not allocate an intermediate array):\n\u003cpre lang=\"julia\"\u003e\nfor i in eachindex(a)\n    a[i] \u003e 0 ? b[i] = 0 : b[i] = 1\nend\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eComprehension\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e    \ninteger, parameter :: n = 20\ninteger, parameter :: m = n*(n+1)/2\ninteger :: i, j\ncomplex, dimension(m) :: a\na = [ ( ( cmplx(i,j), i=j,n), j=1,n) ]\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\na = [ complex(i,j) for j=1:n for i=j:n]\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003e\u003ccode\u003eforall\u003c/code\u003e construct\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nreal, dimension(10, 10) :: a = 0\nint :: i, j\n...\nforall (i = 1:10, j = 1:10, i \u003c= j)\n    a(i, j) = i + j\nend forall\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\na = zeros(Float32, 10, 10)\nfor i in 1:10, j in 1:10\n    if i \u003c= j\n        a[i, j] = i + j\n    end\nend\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eCPU time\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\ncall cpu_time()\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\ntime = @elapsed begin\n...\nend\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ecommand line arguments\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\ncall command_argument_count()\ncall get_command()\ncall get_command_argument()\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003eFor basic parsing, use \u003ccode\u003eARGS\u003c/code\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eInput/output\u003c/td\u003e\n        \u003ctd\u003e\u003c/td\u003e\n        \u003ctd\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eprint\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nprint fmt, \u003ci\u003e\u0026lt;output list\u0026gt;\u003c/i\u003e\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nprintln()\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eread from the command prompt\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nread fmt, \u003ci\u003e\u0026lt;input list\u0026gt;\u003c/i\u003e\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nreadline()\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eopen a file\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nopen(unit, file, ...)\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nf = open(file, 'r')\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eread from a file\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nread(unit, fmt, ...) \u003ci\u003e\u0026lt;input list\u0026gt;\u003c/i\u003e\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nread(f)\nreadlines(f)\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ewrite to a file\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nwrite(unit, fmt, ...) \u003ci\u003e\u0026lt;output list\u0026gt;\u003c/i\u003e\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nwrite(f, ...)\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eclose a file\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nclose(unit, ...)\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"python\"\u003e\nclose(f)\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003efile inquiry\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\ninquire(unit, ...)\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\u003cpre lang=\"julia\"\u003e\nisfile(\"my_file.txt\")\n\u003c/pre\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ebackspace in a file\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nbackspace(unit, ...)\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nskip(f, -1)\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003eend of file (EOF)\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nendfile(unit, ...)\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nseekend(f)\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n        \u003ctd\u003ereturn to the start of a file\u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"fortran\"\u003e\nrewind(unit, ...)\n\u003c/pre\u003e\n        \u003c/td\u003e\n        \u003ctd\u003e\n\u003cpre lang=\"julia\"\u003e\nseekstart(f)\n\u003c/pre\u003e\n        \u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n\n## Maxwell parallel solver in 2D\n\nHere an example of a Fortran to Julia translation. We use the Yee numerical scheme FDTD: [Finite-Difference Time-Domain method](https://en.wikipedia.org/wiki/Finite-difference_time-domain_method) and MPI topology.\nYou can find a serial version and a parallel version using MPI library.\n\nTest your [MPI.jl](https://juliaparallel.github.io/MPI.jl/stable/installation/) installation with \n\n```\n$ mpirun -np 4 julia --project hello_mpi.jl\nHello world, I am 0 of 4\nHello world, I am 3 of 4\nHello world, I am 1 of 4\nHello world, I am 2 of 4\n```\n### Performances (without disk IO)\n\nOn small program like this in Julia is really fast.\n\n### Serial computation\n\n#### 1200 x 1200 and 1000 iterations.\n\n- `julia -O3 --check-bounds=no maxwell_serial.jl` : 14 seconds\n- `make \u0026\u0026 time ./maxwell_serial_fortran` : 31 seconds \n\n#### 1200 x 1200 on 9 processors and 1000 iterations\n\n- `make \u0026\u0026 time mpirun -np 9 ./maxwell_mpi_fortran` : 7 seconds \n- `mpirun -np 9 julia --project -O3 --check-bounds=no ` : 5 seconds\n\n### Plot the magnetic field\n\nUncomment the plot_fields call in Julia programs or change idiag value in input_data for fortran.\n\n```\ngnuplot bz.gnu\n```\n![](bz_field.gif)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpnavaro%2Ffortran-vs-julia","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpnavaro%2Ffortran-vs-julia","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpnavaro%2Ffortran-vs-julia/lists"}