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/kernels/advect_horiz.k90

    r599 r953  
    11   !-------------------------------------------------------------------------- 
    22   !---------------------------- advect_horiz ---------------------------------- 
     3 
     4   !$acc data create(qflux(:,:)) present(qi(:,:), cc(:,:,:), gradq3d(:,:,:), mass(:,:), hfluxt(:,:), Ai(:), xyz_i(:,:)) async 
     5 
    36   ! evaluate tracer field at point cc using piecewise linear reconstruction 
    47   ! q(cc)= q0 + gradq.(cc-xyz_i) with xi centroid of hexagon 
    58   ! sign*hfluxt>0 iff outgoing 
     9   !$acc parallel loop collapse(2) async 
    610   DO l = ll_begin, ll_end 
    711      !DIR$ SIMD 
    812      DO ij=ij_begin_ext, ij_end_ext 
    913         IF(ne_right*hfluxt(ij+u_right,l)>0.) THEN 
    10             qe = qi(ij,l) 
    11             qe = qe + (cc(ij+u_right,l,1)-xyz_i(ij,1))*gradq3d(ij,l,1) 
    12             qe = qe + (cc(ij+u_right,l,2)-xyz_i(ij,2))*gradq3d(ij,l,2) 
    13             qe = qe + (cc(ij+u_right,l,3)-xyz_i(ij,3))*gradq3d(ij,l,3) 
     14            ij_tmp = ij 
    1415         ELSE 
    15             qe = qi(ij+t_right,l) 
    16             qe = qe + (cc(ij+u_right,l,1)-xyz_i(ij+t_right,1))*gradq3d(ij+t_right,l,1) 
    17             qe = qe + (cc(ij+u_right,l,2)-xyz_i(ij+t_right,2))*gradq3d(ij+t_right,l,2) 
    18             qe = qe + (cc(ij+u_right,l,3)-xyz_i(ij+t_right,3))*gradq3d(ij+t_right,l,3) 
     16            ij_tmp = ij+t_right 
    1917         END IF 
     18 
     19         qe = qi(ij_tmp,l) 
     20         qe = qe + (cc(ij+u_right,l,1)-xyz_i(ij_tmp,1))*gradq3d(ij_tmp,l,1) 
     21         qe = qe + (cc(ij+u_right,l,2)-xyz_i(ij_tmp,2))*gradq3d(ij_tmp,l,2) 
     22         qe = qe + (cc(ij+u_right,l,3)-xyz_i(ij_tmp,3))*gradq3d(ij_tmp,l,3) 
     23 
    2024         qflux(ij+u_right,l) = hfluxt(ij+u_right,l)*qe 
    21          IF(diagflux_on) qfluxt(ij+u_right,l) = qfluxt(ij+u_right,l)+qflux(ij+u_right,l) 
     25 
    2226         IF(ne_lup*hfluxt(ij+u_lup,l)>0.) THEN 
    23             qe = qi(ij,l) 
    24             qe = qe + (cc(ij+u_lup,l,1)-xyz_i(ij,1))*gradq3d(ij,l,1) 
    25             qe = qe + (cc(ij+u_lup,l,2)-xyz_i(ij,2))*gradq3d(ij,l,2) 
    26             qe = qe + (cc(ij+u_lup,l,3)-xyz_i(ij,3))*gradq3d(ij,l,3) 
     27            ij_tmp = ij 
    2728         ELSE 
    28             qe = qi(ij+t_lup,l) 
    29             qe = qe + (cc(ij+u_lup,l,1)-xyz_i(ij+t_lup,1))*gradq3d(ij+t_lup,l,1) 
    30             qe = qe + (cc(ij+u_lup,l,2)-xyz_i(ij+t_lup,2))*gradq3d(ij+t_lup,l,2) 
    31             qe = qe + (cc(ij+u_lup,l,3)-xyz_i(ij+t_lup,3))*gradq3d(ij+t_lup,l,3) 
     29            ij_tmp = ij+t_lup 
    3230         END IF 
     31 
     32         qe = qi(ij_tmp,l) 
     33         qe = qe + (cc(ij+u_lup,l,1)-xyz_i(ij_tmp,1))*gradq3d(ij_tmp,l,1) 
     34         qe = qe + (cc(ij+u_lup,l,2)-xyz_i(ij_tmp,2))*gradq3d(ij_tmp,l,2) 
     35         qe = qe + (cc(ij+u_lup,l,3)-xyz_i(ij_tmp,3))*gradq3d(ij_tmp,l,3) 
     36 
    3337         qflux(ij+u_lup,l) = hfluxt(ij+u_lup,l)*qe 
    34          IF(diagflux_on) qfluxt(ij+u_lup,l) = qfluxt(ij+u_lup,l)+qflux(ij+u_lup,l) 
     38 
    3539         IF(ne_ldown*hfluxt(ij+u_ldown,l)>0.) THEN 
    36             qe = qi(ij,l) 
    37             qe = qe + (cc(ij+u_ldown,l,1)-xyz_i(ij,1))*gradq3d(ij,l,1) 
    38             qe = qe + (cc(ij+u_ldown,l,2)-xyz_i(ij,2))*gradq3d(ij,l,2) 
    39             qe = qe + (cc(ij+u_ldown,l,3)-xyz_i(ij,3))*gradq3d(ij,l,3) 
     40            ij_tmp = ij 
    4041         ELSE 
    41             qe = qi(ij+t_ldown,l) 
    42             qe = qe + (cc(ij+u_ldown,l,1)-xyz_i(ij+t_ldown,1))*gradq3d(ij+t_ldown,l,1) 
    43             qe = qe + (cc(ij+u_ldown,l,2)-xyz_i(ij+t_ldown,2))*gradq3d(ij+t_ldown,l,2) 
    44             qe = qe + (cc(ij+u_ldown,l,3)-xyz_i(ij+t_ldown,3))*gradq3d(ij+t_ldown,l,3) 
     42            ij_tmp = ij+t_ldown 
    4543         END IF 
     44 
     45         qe = qi(ij_tmp,l) 
     46         qe = qe + (cc(ij+u_ldown,l,1)-xyz_i(ij_tmp,1))*gradq3d(ij_tmp,l,1) 
     47         qe = qe + (cc(ij+u_ldown,l,2)-xyz_i(ij_tmp,2))*gradq3d(ij_tmp,l,2) 
     48         qe = qe + (cc(ij+u_ldown,l,3)-xyz_i(ij_tmp,3))*gradq3d(ij_tmp,l,3) 
     49 
    4650         qflux(ij+u_ldown,l) = hfluxt(ij+u_ldown,l)*qe 
    47          IF(diagflux_on) qfluxt(ij+u_ldown,l) = qfluxt(ij+u_ldown,l)+qflux(ij+u_ldown,l) 
    4851      END DO 
    4952   END DO 
     53 
     54   IF(diagflux_on) THEN 
     55     !$acc parallel loop collapse(2) copy(qfluxt(:,:)) async 
     56     DO l = ll_begin, ll_end 
     57        !DIR$ SIMD 
     58        DO ij=ij_begin_ext, ij_end_ext 
     59           qfluxt(ij+u_right,l) = qfluxt(ij+u_right,l)+qflux(ij+u_right,l) 
     60           qfluxt(ij+u_lup,l) = qfluxt(ij+u_lup,l)+qflux(ij+u_lup,l) 
     61           qfluxt(ij+u_ldown,l) = qfluxt(ij+u_ldown,l)+qflux(ij+u_ldown,l) 
     62        END DO 
     63     END DO 
     64   END IF 
     65 
    5066   ! update q and, if update_mass, update mass 
     67   !$acc parallel loop collapse(2) async 
    5168   DO l = ll_begin, ll_end 
    5269      !DIR$ SIMD 
     
    7188      END DO 
    7289   END DO 
     90    
     91   !$acc end data 
     92 
    7393   !---------------------------- advect_horiz ---------------------------------- 
    7494   !-------------------------------------------------------------------------- 
Note: See TracChangeset for help on using the changeset viewer.