A where() combines the definition and application of a mask all in one go and can lead to succinct code.
The full syntax of a where() statement is as follows:
// Single assign (nb the else block is optional)
where (mask)
var1=expr1;
elsewhere
var1=expr2;
// Multiple assigns
where( mask) {
var1=expr1;
var2=expr2;
...
} elsewhere {
var1=expr3
var2=expr4
var3=expr5;
...
}
example:
Consider the variables:
float lon_2D_rct(lat,lon);
float var_msk(lat,lon);
Suppose we want to multiply by two the elements for which var_msk is equal to 1;
where(var_msk==1)
lon_2D_rct=2*lon_2D_rct;
Another example
Suppose we have the variable
int RDM(time);
And we want to set the values less than 8 or greater than 80 to 0.
where(RDM <8 || RDM >80)
RDM=0;
A more complex example.
Consider the situation where we have irregularly gridded data, described using rank 2 variables:
double lat(south_north,east_west)
To find the average temperature in a region [lat_min,lat_max] and [lon_min,lon_max]:
double lon(south_north,east_west)
double temperature(south_north,east west)
temperature_msk[$south_north,$east_west]=0.0;
where(lat >= lat_min && lat <= lat_max) && (lon >= lon_min && > lon <= lon_max)
temperature_msk=temperature;
elsewhere
temperature_msk=temperature@_FillValue;
temp_avg=temperature_msk.avg();
temp_max=temperature.max();