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 trunk/NEMOGCM/NEMO/OPA_SRC – NEMO

source: trunk/NEMOGCM/NEMO/OPA_SRC/lib_fortran.F90 @ 4500

Last change on this file since 4500 was 3764, checked in by smasson, 11 years ago

dev_MERGE_2012: report bugfixes done in the trunk from r3555 to r3763 into dev_MERGE_2012

  • Property svn:keywords set to Id
File size: 20.2 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
[2003]7   !!----------------------------------------------------------------------
[2307]8
[2003]9   !!----------------------------------------------------------------------
[3764]10   !!   glob_sum    : generic interface for global masked summation over
[2307]11   !!                 the interior domain for 1 or 2 2D or 3D arrays
[3764]12   !!                 it works only for T points
[2307]13   !!   SIGN        : generic interface for SIGN to overwrite f95 behaviour
14   !!                 of intrinsinc sign function
15   !!----------------------------------------------------------------------
[3632]16   USE par_oce         ! Ocean parameter
17   USE dom_oce         ! ocean domain
18   USE in_out_manager  ! I/O manager
19   USE lib_mpp         ! distributed memory computing
[2003]20
21   IMPLICIT NONE
22   PRIVATE
23
[3632]24   PUBLIC   glob_sum   ! used in many places
25   PUBLIC   DDPDD      ! also used in closea module
[2341]26#if defined key_nosignedzero
[2003]27   PUBLIC SIGN
28#endif
29
30   INTERFACE glob_sum
[3764]31      MODULE PROCEDURE glob_sum_1d, glob_sum_2d, glob_sum_3d, &
32         &             glob_sum_2d_a, glob_sum_3d_a
[2003]33   END INTERFACE
34
[3764]35#if defined key_nosignedzero
[2003]36   INTERFACE SIGN
[2307]37      MODULE PROCEDURE SIGN_SCALAR, SIGN_ARRAY_1D, SIGN_ARRAY_2D, SIGN_ARRAY_3D,   &
[3764]38         &             SIGN_ARRAY_1D_A, SIGN_ARRAY_2D_A, SIGN_ARRAY_3D_A,          &
39         &             SIGN_ARRAY_1D_B, SIGN_ARRAY_2D_B, SIGN_ARRAY_3D_B
[2003]40   END INTERFACE
41#endif
42
[2307]43   !!----------------------------------------------------------------------
44   !! NEMO/OPA 3.3 , NEMO Consortium (2010)
[3764]45   !! $Id$
[2307]46   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
47   !!----------------------------------------------------------------------
[3764]48CONTAINS
[2003]49
[2307]50#if ! defined key_mpp_rep
[3764]51   FUNCTION glob_sum_1d( ptab, kdim )
52      !!-----------------------------------------------------------------------
53      !!                  ***  FUNCTION  glob_sum_1D  ***
54      !!
55      !! ** Purpose : perform a masked sum on the inner global domain of a 1D array
56      !!-----------------------------------------------------------------------
57      INTEGER :: kdim
58      REAL(wp), INTENT(in), DIMENSION(kdim) ::   ptab        ! input 1D array
59      REAL(wp)                              ::   glob_sum_1d ! global sum
60      !!-----------------------------------------------------------------------
61      !
62      glob_sum_1d = SUM( ptab(:) )
63      IF( lk_mpp )   CALL mpp_sum( glob_sum_1d )
64      !
65   END FUNCTION glob_sum_1d
[3632]66
[3764]67   FUNCTION glob_sum_2d( ptab )
[2003]68      !!-----------------------------------------------------------------------
69      !!                  ***  FUNCTION  glob_sum_2D  ***
70      !!
[2307]71      !! ** Purpose : perform a masked sum on the inner global domain of a 2D array
[2003]72      !!-----------------------------------------------------------------------
[3294]73      REAL(wp), INTENT(in), DIMENSION(:,:) ::   ptab          ! input 2D array
74      REAL(wp)                             ::   glob_sum_2d   ! global masked sum
[2003]75      !!-----------------------------------------------------------------------
[2307]76      !
[3294]77      glob_sum_2d = SUM( ptab(:,:)*tmask_i(:,:) )
78      IF( lk_mpp )   CALL mpp_sum( glob_sum_2d )
[2307]79      !
[2003]80   END FUNCTION glob_sum_2d
[3764]81
82
83   FUNCTION glob_sum_3d( ptab )
[2003]84      !!-----------------------------------------------------------------------
85      !!                  ***  FUNCTION  glob_sum_3D  ***
86      !!
[2307]87      !! ** Purpose : perform a masked sum on the inner global domain of a 3D array
[2003]88      !!-----------------------------------------------------------------------
[3294]89      REAL(wp), INTENT(in), DIMENSION(:,:,:) ::   ptab          ! input 3D array
90      REAL(wp)                               ::   glob_sum_3d   ! global masked sum
[2307]91      !!
[2003]92      INTEGER :: jk
93      !!-----------------------------------------------------------------------
[2307]94      !
[3294]95      glob_sum_3d = 0.e0
[2003]96      DO jk = 1, jpk
[3294]97         glob_sum_3d = glob_sum_3d + SUM( ptab(:,:,jk)*tmask_i(:,:) )
[2003]98      END DO
[3294]99      IF( lk_mpp )   CALL mpp_sum( glob_sum_3d )
[2307]100      !
[2003]101   END FUNCTION glob_sum_3d
102
[2307]103
[3764]104   FUNCTION glob_sum_2d_a( ptab1, ptab2 )
[2003]105      !!-----------------------------------------------------------------------
106      !!                  ***  FUNCTION  glob_sum_2D _a ***
107      !!
[2307]108      !! ** Purpose : perform a masked sum on the inner global domain of two 2D array
[2003]109      !!-----------------------------------------------------------------------
[3294]110      REAL(wp), INTENT(in), DIMENSION(:,:) ::   ptab1, ptab2    ! input 2D array
111      REAL(wp)            , DIMENSION(2)   ::   glob_sum_2d_a   ! global masked sum
[2003]112      !!-----------------------------------------------------------------------
[3764]113      !
[3294]114      glob_sum_2d_a(1) = SUM( ptab1(:,:)*tmask_i(:,:) )
115      glob_sum_2d_a(2) = SUM( ptab2(:,:)*tmask_i(:,:) )
116      IF( lk_mpp )   CALL mpp_sum( glob_sum_2d_a, 2 )
[2307]117      !
[2003]118   END FUNCTION glob_sum_2d_a
[3764]119
120
121   FUNCTION glob_sum_3d_a( ptab1, ptab2 )
[2003]122      !!-----------------------------------------------------------------------
123      !!                  ***  FUNCTION  glob_sum_3D_a ***
124      !!
[2307]125      !! ** Purpose : perform a masked sum on the inner global domain of two 3D array
[2003]126      !!-----------------------------------------------------------------------
[3294]127      REAL(wp), INTENT(in), DIMENSION(:,:,:) ::   ptab1, ptab2    ! input 3D array
128      REAL(wp)            , DIMENSION(2)     ::   glob_sum_3d_a   ! global masked sum
[2307]129      !!
[2003]130      INTEGER :: jk
131      !!-----------------------------------------------------------------------
[2307]132      !
[3294]133      glob_sum_3d_a(:) = 0.e0
[2003]134      DO jk = 1, jpk
[3294]135         glob_sum_3d_a(1) = glob_sum_3d_a(1) + SUM( ptab1(:,:,jk)*tmask_i(:,:) )
136         glob_sum_3d_a(2) = glob_sum_3d_a(2) + SUM( ptab2(:,:,jk)*tmask_i(:,:) )
[2003]137      END DO
[3294]138      IF( lk_mpp )   CALL mpp_sum( glob_sum_3d_a, 2 )
[2307]139      !
[2003]140   END FUNCTION glob_sum_3d_a
141
[3764]142#else
[2307]143   !!----------------------------------------------------------------------
144   !!   'key_mpp_rep'                                   MPP reproducibility
145   !!----------------------------------------------------------------------
[3764]146
147   FUNCTION glob_sum_1d( ptab, kdim )
[2003]148      !!----------------------------------------------------------------------
[3764]149      !!                  ***  FUNCTION  glob_sum_1d ***
150      !!
151      !! ** Purpose : perform a sum in calling DDPDD routine
152      !!----------------------------------------------------------------------
153      INTEGER , INTENT(in) :: kdim
154      REAL(wp), INTENT(in), DIMENSION(kdim) ::   ptab
155      REAL(wp)                              ::   glob_sum_1d   ! global sum
156      !!
157      COMPLEX(wp)::   ctmp
158      REAL(wp)   ::   ztmp
159      INTEGER    ::   ji   ! dummy loop indices
160      !!-----------------------------------------------------------------------
161      !
162      ztmp = 0.e0
163      ctmp = CMPLX( 0.e0, 0.e0, wp )
164      DO ji = 1, kdim
165         ztmp =  ptab(ji)
166         CALL DDPDD( CMPLX( ztmp, 0.e0, wp ), ctmp )
167         END DO
168      IF( lk_mpp )   CALL mpp_sum( ctmp )   ! sum over the global domain
169      glob_sum_1d = REAL(ctmp,wp)
170      !
171   END FUNCTION glob_sum_1d
172
173   FUNCTION glob_sum_2d( ptab )
174      !!----------------------------------------------------------------------
[2307]175      !!                  ***  FUNCTION  glob_sum_2d ***
[2003]176      !!
177      !! ** Purpose : perform a sum in calling DDPDD routine
[2307]178      !!----------------------------------------------------------------------
179      REAL(wp), INTENT(in), DIMENSION(jpi,jpj) ::   ptab
[3294]180      REAL(wp)                                 ::   glob_sum_2d   ! global masked sum
[2003]181      !!
[2307]182      COMPLEX(wp)::   ctmp
183      REAL(wp)   ::   ztmp
184      INTEGER    ::   ji, jj   ! dummy loop indices
185      !!-----------------------------------------------------------------------
186      !
187      ztmp = 0.e0
188      ctmp = CMPLX( 0.e0, 0.e0, wp )
189      DO jj = 1, jpj
190         DO ji =1, jpi
191         ztmp =  ptab(ji,jj) * tmask_i(ji,jj)
192         CALL DDPDD( CMPLX( ztmp, 0.e0, wp ), ctmp )
193         END DO
194      END DO
195      IF( lk_mpp )   CALL mpp_sum( ctmp )   ! sum over the global domain
[3294]196      glob_sum_2d = REAL(ctmp,wp)
[2307]197      !
[3764]198   END FUNCTION glob_sum_2d
[2307]199
200
[3764]201   FUNCTION glob_sum_3d( ptab )
[2003]202      !!----------------------------------------------------------------------
[2307]203      !!                  ***  FUNCTION  glob_sum_3d ***
204      !!
205      !! ** Purpose : perform a sum on a 3D array in calling DDPDD routine
206      !!----------------------------------------------------------------------
207      REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) ::   ptab
[3294]208      REAL(wp)                                     ::   glob_sum_3d   ! global masked sum
[2307]209      !!
210      COMPLEX(wp)::   ctmp
211      REAL(wp)   ::   ztmp
212      INTEGER    ::   ji, jj, jk   ! dummy loop indices
213      !!-----------------------------------------------------------------------
[2003]214      !
[2307]215      ztmp = 0.e0
216      ctmp = CMPLX( 0.e0, 0.e0, wp )
217      DO jk = 1, jpk
218         DO jj = 1, jpj
219            DO ji =1, jpi
220            ztmp =  ptab(ji,jj,jk) * tmask_i(ji,jj)
221            CALL DDPDD( CMPLX( ztmp, 0.e0, wp ), ctmp )
222            END DO
[3764]223         END DO
[2307]224      END DO
225      IF( lk_mpp )   CALL mpp_sum( ctmp )   ! sum over the global domain
[3294]226      glob_sum_3d = REAL(ctmp,wp)
[2307]227      !
[3764]228   END FUNCTION glob_sum_3d
[2307]229
230
[3764]231   FUNCTION glob_sum_2d_a( ptab1, ptab2 )
[2307]232      !!----------------------------------------------------------------------
233      !!                  ***  FUNCTION  glob_sum_2d_a ***
234      !!
235      !! ** Purpose : perform a sum on two 2D arrays in calling DDPDD routine
236      !!----------------------------------------------------------------------
237      REAL(wp), INTENT(in), DIMENSION(jpi,jpj) ::   ptab1, ptab2
[3294]238      REAL(wp)                                 ::   glob_sum_2d_a   ! global masked sum
[2307]239      !!
240      COMPLEX(wp)::   ctmp
241      REAL(wp)   ::   ztmp
242      INTEGER    ::   ji, jj   ! dummy loop indices
[2003]243      !!-----------------------------------------------------------------------
[2307]244      !
[2003]245      ztmp = 0.e0
[2307]246      ctmp = CMPLX( 0.e0, 0.e0, wp )
247      DO jj = 1, jpj
[2003]248         DO ji =1, jpi
[2307]249         ztmp =  ptab1(ji,jj) * tmask_i(ji,jj)
250         CALL DDPDD( CMPLX( ztmp, 0.e0, wp ), ctmp )
251         ztmp =  ptab2(ji,jj) * tmask_i(ji,jj)
252         CALL DDPDD( CMPLX( ztmp, 0.e0, wp ), ctmp )
[2003]253         END DO
254      END DO
255      IF( lk_mpp )   CALL mpp_sum( ctmp )   ! sum over the global domain
[3294]256      glob_sum_2d_a = REAL(ctmp,wp)
[2307]257      !
[3764]258   END FUNCTION glob_sum_2d_a
[2003]259
[2307]260
[3764]261   FUNCTION glob_sum_3d_a( ptab1, ptab2 )
[2307]262      !!----------------------------------------------------------------------
263      !!                  ***  FUNCTION  glob_sum_3d_a ***
264      !!
265      !! ** Purpose : perform a sum on two 3D array in calling DDPDD routine
266      !!----------------------------------------------------------------------
267      REAL(wp), INTENT(in), DIMENSION(jpi,jpj,jpk) ::   ptab1, ptab2
[3294]268      REAL(wp)                                     ::   glob_sum_3d_a   ! global masked sum
[2307]269      !!
270      COMPLEX(wp)::   ctmp
271      REAL(wp)   ::   ztmp
272      INTEGER    ::   ji, jj, jk   ! dummy loop indices
273      !!-----------------------------------------------------------------------
274      !
275      ztmp = 0.e0
276      ctmp = CMPLX( 0.e0, 0.e0, wp )
277      DO jk = 1, jpk
278         DO jj = 1, jpj
279            DO ji =1, jpi
280            ztmp =  ptab1(ji,jj,jk) * tmask_i(ji,jj)
281            CALL DDPDD( CMPLX( ztmp, 0.e0, wp ), ctmp )
282            ztmp =  ptab2(ji,jj,jk) * tmask_i(ji,jj)
283            CALL DDPDD( CMPLX( ztmp, 0.e0, wp ), ctmp )
284            END DO
[3764]285         END DO
[2307]286      END DO
287      IF( lk_mpp )   CALL mpp_sum( ctmp )   ! sum over the global domain
[3294]288      glob_sum_3d_a = REAL(ctmp,wp)
[2307]289      !
[3764]290   END FUNCTION glob_sum_3d_a
[2307]291
[3632]292#endif
[2307]293
[2003]294   SUBROUTINE DDPDD( ydda, yddb )
295      !!----------------------------------------------------------------------
296      !!               ***  ROUTINE DDPDD ***
[3764]297      !!
[2003]298      !! ** Purpose : Add a scalar element to a sum
299      !!
[3764]300      !!
301      !! ** Method  : The code uses the compensated summation with doublet
[2003]302      !!              (sum,error) emulated useing complex numbers. ydda is the
[3764]303      !!               scalar to add to the summ yddb
[2003]304      !!
[3764]305      !! ** Action  : This does only work for MPI.
306      !!
[2003]307      !! References : Using Acurate Arithmetics to Improve Numerical
308      !!              Reproducibility and Sability in Parallel Applications
[3764]309      !!              Yun HE and Chris H. Q. DING, Journal of Supercomputing 18, 259-277, 2001
[2003]310      !!----------------------------------------------------------------------
[2307]311      COMPLEX(wp), INTENT(in   ) ::   ydda
312      COMPLEX(wp), INTENT(inout) ::   yddb
313      !
[2003]314      REAL(wp) :: zerr, zt1, zt2  ! local work variables
[2307]315      !!-----------------------------------------------------------------------
316      !
[2003]317      ! Compute ydda + yddb using Knuth's trick.
[2307]318      zt1  = REAL(ydda) + REAL(yddb)
319      zerr = zt1 - REAL(ydda)
320      zt2  = ( (REAL(yddb) - zerr) + (REAL(ydda) - (zt1 - zerr)) )   &
321         &   + AIMAG(ydda)         + AIMAG(yddb)
322      !
[2003]323      ! The result is t1 + t2, after normalization.
[2307]324      yddb = CMPLX( zt1 + zt2, zt2 - ((zt1 + zt2) - zt1), wp )
325      !
[2003]326   END SUBROUTINE DDPDD
327
328#if defined key_nosignedzero
[2307]329   !!----------------------------------------------------------------------
330   !!   'key_nosignedzero'                                         F90 SIGN
331   !!----------------------------------------------------------------------
[3764]332
[2307]333   FUNCTION SIGN_SCALAR( pa, pb )
[2003]334      !!-----------------------------------------------------------------------
335      !!                  ***  FUNCTION SIGN_SCALAR  ***
336      !!
337      !! ** Purpose : overwrite f95 behaviour of intrinsinc sign function
338      !!-----------------------------------------------------------------------
339      REAL(wp) :: pa,pb          ! input
[2307]340      REAL(wp) :: SIGN_SCALAR    ! result
341      !!-----------------------------------------------------------------------
342      IF ( pb >= 0.e0) THEN   ;   SIGN_SCALAR = ABS(pa)
343      ELSE                    ;   SIGN_SCALAR =-ABS(pa)
[2003]344      ENDIF
345   END FUNCTION SIGN_SCALAR
346
[2307]347
[3764]348   FUNCTION SIGN_ARRAY_1D( pa, pb )
[2003]349      !!-----------------------------------------------------------------------
350      !!                  ***  FUNCTION SIGN_ARRAY_1D  ***
351      !!
352      !! ** Purpose : overwrite f95 behaviour of intrinsinc sign function
353      !!-----------------------------------------------------------------------
[2307]354      REAL(wp) :: pa,pb(:)                   ! input
[2003]355      REAL(wp) :: SIGN_ARRAY_1D(SIZE(pb,1))  ! result
[2307]356      !!-----------------------------------------------------------------------
357      WHERE ( pb >= 0.e0 )   ;   SIGN_ARRAY_1D = ABS(pa)
358      ELSEWHERE              ;   SIGN_ARRAY_1D =-ABS(pa)
[2003]359      END WHERE
360   END FUNCTION SIGN_ARRAY_1D
361
[2307]362
[3764]363   FUNCTION SIGN_ARRAY_2D(pa,pb)
[2003]364      !!-----------------------------------------------------------------------
365      !!                  ***  FUNCTION SIGN_ARRAY_2D  ***
366      !!
367      !! ** Purpose : overwrite f95 behaviour of intrinsinc sign function
368      !!-----------------------------------------------------------------------
369      REAL(wp) :: pa,pb(:,:)      ! input
370      REAL(wp) :: SIGN_ARRAY_2D(SIZE(pb,1),SIZE(pb,2))  ! result
[2307]371      !!-----------------------------------------------------------------------
372      WHERE ( pb >= 0.e0 )   ;   SIGN_ARRAY_2D = ABS(pa)
373      ELSEWHERE              ;   SIGN_ARRAY_2D =-ABS(pa)
[2003]374      END WHERE
375   END FUNCTION SIGN_ARRAY_2D
376
[3764]377   FUNCTION SIGN_ARRAY_3D(pa,pb)
[2003]378      !!-----------------------------------------------------------------------
379      !!                  ***  FUNCTION SIGN_ARRAY_3D  ***
380      !!
381      !! ** Purpose : overwrite f95 behaviour of intrinsinc sign function
382      !!-----------------------------------------------------------------------
383      REAL(wp) :: pa,pb(:,:,:)      ! input
384      REAL(wp) :: SIGN_ARRAY_3D(SIZE(pb,1),SIZE(pb,2),SIZE(pb,3))  ! result
[2307]385      !!-----------------------------------------------------------------------
386      WHERE ( pb >= 0.e0 )   ;   SIGN_ARRAY_3D = ABS(pa)
387      ELSEWHERE              ;   SIGN_ARRAY_3D =-ABS(pa)
[2003]388      END WHERE
389   END FUNCTION SIGN_ARRAY_3D
390
[2307]391
[3764]392   FUNCTION SIGN_ARRAY_1D_A(pa,pb)
[2003]393      !!-----------------------------------------------------------------------
394      !!                  ***  FUNCTION SIGN_ARRAY_1D_A  ***
395      !!
396      !! ** Purpose : overwrite f95 behaviour of intrinsinc sign function
397      !!-----------------------------------------------------------------------
398      REAL(wp) :: pa(:),pb(:)      ! input
[2307]399      REAL(wp) :: SIGN_ARRAY_1D_A(SIZE(pb,1))  ! result
400      !!-----------------------------------------------------------------------
401      WHERE ( pb >= 0.e0 )   ;   SIGN_ARRAY_1D_A = ABS(pa)
402      ELSEWHERE              ;   SIGN_ARRAY_1D_A =-ABS(pa)
[2003]403      END WHERE
404   END FUNCTION SIGN_ARRAY_1D_A
405
[2307]406
[3764]407   FUNCTION SIGN_ARRAY_2D_A(pa,pb)
[2003]408      !!-----------------------------------------------------------------------
409      !!                  ***  FUNCTION SIGN_ARRAY_2D_A  ***
410      !!
411      !! ** Purpose : overwrite f95 behaviour of intrinsinc sign function
412      !!-----------------------------------------------------------------------
413      REAL(wp) :: pa(:,:),pb(:,:)      ! input
414      REAL(wp) :: SIGN_ARRAY_2D_A(SIZE(pb,1),SIZE(pb,2))  ! result
[2307]415      !!-----------------------------------------------------------------------
416      WHERE ( pb >= 0.e0 )   ;   SIGN_ARRAY_2D_A = ABS(pa)
417      ELSEWHERE              ;   SIGN_ARRAY_2D_A =-ABS(pa)
[2003]418      END WHERE
419   END FUNCTION SIGN_ARRAY_2D_A
420
[2307]421
[3764]422   FUNCTION SIGN_ARRAY_3D_A(pa,pb)
[2003]423      !!-----------------------------------------------------------------------
424      !!                  ***  FUNCTION SIGN_ARRAY_3D_A  ***
425      !!
426      !! ** Purpose : overwrite f95 behaviour of intrinsinc sign function
427      !!-----------------------------------------------------------------------
428      REAL(wp) :: pa(:,:,:),pb(:,:,:)  ! input
429      REAL(wp) :: SIGN_ARRAY_3D_A(SIZE(pb,1),SIZE(pb,2),SIZE(pb,3)) ! result
[2307]430      !!-----------------------------------------------------------------------
431      WHERE ( pb >= 0.e0 )   ;   SIGN_ARRAY_3D_A = ABS(pa)
432      ELSEWHERE              ;   SIGN_ARRAY_3D_A =-ABS(pa)
[2003]433      END WHERE
434   END FUNCTION SIGN_ARRAY_3D_A
435
[2307]436
[3764]437   FUNCTION SIGN_ARRAY_1D_B(pa,pb)
[2003]438      !!-----------------------------------------------------------------------
439      !!                  ***  FUNCTION SIGN_ARRAY_1D_B  ***
440      !!
441      !! ** Purpose : overwrite f95 behaviour of intrinsinc sign function
442      !!-----------------------------------------------------------------------
443      REAL(wp) :: pa(:),pb      ! input
444      REAL(wp) :: SIGN_ARRAY_1D_B(SIZE(pa,1))  ! result
[2307]445      !!-----------------------------------------------------------------------
446      IF( pb >= 0.e0 ) THEN   ;   SIGN_ARRAY_1D_B = ABS(pa)
447      ELSE                    ;   SIGN_ARRAY_1D_B =-ABS(pa)
[2003]448      ENDIF
449   END FUNCTION SIGN_ARRAY_1D_B
450
[2307]451
[3764]452   FUNCTION SIGN_ARRAY_2D_B(pa,pb)
[2003]453      !!-----------------------------------------------------------------------
454      !!                  ***  FUNCTION SIGN_ARRAY_2D_B  ***
455      !!
456      !! ** Purpose : overwrite f95 behaviour of intrinsinc sign function
457      !!-----------------------------------------------------------------------
458      REAL(wp) :: pa(:,:),pb      ! input
459      REAL(wp) :: SIGN_ARRAY_2D_B(SIZE(pa,1),SIZE(pa,2))  ! result
[2307]460      !!-----------------------------------------------------------------------
461      IF( pb >= 0.e0 ) THEN   ;   SIGN_ARRAY_2D_B = ABS(pa)
462      ELSE                    ;   SIGN_ARRAY_2D_B =-ABS(pa)
[2003]463      ENDIF
464   END FUNCTION SIGN_ARRAY_2D_B
465
[2307]466
[3764]467   FUNCTION SIGN_ARRAY_3D_B(pa,pb)
[2003]468      !!-----------------------------------------------------------------------
469      !!                  ***  FUNCTION SIGN_ARRAY_3D_B  ***
470      !!
471      !! ** Purpose : overwrite f95 behaviour of intrinsinc sign function
472      !!-----------------------------------------------------------------------
473      REAL(wp) :: pa(:,:,:),pb      ! input
474      REAL(wp) :: SIGN_ARRAY_3D_B(SIZE(pa,1),SIZE(pa,2),SIZE(pa,3))  ! result
[2307]475      !!-----------------------------------------------------------------------
476      IF( pb >= 0.e0 ) THEN   ;   SIGN_ARRAY_3D_B = ABS(pa)
477      ELSE                    ;   SIGN_ARRAY_3D_B =-ABS(pa)
[2003]478      ENDIF
479   END FUNCTION SIGN_ARRAY_3D_B
480#endif
481
[2307]482   !!======================================================================
[2003]483END MODULE lib_fortran
Note: See TracBrowser for help on using the repository browser.