source: LMDZ6/branches/LMDZISOdevSN/libf/phy_common/lmdz_checksum.f90

Last change on this file was 6114, checked in by Sebastien Nguyen, 3 weeks ago

-10 routines avant test post pbl_surface

File size: 6.2 KB
Line 
1MODULE lmdz_checksum
2  PRIVATE
3  INTERFACE checksum
4    MODULE PROCEDURE checksum_r0, checksum_r1, checksum_r2, checksum_r3, &
5                     checksum_i0, checksum_i1, checksum_i2, checksum_i3, &
6                     checksum_l0, checksum_l1, checksum_l2, checksum_l3
7  END INTERFACE
8 
9  PUBLIC checksum
10 
11CONTAINS
12
13  SUBROUTINE checksum_r0(name, field)
14  IMPLICIT NONE
15    CHARACTER(LEN=*),INTENT(IN) :: name
16    REAL,INTENT(IN)             :: field
17    INTEGER :: intval(2)
18    INTEGER :: tot_sum
19    INTEGER :: i
20   
21    tot_sum=0   
22    intval=transfer(field,intval,2)
23    tot_sum = tot_sum + intval(1) + intval(2)
24 
25    CALL print_checksum(name,tot_sum)
26  END SUBROUTINE checksum_r0
27 
28  SUBROUTINE checksum_r1(name, field)
29  IMPLICIT NONE
30    CHARACTER(LEN=*),INTENT(IN) :: name
31    REAL,INTENT(IN)             :: field(:)
32    INTEGER :: intval(2)
33    INTEGER :: tot_sum
34    INTEGER :: i
35   
36    tot_sum=0   
37    DO i=1,SIZE(field,1)
38      intval=transfer(field(i),intval,2)
39      tot_sum = tot_sum + intval(1) + intval(2)
40    ENDDO 
41 
42    CALL print_checksum(name,tot_sum)
43  END SUBROUTINE checksum_r1
44 
45  SUBROUTINE checksum_r2(name, field)
46  IMPLICIT NONE
47    CHARACTER(LEN=*),INTENT(IN) :: name
48    REAL,INTENT(IN)             :: field(:,:)
49    INTEGER :: intval(2)
50    INTEGER :: tot_sum
51    INTEGER :: i,j
52   
53    tot_sum=0   
54    DO j=1,SIZE(field,2)
55      DO i=1,SIZE(field,1)
56        intval=transfer(field(i,j),intval,2)
57        tot_sum = tot_sum + intval(1) + intval(2)
58      ENDDO
59    ENDDO 
60 
61    CALL print_checksum(name,tot_sum)
62  END SUBROUTINE checksum_r2
63
64  SUBROUTINE checksum_r3(name, field)
65  IMPLICIT NONE
66    CHARACTER(LEN=*),INTENT(IN) :: name
67    REAL,INTENT(IN)             :: field(:,:,:)
68    INTEGER :: intval(2)
69    INTEGER :: tot_sum
70    INTEGER :: i,j,k
71   
72    tot_sum=0   
73    DO k=1,SIZE(field,3)
74      DO j=1,SIZE(field,2)
75        DO i=1,SIZE(field,1)
76          intval=transfer(field(i,j,k),intval,2)
77          tot_sum = tot_sum + intval(1) + intval(2)
78        ENDDO
79      ENDDO 
80    ENDDO
81    CALL print_checksum(name,tot_sum)
82  END SUBROUTINE checksum_r3
83 
84 
85 
86   SUBROUTINE checksum_i0(name, field)
87  IMPLICIT NONE
88    CHARACTER(LEN=*),INTENT(IN) :: name
89    LOGICAL,INTENT(IN)             :: field
90    INTEGER :: intval(2)
91    INTEGER :: tot_sum
92    INTEGER :: i
93   
94    tot_sum=0
95    intval(1)=0
96    IF (field) intval(1)=1 
97    intval(2)=0
98    tot_sum = tot_sum + intval(1) + intval(2)
99 
100    CALL print_checksum(name,tot_sum)
101  END SUBROUTINE checksum_i0
102 
103  SUBROUTINE checksum_i1(name, field)
104  IMPLICIT NONE
105    CHARACTER(LEN=*),INTENT(IN) :: name
106    LOGICAL,INTENT(IN)             :: field(:)
107    INTEGER :: intval(2)
108    INTEGER :: tot_sum
109    INTEGER :: i
110   
111    tot_sum=0   
112    DO i=1,SIZE(field,1)
113      intval(1)=0
114      IF (field(i)) intval(1)=1 
115      tot_sum = tot_sum + intval(1) + intval(2)
116    ENDDO 
117 
118    CALL print_checksum(name,tot_sum)
119  END SUBROUTINE checksum_i1
120 
121  SUBROUTINE checksum_i2(name, field)
122  IMPLICIT NONE
123    CHARACTER(LEN=*),INTENT(IN) :: name
124    LOGICAL,INTENT(IN)             :: field(:,:)
125    INTEGER :: intval(2)
126    INTEGER :: tot_sum
127    INTEGER :: i,j
128   
129    tot_sum=0   
130    DO j=1,SIZE(field,2)
131      DO i=1,SIZE(field,1)
132        intval(1)=0
133        IF (field(i,j)) intval(1)=1 
134        intval(2)=0
135        tot_sum = tot_sum + intval(1) + intval(2)
136      ENDDO
137    ENDDO 
138 
139    CALL print_checksum(name,tot_sum)
140  END SUBROUTINE checksum_i2
141
142  SUBROUTINE checksum_i3(name, field)
143  IMPLICIT NONE
144    CHARACTER(LEN=*),INTENT(IN) :: name
145    LOGICAL,INTENT(IN)             :: field(:,:,:)
146    INTEGER :: intval(2)
147    INTEGER :: tot_sum
148    INTEGER :: i,j,k
149   
150    tot_sum=0   
151    DO k=1,SIZE(field,3)
152      DO j=1,SIZE(field,2)
153        DO i=1,SIZE(field,1)
154          intval(1)=0
155          IF (field(i,j,k)) intval(1)=1 
156          intval(2)=0
157          tot_sum = tot_sum + intval(1) + intval(2)
158        ENDDO
159      ENDDO 
160    ENDDO
161    CALL print_checksum(name,tot_sum)
162  END SUBROUTINE checksum_i3
163 
164 
165 
166  SUBROUTINE checksum_l0(name, field)
167  IMPLICIT NONE
168    CHARACTER(LEN=*),INTENT(IN) :: name
169    INTEGER,INTENT(IN)             :: field
170    INTEGER :: intval(2)
171    INTEGER :: tot_sum
172    INTEGER :: i
173   
174    tot_sum=0   
175    intval(1)=field
176    intval(2)=0
177    tot_sum = tot_sum + intval(1) + intval(2)
178 
179    CALL print_checksum(name,tot_sum)
180  END SUBROUTINE checksum_l0
181 
182  SUBROUTINE checksum_l1(name, field)
183  IMPLICIT NONE
184    CHARACTER(LEN=*),INTENT(IN) :: name
185    INTEGER,INTENT(IN)             :: field(:)
186    INTEGER :: intval(2)
187    INTEGER :: tot_sum
188    INTEGER :: i
189   
190    tot_sum=0   
191    DO i=1,SIZE(field,1)
192      intval(1)=field(i)
193      intval(2)=0
194      tot_sum = tot_sum + intval(1) + intval(2)
195    ENDDO 
196 
197    CALL print_checksum(name,tot_sum)
198  END SUBROUTINE checksum_l1
199 
200  SUBROUTINE checksum_l2(name, field)
201  IMPLICIT NONE
202    CHARACTER(LEN=*),INTENT(IN) :: name
203    INTEGER,INTENT(IN)             :: field(:,:)
204    INTEGER :: intval(2)
205    INTEGER :: tot_sum
206    INTEGER :: i,j
207   
208    tot_sum=0   
209    DO j=1,SIZE(field,2)
210      DO i=1,SIZE(field,1)
211        intval(1)=field(i,j)
212        intval(2)=0
213        tot_sum = tot_sum + intval(1) + intval(2)
214      ENDDO
215    ENDDO 
216 
217    CALL print_checksum(name,tot_sum)
218  END SUBROUTINE checksum_l2
219
220  SUBROUTINE checksum_l3(name, field)
221  IMPLICIT NONE
222    CHARACTER(LEN=*),INTENT(IN) :: name
223    INTEGER,INTENT(IN)             :: field(:,:,:)
224    INTEGER :: intval(2)
225    INTEGER :: tot_sum
226    INTEGER :: i,j,k
227   
228    tot_sum=0   
229    DO k=1,SIZE(field,3)
230      DO j=1,SIZE(field,2)
231        DO i=1,SIZE(field,1)
232          intval(1)=field(i,j,k)
233          intval(2)=0
234          tot_sum = tot_sum + intval(1) + intval(2)
235        ENDDO
236      ENDDO 
237    ENDDO
238    CALL print_checksum(name,tot_sum)
239  END SUBROUTINE checksum_l3
240 
241     
242  SUBROUTINE print_checksum(name, tot_sum)
243  USE mod_phys_lmdz_para, ONLY : reduce_sum, is_master
244  USE print_control_mod, ONLY: lunout
245  IMPLICIT NONE
246    CHARACTER(LEN=*),INTENT(IN) :: name
247    INTEGER, INTENT(IN) :: tot_sum
248    INTEGER             :: tot_sum_glo
249   
250    CALL reduce_sum(tot_sum, tot_sum_glo)
251     
252    IF (is_master) WRITE(lunout,*) "CHECKSUM : ",TRIM(ADJUSTL(name)), " ==> ",tot_sum_glo
253  END SUBROUTINE print_checksum
254END MODULE lmdz_checksum
Note: See TracBrowser for help on using the repository browser.