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.
isfutils.F90 in NEMO/branches/2020/dev_r14116_HPC-04_mcastril_Mixed_Precision_implementation_final/src/OCE/ISF – NEMO

source: NEMO/branches/2020/dev_r14116_HPC-04_mcastril_Mixed_Precision_implementation_final/src/OCE/ISF/isfutils.F90 @ 14219

Last change on this file since 14219 was 14219, checked in by mcastril, 4 years ago

Add Mixed Precision support by Oriol Tintó

File size: 6.4 KB
Line 
1MODULE isfutils
2   !!======================================================================
3   !!                       ***  MODULE  isfutils  ***
4   !! istutils module : miscelenious useful routines
5   !!======================================================================
6   !! History :  4.1  !  2019-09  (P. Mathiot) original code
7   !!----------------------------------------------------------------------
8
9   !!----------------------------------------------------------------------
10   !!   isfutils       : - read_2dcstdta to read a constant input file with iom_get
11   !!                    - debug to print array sum, min, max in ocean.output
12   !!----------------------------------------------------------------------
13
14   USE iom           , ONLY: iom_open, iom_get, iom_close, jpdom_global      ! read input file
15   USE lib_fortran   , ONLY: glob_sum, glob_min, glob_max                    ! compute global value
16   USE par_oce       , ONLY: jpi,jpj,jpk, jpnij, Nis0, Nie0, Njs0, Nje0      ! domain size
17   USE dom_oce       , ONLY: narea, tmask_h, tmask_i                         ! local domain
18   USE in_out_manager, ONLY: lwp, numout                             ! miscelenious
19   USE par_kind
20   USE lib_mpp
21
22   IMPLICIT NONE
23
24   PRIVATE
25
26   INTERFACE debug
27      MODULE PROCEDURE debug2d, debug3d
28   END INTERFACE debug
29
30   PUBLIC read_2dcstdta, debug
31
32CONTAINS
33
34   SUBROUTINE read_2dcstdta(cdfile, cdvar, pvar)
35      !!--------------------------------------------------------------------
36      !!                  ***  ROUTINE read_2dcstdta  ***
37      !!
38      !! ** Purpose : read input file
39      !!
40      !!-------------------------- OUT -------------------------------------
41      REAL(wp), DIMENSION(jpi,jpj), INTENT(  out) :: pvar     ! output variable
42      !!-------------------------- IN  -------------------------------------
43      CHARACTER(len=*)            , INTENT(in   ) :: cdfile   ! input file name
44      CHARACTER(len=*)            , INTENT(in   ) :: cdvar    ! variable name
45      !!--------------------------------------------------------------------
46      INTEGER :: inum
47      !!--------------------------------------------------------------------
48
49      CALL iom_open( TRIM(cdfile), inum )
50      CALL iom_get( inum, jpdom_global, TRIM(cdvar), pvar)
51      CALL iom_close(inum)
52
53   END SUBROUTINE read_2dcstdta
54
55   SUBROUTINE debug2d(cdtxt,pvar)
56      !!--------------------------------------------------------------------
57      !!                  ***  ROUTINE isf_debug2d  ***
58      !!
59      !! ** Purpose : add debug print for 2d variables
60      !!
61      !!-------------------------- IN  -------------------------------------
62      CHARACTER(LEN=*)            , INTENT(in   ) :: cdtxt
63      REAL(wp), DIMENSION(jpi,jpj), INTENT(in   ) :: pvar
64      !!--------------------------------------------------------------------
65      REAL(wp)    :: zmin, zmax, zsum
66      INTEGER(i8) :: imodd, ip
67      INTEGER     :: imods
68      INTEGER     :: isums, idums
69      INTEGER     :: ji,jj,jk
70      INTEGER, DIMENSION(jpnij) :: itmps
71      !!--------------------------------------------------------------------
72      !
73      ! global min/max/sum to check data range and NaN
74      zsum = glob_sum( 'debug', pvar(:,:) )
75      zmin = glob_min( 'debug', pvar(:,:) )
76      zmax = glob_max( 'debug', pvar(:,:) )
77      !
78      ! basic check sum to check reproducibility
79      ! TRANSFER function find out the integer corresponding to pvar(i,j) bit pattern
80      ! MOD allow us to keep only the latest digits during the sum
81      ! imod is not choosen to be very large as at the end there is a classic mpp_sum
82      imodd=65521 ! highest prime number < 2**16 with i8 type
83      imods=65521 ! highest prime number < 2**16 with default integer for mpp_sum subroutine
84      isums=0 ; itmps(:)=0 ;
85      !
86      ! local MOD sum
87      DO jj=Njs0,Nje0
88         DO ji=Nis0,Nie0
89            idums = ABS(MOD(TRANSFER(pvar(ji,jj), ip),imodd))
90            itmps(narea) = MOD(itmps(narea) + idums, imods)
91         END DO
92      END DO
93      !
94      ! global MOD sum
95      CALL mpp_max('debug',itmps(:))
96      DO jk = 1,jpnij
97         isums = MOD(isums + itmps(jk),imods)
98      END DO
99      !
100      ! print out
101      IF (lwp) THEN
102         WRITE(numout,*) TRIM(cdtxt),' (min, max, sum, tag) : ',zmin, zmax, zsum, isums
103         CALL FLUSH(numout)
104      END IF
105      !
106   END SUBROUTINE debug2d
107
108   SUBROUTINE debug3d(cdtxt,pvar)
109      !!--------------------------------------------------------------------
110      !!                  ***  ROUTINE isf_debug3d  ***
111      !!
112      !! ** Purpose : add debug print for 3d variables
113      !!
114      !!-------------------------- IN  -------------------------------------
115      CHARACTER(LEN=*)                , INTENT(in   ) :: cdtxt
116      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(in   ) :: pvar
117      !!--------------------------------------------------------------------
118      REAL(wp)    :: zmin, zmax, zsum
119      INTEGER(i8) :: imodd, ip
120      INTEGER     :: imods
121      INTEGER     :: isums, idums
122      INTEGER     :: ji,jj,jk
123      INTEGER, DIMENSION(jpnij) :: itmps
124      !!--------------------------------------------------------------------
125      !
126      ! global min/max/sum to check data range and NaN
127      zsum = glob_sum( 'debug', pvar(:,:,:) )
128      zmin = glob_min( 'debug', pvar(:,:,:) )
129      zmax = glob_max( 'debug', pvar(:,:,:) )
130      !
131      ! basic check sum to check reproducibility
132      ! TRANSFER function find out the integer corresponding to pvar(i,j) bit pattern
133      ! MOD allow us to keep only the latest digits during the sum
134      ! imod is not choosen to be very large as at the end there is a classic mpp_sum
135      imodd=65521 ! highest prime number < 2**16 with i8 type
136      imods=65521 ! highest prime number < 2**16 with default integer for mpp_sum subroutine
137      itmps=0; isums=0
138      !
139      ! local MOD sum
140      DO jk=1,jpk
141         DO jj=Njs0,Nje0
142            DO ji=Nis0,Nie0
143               idums = ABS(MOD(TRANSFER(pvar(ji,jj,jk), ip),imodd))
144               itmps(narea) = MOD(itmps(narea) + idums, imods)
145            END DO
146         END DO
147      END DO
148      !
149      ! global MOD sum
150      CALL mpp_max('debug',itmps)
151      DO jk = 1,jpnij
152         isums = MOD(isums+itmps(jk),imods)
153      END DO
154      !
155      ! print out
156      IF (lwp) THEN
157         WRITE(numout,*) TRIM(cdtxt),' (min, max, sum, tag) : ',zmin, zmax, zsum, isums
158         CALL FLUSH(numout)
159      END IF
160      !
161   END SUBROUTINE debug3d
162
163END MODULE isfutils
Note: See TracBrowser for help on using the repository browser.