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