从文本文件中读取字符数组并将其转换为整数参数

Reading characters array from a text file and convert it to an integer parameter

我有一个像这样的大文本文件:

!species     #Oxygen
  ind_CO      1.0
  ind_CO2     2.0
  ind_CH4     0.0
  ind_O3      3.0

但在我的代码中,字符(ind_CO、ind_CO2 等)声明如下:

  INTEGER, PARAMETER :: ind_CO2 = 1 
  INTEGER, PARAMETER :: ind_CH4 = 2
  INTEGER, PARAMETER :: ind_O3  = 3
  INTEGER, PARAMETER :: ind_CO  = 4

每个物种的浓度计算为 C(ind_)。所以我想要 计算每个 C(ind_)*(#Oxygen) 的乘积。也就是说,我想将文本文件的数据与代码的数据相关联。我试过这样的事情:

program
  implicit none
  INTEGER, PARAMETER :: ind_CO2 = 1 
  INTEGER, PARAMETER :: ind_CH4 = 2
  INTEGER, PARAMETER :: ind_O3  = 3
  INTEGER, PARAMETER :: ind_CO  = 4

  REAL      :: C(4)        ! Concentration for each Compound
  REAL      :: numO        ! Number of Oxygens
  REAL      :: ANS(4)      ! To Calculate
  INTEGER   :: err
  CHARACTER :: species*11

  open (unit=15, file="data.txt", status='old',access='sequential', form='formatted', action='read' )
  err=0
  do
      read (15, *,IOSTAT=err)  species, numO
      if (err==-1) exit
  ! I don 't know if it is possible to convert a character to an integer   
  ! parameter in such a way that the index of the matrix corresponds to
  ! the right compound 
      ANS(species) = C(species)*numO
      write (*, *)  species, numO, ANS(species)
  enddo
  close(15)
  end program

我知道这不正确,但我的想法是在矩阵 C 中插入在代码开头为每个化合物保存的名称。 所以想问问大家是否可以读取或转换这些字符,并将它们与声明的参数关联起来。

在 fortran 中,没有将符号名称映射到字符串的固有方法。这里最简单的方法是将您的物种名称简单地存储为字符数组,并使用循环来查找您从文件中读取的字符串的匹配名称。

  implicit none
  integer :: i
  integer, parameter :: nspecies=4
  character(len=11),dimension(nspecies) :: species= &
      ['ind_CO2','ind_CH4','ind_O3','ind_CO']                                                                  
  character(len=11) :: input                                                                                                                                
  input='ind_CH4' ! from file                                                                                                                               
  do  i = 1,nspecies                                                                                                                                        
     if ( input .eq. species(i) )exit                                                                                                                       
  enddo                                                                                                                                                     
  if ( i.gt.nspecies )then
   write(*,*)'error ',input,' not found'
  else                                                                                                  
   write(*,*)'read input is ',i,trim(species(i))
  endif                                                                                                             
  end