Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
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
USE dom_oce , ONLY: narea, tmask_h, tmask_i ! local domain
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