使用if条件将数组中的负值设置为零

时间:2019-05-17 06:28:40

标签: fortran fortran90

我具有一些变量的功能,这将产生一个包含负值和正值(实数)的数组。但是,由于只有正值对我身体有意义,因此我想将数组内的所有负值都设置为零。

我在下面提供了与此功能相关的代码:

我之所以声明一个临时变量'res'是因为我试图在IF-ELSE中建立我在代码中标记的位置,如下所示:

If (res >= 0) Then
   result = res
Else
   result = 0
End If

但是错误提示如果需要,S_A的标量值表达式。

如果使用res(il,ir)代替res,则

If (res(il,ir) >= 0) Then
   result(il,ir) = res(il,ir)
Else
   result = 0
End If

错误表示错误#6351: The number of subscripts is incorrect

有什么办法可以实现这个想法?

 Function somefunction(x,y,il,ir) Result(result)

 !! ---- begin of declaration ---------------------------

 Implicit None

 !! boundary indices
 Integer,            Intent ( in ) :: il,ir
 !! the vars
 Real ( kind = rk ), Intent ( in ), Dimension ( il:ir ) :: x,y
 !! the result
 Real ( kind = rk ), Dimension ( il:ir ) :: result
 !! temp vars
 Real ( kind = rk ), Dimension ( il:ir ) :: res
 !! loop index
 Integer :: i

 !! ---- end of declaration -----------------------------

 res     = x+y
 SA = S_A
 !!IF-ELSE!!
 End Function somefunction

2 个答案:

答案 0 :(得分:1)

如果要在数组上明智地使用if语句元素,则应使用where语句,例如:

program min0
    implicit none
    real :: res(5, 5), result(5, 5)
    call random_number(res)
    res=res-0.5

    print '(5(F5.2,X))', res

    where (res>=0)
        result = res
    elsewhere
        result = 0
    end where

    print *, '---------------------------------------'
    print '(5(F5.2,X))', result
end program min0

我不知道为什么会出现下标错误,如果您告诉我们错误发生在代码的哪一行,可能会有所帮助。但是,当然,在第二个代码中,如果result大于0,则更新res的单个元素,但如果不是,则将整个数组result设置为0。几乎可以肯定这不是您想要的。

欢呼

答案 1 :(得分:0)

该函数似乎从(il:if)取X和Y,从(3:6)得出,因此是一个向量。但是,索引稍后会说(il,ir),这意味着它是一个二维数组。

在哪里似乎是一个不错的选择。另一个可能是关联位置的逻辑掩码。 PACK和unpack是usd,这很有意义,

为什么还要说向量的大小?

ELEMENTAL Function somefunction(x,y) Result(Res)

!! ---- begin of declaration ---------------------------

Implicit None

Real ( kind = rk ), Intent (IN), Dimension (:) :: x,y
!! the result
Real ( kind = rk ), Dimension ( il:ir ) :: res
!! loop index
Integer :: i

!! ---- end of declaration -----------------------------

res     = x+y
WHERE res <= 0
  Res = 0
ENDWHERE
!!IF-ELSE!!
End Function somefunction

然后在调用方...在您不确定的范围内调用该函数。

Z(1:5) = somefunction(X(1:5),Y(1:5))