Ignore:
Timestamp:
07/15/19 12:29:31 (5 years ago)
Author:
adurocher
Message:

trunk : GPU implementation with OpenACC ( merge from glcp.idris.fr )

File:
1 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/trunk/src/transport/advect.F90

    r899 r953  
    4949  !======================================================================================= 
    5050 
    51   SUBROUTINE compute_gradq3d(qi,sqrt_leng,gradq3d,xyz_i,xyz_v) 
     51  SUBROUTINE compute_gradq3d(qi,sqrt_leng,gradq3d,xyz_i, xyz_v) 
    5252    USE trace 
    5353    USE omp_para 
     
    6868    REAL(rstd) :: x1,x2,x3 
    6969    REAL(rstd) :: dq(3) 
    70  
     70     
    7171    CALL trace_start("compute_gradq3d1") 
    7272 
     
    8686!    END DO 
    8787 
    88      DO l = ll_begin,ll_end  
     88     !$acc data create(gradtri(:,:,:), arr(:), ar(:)) present(sqrt_leng(:), xyz_i(:,:), xyz_v(:,:), qi(:,:), gradq3d(:,:,:)) async 
     89 
     90     !$acc parallel loop collapse(2) async private(A, dq) 
     91     DO l = ll_begin,ll_end 
    8992!DIR$ SIMD 
    9093      DO ij=ij_begin_ext,ij_end_ext 
     
    151154         
    152155      ENDDO 
     156     ENDDO 
    153157       
     158     !$acc parallel loop collapse(2) async private(A, dq) 
     159     DO l = ll_begin,ll_end 
    154160      DO ij=ij_begin_ext,ij_end_ext 
    155161 
     
    219225 
    220226!DIR$ SIMD 
     227    !$acc parallel loop async 
    221228    DO ij=ij_begin,ij_end 
    222229       ar(ij) = arr(ij+z_up)+arr(ij+z_lup)+arr(ij+z_ldown)+arr(ij+z_down)+arr(ij+z_rdown)+arr(ij+z_rup)+1.e-50 
     
    225232    CALL trace_start2("compute_gradq3d2") 
    226233       
     234    !$acc parallel loop collapse(3) async 
    227235    DO k=1,3 
    228236      DO l =ll_begin,ll_end 
     
    239247 
    240248    !============================================================================================= LIMITING  
     249    !$acc parallel loop collapse(2) async 
    241250    DO l =ll_begin,ll_end 
    242251!DIR$ SIMD 
     
    251260             minq = min(qi(ij,l),qi(ij+t_right,l),qi(ij+t_lup,l),qi(ij+t_rup,l),qi(ij+t_left,l), & 
    252261                  qi(ij+t_rdown,l),qi(ij+t_ldown,l)) 
    253              alphamx = (maxq - qi(ij,l)) ; alphamx = alphamx/(maxq_c - qi(ij,l) ) 
    254              alphamx = max(alphamx,0.0) 
    255              alphami = (minq - qi(ij,l)); alphami = alphami/(minq_c - qi(ij,l)) 
    256              alphami = max(alphami,0.0)  
     262             IF ((maxq_c - qi(ij,l)) /= 0.0) THEN 
     263               alphamx = (maxq - qi(ij,l)) ; alphamx = alphamx/(maxq_c - qi(ij,l) ) 
     264               alphamx = max(alphamx,0.0) 
     265             ELSE 
     266               alphamx = 0.0 
     267             ENDIF 
     268             IF ((minq_c - qi(ij,l)) /= 0.0) THEN 
     269               alphami = (minq - qi(ij,l)); alphami = alphami/(minq_c - qi(ij,l)) 
     270               alphami = max(alphami,0.0) 
     271             ELSE 
     272               alphami = 0.0 
     273             ENDIF 
    257274             alpha   = min(alphamx,alphami,1.0) 
    258275!             gradq3d(ij,l,:) = alpha*gradq3d(ij,l,:) 
     
    264281 
    265282  CALL trace_end("compute_gradq3d3") 
     283 
     284  !$acc end data 
    266285   
    267286  CONTAINS 
     
    329348 
    330349  ! Backward trajectories, for use with Miura approach 
    331   SUBROUTINE compute_backward_traj(normal,tangent,ue,tau, cc) 
     350  SUBROUTINE compute_backward_traj(normal,tangent,ue,tau,cc) 
     351    USE geometry, ONLY : xyz_e, de, wee, le 
    332352    USE trace 
    333353    USE omp_para 
     
    345365 
    346366    ! TODO : compute normal displacement ue*tau as hfluxt / mass(upwind) then reconstruct tangential displacement 
    347      
     367 
     368    !$acc data present(ue(:,:), cc(:,:,:), normal(:,:), tangent(:,:), xyz_e(:,:), de(:), wee(:,:,:), le(:)) async 
     369 
    348370    ! reconstruct tangential wind then 3D wind at edge then cc = edge midpoint - u*tau 
     371    !$acc parallel loop private(up_e, v_e) collapse(2) gang vector async 
    349372    DO l = ll_begin,ll_end 
    350373!DIR$ SIMD 
     
    397420       ENDDO 
    398421    END DO 
    399  
     422    !$acc end data 
    400423    CALL trace_end("compute_backward_traj") 
    401424 
     
    404427  ! Horizontal transport (S. Dubey, T. Dubos) 
    405428  ! Slope-limited van Leer approach with hexagons 
    406   SUBROUTINE compute_advect_horiz(update_mass,diagflux_on, hfluxt,cc,gradq3d, mass,qi,qfluxt) 
     429  SUBROUTINE compute_advect_horiz(update_mass,diagflux_on, hfluxt,cc,gradq3d, mass, qi, qfluxt) 
    407430    USE trace 
    408431    USE omp_para 
     432    USE abort_mod 
     433    USE geometry, only : Ai, xyz_i 
    409434    IMPLICIT NONE 
    410435    LOGICAL, INTENT(IN)       :: update_mass, diagflux_on 
     
    415440    REAL(rstd), INTENT(INOUT) :: qi(iim*jjm,llm) 
    416441    REAL(rstd), INTENT(INOUT) :: qfluxt(3*iim*jjm,MERGE(llm,1,diagflux_on)) ! time-integrated tracer flux 
    417  
    418     REAL(rstd) :: dq,dmass,qe, newmass 
     442! metrics terms 
     443     
     444    REAL(rstd) :: dq,dmass,qe,newmass 
    419445    REAL(rstd) :: qflux(3*iim*jjm,llm) 
    420     INTEGER :: ij,l 
     446    INTEGER :: ij,l,ij_tmp 
     447 
     448    IF(diagflux_on) CALL abort_acc("compute_advect_horiz : diagflux_on") 
    421449 
    422450    CALL trace_start("compute_advect_horiz") 
    423451#include "../kernels/advect_horiz.k90" 
    424452    CALL trace_end("compute_advect_horiz") 
     453 
    425454  END SUBROUTINE compute_advect_horiz 
    426455 
Note: See TracChangeset for help on using the changeset viewer.