# Using a compiled function inside NIntegrate gives “CompiledFunction::cfsa” message

The following function is defined for Real input:

FFc = Compile[{{x, _Real}, {EF, _Real}},If[x > EF, 0., If[x == EF, 0.5, 1.]]]


FFc is now used in the function called foo:

EBoundary = 6.5;
foo[Ef_?NumericQ] := NIntegrate[FFc[x, Ef] , {x, -EBoundary, EBoundary}]


When I call foo like

foo[3.2]


I get an error message:

CompiledFunction::cfsa: "Argument x at position 1 should be a \!$$\"machine-size real number\"$$."


Since I'm using real numbers I have no idea why I get this message. What is the problem? Is it, because If[] can return 0?

-

It's because FFc is being passed x and Ef symbolically, at first. To cure the problem, add an intermediate function between FFc and NIntegrate, such as

f[x_?NumericQ, Ef_?NumericQ] := FFc[x,Ef]


then

foo[Ef_?NumericQ] := NIntegrate[f[x, Ef] , {x, -EBoundary, EBoundary}]

-
Do you perhaps know why adding "RuntimeOptions" -> {"EvaluateSymbolically" -> False} to FFc does not cure the problem? –  Ajasja Jan 18 '13 at 9:40
@Ajasja Seems related to why FFc[-x,0.] gives error while FFc[x,0.] doesn't. I wonder why NIntegrate passes -x as argument to the function. (This comment is assuming {"EvaluateSymbolically" -> False}) –  ssch Jan 18 '13 at 12:20
@Ajasja Seems if the integration region is {x,-a,a} it doesn't work, while it is unsymmetric like {x,-a-0.00001,a} it does –  ssch Jan 18 '13 at 12:26
@Ajasja no idea. Compile is not my strong suit. –  rcollyer Jan 18 '13 at 13:14
Thanks. Perhaps @OleksandR will see this:) –  Ajasja Jan 18 '13 at 13:47