source: codes/icosagcm/trunk/src/mpipara.F90 @ 151

Last change on this file since 151 was 151, checked in by ymipsl, 11 years ago

Implementation of mixte parallelism MPI/OpenMP into src directory

YM

File size: 2.8 KB
Line 
1MODULE mpipara
2
3  INTEGER,SAVE :: mpi_rank
4  INTEGER,SAVE :: mpi_size
5 
6  INTEGER,SAVE :: comm_icosa
7  INTEGER,SAVE :: ierr
8  LOGICAL,SAVE :: using_mpi
9  LOGICAL,SAVE :: is_mpi_root
10 
11  INTERFACE allocate_mpi_buffer
12    MODULE PROCEDURE allocate_mpi_buffer_r2, allocate_mpi_buffer_r3,allocate_mpi_buffer_r4
13  END INTERFACE allocate_mpi_buffer
14
15CONTAINS
16
17  SUBROUTINE init_mpipara
18  USE mpi_mod
19  IMPLICIT NONE
20
21    using_mpi=.FALSE.
22#ifdef CPP_USING_MPI
23    using_mpi=.TRUE. 
24#endif
25   
26    IF (using_mpi) THEN
27      CALL MPI_INIT(ierr)
28      comm_icosa=MPI_COMM_WORLD
29      CALL MPI_COMM_SIZE(comm_icosa,mpi_size,ierr)
30      CALL MPI_COMM_RANK(comm_icosa,mpi_rank,ierr)
31      PRINT *, 'MPI Process ', mpi_rank, '/', mpi_size
32    ELSE
33      comm_icosa=-1
34      mpi_size=1
35      mpi_rank=0
36    ENDIF
37   
38    IF (mpi_rank==0) THEN
39      is_mpi_root=.TRUE.
40    ELSE
41      is_mpi_root=.FALSE.
42    ENDIF
43   
44  END SUBROUTINE  init_mpipara
45
46  SUBROUTINE finalize_mpipara
47  USE mpi_mod
48  IMPLICIT NONE
49   
50    IF (using_mpi) CALL MPI_FINALIZE(ierr)
51   
52   END SUBROUTINE  finalize_mpipara
53   
54
55  SUBROUTINE allocate_mpi_buffer_r2(buffer,length)
56  USE ISO_C_BINDING
57  USE mpi_mod
58  USE prec
59  IMPLICIT NONE
60    REAL(rstd), POINTER :: buffer(:)
61    INTEGER,INTENT(IN)  :: length
62
63    TYPE(C_PTR)         :: base_ptr
64    INTEGER(KIND=MPI_ADDRESS_KIND) :: size
65    INTEGER :: real_size,ierr
66   
67    CALL MPI_TYPE_EXTENT(MPI_REAL8, real_size, ierr)
68    size=length*real_size
69   
70    CALL MPI_ALLOC_MEM(size,MPI_INFO_NULL,base_ptr,ierr)
71    CALL C_F_POINTER(base_ptr, buffer, (/ length /))
72
73   END SUBROUTINE allocate_mpi_buffer_r2
74
75  SUBROUTINE allocate_mpi_buffer_r3(buffer,length,dim3)
76  USE ISO_C_BINDING
77  USE mpi_mod
78  USE prec
79    IMPLICIT NONE
80    REAL(rstd), POINTER :: buffer(:,:)
81    INTEGER,INTENT(IN)  :: length
82    INTEGER,INTENT(IN)  :: dim3
83
84    TYPE(C_PTR)         :: base_ptr
85    INTEGER(KIND=MPI_ADDRESS_KIND) :: size
86    INTEGER :: real_size,ierr
87   
88    CALL MPI_TYPE_EXTENT(MPI_REAL8, real_size, ierr)
89    size=length*real_size*dim3
90   
91    CALL MPI_ALLOC_MEM(size,MPI_INFO_NULL,base_ptr,ierr)
92    CALL C_F_POINTER(base_ptr, buffer, (/ length,dim3 /))
93   
94   END SUBROUTINE allocate_mpi_buffer_r3
95
96  SUBROUTINE allocate_mpi_buffer_r4(buffer,length,dim3,dim4)
97  USE ISO_C_BINDING
98  USE mpi_mod
99  USE prec
100  IMPLICIT NONE
101    REAL(rstd), POINTER :: buffer(:,:,:)
102    INTEGER,INTENT(IN)  :: length
103    INTEGER,INTENT(IN)  :: dim3
104    INTEGER,INTENT(IN)  :: dim4
105
106    TYPE(C_PTR)         :: base_ptr
107    INTEGER(KIND=MPI_ADDRESS_KIND) :: size
108    INTEGER :: real_size,ierr
109   
110    CALL MPI_TYPE_EXTENT(MPI_REAL8, real_size, ierr)
111    size=length*real_size*dim3*dim4
112   
113    CALL MPI_ALLOC_MEM(size,MPI_INFO_NULL,base_ptr,ierr)
114    CALL C_F_POINTER(base_ptr, buffer, (/ length, dim3, dim4 /))
115   
116   END SUBROUTINE allocate_mpi_buffer_r4
117   
118END MODULE mpipara
Note: See TracBrowser for help on using the repository browser.