source: codes/icosagcm/trunk/src/checksum.f90 @ 483

Last change on this file since 483 was 477, checked in by ymipsl, 8 years ago

Checksum : manage field of type : field_U

YM

File size: 3.8 KB
Line 
1MODULE checksum_mod
2
3
4! simple function to perform checksum on T field
5! works only on 1 process
6! usefull to check openMP synchronisation problem
7! need to be enhanced...
8
9CONTAINS
10
11  SUBROUTINE checksum(field)
12  USE icosa
13  IMPLICIT NONE
14    TYPE(t_field) :: field(:)
15
16    INTEGER :: intval(2)
17    INTEGER :: ind,i,j,ij,l,k
18    INTEGER :: tot_sum
19       
20
21!$OMP BARRIER
22!$OMP MASTER
23    tot_sum=0
24    DO ind=1,ndomain
25      CALL swap_dimensions(ind)
26      CALL swap_geometry(ind)
27       
28      IF (field(ind)%field_type==field_T) THEN
29
30        IF (field(ind)%ndim==2) THEN
31          DO j=jj_begin,jj_end
32             DO i=ii_begin,ii_end
33                ij=(j-1)*iim+i
34                IF (domain(ind)%own(i,j)) THEN
35                  intval=transfer(field(ind)%rval2d(ij),intval,2) 
36                  tot_sum=tot_sum+intval(1)+intval(2)
37                ENDIF
38             ENDDO
39          ENDDO
40     
41        ELSE IF (field(ind)%ndim==3) THEN
42         
43          DO l=1,size(field(ind)%rval3d,2)
44            DO j=jj_begin,jj_end
45               DO i=ii_begin,ii_end
46                  ij=(j-1)*iim+i
47                  IF (domain(ind)%own(i,j)) THEN
48                    intval=transfer(field(ind)%rval3d(ij,l),intval,2) 
49                    tot_sum=tot_sum+intval(1)+intval(2)
50                  ENDIF
51               ENDDO
52            ENDDO
53          ENDDO
54
55        ELSE IF (field(ind)%ndim==4) THEN
56         
57          DO k=1,size(field(ind)%rval4d,3)
58            DO l=1,size(field(ind)%rval4d,2)
59              DO j=jj_begin,jj_end
60                 DO i=ii_begin,ii_end
61                    ij=(j-1)*iim+i
62                    IF (domain(ind)%own(i,j)) THEN
63                      intval=transfer(field(ind)%rval4d(ij,l,k),intval,2) 
64                      tot_sum=tot_sum+intval(1)+intval(2)
65                    ENDIF
66                 ENDDO
67              ENDDO
68            ENDDO
69          ENDDO
70       
71        ENDIF
72
73      ELSE IF (field(ind)%field_type==field_U) THEN
74
75        IF (field(ind)%ndim==2) THEN
76          DO j=jj_begin,jj_end
77             DO i=ii_begin,ii_end-1
78                ij=(j-1)*iim+i
79                intval=transfer(field(ind)%rval2d(ij+u_right),intval,2) 
80                tot_sum=tot_sum+intval(1)+intval(2)
81             ENDDO
82          ENDDO
83
84          DO j=jj_begin,jj_end-1
85             DO i=ii_begin+1,ii_end
86                ij=(j-1)*iim+i
87                intval=transfer(field(ind)%rval2d(ij+u_lup),intval,2) 
88                tot_sum=tot_sum+intval(1)+intval(2)
89             ENDDO
90          ENDDO
91   
92          DO j=jj_begin+1,jj_end
93             DO i=ii_begin,ii_end
94                ij=(j-1)*iim+i
95                intval=transfer(field(ind)%rval2d(ij+u_ldown),intval,2) 
96                tot_sum=tot_sum+intval(1)+intval(2)
97             ENDDO
98          ENDDO
99
100        ELSE IF (field(ind)%ndim==3) THEN
101         
102          DO l=1,size(field(ind)%rval3d,2)
103          DO j=jj_begin,jj_end
104             DO i=ii_begin,ii_end-1
105                ij=(j-1)*iim+i
106                intval=transfer(field(ind)%rval3d(ij+u_right,l),intval,2) 
107                tot_sum=tot_sum+intval(1)+intval(2)
108             ENDDO
109          ENDDO
110
111          DO j=jj_begin,jj_end-1
112             DO i=ii_begin+1,ii_end
113                ij=(j-1)*iim+i
114                intval=transfer(field(ind)%rval3d(ij+u_lup,l),intval,2) 
115                tot_sum=tot_sum+intval(1)+intval(2)
116             ENDDO
117          ENDDO
118   
119          DO j=jj_begin+1,jj_end
120             DO i=ii_begin,ii_end
121                ij=(j-1)*iim+i
122                intval=transfer(field(ind)%rval3d(ij+u_ldown,l),intval,2) 
123                tot_sum=tot_sum+intval(1)+intval(2)
124             ENDDO
125          ENDDO
126          ENDDO
127
128       
129        ENDIF
130     ENDIF
131
132    ENDDO
133!$OMP END MASTER
134!$OMP BARRIER   
135   
136!$OMP MASTER
137    PRINT*,"CheckSum Field : ",field(1)%name,tot_sum
138!$OMP END MASTER
139 
140 
141 
142  END SUBROUTINE checksum
143 
144END MODULE checksum_mod
145 
Note: See TracBrowser for help on using the repository browser.