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_Logical
routine 的实现,但这符合逻辑,当 use_physical = F
时 Ini%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")。未定义用于数字和字符类型的 == 和 /= 内部运算符。
我对 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_Logical
routine 的实现,但这符合逻辑,当 use_physical = F
时 Ini%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")。未定义用于数字和字符类型的 == 和 /= 内部运算符。