Ignore:
Timestamp:
01/09/14 09:56:11 (11 years ago)
Author:
ymipsl
Message:

Add new openMP parallelism based on distribution of domains on threads. There is no more limitation of number of threads by MPI process.

YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/trunk/src/geometry.f90

    r155 r186  
    2525  END TYPE t_geometry     
    2626 
    27   TYPE(t_geometry),TARGET :: geom 
     27  TYPE(t_geometry),SAVE,TARGET :: geom 
     28 
    2829   
    2930  REAL(rstd),POINTER :: Ai(:)          ! area of a cell 
     31!$OMP THREADPRIVATE(Ai) 
    3032  REAL(rstd),POINTER :: xyz_i(:,:)     ! coordinate of the center of the cell (voronoi) 
     33!$OMP THREADPRIVATE(xyz_i) 
    3134  REAL(rstd),POINTER :: centroid(:,:)  ! coordinate of the centroid of the cell 
     35!$OMP THREADPRIVATE(centroid) 
    3236  REAL(rstd),POINTER :: xyz_e(:,:)     ! coordinate of a wind point on the cell on a edge 
     37!$OMP THREADPRIVATE(xyz_e) 
    3338  REAL(rstd),POINTER :: ep_e(:,:)      ! perpendicular unit vector of a edge (outsider) 
     39!$OMP THREADPRIVATE(ep_e) 
    3440  REAL(rstd),POINTER :: et_e(:,:)      ! tangeantial unit vector of a edge 
     41!$OMP THREADPRIVATE(et_e) 
    3542  REAL(rstd),POINTER :: elon_i(:,:)    ! unit longitude vector on the center  
     43!$OMP THREADPRIVATE(elon_i) 
    3644  REAL(rstd),POINTER :: elat_i(:,:)    ! unit latitude vector on the center  
     45!$OMP THREADPRIVATE(elat_i) 
    3746  REAL(rstd),POINTER :: elon_e(:,:)    ! unit longitude vector on a wind point  
     47!$OMP THREADPRIVATE(elon_e) 
    3848  REAL(rstd),POINTER :: elat_e(:,:)    ! unit latitude vector on a wind point 
     49!$OMP THREADPRIVATE(elat_e) 
    3950  REAL(rstd),POINTER :: xyz_v(:,:)     ! coordinate of a vertex (center of the dual mesh) 
     51!$OMP THREADPRIVATE(xyz_v) 
    4052  REAL(rstd),POINTER :: Av(:)          ! area of dual mesk cell 
     53!$OMP THREADPRIVATE(Av) 
    4154  REAL(rstd),POINTER :: de(:)          ! distance from a neighbour == lenght of an edge of the dual mesh 
     55!$OMP THREADPRIVATE(de) 
    4256  REAL(rstd),POINTER :: le(:)          ! lenght of a edge 
     57!$OMP THREADPRIVATE(le) 
    4358  REAL(rstd),POINTER :: Riv(:,:)       ! weight 
     59!$OMP THREADPRIVATE(Riv) 
    4460  REAL(rstd),POINTER :: Riv2(:,:)      ! weight 
     61!$OMP THREADPRIVATE(Riv2) 
    4562  INTEGER,POINTER    :: ne(:,:)        ! convention for the way on the normal wind on an edge  
     63!$OMP THREADPRIVATE(ne) 
    4664  REAL(rstd),POINTER :: Wee(:,:,:)     ! weight 
     65!$OMP THREADPRIVATE(Wee) 
    4766  REAL(rstd),POINTER :: bi(:)          ! orographie 
     67!$OMP THREADPRIVATE(bi) 
    4868  REAL(rstd),POINTER :: fv(:)          ! coriolis (evaluted on a vertex) 
     69!$OMP THREADPRIVATE(fv) 
    4970      
    5071 
     
    91112  IMPLICIT NONE 
    92113    INTEGER,INTENT(IN) :: ind 
    93 !$OMP MASTER 
     114!!$OMP MASTER 
    94115    Ai=geom%Ai(ind) 
    95116    xyz_i=geom%xyz_i(ind) 
     
    112133    bi=geom%bi(ind) 
    113134    fv=geom%fv(ind) 
    114 !$OMP END MASTER 
    115 !$OMP BARRIER     
     135!!$OMP END MASTER 
     136!!$OMP BARRIER     
    116137  END SUBROUTINE swap_geometry 
    117138 
     
    127148    REAL(rstd) :: vect(3,6) 
    128149    REAL(rstd) :: centr(3) 
    129  
    130150    INTEGER :: ind,i,j,n,k 
    131  
    132     CALL transfert_request(geom%xyz_i,req_i1) 
     151    TYPE(t_message),SAVE :: message 
     152    LOGICAL, SAVE :: first=.TRUE. 
     153!$OMP THREADPRIVATE(first)     
     154     
     155    IF (first) THEN 
     156      CALL init_message(geom%xyz_i, req_i1 ,message) 
     157      first=.FALSE. 
     158    ENDIF 
     159     
     160    CALL transfert_message(geom%xyz_i,message) 
     161         
     162     
     163!    CALL transfert_request(geom%xyz_i,req_i1) 
    133164 
    134165    DO ind=1,ndomain 
     166      IF (.NOT. assigned_domain(ind)) CYCLE 
    135167      CALL swap_dimensions(ind) 
    136168      CALL swap_geometry(ind) 
     
    157189  USE transfert_mod 
    158190  USE vector 
    159   USE ioipsl 
     191  USE getin_mod 
    160192  IMPLICIT NONE 
    161193    INTEGER :: nb_it=0 
     
    172204     
    173205    DO ind=1,ndomain 
     206      IF (.NOT. assigned_domain(ind)) CYCLE 
    174207      d=>domain(ind) 
    175208      CALL swap_dimensions(ind) 
     
    186219 
    187220    DO ind=1,ndomain 
     221      IF (.NOT. assigned_domain(ind)) CYCLE 
    188222      d=>domain(ind) 
    189223      CALL swap_dimensions(ind) 
     
    215249      sum=0 
    216250      DO ind=1,ndomain 
     251      IF (.NOT. assigned_domain(ind)) CYCLE 
    217252        CALL swap_dimensions(ind) 
    218253        CALL swap_geometry(ind) 
     
    253288  USE dimensions 
    254289  USE transfert_mod 
    255   USE ioipsl 
     290  USE getin_mod 
    256291  IMPLICIT NONE 
    257292 
     
    273308  
    274309    DO ind=1,ndomain 
     310      IF (.NOT. assigned_domain(ind)) CYCLE 
    275311      d=>domain(ind) 
    276312      CALL swap_dimensions(ind) 
     
    489525                  
    490526    ENDDO 
     527 
    491528    CALL transfert_request(geom%Ai,req_i1) 
    492529    CALL transfert_request(geom%centroid,req_i1) 
     530 
    493531    CALL surf_triangle(d%xyz(:,ii_begin,jj_begin),d%xyz(:,ii_begin,jj_end),d%xyz(:,ii_end,jj_begin),S) 
    494532  
Note: See TracChangeset for help on using the changeset viewer.