Ignore:
Timestamp:
Feb 12, 2018, 1:24:03 AM (6 years ago)
Author:
fhourdin
Message:

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'était 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.

File:
1 edited

Legend:

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

    r2665 r3198  
    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
     240    !LAUNCH=22 ; LTROP=33
     241!   print*,'LAUNCH=',LAUNCH,'LTROP=',LTROP
    202242
    203243    ! Log pressure vert. coordinate
     
    245285    ! waves characteristics in an almost stochastic way
    246286
    247     JW = 0
    248     DO JP = 1, NP
    249        DO JK = 1, NK
    250           DO JO = 1, NO
    251              JW = JW + 1
     287    DO JW = 1, NW
    252288             ! Angle
    253289             DO II = 1, KLON
    254290                ! Angle (0 or PI so far)
    255                 ZP(JW, II) = (SIGN(1., 0.5 - MOD(TT(II, JW) * 10., 1.)) + 1.) &
     291                RAN_NUM_1=MOD(TT(II, JW) * 10., 1.)
     292                RAN_NUM_2= MOD(TT(II, JW) * 100., 1.)
     293                ZP(JW, II) = (SIGN(1., 0.5 - RAN_NUM_1) + 1.) &
    256294                     * RPI / 2.
    257295                ! Horizontal wavenumber amplitude
    258                 ZK(JW, II) = KMIN + (KMAX - KMIN) * MOD(TT(II, JW) * 100., 1.)
     296                ZK(JW, II) = KMIN + (KMAX - KMIN) *RAN_NUM_2
    259297                ! Horizontal phase speed
    260298                CPHA = 0.
    261299                DO JJ = 1, NA
     300                    RAN_NUM_3=MOD(TT(II, JW+3*JJ)**2, 1.)
    262301                    CPHA = CPHA + &
    263          CMAX*2.*(MOD(TT(II, JW+3*JJ)**2, 1.)-0.5)*SQRT(3.)/SQRT(NA*1.)
     302                    CMAX*2.*(RAN_NUM_3 -0.5)*SQRT(3.)/SQRT(NA*1.)
    264303                END DO
    265304                IF (CPHA.LT.0.)  THEN
     
    276315                RUW0(JW, II) = RUWMAX
    277316             ENDDO
    278           end DO
    279        end DO
    280     end DO
     317    ENDDO
    281318
    282319    ! 4. COMPUTE THE FLUXES
     
    417454    ENDDO
    418455
     456
    419457  END SUBROUTINE FLOTT_GWD_RANDO
    420458
Note: See TracChangeset for help on using the changeset viewer.