Fortran 90:了解功能测试输入文件参数的存在或值

Fortran90 : Understanding of function testing the presence or the value of input file paramter

我对 Fortran90 中输入文件的参数值有疑问:

相关的输入文件部分是:

# If use_phyical set physical densities in baryons, CDM and neutrinos + Omega_k
use_physical   = F
ombh2          = 0.022445
omch2          = 0.12055785438700001
omnuh2         = 0.000645145613
omk            = 0.0
hubble         = 67.0

#if use_physical = F set parameters as here
omega_baryon   = 0.05
omega_cdm      = 0.2685627651944076
omega_lambda   = 0.6800000648055924
omega_neutrino = 0.00143717

暗示问题的参数是 use_physical,我想为每个 运行 默认设置为 F(实际上,我做了几个 运行改变 omega_cdm 参数)。

在读取输入参数的代码部分下方(见上文)。

write(*,*) '0) Ini%Read_Double use_physical = ', Ini%Read_Logical('use_physical', .false.)
if (Ini%Read_Logical('use_physical', .false.) .eqv. .false.) then
    write(*,*) '1.1) Ini%Read_Double use_physical = ', Ini%Read_Logical('use_physical', .false.)
    P%ombh2 = Ini%Read_Double('omega_baryon')*(P%H0/100)**2
    P%omch2 = Ini%Read_Double('omega_cdm')*(P%H0/100)**2
    P%omnuh2 = Ini%Read_Double('omega_neutrino')*(P%H0/100)**2
    P%omk = ((P%H0/100)**2 - P%ombh2 - P%omch2 - P%omnuh2 - Ini%Read_Double('omega_lambda')*(P%H0/100)**2)/(P%H0/100)**2
    write(*,*) 'Computing with use_physical = false'
    write(*,*) '1.2) Ini%Read_Double use_physical = ', Ini%Read_Logical('use_physical', .false.)
else
    write(*,*) '2) Ini%Read_Double use_physical = ', Ini%Read_Logical('use_physical', .false.)
    P%ombh2 = Ini%Read_Double('ombh2')
    P%omch2 = Ini%Read_Double('omch2')
    P%omnuh2 = Ini%Read_Double('omnuh2')
    P%omk = Ini%Read_Double('omk')
end if

在执行上面的程序时,如果我设置 use_physical = F,我会得到以下输出(与我使用的 write(*,*) 不同):

 0) Ini%Read_Double use_physical =  F
 1.1) Ini%Read_Double use_physical =  F
 Computing with use_physical = false
 1.2) Ini%Read_Double use_physical =  F

我不明白 Ini%Read_Logical('use_physical', .false) 的值:如果 use_physical = F,这应该等于 TRUE 布尔值,不是吗?

为什么以下条件与 use_physical = F 相同:

if (Ini%Read_Logical('use_physical', .false.) .eqv. .false.)

对我来说,这应该是:

1) if (Ini%Read_Logical('use_physical', .false.) .eqv. .true.)

或等价物:

2) if (Ini%Read_Logical('use_physical', .false.))

with 1) and 2) meaning both that use_physical = F :但是上面 write(*,*) 的输出似乎说的是相反的:当 [=26= 时,条件 if (Ini%Read_Logical('use_physical', .false.) .eqv. .false.) 为真].

问题1)我不明白,如果有人能找到这个问题的解释。

问题2)从你的角度来看,返回的类型是什么:

Ini%Read_Logical('use_physical', .false.)

我试过使用条件:

if (Ini%Read_Logical('use_physical', .false.) == 'T')

 if (Ini%Read_Logical('use_physical', .false.) .eq. .true)

但是我遇到编译错误

PS :抱歉,我没有立即找到 Ini%Read_Logicalroutine 的实现,但这符合逻辑,当 use_physical = FIni%Read_Logical('use_physical', .false.) 为真而不是相反。

更新 1 : 我想我找到了函数的定义 Ini%Read_Logical :

function Ini_Read_Logical(this, Key, Default)
class(TIniFile) :: this
logical Ini_Read_Logical
logical, optional, intent(IN) :: Default
character(LEN=*), intent(IN) :: Key
character(LEN=:), pointer :: S
integer status

S => this%Read_String(Key,.not. present(Default))
if (S == '') then
    call this%EmptyCheckDefault(Key,Default)
    Ini_Read_Logical = Default
    call  this%ReadValues%Add(Key, Default)
else
    if (verify(trim(S),'10TF') /= 0) then
        status=1
    else
        read (S,*, iostat=status) Ini_Read_Logical
    end if
    if (status/=0) call this%Error('error reading logical',Key)
end if

end function Ini_Read_Logical

但这有点难以理解。

你更清楚为什么,在上面的程序执行时,如果我设置 use_physical = F,我得到以下输出(与我使用的 write(*,*) 不同)? :

 0) Ini%Read_Double use_physical =  F
 1.1) Ini%Read_Double use_physical =  F
 Computing with use_physical = false
 1.2) Ini%Read_Double use_physical =  F

谢谢

如果用户在 ini 文件中提供了一个值,函数 Ini%Read_Logicalreturns 将那个值解释为一个 LOGICAL。如果用户没有提供任何值,则函数 Ini%Read_Logicalreturns 默认参数的值(对过程绑定的引用中的第二个实际参数)。

你提供的值"F in the ini file, which is interpreted as .FALSE. ("F"是"False")的第一个字母,所以ini%Read_Logicalreturns.FALSE..的值未使用默认参数。

.假。 .EQV。 。错误的。为真,因此代码会立即执行 if 语句之后的语句块。

Ini%Read_Logical返回值的类型是LOGICAL。要比较逻辑值,您可以使用 .EQV。运算符("logical equivalence" 的缩写),或 .NEQV。 ("not equivalent")。未定义用于数字和字符类型的 == 和 /= 内部运算符。