Changeset 2730 for LMDZ5/trunk


Ignore:
Timestamp:
Dec 14, 2016, 1:10:32 PM (8 years ago)
Author:
jyg
Message:

New input parameter: nbapp_wk = number of calls to
wake routines per day. If =0, call at every physic
time step.

Location:
LMDZ5/trunk/libf/phylmd
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • LMDZ5/trunk/libf/phylmd/alpale_th.F90

    r2558 r2730  
    3838  REAL, DIMENSION(klon), INTENT(INOUT)                       :: alp_bl
    3939  REAL, DIMENSION(klon), INTENT(INOUT)                       :: alp_bl_stat
    40 
    41   REAL, DIMENSION(klon), INTENT(OUT)                         :: proba_notrig, random_notrig
     40  REAL, DIMENSION(klon), INTENT(INOUT)                       :: proba_notrig
     41
     42  REAL, DIMENSION(klon), INTENT(OUT)                         :: random_notrig
    4243
    4344  include "thermcell.h"
     
    7374!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    7475!
     76!!
     77!!  The following 3 lines should be commented if one wants to activate the
     78!! multiplication of no-trigger probabilities between calls to the convection
     79!! scheme.
     80!!
     81             do i=1,klon
     82                proba_notrig(i)=1.
     83             enddo
     84!!
     85!!
    7586!---------------------------------------
    7687  IF (iflag_clos_bl .LT. 3) THEN
     
    97108             !----Initialisations
    98109             do i=1,klon
    99                 proba_notrig(i)=1.
     110!!jyg                proba_notrig(i)=1.
    100111                random_notrig(i)=1e6*ale_bl_stat(i)-int(1e6*ale_bl_stat(i))
    101112                if ( random_notrig(i) > random_notrig_max ) random_notrig(i)=0.
     
    120131                do i=1,klon
    121132                   if ( (ale_bl_stat(i) .gt. abs(cin(i))+1.e-10) )  then
    122                       proba_notrig(i)=(1.-exp(-s_trig/s2(i)))** &
    123                            (n2(i)*dtime/tau_trig(i))
     133                      proba_notrig(i)=proba_notrig(i)* &
     134                         (1.-exp(-s_trig/s2(i)))**(n2(i)*dtime/tau_trig(i))
    124135                      !        print *, 'proba_notrig(i) ',proba_notrig(i)
    125136                      if (random_notrig(i) .ge. proba_notrig(i)) then
     
    129140                      endif
    130141                   else
    131                       proba_notrig(i)=1.
     142!!jyg                      proba_notrig(i)=1.
    132143                      random_notrig(i)=0.
    133144                      ale_bl_trig(i)=0.
     
    139150                do i=1,klon
    140151                   if ( (Ale_bl(i) .gt. abs(cin(i))+1.e-10) )  then
    141                       proba_notrig(i)=(1.-exp(-s_trig/s2(i)))** &
    142                            (n2(i)*dtime/tau_trig(i))
     152                      proba_notrig(i)=proba_notrig(i)* &
     153                         (1.-exp(-s_trig/s2(i)))**(n2(i)*dtime/tau_trig(i))
    143154                      !        print *, 'proba_notrig(i) ',proba_notrig(i)
    144155                      if (random_notrig(i) .ge. proba_notrig(i)) then
     
    148159                      endif
    149160                   else
    150                       proba_notrig(i)=1.
     161!!jyg                      proba_notrig(i)=1.
    151162                      random_notrig(i)=0.
    152163                      ale_bl_trig(i)=0.
     
    223234        !----Initializations and random number generation
    224235        do i=1,klon
    225            proba_notrig(i)=1.
     236!!jyg           proba_notrig(i)=1.
    226237           random_notrig(i)=1e6*ale_bl_stat(i)-int(1e6*ale_bl_stat(i))
    227238           if ( ale_bl_trig(i) .lt. abs(cin(i))+1.e-10 ) then
     
    244255              birth_number = n2(i)*exp(-s_trig/s2(i))
    245256              birth_rate(i) = birth_number/(tau_trig(i)*cell_area(i))
    246               proba_notrig(i)=exp(-birth_number*dtime/tau_trig(i))
     257              proba_notrig(i)=proba_notrig(i)*exp(-birth_number*dtime/tau_trig(i))
    247258              Alp_bl(i) = Alp_bl(i)* &
    248259                          umexp(-birth_number*cv_feed_area/cell_area(i))/ &
     
    250261                          tau_trig(i)*cv_feed_area/(dtime*cell_area(i))
    251262          else
    252               proba_notrig(i)=1.
     263!!jyg              proba_notrig(i)=1.
    253264              random_notrig(i)=0.
    254265              alp_bl(i)=0.
  • LMDZ5/trunk/libf/phylmd/clesphys.h

    r2707 r2730  
    1313       LOGICAL ok_limitvrai
    1414       LOGICAL ok_all_xml
    15        INTEGER nbapp_rad, iflag_con, nbapp_cv, iflag_ener_conserv
     15       INTEGER nbapp_rad, iflag_con, nbapp_cv, nbapp_wk, iflag_ener_conserv
    1616       REAL co2_ppm, co2_ppm0, solaire
    1717       LOGICAL ok_suntime_rrtm
     
    114114     &     , cycle_diurne, soil_model, new_oliq                         &
    115115     &     , ok_orodr, ok_orolf, ok_limitvrai, nbapp_rad                &
    116      &     , iflag_con, nbapp_cv                                        &
     116     &     , iflag_con, nbapp_cv, nbapp_wk                              &
    117117     &     , iflag_ener_conserv                                         &
    118118     &     , ok_4xCO2atm                                                &
  • LMDZ5/trunk/libf/phylmd/conf_phys_m.F90

    r2714 r2730  
    207207    LOGICAL,SAVE  :: ok_orodr_omp, ok_orolf_omp, ok_limitvrai_omp
    208208    INTEGER, SAVE :: nbapp_rad_omp, iflag_con_omp
    209     INTEGER, SAVE :: nbapp_cv_omp
     209    INTEGER, SAVE :: nbapp_cv_omp, nbapp_wk_omp
    210210    INTEGER, SAVE :: iflag_ener_conserv_omp
    211211    LOGICAL, SAVE :: ok_conserv_q_omp
     
    789789    nbapp_cv_omp = 0
    790790    CALL getin('nbapp_cv',nbapp_cv_omp)
     791
     792    !Config  Key  = nbapp_wk
     793    !Config  Desc = Frequence d'appel aux wakes
     794    !Config  Def  = 0
     795    !Config  Help = Nombre  d'appels des routines de wakes
     796    !Config         par jour. Si =0, appel a chaque pas de temps physique.
     797    nbapp_wk_omp = 0
     798    CALL getin('nbapp_wk',nbapp_wk_omp)
    791799
    792800    !Config  Key  = iflag_ener_conserv
     
    20662074    iflag_con = iflag_con_omp
    20672075    nbapp_cv = nbapp_cv_omp
     2076    nbapp_wk = nbapp_wk_omp
    20682077    iflag_ener_conserv = iflag_ener_conserv_omp
    20692078    ok_conserv_q = ok_conserv_q_omp
     
    24002409    write(lunout,*)'iflag_con=',iflag_con
    24012410    write(lunout,*)'nbapp_cv=',nbapp_cv
     2411    write(lunout,*)'nbapp_wk=',nbapp_wk
    24022412    write(lunout,*)'iflag_ener_conserv=',iflag_ener_conserv
    24032413    write(lunout,*)'ok_conserv_q=',ok_conserv_q
  • LMDZ5/trunk/libf/phylmd/phys_state_var_mod.F90

    r2707 r2730  
    1818      INTEGER, SAVE :: radpas
    1919      INTEGER, SAVE :: cvpas
     20      INTEGER, SAVE :: wkpas
    2021      REAL, PARAMETER :: missing_val_nf90=nf90_fill_real
    2122!$OMP THREADPRIVATE(radpas)
    2223!$OMP THREADPRIVATE(cvpas)
     24!$OMP THREADPRIVATE(wkpas)
    2325      REAL, SAVE :: dtime, solaire_etat0
    2426!$OMP THREADPRIVATE(dtime, solaire_etat0)
  • LMDZ5/trunk/libf/phylmd/physiq_mod.F90

    r2714 r2730  
    139139       kh, kh_x, kh_w, &
    140140       !
     141       wake_k, &
    141142       ale_wake, alp_wake, &
    142143       wake_h, wake_omg, &
     
    564565    !pourquoi y'a pas de save??
    565566    !
    566     INTEGER wake_k(klon)            ! Wake sommet
     567!!!    INTEGER, SAVE, DIMENSION(klon)   :: wake_k
     568!!!    !$OMP THREADPRIVATE(wake_k)
    567569    !
    568570    !jyg<
     
    782784    !ym      SAVE 
    783785    !
    784     INTEGER itapcv
    785     SAVE itapcv
    786     !$OMP THREADPRIVATE(itapcv)
     786    INTEGER itapcv, itapwk
     787    SAVE itapcv, itapwk
     788    !$OMP THREADPRIVATE(itapcv, itapwk)
    787789
    788790    !KE43
     
    12851287       itaprad = 0
    12861288       itapcv = 0
     1289       itapwk = 0
    12871290
    12881291       ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
     
    13131316       ENDIF
    13141317       IF (nbapp_cv .EQ. 0) nbapp_cv=86400./dtime
    1315        print *,'physiq, nbapp_cv ',nbapp_cv
     1318       IF (nbapp_wk .EQ. 0) nbapp_wk=86400./dtime
     1319       print *,'physiq, nbapp_cv, nbapp_wk ',nbapp_cv,nbapp_wk
    13161320       IF (MOD(INT(86400./dtime),nbapp_cv).EQ.0) THEN
    13171321          cvpas = NINT( 86400./dtime/nbapp_cv)
     
    13241328          abort_message='nbre de pas de temps physique n est pas multiple ' &
    13251329               // 'de nbapp_cv'
     1330          call abort_physic(modname,abort_message,1)
     1331       ENDIF
     1332       IF (MOD(INT(86400./dtime),nbapp_wk).EQ.0) THEN
     1333          wkpas = NINT( 86400./dtime/nbapp_wk)
     1334       print *,'physiq, wkpas ',wkpas
     1335       ELSE
     1336          WRITE(lunout,*) 'le nombre de pas de temps physique doit etre un ', &
     1337               'multiple de nbapp_wk'
     1338          WRITE(lunout,*) 'changer nbapp_wk ou alors commenter ce test ', &
     1339               'mais 1+1<>2'
     1340          abort_message='nbre de pas de temps physique n est pas multiple ' &
     1341               // 'de nbapp_wk'
    13261342          call abort_physic(modname,abort_message,1)
    13271343       ENDIF
     
    23172333    IF (prt_level.ge.1) write(lunout,*) 'omega(igout, :) = ', &
    23182334         omega(igout, :)
    2319 
    23202335    !
    23212336    ! Appel de la convection tous les "cvpas"
     
    25742589    !    .              d_u_con, d_v_con)
    25752590
     2591!jyg    Reinitialize proba_notrig and itapcv when convection has been called
     2592    proba_notrig(:) = 1.
    25762593    itapcv = 0
    25772594    ENDIF !  (MOD(itapcv,cvpas).EQ.0)
     2595!
    25782596    itapcv = itapcv+1
    25792597
     
    26402658    IF (iflag_wake>=1) THEN
    26412659       !
    2642        !  Call wakes only when convection has been called
    2643        IF (itapcv .EQ. 1) THEN
    2644        !
    2645        DO k=1,klev
    2646           DO i=1,klon
    2647              dt_dwn(i,k)  = ftd(i,k)
    2648              dq_dwn(i,k)  = fqd(i,k)
    2649              M_dwn(i,k)   = dnwd0(i,k)
    2650              M_up(i,k)    = upwd(i,k)
    2651              dt_a(i,k)    = d_t_con(i,k)/dtime - ftd(i,k)
    2652              dq_a(i,k)    = d_q_con(i,k)/dtime - fqd(i,k)
    2653           ENDDO
    2654        ENDDO
    2655 
    2656        IF (iflag_wake==2) THEN
    2657           ok_wk_lsp(:)=max(sign(1.,wake_s(:)-wake_s_min_lsp),0.)
    2658           DO k = 1,klev
    2659              dt_dwn(:,k)= dt_dwn(:,k)+ &
    2660                   ok_wk_lsp(:)*(d_t_eva(:,k)+d_t_lsc(:,k))/dtime
    2661              dq_dwn(:,k)= dq_dwn(:,k)+ &
    2662                   ok_wk_lsp(:)*(d_q_eva(:,k)+d_q_lsc(:,k))/dtime
    2663           ENDDO
    2664        ELSEIF (iflag_wake==3) THEN
    2665           ok_wk_lsp(:)=max(sign(1.,wake_s(:)-wake_s_min_lsp),0.)
    2666           DO k = 1,klev
     2660       !
     2661       ! Call wakes every "wkpas" step
     2662       !
     2663       IF (MOD(itapwk,wkpas).EQ.0) THEN
     2664          !
     2665          DO k=1,klev
    26672666             DO i=1,klon
    2668                 IF (rneb(i,k)==0.) THEN
    2669                    ! On ne tient compte des tendances qu'en dehors des
    2670                    ! nuages (c'est-\`a-dire a priri dans une region ou
    2671                    ! l'eau se reevapore).
    2672                    dt_dwn(i,k)= dt_dwn(i,k)+ &
    2673                         ok_wk_lsp(i)*d_t_lsc(i,k)/dtime
    2674                    dq_dwn(i,k)= dq_dwn(i,k)+ &
    2675                         ok_wk_lsp(i)*d_q_lsc(i,k)/dtime
    2676                 ENDIF
     2667                dt_dwn(i,k)  = ftd(i,k)
     2668                dq_dwn(i,k)  = fqd(i,k)
     2669                M_dwn(i,k)   = dnwd0(i,k)
     2670                M_up(i,k)    = upwd(i,k)
     2671                dt_a(i,k)    = d_t_con(i,k)/dtime - ftd(i,k)
     2672                dq_a(i,k)    = d_q_con(i,k)/dtime - fqd(i,k)
    26772673             ENDDO
    26782674          ENDDO
    2679        ENDIF
    2680 
    2681        !
    2682        !calcul caracteristiques de la poche froide
    2683        CALL calWAKE (iflag_wake_tend, paprs, pplay, dtime, &
    2684             t_seri, q_seri, omega,  &
    2685             dt_dwn, dq_dwn, M_dwn, M_up,  &
    2686             dt_a, dq_a,  &
    2687             sigd,  &
    2688             wake_deltat, wake_deltaq, wake_s, wake_dens,  &
    2689             wake_dth, wake_h,  &
    2690             wake_pe, wake_fip, wake_gfl,  &
    2691             d_t_wake, d_q_wake,  &
    2692             wake_k, t_x, q_x,  &
    2693             wake_omgbdth, wake_dp_omgb,  &
    2694             wake_dtKE, wake_dqKE,  &
    2695             wake_omg, wake_dp_deltomg,  &
    2696             wake_spread, wake_Cstar, d_deltat_wk_gw,  &
    2697             d_deltat_wk, d_deltaq_wk, d_s_wk, d_dens_wk)
    2698          !
    2699        ENDIF  ! (mod(itapcv,cvpas) .EQ. 1)
     2675         
     2676          IF (iflag_wake==2) THEN
     2677             ok_wk_lsp(:)=max(sign(1.,wake_s(:)-wake_s_min_lsp),0.)
     2678             DO k = 1,klev
     2679                dt_dwn(:,k)= dt_dwn(:,k)+ &
     2680                     ok_wk_lsp(:)*(d_t_eva(:,k)+d_t_lsc(:,k))/dtime
     2681                dq_dwn(:,k)= dq_dwn(:,k)+ &
     2682                     ok_wk_lsp(:)*(d_q_eva(:,k)+d_q_lsc(:,k))/dtime
     2683             ENDDO
     2684          ELSEIF (iflag_wake==3) THEN
     2685             ok_wk_lsp(:)=max(sign(1.,wake_s(:)-wake_s_min_lsp),0.)
     2686             DO k = 1,klev
     2687                DO i=1,klon
     2688                   IF (rneb(i,k)==0.) THEN
     2689                      ! On ne tient compte des tendances qu'en dehors des
     2690                      ! nuages (c'est-\`a-dire a priri dans une region ou
     2691                      ! l'eau se reevapore).
     2692                      dt_dwn(i,k)= dt_dwn(i,k)+ &
     2693                           ok_wk_lsp(i)*d_t_lsc(i,k)/dtime
     2694                      dq_dwn(i,k)= dq_dwn(i,k)+ &
     2695                           ok_wk_lsp(i)*d_q_lsc(i,k)/dtime
     2696                   ENDIF
     2697                ENDDO
     2698             ENDDO
     2699          ENDIF
     2700         
     2701          !
     2702          !calcul caracteristiques de la poche froide
     2703          CALL calWAKE (iflag_wake_tend, paprs, pplay, dtime, &
     2704               t_seri, q_seri, omega,  &
     2705               dt_dwn, dq_dwn, M_dwn, M_up,  &
     2706               dt_a, dq_a,  &
     2707               sigd,  &
     2708               wake_deltat, wake_deltaq, wake_s, wake_dens,  &
     2709               wake_dth, wake_h,  &
     2710               wake_pe, wake_fip, wake_gfl,  &
     2711               d_t_wake, d_q_wake,  &
     2712               wake_k, t_x, q_x,  &
     2713               wake_omgbdth, wake_dp_omgb,  &
     2714               wake_dtKE, wake_dqKE,  &
     2715               wake_omg, wake_dp_deltomg,  &
     2716               wake_spread, wake_Cstar, d_deltat_wk_gw,  &
     2717               d_deltat_wk, d_deltaq_wk, d_s_wk, d_dens_wk)
     2718          !
     2719          !jyg    Reinitialize itapwk when wakes have been called
     2720          itapwk = 0
     2721       ENDIF !  (MOD(itapwk,wkpas).EQ.0)
     2722       !
     2723       itapwk = itapwk+1
    27002724       !
    27012725       !-----------------------------------------------------------------------
     
    27052729       !------------------------------------------------------------------------
    27062730
    2707 !      Increment Wake state variables
     2731       ! Increment Wake state variables
    27082732       IF (iflag_wake_tend .GT. 0.) THEN
    27092733
Note: See TracChangeset for help on using the changeset viewer.