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/r12377_ticket2386/src/OCE/ISF – NEMO

source: NEMO/branches/2020/r12377_ticket2386/src/OCE/ISF/isfutils.F90 @ 13540

Last change on this file since 13540 was 13540, checked in by andmirek, 4 years ago

Ticket #2386: update to latest trunk

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