EAMxx: make binary ops diags fill-val-aware
they currently are at the mercy of the update methods, but they don't themselves handle fill-values in better ways
Tbc, update is fill-aware, but only when it comes to the RHS. The reason for this is that the only place that had to deal with this was the accumulation fields in IO, where the LHS is initialized to actual numbers. Basically, we only perform the update if both values are NOT fill val.
The reason for NOT handling LHS that is filled is conceptual. While it makes sense to leave LHS unaltered wherever RHS is fillValue (which basically means "ignore this new value"), what do we do when the LHS is fill value? Combining an "old invalid" value with a "new valid" one is less straightforward.
For the binary op diagnostic, I think the obvious solution is that combine (fillVal, X) and combine(X, fillVal) should both return fillVal. But in the context of "updating" a field, it is a bit different, since we don't set the result of "LHS=valid, RHS=fill" to fill, but rather leave LHS unaltered (as if update) had not been called.
I think adding all these methods to the Field class may have been a bit of an abuse of API. Perhaps these should have all been free functions, with a name/signature that clearly states how to handle fillVal. If you want, we can discuss offline an overhaul of the field manipulation functions, including update, scale, deep_copy, and some utils like compute_mask. Perhaps we should create a separate library for Field math operations...