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

    r5654 r5868  
    548548!*************************************************************************************
    549549    INTEGER, INTENT(IN)                     :: knon
    550     INTEGER, DIMENSION(klon), INTENT(IN)    :: knindex
     550    INTEGER, DIMENSION(knon), INTENT(IN)    :: knindex
    551551
    552552! Output arguments
    553553!*************************************************************************************
    554     REAL, DIMENSION(klon), INTENT(OUT)      :: tsurf_new
    555 
    556     REAL, INTENT(OUT):: sss(:) ! (klon)
     554    REAL, DIMENSION(knon), INTENT(OUT)      :: tsurf_new
     555
     556    REAL, INTENT(OUT):: sss(knon) ! (klon)
    557557    ! bulk salinity of the surface layer of the ocean, in ppt
    558558
    559     REAL, DIMENSION(klon), INTENT(OUT)      :: u0_new
    560     REAL, DIMENSION(klon), INTENT(OUT)      :: v0_new
     559    REAL, DIMENSION(knon), INTENT(OUT)      :: u0_new
     560    REAL, DIMENSION(knon), INTENT(OUT)      :: v0_new
    561561
    562562! Local variables
    563563!*************************************************************************************
    564564    INTEGER                  :: i
    565     INTEGER, DIMENSION(klon) :: index
    566     REAL, DIMENSION(klon)    :: sic_new
     565    REAL, DIMENSION(knon)    :: sic_new
     566    REAL, DIMENSION(knon)    :: co2
    567567
    568568!*************************************************************************************
     
    582582!*************************************************************************************
    583583    IF (carbon_cycle_cpl) THEN
    584        DO i=1,klon
    585           index(i)=i
    586        ENDDO
    587        CALL cpl2gath(read_co2, fco2_ocn_day, klon, index)
     584      CALL cpl2gath(read_co2, co2, knon, knindex)
     585      DO i=1,knon
     586        fco2_ocn_day(knindex(i)) = co2(i)
     587      ENDDO       
    588588    ENDIF
    589589
     
    615615!*************************************************************************************
    616616    INTEGER, INTENT(IN)                     :: knon
    617     INTEGER, DIMENSION(klon), INTENT(IN)    :: knindex
     617    INTEGER, DIMENSION(knon), INTENT(IN)    :: knindex
    618618
    619619! Output arguments
    620620!*************************************************************************************
    621     REAL, DIMENSION(klon), INTENT(OUT)      :: tsurf_new
    622     REAL, DIMENSION(klon), INTENT(OUT)      :: alb_new
    623     REAL, DIMENSION(klon), INTENT(OUT)      :: u0_new
    624     REAL, DIMENSION(klon), INTENT(OUT)      :: v0_new
     621    REAL, DIMENSION(knon), INTENT(OUT)      :: tsurf_new
     622    REAL, DIMENSION(knon), INTENT(OUT)      :: alb_new
     623    REAL, DIMENSION(knon), INTENT(OUT)      :: u0_new
     624    REAL, DIMENSION(knon), INTENT(OUT)      :: v0_new
    625625
    626626! Local variables
    627627!*************************************************************************************
    628628    INTEGER               :: i
    629     REAL, DIMENSION(klon) :: sic_new
     629    REAL, DIMENSION(knon) :: sic_new
    630630
    631631!*************************************************************************************
     
    677677    INTEGER, INTENT(IN)                     :: itime
    678678    INTEGER, INTENT(IN)                     :: knon
    679     INTEGER, DIMENSION(klon), INTENT(IN)    :: knindex
    680     REAL, DIMENSION(klon), INTENT(IN)       :: swdown, lwdown
    681     REAL, DIMENSION(klon), INTENT(IN)       :: fluxlat, fluxsens
    682     REAL, DIMENSION(klon), INTENT(IN)       :: precip_rain, precip_snow
    683     REAL, DIMENSION(klon), INTENT(IN)       :: evap, tsurf, fder, albsol
    684     REAL, DIMENSION(klon), INTENT(IN)       :: taux, tauy, windsp
    685     REAL, INTENT(IN):: sens_prec_liq(:), sens_prec_sol(:) ! (knon)
    686     REAL, DIMENSION(klon), INTENT(IN)       :: lat_prec_liq, lat_prec_sol
    687    
    688     REAL, intent(in):: delta_sst(:) ! (knon)
     679    INTEGER, DIMENSION(knon), INTENT(IN)    :: knindex
     680    REAL, DIMENSION(knon), INTENT(IN)       :: swdown, lwdown
     681    REAL, DIMENSION(knon), INTENT(IN)       :: fluxlat, fluxsens
     682    REAL, DIMENSION(knon), INTENT(IN)       :: precip_rain, precip_snow
     683    REAL, DIMENSION(knon), INTENT(IN)       :: evap, tsurf, fder, albsol
     684    REAL, DIMENSION(knon), INTENT(IN)       :: taux, tauy, windsp
     685    REAL, INTENT(IN):: sens_prec_liq(knon), sens_prec_sol(knon) ! (knon)
     686    REAL, DIMENSION(knon), INTENT(IN)       :: lat_prec_liq, lat_prec_sol
     687   
     688    REAL, intent(in):: delta_sst(knon) ! (knon)
    689689    ! Ocean-air interface temperature minus bulk SST, in
    690690    ! K. Defined only if activate_ocean_skin >= 1.
    691691
    692     real, intent(in):: delta_sal(:) ! (knon)
     692    real, intent(in):: delta_sal(knon) ! (knon)
    693693    ! Ocean-air interface salinity minus bulk salinity, in ppt.
    694694
    695     REAL, intent(in):: dter(:) ! (knon)
     695    REAL, intent(in):: dter(knon) ! (knon)
    696696    ! Temperature variation in the diffusive microlayer, that is
    697697    ! ocean-air interface temperature minus subskin temperature. In
    698698    ! K.
    699699
    700     REAL, intent(in):: dser(:) ! (knon)
     700    REAL, intent(in):: dser(knon) ! (knon)
    701701    ! Salinity variation in the diffusive microlayer, that is
    702702    ! ocean-air interface salinity minus subskin salinity. In ppt.
    703703
    704     real, intent(in):: dt_ds(:) ! (knon)
     704    real, intent(in):: dt_ds(knon) ! (knon)
    705705    ! (tks / tkt) * dTer, in K
    706706
     
    857857       
    858858
    859        CALL gath2cpl(cpl_sols(:,cpl_index), cpl_sols2D(:,:,cpl_index), &
    860             knon, knindex)
    861 
    862        CALL gath2cpl(cpl_nsol(:,cpl_index), cpl_nsol2D(:,:,cpl_index), &
    863             knon, knindex)
    864 
    865        CALL gath2cpl(cpl_rain(:,cpl_index), cpl_rain2D(:,:,cpl_index), &
    866             knon, knindex)
    867 
    868        CALL gath2cpl(cpl_snow(:,cpl_index), cpl_snow2D(:,:,cpl_index), &
    869             knon, knindex)
    870 
    871        CALL gath2cpl(cpl_evap(:,cpl_index), cpl_evap2D(:,:,cpl_index), &
     859       CALL gath2cpl(cpl_sols(1:knon,cpl_index), cpl_sols2D(:,:,cpl_index), &
     860            knon, knindex)
     861
     862       CALL gath2cpl(cpl_nsol(1:knon,cpl_index), cpl_nsol2D(:,:,cpl_index), &
     863            knon, knindex)
     864
     865       CALL gath2cpl(cpl_rain(1:knon,cpl_index), cpl_rain2D(:,:,cpl_index), &
     866            knon, knindex)
     867
     868       CALL gath2cpl(cpl_snow(1:knon,cpl_index), cpl_snow2D(:,:,cpl_index), &
     869            knon, knindex)
     870
     871       CALL gath2cpl(cpl_evap(1:knon,cpl_index), cpl_evap2D(:,:,cpl_index), &
    872872            knon, knindex)
    873873
    874874! cpl_tsol2D(:,:,:) not used!
    875        CALL gath2cpl(cpl_tsol(:,cpl_index), cpl_tsol2D(:,:, cpl_index), &
     875       CALL gath2cpl(cpl_tsol(1:knon,cpl_index), cpl_tsol2D(:,:, cpl_index), &
    876876            knon, knindex)
    877877
    878878! cpl_fder2D(:,:,1) not used, only cpl_fder(:,:,2)!
    879        CALL gath2cpl(cpl_fder(:,cpl_index), cpl_fder2D(:,:,cpl_index), &
     879       CALL gath2cpl(cpl_fder(1:knon,cpl_index), cpl_fder2D(:,:,cpl_index), &
    880880            knon, knindex)
    881881
    882882! cpl_albe2D(:,:,:) not used!
    883        CALL gath2cpl(cpl_albe(:,cpl_index), cpl_albe2D(:,:,cpl_index), &
    884             knon, knindex)
    885 
    886        CALL gath2cpl(cpl_taux(:,cpl_index), cpl_taux2D(:,:,cpl_index), &
    887             knon, knindex)
    888 
    889        CALL gath2cpl(cpl_tauy(:,cpl_index), cpl_tauy2D(:,:,cpl_index), &
    890             knon, knindex)
    891 
    892        CALL gath2cpl(cpl_windsp(:,cpl_index), cpl_windsp2D(:,:), &
    893             knon, knindex)
    894 
    895        CALL gath2cpl(cpl_sens_rain(:,cpl_index), cpl_sens_rain2D(:,:,cpl_index), &
    896             knon, knindex)
    897 
    898        CALL gath2cpl(cpl_sens_snow(:,cpl_index), cpl_sens_snow2D(:,:,cpl_index), &
    899             knon, knindex)
    900 
    901        CALL gath2cpl(cpl_taumod(:,cpl_index), cpl_taumod2D(:,:,cpl_index), &
     883       CALL gath2cpl(cpl_albe(1:knon,cpl_index), cpl_albe2D(:,:,cpl_index), &
     884            knon, knindex)
     885
     886       CALL gath2cpl(cpl_taux(1:knon,cpl_index), cpl_taux2D(:,:,cpl_index), &
     887            knon, knindex)
     888
     889       CALL gath2cpl(cpl_tauy(1:knon,cpl_index), cpl_tauy2D(:,:,cpl_index), &
     890            knon, knindex)
     891
     892       CALL gath2cpl(cpl_windsp(1:knon,cpl_index), cpl_windsp2D(:,:), &
     893            knon, knindex)
     894
     895       CALL gath2cpl(cpl_sens_rain(1:knon,cpl_index), cpl_sens_rain2D(:,:,cpl_index), &
     896            knon, knindex)
     897
     898       CALL gath2cpl(cpl_sens_snow(1:knon,cpl_index), cpl_sens_snow2D(:,:,cpl_index), &
     899            knon, knindex)
     900
     901       CALL gath2cpl(cpl_taumod(1:knon,cpl_index), cpl_taumod2D(:,:,cpl_index), &
    902902            knon, knindex)
    903903
    904904       IF (carbon_cycle_cpl) &
    905             CALL gath2cpl(cpl_atm_co2(:,cpl_index), cpl_atm_co22D(:,:), knon, knindex)
     905            CALL gath2cpl(cpl_atm_co2(1:knon,cpl_index), cpl_atm_co22D(:,:), knon, knindex)
    906906       if (activate_ocean_skin == 2) then
    907           CALL gath2cpl(cpl_delta_sst, cpl_delta_sst_2D, knon, knindex)
    908           CALL gath2cpl(cpl_delta_sal, cpl_delta_sal_2D, knon, knindex)
    909           CALL gath2cpl(cpl_dter, cpl_dter_2D, knon, knindex)
    910           CALL gath2cpl(cpl_dser, cpl_dser_2D, knon, knindex)
    911           CALL gath2cpl(cpl_dt_ds, cpl_dt_ds_2D, knon, knindex)
     907          CALL gath2cpl(cpl_delta_sst(1:knon), cpl_delta_sst_2D, knon, knindex)
     908          CALL gath2cpl(cpl_delta_sal(1:knon), cpl_delta_sal_2D, knon, knindex)
     909          CALL gath2cpl(cpl_dter(1:knon), cpl_dter_2D, knon, knindex)
     910          CALL gath2cpl(cpl_dser(1:knon), cpl_dser_2D, knon, knindex)
     911          CALL gath2cpl(cpl_dt_ds(1:knon), cpl_dt_ds_2D, knon, knindex)
    912912       end if
    913913    ENDIF
     
    938938    INTEGER, INTENT(IN)                     :: itime
    939939    INTEGER, INTENT(IN)                     :: knon
    940     INTEGER, DIMENSION(klon), INTENT(IN)    :: knindex
     940    INTEGER, DIMENSION(knon), INTENT(IN)    :: knindex
    941941    REAL, INTENT(IN)                        :: dtime
    942942    REAL, DIMENSION(klon), INTENT(IN)       :: rlon, rlat
    943     REAL, DIMENSION(klon), INTENT(IN)       :: swdown, lwdown
    944     REAL, DIMENSION(klon), INTENT(IN)       :: fluxlat, fluxsens
    945     REAL, DIMENSION(klon), INTENT(IN)       :: precip_rain, precip_snow
    946     REAL, DIMENSION(klon), INTENT(IN)       :: evap, tsurf, fder
    947     REAL, DIMENSION(klon), INTENT(IN)       :: albsol, taux, tauy
     943    REAL, DIMENSION(knon), INTENT(IN)       :: swdown, lwdown
     944    REAL, DIMENSION(knon), INTENT(IN)       :: fluxlat, fluxsens
     945    REAL, DIMENSION(knon), INTENT(IN)       :: precip_rain, precip_snow
     946    REAL, DIMENSION(knon), INTENT(IN)       :: evap, tsurf, fder
     947    REAL, DIMENSION(knon), INTENT(IN)       :: albsol, taux, tauy
    948948    REAL, DIMENSION(klon,nbsrf), INTENT(IN) :: pctsrf
    949     REAL, INTENT(IN):: sens_prec_liq(:), sens_prec_sol(:) ! (knon)
    950     REAL, DIMENSION(klon), INTENT(IN)       :: lat_prec_liq, lat_prec_sol
     949    REAL, INTENT(IN):: sens_prec_liq(knon), sens_prec_sol(knon) ! (knon)
     950    REAL, DIMENSION(knon), INTENT(IN)       :: lat_prec_liq, lat_prec_sol
    951951    LOGICAL, INTENT(IN)                     :: lafin
    952952
     
    957957    CHARACTER(len = 25)                     :: modname = 'cpl_send_seaice_fields'
    958958    CHARACTER(len = 80)                     :: abort_message
    959     REAL, DIMENSION(klon)                   :: cpl_fder_tmp
     959    REAL, DIMENSION(klon)                   :: cpl_fder_tmp !ym warning, uncompressed
    960960
    961961!*************************************************************************************
     
    10671067       ENDIF
    10681068
    1069        CALL gath2cpl(cpl_sols(:,cpl_index), cpl_sols2D(:,:,cpl_index), &
    1070             knon, knindex)
    1071 
    1072        CALL gath2cpl(cpl_nsol(:,cpl_index), cpl_nsol2D(:,:,cpl_index), &
    1073             knon, knindex)
    1074 
    1075        CALL gath2cpl(cpl_rain(:,cpl_index), cpl_rain2D(:,:,cpl_index), &
    1076             knon, knindex)
    1077 
    1078        CALL gath2cpl(cpl_snow(:,cpl_index), cpl_snow2D(:,:,cpl_index), &
    1079             knon, knindex)
    1080 
    1081        CALL gath2cpl(cpl_evap(:,cpl_index), cpl_evap2D(:,:,cpl_index), &
     1069       CALL gath2cpl(cpl_sols(1:knon,cpl_index), cpl_sols2D(:,:,cpl_index), &
     1070            knon, knindex)
     1071
     1072       CALL gath2cpl(cpl_nsol(1:knon,cpl_index), cpl_nsol2D(:,:,cpl_index), &
     1073            knon, knindex)
     1074
     1075       CALL gath2cpl(cpl_rain(1:knon,cpl_index), cpl_rain2D(:,:,cpl_index), &
     1076            knon, knindex)
     1077
     1078       CALL gath2cpl(cpl_snow(1:knon,cpl_index), cpl_snow2D(:,:,cpl_index), &
     1079            knon, knindex)
     1080
     1081       CALL gath2cpl(cpl_evap(1:knon,cpl_index), cpl_evap2D(:,:,cpl_index), &
    10821082            knon, knindex)
    10831083
    10841084! cpl_tsol2D(:,:,:) not used!
    1085        CALL gath2cpl(cpl_tsol(:,cpl_index), cpl_tsol2D(:,:, cpl_index), &
     1085       CALL gath2cpl(cpl_tsol(1:knon,cpl_index), cpl_tsol2D(:,:, cpl_index), &
    10861086            knon, knindex)
    10871087
    10881088       ! Set default value and decompress before gath2cpl
    1089        cpl_fder_tmp(:) = -20.
     1089       cpl_fder_tmp(1:klon) = -20.
    10901090       DO ig = 1, knon
    10911091          cpl_fder_tmp(knindex(ig))=cpl_fder(ig,cpl_index)
    10921092       ENDDO
    1093        CALL gath2cpl(cpl_fder_tmp(:), cpl_fder2D(:,:,cpl_index), &
     1093       CALL gath2cpl(cpl_fder_tmp(1:klon), cpl_fder2D(:,:,cpl_index), &
    10941094            klon, unity)
    10951095
    10961096! cpl_albe2D(:,:,:) not used!
    1097        CALL gath2cpl(cpl_albe(:,cpl_index), cpl_albe2D(:,:,cpl_index), &
    1098             knon, knindex)
    1099 
    1100        CALL gath2cpl(cpl_taux(:,cpl_index), cpl_taux2D(:,:,cpl_index), &
    1101             knon, knindex)
    1102 
    1103        CALL gath2cpl(cpl_tauy(:,cpl_index), cpl_tauy2D(:,:,cpl_index), &
    1104             knon, knindex)
    1105 
    1106        CALL gath2cpl(cpl_sens_rain(:,cpl_index), cpl_sens_rain2D(:,:,cpl_index), &
    1107             knon, knindex)
    1108 
    1109        CALL gath2cpl(cpl_sens_snow(:,cpl_index), cpl_sens_snow2D(:,:,cpl_index), &
    1110             knon, knindex)
    1111 
    1112        CALL gath2cpl(cpl_taumod(:,cpl_index), cpl_taumod2D(:,:,cpl_index), &
     1097       CALL gath2cpl(cpl_albe(1:knon,cpl_index), cpl_albe2D(:,:,cpl_index), &
     1098            knon, knindex)
     1099
     1100       CALL gath2cpl(cpl_taux(1:knon,cpl_index), cpl_taux2D(:,:,cpl_index), &
     1101            knon, knindex)
     1102
     1103       CALL gath2cpl(cpl_tauy(1:knon,cpl_index), cpl_tauy2D(:,:,cpl_index), &
     1104            knon, knindex)
     1105
     1106       CALL gath2cpl(cpl_sens_rain(1:knon,cpl_index), cpl_sens_rain2D(:,:,cpl_index), &
     1107            knon, knindex)
     1108
     1109       CALL gath2cpl(cpl_sens_snow(1:knon,cpl_index), cpl_sens_snow2D(:,:,cpl_index), &
     1110            knon, knindex)
     1111
     1112       CALL gath2cpl(cpl_taumod(1:knon,cpl_index), cpl_taumod2D(:,:,cpl_index), &
    11131113            knon, knindex)
    11141114
     
    11361136    INTEGER, INTENT(IN)                       :: itime
    11371137    INTEGER, INTENT(IN)                       :: knon
    1138     INTEGER, DIMENSION(klon), INTENT(IN)      :: knindex
    1139     REAL, DIMENSION(klon), INTENT(IN)         :: rriv_in
    1140     REAL, DIMENSION(klon), INTENT(IN)         :: rcoa_in
     1138    INTEGER, DIMENSION(knon), INTENT(IN)      :: knindex
     1139    REAL, DIMENSION(knon), INTENT(IN)         :: rriv_in
     1140    REAL, DIMENSION(knon), INTENT(IN)         :: rcoa_in
    11411141
    11421142! Local variables
     
    11951195    INTEGER, INTENT(IN)                       :: itime
    11961196    INTEGER, INTENT(IN)                       :: knon
    1197     INTEGER, DIMENSION(klon), INTENT(IN)      :: knindex
    1198     REAL, DIMENSION(klon), INTENT(IN)         :: rlic_in
    1199     REAL, DIMENSION(klon), INTENT(IN)         :: rlic_in_frac  ! Fraction for continental ice, can be equal to
     1197    INTEGER, DIMENSION(knon), INTENT(IN)      :: knindex
     1198    REAL, DIMENSION(knon), INTENT(IN)         :: rlic_in
     1199    REAL, DIMENSION(knon), INTENT(IN)         :: rlic_in_frac  ! Fraction for continental ice, can be equal to
    12001200                                                               ! pctsrf(:,is_lic) or not, depending on landice_opt
    12011201   
     
    15771577    INTEGER, INTENT(IN)                       :: knon
    15781578    REAL, DIMENSION(nbp_lon,jj_nb), INTENT(IN)    :: champ_in
    1579     INTEGER, DIMENSION(klon), INTENT(IN)      :: knindex
     1579    INTEGER, DIMENSION(knon), INTENT(IN)      :: knindex
    15801580
    15811581! Output
     
    16261626!*************************************************************************************
    16271627    INTEGER, INTENT(IN)                    :: knon
    1628     REAL, DIMENSION(klon), INTENT(IN)      :: champ_in
    1629     INTEGER, DIMENSION(klon), INTENT(IN)   :: knindex
     1628    REAL, DIMENSION(knon), INTENT(IN)      :: champ_in
     1629    INTEGER, DIMENSION(knon), INTENT(IN)   :: knindex
    16301630
    16311631! Output arguments
Note: See TracChangeset for help on using the changeset viewer.