我想做点什么:
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
我想我可以做点像
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
但我认为我试图解开的方式在某些方面会很好。有没有办法做到这一点?
在回复一些评论时,我希望通过调用已定义的函数来操作a
,这些函数具有太多代码行以便在这里很好地适应。我不能讨论这些函数,但是,比方说它们依赖于某种收敛循环:
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
并且有一些方法可以改善这一点,并且数学可能会使它不会聚合等等,但这是一个得到我正在谈论的例子。问题是,我希望它只在where结构定义的域上运行。感谢。
答案 0 :(得分:2)
在f1
和f2
是非语言函数的情况下,这些函数将根据参数数组的所有元素进行评估。
但是,对于基本函数f1
或f2
,只会处理与{true}掩码匹配的a
和b
元素。(元素)。
查看您的示例函数,元素函数不适合,因此您必须使用替代方法。但是,如果你可以用一个包含整个事物的where
构造来表达函数,那么你可能会对元素有好运。