0

I'm working with numerical weather forecast named as follow:

sub_gfsanl_4_2011MMDD-IIII-FFFF.grb2

-MM stands for month from 01 to 12

-DD stands for days from 01 to 31

-IIII stands for initialisation time, the first and second digits are for hours the third and last are for minutes

-FFFF stands for forecast hour , the first and second digits are for hours the third and last are for minutes

In my directory I have several files for a given days of a given months. A day has 4 data, one at every six hours IIII=0000 ,0600,1200,1800.

What I'm trying to do is to list all files of a given days, here the f90 code I wrote:

program test_ec

implicit none

!==variable declaration==

integer :: mi,di,dil,mil
character*3 :: temp

!==Program instructions==

mil=1
write(temp,'(i2.2)') mil
read(temp,'(i2.2)') mi
!convert the month into a two digit value mi=01  


 ! change to directory where the data are stored
 CALL chdir('/media/Hello/ncfiles/GFS' )

do dil=1,31

     !loop over days
     write(temp,'(i2.2)') dil
     read(temp,'(i2.2)') di

     ! converting day number into a two digit number, store this value into di. ex dil=9 then di=09

CALL execute_command_line( 'ls sub_gfsanl_4_2011${mi}${di}*.nc > yes.txt' )
!list all files with the correct month and days and store it to yes.txt

end do

end program test_ec

For some reasons the execute_command_line doesn't seem to like the $ for variable...

2 Answers2

0

You cannot use ${mi}${di} in shell. They are Fortran variables, not shell variables. You must put the numbers into the string inside Fortran. Use some of the established methods. They were treated here many times in Convert integers to strings to create output filenames at run time and its duplicates (see Related on the right).

Community
  • 1
  • 1
  • I don' t know how to edit my previous message.. Well it's a little more complex than that, the method you show don't work for my case i just provided a little sample of the original code (2000 lines...) to not confuse people. So here a little more information : I try ty concatenate the content all netcdf forecast file for a day! Remember sometimes there is three file other times four. That why i need to loop over the days and i can't use the method you suggested! Do you have any on how to pass my fortran variable into shell? Thanks – Momo Diallo Oct 19 '16 at 15:25
0

Well thanks to Vladimir suggestion here what i did to solve my problem!

program test_ec


implicit none

integer :: mi,di,iiii,fff
 character(len=1024) :: filename
 character(len=1024) :: format_string
 logical exist

mi=1
CALL chdir('/media/Hello/ncfiles/GFS' )

!do di=1,10
     do iiii=0,18,6
         do fff=0,18,6

                   format_string = "(A17,i2.2,i2.2,A1,i4.4,A1,i3.3,A8)"
                    write (filename,format_string) "sub_gfsanl_4_2011",mi,di,"_",iiii,"_",fff,".grb2.nc"

                    inquire(file=trim(filename), exist=exist) 

                           if (exist) then

                                   write(*,*) 'file exists i can do do whatever i want with this file'
                           else
                                   write(*,*) 'I did not find that file.'

                           end if
enddo
   enddo
     enddo

end program test_ec
  • I would suggest a dimensioned CHARACTER(LEN=2) for the DD and MM. The other option is some code to add a 0 before DD and MM between 1-9. Both work fine, just the former uses something like day(DD) where DD is the integer index of the character array Day. – Holmz Oct 21 '16 at 00:29