SURFEX v7.3
General documentation of Surfex
|
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