` 1 set i /i1*i200/;`

2

3 alias (i,j,k);

4 parameter a(i,j,k),b(i,j,k),c(i,j,k);

5 a(i,j,k) = uniform(0.1,1);

6 b(i,j,k) = uniform(0.1,1);

7 c(i,j,k) = uniform(0.1,1);

8

9 parameter p1(i,j,k),p2(i,j,k),p3(i,j,k);

10

11 * this is fast

12 p1(i,j,k) = ifthen(b(i,j,k)>0.5,a(i,j,k)/b(i,j,k),c(i,j,k));

13

14 * this is slow

15 loop((i,j,k),

16 if(b(i,j,k)>0.5,

17 p2(i,j,k) = a(i,j,k)/b(i,j,k)

18 else

19 p2(i,j,k) = c(i,j,k)

20 );

21 );

22

23 * this is fast but I feel uneasy about assumption that

24 * these conditions are quaranteed mutual exclusive

25 * for floating point numbers

26 p3(i,j,k) = [a(i,j,k)/b(i,j,k)]$(b(i,j,k)>0.5) + c(i,j,k)$(b(i,j,k)<=0.5);

The profiling info clearly indicates the loop is the slowest alternative:

`---- 1 ExecInit 0.000 0.000 SECS 3 Mb`

---- 5 Assignment a 1.762 1.762 SECS 261 Mb 8000000

---- 6 Assignment b 1.748 3.510 SECS 518 Mb 8000000

---- 7 Assignment c 1.747 5.257 SECS 775 Mb 8000000

---- 12 Assignment p1 3.307 8.564 SECS 1,032 Mb 8000000

---- 15 Loop 22.027 30.591 SECS 1,288 Mb

---- 26 Assignment p3 3.900 34.491 SECS 1,545 Mb 8000000

I prefer the ifthen construct as this has a real 'else'. The assignment to p3 uses two different $ conditions, which makes me feel uneasy.