Changeset 5961 for LMDZ6/trunk


Ignore:
Timestamp:
Dec 18, 2025, 7:53:01 PM (13 days ago)
Author:
yann meurdesoif
Message:

yamada_c : bug fix

  • mismatch index on zlev
  • uninitialized levels

+ GPU port of yamada_c
merge of commit r5885
YM

Location:
LMDZ6/trunk/libf/phylmd
Files:
2 edited

Legend:

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

    r5959 r5961  
    112112    USE climb_wind_mod, ONLY : climb_wind_init
    113113    USE climb_qbs_mod, ONLY : climb_qbs_init
     114    USE yamada_c_mod, ONLY : yamada_c_init
    114115
    115116    IMPLICIT NONE
     
    270271    CALL climb_wind_init
    271272    CALL climb_qbs_init
     273    CALL yamada_c_init
    272274
    273275  END SUBROUTINE pbl_surface_init
     
    24512453    USE cdrag_mod, ONLY : cdrag
    24522454    USE freinage_mod, ONLY : freinage
     2455    USE yamada_c_mod, ONLY : yamada_c
    24532456
    24542457IMPLICIT NONE
     
    44154418     IF (iflag_pbl>=20 .and. iflag_pbl<30) THEN
    44164419
    4417         CALL yamada_c(knon, knon,dtime,ypaprs,ypplay &
     4420        CALL yamada_c( knon, knon, dtime,ypaprs,ypplay &
    44184421    &   ,yu,yv,yt,y_d_u,y_d_v,y_d_t,ycdragm,ytke,ycoefm,ycoefh,ycoefq,y_d_t_diss,yustar &
    44194422    &   ,iflag_pbl)
     
    44224425       ELSE  !(iflag_split .eq.0)
    44234426
    4424         CALL climb_wind_up(knon, ni, dtime, yu_x, yv_x, y_flux_u1_x, y_flux_v1_x, &
     4427        CALL climb_wind_up( knon, ni, dtime, yu_x, yv_x, y_flux_u1_x, y_flux_v1_x, &
    44254428            AcoefU_x, AcoefV_x, BcoefU_x, BcoefV_x, &
    44264429            CcoefU_x, CcoefV_x, DcoefU_x, DcoefV_x, &
     
    44464449     IF (iflag_pbl>=20 .and. iflag_pbl<30) THEN
    44474450
    4448         CALL yamada_c(knon, knon,dtime,ypaprs,ypplay &
     4451        CALL yamada_c( knon, knon,dtime,ypaprs,ypplay &
    44494452    &   ,yu_w,yv_w,yt_w,y_d_u_w,y_d_v_w,y_d_t_w,ycdragm_w,ytke_w,ycoefm_w,ycoefh_w &
    44504453        ,ycoefq_w,y_d_t_diss_w,yustar_w &
  • LMDZ6/trunk/libf/phylmd/yamada_c.F90

    r5950 r5961  
    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.