Ignore:
Timestamp:
Dec 17, 2025, 7:33:39 PM (3 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.

merge of commit r5868

YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/libf/phylmd/surf_ocean_mod.F90

    r5662 r5942  
    5050USE limit_read_mod
    5151    USE config_ocean_skin_m, ONLY: activate_ocean_skin
     52    USE lmdz_checksum
    5253    !
    5354    ! This subroutine will make a call to ocean_XXX_noice according to the ocean mode (force,
     
    6364    !******************************************************************************
    6465    INTEGER, INTENT(IN)                      :: itime, jour, knon
    65     INTEGER, DIMENSION(klon), INTENT(IN)     :: knindex
     66    INTEGER, DIMENSION(knon), INTENT(IN)     :: knindex
    6667    REAL, INTENT(IN)                         :: dtime
    6768    REAL, DIMENSION(klon), INTENT(IN)        :: rlon, rlat
    68     REAL, DIMENSION(klon), INTENT(IN)        :: swnet  ! net shortwave radiation at surface 
    69     REAL, DIMENSION(klon), INTENT(IN)        :: lwnet  ! net longwave radiation at surface 
    70     REAL, DIMENSION(klon), INTENT(IN)        :: alb1   ! albedo in visible SW interval
    71     REAL, DIMENSION(klon), INTENT(IN)        :: windsp ! wind at 10 m, in m s-1
     69    REAL, DIMENSION(knon), INTENT(IN)        :: swnet  ! net shortwave radiation at surface 
     70    REAL, DIMENSION(knon), INTENT(IN)        :: lwnet  ! net longwave radiation at surface 
     71    REAL, DIMENSION(knon), INTENT(IN)        :: alb1   ! albedo in visible SW interval
     72    REAL, DIMENSION(knon), INTENT(IN)        :: windsp ! wind at 10 m, in m s-1
    7273    REAL, DIMENSION(klon), INTENT(IN)        :: rmu0 
    73     REAL, DIMENSION(klon), INTENT(IN)        :: fder
    74     REAL, DIMENSION(klon), INTENT(IN)        :: tsurf_in     ! defined only for subscripts 1:knon
    75     REAL, DIMENSION(klon), INTENT(IN)        :: p1lay,z1lay ! pression (Pa) et altitude (m) du premier niveau
    76     REAL, DIMENSION(klon), INTENT(IN)        :: cdragh
    77     REAL, DIMENSION(klon), INTENT(IN)        :: cdragm
    78     REAL, DIMENSION(klon), INTENT(IN)        :: precip_rain, precip_snow, precip_bs
    79     REAL, DIMENSION(klon), INTENT(IN)        :: temp_air, spechum
    80     REAL, DIMENSION(klon), INTENT(IN)        :: AcoefH, AcoefQ, BcoefH, BcoefQ
    81     REAL, DIMENSION(klon), INTENT(IN)        :: AcoefU, AcoefV, BcoefU, BcoefV
    82     REAL, DIMENSION(klon), INTENT(IN)        :: ps
    83     REAL, DIMENSION(klon), INTENT(IN)        :: u1, v1, gustiness
    84     REAL, DIMENSION(klon), INTENT(IN)        :: rugoro
     74    REAL, DIMENSION(knon), INTENT(IN)        :: fder
     75    REAL, DIMENSION(knon), INTENT(IN)        :: tsurf_in     ! defined only for subscripts 1:knon
     76    REAL, DIMENSION(knon), INTENT(IN)        :: p1lay,z1lay ! pression (Pa) et altitude (m) du premier niveau
     77    REAL, DIMENSION(knon), INTENT(IN)        :: cdragh
     78    REAL, DIMENSION(knon), INTENT(IN)        :: cdragm
     79    REAL, DIMENSION(knon), INTENT(IN)        :: precip_rain, precip_snow, precip_bs
     80    REAL, DIMENSION(knon), INTENT(IN)        :: temp_air, spechum
     81    REAL, DIMENSION(knon), INTENT(IN)        :: AcoefH, AcoefQ, BcoefH, BcoefQ
     82    REAL, DIMENSION(knon), INTENT(IN)        :: AcoefU, AcoefV, BcoefU, BcoefV
     83    REAL, DIMENSION(knon), INTENT(IN)        :: ps
     84    REAL, DIMENSION(knon), INTENT(IN)        :: u1, v1, gustiness
     85    REAL, DIMENSION(knon), INTENT(IN)        :: rugoro
    8586    REAL, DIMENSION(klon,nbsrf), INTENT(IN)  :: pctsrf
    8687#ifdef ISO
    87     REAL, DIMENSION(ntraciso,klon), INTENT(IN) :: xtprecip_rain, xtprecip_snow
    88     REAL, DIMENSION(ntraciso,klon), INTENT(IN) :: xtspechum
     88    REAL, DIMENSION(ntraciso,knon), INTENT(IN) :: xtprecip_rain, xtprecip_snow
     89    REAL, DIMENSION(ntraciso,knon), INTENT(IN) :: xtspechum
    8990#endif
    9091
    9192    ! In/Output variables
    9293    !******************************************************************************
    93     REAL, DIMENSION(klon), INTENT(INOUT)     :: snow
    94     REAL, DIMENSION(klon), INTENT(INOUT)     :: qsurf
    95     REAL, DIMENSION(klon), INTENT(INOUT)     :: agesno
    96     REAL, DIMENSION(klon), INTENT(inOUT)     :: z0h
    97 #ifdef ISO
    98     REAL, DIMENSION(niso,klon), INTENT(IN)   :: xtsnow
    99     REAL, DIMENSION(niso,klon), INTENT(INOUT):: Roce 
    100 #endif
    101 
    102     REAL, intent(inout):: delta_sst(:) ! (knon)
     94    REAL, DIMENSION(knon), INTENT(INOUT)     :: snow
     95    REAL, DIMENSION(knon), INTENT(INOUT)     :: qsurf
     96    REAL, DIMENSION(knon), INTENT(INOUT)     :: agesno
     97    REAL, DIMENSION(knon), INTENT(inOUT)     :: z0h
     98#ifdef ISO
     99    REAL, DIMENSION(niso,knon), INTENT(IN)   :: xtsnow
     100    REAL, DIMENSION(niso,knon), INTENT(INOUT):: Roce 
     101#endif
     102
     103    REAL, intent(inout):: delta_sst(knon) ! (knon)
    103104    ! Ocean-air interface temperature minus bulk SST, in K. Defined
    104105    ! only if activate_ocean_skin >= 1.
    105106
    106     real, intent(inout):: delta_sal(:) ! (knon)
     107    real, intent(inout):: delta_sal(knon) ! (knon)
    107108    ! Ocean-air interface salinity minus bulk salinity, in ppt. Defined
    108109    ! only if activate_ocean_skin >= 1.
    109110
    110     REAL, intent(inout):: ds_ns(:) ! (knon)
     111    REAL, intent(inout):: ds_ns(knon) ! (knon)
    111112    ! "delta salinity near surface". Salinity variation in the
    112113    ! near-surface turbulent layer. That is subskin salinity minus
    113114    ! foundation salinity. In ppt.
    114115
    115     REAL, intent(inout):: dt_ns(:) ! (knon)
     116    REAL, intent(inout):: dt_ns(knon) ! (knon)
    116117    ! "delta temperature near surface". Temperature variation in the
    117118    ! near-surface turbulent layer. That is subskin temperature
    118119    ! minus foundation temperature. (Can be negative.) In K.
    119120
    120     REAL, intent(inout):: dter(:) ! (knon)
     121    REAL, intent(inout):: dter(knon) ! (knon)
    121122    ! Temperature variation in the diffusive microlayer, that is
    122123    ! ocean-air interface temperature minus subskin temperature. In
    123124    ! K.
    124125
    125     REAL, intent(inout):: dser(:) ! (knon)
     126    REAL, intent(inout):: dser(knon) ! (knon)
    126127    ! Salinity variation in the diffusive microlayer, that is
    127128    ! ocean-air interface salinity minus subskin salinity. In ppt.
    128129
    129     real, intent(inout):: dt_ds(:) ! (knon)
     130    real, intent(inout):: dt_ds(knon) ! (knon)
    130131    ! (tks / tkt) * dTer, in K
    131132
    132133!GG
    133     REAL, DIMENSION(klon), INTENT(IN)        :: dthetadz300
    134     REAL, DIMENSION(klon), INTENT(OUT)        :: Ampl
     134    REAL, DIMENSION(knon), INTENT(IN)        :: dthetadz300
     135    REAL, DIMENSION(knon), INTENT(OUT)        :: Ampl
    135136!
    136137
    137138    ! Output variables
    138139    !**************************************************************************
    139     REAL, DIMENSION(klon), INTENT(OUT)       :: z0m
     140    REAL, DIMENSION(knon), INTENT(OUT)       :: z0m
    140141    !albedo SB >>>
    141142    !    REAL, DIMENSION(klon), INTENT(OUT)  :: alb1_new  ! new albedo in visible SW interval
    142143    !    REAL, DIMENSION(klon), INTENT(OUT)  :: alb2_new  ! new albedo in near IR interval
    143144    REAL, DIMENSION(6), INTENT(IN)           :: SFRWL
    144     REAL, DIMENSION(klon,nsw), INTENT(OUT)   :: alb_dir_new,alb_dif_new
     145    REAL, DIMENSION(knon,nsw), INTENT(OUT)   :: alb_dir_new,alb_dif_new
    145146    !albedo SB <<<     
    146     REAL, DIMENSION(klon), INTENT(OUT)       :: evap, fluxsens, fluxlat
    147     REAL, DIMENSION(klon), INTENT(OUT)       :: tsurf_new    ! sea surface temperature, in K
    148     REAL, DIMENSION(klon), INTENT(OUT)       :: dflux_s, dflux_l     
    149     REAL, DIMENSION(klon), INTENT(OUT)       :: lmt_bils
    150     REAL, DIMENSION(klon), INTENT(OUT)       :: flux_u1, flux_v1
    151 
    152     REAL, intent(out):: tkt(:) ! (knon)
     147    REAL, DIMENSION(knon), INTENT(OUT)       :: evap, fluxsens, fluxlat
     148    REAL, DIMENSION(knon), INTENT(OUT)       :: tsurf_new    ! sea surface temperature, in K
     149    REAL, DIMENSION(knon), INTENT(OUT)       :: dflux_s, dflux_l     
     150    REAL, DIMENSION(klon), INTENT(OUT)       :: lmt_bils ! ==> YM : warning variable en klon !!!
     151    REAL, DIMENSION(knon), INTENT(OUT)       :: flux_u1, flux_v1
     152
     153    REAL, intent(out):: tkt(knon) ! (knon)
    153154    ! �paisseur (m) de la couche de diffusion thermique (microlayer)
    154155    ! cool skin thickness
    155156
    156     REAL, intent(out):: tks(:) ! (knon)
     157    REAL, intent(out):: tks(knon) ! (knon)
    157158    ! �paisseur (m) de la couche de diffusion de masse (microlayer)
    158159
    159     REAL, intent(out):: taur(:) ! (knon)
     160    REAL, intent(out):: taur(knon) ! (knon)
    160161    ! momentum flux due to rain, in Pa
    161162
    162     real, intent(out):: sss(:) ! (klon)
     163    real, intent(out):: sss(knon) ! (klon)
    163164    ! Bulk salinity of the surface layer of the ocean, in ppt. (Only
    164165    ! defined for subscripts 1:knon, but we have to declare it with
     
    166167
    167168#ifdef ISO
    168     REAL, DIMENSION(ntraciso,klon), INTENT(out) :: xtevap ! isotopes in surface evaporation flux
    169     REAL, DIMENSION(klon), INTENT(out)          :: h1 ! just a diagnostic, not useful for the simulation   
     169    REAL, DIMENSION(ntraciso,knon), INTENT(out) :: xtevap ! isotopes in surface evaporation flux
     170    REAL, DIMENSION(knon), INTENT(out)          :: h1 ! just a diagnostic, not useful for the simulation   
    170171#endif
    171172
     
    175176    REAL                  :: tmp
    176177    REAL, PARAMETER       :: cepdu2=(0.1)**2
    177     REAL, DIMENSION(klon) :: alb_eau, z0_lim
    178     REAL, DIMENSION(klon) :: radsol
    179     REAL, DIMENSION(klon) :: cdragq ! Cdrag pour l'evaporation
    180     REAL, DIMENSION(klon) :: precip_totsnow
     178    REAL, DIMENSION(knon) :: alb_eau, z0_lim
     179    REAL, DIMENSION(knon) :: radsol
     180    REAL, DIMENSION(knon) :: cdragq ! Cdrag pour l'evaporation
     181    REAL, DIMENSION(knon) :: precip_totsnow
    181182    CHARACTER(len=20),PARAMETER :: modname="surf_ocean"
    182183    REAL rhoa(knon) ! density of moist air  (kg / m3)
     
    185186    REAL t_int(knon) ! ocean-air interface temperature, in K
    186187    REAL s_int(knon) ! ocean-air interface salinity, in ppt
    187 
     188    REAL, DIMENSION(knon) :: yrlat ! compressed latitude
    188189    !**************************************************************************
    189190
     
    207208    !
    208209    !******************************************************************************
    209     radsol(1:klon) = 0.0 ! initialisation a priori inutile
     210!ym    radsol(1:klon) = 0.0 ! initialisation a priori inutile
    210211    radsol(1:knon) = swnet(1:knon) + lwnet(1:knon)
    211212
     
    293294    !******************************************************************************
    294295    IF (type_ocean.NE.'slab') THEN
    295        lmt_bils(1:klon)=0.
     296!ym warning uncompressed variable ==> klon
     297!ym initialised outside       lmt_bils(1:klon)=0.
     298!ym better to do diag outside in future
    296299       DO i=1,knon
    297300          lmt_bils(knindex(i))=(swnet(i)+lwnet(i)+fluxsens(i)+fluxlat(i)) &
     
    309312       IF (iflag_cycle_diurne.GE.1) THEN
    310313          !
    311           CALL alboc_cd(rmu0,alb_eau)
     314          CALL alboc_cd(knon, rmu0,alb_eau)
    312315          !
    313316          !--ad-hoc correction for model radiative balance tuning
    314317          !--now outside alboc_cd routine
    315           alb_eau(1:klon) = fmagic*alb_eau(1:klon) + pmagic
    316           alb_eau(1:klon)=MIN(MAX(alb_eau(1:klon),0.0),1.0)
     318          alb_eau(1:knon) = fmagic*alb_eau(1:knon) + pmagic
     319          alb_eau(1:knon)=MIN(MAX(alb_eau(1:knon),0.0),1.0)
    317320          !
    318321       ELSE
    319322          !
    320           CALL alboc(REAL(jour),rlat,alb_eau)
     323          DO i =1, knon
     324            yrlat(i) = rlat(knindex(i))
     325          ENDDO
     326
     327          CALL alboc(knon, REAL(jour), yrlat, alb_eau)
    321328          !--ad-hoc correction for model radiative balance tuning
    322329          !--now outside alboc routine
    323           alb_eau(1:klon) = fmagic*alb_eau(1:klon) + pmagic
    324           alb_eau(1:klon)=MIN(MAX(alb_eau(1:klon),0.04),0.60)
     330          alb_eau(1:knon) = fmagic*alb_eau(1:knon) + pmagic
     331          alb_eau(1:knon)=MIN(MAX(alb_eau(1:knon),0.04),0.60)
    325332          !
    326333       ENDIF
     
    328335       DO i =1, knon
    329336          DO  k=1,nsw
    330              alb_dir_new(i,k) = alb_eau(knindex(i))
     337             alb_dir_new(i,k) = alb_eau(i)
    331338          ENDDO
    332339       ENDDO
     
    340347       !--albedo for direct and diffuse radiation are different
    341348       !
     349       CALL checksum("yalb_dir_new_ocean",alb_dir_new(1:knon,:))
    342350       CALL ocean_albedo(knon,rmu0,knindex,windsp,SFRWL,alb_dir_new,alb_dif_new)
     351       CALL checksum("yalb_dir_new_ocean",alb_dir_new(1:knon,:))
     352
    343353       !
    344354       !--ad-hoc correction for model radiative balance tuning
     
    391401
    392402    if (activate_ocean_skin >= 1) then
     403!ym not porting to GPU for now     
    393404       if (type_ocean /= 'couple') sss(:knon) = 35.
    394405       call bulk_flux(tkt, tks, taur, dter, dser, t_int, s_int, ds_ns, dt_ns, &
Note: See TracChangeset for help on using the changeset viewer.