All,
I'm currently trying to port a code that works on Intel 15 to use Intel 16 (and 17). In doing so, I encountered a difference in behavior of Intel 16 and 17 compared to 15 (as well as to NAG, PGI, and GNU). A variant also showed a possible bug in Intel 15.
The code is:
program test implicit none integer, parameter :: nvars = 12 character(len=*), parameter :: vars(nvars)=(/ &' dw', ' ps', ' pw', ' rw', &' q', 'spd', ' t', ' uv', &'sst', 'gps', 'lag', 'tcp' /) integer :: ivars(nvars) logical :: lvars(nvars) integer :: i character(len=3) :: var integer :: is(1) integer :: iis is = 0 iis = 0 do i=1,nvars ivars(i) = i end do var = 'X' write (*,*) 'var: ', var write (*,*) 'vars: ', vars write (*,*) 'ivars: ', ivars write (*,*) 'vars==var: ', vars==var is = maxloc(ivars,vars==var) write (*,*) 'is: ', is lvars = vars==var write (*,*) 'lvars: ', lvars iis = maxloc(ivars,dim=1,mask=lvars) write (*,*) 'iis: ', iis end program test
What we are trying to do is find where "var" is in "vars". Now, is maxloc the way to do this? No, probably not, but, still, before I workaround, I want to report this. In this case, since 'X' is not in vars, is -> 0. I've also added a new chunk of code using MAXLOC(ARRAY,DIM=DIM,MASK=MASK) thinking maybe that would help.
Now in Intel 15:
(1513) $ ifort --version ifort (IFORT) 15.0.2 20150121 Copyright (C) 1985-2015 Intel Corporation. All rights reserved. (1514) $ ifort test.F90 && ./a.out var: X vars: dw ps pw rw qspd t uvsstgpslagtcp ivars: 1 2 3 4 5 6 7 8 9 10 11 12 vars==var: F F F F F F F F F F F F is: 0 lvars: F F F F F F F F F F F F iis: 1
Note, is=0 which is why the larger code this is part of worked. My 'dimmed' attempt to see if using dim=1 and outputting an integer threw a 1, which is unexpected.
Now Intel 16:
(1362) $ ifort --version ifort (IFORT) 16.0.2 20160204 Copyright (C) 1985-2016 Intel Corporation. All rights reserved. (1363) $ ifort test.F90 && ./a.out var: X vars: dw ps pw rw qspd t uvsstgpslagtcp ivars: 1 2 3 4 5 6 7 8 9 10 11 12 vars==var: F F F F F F F F F F F F is: 1 lvars: F F F F F F F F F F F F iis: 1
Now is=1. My reading of the standard seems that this use of MAXLOC falls under Case (ii) of the MAXLOC spec:
...If ARRAY has size zero or every element of MASK has the value false, all elements of the result are zero.
Every element of MASK is false is both MAXLOC calls so I think the result should be 0.
Thanks,
Matt