# Re: [ferret_users] FILL_XY and modulo operatinos

Hi Martin,
The exernal function code needs to explicitly do modulo operations. When writing an external function, the author can call the utility function ef_get_axis_info to find out whether the X axis is defined as a modulo axis, and if so the calculations may use that fact and do whatever is needed to carry out operations across the branch cut.

Since you're the original author of this function (10 years ago), would you like to take a look at this? If not I imagine I can see what is the right thing to do.

Ansley

On 3/17/2011 11:11 AM, Martin Schmidt wrote:
Hi ferreters,

processing satellite data with ferret, I found strange behaviour of the fill_xy - function. Earlier, I had processed data from a region 20W:22E, now the data sets are global. I notice different results from steps using
fill_xy near the 0 meridian compared with the earlier regional analysis.

To track this down the following example shows the problem:

!define a global grid:
define axis/x=10:350:20/unit=degrees_east/modulo xax
define axis/y=-50:50:10/unit=degrees_north yax

!define a variable and blank a stripe near the 0-meridian
let dummy=x[gx=xax]+0*y[gy=yax]
let d1= if i[gx=dummy] gt 3 then dummy else 1/0
let d2= if i[gx=d1] lt 17 then d1 else 1/0

This leaves two stripes undefined. Note that there are 3 cells empty in the east and 2 cells empty in the west.

Now save to a file otherwise results are really strange - but this is not the point here.

save/clobber/file=zw.nc dummy, d1, d2

ncdump shows a modula axis

variables:
double XAX(XAX) ;
XAX:units = "DEGREES_EAST" ;
XAX:point_spacing = "even" ;
XAX:axis = "X" ;
XAX:modulo = 360. ;

Start ferret again

use zw.nc

Now fill d2 using fill_xy

The last example gives a wrong figure. Averaging should happen when filling near the 0 meridian, hence the modulo attribute is ignored
by fill_xy

Now define a region
set region/x=-60:100

This gives correct figures - in the last example, shade fill_xy(d2,dummy,3), averaging over right and left
neighbours of cells is carried out correctly.

Now consider the same for the @fnr transormation. Without any region
can region

In the last example two neighbours are found and the average is displayed - should be correct.

But defining the region

set region/x=-60:100

gives a different result

fills all missing cells and averages over both the neighbours. I would not expect this.

So both the filling methods show different behaviour if either a region around the 0-meridian is specified or not.

I would expect the same result as long as all points used for filling are within the region.
This should be achieved in future releases of ferret.

Greetings,
Martin