Function 有没有办法在where构造中进行函数调用?

Function 有没有办法在where构造中进行函数调用?,function,fortran,where,subroutine,Function,Fortran,Where,Subroutine,我想做一些类似的事情: Real a(10) Real b(10) ! define a and b, then where (a<b) a = f1(a,b) elsewhere a = f2(a,b) endwhere function f1(a,b) ! somehow or another operates only where a < b end function f1 function f2(a,b) ! somehow or another operat

我想做一些类似的事情:

Real a(10)
Real b(10)

! define a and b, then

where (a<b)
  a = f1(a,b)
elsewhere
  a = f2(a,b)
endwhere

function f1(a,b)
! somehow or another operates only where a < b
end function f1

function f2(a,b)
! somehow or another operates only where a>=b
end function f2

有很多方法可以改进这一点,数学可能是这样的,它不会收敛,等等,但这是一个例子,可以理解我所说的。问题是,我希望它只在where构造定义的域上运行。谢谢。

如果
f1
f2
是非元素函数,则这些函数将基于参数数组的所有元素进行计算

但是,对于基本函数
f1
f2
只有
a
b
中与真实掩码匹配的元素才会被处理(基本上)


看看您的示例函数,基本函数并不合适,因此您必须使用另一种方法。如果你可以用一个
来表达函数,其中
构造了整个函数,那么你可能会很幸运地使用元素。

你在寻找其他方法来完成同样的事情吗?当你尝试你想做的事情时,会发生什么?您是否担心函数会针对
a
b
的所有值进行求值,或者其他什么?@francescalus是的,我想确保函数只在where表达式定义的域上运行。@VladimirF好的,我想这就是答案。但我会等HPM说什么。看起来他可能对此有另一个想法?实际上我的评论是错误的,弗朗西斯卡勒斯是正确的。我确实考虑过基本函数,但不知怎么搞混了。如果我今天不教你在哪里工作,我就不会那么羞愧了。但我在这里没想那么久。。。
a = f1(a,b)
a = f2(a,b)

function f1(a,b)
where (a<b) ...
end function f1

function f2(a,b)
where (a>=b) ...
end function f2
function f1(a,b)

real a(10), b(10)
real f1(10)

real tmp(10), conv

real tol = 1.e-5
tmp = a
f1 = sin(b*a)
conv = max(abs(f1-tmp))

while (conv > tol)
  tmp = f1
  f1 = sin(b*tmp)
  conv = max(abs(f1-tmp))
endwhile

return

end function