It seems that if the expression is a bit long then @. allocates memory whereas manually using . does not. Why?
Here is an expression. No memory allocation if NOT including the last term within the brackets, but allocates if it is included.
@. f_Fe = 1.0/(1.0 + KFeCl*ClBW + KFeSO4*THSO4*f_SO4 + KFeCO3*TCO2*f_CO3 + KFeCO3OH*TCO2*f_CO3*KW/H + KFeHS*TH2S*f_HS + KFeS*TH2S*f_HS/H)
This does not allocate
f_Fe .= 1.0./(1.0 .+ KFeCl.*ClBW .+ KFeSO4.*THSO4.*f_SO4 .+ KFeCO3.*TCO2.*f_CO3 .+ KFeCO3OH.*TCO2.*f_CO3.*KW./H + KFeHS.*TH2S.*f_HS .+ KFeS.*TH2S.*f_HS./H)
Aren’t they supposed to be identical?
So is there a limit of the length of the expression?
The problem you’re running into is that Julia currently treats + as an n-ary operation, but gets mad when it is called with too many arguments. The short term fix is to add parentheses to break things up slightly.
That works but it’s tricky to figure out where to put the brackets!
You can do
const ⊕ = +
and just use that instead of +…
what’s the theory behind that?
Then it no longer parses a n-ary.
Cool. Thanks!