Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Indexing 基于“的逻辑索引”;查找“;在Fortran 90中_Indexing_Fortran_Intel Fortran_Large Data - Fatal编程技术网

Indexing 基于“的逻辑索引”;查找“;在Fortran 90中

Indexing 基于“的逻辑索引”;查找“;在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

我正在尝试创建一个逻辑数组(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
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