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

Last change on this file since 352 was 327, checked in by ymipsl, 9 years ago

Merge recent developments from saturn branch onto trunk.

  • lmdz generic physics interface
  • performance improvment on mix mpi/openmp
  • asynchrone and overlaping communication
  • best domain distribution between process and threads
  • ....

This version is compatible with the actual saturn version and the both branches are considered merged on dynamico component.

YM

File size: 1.9 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), POINTER :: field(:)
15    INTEGER :: intval(2)
16    INTEGER :: ind,i,j,ij,l,k
17    INTEGER :: tot_sum
18       
19
20!$OMP BARRIER
21!$OMP MASTER
22    tot_sum=0
23    DO ind=1,ndomain
24      CALL swap_dimensions(ind)
25      CALL swap_geometry(ind)
26       
27      IF (field(ind)%ndim==2) THEN
28        DO j=jj_begin,jj_end
29           DO i=ii_begin,ii_end
30              ij=(j-1)*iim+i
31              IF (domain(ind)%own(i,j)) THEN
32                intval=transfer(field(ind)%rval2d(ij),intval,2) 
33                tot_sum=tot_sum+intval(1)+intval(2)
34              ENDIF
35           ENDDO
36        ENDDO
37   
38      ELSE IF (field(ind)%ndim==3) THEN
39       
40        DO l=1,size(field(ind)%rval3d,2)
41          DO j=jj_begin,jj_end
42             DO i=ii_begin,ii_end
43                ij=(j-1)*iim+i
44                IF (domain(ind)%own(i,j)) THEN
45                  intval=transfer(field(ind)%rval3d(ij,l),intval,2) 
46                  tot_sum=tot_sum+intval(1)+intval(2)
47                ENDIF
48             ENDDO
49          ENDDO
50        ENDDO
51
52      ELSE IF (field(ind)%ndim==4) THEN
53       
54        DO k=1,size(field(ind)%rval4d,3)
55          DO l=1,size(field(ind)%rval4d,2)
56            DO j=jj_begin,jj_end
57               DO i=ii_begin,ii_end
58                  ij=(j-1)*iim+i
59                  IF (domain(ind)%own(i,j)) THEN
60                    intval=transfer(field(ind)%rval4d(ij,l,k),intval,2) 
61                    tot_sum=tot_sum+intval(1)+intval(2)
62                  ENDIF
63               ENDDO
64            ENDDO
65          ENDDO
66        ENDDO
67     
68      ENDIF
69    ENDDO
70!$OMP END MASTER
71!$OMP BARRIER   
72   
73!$OMP MASTER
74    PRINT*,"CheckSum Field : ",field(1)%name,tot_sum
75!$OMP END MASTER
76 
77 
78 
79  END SUBROUTINE checksum
80 
81END MODULE checksum_mod
82 
Note: See TracBrowser for help on using the repository browser.