Creating directory with name containing real numbe

2020-02-29 13:56发布

In my program I need to store result files for different cases. I have decided to create separate directories to store these result files. To explain the exact situation here is a pseudo code.

do i=1,N     ! N cases of my analysis
    U=SPEED(i)
    call write_files(U)     !Create a new directory for this case and Open files (1 = a.csv, 2 = b.csv) to write data
    call postprocess()      !Write data in files (a.csv, b.csv)
    call close_files()      !Close all files (1,2)
end do

subroutine write_files(i)
    !Make directory i
    !Open file a.csv and b.csv with unit 1 & 2
    !Write header information in file a.csv and b.csv
close subroutine

I am struggling in converting the real variable U to a character variable so that I can use call system('mkdir out/' trim(U)) to create separate folders to store my results.

I would also like to mention that my variable U is speed which is like 0.00000, 1.00000, 1.50000 etc. Is there a way I can simplify my directory name so it is like 0,1,1.5 etc.

Hope my explanation is clear. If not let me know, I will try to edit as required.

Thank you for help.

1条回答
闹够了就滚
2楼-- · 2020-02-29 14:27

The argument of system needs to be a string. You therefore have to cast the real to a string and concatenate mkdir out/ with that string. Here is a quick example:

module dirs 
contains
  function dirname(number)
    real,intent(in)    :: number
    character(len=6)  :: dirname

    ! Cast the (rounded) number to string using 6 digits and
    ! leading zeros
    write (dirname, '(I6.6)')  nint(number)
    ! This is the same w/o leading zeros  
    !write (dirname, '(I6)')  nint(number)

    ! This is for one digit (no rounding)
    !write (dirname, '(F4.1)')  number
  end function
end module

program dirtest
  use dirs

  call system('mkdir -p out/' // adjustl(trim( dirname(1.) ) ) )
end program

Instead of call system(...) which is non-standard, you could use the Fortran 2008 statement execute_command_line (if your compiler supports it).

call execute_command_line ('mkdir -p out/' // adjustl(trim( dirname(1.) ) ) )
查看更多
登录 后发表回答