Changeset 953 for codes/icosagcm/trunk/src/kernels
- Timestamp:
- 07/15/19 12:29:31 (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/trunk/src/kernels/advect_horiz.k90
r599 r953 1 1 !-------------------------------------------------------------------------- 2 2 !---------------------------- advect_horiz ---------------------------------- 3 4 !$acc data create(qflux(:,:)) present(qi(:,:), cc(:,:,:), gradq3d(:,:,:), mass(:,:), hfluxt(:,:), Ai(:), xyz_i(:,:)) async 5 3 6 ! evaluate tracer field at point cc using piecewise linear reconstruction 4 7 ! q(cc)= q0 + gradq.(cc-xyz_i) with xi centroid of hexagon 5 8 ! sign*hfluxt>0 iff outgoing 9 !$acc parallel loop collapse(2) async 6 10 DO l = ll_begin, ll_end 7 11 !DIR$ SIMD 8 12 DO ij=ij_begin_ext, ij_end_ext 9 13 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 14 15 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 19 17 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 20 24 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 22 26 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 27 28 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 32 30 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 33 37 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 35 39 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 40 41 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 45 43 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 46 50 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)48 51 END DO 49 52 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 50 66 ! update q and, if update_mass, update mass 67 !$acc parallel loop collapse(2) async 51 68 DO l = ll_begin, ll_end 52 69 !DIR$ SIMD … … 71 88 END DO 72 89 END DO 90 91 !$acc end data 92 73 93 !---------------------------- advect_horiz ---------------------------------- 74 94 !--------------------------------------------------------------------------
Note: See TracChangeset
for help on using the changeset viewer.