Ignore:
Timestamp:
Nov 17, 2025, 3:50:06 PM (8 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/ocean_slab_mod.f90

    r5662 r5868  
    372372    INTEGER, INTENT(IN)                  :: jour  ! day in year (for Q-Flux)
    373373    INTEGER, INTENT(IN)                  :: knon  ! number of points
    374     INTEGER, DIMENSION(klon), INTENT(IN) :: knindex
     374    INTEGER, DIMENSION(knon), INTENT(IN) :: knindex
    375375    REAL, INTENT(IN) :: dtime  ! timestep (s)
    376     REAL, DIMENSION(klon), INTENT(IN)    :: p1lay
    377     REAL, DIMENSION(klon), INTENT(IN)    :: cdragh, cdragq, cdragm
     376    REAL, DIMENSION(knon), INTENT(IN)    :: p1lay
     377    REAL, DIMENSION(knon), INTENT(IN)    :: cdragh, cdragq, cdragm
    378378    ! drag coefficients
    379     REAL, DIMENSION(klon), INTENT(IN)    :: precip_rain, precip_snow
    380     REAL, DIMENSION(klon), INTENT(IN)    :: temp_air, spechum ! near surface T, q
    381     REAL, DIMENSION(klon), INTENT(IN)    :: AcoefH, AcoefQ, BcoefH, BcoefQ
    382     REAL, DIMENSION(klon), INTENT(IN)    :: AcoefU, AcoefV, BcoefU, BcoefV
     379    REAL, DIMENSION(knon), INTENT(IN)    :: precip_rain, precip_snow
     380    REAL, DIMENSION(knon), INTENT(IN)    :: temp_air, spechum ! near surface T, q
     381    REAL, DIMENSION(knon), INTENT(IN)    :: AcoefH, AcoefQ, BcoefH, BcoefQ
     382    REAL, DIMENSION(knon), INTENT(IN)    :: AcoefU, AcoefV, BcoefU, BcoefV
    383383    ! exchange coefficients for boundary layer scheme
    384     REAL, DIMENSION(klon), INTENT(IN)    :: ps  ! surface pressure
    385     REAL, DIMENSION(klon), INTENT(IN)    :: u1, v1, gustiness ! surface wind
    386     REAL, DIMENSION(klon), INTENT(IN)    :: tsurf_in ! surface temperature
    387     REAL, DIMENSION(klon), INTENT(INOUT) :: radsol ! net surface radiative flux
     384    REAL, DIMENSION(knon), INTENT(IN)    :: ps  ! surface pressure
     385    REAL, DIMENSION(knon), INTENT(IN)    :: u1, v1, gustiness ! surface wind
     386    REAL, DIMENSION(knon), INTENT(IN)    :: tsurf_in ! surface temperature
     387    REAL, DIMENSION(knon), INTENT(INOUT) :: radsol ! net surface radiative flux
    388388
    389389! In/Output arguments
    390390!************************************************************************************
    391     REAL, DIMENSION(klon), INTENT(INOUT) :: snow ! in kg/m2
     391    REAL, DIMENSION(knon), INTENT(INOUT) :: snow ! in kg/m2
    392392   
    393393! Output arguments
    394394!************************************************************************************
    395     REAL, DIMENSION(klon), INTENT(OUT)   :: qsurf
    396     REAL, DIMENSION(klon), INTENT(OUT)   :: evap, fluxsens, fluxlat
    397     REAL, DIMENSION(klon), INTENT(OUT)   :: flux_u1, flux_v1
    398     REAL, DIMENSION(klon), INTENT(OUT)   :: tsurf_new ! new surface tempearture
    399     REAL, DIMENSION(klon), INTENT(OUT)   :: dflux_s, dflux_l     
    400     REAL, DIMENSION(klon), INTENT(OUT)   :: slab_bils
     395    REAL, DIMENSION(knon), INTENT(OUT)   :: qsurf
     396    REAL, DIMENSION(knon), INTENT(OUT)   :: evap, fluxsens, fluxlat
     397    REAL, DIMENSION(knon), INTENT(OUT)   :: flux_u1, flux_v1
     398    REAL, DIMENSION(knon), INTENT(OUT)   :: tsurf_new ! new surface tempearture
     399    REAL, DIMENSION(knon), INTENT(OUT)   :: dflux_s, dflux_l     
     400    REAL, DIMENSION(klon), INTENT(OUT)   :: slab_bils !ym ==> WARNING slab_bils stay with klon size
    401401
    402402! Local variables
     
    405405    REAL                  :: t_cadj
    406406    !  for surface heat fluxes
    407     REAL, DIMENSION(klon) :: cal, beta, dif_grnd
     407    REAL, DIMENSION(knon) :: cal, beta, dif_grnd
    408408    ! for Q-Flux computation: d/dt SST, d/dt ice volume (kg/m2), surf fluxes
    409409    REAL, DIMENSION(klon) :: diff_sst, diff_siv
    410410    REAL, DIMENSION(klon,nslay) :: lmt_bils
    411411    ! for surface wind stress
    412     REAL, DIMENSION(klon) :: u0, v0
    413     REAL, DIMENSION(klon) :: u1_lay, v1_lay
     412    REAL, DIMENSION(knon) :: u0, v0
     413    REAL, DIMENSION(knon) :: u1_lay, v1_lay
    414414    ! for new ice creation
    415415    REAL                  :: e_freeze, h_new, dfsic
     
    450450! save total cumulated heat fluxes locally
    451451! radiative + turbulent + melt of falling snow
    452     slab_bils(:)=0.
     452    slab_bils(1:klon)=0.
    453453    DO i=1,knon
    454454        ki=knindex(i)
     
    698698!****************************************************************************************
    699699    INTEGER, INTENT(IN)                  :: itime, jour, knon
    700     INTEGER, DIMENSION(klon), INTENT(IN) :: knindex
     700    INTEGER, DIMENSION(knon), INTENT(IN) :: knindex
    701701    REAL, INTENT(IN)                     :: dtime
    702     REAL, DIMENSION(klon), INTENT(IN)    :: tsurf_in
    703     REAL, DIMENSION(klon), INTENT(IN)    :: p1lay
    704     REAL, DIMENSION(klon), INTENT(IN)    :: cdragh, cdragm
    705     REAL, DIMENSION(klon), INTENT(IN)    :: precip_rain, precip_snow
    706     REAL, DIMENSION(klon), INTENT(IN)    :: temp_air, spechum
    707     REAL, DIMENSION(klon), INTENT(IN)    :: AcoefH, AcoefQ, BcoefH, BcoefQ
    708     REAL, DIMENSION(klon), INTENT(IN)    :: AcoefU, AcoefV, BcoefU, BcoefV
    709     REAL, DIMENSION(klon), INTENT(IN)    :: ps
    710     REAL, DIMENSION(klon), INTENT(IN)    :: u1, v1, gustiness
    711     REAL, DIMENSION(klon), INTENT(IN)    :: swnet
     702    REAL, DIMENSION(knon), INTENT(IN)    :: tsurf_in
     703    REAL, DIMENSION(knon), INTENT(IN)    :: p1lay
     704    REAL, DIMENSION(knon), INTENT(IN)    :: cdragh, cdragm
     705    REAL, DIMENSION(knon), INTENT(IN)    :: precip_rain, precip_snow
     706    REAL, DIMENSION(knon), INTENT(IN)    :: temp_air, spechum
     707    REAL, DIMENSION(knon), INTENT(IN)    :: AcoefH, AcoefQ, BcoefH, BcoefQ
     708    REAL, DIMENSION(knon), INTENT(IN)    :: AcoefU, AcoefV, BcoefU, BcoefV
     709    REAL, DIMENSION(knon), INTENT(IN)    :: ps
     710    REAL, DIMENSION(knon), INTENT(IN)    :: u1, v1, gustiness
     711    REAL, DIMENSION(knon), INTENT(IN)    :: swnet
    712712
    713713! In/Output arguments
    714714!****************************************************************************************
    715     REAL, DIMENSION(klon), INTENT(INOUT)          :: snow, qsol
    716     REAL, DIMENSION(klon), INTENT(INOUT)          :: agesno
    717     REAL, DIMENSION(klon), INTENT(INOUT)          :: radsol
     715    REAL, DIMENSION(knon), INTENT(INOUT)          :: snow, qsol
     716    REAL, DIMENSION(knon), INTENT(INOUT)          :: agesno
     717    REAL, DIMENSION(knon), INTENT(INOUT)          :: radsol
    718718
    719719! Output arguments
    720720!****************************************************************************************
    721     REAL, DIMENSION(klon), INTENT(OUT)            :: qsurf
    722     REAL, DIMENSION(klon), INTENT(OUT)            :: alb1_new  ! new albedo in visible SW interval
    723     REAL, DIMENSION(klon), INTENT(OUT)            :: alb2_new  ! new albedo in near IR interval
    724     REAL, DIMENSION(klon), INTENT(OUT)            :: evap, fluxsens, fluxlat
    725     REAL, DIMENSION(klon), INTENT(OUT)            :: flux_u1, flux_v1
    726     REAL, DIMENSION(klon), INTENT(OUT)            :: tsurf_new
    727     REAL, DIMENSION(klon), INTENT(OUT)            :: dflux_s, dflux_l
     721    REAL, DIMENSION(knon), INTENT(OUT)            :: qsurf
     722    REAL, DIMENSION(knon), INTENT(OUT)            :: alb1_new  ! new albedo in visible SW interval
     723    REAL, DIMENSION(knon), INTENT(OUT)            :: alb2_new  ! new albedo in near IR interval
     724    REAL, DIMENSION(knon), INTENT(OUT)            :: evap, fluxsens, fluxlat
     725    REAL, DIMENSION(knon), INTENT(OUT)            :: flux_u1, flux_v1
     726    REAL, DIMENSION(knon), INTENT(OUT)            :: tsurf_new
     727    REAL, DIMENSION(knon), INTENT(OUT)            :: dflux_s, dflux_l
    728728
    729729! Local variables
    730730!****************************************************************************************
    731731    INTEGER               :: i,ki
    732     REAL, DIMENSION(klon) :: cal, beta, dif_grnd
    733     REAL, DIMENSION(klon) :: u0, v0
    734     REAL, DIMENSION(klon) :: u1_lay, v1_lay
     732    REAL, DIMENSION(knon) :: cal, beta, dif_grnd
     733    REAL, DIMENSION(knon) :: u0, v0
     734    REAL, DIMENSION(knon) :: u1_lay, v1_lay
    735735    ! intermediate heat fluxes:
    736736    REAL                  :: f_cond, f_swpen
Note: See TracChangeset for help on using the changeset viewer.