Ignore:
Timestamp:
Nov 17, 2025, 3:50:06 PM (6 weeks ago)
Author:
yann meurdesoif
Message:

Separate pbl_surface into 3 subroutines for GPU port

  • pbl_surface_uncompress_pre : prepare computation for sub subsurface before compressing
  • pbl_surface_subsrf : each sub-surface is called one after other (horizontal = knon)
  • pbl_surface_uncompress_post : sub-surface are uncompressed, computation is done on whole domain (horizontal = klon)

pbl_surface_main becomes the driver, calling pbl_surface_uncompress_pre, and then looping under sub-surface (and calling pbl_surface_subsrf) and then calling pbl_surface_uncompress_post.

YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/branches/PBLSURF_GPUPORT/libf/phylmd/coef_diff_turb_mod.f90

    r5296 r5868  
    1717       ycoefm, ycoefh ,yq2, yeps, ydrgpro)
    1818
    19     USE dimphy
     19    USE dimphy, ONLY : klev
     20    USE mod_grid_phy_lmdz, ONLY: klon_glo
    2021    USE indice_sol_mod
    2122    USE print_control_mod, ONLY: prt_level, lunout
     
    3435    REAL, INTENT(IN)                           :: dtime
    3536    INTEGER, INTENT(IN)                        :: nsrf, knon
    36     INTEGER, DIMENSION(klon), INTENT(IN)       :: ni
    37     REAL, DIMENSION(klon,klev+1), INTENT(IN)   :: ypaprs
    38     REAL, DIMENSION(klon,klev), INTENT(IN)     :: ypplay
    39     REAL, DIMENSION(klon,klev), INTENT(IN)     :: yu, yv
    40     REAL, DIMENSION(klon,klev), INTENT(IN)     :: yq, yt
    41     REAL, DIMENSION(klon), INTENT(IN)          :: yts, yqsurf
    42     REAL, DIMENSION(klon), INTENT(IN)          :: ycdragm
     37    INTEGER, DIMENSION(knon), INTENT(IN)       :: ni
     38    REAL, DIMENSION(knon,klev+1), INTENT(IN)   :: ypaprs
     39    REAL, DIMENSION(knon,klev), INTENT(IN)     :: ypplay
     40    REAL, DIMENSION(knon,klev), INTENT(IN)     :: yu, yv
     41    REAL, DIMENSION(knon,klev), INTENT(IN)     :: yq, yt
     42    REAL, DIMENSION(knon), INTENT(IN)          :: yts, yqsurf
     43    REAL, DIMENSION(knon), INTENT(IN)          :: ycdragm
    4344!FC
    44     REAL, DIMENSION(klon,klev), INTENT(IN)     :: ydrgpro
     45    REAL, DIMENSION(knon,klev), INTENT(IN)     :: ydrgpro
    4546
    4647
    4748! InOutput arguments
    4849!****************************************************************************************
    49     REAL, DIMENSION(klon,klev+1), INTENT(INOUT):: yq2
     50    REAL, DIMENSION(knon,klev+1), INTENT(INOUT):: yq2
    5051
    5152! Output arguments
    5253!****************************************************************************************
    53     REAL, DIMENSION(klon,klev+1), INTENT(OUT)  :: yeps
    54     REAL, DIMENSION(klon,klev), INTENT(OUT)    :: ycoefh
    55     REAL, DIMENSION(klon,klev), INTENT(OUT)    :: ycoefm
     54    REAL, DIMENSION(knon,klev+1), INTENT(OUT)  :: yeps
     55    REAL, DIMENSION(knon,klev), INTENT(OUT)    :: ycoefh
     56    REAL, DIMENSION(knon,klev), INTENT(OUT)    :: ycoefm
    5657
    5758! Other local variables
    5859!****************************************************************************************
    5960    INTEGER                                    :: k, i, j
    60     REAL, DIMENSION(klon,klev)                 :: ycoefm0, ycoefh0, yzlay, yteta
    61     REAL, DIMENSION(klon,klev+1)               :: yzlev, q2diag, ykmm, ykmn, ykmq
    62     REAL, DIMENSION(klon)                      :: yustar
     61    REAL, DIMENSION(knon,klev)                 :: ycoefm0, ycoefh0, yzlay, yteta
     62    REAL, DIMENSION(knon,klev+1)               :: yzlev, q2diag, ykmm, ykmn, ykmq
     63    REAL, DIMENSION(knon)                      :: yustar
    6364
    6465    ykmm = 0 !ym missing init
     
    161162       ! Mais ca fait planter le replay.
    162163       ! En attendant une réécriture, on a joute des if (Fredho)
    163        if ( klon>1 .or. (klon==1 .and. knon==1) ) then
     164
     165       if ( klon_glo>1 .or. (klon_glo==1 .and. knon==1) ) then
    164166          CALL ustarhb(knon,klev,knon,yu,yv,ycdragm, yustar)
    165167       endif
     
    171173!   iflag_pbl peut etre utilise comme longuer de melange
    172174       IF (iflag_pbl.GE.31) THEN
    173           if ( klon>1 .or. (klon==1 .and. knon==1) ) then
     175
     176          if ( klon_glo>1 .or. (klon_glo==1 .and. knon==1) ) then
    174177          CALL vdif_kcay(knon,klev,knon,dtime,RG,RD,ypaprs,yt, &
    175178               yzlev,yzlay,yu,yv,yteta, &
     
    236239    INTEGER, INTENT(IN)                      :: knon, nsrf
    237240    REAL, INTENT(IN)                         :: ksta, ksta_ter
    238     REAL, DIMENSION(klon), INTENT(IN)        :: ts
    239     REAL, DIMENSION(klon,klev+1), INTENT(IN) :: paprs
    240     REAL, DIMENSION(klon,klev), INTENT(IN)   :: pplay
    241     REAL, DIMENSION(klon,klev), INTENT(IN)   :: u, v, t, q
    242     REAL, DIMENSION(klon), INTENT(IN)        :: qsurf
    243 
    244     REAL, DIMENSION(klon,klev), INTENT(OUT)  :: pcfm, pcfh
     241    REAL, DIMENSION(knon), INTENT(IN)        :: ts
     242    REAL, DIMENSION(knon,klev+1), INTENT(IN) :: paprs
     243    REAL, DIMENSION(knon,klev), INTENT(IN)   :: pplay
     244    REAL, DIMENSION(knon,klev), INTENT(IN)   :: u, v, t, q
     245    REAL, DIMENSION(knon), INTENT(IN)        :: qsurf
     246
     247    REAL, DIMENSION(knon,klev), INTENT(OUT)  :: pcfm, pcfh
    245248
    246249!
    247250! Local variables:
    248251!
    249     INTEGER, DIMENSION(klon)    :: itop ! numero de couche du sommet de la couche limite
     252    INTEGER, DIMENSION(knon)    :: itop ! numero de couche du sommet de la couche limite
    250253!
    251254! Quelques constantes et options:
     
    278281! Variables locales:
    279282    INTEGER i, k !IM 120704
    280     REAL zgeop(klon,klev)
    281     REAL zmgeom(klon)
    282     REAL zri(klon)
    283     REAL zl2(klon)
     283    REAL zgeop(knon,klev)
     284    REAL zmgeom(knon)
     285    REAL zri(knon)
     286    REAL zl2(knon)
    284287    REAL zdphi, zdu2, ztvd, ztvu, zcdn
    285288    REAL zscf
     
    517520!
    518521    INTEGER, INTENT(IN)                       :: knon, nsrf
    519     REAL, DIMENSION(klon, klev+1), INTENT(IN) ::  paprs
    520     REAL, DIMENSION(klon, klev), INTENT(IN)   ::  pplay
    521     REAL, DIMENSION(klon, klev), INTENT(IN)   :: t(klon,klev)
    522 
    523     REAL, DIMENSION(klon, klev), INTENT(OUT)  :: pcfm, pcfh
     522    REAL, DIMENSION(knon, klev+1), INTENT(IN) ::  paprs
     523    REAL, DIMENSION(knon, klev), INTENT(IN)   ::  pplay
     524    REAL, DIMENSION(knon, klev), INTENT(IN)   :: t(klon,klev)
     525
     526    REAL, DIMENSION(knon, klev), INTENT(OUT)  :: pcfm, pcfh
    524527!
    525528! Quelques constantes et options:
Note: See TracChangeset for help on using the changeset viewer.