Ignore:
Timestamp:
10/31/14 14:52:01 (10 years ago)
Author:
ymipsl
Message:

Merging OpenMP parallisme mode : by subdomain and on vertical level.
This feature is actually experimental but may be retro-compatible with the last method based only on subdomain

YM

File:
1 edited

Legend:

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

    r186 r295  
    2323  END SUBROUTINE W_omega 
    2424 
     25 
     26 
    2527  SUBROUTINE compute_omega(ps,u, w) 
    2628    USE disvert_mod, ONLY : ap,bp 
     29    USE omp_para 
     30    IMPLICIT NONE 
    2731    REAL(rstd),INTENT(IN) :: u(iim*3*jjm,llm), ps(iim*jjm) 
    2832    REAL(rstd),INTENT(OUT):: w(iim*jjm,llm) 
     
    3034    REAL(rstd):: p(iim*jjm,llm+1), rhodz(iim*jjm,llm), Fe(iim*3*jjm,llm) 
    3135    REAL(rstd):: ugradps 
    32     DO    l    = 1, llm+1 
    33        DO j=jj_begin-1,jj_end+1 
    34           DO i=ii_begin-1,ii_end+1 
    35              ij=(j-1)*iim+i 
    36              p(ij,l) = ap(l) + bp(l) * ps(ij) 
    37           ENDDO 
    38        ENDDO 
    39     ENDDO 
     36     
     37    INTEGER :: i,j,l,ij 
     38 
     39!$OMP BARRIER     
     40    IF (is_omp_level_master) THEN 
     41      DO    l    = 1, llm+1 
     42         DO j=jj_begin-1,jj_end+1 
     43           DO i=ii_begin-1,ii_end+1 
     44               ij=(j-1)*iim+i 
     45               p(ij,l) = ap(l) + bp(l) * ps(ij) 
     46            ENDDO 
     47         ENDDO 
     48      ENDDO 
    4049     
    4150!!! Compute mass 
    42     DO l = 1, llm 
    43        DO j=jj_begin-1,jj_end+1 
    44           DO i=ii_begin-1,ii_end+1 
    45              ij=(j-1)*iim+i 
    46              rhodz(ij,l) = ( p(ij,l) - p(ij,l+1) ) / g 
    47           ENDDO 
    48        ENDDO 
    49     ENDDO 
     51      DO l = 1, llm 
     52         DO j=jj_begin-1,jj_end+1 
     53            DO i=ii_begin-1,ii_end+1 
     54               ij=(j-1)*iim+i 
     55               rhodz(ij,l) = ( p(ij,l) - p(ij,l+1) ) / g 
     56            ENDDO 
     57         ENDDO 
     58      ENDDO 
    5059     
    5160!!!  Compute mass flux 
    52     DO l = 1, llm 
    53        DO j=jj_begin-1,jj_end+1 
    54           DO i=ii_begin-1,ii_end+1 
    55              ij=(j-1)*iim+i 
    56              Fe(ij+u_right,l)=0.5*(rhodz(ij,l)+rhodz(ij+t_right,l))*u(ij+u_right,l)*le(ij+u_right) 
    57              Fe(ij+u_lup,l)=0.5*(rhodz(ij,l)+rhodz(ij+t_lup,l))*u(ij+u_lup,l)*le(ij+u_lup) 
    58              Fe(ij+u_ldown,l)=0.5*(rhodz(ij,l)+rhodz(ij+t_ldown,l))*u(ij+u_ldown,l)*le(ij+u_ldown) 
    59           ENDDO 
    60        ENDDO 
    61     ENDDO 
     61      DO l = 1, llm 
     62         DO j=jj_begin-1,jj_end+1 
     63            DO i=ii_begin-1,ii_end+1 
     64               ij=(j-1)*iim+i 
     65               Fe(ij+u_right,l)=0.5*(rhodz(ij,l)+rhodz(ij+t_right,l))*u(ij+u_right,l)*le(ij+u_right) 
     66               Fe(ij+u_lup,l)=0.5*(rhodz(ij,l)+rhodz(ij+t_lup,l))*u(ij+u_lup,l)*le(ij+u_lup) 
     67               Fe(ij+u_ldown,l)=0.5*(rhodz(ij,l)+rhodz(ij+t_ldown,l))*u(ij+u_ldown,l)*le(ij+u_ldown) 
     68            ENDDO 
     69         ENDDO 
     70      ENDDO 
    6271     
    6372!!! mass flux convergence computation   
    6473     
    6574    ! horizontal convergence 
    66     DO l = 1, llm 
    67        DO j=jj_begin,jj_end 
    68           DO i=ii_begin,ii_end 
    69              ij=(j-1)*iim+i 
    70              ! convm = +div(mass flux), sign convention as in Ringler et al. 2012, eq. 21 
    71              convm(ij,l)= 1./Ai(ij)*(ne(ij,right)*Fe(ij+u_right,l)   +  & 
    72                   ne(ij,rup)*Fe(ij+u_rup,l)       +  &   
    73                   ne(ij,lup)*Fe(ij+u_lup,l)       +  &   
    74                   ne(ij,left)*Fe(ij+u_left,l)     +  &   
    75                   ne(ij,ldown)*Fe(ij+u_ldown,l)   +  &   
    76                   ne(ij,rdown)*Fe(ij+u_rdown,l)) 
    77           ENDDO 
    78        ENDDO 
    79     ENDDO 
     75      DO l = 1, llm 
     76         DO j=jj_begin,jj_end 
     77            DO i=ii_begin,ii_end 
     78               ij=(j-1)*iim+i 
     79               ! convm = +div(mass flux), sign convention as in Ringler et al. 2012, eq. 21 
     80               convm(ij,l)= 1./Ai(ij)*(ne(ij,right)*Fe(ij+u_right,l)   +  & 
     81                    ne(ij,rup)*Fe(ij+u_rup,l)       +  &   
     82                    ne(ij,lup)*Fe(ij+u_lup,l)       +  &   
     83                    ne(ij,left)*Fe(ij+u_left,l)     +  &   
     84                    ne(ij,ldown)*Fe(ij+u_ldown,l)   +  &   
     85                    ne(ij,rdown)*Fe(ij+u_rdown,l)) 
     86            ENDDO 
     87         ENDDO 
     88      ENDDO 
    8089     
    81     ! vertical integration from up to down 
    82     DO  l = llm-1, 1, -1 
    83        DO j=jj_begin,jj_end 
    84           DO i=ii_begin,ii_end 
    85              ij=(j-1)*iim+i 
    86              convm(ij,l) = convm(ij,l) + convm(ij,l+1) 
    87           ENDDO 
    88        ENDDO 
    89     ENDDO 
    90     convm(:,llm+1)=0. 
     90      ! vertical integration from up to down 
     91      DO  l = llm-1, 1, -1 
     92         DO j=jj_begin,jj_end 
     93            DO i=ii_begin,ii_end 
     94               ij=(j-1)*iim+i 
     95               convm(ij,l) = convm(ij,l) + convm(ij,l+1) 
     96            ENDDO 
     97         ENDDO 
     98      ENDDO 
     99      convm(:,llm+1)=0. 
    91100 
    92101!!! Compute dps 
     
    125134    ! -grad ps : ( ne(ij,ldown)*ps(ij,l) + ne(ij+t_ldown,rup)*ps(ij+t_ldown,l) ) ) / de(ij+u_ldown) 
    126135 
    127     DO l = 1,llm 
    128        DO j=jj_begin,jj_end 
    129           DO i=ii_begin,ii_end 
    130              toto = 1 
     136       DO l = 1,llm 
     137         DO j=jj_begin,jj_end  
     138           DO i=ii_begin,ii_end 
    131139             ij=(j-1)*iim+i 
    132140             ugradps = & 
     
    140148             w( ij, l) =  ugradps - .5*(convm( ij,l+1)+convm(ij,l))  
    141149          ENDDO 
    142        ENDDO 
    143     ENDDO 
     150        ENDDO 
     151      ENDDO 
     152    ENDIF 
     153!$OMP BARRIER 
    144154     
    145155  END SUBROUTINE compute_omega 
Note: See TracChangeset for help on using the changeset viewer.