LCOV - code coverage report
Current view: | top level - control - filenames.F90 (source / functions) |  |  | Hit | Total | Coverage
Test: | coverage.info |  | Lines: | 55 | 74 | 74.3 %
Date: | 2025-01-13 21:54:50 |  | Functions: | 2 | 2 | 100.0 %

              Line data    Source code
           1             : module filenames
           2             :
           3             : ! Module and methods to handle filenames needed for the model. This
           4             : ! includes input filenames, and most output filenames that the model
           5             : ! uses. All filenames that the model uses will use methods or data
           6             : ! constructed by this module. In some cases (such as the cam_history module)
           7             : ! other modules or routines will store the actual filenames used, but
           8             : ! this module is used to determine the names.
           9             :
          10             : use time_manager,     only: get_curr_date, get_prev_date
          11             : use shr_kind_mod,     only: cl=>shr_kind_cl
          12             : use cam_control_mod,  only: caseid
          13             : use cam_abortutils,   only: endrun
          14             : use cam_logfile,      only: iulog
          15             :
          16             : implicit none
          17             : private
          18             : save
          19             :
          20             : public get_dir                                  ! Get the directory name from a full path
          21             : public interpret_filename_spec                  ! Interpret a filename specifier
          22             :
          23             : !===============================================================================
          24             : CONTAINS
          25             : !===============================================================================
          26             :
          27         768 : character(len=cl) function get_dir( filepath )
          28             :
          29             : ! Return the directory from a filename with a full path
          30             :
          31             :    ! arguments
          32             :    character(len=*), intent(in) :: filepath ! Full path for a filename
          33             :
          34             :    ! local variables
          35             :    integer :: filenameposition   ! Character position for last character of directory
          36             :    !-----------------------------------------------------------------------------
          37             :
          38             :    ! Get the directory name of the input dataset
          39         768 :    filenameposition = index( filepath, '/', back=.true. )
          40         768 :    if ( filenameposition == 0 )then
          41         768 :       get_dir  = './'
          42             :    else
          43           0 :       get_dir  = filepath(1:filenameposition)
          44             :    end if
          45             :
          46         768 : end function get_dir
          47             :
          48             : !===============================================================================
          49             :
          50      249600 : character(len=cl) function interpret_filename_spec( filename_spec, number, prev, case, &
          51             :    yr_spec, mon_spec, day_spec, sec_spec, flag_spec )
          52             :
          53             : ! Create a filename from a filename specifier. The
          54             : ! filename specifyer includes codes for setting things such as the
          55             : ! year, month, day, seconds in day, caseid, and tape number. This
          56             : ! routine is private to filenames.F90
          57             : !
          58             : ! Interpret filename specifyer string with:
          59             : !
          60             : !      %c for case,
          61             : !      %t for optional number argument sent into function
          62             : !      %y for year
          63             : !      %m for month
          64             : !      %d for day
          65             : !      %s for second
          66             : !      %% for the "%" character
          67             : !
          68             : ! If the filename specifyer has spaces " ", they will be trimmed out
          69             : ! of the resulting filename.
          70             :
          71             :    ! arguments
          72             :    character(len=*), intent(in)           :: filename_spec   ! Filename specifier to use
          73             :    integer         , intent(in), optional :: number          ! Number to use for %t field
          74             :    logical         , intent(in), optional :: prev            ! If should label with previous time-step
          75             :    character(len=*), intent(in), optional :: case            ! Optional casename
          76             :    integer         , intent(in), optional :: yr_spec         ! Simulation year
          77             :    integer         , intent(in), optional :: mon_spec        ! Simulation month
          78             :    integer         , intent(in), optional :: day_spec        ! Simulation day
          79             :    integer         , intent(in), optional :: sec_spec        ! Seconds into current simulation day
          80             :    character(len=*), intent(in), optional :: flag_spec       ! flag for accumulated or instantaneous
          81             :
          82             :    ! Local variables
          83             :    integer :: year  ! Simulation year
          84             :    integer :: month ! Simulation month
          85             :    integer :: day   ! Simulation day
          86             :    integer :: ncsec ! Seconds into current simulation day
          87             :    character(len=1) :: flag
          88             :    character(len=cl) :: string    ! Temporary character string
          89             :    character(len=cl) :: format    ! Format character string
          90             :    integer :: i, n  ! Loop variables
          91             :    logical :: previous              ! If should label with previous time-step
          92             :    logical :: done
          93             :    !-----------------------------------------------------------------------------
          94             :
          95      249600 :    if ( len_trim(filename_spec) == 0 )then
          96           0 :       call endrun ('INTERPRET_FILENAME_SPEC: filename specifier is empty')
          97             :    end if
          98      249600 :    if ( index(trim(filename_spec)," ") /= 0 )then
          99           0 :       call endrun ('INTERPRET_FILENAME_SPEC: filename specifier can not contain a space:'//trim(filename_spec))
         100             :    end if
         101             :    !
         102             :    ! Determine year, month, day and sec to put in filename
         103             :    !
         104      249600 :    if (present(yr_spec) .and. present(mon_spec) .and. present(day_spec) .and. present(sec_spec)) then
         105        3840 :       year  = yr_spec
         106        3840 :       month = mon_spec
         107        3840 :       day   = day_spec
         108        3840 :       ncsec = sec_spec
         109             :    else
         110      245760 :       if ( .not. present(prev) ) then
         111             :          previous = .false.
         112             :       else
         113      245760 :          previous = prev
         114             :       end if
         115      245760 :       if ( previous ) then
         116           0 :          call get_prev_date(year, month, day, ncsec)
         117             :       else
         118      245760 :          call get_curr_date(year, month, day, ncsec)
         119             :       end if
         120             :    end if
         121      249600 :    if (present(flag_spec)) then
         122      245760 :       flag = flag_spec
         123             :    else
         124        3840 :       flag = ''
         125             :    end if
         126             :    !
         127             :    ! Go through each character in the filename specifyer and interpret if special string
         128             :    !
         129      249600 :    i = 1
         130      249600 :    interpret_filename_spec = ''
         131     3482880 :    do while ( i <= len_trim(filename_spec) )
         132             :       !
         133             :       ! If following is an expansion string
         134             :       !
         135     3233280 :       if ( filename_spec(i:i) == "%" )then
         136     1739520 :          i = i + 1
         137     1739520 :          select case( filename_spec(i:i) )
         138             :          case( 'c' )   ! caseid
         139      249600 :             if ( present(case) )then
         140         768 :                string = trim(case)
         141             :             else
         142      248832 :                string = trim(caseid)
         143             :             end if
         144             :          case( 't' )   ! number
         145      245760 :             if ( .not. present(number) )then
         146           0 :                write(iulog,*) 'INTERPRET_FILENAME_SPEC: number needed in filename_spec' &
         147           0 :                   , ', but not provided to subroutine'
         148           0 :                write(iulog,*) 'filename_spec = ', filename_spec
         149           0 :                call endrun
         150             :             end if
         151      245760 :             if (      number > 999 ) then
         152           0 :                format = '(i4.4)'
         153           0 :                if ( number > 9999 ) then
         154           0 :                   write(iulog,*) 'INTERPRET_FILENAME_SPEC: number is too large: ', number
         155           0 :                   call endrun
         156             :                end if
         157      245760 :             else if ( number > 99  ) then
         158           0 :                format = '(i3.3)'
         159      245760 :             else if ( number > 9   ) then
         160           0 :                format = '(i2.2)'
         161             :             else
         162      245760 :                format = '(i1.1)'
         163             :             end if
         164      245760 :             write(string,format) number
         165             :          case( 'y' )   ! year
         166      249600 :             if ( year > 99999   ) then
         167           0 :                format = '(i6.6)'
         168      249600 :             else if ( year > 9999    ) then
         169           0 :                format = '(i5.5)'
         170             :             else
         171      249600 :                format = '(i4.4)'
         172             :             end if
         173      249600 :             write(string,format) year
         174             :          case( 'm' )   ! month
         175      249600 :             write(string,'(i2.2)') month
         176             :          case( 'd' )   ! day
         177      249600 :             write(string,'(i2.2)') day
         178             :          case( 's' )   ! second
         179      249600 :             write(string,'(i5.5)') ncsec
         180             :          case( 'f' )   ! flag
         181      245760 :             write(string,'(a)') flag
         182             :          case( '%' )   ! percent character
         183           0 :             string = "%"
         184             :          case default
         185     1739520 :             call endrun ('INTERPRET_FILENAME_SPEC: Invalid expansion character: '//filename_spec(i:i))
         186             :          end select
         187             :          !
         188             :          ! Otherwise take normal text up to the next "%" character
         189             :          !
         190             :       else
         191     1493760 :          n = index( filename_spec(i:), "%" )
         192     1493760 :          if ( n == 0 ) n = len_trim( filename_spec(i:) ) + 1
         193      249600 :          if ( n == 0 ) exit
         194     1493760 :          string = filename_spec(i:n+i-2)
         195             :          i = n + i - 2
         196             :       end if
         197     3233280 :       if ( len_trim(interpret_filename_spec) == 0 )then
         198      249600 :          interpret_filename_spec = trim(string)
         199             :       else
         200     2983680 :          if ( (len_trim(interpret_filename_spec)+len_trim(string)) >= cl )then
         201           0 :             call endrun ('INTERPRET_FILENAME_SPEC: Resultant filename too long')
         202             :          end if
         203     2983680 :          interpret_filename_spec = trim(interpret_filename_spec) // trim(string)
         204             :       end if
         205     3233280 :       i = i + 1
         206             :
         207             :    end do
         208      249600 :    if ( len_trim(interpret_filename_spec) == 0 )then
         209           0 :       call endrun ('INTERPRET_FILENAME_SPEC: Resulting filename is empty')
         210             :    end if
         211             :
         212      249600 : end function interpret_filename_spec
         213             :
         214             : end module filenames

Generated by: LCOV version 1.14