Indexing 基于“的逻辑索引”;查找“;在Fortran 90中
我正在尝试创建一个逻辑数组(B),用于基于数组(EP_G2)中介于.1和.999之间的值的逻辑索引,使用两种不同的方法1)where循环2)ANYIndexing 基于“的逻辑索引”;查找“;在Fortran 90中,indexing,fortran,intel-fortran,large-data,Indexing,Fortran,Intel Fortran,Large Data,我正在尝试创建一个逻辑数组(B),用于基于数组(EP_G2)中介于.1和.999之间的值的逻辑索引,使用两种不同的方法1)where循环2)ANY 程序流量\u 3d 隐式无 整数::RMAX、YMAX、ZMAZ、时间步长 双精度,参数::pmin=0.1 双精度,参数::pmax=0.999 整数::sz 双精度,可分配::EP_G2(:,:),C(:) 整数,维数(RMAX*ZMAX*YMAX)::B 逻辑,维度(RMAX*ZMAX*YMAX)::A ! 数组的维数, RMAX=540 YM
程序流量\u 3d
隐式无
整数::RMAX、YMAX、ZMAZ、时间步长
双精度,参数::pmin=0.1
双精度,参数::pmax=0.999
整数::sz
双精度,可分配::EP_G2(:,:),C(:)
整数,维数(RMAX*ZMAX*YMAX)::B
逻辑,维度(RMAX*ZMAX*YMAX)::A
! 数组的维数,
RMAX=540
YMAX=204
ZMAX=54
时间步长=1
!开放ascii数组
打开(100,FILE='EP_G2',form='formatted')
分配(EP_G2(RMAX*ZMAX*YMAX,时间步长))
读(100,*)EP_G2
WHERE(pmin我对你的代码和问题有点困惑,但我认为你想找到数组中元素的索引,其值介于0.1
和0.999
之间。你想要的不是索引,或者仅仅是元素本身,但请耐心听我说,我将解释如何获得这两个索引
假设您的原始数组声明如下
real, dimension(10**6) :: values
然后我可以像这样声明一个索引数组
integer, dimension(10**6) :: indices = [(ix,ix=1,10**6)]
(显然,您还需要声明变量ix
)
现在,这个表达式
pack(indices, values>pmin.and.values<pmax)
pack
的这两种用法都将返回一个秩为1的数组,您可以将返回的数组分配给一个可分配的数组,Fortran将为您调整大小
我将让您将此方法扩展到实际使用的秩-2阵列,但这应该不会太困难。如果需要,请寻求更多帮助
这是最快的方法吗?我不确定,但它写起来非常快,如果您对它的运行时性能感兴趣,我建议您测试一下
顺便说一句,Fortran的内在函数logical
用于将logical
值从一种转换为另一种,它没有定义在整数(或任何其他内在类型)上。Fortran早于将0
和1
视为逻辑值的疯狂时期。数组怎么可能是相同的
RMAX、YMAX、ZMAZ和timesteps值在声明A、B和C之后才知道,因此它们(A和B)可能不是您想要的大小
implicit none
INTEGER :: RMAX, YMAX, ZMAZ, timesteps
DOUBLE PRECISION, PARAMETER :: pmin=0.1
DOUBLE PRECISION, PARAMETER :: pmax=0.999
INTEGER :: sz
DOUBLE PRECISION, ALLOCATABLE :: EP_G2(:,:), C(:)
INTEGER, DIMENSION(RMAX*ZMAX*YMAX) :: B
LOGICAL, DIMENSION(RMAX*ZMAX*YMAX) :: A
! dimensions of array,
RMAX = 540
YMAX = 204
ZMAX = 54
timesteps = 1
您可能想要这样:
implicit none
INTEGER , PARAMETER :: RMAX = 504
INTEGER , PARAMETER :: YMAX = 204
INTEGER , PARAMETER :: ZMAZ = 54
INTEGER , PARAMETER :: timesteps = 1
DOUBLE PRECISION, PARAMETER :: pmin = 0.1
DOUBLE PRECISION, PARAMETER :: pmax = 0.999
INTEGER :: sz
DOUBLE PRECISION, ALLOCATABLE :: EP_G2(:,:), C(:)
INTEGER, DIMENSION(RMAX*ZMAX*YMAX) :: B
LOGICAL, DIMENSION(RMAX*ZMAX*YMAX) :: A
! dimensions of array,
!RMAX = 540
!YMAX = 204
!ZMAX = 54
!timesteps = 1
或者这个:
implicit none
! dimensions of array
INTEGER , PARAMETER :: RMAX = 504
INTEGER , PARAMETER :: YMAX = 204
INTEGER , PARAMETER :: ZMAZ = 54
INTEGER , PARAMETER :: timesteps = 1
DOUBLE PRECISION, PARAMETER :: pmin = 0.1
DOUBLE PRECISION, PARAMETER :: pmax = 0.999
INTEGER :: sz
DOUBLE PRECISION, ALLOCATABLE :: EP_G2(:,:), C(:)
INTEGER, DIMENSION(:), ALLOCATABLE :: B
LOGICAL, DIMENSION(:), ALLOCATABLE :: A
! Then allocate A and B
,您还可以考虑使用形状或大小来查看数组的秩和大小是否正确。
IF(SHAPE(A) /= SHAPE(B) ) ... chuck and error message.
IF(SIZE(A,1) /= SIZE(B,1) ) etc
为了澄清这个问题。您有一个双精度数组:双精度::EP_G2
。您需要第二个数组,双精度::C
,它只包含特定范围内的那些值。对吗?您是否还需要将这些数字的索引存储在EP_G2
中?是的。我正在寻找将这些值存储在上e数组和索引在一个单独的数组中。谢谢你的回答。澄清?我把它作为a=PACK(values,values>pmin.AND.values)添加到我的脚本中。回答你的问题或问一个新问题。很难从评论中弄清楚发生了什么。
implicit none
! dimensions of array
INTEGER , PARAMETER :: RMAX = 504
INTEGER , PARAMETER :: YMAX = 204
INTEGER , PARAMETER :: ZMAZ = 54
INTEGER , PARAMETER :: timesteps = 1
DOUBLE PRECISION, PARAMETER :: pmin = 0.1
DOUBLE PRECISION, PARAMETER :: pmax = 0.999
INTEGER :: sz
DOUBLE PRECISION, ALLOCATABLE :: EP_G2(:,:), C(:)
INTEGER, DIMENSION(:), ALLOCATABLE :: B
LOGICAL, DIMENSION(:), ALLOCATABLE :: A
! Then allocate A and B
IF(SHAPE(A) /= SHAPE(B) ) ... chuck and error message.
IF(SIZE(A,1) /= SIZE(B,1) ) etc