Changeset 3200 for LMDZ6


Ignore:
Timestamp:
Feb 12, 2018, 10:01:04 AM (7 years ago)
Author:
Laurent Fairhead
Message:

Inclusion of r3198 from trunk
Retour vers l'insensibilite au decoupage en sous domaine.
Les routines gwd_rando incluait le calcul de niveaux de reference
sur la base d'un profile pris au milieu du domaine (en klon/2).
Rempace par un test en presnivs.

Une autre intercation entre routines concernant la tke a fait apparaitre
que la tke n'?\195?\169tait pas passee correctement au niveau klev+1 au moment
du regroupement des mailles sous les sous surface.

Ces changements garantissent la convergence numerique si
addtkeoro=0
iflag_pbl<12
et
ok_gwd_rando=n
La convergence n'est pas garantie pour les dernieres versions des physiq.def
mais les differences devraient etre mineures.

FH

Location:
LMDZ6/branches/IPSLCM6.0.15/libf/phylmd
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/branches/IPSLCM6.0.15/libf/phylmd/acama_gwd_rando_m.F90

    r2665 r3200  
    2020    use dimphy, only: klon, klev
    2121    use assert_m, only: assert
     22    USE ioipsl_getin_p_mod, ONLY : getin_p
     23    USE vertical_layers_mod, ONLY : presnivs
     24
    2225    include "YOMCST.h"
    2326    include "clesphys.h"
     
    111114    REAL BV(KLON, KLEV + 1) ! Brunt Vaisala freq. (BVF) at 1/2 levels
    112115    REAL BVSEC ! Security to avoid negative BVF
     116
     117    REAL, DIMENSION(klev+1) ::HREF
     118    LOGICAL, SAVE :: gwd_reproductibilite_mpiomp=.true.
     119    LOGICAL, SAVE :: firstcall = .TRUE.
     120  !$OMP THREADPRIVATE(firstcall,gwd_reproductibilite_mpiomp)
     121
     122    CHARACTER (LEN=20) :: modname='flott_gwd_rando'
     123    CHARACTER (LEN=80) :: abort_message
     124
     125
     126
     127  IF (firstcall) THEN
     128    ! Cle introduite pour resoudre un probleme de non reproductibilite
     129    ! Le but est de pouvoir tester de revenir a la version precedenete
     130    ! A eliminer rapidement
     131    CALL getin_p('gwd_reproductibilite_mpiomp',gwd_reproductibilite_mpiomp)
     132    IF (NW+4*(NA-1)+NA>=KLEV) THEN
     133       abort_message = 'NW+3*NA>=KLEV Probleme pour generation des ondes'
     134       CALL abort_physic (modname,abort_message,1)
     135    ENDIF
     136    firstcall=.false.
     137!    CALL iophys_ini
     138  ENDIF
    113139
    114140    !-----------------------------------------------------------------
     
    205231    ! Launching altitude
    206232
     233    IF (gwd_reproductibilite_mpiomp) THEN
     234       ! Reprend la formule qui calcule PH en fonction de PP=play
     235       DO LL = 2, KLEV
     236          HREF(LL) = EXP((LOG(presnivs(LL)) + LOG(presnivs(LL - 1))) / 2.)
     237       end DO
     238       HREF(KLEV + 1) = 0.
     239       HREF(1) = 2. * presnivs(1) - HREF(2)
     240    ELSE
     241       HREF(1:KLEV)=PH(KLON/2,1:KLEV)
     242    ENDIF
     243
    207244    LAUNCH=0
    208245    LTROP =0
    209246    DO LL = 1, KLEV
    210        IF (PH(KLON / 2, LL) / PH(KLON / 2, 1) > XLAUNCH) LAUNCH = LL
     247       IF (HREF(LL) / HREF(1) > XLAUNCH) LAUNCH = LL
    211248    ENDDO
    212249    DO LL = 1, KLEV
    213        IF (PH(KLON / 2, LL) / PH(KLON / 2, 1) > XTROP) LTROP = LL
     250       IF (HREF(LL) / HREF(1) > XTROP) LTROP = LL
    214251    ENDDO
    215252
     
    293330
    294331    JW = 0
    295     DO JP = 1, NP
    296        DO JK = 1, NK
    297           DO JO = 1, NO
    298              JW = JW + 1
     332    DO JW = 1, NW
    299333             ! Angle
    300334             DO II = 1, KLON
     
    340374                ! RUW0(JW, II) = RUWFRT
    341375             ENDDO
    342           end DO
    343        end DO
    344376    end DO
    345377
  • LMDZ6/branches/IPSLCM6.0.15/libf/phylmd/flott_gwd_rando_m.F90

    r2665 r3200  
    1818      use dimphy, only: klon, klev
    1919      use assert_m, only: assert
     20      USE ioipsl_getin_p_mod, ONLY : getin_p
     21      USE vertical_layers_mod, ONLY : presnivs
     22
    2023      include "YOMCST.h"
    2124      include "clesphys.h"
     
    103106    REAL PH(KLON, KLEV + 1) ! Pressure at 1/2 levels
    104107    REAL PSEC ! Security to avoid division by 0 pressure
    105     REAL PHM1(KLON, KLEV + 1) ! 1/Press at 1/2 levels
    106108    REAL BV(KLON, KLEV + 1) ! Brunt Vaisala freq. (BVF) at 1/2 levels
    107109    REAL BVSEC ! Security to avoid negative BVF
     110    REAL RAN_NUM_1,RAN_NUM_2,RAN_NUM_3
     111
     112    REAL, DIMENSION(klev+1) ::HREF
     113
     114    LOGICAL, SAVE :: gwd_reproductibilite_mpiomp=.true.
     115    LOGICAL, SAVE :: firstcall = .TRUE.
     116  !$OMP THREADPRIVATE(firstcall,gwd_reproductibilite_mpiomp)
     117
     118    CHARACTER (LEN=20) :: modname='flott_gwd_rando'
     119    CHARACTER (LEN=80) :: abort_message
     120
     121
     122
     123  IF (firstcall) THEN
     124    ! Cle introduite pour resoudre un probleme de non reproductibilite
     125    ! Le but est de pouvoir tester de revenir a la version precedenete
     126    ! A eliminer rapidement
     127    CALL getin_p('gwd_reproductibilite_mpiomp',gwd_reproductibilite_mpiomp)
     128    IF (NW+3*NA>=KLEV) THEN
     129       abort_message = 'NW+3*NA>=KLEV Probleme pour generation des ondes'
     130       CALL abort_physic (modname,abort_message,1)
     131    ENDIF
     132    firstcall=.false.
     133  ENDIF
     134
    108135
    109136    !-----------------------------------------------------------------
     
    156183    ZOISEC = 1.E-6 ! Security FOR 0 INTRINSIC FREQ
    157184
     185IF (1==0) THEN
    158186    !ONLINE
    159187        call assert(klon == (/size(pp, 1), size(tt, 1), size(uu, 1), &
     
    167195          "FLOTT_GWD_RANDO klev")
    168196    !END ONLINE
     197ENDIF
    169198
    170199    IF(DELTAT < DTIME)THEN
     
    183212    DO LL = 2, KLEV
    184213       PH(:, LL) = EXP((LOG(PP(:, LL)) + LOG(PP(:, LL - 1))) / 2.)
    185        PHM1(:, LL) = 1. / PH(:, LL)
    186     end DO
    187 
     214    end DO
    188215    PH(:, KLEV + 1) = 0.
    189     PHM1(:, KLEV + 1) = 1. / PSEC
    190216    PH(:, 1) = 2. * PP(:, 1) - PH(:, 2)
    191217
    192218    ! Launching altitude
     219
     220    !Pour revenir a la version non reproductible en changeant le nombre de process
     221    IF (gwd_reproductibilite_mpiomp) THEN
     222       ! Reprend la formule qui calcule PH en fonction de PP=play
     223       DO LL = 2, KLEV
     224          HREF(LL) = EXP((LOG(presnivs(LL)) + LOG(presnivs(LL - 1))) / 2.)
     225       end DO
     226       HREF(KLEV + 1) = 0.
     227       HREF(1) = 2. * presnivs(1) - HREF(2)
     228    ELSE
     229       HREF(1:KLEV)=PH(KLON/2,1:KLEV)
     230    ENDIF
    193231
    194232    LAUNCH=0
    195233    LTROP =0
    196234    DO LL = 1, KLEV
    197        IF (PH(KLON / 2, LL) / PH(KLON / 2, 1) > XLAUNCH) LAUNCH = LL
     235       IF (HREF(LL) / HREF(1) > XLAUNCH) LAUNCH = LL
    198236    ENDDO
    199237    DO LL = 1, KLEV
    200        IF (PH(KLON / 2, LL) / PH(KLON / 2, 1) > XTROP) LTROP = LL
     238       IF (HREF(LL) / HREF(1) > XTROP) LTROP = LL
    201239    ENDDO
    202240
     
    245283    ! waves characteristics in an almost stochastic way
    246284
    247     JW = 0
    248     DO JP = 1, NP
    249        DO JK = 1, NK
    250           DO JO = 1, NO
    251              JW = JW + 1
     285    DO JW = 1, NW
    252286             ! Angle
    253287             DO II = 1, KLON
    254288                ! Angle (0 or PI so far)
    255                 ZP(JW, II) = (SIGN(1., 0.5 - MOD(TT(II, JW) * 10., 1.)) + 1.) &
     289                RAN_NUM_1=MOD(TT(II, JW) * 10., 1.)
     290                RAN_NUM_2= MOD(TT(II, JW) * 100., 1.)
     291                ZP(JW, II) = (SIGN(1., 0.5 - RAN_NUM_1) + 1.) &
    256292                     * RPI / 2.
    257293                ! Horizontal wavenumber amplitude
    258                 ZK(JW, II) = KMIN + (KMAX - KMIN) * MOD(TT(II, JW) * 100., 1.)
     294                ZK(JW, II) = KMIN + (KMAX - KMIN) *RAN_NUM_2
    259295                ! Horizontal phase speed
    260296                CPHA = 0.
    261297                DO JJ = 1, NA
     298                    RAN_NUM_3=MOD(TT(II, JW+3*JJ)**2, 1.)
    262299                    CPHA = CPHA + &
    263          CMAX*2.*(MOD(TT(II, JW+3*JJ)**2, 1.)-0.5)*SQRT(3.)/SQRT(NA*1.)
     300                    CMAX*2.*(RAN_NUM_3 -0.5)*SQRT(3.)/SQRT(NA*1.)
    264301                END DO
    265302                IF (CPHA.LT.0.)  THEN
     
    276313                RUW0(JW, II) = RUWMAX
    277314             ENDDO
    278           end DO
    279        end DO
    280     end DO
     315    ENDDO
    281316
    282317    ! 4. COMPUTE THE FLUXES
     
    417452    ENDDO
    418453
     454
    419455  END SUBROUTINE FLOTT_GWD_RANDO
    420456
  • LMDZ6/branches/IPSLCM6.0.15/libf/phylmd/pbl_surface_mod.F90

    r3102 r3200  
    12661266       ENDDO
    12671267!!! jyg le 07/02/2012 et le 10/04/2013
    1268         DO k = 1, klev
     1268        DO k = 1, klev+1
    12691269          DO j = 1, knon
    12701270             i = ni(j)
     
    12721272!!             ytke(j,k)   = tke(i,k,nsrf)
    12731273             ytke(j,k)   = tke_x(i,k,nsrf)
     1274          ENDDO
     1275        ENDDO
    12741276!>jyg
     1277        DO k = 1, klev
     1278          DO j = 1, knon
     1279             i = ni(j)
    12751280!FC
    12761281             y_treedrg(j,k) =  treedrg(i,k,nsrf)
     
    23982403       IF (iflag_split .eq.0) THEN
    23992404        wake_dltke(:,:,nsrf) = 0.
    2400         DO k = 1, klev
     2405        DO k = 1, klev+1
    24012406           DO j = 1, knon
    24022407              i = ni(j)
     
    24112416
    24122417       ELSE  ! (iflag_split .eq.0)
    2413         DO k = 1, klev
     2418        DO k = 1, klev+1
    24142419          DO j = 1, knon
    24152420            i = ni(j)
  • LMDZ6/branches/IPSLCM6.0.15/libf/phylmd/physiq_mod.F90

    r3176 r3200  
    43734373
    43744374
    4375     CALL tend_to_tke(pdtphys,paprs,exner,t_seri,u_seri,v_seri,dtadd,duadd,dvadd,pbl_tke)
     4375    CALL tend_to_tke(pdtphys,paprs,exner,t_seri,u_seri,v_seri,dtadd,duadd,dvadd,pctsrf,pbl_tke)
    43764376
    43774377
  • LMDZ6/branches/IPSLCM6.0.15/libf/phylmd/tend_to_tke.F90

    r3189 r3200  
    3232!**************************************************************************************
    3333
    34  SUBROUTINE tend_to_tke(dt,plev,exner,temp,windu,windv,dt_a,du_a,dv_a,tke)
     34 SUBROUTINE tend_to_tke(dt,plev,exner,temp,windu,windv,dt_a,du_a,dv_a,pctsrf,tke)
    3535
    3636 USE dimphy, ONLY: klon, klev
     
    5353  REAL du_a(klon,klev)      ! Zonal wind speed tendency [m/s], grid-cell average or for a one subsurface
    5454  REAL dv_a(klon,klev)      ! Meridional wind speed tendency [m/s], grid-cell average or for a one subsurface
     55  REAL pctsrf(klon,nbsrf+1)       ! Turbulent Kinetic energy [m2/s2], grid-cell average or for a subsurface
    5556
    5657! Inputs/Outputs
     
    119120
    120121
    121  DO isrf=1,nbsrf
     122 DO isrf=1,nsrf
    122123    DO k=1,klev
    123        tke(:,k,isrf)= tke(:,k,isrf)+tendu(:,k)+tendv(:,k)+tendt(:,k)
    124        tke(:,k,isrf)= max(tke(:,k,isrf),1.e-10)
     124       DO i=1,klon
     125          IF (pctsrf(i,isrf)>0.) THEN
     126            tke(i,k,isrf)= tke(i,k,isrf)+tendu(i,k)+tendv(i,k)+tendt(i,k)
     127            tke(i,k,isrf)= max(tke(i,k,isrf),1.e-10)
     128          ENDIF
     129       ENDDO
    125130    ENDDO
    126131 ENDDO
    127 
    128 ! dtke_t(:,:)=tendt(:,:)
    129 ! dtke_u(:,:)=tendu(:,:)
    130 ! dtke_v(:,:)=tendv(:,:)
    131132
    132133
Note: See TracChangeset for help on using the changeset viewer.