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

Last change on this file since 5849 was 5849, checked in by quepas, 6 weeks ago

fix(gnu): initialize procedure pointers in a proper way, so that GNU/gfortran can compile ICOSA_LMDZ without an error.

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