Ignore:
Timestamp:
Nov 24, 2025, 6:39:59 PM (6 weeks ago)
Author:
yann meurdesoif
Message:

yamada_c : bug fix

  • mismatch index on zlev
  • uninitialized levels

+ GPU port of yamada_c
YM

File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/branches/PBLSURF_GPUPORT/libf/phylmd/yamada_c.F90

    r5876 r5885  
    22! $Header$
    33!
     4MODULE yamada_c_mod
     5  PRIVATE
     6
     7  INTEGER, SAVE :: iflag_tke_diff=0
     8  !$OMP THTREADPRIVATE(iflag_tke_diff)
     9
     10  PUBLIC :: yamada_c_init, yamada_c
     11
     12CONTAINS
     13     
     14      SUBROUTINE yamada_c_init
     15      USE ioipsl_getin_p_mod, ONLY : getin_p
     16      IMPLICIT NONE
     17
     18        CALL getin_p('iflag_tke_diff',iflag_tke_diff)
     19
     20      END SUBROUTINE yamada_c_init
     21     
     22
    423      SUBROUTINE yamada_c(klon, ngrid,timestep,plev,play &
    524     &   ,pu,pv,pt,d_u,d_v,d_t,cd,q2,km,kn,kq,d_t_diss,ustar &
    625     &   ,iflag_pbl)
     26!$gpum horizontal klon ngrid
    727      USE dimphy, ONLY: klev
    828      USE print_control_mod, ONLY: prt_level
    9       USE ioipsl_getin_p_mod, ONLY : getin_p
    1029      USE yamada4_mod, ONLY : vdif_q2
    1130      USE yomcst_mod_h
     
    8099      integer nlay,nlev
    81100
    82       logical first
    83       integer ipas
    84       save first,ipas
     101!ym      logical first
     102!ym      integer ipas
     103!ym      save first,ipas
    85104!FH/IM     data first,ipas/.true.,0/
    86       data first,ipas/.false.,0/
    87 !$OMP THREADPRIVATE( first,ipas)
    88        INTEGER, SAVE :: iflag_tke_diff=0
    89 !$OMP THREADPRIVATE(iflag_tke_diff)
     105!ym      data first,ipas/.false.,0/
     106!ym!$OMP THREADPRIVATE( first,ipas)
     107!ym       INTEGER, SAVE :: iflag_tke_diff=0
     108!ym!$OMP THREADPRIVATE(iflag_tke_diff)
    90109
    91110
     
    102121      real l(klon,klev+1)
    103122      real leff(klon,klev+1)
    104       real,allocatable,save :: l0(:)
    105 !$OMP THREADPRIVATE(l0)     
     123      real l0(klon)
     124!ym      real,allocatable,save :: l0(:)
     125!ym!$OMP THREADPRIVATE(l0)     
    106126      real sq(klon),sqz(klon),zz(klon,klev+1)
    107127      integer iter
    108128
    109       real ric,rifc,b1,kap
    110       save ric,rifc,b1,kap
    111       data ric,rifc,b1,kap/0.195,0.191,16.6,0.4/
    112 !$OMP THREADPRIVATE(ric,rifc,b1,kap)
     129!ym      real ric,rifc,b1,kap
     130!ym      save ric,rifc,b1,kap
     131!ym      data ric,rifc,b1,kap/0.195,0.191,16.6,0.4/
     132!ym!$OMP THREADPRIVATE(ric,rifc,b1,kap)
     133      real, parameter :: ric=0.195,rifc=0.191,b1=16.6,kap=0.4
    113134      real frif,falpha,fsm
    114135      real fl,zzz,zl0,zq2,zn2
     
    117138      real lyam(klon,klev),knyam(klon,klev)
    118139      real w2yam(klon,klev),t2yam(klon,klev)
    119       logical,save :: firstcall=.true.
    120 !$OMP THREADPRIVATE(firstcall)       
     140!ym      logical,save :: firstcall=.true.
     141!ym!$OMP THREADPRIVATE(firstcall)       
    121142      CHARACTER(len=20),PARAMETER :: modname="yamada_c"
    122143REAL, DIMENSION(klon,klev+1) :: fluxu,fluxv,fluxt
     
    129150      falpha(ri)=1.318*(0.2231-ri)/(0.2341-ri)
    130151      fsm(ri)=1.96*(0.1912-ri)*(0.2341-ri)/((1.-ri)*(0.2231-ri))
     152!ym   pas glop! pas glop!
     153!ym      fl(zzz,zl0,zq2,zn2)= &
     154!ym     &     max(min(zl0(ig)*kap*zlev(ig,k)/(kap*zlev(ig,k)+l0(ig)) &
     155!ym     &     ,0.5*sqrt(q2(ig,k))/sqrt(max(n2(ig,k),1.e-10))) ,1.)
    131156      fl(zzz,zl0,zq2,zn2)= &
    132      &     max(min(l0(ig)*kap*zlev(ig,k)/(kap*zlev(ig,k)+l0(ig)) &
    133      &     ,0.5*sqrt(q2(ig,k))/sqrt(max(n2(ig,k),1.e-10))) ,1.)
     157     &     max(min(zl0*kap*zzz/(kap*zzz+zl0) &
     158     &     ,0.5*sqrt(zq2)/sqrt(max(zn2,1.e-10))) ,1.)
    134159
    135160
    136161      okiophys=klon==1
    137       if (firstcall) then
    138         CALL getin_p('iflag_tke_diff',iflag_tke_diff)
    139         allocate(l0(klon))
    140         firstcall=.false.
    141       endif
     162!ym      if (firstcall) then
     163!ym        CALL getin_p('iflag_tke_diff',iflag_tke_diff)
     164!ym        allocate(l0(klon))
     165!ym        firstcall=.false.
     166!ym      endif
    142167
    143168   IF (ngrid<=0) RETURN ! Bizarre : on n a pas ce probeleme pour coef_diff_turb
     
    175200   do k=1,klev-1
    176201      zlay(:,k+1)=zlay(:,k)+0.5*RCPD*(teta(:,k)+teta(:,k+1))*(exner(:,k)-exner(:,k+1))/RG
    177       zlev(:,k)=0.5*(zlay(:,k)+zlay(:,k+1)) ! PASBO
     202      zlev(:,k+1)=0.5*(zlay(:,k)+zlay(:,k+1)) ! PASBO
     203                                              ! ym bugfix : zlev(:,k) => zlev(:,k+1)
    178204   enddo
    179205
     
    220246
    221247
    222       ipas=ipas+1
     248!ym      ipas=ipas+1
    223249
    224250
     
    312338      l0(ig)=0.2*sqz(ig)/sq(ig)
    313339                                                          enddo
     340      l(:,1) = 0.
     341      l(:,klev+1) = 0.
    314342      do k=2,klev
    315343                                                          do ig=1,ngrid
     
    326354
    327355          l0(:)=150.
     356          l(:,1) = 0.
     357          l(:,klev+1) = 0.
    328358          do k=2,klev
    329359                                                          do ig=1,ngrid
     
    480510      RETURN
    481511      END SUBROUTINE yamada_c
     512
     513END MODULE yamada_c_mod
Note: See TracChangeset for help on using the changeset viewer.