New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
lib_fortran.F90 in NEMO/releases/r4.0/r4.0-HEAD/src/OCE – NEMO

source: NEMO/releases/r4.0/r4.0-HEAD/src/OCE/lib_fortran.F90 @ 15438

Last change on this file since 15438 was 15371, checked in by smueller, 3 years ago

Optional replacement of non-standard intrinsic function ISNAN (ticket #2720)

  • Property svn:keywords set to Id
File size: 20.8 KB
RevLine 
[2003]1MODULE lib_fortran
2   !!======================================================================
3   !!                       ***  MODULE  lib_fortran  ***
4   !! Fortran utilities:  includes some low levels fortran functionality
5   !!======================================================================
[2307]6   !! History :  3.2  !  2010-05  (M. Dunphy, R. Benshila)  Original code
[4161]7   !!            3.4  !  2013-06  (C. Rousset)  add glob_min, glob_max
8   !!                                           + 3d dim. of input is fexible (jpk, jpl...)
[7646]9   !!            4.0  !  2016-06  (T. Lovato)  double precision global sum by default
[2003]10   !!----------------------------------------------------------------------
[2307]11
[2003]12   !!----------------------------------------------------------------------
[3764]13   !!   glob_sum    : generic interface for global masked summation over
[2307]14   !!                 the interior domain for 1 or 2 2D or 3D arrays
[3764]15   !!                 it works only for T points
[2307]16   !!   SIGN        : generic interface for SIGN to overwrite f95 behaviour
17   !!                 of intrinsinc sign function
18   !!----------------------------------------------------------------------
[3632]19   USE par_oce         ! Ocean parameter
20   USE dom_oce         ! ocean domain
21   USE in_out_manager  ! I/O manager
22   USE lib_mpp         ! distributed memory computing
[10425]23   USE lbclnk          ! ocean lateral boundary conditions
[2003]24
25   IMPLICIT NONE
26   PRIVATE
27
[6140]28   PUBLIC   glob_sum      ! used in many places (masked with tmask_i)
[7646]29   PUBLIC   glob_sum_full ! used in many places (masked with tmask_h, ie only over the halos)
[10425]30   PUBLIC   local_sum     ! used in trcrad, local operation before glob_sum_delay
31   PUBLIC   sum3x3        ! used in trcrad, do a sum over 3x3 boxes
[6140]32   PUBLIC   DDPDD         ! also used in closea module
[4161]33   PUBLIC   glob_min, glob_max
[2341]34#if defined key_nosignedzero
[2003]35   PUBLIC SIGN
36#endif
[15371]37#if defined key_noisnan
38   PUBLIC ISNAN
39#endif
[2003]40
41   INTERFACE glob_sum
[10425]42      MODULE PROCEDURE glob_sum_1d, glob_sum_2d, glob_sum_3d
[2003]43   END INTERFACE
[6140]44   INTERFACE glob_sum_full
45      MODULE PROCEDURE glob_sum_full_2d, glob_sum_full_3d
46   END INTERFACE
[10425]47   INTERFACE local_sum
48      MODULE PROCEDURE local_sum_2d, local_sum_3d
49   END INTERFACE
50   INTERFACE sum3x3
51      MODULE PROCEDURE sum3x3_2d, sum3x3_3d
52   END INTERFACE
[4161]53   INTERFACE glob_min
[10425]54      MODULE PROCEDURE glob_min_2d, glob_min_3d
[4161]55   END INTERFACE
56   INTERFACE glob_max
[10425]57      MODULE PROCEDURE glob_max_2d, glob_max_3d
[4161]58   END INTERFACE
[2003]59
[3764]60#if defined key_nosignedzero
[2003]61   INTERFACE SIGN
[2307]62      MODULE PROCEDURE SIGN_SCALAR, SIGN_ARRAY_1D, SIGN_ARRAY_2D, SIGN_ARRAY_3D,   &
[3764]63         &             SIGN_ARRAY_1D_A, SIGN_ARRAY_2D_A, SIGN_ARRAY_3D_A,          &
64         &             SIGN_ARRAY_1D_B, SIGN_ARRAY_2D_B, SIGN_ARRAY_3D_B
[2003]65   END INTERFACE
66#endif
67
[2307]68   !!----------------------------------------------------------------------
[9598]69   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
[3764]70   !! $Id$
[10068]71   !! Software governed by the CeCILL license (see ./LICENSE)
[2307]72   !!----------------------------------------------------------------------
[3764]73CONTAINS
[2003]74
[10425]75#  define GLOBSUM_CODE
[3764]76
[10425]77#     define DIM_1d
78#     define FUNCTION_GLOBSUM           glob_sum_1d
79#     include "lib_fortran_generic.h90"
80#     undef FUNCTION_GLOBSUM
81#     undef DIM_1d
[2307]82
[10425]83#     define DIM_2d
84#     define OPERATION_GLOBSUM
85#     define FUNCTION_GLOBSUM           glob_sum_2d
86#     include "lib_fortran_generic.h90"
87#     undef FUNCTION_GLOBSUM
88#     undef OPERATION_GLOBSUM
89#     define OPERATION_FULL_GLOBSUM
90#     define FUNCTION_GLOBSUM           glob_sum_full_2d
91#     include "lib_fortran_generic.h90"
92#     undef FUNCTION_GLOBSUM
93#     undef OPERATION_FULL_GLOBSUM
94#     undef DIM_2d
[2307]95
[10425]96#     define DIM_3d
97#     define OPERATION_GLOBSUM
98#     define FUNCTION_GLOBSUM           glob_sum_3d
99#     include "lib_fortran_generic.h90"
100#     undef FUNCTION_GLOBSUM
101#     undef OPERATION_GLOBSUM
102#     define OPERATION_FULL_GLOBSUM
103#     define FUNCTION_GLOBSUM           glob_sum_full_3d
104#     include "lib_fortran_generic.h90"
105#     undef FUNCTION_GLOBSUM
106#     undef OPERATION_FULL_GLOBSUM
107#     undef DIM_3d
[2307]108
[10425]109#  undef GLOBSUM_CODE
[2307]110
[10425]111
112#  define GLOBMINMAX_CODE
113
114#     define DIM_2d
115#     define OPERATION_GLOBMIN
116#     define FUNCTION_GLOBMINMAX           glob_min_2d
117#     include "lib_fortran_generic.h90"
118#     undef FUNCTION_GLOBMINMAX
119#     undef OPERATION_GLOBMIN
120#     define OPERATION_GLOBMAX
121#     define FUNCTION_GLOBMINMAX           glob_max_2d
122#     include "lib_fortran_generic.h90"
123#     undef FUNCTION_GLOBMINMAX
124#     undef OPERATION_GLOBMAX
125#     undef DIM_2d
126
127#     define DIM_3d
128#     define OPERATION_GLOBMIN
129#     define FUNCTION_GLOBMINMAX           glob_min_3d
130#     include "lib_fortran_generic.h90"
131#     undef FUNCTION_GLOBMINMAX
132#     undef OPERATION_GLOBMIN
133#     define OPERATION_GLOBMAX
134#     define FUNCTION_GLOBMINMAX           glob_max_3d
135#     include "lib_fortran_generic.h90"
136#     undef FUNCTION_GLOBMINMAX
137#     undef OPERATION_GLOBMAX
138#     undef DIM_3d
139#  undef GLOBMINMAX_CODE
140
141!                          ! FUNCTION local_sum !
142
143   FUNCTION local_sum_2d( ptab )
[2307]144      !!----------------------------------------------------------------------
[10425]145      REAL(wp),  INTENT(in   ) ::   ptab(:,:) ! array on which operation is applied
146      COMPLEX(wp)              ::  local_sum_2d
147      !
[2003]148      !!-----------------------------------------------------------------------
[2307]149      !
150      COMPLEX(wp)::   ctmp
151      REAL(wp)   ::   ztmp
[10425]152      INTEGER    ::   ji, jj    ! dummy loop indices
153      INTEGER    ::   ipi, ipj  ! dimensions
[2307]154      !!-----------------------------------------------------------------------
155      !
[10425]156      ipi = SIZE(ptab,1)   ! 1st dimension
157      ipj = SIZE(ptab,2)   ! 2nd dimension
[4161]158      !
[10425]159      ctmp = CMPLX( 0.e0, 0.e0, wp )   ! warning ctmp is cumulated
160
161      DO jj = 1, ipj
162         DO ji = 1, ipi
163            ztmp =  ptab(ji,jj) * tmask_i(ji,jj)
164            CALL DDPDD( CMPLX( ztmp, 0.e0, wp ), ctmp )
165         END DO
[2307]166      END DO
167      !
[10425]168      local_sum_2d = ctmp
169       
170   END FUNCTION local_sum_2d
[2307]171
[10425]172   FUNCTION local_sum_3d( ptab )
[6140]173      !!----------------------------------------------------------------------
[10425]174      REAL(wp),  INTENT(in   ) ::   ptab(:,:,:) ! array on which operation is applied
175      COMPLEX(wp)              ::  local_sum_3d
176      !
[6140]177      !!-----------------------------------------------------------------------
178      !
179      COMPLEX(wp)::   ctmp
180      REAL(wp)   ::   ztmp
181      INTEGER    ::   ji, jj, jk   ! dummy loop indices
[10425]182      INTEGER    ::   ipi, ipj, ipk    ! dimensions
[6140]183      !!-----------------------------------------------------------------------
184      !
[10425]185      ipi = SIZE(ptab,1)   ! 1st dimension
186      ipj = SIZE(ptab,2)   ! 2nd dimension
187      ipk = SIZE(ptab,3)   ! 3rd dimension
[6140]188      !
[10425]189      ctmp = CMPLX( 0.e0, 0.e0, wp )   ! warning ctmp is cumulated
[6140]190
[10425]191      DO jk = 1, ipk
192        DO jj = 1, ipj
193          DO ji = 1, ipi
194             ztmp =  ptab(ji,jj,jk) * tmask_i(ji,jj)
195             CALL DDPDD( CMPLX( ztmp, 0.e0, wp ), ctmp )
196          END DO
197        END DO
[4161]198      END DO
199      !
[10425]200      local_sum_3d = ctmp
201       
202   END FUNCTION local_sum_3d
[4161]203
[10425]204!                          ! FUNCTION sum3x3 !
[4161]205
[10425]206   SUBROUTINE sum3x3_2d( p2d )
[4161]207      !!-----------------------------------------------------------------------
[10425]208      !!                  ***  routine sum3x3_2d  ***
[4161]209      !!
[10425]210      !! ** Purpose : sum over 3x3 boxes
211      !!----------------------------------------------------------------------
212      REAL(wp), DIMENSION (:,:), INTENT(inout) ::   p2d
[4161]213      !
[10425]214      INTEGER ::   ji, ji2, jj, jj2     ! dummy loop indices
215      !!----------------------------------------------------------------------
[4161]216      !
[10425]217      IF( SIZE(p2d,1) /= jpi ) CALL ctl_stop( 'STOP', 'wrong call of sum3x3_2d, the first dimension is not equal to jpi' ) 
218      IF( SIZE(p2d,2) /= jpj ) CALL ctl_stop( 'STOP', 'wrong call of sum3x3_2d, the second dimension is not equal to jpj' ) 
[4161]219      !
[10425]220      DO jj = 1, jpj
221         DO ji = 1, jpi 
222            IF( MOD(mig(ji), 3) == 1 .AND. MOD(mjg(jj), 3) == 1 ) THEN   ! bottom left corber of a 3x3 box
223               ji2 = MIN(mig(ji)+2, jpiglo) - nimpp + 1                  ! right position of the box
224               jj2 = MIN(mjg(jj)+2, jpjglo) - njmpp + 1                  ! upper position of the box
225               IF( ji2 <= jpi .AND. jj2 <= jpj ) THEN                    ! the box is fully included in the local mpi domain
226                  p2d(ji:ji2,jj:jj2) = SUM(p2d(ji:ji2,jj:jj2))
227               ENDIF
228            ENDIF
229         END DO
[4161]230      END DO
[10425]231      CALL lbc_lnk( 'lib_fortran', p2d, 'T', 1. )
232      IF( nbondi /= -1 ) THEN
233         IF( MOD(mig(    1), 3) == 1 )   p2d(    1,:) = p2d(    2,:)
234         IF( MOD(mig(    1), 3) == 2 )   p2d(    2,:) = p2d(    1,:)
235      ENDIF
236      IF( nbondi /=  1 ) THEN
237         IF( MOD(mig(jpi-2), 3) == 1 )   p2d(  jpi,:) = p2d(jpi-1,:)
238         IF( MOD(mig(jpi-2), 3) == 0 )   p2d(jpi-1,:) = p2d(  jpi,:)
239      ENDIF
240      IF( nbondj /= -1 ) THEN
241         IF( MOD(mjg(    1), 3) == 1 )   p2d(:,    1) = p2d(:,    2)
242         IF( MOD(mjg(    1), 3) == 2 )   p2d(:,    2) = p2d(:,    1)
243      ENDIF
244      IF( nbondj /=  1 ) THEN
245         IF( MOD(mjg(jpj-2), 3) == 1 )   p2d(:,  jpj) = p2d(:,jpj-1)
246         IF( MOD(mjg(jpj-2), 3) == 0 )   p2d(:,jpj-1) = p2d(:,  jpj)
247      ENDIF
248      CALL lbc_lnk( 'lib_fortran', p2d, 'T', 1. )
[4161]249
[10425]250   END SUBROUTINE sum3x3_2d
251
252   SUBROUTINE sum3x3_3d( p3d )
[4161]253      !!-----------------------------------------------------------------------
[10425]254      !!                  ***  routine sum3x3_3d  ***
[4161]255      !!
[10425]256      !! ** Purpose : sum over 3x3 boxes
257      !!----------------------------------------------------------------------
258      REAL(wp), DIMENSION (:,:,:), INTENT(inout) ::   p3d
[4161]259      !
[10425]260      INTEGER ::   ji, ji2, jj, jj2, jn     ! dummy loop indices
261      INTEGER ::   ipn                      ! Third dimension size
262      !!----------------------------------------------------------------------
[4161]263      !
[10425]264      IF( SIZE(p3d,1) /= jpi ) CALL ctl_stop( 'STOP', 'wrong call of sum3x3_3d, the first dimension is not equal to jpi' ) 
265      IF( SIZE(p3d,2) /= jpj ) CALL ctl_stop( 'STOP', 'wrong call of sum3x3_3d, the second dimension is not equal to jpj' ) 
266      ipn = SIZE(p3d,3)
[4161]267      !
[10425]268      DO jn = 1, ipn
269         DO jj = 1, jpj
270            DO ji = 1, jpi 
271               IF( MOD(mig(ji), 3) == 1 .AND. MOD(mjg(jj), 3) == 1 ) THEN   ! bottom left corber of a 3x3 box
272                  ji2 = MIN(mig(ji)+2, jpiglo) - nimpp + 1                  ! right position of the box
273                  jj2 = MIN(mjg(jj)+2, jpjglo) - njmpp + 1                  ! upper position of the box
274                  IF( ji2 <= jpi .AND. jj2 <= jpj ) THEN                    ! the box is fully included in the local mpi domain
275                     p3d(ji:ji2,jj:jj2,jn) = SUM(p3d(ji:ji2,jj:jj2,jn))
276                  ENDIF
277               ENDIF
278            END DO
279         END DO
[4161]280      END DO
[10425]281      CALL lbc_lnk( 'lib_fortran', p3d, 'T', 1. )
282      IF( nbondi /= -1 ) THEN
283         IF( MOD(mig(    1), 3) == 1 )   p3d(    1,:,:) = p3d(    2,:,:)
284         IF( MOD(mig(    1), 3) == 2 )   p3d(    2,:,:) = p3d(    1,:,:)
285      ENDIF
286      IF( nbondi /=  1 ) THEN
287         IF( MOD(mig(jpi-2), 3) == 1 )   p3d(  jpi,:,:) = p3d(jpi-1,:,:)
288         IF( MOD(mig(jpi-2), 3) == 0 )   p3d(jpi-1,:,:) = p3d(  jpi,:,:)
289      ENDIF
290      IF( nbondj /= -1 ) THEN
291         IF( MOD(mjg(    1), 3) == 1 )   p3d(:,    1,:) = p3d(:,    2,:)
292         IF( MOD(mjg(    1), 3) == 2 )   p3d(:,    2,:) = p3d(:,    1,:)
293      ENDIF
294      IF( nbondj /=  1 ) THEN
295         IF( MOD(mjg(jpj-2), 3) == 1 )   p3d(:,  jpj,:) = p3d(:,jpj-1,:)
296         IF( MOD(mjg(jpj-2), 3) == 0 )   p3d(:,jpj-1,:) = p3d(:,  jpj,:)
297      ENDIF
298      CALL lbc_lnk( 'lib_fortran', p3d, 'T', 1. )
[4161]299
[10425]300   END SUBROUTINE sum3x3_3d
[4161]301
302
[2003]303   SUBROUTINE DDPDD( ydda, yddb )
304      !!----------------------------------------------------------------------
305      !!               ***  ROUTINE DDPDD ***
[3764]306      !!
[2003]307      !! ** Purpose : Add a scalar element to a sum
308      !!
[3764]309      !!
310      !! ** Method  : The code uses the compensated summation with doublet
[2003]311      !!              (sum,error) emulated useing complex numbers. ydda is the
[3764]312      !!               scalar to add to the summ yddb
[2003]313      !!
[3764]314      !! ** Action  : This does only work for MPI.
315      !!
[2003]316      !! References : Using Acurate Arithmetics to Improve Numerical
317      !!              Reproducibility and Sability in Parallel Applications
[3764]318      !!              Yun HE and Chris H. Q. DING, Journal of Supercomputing 18, 259-277, 2001
[2003]319      !!----------------------------------------------------------------------
[2307]320      COMPLEX(wp), INTENT(in   ) ::   ydda
321      COMPLEX(wp), INTENT(inout) ::   yddb
322      !
[2003]323      REAL(wp) :: zerr, zt1, zt2  ! local work variables
[2307]324      !!-----------------------------------------------------------------------
325      !
[2003]326      ! Compute ydda + yddb using Knuth's trick.
[2307]327      zt1  = REAL(ydda) + REAL(yddb)
328      zerr = zt1 - REAL(ydda)
329      zt2  = ( (REAL(yddb) - zerr) + (REAL(ydda) - (zt1 - zerr)) )   &
330         &   + AIMAG(ydda)         + AIMAG(yddb)
331      !
[2003]332      ! The result is t1 + t2, after normalization.
[2307]333      yddb = CMPLX( zt1 + zt2, zt2 - ((zt1 + zt2) - zt1), wp )
334      !
[2003]335   END SUBROUTINE DDPDD
336
337#if defined key_nosignedzero
[2307]338   !!----------------------------------------------------------------------
339   !!   'key_nosignedzero'                                         F90 SIGN
340   !!----------------------------------------------------------------------
[3764]341
[2307]342   FUNCTION SIGN_SCALAR( pa, pb )
[2003]343      !!-----------------------------------------------------------------------
344      !!                  ***  FUNCTION SIGN_SCALAR  ***
345      !!
346      !! ** Purpose : overwrite f95 behaviour of intrinsinc sign function
347      !!-----------------------------------------------------------------------
348      REAL(wp) :: pa,pb          ! input
[2307]349      REAL(wp) :: SIGN_SCALAR    ! result
350      !!-----------------------------------------------------------------------
351      IF ( pb >= 0.e0) THEN   ;   SIGN_SCALAR = ABS(pa)
352      ELSE                    ;   SIGN_SCALAR =-ABS(pa)
[2003]353      ENDIF
354   END FUNCTION SIGN_SCALAR
355
[2307]356
[3764]357   FUNCTION SIGN_ARRAY_1D( pa, pb )
[2003]358      !!-----------------------------------------------------------------------
359      !!                  ***  FUNCTION SIGN_ARRAY_1D  ***
360      !!
361      !! ** Purpose : overwrite f95 behaviour of intrinsinc sign function
362      !!-----------------------------------------------------------------------
[2307]363      REAL(wp) :: pa,pb(:)                   ! input
[2003]364      REAL(wp) :: SIGN_ARRAY_1D(SIZE(pb,1))  ! result
[2307]365      !!-----------------------------------------------------------------------
366      WHERE ( pb >= 0.e0 )   ;   SIGN_ARRAY_1D = ABS(pa)
367      ELSEWHERE              ;   SIGN_ARRAY_1D =-ABS(pa)
[2003]368      END WHERE
369   END FUNCTION SIGN_ARRAY_1D
370
[2307]371
[3764]372   FUNCTION SIGN_ARRAY_2D(pa,pb)
[2003]373      !!-----------------------------------------------------------------------
374      !!                  ***  FUNCTION SIGN_ARRAY_2D  ***
375      !!
376      !! ** Purpose : overwrite f95 behaviour of intrinsinc sign function
377      !!-----------------------------------------------------------------------
378      REAL(wp) :: pa,pb(:,:)      ! input
379      REAL(wp) :: SIGN_ARRAY_2D(SIZE(pb,1),SIZE(pb,2))  ! result
[2307]380      !!-----------------------------------------------------------------------
381      WHERE ( pb >= 0.e0 )   ;   SIGN_ARRAY_2D = ABS(pa)
382      ELSEWHERE              ;   SIGN_ARRAY_2D =-ABS(pa)
[2003]383      END WHERE
384   END FUNCTION SIGN_ARRAY_2D
385
[3764]386   FUNCTION SIGN_ARRAY_3D(pa,pb)
[2003]387      !!-----------------------------------------------------------------------
388      !!                  ***  FUNCTION SIGN_ARRAY_3D  ***
389      !!
390      !! ** Purpose : overwrite f95 behaviour of intrinsinc sign function
391      !!-----------------------------------------------------------------------
392      REAL(wp) :: pa,pb(:,:,:)      ! input
393      REAL(wp) :: SIGN_ARRAY_3D(SIZE(pb,1),SIZE(pb,2),SIZE(pb,3))  ! result
[2307]394      !!-----------------------------------------------------------------------
395      WHERE ( pb >= 0.e0 )   ;   SIGN_ARRAY_3D = ABS(pa)
396      ELSEWHERE              ;   SIGN_ARRAY_3D =-ABS(pa)
[2003]397      END WHERE
398   END FUNCTION SIGN_ARRAY_3D
399
[2307]400
[3764]401   FUNCTION SIGN_ARRAY_1D_A(pa,pb)
[2003]402      !!-----------------------------------------------------------------------
403      !!                  ***  FUNCTION SIGN_ARRAY_1D_A  ***
404      !!
405      !! ** Purpose : overwrite f95 behaviour of intrinsinc sign function
406      !!-----------------------------------------------------------------------
407      REAL(wp) :: pa(:),pb(:)      ! input
[2307]408      REAL(wp) :: SIGN_ARRAY_1D_A(SIZE(pb,1))  ! result
409      !!-----------------------------------------------------------------------
410      WHERE ( pb >= 0.e0 )   ;   SIGN_ARRAY_1D_A = ABS(pa)
411      ELSEWHERE              ;   SIGN_ARRAY_1D_A =-ABS(pa)
[2003]412      END WHERE
413   END FUNCTION SIGN_ARRAY_1D_A
414
[2307]415
[3764]416   FUNCTION SIGN_ARRAY_2D_A(pa,pb)
[2003]417      !!-----------------------------------------------------------------------
418      !!                  ***  FUNCTION SIGN_ARRAY_2D_A  ***
419      !!
420      !! ** Purpose : overwrite f95 behaviour of intrinsinc sign function
421      !!-----------------------------------------------------------------------
422      REAL(wp) :: pa(:,:),pb(:,:)      ! input
423      REAL(wp) :: SIGN_ARRAY_2D_A(SIZE(pb,1),SIZE(pb,2))  ! result
[2307]424      !!-----------------------------------------------------------------------
425      WHERE ( pb >= 0.e0 )   ;   SIGN_ARRAY_2D_A = ABS(pa)
426      ELSEWHERE              ;   SIGN_ARRAY_2D_A =-ABS(pa)
[2003]427      END WHERE
428   END FUNCTION SIGN_ARRAY_2D_A
429
[2307]430
[3764]431   FUNCTION SIGN_ARRAY_3D_A(pa,pb)
[2003]432      !!-----------------------------------------------------------------------
433      !!                  ***  FUNCTION SIGN_ARRAY_3D_A  ***
434      !!
435      !! ** Purpose : overwrite f95 behaviour of intrinsinc sign function
436      !!-----------------------------------------------------------------------
437      REAL(wp) :: pa(:,:,:),pb(:,:,:)  ! input
438      REAL(wp) :: SIGN_ARRAY_3D_A(SIZE(pb,1),SIZE(pb,2),SIZE(pb,3)) ! result
[2307]439      !!-----------------------------------------------------------------------
440      WHERE ( pb >= 0.e0 )   ;   SIGN_ARRAY_3D_A = ABS(pa)
441      ELSEWHERE              ;   SIGN_ARRAY_3D_A =-ABS(pa)
[2003]442      END WHERE
443   END FUNCTION SIGN_ARRAY_3D_A
444
[2307]445
[3764]446   FUNCTION SIGN_ARRAY_1D_B(pa,pb)
[2003]447      !!-----------------------------------------------------------------------
448      !!                  ***  FUNCTION SIGN_ARRAY_1D_B  ***
449      !!
450      !! ** Purpose : overwrite f95 behaviour of intrinsinc sign function
451      !!-----------------------------------------------------------------------
452      REAL(wp) :: pa(:),pb      ! input
453      REAL(wp) :: SIGN_ARRAY_1D_B(SIZE(pa,1))  ! result
[2307]454      !!-----------------------------------------------------------------------
455      IF( pb >= 0.e0 ) THEN   ;   SIGN_ARRAY_1D_B = ABS(pa)
456      ELSE                    ;   SIGN_ARRAY_1D_B =-ABS(pa)
[2003]457      ENDIF
458   END FUNCTION SIGN_ARRAY_1D_B
459
[2307]460
[3764]461   FUNCTION SIGN_ARRAY_2D_B(pa,pb)
[2003]462      !!-----------------------------------------------------------------------
463      !!                  ***  FUNCTION SIGN_ARRAY_2D_B  ***
464      !!
465      !! ** Purpose : overwrite f95 behaviour of intrinsinc sign function
466      !!-----------------------------------------------------------------------
467      REAL(wp) :: pa(:,:),pb      ! input
468      REAL(wp) :: SIGN_ARRAY_2D_B(SIZE(pa,1),SIZE(pa,2))  ! result
[2307]469      !!-----------------------------------------------------------------------
470      IF( pb >= 0.e0 ) THEN   ;   SIGN_ARRAY_2D_B = ABS(pa)
471      ELSE                    ;   SIGN_ARRAY_2D_B =-ABS(pa)
[2003]472      ENDIF
473   END FUNCTION SIGN_ARRAY_2D_B
474
[2307]475
[3764]476   FUNCTION SIGN_ARRAY_3D_B(pa,pb)
[2003]477      !!-----------------------------------------------------------------------
478      !!                  ***  FUNCTION SIGN_ARRAY_3D_B  ***
479      !!
480      !! ** Purpose : overwrite f95 behaviour of intrinsinc sign function
481      !!-----------------------------------------------------------------------
482      REAL(wp) :: pa(:,:,:),pb      ! input
483      REAL(wp) :: SIGN_ARRAY_3D_B(SIZE(pa,1),SIZE(pa,2),SIZE(pa,3))  ! result
[2307]484      !!-----------------------------------------------------------------------
485      IF( pb >= 0.e0 ) THEN   ;   SIGN_ARRAY_3D_B = ABS(pa)
486      ELSE                    ;   SIGN_ARRAY_3D_B =-ABS(pa)
[2003]487      ENDIF
488   END FUNCTION SIGN_ARRAY_3D_B
489#endif
490
[15371]491#if defined key_noisnan
492!$AGRIF_DO_NOT_TREAT
493   FUNCTION ISNAN(pa)
494      !!-----------------------------------------------------------------------
495      !!                  ***  FUNCTION ISNAN  ***
496      !!
497      !! ** Purpose: provide an alternative to non-standard intrinsic function
498      !!             ISNAN
499      !!-----------------------------------------------------------------------
500      USE, INTRINSIC ::   ieee_arithmetic
501      !!
502      REAL(wp), INTENT(in) ::   pa
503      LOGICAL              ::   ISNAN
504      !!-----------------------------------------------------------------------
505      !
506      ISNAN = ieee_is_nan(pa)
507   END FUNCTION ISNAN
508!$AGRIF_END_DO_NOT_TREAT
509#endif
510
[2307]511   !!======================================================================
[2003]512END MODULE lib_fortran
Note: See TracBrowser for help on using the repository browser.