source: ICOSA_LMDZ/src/phylmd/icolmdz_mpipara.F90 @ 5799

Last change on this file since 5799 was 5799, checked in by acaubel, 3 months ago

Missing MPI_Finalize when using XIOS3 and coupling.

  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 4.4 KB
Line 
1MODULE icolmdz_mpipara
2  LOGICAL,SAVE :: using_oasis = .FALSE.
3  !$OMP THREADPRIVATE(using_oasis)
4
5CONTAINS
6 
7  SUBROUTINE set_wrapper
8  USE mpipara, ONLY : set_plugin_wrapper, set_default_mpi_initialization
9  IMPLICIT NONE
10   
11    CALL set_default_mpi_initialization('plugin')
12    CALL set_plugin_wrapper(get_mpi_comm, finalize_mpi)
13
14  END SUBROUTINE set_wrapper
15
16  SUBROUTINE get_mpi_comm(comm_out)
17  USE xios
18  USE ioipsl, ONLY: getin
19  IMPLICIT NONE
20    INTEGER, INTENT(OUT) :: comm_out
21    INTEGER :: comm_in
22    CHARACTER(LEN=256) :: required_mode_str
23    INTEGER :: required_mode, mpi_threading_mode
24    INTEGER :: ierr
25    INCLUDE 'mpif.h'
26
27    using_oasis = .FALSE.
28    CALL getin('using_oasis', using_oasis)
29
30    IF (using_oasis) THEN
31
32      required_mode_str = 'funneled'
33      CALL getin('mpi_threading_mode', required_mode_str)
34
35      SELECT CASE (TRIM(required_mode_str))
36        CASE ('single')
37          required_mode = MPI_THREAD_SINGLE
38        CASE ('funneled')
39            required_mode = MPI_THREAD_FUNNELED
40        CASE ('serialized')
41            required_mode = MPI_THREAD_SERIALIZED
42        CASE ('multiple')
43            required_mode = MPI_THREAD_MULTIPLE
44        CASE DEFAULT
45            PRINT *, 'Bad selector for variable mpi_threading_mode  : <', TRIM(required_mode_str), &
46                  '>  => options are <single>, <funneled>, <serialized>, <multiple>'
47        STOP
48      END SELECT
49
50      IF (required_mode == MPI_THREAD_SERIALIZED .OR. required_mode == MPI_THREAD_MULTIPLE) THEN
51        PRINT *,"mpi_threading_mode /= 'single' .AND. mpi_threading_mode /= 'funneled'"
52        STOP
53      END IF
54
55      IF (required_mode == MPI_THREAD_SINGLE) PRINT *, 'MPI_INIT_THREAD : MPI_SINGLE_THREAD required'
56      IF (required_mode == MPI_THREAD_FUNNELED) PRINT *, 'MPI_INIT_THREAD : MPI_THREAD_FUNNELED required'
57      IF (required_mode == MPI_THREAD_SERIALIZED) PRINT *, 'MPI_INIT_THREAD : MPI_THREAD_SERIALIZED required'
58      IF (required_mode == MPI_THREAD_MULTIPLE) PRINT *, 'MPI_INIT_THREAD : MPI_THREAD_MULTIPLE required'
59
60      CALL MPI_INIT_THREAD(required_mode, mpi_threading_mode, ierr)
61
62      IF (mpi_threading_mode == MPI_THREAD_SINGLE) PRINT *, 'MPI_INIT_THREAD : MPI_SINGLE_THREAD provided'
63      IF (mpi_threading_mode == MPI_THREAD_FUNNELED) PRINT *, 'MPI_INIT_THREAD : MPI_THREAD_FUNNELED provided'
64      IF (mpi_threading_mode == MPI_THREAD_SERIALIZED) PRINT *, 'MPI_INIT_THREAD : MPI_THREAD_SERIALIZED provided'
65      IF (mpi_threading_mode == MPI_THREAD_MULTIPLE) PRINT *, 'MPI_INIT_THREAD : MPI_THREAD_MULTIPLE provided'
66
67      IF (mpi_threading_mode > required_mode) mpi_threading_mode = required_mode
68
69      IF (mpi_threading_mode == MPI_THREAD_SINGLE) THEN
70        PRINT *, 'MPI_INIT_THREAD : MPI_SINGLE_THREAD used : Warning : openMP is not garanted to work'
71      END IF
72      IF (mpi_threading_mode == MPI_THREAD_FUNNELED) PRINT *, 'MPI_INIT_THREAD : MPI_THREAD_FUNNELED used'
73      IF (mpi_threading_mode == MPI_THREAD_SERIALIZED) PRINT *, 'MPI_INIT_THREAD : MPI_THREAD_SERIALIZED used'
74      IF (mpi_threading_mode == MPI_THREAD_MULTIPLE) PRINT *, 'MPI_INIT_THREAD : MPI_THREAD_MULTIPLE used'
75    END IF
76
77#ifdef CPP_USING_XIOS3       
78    IF (using_oasis) THEN
79      CALL initialize_third_party_coupler( 'icosa', comm_in, ierr )
80      CALL xios_initialize("icosagcm", local_comm=comm_in, return_comm=comm_out)
81    ELSE
82      CALL xios_initialize("icosagcm", return_comm=comm_out)
83    ENDIF
84#else
85    CALL xios_initialize("icosagcm", return_comm=comm_out)
86#endif
87
88  END SUBROUTINE get_mpi_comm
89
90  SUBROUTINE finalize_mpi
91  USE xios
92  IMPLICIT NONE
93  INTEGER :: ierr
94
95    CALL xios_finalize
96#ifdef CPP_USING_XIOS3
97    IF (using_oasis) THEN
98       CALL finalize_third_party_coupler( ierr )
99       CALL MPI_FINALIZE(ierr)
100    ENDIF
101
102#endif
103
104  END SUBROUTINE finalize_mpi
105
106  SUBROUTINE initialize_third_party_coupler( comp_id, comm_icosa, ierr )
107  USE icolmdz_oasis
108  IMPLICIT NONE
109     CHARACTER(len=*), INTENT(IN) :: comp_id
110     INTEGER, INTENT(OUT) :: comm_icosa
111     INTEGER, INTENT(OUT) :: ierr
112   
113     INTEGER :: ncomp_id
114     CALL oasis_init_comp ( ncomp_id, comp_id, ierr )
115     CALL oasis_get_localcomm ( comm_icosa, ierr )
116 
117  END SUBROUTINE initialize_third_party_coupler
118 
119 
120  SUBROUTINE finalize_third_party_coupler( ierr )
121     USE icolmdz_oasis
122     IMPLICIT NONE
123     INTEGER, INTENT(OUT) :: ierr
124   
125     PRINT*, "FINALIZING THROUGH WRAPPER"
126     CALL oasis_terminate( ierr )
127  END SUBROUTINE finalize_third_party_coupler
128
129END MODULE icolmdz_mpipara
Note: See TracBrowser for help on using the repository browser.