best practice guide

if then (else) pitfalls

The use of boolean true/false data in models is a difficult subject for many users. We encounter a lot of very complicated expressions in user models that are unnecessary and error prune.

Very often fragments are used like:

nearGroundWater = if ( GroundWaterLevel < 20 then 1 else 0);


nearGroundWater = boolean(if ( GroundWaterLevel < 20 then 1 else 0));

This is identical to the much shorter and faster:

nearGroundWater = GroundWaterLevel < 20;

The first expression of the if-then-else is already a boolean expression consisting of 0 (false) and 1 (true) and possible missing values, so there is no need to write the values of 1 and 0 explicit. This happens often when using any of the Boolean operators or Comparison operators.

More dangerous is the common believe that a statement like:

nearGroundWater = if ( GroundWaterLevel < 20 then 1); # WRONG!

will result in a true/false map, as in the statements given above. This is wrong: if without the else will create missing values not 0 (false).

People also tend to think in terms of “if this then that happens, if not then if this the case then etc. etc.”. This results in statements like:

A      = aDepth < 20;
B      = bDepth < 20;
result = boolean(if( A eq 1, 1, if(B eq 1, 1, 0)));

The same is better expressed as:

result = aDepth < 20 or bDepth < 20;

To summarize in a few guidelines:

  • if-then and if-then-else are two totally different operations:

    • if-then is only to create missing values in maps.

    • if-then-else is to make a selection between 2 values.

  • in pcrcalc: Use the syntax if( then else ) and if( then ) instead of if( , , ) and if( , ) to see better which type of operation you use.

  • Avoid patterns like if( expression then 0 else 1) or if( expression then 1 else 0) in your model. In most cases these patterns can be rewritten. If these patterns are nested like in if (.. (if (… try rephrasing in terms of and, &, pcrand, or, |, pcror, xor, ^, pcrxor and ref:not.