Changeset 954


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

trunk : Added metric terms to kernels parameters to avoid Host/GPU transferts

Metric terms are now subroutine parameters instead of module variables in kernel subroutines. Dummy arguments for metric terms are now defined as fixed-size arrays, and arrays dimensions are well known when entering an 'acc data' region. Array descriptors are no longer transferred form host to device each time the data region is executed.

Location:
codes/icosagcm/trunk/src
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/trunk/src/dissip/dissip_gcm.F90

    r953 r954  
    207207          u=f_u(ind) 
    208208          du=f_du(ind) 
    209           CALL compute_gradiv_inplace(u,1,1) 
     209          CALL compute_gradiv_inplace(u,Ai,ne,le,de,1,1) 
    210210          ! This should be ported on GPU but we are running into compiler issues... 
    211211          !$acc update host(u(:)) wait 
     
    306306          u=f_u(ind) 
    307307          du=f_du(ind) 
    308           CALL compute_gradrot_inplace(u,1,1) 
     308          CALL compute_gradrot_inplace(u,Av,ne,le,de,1,1) 
    309309          ! This should be ported on GPU but we are running into compiler issues... 
    310310          !$acc update host(u(:)) wait 
     
    401401          theta=f_theta(ind) 
    402402          dtheta=f_dtheta(ind) 
    403           CALL compute_divgrad_inplace(theta,1,1) 
     403          CALL compute_divgrad_inplace(theta,Ai,ne,le,de,1,1) 
    404404          ! This should be ported on GPU but we are running into compiler issues... 
    405405          !$acc update host(theta(:)) wait 
     
    707707        CALL swap_geometry(ind) 
    708708        due=f_due(ind) 
    709         CALL compute_gradiv_inplace(due,ll_begin,ll_end) 
     709        CALL compute_gradiv_inplace(due,Ai,ne,le,de,ll_begin,ll_end) 
    710710      ENDDO 
    711711    ENDDO 
     
    757757        CALL swap_geometry(ind) 
    758758        due=f_due(ind)  
    759         CALL compute_gradrot_inplace(due,ll_begin,ll_end) 
     759        CALL compute_gradrot_inplace(due,Av,ne,le,de,ll_begin,ll_end) 
    760760      ENDDO 
    761761 
     
    805805        CALL swap_geometry(ind) 
    806806        dtheta=f_dtheta(ind)  
    807         CALL compute_divgrad_inplace(dtheta,ll_begin,ll_end) 
     807        CALL compute_divgrad_inplace(dtheta,Ai,ne,le,de,ll_begin,ll_end) 
    808808      ENDDO 
    809809 
     
    857857        CALL swap_geometry(ind) 
    858858        dtheta_rhodz=f_dtheta_rhodz(ind)  
    859         CALL compute_divgrad_inplace(dtheta_rhodz,ll_begin,ll_end) 
     859        CALL compute_divgrad_inplace(dtheta_rhodz,Ai,ne,le,de,ll_begin,ll_end) 
    860860      ENDDO 
    861861 
     
    884884  END SUBROUTINE divgrad_theta_rhodz 
    885885 
    886   SUBROUTINE compute_gradiv(ue,gradivu_e,llb,lle) 
     886  SUBROUTINE compute_gradiv(ue,gradivu_e,Ai,ne,le,de,llb,lle) 
    887887    INTEGER,INTENT(IN)     :: llb 
    888888    INTEGER,INTENT(IN)     :: lle 
    889889    REAL(rstd),INTENT(OUT) :: gradivu_e(iim*3*jjm,llm) 
    890890    REAL(rstd),INTENT(IN)  :: ue(iim*3*jjm,llm) 
     891    REAL(rstd),INTENT(IN)  :: Ai(iim*jjm) 
     892    INTEGER,INTENT(IN)     :: ne(iim*jjm,6) 
     893    REAL(rstd),INTENT(IN)  :: le(iim*3*jjm) 
     894    REAL(rstd),INTENT(IN)  :: de(iim*3*jjm) 
    891895 
    892896    gradivu_e = ue 
    893     CALL compute_gradiv_inplace(gradivu_e,llb,lle) 
     897    CALL compute_gradiv_inplace(gradivu_e,Ai,ne,le,de,llb,lle) 
    894898 
    895899  END SUBROUTINE compute_gradiv 
    896900   
    897   SUBROUTINE compute_gradiv_inplace(ue_gradivu_e,llb,lle) 
    898     USE geometry, ONLY : Ai, ne, le, de 
     901  SUBROUTINE compute_gradiv_inplace(ue_gradivu_e,Ai,ne,le,de,llb,lle) 
    899902    INTEGER,INTENT(IN)     :: llb 
    900903    INTEGER,INTENT(IN)     :: lle 
    901904    REAL(rstd),INTENT(INOUT) :: ue_gradivu_e(iim*3*jjm,llm) 
     905    REAL(rstd),INTENT(IN)  :: Ai(iim*jjm) 
     906    INTEGER,INTENT(IN)     :: ne(iim*jjm,6) 
     907    REAL(rstd),INTENT(IN)  :: le(iim*3*jjm) 
     908    REAL(rstd),INTENT(IN)  :: de(iim*3*jjm) 
    902909    REAL(rstd) :: divu_i(iim*jjm,llb:lle) 
    903910     
     
    945952  END SUBROUTINE compute_gradiv_inplace 
    946953 
    947   SUBROUTINE compute_divgrad(theta,divgrad_i,llb,lle) 
     954  SUBROUTINE compute_divgrad(theta,divgrad_i,Ai,ne,le,de,llb,lle) 
    948955    INTEGER,INTENT(IN)     :: llb 
    949956    INTEGER,INTENT(IN)     :: lle 
    950957    REAL(rstd),INTENT(IN) :: theta(iim*jjm,1:lle) 
    951958    REAL(rstd),INTENT(OUT) :: divgrad_i(iim*jjm,1:lle) 
     959    REAL(rstd),INTENT(IN)  :: Ai(iim*jjm) 
     960    INTEGER,INTENT(IN)     :: ne(iim*jjm,6) 
     961    REAL(rstd),INTENT(IN)  :: le(iim*3*jjm) 
     962    REAL(rstd),INTENT(IN)  :: de(iim*3*jjm) 
    952963 
    953964    divgrad_i = theta 
    954     CALL compute_divgrad_inplace(divgrad_i,llb,lle) 
     965    CALL compute_divgrad_inplace(divgrad_i,Ai,ne,le,de,llb,lle) 
    955966  END SUBROUTINE compute_divgrad 
    956967   
    957   SUBROUTINE compute_divgrad_inplace(theta_divgrad_i,llb,lle) 
    958     USE geometry, ONLY : Ai, ne, le, de 
     968  SUBROUTINE compute_divgrad_inplace(theta_divgrad_i,Ai,ne,le,de,llb,lle) 
    959969    INTEGER,INTENT(IN)     :: llb 
    960970    INTEGER,INTENT(IN)     :: lle 
    961971    REAL(rstd),INTENT(INOUT) :: theta_divgrad_i(iim*jjm,1:lle) 
     972    REAL(rstd),INTENT(IN)  :: Ai(iim*jjm) 
     973    INTEGER,INTENT(IN)     :: ne(iim*jjm,6) 
     974    REAL(rstd),INTENT(IN)  :: le(iim*3*jjm) 
     975    REAL(rstd),INTENT(IN)  :: de(iim*3*jjm) 
    962976    REAL(rstd)  :: grad_e(3*iim*jjm,llb:lle) 
    963977 
     
    10031017  END SUBROUTINE compute_divgrad_inplace 
    10041018 
    1005   SUBROUTINE compute_gradrot(ue,gradrot_e,llb,lle) 
     1019  SUBROUTINE compute_gradrot(ue,gradrot_e,Av,ne,le,de,llb,lle) 
    10061020    INTEGER,INTENT(IN)     :: llb 
    10071021    INTEGER,INTENT(IN)     :: lle 
    10081022    REAL(rstd),INTENT(IN) :: ue(iim*3*jjm,lle) 
    10091023    REAL(rstd),INTENT(OUT) :: gradrot_e(iim*3*jjm,lle) 
     1024    REAL(rstd),INTENT(IN)  :: Av(2*iim*jjm) 
     1025    INTEGER,INTENT(IN)     :: ne(iim*jjm,6) 
     1026    REAL(rstd),INTENT(IN)  :: le(iim*3*jjm) 
     1027    REAL(rstd),INTENT(IN)  :: de(iim*3*jjm) 
    10101028 
    10111029    gradrot_e = ue 
    1012     CALL compute_gradrot_inplace(gradrot_e,llb,lle) 
     1030    CALL compute_gradrot_inplace(gradrot_e,Av,ne,le,de,llb,lle) 
    10131031  END SUBROUTINE compute_gradrot 
    10141032 
    1015   SUBROUTINE compute_gradrot_inplace(ue_gradrot_e,llb,lle) 
    1016     USE geometry, ONLY : Av, ne, le, de 
     1033  SUBROUTINE compute_gradrot_inplace(ue_gradrot_e,Av,ne,le,de,llb,lle) 
    10171034    INTEGER,INTENT(IN)     :: llb 
    10181035    INTEGER,INTENT(IN)     :: lle 
    10191036    REAL(rstd),INTENT(INOUT) :: ue_gradrot_e(iim*3*jjm,lle) 
     1037    REAL(rstd),INTENT(IN)  :: Av(2*iim*jjm) 
     1038    INTEGER,INTENT(IN)     :: ne(iim*jjm,6) 
     1039    REAL(rstd),INTENT(IN)  :: le(iim*3*jjm) 
     1040    REAL(rstd),INTENT(IN)  :: de(iim*3*jjm) 
    10201041    REAL(rstd) :: rot_v(2*iim*jjm,llb:lle) 
    10211042 
  • codes/icosagcm/trunk/src/dynamics/caldyn_gcm.F90

    r953 r954  
    188188       f_geopot, f_hflux, f_wflux, f_dps, f_dmass, f_dtheta_rhodz, f_du) 
    189189    USE observable_mod 
    190     USE disvert_mod, ONLY : caldyn_eta, eta_mass 
     190    USE disvert_mod, ONLY : caldyn_eta, eta_mass, bp 
    191191    USE trace 
    192192    LOGICAL,INTENT(IN)    :: write_out 
     
    319319             wwuu=f_wwuu(ind) 
    320320             dps=f_dps(ind) 
    321              CALL compute_caldyn_vert(u,theta,mass,convm, wflux,wwuu, dps, dtheta_rhodz(:,:,1), du) 
     321             CALL compute_caldyn_vert(u,theta,mass,convm, wflux,wwuu, dps, dtheta_rhodz(:,:,1), du, bp) 
    322322          END IF 
    323323       ENDDO        
     
    348348             wwuu=f_wwuu(ind) 
    349349             dps=f_dps(ind) 
    350              CALL compute_caldyn_vert(u,theta,mass,convm, wflux,wwuu, dps, dtheta_rhodz, du) 
     350             CALL compute_caldyn_vert(u,theta,mass,convm, wflux,wwuu, dps, dtheta_rhodz, du, bp) 
    351351          END IF 
    352352       ENDDO 
  • codes/icosagcm/trunk/src/dynamics/caldyn_hevi.F90

    r953 r954  
    1616    USE icosa 
    1717    USE observable_mod 
    18     USE disvert_mod, ONLY : caldyn_eta, eta_mass 
     18    USE disvert_mod, ONLY : caldyn_eta, eta_mass, bp, mass_dak, mass_dbk 
    1919    USE vorticity_mod 
    2020    USE kinetic_mod 
     
    110110       mass=f_mass(ind) 
    111111       theta = f_theta(ind) 
    112        CALL compute_theta(ps,theta_rhodz, mass,theta) 
     112       CALL compute_theta(ps,theta_rhodz, mass,theta, mass_dak, mass_dbk) 
    113113       pk = f_pk(ind) 
    114114       geopot = f_geopot(ind) 
     
    145145       qu=f_qu(ind) 
    146146       qv=f_qv(ind) 
    147        CALL compute_pvort_only(u,mass,qu,qv) 
     147       CALL compute_pvort_only(u,mass,qu,qv,Av,Riv2,fv) 
    148148    ENDDO 
    149149     
     
    165165 
    166166       IF(hydrostatic) THEN 
    167           CALL compute_caldyn_slow_hydro(u,mass,hflux,du, .TRUE.) 
     167          CALL compute_caldyn_slow_hydro(u,mass,hflux,du,Ai,le_de, .TRUE.) 
    168168       ELSE 
    169169          CALL abort_acc("HEVI_scheme/!hydrostatic") 
     
    177177          CALL compute_caldyn_slow_NH(u,mass,geopot,W, F_el,gradPhi2,w_il, hflux,du,dPhi,dW) 
    178178       END IF 
    179        CALL compute_caldyn_Coriolis(hflux,theta,qu,convm,dtheta_rhodz,du) 
     179       CALL compute_caldyn_Coriolis(hflux,theta,qu,convm,dtheta_rhodz,du,Ai,wee) 
    180180        
    181181       IF(caldyn_eta==eta_mass) THEN 
     
    183183          wwuu=f_wwuu(ind) 
    184184          dps=f_dps(ind) 
    185           CALL compute_caldyn_vert(u,theta,mass,convm, wflux,wwuu, dps, dtheta_rhodz, du) 
     185          CALL compute_caldyn_vert(u,theta,mass,convm, wflux,wwuu, dps, dtheta_rhodz, du, bp) 
    186186          IF(.NOT.hydrostatic) THEN 
    187187             CALL abort_acc("HEVI_scheme/!hydrostatic") 
  • codes/icosagcm/trunk/src/dynamics/caldyn_kernels_base.F90

    r953 r954  
    209209  END SUBROUTINE compute_geopot 
    210210 
    211   SUBROUTINE compute_caldyn_vert(u, theta, rhodz, convm, wflux, wwuu, dps, dtheta_rhodz, du) 
    212     USE disvert_mod, ONLY : bp 
     211  SUBROUTINE compute_caldyn_vert(u, theta, rhodz, convm, wflux, wwuu, dps, dtheta_rhodz, du, bp) 
    213212    REAL(rstd),INTENT(IN)  :: u(iim*3*jjm,llm) 
    214213    REAL(rstd),INTENT(IN)  :: theta(iim*jjm,llm,nqdyn) 
     
    221220    REAL(rstd),INTENT(INOUT) :: dtheta_rhodz(iim*jjm,llm,nqdyn) 
    222221    REAL(rstd),INTENT(OUT) :: dps(iim*jjm) 
     222    REAL(rstd),INTENT(IN)  :: bp(llm) 
    223223 
    224224    ! temporary variable     
  • codes/icosagcm/trunk/src/dynamics/caldyn_kernels_hevi.F90

    r953 r954  
    2020CONTAINS 
    2121 
    22   SUBROUTINE compute_theta(ps,theta_rhodz, rhodz,theta) 
    23     USE disvert_mod, ONLY : mass_dbk, mass_dak 
     22  SUBROUTINE compute_theta(ps,theta_rhodz, rhodz,theta, mass_dak, mass_dbk) 
    2423    REAL(rstd),INTENT(IN)    :: ps(iim*jjm) 
    2524    REAL(rstd),INTENT(IN)    :: theta_rhodz(iim*jjm,llm,nqdyn) 
    2625    REAL(rstd),INTENT(INOUT) :: rhodz(iim*jjm,llm) 
    2726    REAL(rstd),INTENT(OUT)   :: theta(iim*jjm,llm,nqdyn) 
     27    REAL(rstd),INTENT(IN)    :: mass_dak(llm) 
     28    REAL(rstd),INTENT(IN)    :: mass_dbk(llm) 
    2829    INTEGER :: ij,l,iq 
    2930    REAL(rstd) :: m 
     
    5960  END SUBROUTINE compute_theta 
    6061 
    61   SUBROUTINE compute_pvort_only(u,rhodz,qu,qv) 
    62     USE geometry, ONLY : Av, Riv2, fv 
     62  SUBROUTINE compute_pvort_only(u,rhodz,qu,qv,Av,Riv2,fv) 
    6363    REAL(rstd),INTENT(IN)  :: u(iim*3*jjm,llm) 
    6464    REAL(rstd),INTENT(INOUT) :: rhodz(iim*jjm,llm) 
    6565    REAL(rstd),INTENT(OUT) :: qu(iim*3*jjm,llm) 
    6666    REAL(rstd),INTENT(OUT) :: qv(iim*2*jjm,llm) 
     67    REAL(rstd),INTENT(IN)  :: Av(2*iim*jjm) 
     68    REAL(rstd),INTENT(IN)  :: Riv2(iim*jjm,6) 
     69    REAL(rstd),INTENT(IN)  :: fv(2*iim*jjm) 
    6770 
    6871    INTEGER :: ij,l 
     
    551554  END SUBROUTINE compute_caldyn_fast 
    552555     
    553   SUBROUTINE compute_caldyn_Coriolis(hflux,theta,qu, convm,dtheta_rhodz,du) 
    554     USE geometry, ONLY : Ai, wee 
     556  SUBROUTINE compute_caldyn_Coriolis(hflux,theta,qu, convm,dtheta_rhodz,du,Ai,wee) 
    555557    REAL(rstd),INTENT(IN)  :: hflux(3*iim*jjm,llm)  ! hflux in kg/s 
    556558    REAL(rstd),INTENT(IN)  :: theta(iim*jjm,llm,nqdyn) ! active scalars 
     
    559561    REAL(rstd),INTENT(OUT) :: dtheta_rhodz(iim*jjm,llm,nqdyn) 
    560562    REAL(rstd),INTENT(INOUT) :: du(3*iim*jjm,llm) 
     563    REAL(rstd),INTENT(IN)  :: Ai(iim*jjm) 
     564    REAL(rstd),INTENT(IN)  :: wee(3*iim*jjm,5,2) 
    561565     
    562566    REAL(rstd) :: Ftheta(3*iim*jjm,llm)  ! potential temperature flux 
     
    730734  END SUBROUTINE compute_caldyn_Coriolis 
    731735 
    732   SUBROUTINE compute_caldyn_slow_hydro(u,rhodz,hflux,du,zero) 
    733     USE geometry, ONLY : Ai, le_de 
     736  SUBROUTINE compute_caldyn_slow_hydro(u,rhodz,hflux,du,Ai,le_de,zero) 
    734737    LOGICAL, INTENT(IN) :: zero 
    735738    REAL(rstd),INTENT(IN)  :: u(3*iim*jjm,llm)    ! prognostic "velocity" 
     
    737740    REAL(rstd),INTENT(OUT) :: hflux(3*iim*jjm,llm) ! hflux in kg/s 
    738741    REAL(rstd),INTENT(INOUT) :: du(3*iim*jjm,llm) 
     742    REAL(rstd),INTENT(IN)  :: Ai(iim*jjm) 
     743    REAL(rstd),INTENT(IN)  :: le_de(3*iim*jjm) 
    739744     
    740745    REAL(rstd) :: berni(iim*jjm,llm)  ! Bernoulli function 
  • codes/icosagcm/trunk/src/transport/advect.F90

    r953 r954  
    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 
     
    348348 
    349349  ! Backward trajectories, for use with Miura approach 
    350   SUBROUTINE compute_backward_traj(normal,tangent,ue,tau,cc) 
    351     USE geometry, ONLY : xyz_e, de, wee, le 
     350  SUBROUTINE compute_backward_traj(normal,tangent,ue,tau, cc, & 
     351                                   xyz_e, de, wee, le         ) ! metrics terms 
    352352    USE trace 
    353353    USE omp_para 
     
    358358    REAL(rstd),INTENT(OUT)   :: cc(3*iim*jjm,llm,3) ! start of backward trajectory 
    359359    REAL(rstd),INTENT(IN)    :: tau 
     360! metrics terms 
     361    REAL(rstd),INTENT(IN)    :: xyz_e(iim*3*jjm,3) 
     362    REAL(rstd),INTENT(IN)    :: de(iim*3*jjm) 
     363    REAL(rstd),INTENT(IN)    :: wee(iim*3*jjm,5,2) 
     364    REAL(rstd),INTENT(IN)    :: le(iim*3*jjm) 
    360365 
    361366    REAL(rstd) :: v_e(3), up_e    
     
    427432  ! Horizontal transport (S. Dubey, T. Dubos) 
    428433  ! Slope-limited van Leer approach with hexagons 
    429   SUBROUTINE compute_advect_horiz(update_mass,diagflux_on, hfluxt,cc,gradq3d, mass, qi, qfluxt) 
     434  SUBROUTINE compute_advect_horiz(update_mass,diagflux_on, hfluxt,cc,gradq3d, mass, qi, qfluxt,  & 
     435                                  Ai, xyz_i)   ! metrics terms  
    430436    USE trace 
    431437    USE omp_para 
    432438    USE abort_mod 
    433     USE geometry, only : Ai, xyz_i 
    434439    IMPLICIT NONE 
    435440    LOGICAL, INTENT(IN)       :: update_mass, diagflux_on 
     
    441446    REAL(rstd), INTENT(INOUT) :: qfluxt(3*iim*jjm,MERGE(llm,1,diagflux_on)) ! time-integrated tracer flux 
    442447! metrics terms 
     448    REAL(rstd), INTENT(IN)    :: Ai(iim*jjm) 
     449    REAL(rstd), INTENT(IN)    :: xyz_i(iim*jjm,3) 
    443450     
    444451    REAL(rstd) :: dq,dmass,qe,newmass 
  • codes/icosagcm/trunk/src/transport/advect_tracer.F90

    r953 r954  
    143143       END DO 
    144144 
    145        CALL compute_backward_traj(tangent,normal,u,0.5*dt*itau_adv, cc) 
     145       CALL compute_backward_traj(tangent,normal,u,0.5*dt*itau_adv, cc,   & 
     146                                  xyz_e, de, wee, le                   ) ! metrics terms 
    146147    END DO 
    147148 
     
    193194             END IF 
    194195          END IF 
    195           CALL compute_advect_horiz(k==nq_last,frac>0., hfluxt,cc,gradq3d, rhodz, q(:,:,k), qfluxt(:,:,k)) 
     196          CALL compute_advect_horiz(k==nq_last,frac>0., hfluxt,cc,gradq3d, rhodz, q(:,:,k), qfluxt(:,:,k),  & 
     197                                    Ai, xyz_i)   ! metrics terms 
    196198        END DO 
    197199 
Note: See TracChangeset for help on using the changeset viewer.