| 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 |
|---|
| 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 | |
|---|
| 129 | END MODULE icolmdz_mpipara |
|---|