Changeset 4908


Ignore:
Timestamp:
Apr 15, 2024, 7:30:55 PM (2 weeks ago)
Author:
jyg
Message:

New wake height formulation in the wake parametrization

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

Legend:

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

    r4845 r4908  
    3535  USE lmdz_wake_ini , ONLY : sigmad, hwmin, wapecut, cstart, sigmaw_max, dens_rate, epsilon_loc
    3636  USE lmdz_wake_ini , ONLY : iflag_wk_profile
    37   USE lmdz_wake_ini , ONLY : smallestreal
     37  USE lmdz_wake_ini , ONLY : smallestreal,wk_nsub
    3838
    3939
     
    185185
    186186  REAL                                                  :: delta_t_min
    187   INTEGER                                               :: nsub
    188187  REAL                                                  :: dtimesub
    189188  REAL                                                  :: wdens0
     
    351350!
    352351!   sub-time-stepping parameters
    353   nsub = 10
    354   dtimesub = dtime/nsub
     352  dtimesub = dtime/wk_nsub
    355353!
    356354IF (first_call) THEN
     
    685683                    dth, hw0, rho, delta_t_min, &
    686684                    ktop, wk_adv, h_zzz, ptop1, ktop1)
     685 
     686   !!print'("pkupper APPEL ",7i6)',0,int(ptop/100.),int(ptop1/100.),int(pupper/100.),ktop,ktop1,kupper
    687687   
    688688   IF (prt_level>=10) THEN
     
    860860  ! -----------------
    861861
    862 !    nsub and dtimesub definitions moved to begining of routine.
    863 !!  nsub = 10
    864 !!  dtimesub = dtime/nsub
     862!    wk_nsub and dtimesub definitions moved to begining of routine.
     863!!  wk_nsub = 10
     864!!  dtimesub = dtime/wk_nsub
    865865
    866866 
     
    869869  ! ------------------------------------------------------------------------
    870870  !
    871   DO isubstep = 1, nsub
     871  DO isubstep = 1, wk_nsub
    872872  !
    873873  ! ------------------------------------------------------------------------
     
    13151315             (1.-alpha_up(i,k))*omgbdth(i,k)- &
    13161316             alpha_up(i,k+1)*omgbdth(i,k+1))*ppi(i, k)
    1317 !           print*,'d_deltatw=', k, d_deltatw(i,k)
     1317!           print*,'d_d,k_ptop_provis(i)eltatw=', k, d_deltatw(i,k)
    13181318
    13191319          d_deltaqw(i, k) = dtimesub/(ph(i,k)-ph(i,k+1))* &
     
    17121712                    dth, hw, rho, delta_t_min, &
    17131713                    ktop, wk_adv, h_zzz, ptop1, ktop1)
     1714   !! print'("pkupper APPEL ",7i6)',isubstep,int(ptop/100.),int(ptop1/100.),int(pupper/100.),ktop,ktop1,kupper
    17141715
    17151716    ! 5/ Set deltatw & deltaqw to 0 above kupper
     
    24222423USE lmdz_wake_ini , ONLY : hwmin
    24232424USE lmdz_wake_ini , ONLY : iflag_wk_new_ptop, wk_delta_t_min, wk_frac_int_delta_t
     2425USE lmdz_wake_ini , ONLY : wk_int_delta_t_min
    24242426
    24252427IMPLICIT NONE
     
    24442446INTEGER :: i,k
    24452447
     2448LOGICAL,    DIMENSION (klon)       :: wk_active
    24462449REAL                               :: delta_t_min
    24472450REAL,     DIMENSION (klon)         :: dthmin
     
    24512454
    24522455INTEGER,     DIMENSION (klon)                     :: k_ptop_provis
     2456REAL,     DIMENSION (klon)                     :: zk_ptop_provis
    24532457REAL,     DIMENSION (klon)                        :: omega        !!
    24542458REAL,     DIMENSION (klon,klev+1)                 :: int_dth      !!
     
    25002504      END DO
    25012505    END DO
     2506
    25022507
    25032508
     
    25952600    ! -----------------------------------------------------------------------
    25962601!if (iflag_wk_new_ptop>0) then
     2602do i=1,klon
     2603   ptop1(i)=ph(i,1)
     2604   ktop1(i)=1
     2605   h_zzz(i)=0.
     2606enddo
    25972607   
    25982608IF (iflag_wk_new_ptop/=0) THEN
    2599 
    26002609   
    2601        DO i = 1, klon
    2602           IF (wk_adv(i)) THEN
    2603              int_dth(i,1) = 0.
    2604          END IF
    2605        END DO
     2610    int_dth(1:klon,1:klev+1)=0.
     2611    DO i = 1, klon
     2612       IF (wk_adv(i)) THEN
     2613          int_dth(i,1) = 0.
     2614      END IF
     2615    END DO
    26062616   
    2607    
    2608    
    2609     DO K = 2, klev+1
    2610        Do i = 1, klon
    2611           IF (wk_adv(i)) THEN
    2612              if (k<=k_ptop_provis(i)) then
    2613                 !  ddd=dth(i,k-1)*(ph(i,k-1) - min(ptop_provis(i),ph(i,k)))
    2614                   ddd=dth(i,k-1)*(ph(i,k-1) - ph(i,k))
    2615              else
    2616                   ddd=0.
    2617              endif
    2618              int_dth(i,k) = int_dth(i,k-1) + ddd
    2619           !ELSE
    2620           !   int_dth(i,k) = 0.
    2621           END IF
    2622        END DO
    2623     END DO
     2617    if (abs(iflag_wk_new_ptop) == 1 ) then
     2618        DO k = 2, klev+1
     2619           Do i = 1, klon
     2620              IF (wk_adv(i)) THEN
     2621                 if (k<=k_ptop_provis(i)) then
     2622                      ddd=dth(i,k-1)*(ph(i,k-1) - max(ptop_provis(i),ph(i,k)))
     2623                      !ddd=dth(i,k-1)*(ph(i,k-1) - ph(i,k))
     2624                 else
     2625                      ddd=0.
     2626                 endif             
     2627                 int_dth(i,k) = int_dth(i,k-1) + ddd
     2628              !ELSE
     2629              !   int_dth(i,k) = 0.
     2630              END IF
     2631           END DO
     2632        END DO
     2633    else
     2634        k_ptop_provis(:)=klev+1
     2635        dthmin(:)=dth(:,1)
     2636        ! calcul de l'int??grale de dT * dP jusqu'au dernier
     2637        ! niveau avec dT<0. (en s'assurant qu'on a bien un
     2638        ! dT negatif plus bas)
     2639        DO k = 1, klev
     2640           DO i = 1, klon
     2641              dthmin(i)=min(dthmin(i),dth(i,k))
     2642              ddd=dth(i,k)*(ph(i,k)-ph(i,k+1))
     2643              if (dthmin(i)<0.) then
     2644                  if (k>=k_ptop_provis(i)) then
     2645                      ddd=0.
     2646                  else if (dth(i,k)>=0.) then
     2647                      ddd=0.
     2648                      k_ptop_provis(i)=k+1
     2649                  endif
     2650              endif
     2651              int_dth(i,k+1) = int_dth(i,k)+ ddd
     2652           ENDDO
     2653        ENDDO
     2654
     2655        DO i = 1, klon
     2656           if ( k_ptop_provis(i)==klev+1 .or. .not. wk_adv(i)) then
     2657                k_ptop_provis(i)=1
     2658           endif
     2659        ENDDO
     2660    endif ! (abs(iflag_wk_new_ptop) == 1 )
    26242661   ! print*, 'xxx, int_dth', (k,int_dth(1,k),k=1,klev)
    26252662   ! print*, 'xxx, k_ptop_provis', k_ptop_provis(1)
    26262663   
     2664
    26272665 
     2666    ! On se limite ?? des poches avec integrale dT * dp < -wk_int_delta_t_min
     2667    do i=1,klon
     2668          if (int_dth(i,k_ptop_provis(i)) > -wk_int_delta_t_min .or. k_ptop_provis(i)==1) then
     2669          !if (1==0) then
     2670             wk_active(i)=.false.
     2671             ptop(i)=ph(i,1)
     2672             ktop(i)=1
     2673             hw_(i)=0.
     2674          else
     2675             wk_active(i)=wk_adv(i)
     2676          endif
     2677    enddo
     2678
    26282679    DO i=1,klon
    2629        IF (wk_adv(i)) THEN
     2680       IF (wk_active(i)) THEN
    26302681        frac_int_dth(i)=wk_frac_int_delta_t*int_dth(i,k_ptop_provis(i))
    2631        !ELSE
    2632        ! frac_int_dth(i)=0.
    26332682       ENDIF
    26342683    ENDDO
     
    26362685       DO i =1, klon
    26372686!         print*,ipas,'yyy ',k,int_dth(i,k),frac_int_dth(i)
    2638           IF (wk_adv(i)) THEN
     2687          IF (wk_active(i)) THEN
    26392688            IF (int_dth(i,k)>=frac_int_dth(i)) THEN
    26402689              ktop1(i) = min(k, k_ptop_provis(i))
     2690              !ktop1(i) = k
    26412691              !print*,ipas,'yyy ktop1= ',ktop1
    26422692            ENDIF
     
    26472697   
    26482698    DO i = 1, klon
    2649        IF (wk_adv(i)) THEN
     2699       IF (wk_active(i)) THEN
    26502700           !print*, ipas,'xxx1, int_dth(i,ktop1(i)), frac_int_dth(i), int_dth(i,ktop1(i)+1) ',ktop1
    26512701           ddd=int_dth(i,ktop1(i)+1)-int_dth(i,ktop1(i))
     
    26552705              omega(i) = (frac_int_dth(i) - int_dth(i,ktop1(i)))/ddd
    26562706           endif
    2657            print*,'OMEGA ',omega(i)
     2707           !! print*,'OMEGA ',omega(i)
    26582708       END IF
    26592709    END DO
    26602710   
    2661     print*, 'xxx'
    2662     DO i = 1, klon
    2663        IF (wk_adv(i)) THEN
     2711    !! print*, 'xxx'
     2712    DO i = 1, klon
     2713       IF (wk_active(i)) THEN
    26642714      ! print*, 'xxx, int_dth(i,ktop1(i)), frac_int_dth(i), int_dth(i,ktop1(i)+1) ', &
    26652715      !               int_dth(i,ktop1(i)), frac_int_dth(i), int_dth(i,ktop1(i)+1)
     
    26712721   
    26722722    DO i=1, klon
    2673        IF (wk_adv(i)) THEN
     2723       IF (wk_active(i)) THEN
    26742724           zzz(i, 1) = 0
    26752725       END IF
     
    26772727    DO k = 1, klev
    26782728       DO i = 1, klon
    2679            IF (wk_adv(i)) THEN         
     2729           IF (wk_active(i)) THEN         
    26802730              dzz(i,k) = (ph(i,k) - ph(i,k+1))/(rho(i,k)*RG)
    26812731              zzz(i,k+1) = zzz(i,k) + dzz(i,k)
     
    26852735   
    26862736    DO i =1, klon
    2687        IF (wk_adv(i)) THEN
     2737       IF (wk_active(i)) THEN
    26882738           h_zzz(i) = max((1- omega(i))*zzz(i,ktop1(i)) + omega(i)*zzz(i,ktop1(i)+1), hwmin)
    26892739       END IF
    26902740    END DO
    26912741
    2692 ENDIF
     2742
     2743ENDIF ! (iflag_wk_new_ptop/=0)
    26932744
    26942745!if (iflag_wk_new_ptop==2) then
     
    27202771
    27212772ELSE
    2722  
    27232773  DO i=1, klon
    27242774     ! pupper(i) = wk_pupper*ptop(i)+(1.-wk_pupper)*ph(i, 1)
    2725      pupper(i) = min( wk_pupper*ptop(i)+(1.-wk_pupper)*ph(i, 1) , ptop(i)-5000.)
     2775     !  pupper(i) = min( wk_pupper*ptop(i)+(1.-wk_pupper)*ph(i, 1) , ptop(i)-50.)
     2776      pupper(i) = min( wk_pupper*ptop(i)+(1.-wk_pupper)*ph(i, 1) , ptop(i)-5000.)
    27262777  END DO
    27272778END IF
     
    27412792  END DO
    27422793  !---------- FIN nouveau calcul hw et ptop -------------------------------------
     2794
     2795IF (iflag_wk_new_ptop==999) THEN
     2796    DO i = 1, klon
     2797    hw_(i)=0.
     2798    ptop(i)=ph(i,1)
     2799    Ktop(i)=1
     2800    pupper(i)=ph(i,2)
     2801    kupper(i)=2
     2802    h_zzz(i)=0.
     2803    Ptop1(i)=ph(i,1)
     2804    ENDDO
     2805ENDIF
     2806
     2807zk_ptop_provis=k_ptop_provis
    27432808
    27442809    RETURN
     
    27982863 
    27992864  REAL                                                  :: delta_t_min
    2800   INTEGER                                               :: nsub
    28012865  INTEGER                                               :: i, k
    28022866  REAL                                                  :: wdens0
  • LMDZ6/trunk/libf/phylmd/lmdz_wake_ini.F90

    r4845 r4908  
    5555  INTEGER, SAVE, PROTECTED                                    :: iflag_wk_profile
    5656  !$OMP THREADPRIVATE(iflag_wk_profile)
     57
     58  INTEGER, SAVE, PROTECTED                                    :: wk_nsub
     59  !$OMP THREADPRIVATE(wk_nsub)
    5760
    5861  INTEGER, SAVE, PROTECTED                                    :: iflag_wk_new_ptop
     
    7578  REAL, SAVE, PROTECTED                                        ::smallestreal
    7679  !$OMP THREADPRIVATE(smallestreal)
     80  REAL, SAVE, PROTECTED                                        :: wk_int_delta_t_min
     81  !$OMP THREADPRIVATE(wk_int_delta_t_min)
    7782
    7883
     
    226231  CALL getin_p('iflag_wk_new_ptop',iflag_wk_new_ptop)
    227232
     233  wk_nsub = 10
     234  CALL getin_p('wk_nsub',wk_nsub)
     235
    228236  tau_cv = 4000.
    229237  CALL getin_p('tau_cv', tau_cv)
     
    231239  wk_delta_t_min = 0.
    232240  CALL getin_p('wk_delta_t_min', wk_delta_t_min)
     241 
     242  wk_int_delta_t_min = 10.
     243  CALL getin_p('wk_int_delta_t_min', wk_int_delta_t_min)
    233244 
    234245  wk_frac_int_delta_t = 0.9
     
    262273 
    263274  WRITE(*,*) 'wk_delta_t_min=', wk_delta_t_min
     275  WRITE(*,*) 'wk_int_delta_t_min=', wk_int_delta_t_min
    264276  WRITE(*,*) 'wk_frac_int_delta_t=', wk_frac_int_delta_t
    265277  WRITE(*,*) 'iflag_wk_new_ptop=', iflag_wk_new_ptop
     278  WRITE(*,*) 'wk_nsub=', wk_nsub
    266279
    267280 RETURN
Note: See TracChangeset for help on using the changeset viewer.