source: branches/publications/ORCHIDEE_gmd-2018-57/src_parallel/mod_orchidee_para.F90

Last change on this file was 4260, checked in by jan.polcher, 7 years ago

Corrections to the model to allow common usage of OASIS and XIOS. A number of bugs have been corrected which also affect the Trunk. This will be documents in corresponding tickets.

File size: 6.4 KB
Line 
1! Initialization of parallel for MPI and OpenMP.
2
3!-
4!- $Header: /home/ssipsl/CVSREP/ORCHIDEE/src_parallel/Attic/mod_orchidee_para.F90,v 1.1.2.4 2008/11/05 10:14:05 ssipsl Exp $
5!-
6
7MODULE mod_orchidee_para
8
9  USE mod_orchidee_para_var
10  USE mod_orchidee_mpi_data
11  USE mod_orchidee_omp_data
12  USE mod_orchidee_transfert_para
13   
14CONTAINS
15   
16  SUBROUTINE Init_orchidee_para(communicator, usexios)
17    IMPLICIT NONE
18    INTEGER,OPTIONAL,INTENT(in) :: communicator
19    LOGICAL,OPTIONAL,INTENT(in) :: usexios
20
21#ifdef CPP_PARA
22    INCLUDE 'mpif.h'
23#endif
24   
25    CALL Init_orchidee_omp
26
27
28    IF ( PRESENT(communicator) .AND. PRESENT(usexios) ) THEN
29       CALL Init_orchidee_mpi(communicator, usexios)
30    ELSE IF ( PRESENT(communicator) ) THEN
31       CALL Init_orchidee_mpi(communicator)
32    ELSE IF ( PRESENT(usexios) ) THEN
33       CALL Init_orchidee_mpi(MPI_COMM_WORLD, usexios)
34    ELSE
35       CALL Init_orchidee_mpi
36    ENDIF
37
38
39    IF (is_mpi_root .AND. is_omp_root) THEN
40       is_root_prc=.TRUE.
41    ELSE
42       is_root_prc=.FALSE.
43    ENDIF
44  END SUBROUTINE Init_orchidee_para
45   
46 
47  SUBROUTINE Init_orchidee_data_para_driver(nbp,kindex_glo)
48
49    IMPLICIT NONE
50    INTEGER,INTENT(IN) :: nbp
51    INTEGER,INTENT(IN) :: kindex_glo(nbp)
52     
53    INTEGER :: first_point
54    INTEGER :: last_point
55    INTEGER :: nbp_loc
56    INTEGER :: nbp_loc_para(0:mpi_size-1)
57    INTEGER,ALLOCATABLE :: kindex_loc(:)
58    INTEGER :: offset
59    INTEGER :: i
60   
61     
62    last_point=0
63   
64    CALL read_load_balance(nbp,nbp_loc_para)   
65   
66    DO i=0,mpi_rank
67       nbp_loc=nbp_loc_para(i)
68       First_point=last_point+1
69       Last_point=last_point+nbp_loc
70    ENDDO
71   
72    ALLOCATE(kindex_loc(nbp_loc))
73    DO i=1,nbp_loc
74       kindex_loc(i)=kindex_glo(i+First_Point-1)
75    ENDDO
76   
77    IF (mpi_rank==0) THEN
78       offset=0
79    ELSE
80       offset=kindex_glo(First_point-1)-MOD(kindex_glo(First_point-1),iim_g)
81    ENDIF
82
83    kindex_loc(:)=kindex_loc(:)-offset
84
85    CALL Init_orchidee_data_para(nbp_loc,kindex_loc,offset,omp_size,omp_rank,MPI_COMM_ORCH)
86    CALL Set_stdout_file('out_orchidee')
87    CALL ipslnlf(new_number=numout)
88    !   
89  END SUBROUTINE Init_orchidee_data_para_driver
90   
91 
92  SUBROUTINE Init_orchidee_data_para(nbp,kindex,arg_offset,arg_omp_size,arg_omp_rank,COMM)
93
94    IMPLICIT NONE
95    INTEGER,INTENT(IN)     :: nbp
96    INTEGER,INTENT(IN)     :: kindex(nbp)
97    INTEGER,INTENT(IN)     :: arg_offset
98    INTEGER,INTENT(IN)     :: arg_omp_size
99    INTEGER,INTENT(IN)     :: arg_omp_rank
100    INTEGER,INTENT(IN)     :: COMM
101   
102    INTEGER,SAVE              :: arg_nbp_mpi
103    INTEGER,ALLOCATABLE,SAVE  :: kindex_mpi(:)
104   
105    offset=arg_offset 
106    CALL init_orchidee_omp_data(arg_omp_size,arg_omp_rank,nbp,offset)
107   
108    IF (is_omp_root) THEN
109       arg_nbp_mpi=SUM(nbp_omp_para_nb(:))
110       ALLOCATE(kindex_mpi(arg_nbp_mpi))
111    ENDIF
112
113    CALL barrier2_omp()
114    kindex_mpi(nbp_omp_begin:nbp_omp_end)=kindex(:)+offset
115    CALL barrier2_omp()
116     
117    IF (is_omp_root) THEN     
118       kindex_mpi(:)=kindex_mpi(:)-offset
119       CALL init_orchidee_mpi_data(arg_nbp_mpi,kindex_mpi,offset,COMM)
120       nbp_glo=SUM(nbp_mpi_para(:))
121    ENDIF
122    CALL barrier2_omp()
123
124    nbp_loc=nbp
125   
126    IF (is_mpi_root .AND. is_omp_root) THEN
127       is_root_prc=.TRUE.
128    ELSE
129       is_root_prc=.FALSE.
130    ENDIF
131   
132    CALL Test_orchidee_para
133
134  END SUBROUTINE Init_orchidee_data_para
135   
136  SUBROUTINE Set_stdout_file(filename)
137
138    IMPLICIT NONE
139
140    CHARACTER(len=*), INTENT(IN) :: filename
141    CHARACTER(len=255) :: fileout
142    CHARACTER(len=4)  :: num_mpi
143    CHARACTER(len=4)  :: num_omp
144    INTEGER,PARAMETER :: base_numout=100
145    INTEGER           :: ierr
146
147    IF (is_ok_mpi) THEN
148       WRITE(num_mpi,'(I4.4)') mpi_rank
149    ENDIF
150   
151    IF (is_ok_omp) THEN
152       WRITE(num_omp,'(I4.4)') omp_rank
153    ENDIF
154   
155     
156    IF (is_ok_mpi .AND. is_ok_omp) THEN
157       fileout=TRIM(filename)//'_'//num_mpi//'.'//num_omp
158       numout=base_numout+omp_rank
159    ELSE IF (is_ok_mpi .AND. (.NOT. is_ok_omp)) THEN
160       fileout=TRIM(filename)//'_'//num_mpi
161       numout=base_numout
162    ELSE IF ((.NOT. is_ok_mpi) .AND. is_ok_omp) THEN
163       fileout=TRIM(filename)//'_'//num_omp
164       numout=base_numout+omp_rank
165    ELSE
166       fileout=TRIM(filename)
167       numout=base_numout
168    ENDIF
169!$OMP CRITICAL 
170    WRITE(*,*) "Set_stdout_file (rank ",mpi_rank,omp_rank,"), id output :",numout
171!$OMP END CRITICAL
172   
173    OPEN(UNIT=numout,FILE=TRIM(fileout),ACTION='write',STATUS='unknown',FORM='formatted',IOSTAT=ierr) 
174    IF (ierr /= 0) THEN
175#ifdef CPP_PARA
176       CALL MPI_FINALIZE(ierr)
177#endif
178       WRITE(*,*) "In Set_stdout_file : Erreur can't open file ", filename
179       STOP 1
180    ENDIF
181 
182!$OMP CRITICAL 
183    WRITE(numout,*) "Set_stdout_file (rank ",mpi_rank,omp_rank,"), id output :",numout
184!$OMP END CRITICAL
185
186    CALL Init_numout_omp(numout)
187
188  END SUBROUTINE Set_stdout_file
189     
190     
191  SUBROUTINE Test_orchidee_para
192
193    IMPLICIT NONE
194
195    INTEGER,PARAMETER :: dimsize=3
196    REAL :: Array(nbp_loc,dimsize)
197    REAL :: Array_glo(nbp_glo,dimsize)
198    REAL :: Array_glo_tmp(nbp_glo,dimsize)
199    REAL :: Array2D_loc(iim_g,jj_nb)
200    REAL :: Array2D_glo(iim_g,jjm_g)
201    REAL :: sum1,sum2,sum3
202   
203    INTEGER :: i,j
204   
205    DO j=1,dimsize
206       DO i=1,nbp_loc
207          Array(i,j)=10*j+omp_rank+i*1000
208       ENDDO
209    ENDDO
210     
211    CALL gather(Array,Array_glo)
212    CALL bcast(Array_glo)
213    CALL scatter(Array_glo,array)
214    CALL gather(array,array_glo_tmp)
215    CALL bcast(array_glo_tmp)   
216    WRITE(*,*) "1) Test parallelism (rank ",mpi_rank,omp_rank,"), Sould be 0 :",SUM(array_glo-array_glo_tmp)
217
218    sum1=SUM(array)
219    CALL reduce_sum(sum1,sum2)
220    CALL bcast(sum2)
221    sum3=SUM(array_glo)
222    WRITE(*,*) "2) Test parallelism (rank ",mpi_rank,omp_rank,"), Sould be 0 :",sum3-sum2
223   
224    IF (is_omp_root) THEN
225       DO j=1,jjm_g
226          DO i=1,iim_g
227             Array2D_glo(i,j)=(j-1)*iim_g+i
228          ENDDO
229       ENDDO
230       
231       array2D_loc(:,:)=0
232       CALL scatter2D_mpi(array2D_glo,array2D_loc)
233       array2D_glo(:,:)=0
234       CALL gather2D_mpi(array2D_loc,array2D_glo)
235       CALL bcast_mpi(array2D_glo)
236       sum1=SUM(array2D_glo)
237       sum2=SUM(array2D_loc)
238       CALL reduce_sum_mpi(sum2,sum3)
239       CALL bcast_mpi(sum3)
240       
241       WRITE(*,*) "3) Test parallelism (rank ",mpi_rank,omp_rank,"), Sould be 0 :",sum3-sum1
242    ENDIF
243    CALL barrier2_omp()
244
245  END SUBROUTINE  Test_orchidee_para
246 
247END MODULE mod_orchidee_para
Note: See TracBrowser for help on using the repository browser.