source: codes/icosagcm/devel/src/parallel/checksum.f90 @ 603

Last change on this file since 603 was 533, checked in by dubos, 7 years ago

devel : reorganization of source tree

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