source: codes/icosagcm/trunk/src/parallel/checksum.f90

Last change on this file was 1016, checked in by ymipsl, 4 years ago

Avoid circular dependancy when using checksum in geometry_mod

YM

File size: 4.0 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 mpi_mod
13  USE mpipara
14  USE field_mod
15  USE domain_mod
16  USE dimensions
17  IMPLICIT NONE
18    TYPE(t_field) :: field(:)
19
20    INTEGER :: intval(2)
21    INTEGER :: ind,i,j,ij,l,k
22    INTEGER :: tot_sum
23    INTEGER :: tot_sum_mpi(mpi_size)
24       
25
26!$OMP BARRIER
27!$OMP MASTER
28    tot_sum=0
29    DO ind=1,ndomain
30      CALL swap_dimensions(ind)
31       
32      IF (field(ind)%field_type==field_T) THEN
33
34        IF (field(ind)%ndim==2) THEN
35          DO j=jj_begin,jj_end
36             DO i=ii_begin,ii_end
37                ij=(j-1)*iim+i
38                IF (domain(ind)%own(i,j)) THEN
39                  intval=transfer(field(ind)%rval2d(ij),intval,2) 
40                  tot_sum=tot_sum+intval(1)+intval(2)
41                ENDIF
42             ENDDO
43          ENDDO
44     
45        ELSE IF (field(ind)%ndim==3) THEN
46         
47          DO l=1,size(field(ind)%rval3d,2)
48            DO j=jj_begin,jj_end
49               DO i=ii_begin,ii_end
50                  ij=(j-1)*iim+i
51                  IF (domain(ind)%own(i,j)) THEN
52                    intval=transfer(field(ind)%rval3d(ij,l),intval,2) 
53                    tot_sum=tot_sum+intval(1)+intval(2)
54                  ENDIF
55               ENDDO
56            ENDDO
57          ENDDO
58
59        ELSE IF (field(ind)%ndim==4) THEN
60         
61          DO k=1,size(field(ind)%rval4d,3)
62            DO l=1,size(field(ind)%rval4d,2)
63              DO j=jj_begin,jj_end
64                 DO i=ii_begin,ii_end
65                    ij=(j-1)*iim+i
66                    IF (domain(ind)%own(i,j)) THEN
67                      intval=transfer(field(ind)%rval4d(ij,l,k),intval,2) 
68                      tot_sum=tot_sum+intval(1)+intval(2)
69                    ENDIF
70                 ENDDO
71              ENDDO
72            ENDDO
73          ENDDO
74       
75        ENDIF
76
77      ELSE IF (field(ind)%field_type==field_U) THEN
78
79        IF (field(ind)%ndim==2) THEN
80          DO j=jj_begin,jj_end
81             DO i=ii_begin,ii_end-1
82                ij=(j-1)*iim+i
83                intval=transfer(field(ind)%rval2d(ij+u_right),intval,2) 
84                tot_sum=tot_sum+intval(1)+intval(2)
85             ENDDO
86          ENDDO
87
88          DO j=jj_begin,jj_end-1
89             DO i=ii_begin+1,ii_end
90                ij=(j-1)*iim+i
91                intval=transfer(field(ind)%rval2d(ij+u_lup),intval,2) 
92                tot_sum=tot_sum+intval(1)+intval(2)
93             ENDDO
94          ENDDO
95   
96          DO j=jj_begin+1,jj_end
97             DO i=ii_begin,ii_end
98                ij=(j-1)*iim+i
99                intval=transfer(field(ind)%rval2d(ij+u_ldown),intval,2) 
100                tot_sum=tot_sum+intval(1)+intval(2)
101             ENDDO
102          ENDDO
103
104        ELSE IF (field(ind)%ndim==3) THEN
105         
106          DO l=1,size(field(ind)%rval3d,2)
107          DO j=jj_begin,jj_end
108             DO i=ii_begin,ii_end-1
109                ij=(j-1)*iim+i
110                intval=transfer(field(ind)%rval3d(ij+u_right,l),intval,2) 
111                tot_sum=tot_sum+intval(1)+intval(2)
112             ENDDO
113          ENDDO
114
115          DO j=jj_begin,jj_end-1
116             DO i=ii_begin+1,ii_end
117                ij=(j-1)*iim+i
118                intval=transfer(field(ind)%rval3d(ij+u_lup,l),intval,2) 
119                tot_sum=tot_sum+intval(1)+intval(2)
120             ENDDO
121          ENDDO
122   
123          DO j=jj_begin+1,jj_end
124             DO i=ii_begin,ii_end
125                ij=(j-1)*iim+i
126                intval=transfer(field(ind)%rval3d(ij+u_ldown,l),intval,2) 
127                tot_sum=tot_sum+intval(1)+intval(2)
128             ENDDO
129          ENDDO
130          ENDDO
131
132       
133        ENDIF
134     ENDIF
135
136    ENDDO
137!$OMP END MASTER
138!$OMP BARRIER   
139   
140!$OMP MASTER
141    CALL MPI_Gather(tot_sum,1,MPI_INTEGER,tot_sum_mpi,1,MPI_INTEGER,0,comm_icosa,ierr)
142    IF (mpi_rank==0) PRINT*,"CheckSum Field : ",field(1)%name,sum(tot_sum_mpi), tot_sum_mpi
143   
144!$OMP END MASTER
145 
146 
147 
148  END SUBROUTINE checksum
149 
150END MODULE checksum_mod
151 
Note: See TracBrowser for help on using the repository browser.