Fortran NAMELIST groups can be used to create a unprecedentedly simple method of passing values via the command line. The following example program simply needs an initialized variable added to the NAMELIST and it automatically is available as a command line argument
program testit
implicit none
character(len=255) :: message ! use for I/O error messages
character(len=:),allocatable :: string ! stores command line argument
integer :: ios
! declare and initialize a namelist
integer :: i=1, j=2, k=3
real :: s=111.1, t=222.2, r=333.3
real :: arr(3)=[10.0,20.0,30.0]
character(len=255) :: c=' '
namelist /cmd/ i,j,k,s,t,r,c ! just add a variable here !!!!
string=get_namelist()
write(*,*)'STRING=',string
read(string,nml=cmd,iostat=ios,iomsg=message) ! internal read of namelist
if(ios.ne.0)then
write(*,'("ERROR:",i0,1x,a)')ios, trim(message)
endif
write(*,nml=cmd) ! use the values
contains
function get_namelist() result (string)
character(len=:),allocatable :: string ! stores command line argument
integer :: command_line_length
call get_command(length=command_line_length) ! get length needed to hold command
allocate(character(len=command_line_length) :: string)
call get_command(string)
! trim off command name and get command line arguments
string=adjustl(string)//' '
string=string(index(string,' '):)
string="&cmd "//string//" /" ! add namelist prefix and terminator
end function get_namelist
end program testit
and then you can call the program with NAMELIST syntax like:
./testit r=200e3 i=200 ./testit "c='my character string' S=10,T=20.30,R=3e-2" ./testit K=33333,J=22222,I=11111
No need to convert from strings to numeric values, arrays and user-defined types can be used, complex values can be input ... just define the variable and add it to the NAMELIST definition.