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
Fortran 将掩码从何处应用到更高维数组_Fortran_Where Clause - Fatal编程技术网

Fortran 将掩码从何处应用到更高维数组

Fortran 将掩码从何处应用到更高维数组,fortran,where-clause,Fortran,Where Clause,我想将WHERE构造的结果应用于其他维度更高的数组,以便在下面的例子中“-”标记WHERE的索引。我想知道FINDLOC是否有帮助,但它似乎不能使用逻辑表达式。是否有某种我不知道的方法返回索引并应用它们 PROGRAM test REAL :: a(3,20,20),b(20,20),c(20,20) CALL random_number(c) a=1 b=1 WHERE (c<0.5) c=0 b=0 ! this is fine a(:,-,-)=0 ! how to d

我想将WHERE构造的结果应用于其他维度更高的数组,以便在下面的例子中“-”标记WHERE的索引。我想知道FINDLOC是否有帮助,但它似乎不能使用逻辑表达式。是否有某种我不知道的方法返回索引并应用它们

PROGRAM test
REAL :: a(3,20,20),b(20,20),c(20,20)
CALL random_number(c)
a=1
b=1
WHERE (c<0.5) 
  c=0
  b=0 ! this is fine
  a(:,-,-)=0 ! how to do this???
ENDWHERE
END PROGRAM test
程序测试
实数:a(3,20,20),b(20,20),c(20,20)
呼叫随机号码(c)
a=1
b=1

其中(c对于与
c
大小相同的
b
数组,使用
MERGE
可能更优雅:

b = MERGE(1,0,c>=0.5)
使用
a
也可以做到这一点,但不那么优雅,但仍然很紧凑:

FORALL(i=1:20,j=1:20) a(:,i,j) = merge(1,0,c(i,j)>=0.5)
这两个命令都将为数组中的所有元素提供一个分配。如果您只想进行筛选操作,而不考虑数组中的初始值,则可能可以将它们简化为
,其中
构造:

FORALL(i=1:20,j=1:20,c(i,j)<0.5) a(:,i,j) = 0.0
WHERE (c<0.5) 
   b=0.0
   c=0.0
END WHERE

FORALL(i=1:20,j=1:20,c(i,j)或使用
spread
提升掩码并将其应用于另一个
where
construct中的
a
。谢谢,我不知道spread,我会尝试一下,或者使用do循环,比如doi=1,3;where(mask)a(i,:,::)=0;enddo?(where mask c<1.0e-6,或mask=c<0.5等)@HighPerformanceMark-很抱歉没有提供信息,但是你如何真正找回索引的掩码,这需要pack语句吗?我必须说,我想我会在整个过程中使用嵌套do循环-所有的讨论似乎都是围绕着将某个不太适合的东西强行放入模型中展开的。非常感谢你的建议,但事实确实如此遗憾的是,c上的测试需要运行两次-此解决方案类似于我当前的方法,即在i和j上使用单独的嵌套do循环,但双重检查不是非常有效。c上的测试不需要运行两次,forall语句可以扩展到forall构造并包含赋值。现在
do concurrent
在某种程度上优于
forall
,后者(在实践中而不是在标准中)在某些不严格要求的情况下(可能)创建临时数组副本时被弃用。
FORALL (i=1:20,j=1:20,c(i,j)<0.5)
   a(:,i,j) = 0.0
   b  (i,j) = 0.0
   c  (i,j) = 0.0
END FORALL