Books on algorithms and numerical analysis often have pseudocode. A Wikipedia article presents a few styles of pseudocode and notes that pseudocode has not been standardized. If you write in a pseudocode that resembles Fortran, Python, R, or some mix of them, ChatGPT-4 can usually generate valid Fortran from it. I wonder if the Fortran community could agree on a syntax for a pseudocode that resembles Fortran but is shorter and simpler that special-purpose tools or LLMs could translate to standard Fortran. Syntax of interactive Fortran is a related thread from 2021.
ChatGPT-4 translates
do i = 1 to 16
if mod(i, 3) == 0 and mod(i, 5) == 0
print "fizzbuzz"
else if mod(i, 3) == 0
print "fizz"
else if mod(i, 5) == 0
print "buzz"
else
print i
end if
end do
to valid Fortran
program FizzBuzz
implicit none
integer :: i
do i = 1, 16
if (mod(i, 3) == 0 .and. mod(i, 5) == 0) then
print *, 'fizzbuzz'
else if (mod(i, 3) == 0) then
print *, 'fizz'
else if (mod(i, 5) == 0) then
print *, 'buzz'
else
print *, i
end if
end do
end program FizzBuzz
and does the same if do i=1, 16
is replaced by for i in 1:16
, terminated by next
instead of end do
.
It translates pseudocode to simulate pi
nran = 10^6
nin = 0
for i in 1:ran
x = rand()
y = rand()
if (x**2 + y**2) < 1
nin += 1
end if
next
print "pi =",4*nin/nran
to
program estimate_pi
implicit none
integer, parameter :: dp = kind(1.d0)
integer :: i, nran, nin
real(dp) :: x, y, pi_estimate
integer :: count, count_rate, count_max, seed_size
integer, allocatable :: seed(:)
call system_clock(count=count, count_rate=count_rate, count_max=count_max)
call random_seed(size=seed_size)
allocate(seed(seed_size))
seed = count * count_max / count_rate
call random_seed(put=seed)
nran = 10**6
nin = 0
do i = 1, nran
call random_number(x)
call random_number(y)
if ((x**2 + y**2) < 1) then
nin = nin + 1
end if
end do
pi_estimate = 4.d0 * nin / nran
print*, "pi =", pi_estimate
end program estimate_pi
admittedly after a few iterations of being fed gfortran error messages regarding its misuse of random_seed