SURFEX v8.1
General documentation of Surfex
mxmn_mf.F
Go to the documentation of this file.
1  SUBROUTINE mxmn_mf (PARRAY,KLEN,PMAX,PMIN)
2  USE parkind1, ONLY : jprb
3  USE yomhook , ONLY : lhook, dr_hook
4  USE lfi_precision
5 !
6 !*******************************************************************
7 !*
8 !* NAME : MXMN
9 !*
10 !* FUNCTION : RETURN MAXIMUM AND MINIMUM VALUES FROM AN ARRAY
11 !* OF FLOATING POINT NUMBERS.
12 !*
13 !* INPUT : PARRAY - ARRAY OF NUMBERS
14 !* KLEN - LAST WORD OF THIS ARRAY
15 !*
16 !* OUTPUT : PMAX - MAXIMUM VALUE
17 !* PMIN - MINIMUM VALUE
18 !*
19 !*
20 !* JOHN HENNESSY, ECMWF, 22 APRIL 1985
21 !*
22 !* Modified by Jean CLOCHARD, French DMN, January 1990.
23 !* R. El Khatib 2004-10-12 MAXVAL,MINVAL
24 !* F. Vana + NEC Apr-2009: OpenMP
25 !*
26 !*******************************************************************
27 !
29 !
30  IMPLICIT NONE
31 !
32  INTEGER (KIND=JPLIKM) :: KLEN
33  REAL (KIND=JPDBLD) :: PMAX
34  REAL (KIND=JPDBLD) :: PMIN
35  REAL (KIND=JPDBLD) :: PARRAY (klen)
36  INTEGER (KIND=JPLIKM) :: START, END, BLOCKS, MY_THREAD, THREADS
37  REAL (KIND=JPDBLD) :: PMAX_LOCAL, PMIN_LOCAL
38 !
39  REAL(KIND=JPRB) :: ZHOOK_HANDLE
40  IF (lhook) CALL dr_hook('MXMN_MF',0,zhook_handle)
41  pmax = -huge(parray)
42  pmin = huge(parray)
43 !$OMP PARALLEL &
44 !$OMP&PRIVATE(START,END,BLOCKS,MY_THREAD,THREADS,PMAX_LOCAL,PMIN_LOCAL)
45  my_thread = oml_my_thread() - 1
46  threads = oml_get_num_threads()
47  blocks = (klen + threads) / threads
48  start = my_thread * blocks + 1
49  END = MIN(START+BLOCKS-1,KLEN)
50  pmax_local = maxval(parray(start:end))
51  pmin_local = minval(parray(start:end))
52 !$OMP CRITICAL
53  pmax = max(pmax,pmax_local)
54  pmin = min(pmin,pmin_local)
55 !$OMP END CRITICAL
56 !$OMP END PARALLEL
57 
58 ! Avoid +/- 0
59 
60  IF (abs(pmax) == 0.) pmax = 0.
61  IF (abs(pmin) == 0.) pmin = 0.
62 
63  IF (lhook) CALL dr_hook('MXMN_MF',1,zhook_handle)
64  ENDSUBROUTINE mxmn_mf
integer(kind=jpim) function, public oml_get_num_threads()
Definition: oml_mod.F90:263
integer, parameter jprb
Definition: parkind1.F90:32
integer(kind=jpim) function, public oml_my_thread()
Definition: oml_mod.F90:249
logical lhook
Definition: yomhook.F90:15
subroutine mxmn_mf(PARRAY, KLEN, PMAX, PMIN)
Definition: mxmn_mf.F:2