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/surf_landice_mod.F90

    r5486 r5868  
    6464!****************************************************************************************
    6565    INTEGER, INTENT(IN)                           :: itime, knon
    66     INTEGER, DIMENSION(klon), INTENT(in)          :: knindex
     66    INTEGER, DIMENSION(knon), INTENT(in)          :: knindex
    6767    REAL, INTENT(in)                              :: dtime
    68     REAL, DIMENSION(klon), INTENT(IN)             :: swnet ! net shortwave radiance
    69     REAL, DIMENSION(klon), INTENT(IN)             :: lwnet ! net longwave radiance
    70     REAL, DIMENSION(klon), INTENT(IN)             :: tsurf
    71     REAL, DIMENSION(klon), INTENT(IN)             :: p1lay
    72     REAL, DIMENSION(klon), INTENT(IN)             :: cdragh, cdragm
    73     REAL, DIMENSION(klon), INTENT(IN)             :: precip_rain, precip_snow, precip_bs
    74     REAL, DIMENSION(klon), INTENT(IN)             :: temp_air, spechum
    75     REAL, DIMENSION(klon), INTENT(IN)             :: AcoefH, AcoefQ
    76     REAL, DIMENSION(klon), INTENT(IN)             :: BcoefH, BcoefQ
    77     REAL, DIMENSION(klon), INTENT(IN)             :: AcoefU, AcoefV, BcoefU, BcoefV
    78     REAL, DIMENSION(klon), INTENT(IN)             :: AcoefQBS, BcoefQBS
    79     REAL, DIMENSION(klon), INTENT(IN)             :: ps
    80     REAL, DIMENSION(klon), INTENT(IN)             :: u1, v1, gustiness, qbs1
    81     REAL, DIMENSION(klon), INTENT(IN)             :: rugoro
     68    REAL, DIMENSION(knon), INTENT(IN)             :: swnet ! net shortwave radiance
     69    REAL, DIMENSION(knon), INTENT(IN)             :: lwnet ! net longwave radiance
     70    REAL, DIMENSION(knon), INTENT(IN)             :: tsurf
     71    REAL, DIMENSION(knon), INTENT(IN)             :: p1lay
     72    REAL, DIMENSION(knon), INTENT(IN)             :: cdragh, cdragm
     73    REAL, DIMENSION(knon), INTENT(IN)             :: precip_rain, precip_snow, precip_bs
     74    REAL, DIMENSION(knon), INTENT(IN)             :: temp_air, spechum
     75    REAL, DIMENSION(knon), INTENT(IN)             :: AcoefH, AcoefQ
     76    REAL, DIMENSION(knon), INTENT(IN)             :: BcoefH, BcoefQ
     77    REAL, DIMENSION(knon), INTENT(IN)             :: AcoefU, AcoefV, BcoefU, BcoefV
     78    REAL, DIMENSION(knon), INTENT(IN)             :: AcoefQBS, BcoefQBS
     79    REAL, DIMENSION(knon), INTENT(IN)             :: ps
     80    REAL, DIMENSION(knon), INTENT(IN)             :: u1, v1, gustiness, qbs1
     81    REAL, DIMENSION(knon), INTENT(IN)             :: rugoro
    8282    REAL, DIMENSION(klon,nbsrf), INTENT(IN)       :: pctsrf
    8383#ifdef ISO
    84     REAL, DIMENSION(ntiso,klon), INTENT(IN)       :: xtprecip_rain, xtprecip_snow
    85     REAL, DIMENSION(ntiso,klon), INTENT(IN)       :: xtspechum
     84    REAL, DIMENSION(ntiso,knon), INTENT(IN)       :: xtprecip_rain, xtprecip_snow
     85    REAL, DIMENSION(ntiso,knon), INTENT(IN)       :: xtspechum
    8686#endif
    8787
     
    9090    LOGICAL,  INTENT(IN)                          :: lafin   !true if last step
    9191    REAL, DIMENSION(klon), INTENT(IN)             :: rlon, rlat
    92     REAL, DIMENSION(klon), INTENT(IN)             :: rmu0
    93     REAL, DIMENSION(klon), INTENT(IN)             :: lwdownm !ylwdown
    94     REAL, DIMENSION(klon), INTENT(IN)             :: albedo  !mean albedo
    95     REAL, DIMENSION(klon), INTENT(IN)             :: pphi1   
    96     REAL, DIMENSION(klon), INTENT(IN)             :: alt   !mean altitude of the grid box 
    97     REAL, DIMENSION(klon), INTENT(IN)             :: slope   !mean slope in grid box 
    98     REAL, DIMENSION(klon), INTENT(IN)             :: cloudf  !total cloud fraction
     92    REAL, DIMENSION(knon), INTENT(IN)             :: rmu0
     93    REAL, DIMENSION(knon), INTENT(IN)             :: lwdownm !ylwdown
     94    REAL, DIMENSION(knon), INTENT(IN)             :: albedo  !mean albedo
     95    REAL, DIMENSION(knon), INTENT(IN)             :: pphi1   
     96    REAL, DIMENSION(knon), INTENT(IN)             :: alt   !mean altitude of the grid box 
     97    REAL, DIMENSION(knon), INTENT(IN)             :: slope   !mean slope in grid box 
     98    REAL, DIMENSION(knon), INTENT(IN)             :: cloudf  !total cloud fraction
    9999
    100100! In/Output variables
    101101!****************************************************************************************
    102     REAL, DIMENSION(klon), INTENT(INOUT)          :: snow, qsol
    103     REAL, DIMENSION(klon), INTENT(INOUT)          :: agesno
    104     REAL, DIMENSION(klon, nsoilmx), INTENT(INOUT) :: tsoil
     102    REAL, DIMENSION(knon), INTENT(INOUT)          :: snow, qsol
     103    REAL, DIMENSION(knon), INTENT(INOUT)          :: agesno
     104    REAL, DIMENSION(knon, nsoilmx), INTENT(INOUT) :: tsoil
    105105#ifdef ISO
    106     REAL, DIMENSION(niso,klon), INTENT(INOUT)     :: xtsnow, xtsol
    107     REAL, DIMENSION(niso,klon), INTENT(INOUT)     :: Rland_ice
     106    REAL, DIMENSION(niso,knon), INTENT(INOUT)     :: xtsnow, xtsol
     107    REAL, DIMENSION(niso,knon), INTENT(INOUT)     :: Rland_ice
    108108#endif
    109109
     
    111111! Output variables
    112112!****************************************************************************************
    113     REAL, DIMENSION(klon), INTENT(OUT)            :: qsurf
    114     REAL, DIMENSION(klon), INTENT(OUT)            :: z0m, z0h
     113    REAL, DIMENSION(knon), INTENT(OUT)            :: qsurf
     114    REAL, DIMENSION(knon), INTENT(OUT)            :: z0m, z0h
    115115!albedo SB >>>
    116116!    REAL, DIMENSION(klon), INTENT(OUT)            :: alb1  ! new albedo in visible SW interval
    117117!    REAL, DIMENSION(klon), INTENT(OUT)            :: alb2  ! new albedo in near IR interval
    118118    REAL, DIMENSION(6), INTENT(IN)                :: SFRWL
    119     REAL, DIMENSION(klon,nsw), INTENT(OUT)        :: alb_dir,alb_dif
     119    REAL, DIMENSION(knon,nsw), INTENT(OUT)        :: alb_dir,alb_dif
    120120!albedo SB <<<
    121     REAL, DIMENSION(klon), INTENT(OUT)            :: evap, fluxsens, fluxlat, icesub_lic
    122     REAL, DIMENSION(klon), INTENT(OUT)            :: fluxbs
    123     REAL, DIMENSION(klon), INTENT(OUT)            :: tsurf_new
    124     REAL, DIMENSION(klon), INTENT(OUT)            :: dflux_s, dflux_l     
    125     REAL, DIMENSION(klon), INTENT(OUT)            :: flux_u1, flux_v1
    126 
    127     REAL, DIMENSION(klon), INTENT(OUT)           :: alb3
    128     REAL, DIMENSION(klon), INTENT(OUT)           :: qsnow   !column water in snow [kg/m2]
    129     REAL, DIMENSION(klon), INTENT(OUT)           :: snowhgt !Snow height (m)
    130     REAL, DIMENSION(klon), INTENT(OUT)           :: to_ice
    131     REAL, DIMENSION(klon), INTENT(OUT)           :: sissnow
    132     REAL, DIMENSION(klon), INTENT(OUT)           :: runoff  !Land ice runoff
     121    REAL, DIMENSION(knon), INTENT(OUT)            :: evap, fluxsens, fluxlat, icesub_lic
     122    REAL, DIMENSION(knon), INTENT(OUT)            :: fluxbs
     123    REAL, DIMENSION(knon), INTENT(OUT)            :: tsurf_new
     124    REAL, DIMENSION(knon), INTENT(OUT)            :: dflux_s, dflux_l     
     125    REAL, DIMENSION(knon), INTENT(OUT)            :: flux_u1, flux_v1
     126
     127    REAL, DIMENSION(knon), INTENT(OUT)           :: alb3
     128    REAL, DIMENSION(knon), INTENT(OUT)           :: qsnow   !column water in snow [kg/m2]
     129    REAL, DIMENSION(knon), INTENT(OUT)           :: snowhgt !Snow height (m)
     130    REAL, DIMENSION(knon), INTENT(OUT)           :: to_ice
     131    REAL, DIMENSION(knon), INTENT(OUT)           :: sissnow
     132    REAL, DIMENSION(knon), INTENT(OUT)           :: runoff  !Land ice runoff
    133133#ifdef ISO
    134     REAL, DIMENSION(ntiso,klon), INTENT(OUT)     :: xtevap     
     134    REAL, DIMENSION(ntiso,knon), INTENT(OUT)     :: xtevap     
    135135#endif
    136136 
     
    138138! Local variables
    139139!****************************************************************************************
    140     REAL, DIMENSION(klon)    :: soilcap, soilflux
    141     REAL, DIMENSION(klon)    :: cal, beta, dif_grnd
    142     REAL, DIMENSION(klon)    :: zfra, alb_neig
    143     REAL, DIMENSION(klon)    :: radsol
    144     REAL, DIMENSION(klon)    :: u0, v0, u1_lay, v1_lay, ustar
     140    REAL, DIMENSION(knon)    :: soilcap, soilflux
     141    REAL, DIMENSION(knon)    :: cal, beta, dif_grnd
     142    REAL, DIMENSION(knon)    :: zfra, alb_neig
     143    REAL, DIMENSION(knon)    :: radsol
     144    REAL, DIMENSION(knon)    :: u0, v0, u1_lay, v1_lay, ustar
    145145    INTEGER                  :: i,j,nt
    146     REAL, DIMENSION(klon)    :: fqfonte,ffonte
    147     REAL, DIMENSION(klon)    :: run_off_lic_frac
     146    REAL, DIMENSION(knon)    :: fqfonte,ffonte
     147    REAL, DIMENSION(knon)    :: run_off_lic_frac
    148148#ifdef ISO       
    149149    REAL, PARAMETER          :: t_coup = 273.15
    150     REAL, DIMENSION(klon)    :: fqfonte_diag
    151     REAL, DIMENSION(klon)    :: fq_fonte_diag
    152     REAL, DIMENSION(klon)    ::  snow_evap_diag
    153     REAL, DIMENSION(klon)    ::  fqcalving_diag
     150    REAL, DIMENSION(knon)    :: fqfonte_diag
     151    REAL, DIMENSION(knon)    :: fq_fonte_diag
     152    REAL, DIMENSION(knon)    ::  snow_evap_diag
     153    REAL, DIMENSION(knon)    ::  fqcalving_diag
    154154    REAL max_eau_sol_diag 
    155     REAL, DIMENSION(klon)    ::  runoff_diag
    156     REAL, DIMENSION(klon)    ::    run_off_lic_diag
     155    REAL, DIMENSION(knon)    ::  runoff_diag
     156    REAL, DIMENSION(knon)    ::    run_off_lic_diag
    157157    REAL                     ::  coeff_rel_diag
    158158    INTEGER                  :: ixt
    159     REAL, DIMENSION(niso,klon) :: xtsnow_prec,xtsol_prec
    160     REAL, DIMENSION(klon) :: snow_prec,qsol_prec
    161 #endif
    162 
    163 
    164     REAL, DIMENSION(klon)    :: emis_new                  !Emissivity
    165     REAL, DIMENSION(klon)    :: swdown,lwdown
    166     REAL, DIMENSION(klon)    :: precip_snow_adv, snow_adv !Snow Drift precip./advection (not used in inlandsis)
    167     REAL, DIMENSION(klon)    :: erod                      !erosion of surface snow (flux, kg/m2/s like evap)
    168     REAL, DIMENSION(klon)    :: zsl_height, wind_velo     !surface layer height, wind spd
    169     REAL, DIMENSION(klon)    :: dens_air,  snow_cont_air  !air density; snow content air
    170     REAL, DIMENSION(klon)    :: alb_soil                  !albedo of underlying ice
    171     REAL, DIMENSION(klon)    :: pexner                    !Exner potential
     159    REAL, DIMENSION(niso,knon) :: xtsnow_prec,xtsol_prec
     160    REAL, DIMENSION(knon) :: snow_prec,qsol_prec
     161#endif
     162
     163
     164    REAL, DIMENSION(knon)    :: emis_new                  !Emissivity
     165    REAL, DIMENSION(knon)    :: swdown,lwdown
     166    REAL, DIMENSION(knon)    :: precip_snow_adv, snow_adv !Snow Drift precip./advection (not used in inlandsis)
     167    REAL, DIMENSION(knon)    :: erod                      !erosion of surface snow (flux, kg/m2/s like evap)
     168    REAL, DIMENSION(knon)    :: zsl_height, wind_velo     !surface layer height, wind spd
     169    REAL, DIMENSION(knon)    :: dens_air,  snow_cont_air  !air density; snow content air
     170    REAL, DIMENSION(knon)    :: alb_soil                  !albedo of underlying ice
     171    REAL, DIMENSION(knon)    :: pexner                    !Exner potential
    172172    REAL                     :: pref
    173     REAL, DIMENSION(klon,nsoilmx) :: tsoil0               !modif
     173    REAL, DIMENSION(knon,nsoilmx) :: tsoil0               !modif
    174174    REAL                          :: dtis                ! subtimestep
    175175    LOGICAL                       :: debut_is, lafin_is  ! debut and lafin for inlandsis
     
    179179
    180180
    181     REAL,DIMENSION(klon) :: alb1,alb2
     181    REAL,DIMENSION(knon) :: alb1,alb2
    182182    REAL                 :: time_tempsmooth,coef_tempsmooth
    183     REAL,DIMENSION(klon) :: precip_totsnow, evap_totsnow
    184     REAL, DIMENSION (klon,6) :: alb6
     183    REAL,DIMENSION(knon) :: precip_totsnow, evap_totsnow
     184    REAL, DIMENSION (knon,6) :: alb6
    185185    REAL                   :: esalt
    186186    REAL                   :: lambdasalt,fluxsalt, csalt, nunu, aa, bb, cc
    187187    REAL                   :: tau_dens, maxerosion
    188     REAL, DIMENSION(klon)  :: ws1, rhod, rhos, ustart0, ustart, qsalt, hsalt
    189     REAL, DIMENSION(klon)  :: fluxbs_1, fluxbs_2, bsweight_fresh
    190     LOGICAL, DIMENSION(klon) :: ok_remaining_freshsnow
     188    REAL, DIMENSION(knon)  :: ws1, rhod, rhos, ustart0, ustart, qsalt, hsalt
     189    REAL, DIMENSION(knon)  :: fluxbs_1, fluxbs_2, bsweight_fresh
     190    LOGICAL, DIMENSION(knon) :: ok_remaining_freshsnow
    191191    REAL  :: ta1, ta2, ta3, z01, z02, z03, coefa, coefb, coefc, coefd
    192192
     
    528528       ! we now compute the snow age of the overlying layer (snow surface after erosion of the fresh snow accumulated during the time step)
    529529       ! this is done through the routine albsno
    530        CALL albsno(klon,knon,dtime,agesno(:),alb_neig(:), precip_snow(:)+fluxbs_1(:))
     530       CALL albsno(knon,knon,dtime,agesno(:),alb_neig(:), precip_snow(:)+fluxbs_1(:))
    531531
    532532       ! 2nd step:
     
    586586  else ! not ok_bs
    587587  ! those lines are useful to calculate the snow age
    588        CALL albsno(klon,knon,dtime,agesno(:),alb_neig(:), precip_snow(:))
     588       CALL albsno(knon,knon,dtime,agesno(:),alb_neig(:), precip_snow(:))
    589589
    590590  endif ! if ok_bs
     
    625625#endif
    626626
    627     CALL calcul_iso_surf_lic_vectall(klon,knon, &
     627    CALL calcul_iso_surf_lic_vectall(knon,knon, &
    628628     &    evap,snow_evap_diag,Tsurf_new,snow, &
    629629     &    fq_fonte_diag,fqfonte_diag,dtime,t_coup, &
     
    664664    runoff(1:knon)=run_off_lic(1:knon)/dtime
    665665
    666        snow_o=0.
    667        zfra_o = 0.
     666!ym WARNING snow_o, zfrac_o => en klon !!!
     667!ym init to 0 at allocation
     668!       snow_o=0.
     669!       zfra_o = 0.
    668670       DO j = 1, knon
    669671           i = knindex(j)
Note: See TracChangeset for help on using the changeset viewer.