| 1 | MODULE icolmdz_mpipara |
|---|
| 2 | LOGICAL,SAVE :: using_oasis = .FALSE. |
|---|
| 3 | !$OMP THREADPRIVATE(using_oasis) |
|---|
| 4 | |
|---|
| 5 | CONTAINS |
|---|
| 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 | |
|---|
| 135 | END MODULE icolmdz_mpipara |
|---|