SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/LIB/XRD38/grib_mf/mxmn_mf.F
Go to the documentation of this file.
00001       SUBROUTINE MXMN_MF (PARRAY,KLEN,PMAX,PMIN)
00002       USE PARKIND1, ONLY : JPRB
00003       USE YOMHOOK , ONLY : LHOOK, DR_HOOK
00004 C
00005 C*******************************************************************
00006 C*
00007 C*    NAME      : MXMN
00008 C*
00009 C*    FUNCTION  : RETURN MAXIMUM AND MINIMUM VALUES FROM AN ARRAY
00010 C*                OF FLOATING POINT NUMBERS.
00011 C*
00012 C*    INPUT     : PARRAY - ARRAY OF NUMBERS
00013 C*                KLEN   - LAST WORD OF THIS ARRAY
00014 C*
00015 C*    OUTPUT    : PMAX - MAXIMUM VALUE
00016 C*                PMIN - MINIMUM VALUE
00017 C*
00018 C*
00019 C*     JOHN HENNESSY, ECMWF, 22 APRIL 1985
00020 C*
00021 C*    Modified by Jean CLOCHARD, French DMN, January 1990.
00022 C*    R. El Khatib 2004-10-12 MAXVAL,MINVAL
00023 C*    F. Vana + NEC Apr-2009: OpenMP
00024 C*
00025 C*******************************************************************
00026 C
00027 C      USE OML_MOD , ONLY : OML_MY_THREAD , OML_GET_NUM_THREADS
00028 C
00029 #include "precision.h"
00030 C
00031       INTEGER KLEN
00032       REAL (KIND=JPDBLR) PMAX, PMIN
00033       REAL (KIND=JPDBLR) PARRAY (KLEN)
00034       INTEGER START, END, BLOCKS, MY_THREAD, THREADS
00035       REAL (KIND=JPDBLR) PMAX_LOCAL, PMIN_LOCAL
00036 C
00037       REAL(KIND=JPRB) :: ZHOOK_HANDLE
00038       IF (LHOOK) CALL DR_HOOK('MXMN_MF',0,ZHOOK_HANDLE)
00039       PMAX = -HUGE(PARRAY)
00040       PMIN = HUGE(PARRAY)
00041 !$OMP PARALLEL
00042 !$OMP&PRIVATE(START,END,BLOCKS,MY_THREAD,THREADS,PMAX_LOCAL,PMIN_LOCAL)
00043       !MY_THREAD = OML_MY_THREAD() - 1
00044       MY_THREAD = 0
00045       !THREADS = OML_GET_NUM_THREADS()
00046       THREADS = 1
00047       BLOCKS = (KLEN + THREADS) / THREADS
00048       START = MY_THREAD * BLOCKS + 1
00049       END = MIN(START+BLOCKS-1,KLEN)
00050       PMAX_LOCAL = MAXVAL(PARRAY(START:END))
00051       PMIN_LOCAL = MINVAL(PARRAY(START:END))
00052 !$OMP CRITICAL
00053       PMAX = MAX(PMAX,PMAX_LOCAL)
00054       PMIN = MIN(PMIN,PMIN_LOCAL)
00055 !$OMP END CRITICAL
00056 !$OMP END PARALLEL
00057       IF (LHOOK) CALL DR_HOOK('MXMN_MF',1,ZHOOK_HANDLE)
00058       END