ESMF_ConfigLoadFile_1proc_ Subroutine

private subroutine ESMF_ConfigLoadFile_1proc_(config, filename, rc)

Arguments

Type IntentOptional Attributes Name
type(ESMF_Config), intent(inout) :: config
character(len=*), intent(in) :: filename
integer, intent(out), optional :: rc

Calls

proc~~esmf_configloadfile_1proc_~~CallsGraph proc~esmf_configloadfile_1proc_ ESMF_ConfigLoadFile_1proc_ proc~clstext clstext proc~esmf_configloadfile_1proc_->proc~clstext proc~esmf_configgetinit ESMF_ConfigGetInit proc~esmf_configloadfile_1proc_->proc~esmf_configgetinit proc~esmf_imerr ESMF_IMErr proc~esmf_configloadfile_1proc_->proc~esmf_imerr proc~esmf_logfounderror ESMF_LogFoundError proc~esmf_configloadfile_1proc_->proc~esmf_logfounderror proc~esmf_utiliounitget ESMF_UtilIOUnitGet proc~esmf_configloadfile_1proc_->proc~esmf_utiliounitget proc~opntext opntext proc~esmf_configloadfile_1proc_->proc~opntext proc~esmf_imerr->proc~esmf_logfounderror proc~esmf_initcheckdeep ESMF_InitCheckDeep proc~esmf_imerr->proc~esmf_initcheckdeep esmf_breakpoint esmf_breakpoint proc~esmf_logfounderror->esmf_breakpoint proc~esmf_logrc2msg ESMF_LogRc2Msg proc~esmf_logfounderror->proc~esmf_logrc2msg proc~esmf_logwrite ESMF_LogWrite proc~esmf_logfounderror->proc~esmf_logwrite proc~esmf_utilstringuppercase ESMF_UtilStringUpperCase proc~opntext->proc~esmf_utilstringuppercase c_esmc_loggeterrormsg c_esmc_loggeterrormsg proc~esmf_logrc2msg->c_esmc_loggeterrormsg c_esmc_vmwtime c_esmc_vmwtime proc~esmf_logwrite->c_esmc_vmwtime proc~esmf_logclose ESMF_LogClose proc~esmf_logwrite->proc~esmf_logclose proc~esmf_logflush ESMF_LogFlush proc~esmf_logwrite->proc~esmf_logflush proc~esmf_logopenfile ESMF_LogOpenFile proc~esmf_logwrite->proc~esmf_logopenfile proc~esmf_utiliounitflush ESMF_UtilIOUnitFlush proc~esmf_logwrite->proc~esmf_utiliounitflush proc~esmf_utilstring2array ESMF_UtilString2Array proc~esmf_logwrite->proc~esmf_utilstring2array proc~esmf_logclose->proc~esmf_logflush proc~esmf_logflush->proc~esmf_utiliounitflush proc~esmf_utilarray2string ESMF_UtilArray2String proc~esmf_logflush->proc~esmf_utilarray2string proc~esmf_logopenfile->proc~esmf_utiliounitget proc~esmf_logopenfile->proc~esmf_utiliounitflush

Called by

proc~~esmf_configloadfile_1proc_~~CalledByGraph proc~esmf_configloadfile_1proc_ ESMF_ConfigLoadFile_1proc_ proc~esmf_configloadfile ESMF_ConfigLoadFile proc~esmf_configloadfile->proc~esmf_configloadfile_1proc_ proc~complianceinitialize ComplianceInitialize proc~complianceinitialize->proc~esmf_configloadfile proc~esmf_compconstruct ESMF_CompConstruct proc~esmf_compconstruct->proc~esmf_configloadfile proc~esmf_compset ESMF_CompSet proc~esmf_compset->proc~esmf_configloadfile proc~esmf_frameworkinternalinit ESMF_FrameworkInternalInit proc~esmf_frameworkinternalinit->proc~esmf_configloadfile proc~f_esmf_configloadfile f_esmf_configloadfile proc~f_esmf_configloadfile->proc~esmf_configloadfile proc~initialization Initialization proc~initialization->proc~esmf_configloadfile proc~read_descriptor_files read_descriptor_files proc~read_descriptor_files->proc~esmf_configloadfile proc~read_dist_specification read_dist_specification proc~read_dist_specification->proc~esmf_configloadfile proc~read_grid_specification read_grid_specification proc~read_grid_specification->proc~esmf_configloadfile proc~read_redistribution_grid read_redistribution_grid proc~read_grid_specification->proc~read_redistribution_grid proc~read_regridding_grid read_regridding_grid proc~read_grid_specification->proc~read_regridding_grid proc~read_redistribution_grid->proc~esmf_configloadfile proc~read_regridding_grid->proc~esmf_configloadfile proc~read_testharness_config Read_TestHarness_Config proc~read_testharness_config->proc~esmf_configloadfile program~esmf_appdriver ESMF_AppDriver program~esmf_appdriver->proc~esmf_configloadfile program~esmf_configoverviewex ESMF_ConfigOverviewEx program~esmf_configoverviewex->proc~esmf_configloadfile program~esmf_hconfigex ESMF_HConfigEx program~esmf_hconfigex->proc~esmf_configloadfile program~esmf_hconfigutest ESMF_HConfigUTest program~esmf_hconfigutest->proc~esmf_configloadfile proc~esmf_cplcompcreate ESMF_CplCompCreate proc~esmf_cplcompcreate->proc~esmf_compconstruct proc~esmf_cplcompset ESMF_CplCompSet proc~esmf_cplcompset->proc~esmf_compset proc~esmf_gridcompcreate ESMF_GridCompCreate proc~esmf_gridcompcreate->proc~esmf_compconstruct proc~esmf_gridcompset ESMF_GridCompSet proc~esmf_gridcompset->proc~esmf_compset proc~esmf_initialize ESMF_Initialize proc~esmf_initialize->proc~esmf_frameworkinternalinit proc~esmf_scicompcreate ESMF_SciCompCreate proc~esmf_scicompcreate->proc~esmf_compconstruct proc~esmf_scicompset ESMF_SciCompSet proc~esmf_scicompset->proc~esmf_compset proc~f_esmf_compinsertvm f_esmf_compinsertvm proc~f_esmf_compinsertvm->proc~esmf_compset proc~f_esmf_compreplicate f_esmf_compreplicate proc~f_esmf_compreplicate->proc~esmf_compset proc~f_esmf_compsetvminfo f_esmf_compsetvminfo proc~f_esmf_compsetvminfo->proc~esmf_compset proc~f_esmf_frameworkinitialize f_esmf_frameworkinitialize proc~f_esmf_frameworkinitialize->proc~esmf_frameworkinternalinit proc~read_testharness_specifier Read_TestHarness_Specifier proc~read_testharness_specifier->proc~read_descriptor_files proc~read_testharness_specifier->proc~read_dist_specification proc~read_testharness_specifier->proc~read_grid_specification proc~registeric~2 registerIC proc~registeric~2->proc~complianceinitialize program~esmf_test_harness esmf_test_harness program~esmf_test_harness->proc~read_testharness_config

Source Code

    subroutine ESMF_ConfigLoadFile_1proc_( config, filename, rc )

      type(ESMF_Config), intent(inout) :: config     ! ESMF Configuration
      character(len=*),  intent(in)    :: filename   ! file name
      integer,           intent(out), optional :: rc ! Error code
!
! !DESCRIPTION: Resource file filename is loaded into memory
!
!EOPI -------------------------------------------------------------------
      integer :: i, j, lsz, lst, led, qst, qed, cst, ptr
      integer :: lu, nrecs
      integer :: iostat
      integer :: localrc
      character(NBUF_MAX) :: line_buffer

      ! Initialize return code; assume routine not implemented
      if (present(rc)) rc = ESMF_RC_NOT_IMPL
      localrc = ESMF_RC_NOT_IMPL

      !check variables
      ESMF_INIT_CHECK_DEEP(ESMF_ConfigGetInit,config,rc)

!     Open file
!     ---------     
      call ESMF_UtilIOUnitGet (lu, rc=localrc)
      if (ESMF_LogFoundError(localrc, ESMF_ERR_PASSTHRU, &
                                ESMF_CONTEXT, rcToReturn=rc)) return
      ! A open through an interface to avoid portability problems.
      ! (J.G.)

      call opntext(lu, filename, 'old', rc=localrc)
      if (ESMF_LogFoundError(localrc, &
          msg="error opening text file: " // trim (filename), &
          ESMF_CONTEXT, rcToReturn=rc)) return

!     Count records, then read them into a local buffer
      nrecs = 0
      do
        read (lu, *, iostat=iostat)
        if (iostat /= 0) exit
        nrecs = nrecs + 1
      end do

      rewind (lu)

!     Read to end of file
!     -------------------
      config%cptr%buffer(1:1) = EOL
      ptr = 2                         ! next buffer position
      do, i = 1, nrecs
!        Read next line
!        --------------
         read (lu, '(a)', iostat=iostat) line_buffer
         if (iostat /= 0) then
           if (ESMF_LogFoundError(ESMF_RC_FILE_READ, &
             msg="error reading file - "//trim(filename), &
             ESMF_CONTEXT, rcToReturn=rc)) return
         end if
         ! find comment start, skip quoted comments
         ! lst = line start, led = line end
         ! qst = next quote start, qed = last quote end
         ! cst = comment start
         led = verify(line_buffer,BLK//TAB//DSN,back=.true.)
         if (led .gt. 0) then
           ! replace TAB's with blanks for convenience
           ! backwards compatibility after removing ESMF_Config_pad
           do j = 1, led
             if (line_buffer(j:j) .eq. TAB) line_buffer(j:j) = BLK
           end do
           lst = verify(line_buffer(:led),BLK)
           qst = scan(line_buffer(:led),QTS//QTD)
           cst = index(line_buffer(:led),CMT)
           if (cst .eq. 0) cst = led + 1
           qed = 0
           do while ((qst .ne. qed) .and. (qst .lt. cst))
             ! find end of quotation
             if (qst .eq. led) then
               qed = qst
             else
               qed = qst + index(line_buffer(qst+1:led),line_buffer(qst:qst))
             end if
             if (qed .eq. qst) then
               if (ESMF_LogFoundError(ESMF_RC_ARG_BAD, &
                 msg="missing end quote - "//trim(filename), &
                 ESMF_CONTEXT, rcToReturn=rc)) return
             else
               ! find next quotation start
               qst = qed + scan(line_buffer(qed+1:led),QTS//QTD)
               ! find next comment start
               cst = index(line_buffer(qed+1:led),CMT)
               if (cst .eq. 0) then
                 cst = led + 1
               else
                 cst = qed + cst
               end if
             end if
           end do
           led = len_trim(line_buffer(1:cst-1))
           lsz = led - lst + 1
           ! append line to buffer
           if ( lsz .gt. 0 ) then
              if ( (ptr+lsz) .ge. NBUF_MAX ) then
                 if (ESMF_LogFoundError(ESMF_RC_MEM, msg="exceeded NBUF_MAX size", &
                     ESMF_CONTEXT, rcToReturn=rc)) return
              end if
              config%cptr%buffer(ptr:ptr+lsz) = line_buffer(lst:led) // EOL
              ptr = ptr + lsz + 1
           end if
         end if

      end do

!     All done
!     --------
! Close lu
      call clstext(lu, rc=localrc)
      if(localrc /= ESMF_SUCCESS) then
         localrc = ESMF_RC_FILE_CLOSE
         if ( present (rc )) then
           rc = localrc
         endif
         return
      endif
      config%cptr%buffer(ptr:ptr) = EOB
      config%cptr%nbuf = ptr
      config%cptr%next_item = 1
      config%cptr%next_line = 1
      config%cptr%value_begin = 1

      if ( present (rc )) then
        rc = ESMF_SUCCESS
      endif

    end subroutine ESMF_ConfigLoadFile_1proc_