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

    r5296 r5868  
    7373!****************************************************************************************
    7474!
    75   SUBROUTINE climb_wind_down(knon, dtime, coef_in, pplay, paprs, temp, delp, u_old, v_old, &
     75  SUBROUTINE climb_wind_down(knon, ni, dtime, coef_in, pplay, paprs, temp, delp, u_old, v_old, &
    7676!!! nrlmd le 02/05/2011
    7777       Ccoef_U_out, Ccoef_V_out, Dcoef_U_out, Dcoef_V_out, &
     
    9090!****************************************************************************************
    9191    INTEGER, INTENT(IN)                      :: knon
     92    INTEGER, INTENT(IN)                      :: ni(knon)
    9293    REAL, INTENT(IN)                         :: dtime
    93     REAL, DIMENSION(klon,klev), INTENT(IN)   :: coef_in
    94     REAL, DIMENSION(klon,klev), INTENT(IN)   :: pplay ! pres au milieu de couche (Pa)
    95     REAL, DIMENSION(klon,klev+1), INTENT(IN) :: paprs ! pression a inter-couche (Pa)
    96     REAL, DIMENSION(klon,klev), INTENT(IN)   :: temp  ! temperature
    97     REAL, DIMENSION(klon,klev), INTENT(IN)   :: delp
    98     REAL, DIMENSION(klon,klev), INTENT(IN)   :: u_old
    99     REAL, DIMENSION(klon,klev), INTENT(IN)   :: v_old
     94    REAL, DIMENSION(knon,klev), INTENT(IN)   :: coef_in
     95    REAL, DIMENSION(knon,klev), INTENT(IN)   :: pplay ! pres au milieu de couche (Pa)
     96    REAL, DIMENSION(knon,klev+1), INTENT(IN) :: paprs ! pression a inter-couche (Pa)
     97    REAL, DIMENSION(knon,klev), INTENT(IN)   :: temp  ! temperature
     98    REAL, DIMENSION(knon,klev), INTENT(IN)   :: delp
     99    REAL, DIMENSION(knon,klev), INTENT(IN)   :: u_old
     100    REAL, DIMENSION(knon,klev), INTENT(IN)   :: v_old
    100101
    101102! Output arguments
    102103!****************************************************************************************
    103     REAL, DIMENSION(klon), INTENT(OUT)       :: Acoef_U_out
    104     REAL, DIMENSION(klon), INTENT(OUT)       :: Acoef_V_out
    105     REAL, DIMENSION(klon), INTENT(OUT)       :: Bcoef_U_out
    106     REAL, DIMENSION(klon), INTENT(OUT)       :: Bcoef_V_out
    107 
    108 !!! nrlmd le 02/05/2011
    109     REAL, DIMENSION(klon,klev), INTENT(OUT)  :: Ccoef_U_out
    110     REAL, DIMENSION(klon,klev), INTENT(OUT)  :: Ccoef_V_out
    111     REAL, DIMENSION(klon,klev), INTENT(OUT)  :: Dcoef_U_out
    112     REAL, DIMENSION(klon,klev), INTENT(OUT)  :: Dcoef_V_out
    113     REAL, DIMENSION(klon,klev), INTENT(OUT)  :: Kcoef_m_out
    114     REAL, DIMENSION(klon), INTENT(OUT)       :: alf_1_out
    115     REAL, DIMENSION(klon), INTENT(OUT)       :: alf_2_out
     104    REAL, DIMENSION(knon), INTENT(OUT)       :: Acoef_U_out
     105    REAL, DIMENSION(knon), INTENT(OUT)       :: Acoef_V_out
     106    REAL, DIMENSION(knon), INTENT(OUT)       :: Bcoef_U_out
     107    REAL, DIMENSION(knon), INTENT(OUT)       :: Bcoef_V_out
     108
     109!!! nrlmd le 02/05/2011
     110    REAL, DIMENSION(knon,klev), INTENT(OUT)  :: Ccoef_U_out
     111    REAL, DIMENSION(knon,klev), INTENT(OUT)  :: Ccoef_V_out
     112    REAL, DIMENSION(knon,klev), INTENT(OUT)  :: Dcoef_U_out
     113    REAL, DIMENSION(knon,klev), INTENT(OUT)  :: Dcoef_V_out
     114    REAL, DIMENSION(knon,klev), INTENT(OUT)  :: Kcoef_m_out
     115    REAL, DIMENSION(knon), INTENT(OUT)       :: alf_1_out
     116    REAL, DIMENSION(knon), INTENT(OUT)       :: alf_2_out
    116117!!!
    117118
    118119! Local variables
    119120!****************************************************************************************
    120     REAL, DIMENSION(klon)                    :: u1lay, v1lay
    121     INTEGER                                  :: k, i
     121    REAL :: yalf1(knon)
     122    REAL :: yalf2(knon)
     123    REAL :: yKcoefm(knon,klev)
     124    REAL :: yCcoef_U(knon,klev)
     125    REAL :: yDcoef_U(knon,klev)
     126    REAL :: yCcoef_V(knon,klev)
     127    REAL :: yDcoef_V(knon,klev)
     128    REAL :: yAcoef_U(knon), yBcoef_U(knon), yAcoef_V(knon), yBcoef_V(knon)
     129
     130    REAL, DIMENSION(knon)                    :: u1lay, v1lay
     131    INTEGER                                  :: k, i, j
     132
    122133!****************************************************************************************
    123134! Initialize module
     
    129140!****************************************************************************************
    130141! - Define alpha (alf1 and alf2)
    131     alf1(:) = 1.0
    132     alf2(:) = 1.0 - alf1(:)
     142    yalf1(:) = 1.0
     143    yalf2(:) = 1.0 - yalf1(:)
    133144
    134145! - Calculate the coefficients K
    135     Kcoefm(:,:) = 0.0
     146    yKcoefm(:,:) = 0.0
    136147    DO k = 2, klev
    137148       DO i=1,knon
    138           Kcoefm(i,k) = coef_in(i,k)*RG*RG*dtime/(pplay(i,k-1)-pplay(i,k)) &
     149          yKcoefm(i,k) = coef_in(i,k)*RG*RG*dtime/(pplay(i,k-1)-pplay(i,k)) &
    139150               *(paprs(i,k)*2/(temp(i,k)+temp(i,k-1))/RD)**2
    140151       END DO
     
    142153
    143154! - Calculate the coefficients C and D, component "u"
    144     CALL calc_coef(knon, Kcoefm(:,:), delp(:,:), &
    145          u_old(:,:), alf1(:), alf2(:),  &
    146          Ccoef_U(:,:), Dcoef_U(:,:), Acoef_U(:), Bcoef_U(:))
     155    CALL calc_coef(knon, yKcoefm(:,:), delp(:,:), &
     156         u_old(:,:), yalf1(:), yalf2(:),  &
     157         yCcoef_U(:,:), yDcoef_U(:,:), yAcoef_U(:), yBcoef_U(:))
    147158
    148159! - Calculate the coefficients C and D, component "v"
    149     CALL calc_coef(knon, Kcoefm(:,:), delp(:,:), &
    150          v_old(:,:), alf1(:), alf2(:),  &
    151          Ccoef_V(:,:), Dcoef_V(:,:), Acoef_V(:), Bcoef_V(:))
     160    CALL calc_coef(knon, yKcoefm(:,:), delp(:,:), &
     161         v_old(:,:), yalf1(:), yalf2(:),  &
     162         yCcoef_V(:,:), yDcoef_V(:,:), yAcoef_V(:), yBcoef_V(:))
    152163
    153164!****************************************************************************************
     
    156167!
    157168!****************************************************************************************
    158     Acoef_U_out = Acoef_U
    159     Bcoef_U_out = Bcoef_U
    160     Acoef_V_out = Acoef_V
    161     Bcoef_V_out = Bcoef_V
     169    Acoef_U_out = yAcoef_U
     170    Bcoef_U_out = yBcoef_U
     171    Acoef_V_out = yAcoef_V
     172    Bcoef_V_out = yBcoef_V
    162173
    163174!****************************************************************************************
     
    171182!!! nrlmd le 02/05/2011
    172183    DO k= 1, klev
    173       DO i= 1, klon
    174         Ccoef_U_out(i,k) = Ccoef_U(i,k)
    175         Ccoef_V_out(i,k) = Ccoef_V(i,k)
    176         Dcoef_U_out(i,k) = Dcoef_U(i,k)
    177         Dcoef_V_out(i,k) = Dcoef_V(i,k)
    178         Kcoef_m_out(i,k) = Kcoefm(i,k)
     184      DO i= 1, knon
     185        Ccoef_U_out(i,k) = yCcoef_U(i,k)
     186        Ccoef_V_out(i,k) = yCcoef_V(i,k)
     187        Dcoef_U_out(i,k) = yDcoef_U(i,k)
     188        Dcoef_V_out(i,k) = yDcoef_V(i,k)
     189        Kcoef_m_out(i,k) = yKcoefm(i,k)
    179190      ENDDO
    180191    ENDDO
    181     DO i= 1, klon
    182       alf_1_out(i)   = alf1(i)
    183       alf_2_out(i)   = alf2(i)
     192    DO i= 1, knon
     193      alf_1_out(i)   = yalf1(i)
     194      alf_2_out(i)   = yalf2(i)
    184195    ENDDO
    185196!!!     
    186197       ENDIF  ! (mod(iflag_pbl_split,2) .ge.1)
    187198!!!
    188 
     199    DO j= 1, knon
     200      i=ni(j)
     201      Acoef_U(i) = yAcoef_U(j)
     202      Bcoef_U(i) = yBcoef_U(j)
     203      Acoef_V(i) = yAcoef_V(j)
     204      Bcoef_V(i) = yBcoef_V(j)
     205    ENDDO
     206
     207    DO k= 1, klev
     208      DO j= 1, knon
     209        i=ni(j)
     210        Ccoef_U(i,k) = yCcoef_U(j,k)
     211        Ccoef_V(i,k) = yCcoef_V(j,k)
     212        Dcoef_U(i,k) = yDcoef_U(j,k)
     213        Dcoef_V(i,k) = yDcoef_V(j,k)
     214        Kcoefm(i,k) = yKcoefm(j,k)
     215        alf1(i)   = yalf1(j)
     216        alf2(i)   = yalf2(j)
     217      ENDDO
     218    ENDDO
    189219  END SUBROUTINE climb_wind_down
    190220!
     
    198228!****************************************************************************************
    199229    INTEGER, INTENT(IN)                      :: knon
    200     REAL, DIMENSION(klon,klev), INTENT(IN)   :: Kcoef, delp
    201     REAL, DIMENSION(klon,klev), INTENT(IN)   :: X
    202     REAL, DIMENSION(klon), INTENT(IN)        :: alfa1, alfa2
     230    REAL, DIMENSION(knon,klev), INTENT(IN)   :: Kcoef, delp
     231    REAL, DIMENSION(knon,klev), INTENT(IN)   :: X
     232    REAL, DIMENSION(knon), INTENT(IN)        :: alfa1, alfa2
    203233
    204234! Output arguments
    205235!****************************************************************************************
    206     REAL, DIMENSION(klon), INTENT(OUT)       :: Acoef, Bcoef
    207     REAL, DIMENSION(klon,klev), INTENT(OUT)  :: Ccoef, Dcoef
     236    REAL, DIMENSION(knon), INTENT(OUT)       :: Acoef, Bcoef
     237    REAL, DIMENSION(knon,klev), INTENT(OUT)  :: Ccoef, Dcoef
    208238 
    209239! local variables
    210240!****************************************************************************************
    211     INTEGER                                  :: k, i
     241    INTEGER                                  :: k, i, j
    212242    REAL                                     :: buf
    213243    !****************************************************************************************
     
    252282!
    253283
    254   SUBROUTINE climb_wind_up(knon, dtime, u_old, v_old, flx_u1, flx_v1,  &
     284  SUBROUTINE climb_wind_up(knon, ni, dtime, u_old, v_old, flx_u1, flx_v1,  &
    255285!!! nrlmd le 02/05/2011
    256286       Acoef_U_in, Acoef_V_in, Bcoef_U_in, Bcoef_V_in, &
     
    273303!****************************************************************************************
    274304    INTEGER, INTENT(IN)                     :: knon
     305    INTEGER, INTENT(IN)                     :: ni(knon)
    275306    REAL, INTENT(IN)                        :: dtime
    276     REAL, DIMENSION(klon,klev), INTENT(IN)  :: u_old
    277     REAL, DIMENSION(klon,klev), INTENT(IN)  :: v_old
    278     REAL, DIMENSION(klon), INTENT(IN)       :: flx_u1, flx_v1 ! momentum flux
    279 
    280 !!! nrlmd le 02/05/2011
    281     REAL, DIMENSION(klon), INTENT(IN)       :: Acoef_U_in,Acoef_V_in, Bcoef_U_in, Bcoef_V_in
    282     REAL, DIMENSION(klon,klev), INTENT(IN)  :: Ccoef_U_in, Ccoef_V_in, Dcoef_U_in, Dcoef_V_in
    283     REAL, DIMENSION(klon,klev), INTENT(IN)  :: Kcoef_m_in
     307    REAL, DIMENSION(knon,klev), INTENT(IN)  :: u_old
     308    REAL, DIMENSION(knon,klev), INTENT(IN)  :: v_old
     309    REAL, DIMENSION(knon), INTENT(IN)       :: flx_u1, flx_v1 ! momentum flux
     310
     311!!! nrlmd le 02/05/2011
     312    REAL, DIMENSION(knon), INTENT(IN)       :: Acoef_U_in,Acoef_V_in, Bcoef_U_in, Bcoef_V_in
     313    REAL, DIMENSION(knon,klev), INTENT(IN)  :: Ccoef_U_in, Ccoef_V_in, Dcoef_U_in, Dcoef_V_in
     314    REAL, DIMENSION(knon,klev), INTENT(IN)  :: Kcoef_m_in
    284315!!!
    285316
    286317! Output arguments
    287318!****************************************************************************************
    288     REAL, DIMENSION(klon,klev), INTENT(OUT) :: flx_u_new, flx_v_new
    289     REAL, DIMENSION(klon,klev), INTENT(OUT) :: d_u_new, d_v_new
     319    REAL, DIMENSION(knon,klev), INTENT(OUT) :: flx_u_new, flx_v_new
     320    REAL, DIMENSION(knon,klev), INTENT(OUT) :: d_u_new, d_v_new
    290321
    291322! Local variables
    292323!****************************************************************************************
    293     REAL, DIMENSION(klon,klev)              :: u_new, v_new
    294     INTEGER                                 :: k, i
     324    REAL :: yalf1(knon)
     325    REAL :: yalf2(knon)
     326    REAL :: yKcoefm(knon,klev)
     327    REAL :: yCcoef_U(knon,klev)
     328    REAL :: yDcoef_U(knon,klev)
     329    REAL :: yCcoef_V(knon,klev)
     330    REAL :: yDcoef_V(knon,klev)
     331    REAL :: yAcoef_U(knon), yBcoef_U(knon), yAcoef_V(knon), yBcoef_V(knon)
     332
     333    REAL, DIMENSION(knon,klev)              :: u_new, v_new
     334    INTEGER                                 :: k, i, j
    295335!****************************************************************************************
    296336
     
    300340!!! nrlmd le 02/05/2011
    301341    DO i = 1, knon
    302       Acoef_U(i)=Acoef_U_in(i)
    303       Acoef_V(i)=Acoef_V_in(i)
    304       Bcoef_U(i)=Bcoef_U_in(i)
    305       Bcoef_V(i)=Bcoef_V_in(i)
     342      yAcoef_U(i)=Acoef_U_in(i)
     343      yAcoef_V(i)=Acoef_V_in(i)
     344      yBcoef_U(i)=Bcoef_U_in(i)
     345      yBcoef_V(i)=Bcoef_V_in(i)
    306346    ENDDO
    307347    DO k = 1, klev
    308348      DO i = 1, knon
    309         Ccoef_U(i,k)=Ccoef_U_in(i,k)
    310         Ccoef_V(i,k)=Ccoef_V_in(i,k)
    311         Dcoef_U(i,k)=Dcoef_U_in(i,k)
    312         Dcoef_V(i,k)=Dcoef_V_in(i,k)
    313         Kcoefm(i,k)=Kcoef_m_in(i,k)
     349        yCcoef_U(i,k)=Ccoef_U_in(i,k)
     350        yCcoef_V(i,k)=Ccoef_V_in(i,k)
     351        yDcoef_U(i,k)=Dcoef_U_in(i,k)
     352        yDcoef_V(i,k)=Dcoef_V_in(i,k)
     353        yKcoefm(i,k)=Kcoef_m_in(i,k)
    314354      ENDDO
    315355    ENDDO
     356   ELSE
     357    DO j = 1, knon
     358      i=ni(j)
     359      yAcoef_U(j)=Acoef_U(i)
     360      yAcoef_V(j)=Acoef_V(i)
     361      yBcoef_U(j)=Bcoef_U(i)
     362      yBcoef_V(j)=Bcoef_V(i)
     363    ENDDO
     364    DO k = 1, klev
     365      DO j = 1, knon
     366        i=ni(j)
     367        yCcoef_U(j,k)=Ccoef_U(i,k)
     368        yCcoef_V(j,k)=Ccoef_V(i,k)
     369        yDcoef_U(j,k)=Dcoef_U(i,k)
     370        yDcoef_V(j,k)=Dcoef_V(i,k)
     371        yKcoefm(j,k)=Kcoefm(i,k)
     372      ENDDO
     373    ENDDO   
    316374!!!
    317375       ENDIF  ! (mod(iflag_pbl_split,2) .ge.1)
     
    320378! Niveau 1
    321379    DO i = 1, knon
    322        u_new(i,1) = Acoef_U(i) + Bcoef_U(i)*flx_u1(i)*dtime
    323        v_new(i,1) = Acoef_V(i) + Bcoef_V(i)*flx_v1(i)*dtime
     380       u_new(i,1) = yAcoef_U(i) + yBcoef_U(i)*flx_u1(i)*dtime
     381       v_new(i,1) = yAcoef_V(i) + yBcoef_V(i)*flx_v1(i)*dtime
    324382    END DO
    325383
     
    327385    DO k = 2, klev
    328386       DO i=1, knon
    329           u_new(i,k) = Ccoef_U(i,k) + Dcoef_U(i,k) * u_new(i,k-1)
    330           v_new(i,k) = Ccoef_V(i,k) + Dcoef_V(i,k) * v_new(i,k-1)
     387          u_new(i,k) = yCcoef_U(i,k) + yDcoef_U(i,k) * u_new(i,k-1)
     388          v_new(i,k) = yCcoef_V(i,k) + yDcoef_V(i,k) * v_new(i,k-1)
    331389       END DO
    332390    END DO
     
    349407    DO k = 2, klev
    350408       DO i = 1, knon
    351           flx_u_new(i,k) = Kcoefm(i,k)/RG/dtime * &
     409          flx_u_new(i,k) = yKcoefm(i,k)/RG/dtime * &
    352410               (u_new(i,k)-u_new(i,k-1))
    353411         
    354           flx_v_new(i,k) = Kcoefm(i,k)/RG/dtime * &
     412          flx_v_new(i,k) = yKcoefm(i,k)/RG/dtime * &
    355413               (v_new(i,k)-v_new(i,k-1))
    356414       END DO
     
    370428    END DO
    371429
     430    DO j = 1, knon
     431      i=ni(j)
     432      Acoef_U(i)=yAcoef_U(j)
     433      Acoef_V(i)=yAcoef_V(j)
     434      Bcoef_U(i)=yBcoef_U(j)
     435      Bcoef_V(i)=yBcoef_V(j)
     436    ENDDO
     437
     438    DO k = 1, klev
     439      DO j = 1, knon
     440        i=ni(j)
     441        Ccoef_U(i,k) = yCcoef_U(j,k)
     442        Ccoef_V(i,k) = yCcoef_V(j,k)
     443        Dcoef_U(i,k) = yDcoef_U(j,k)
     444        Dcoef_V(i,k) = yDcoef_V(j,k)
     445        Kcoefm(i,k) = yKcoefm(j,k)
     446      ENDDO
     447    ENDDO   
     448 
    372449  END SUBROUTINE climb_wind_up
    373450!
Note: See TracChangeset for help on using the changeset viewer.