Ignore:
Timestamp:
05/13/13 14:30:31 (11 years ago)
Author:
ymipsl
Message:

Implementation of mixte parallelism MPI/OpenMP into src directory

YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/trunk/src/mpipara.F90

    r118 r151  
    88  LOGICAL,SAVE :: using_mpi 
    99  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 
    1014 
    1115CONTAINS 
     
    4852   END SUBROUTINE  finalize_mpipara 
    4953    
     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 
    50117    
    51118END MODULE mpipara 
Note: See TracChangeset for help on using the changeset viewer.