Ignore:
Timestamp:
Feb 24, 2017, 7:50:33 PM (7 years ago)
Author:
jyg
Message:

New diagnostics to verify energy conservation.
Some corrections to improve energy conservation.
Some bug correction.

New output variables and new flags are

introduced:

(1)New variables: d_xx_col is the budget over

each column of variable "xx".

(2) fl_ebil: 0 -> no diag; 1 -> diags activated
(3) fl_cor_ebil: 0 -> no correction ensuring

energy conservation; 1 -> first set of
corrections.

+ ok_bad_ecmwf_thermo: if true, a bug setting

RVTMP2 to 0 is fixed; for backward compatibility
the default is "false".

File:
1 edited

Legend:

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

    r2159 r2799  
    99  SAVE
    1010  PRIVATE
    11   PUBLIC :: climb_hq_down, climb_hq_up
     11  PUBLIC :: climb_hq_down, climb_hq_up, d_h_col_vdf, f_h_bnd
    1212
    1313  REAL, DIMENSION(:,:), ALLOCATABLE :: gamaq, gamah
     
    2323  REAL, DIMENSION(:,:), ALLOCATABLE :: Kcoefhq
    2424  !$OMP THREADPRIVATE(Kcoefhq)
     25  REAL, SAVE, DIMENSION(:,:), ALLOCATABLE :: h_old ! for diagnostics, h before solving diffusion
     26  !$OMP THREADPRIVATE(h_old)
     27  REAL, SAVE, DIMENSION(:), ALLOCATABLE :: d_h_col_vdf ! for diagnostics, vertical integral of enthalpy change
     28  !$OMP THREADPRIVATE(d_h_col_vdf)
     29  REAL, SAVE, DIMENSION(:), ALLOCATABLE :: f_h_bnd ! for diagnostics, enthalpy flux at surface
     30  !$OMP THREADPRIVATE(d_h_bnd)
    2531
    2632CONTAINS
     
    7177    LOGICAL, SAVE                            :: first=.TRUE.
    7278    !$OMP THREADPRIVATE(first)
    73     REAL, DIMENSION(klon,klev)               :: local_H
     79! JLD now renamed h_old and declared in module
     80!    REAL, DIMENSION(klon,klev)               :: local_H
    7481    REAL, DIMENSION(klon)                    :: psref
    7582    REAL                                     :: delz, pkh
    7683    INTEGER                                  :: k, i, ierr
    77 
    7884! Include
    7985!****************************************************************************************
     
    113119       ALLOCATE(gamah(1:klon,2:klev), STAT=ierr)
    114120       IF ( ierr /= 0 ) PRINT*,' pb in allloc gamah, ierr=', ierr
     121       
     122       ALLOCATE(h_old(klon,klev), STAT=ierr)
     123       IF ( ierr /= 0 )  PRINT*,' pb in allloc h_old, ierr=', ierr
     124       
     125       ALLOCATE(d_h_col_vdf(klon), STAT=ierr)
     126       IF ( ierr /= 0 )  PRINT*,' pb in allloc d_h_col_vdf, ierr=', ierr
     127       
     128       ALLOCATE(f_h_bnd(klon), STAT=ierr)
     129       IF ( ierr /= 0 )  PRINT*,' pb in allloc f_h_bnd, ierr=', ierr
    115130    END IF
    116131
     
    177192!
    178193!****************************************************************************************
    179     local_H(:,:) = 0.0
     194    h_old(:,:) = 0.0
    180195
    181196    DO k=1,klev
    182197       DO i = 1, knon
    183198          ! convertie la temperature en entalpie potentielle
    184           local_H(i,k) = RCPD * temp(i,k) * &
     199          h_old(i,k) = RCPD * temp(i,k) * &
    185200               (psref(i)/pplay(i,k))**RKAPPA
    186201       ENDDO
    187202    ENDDO
    188203
    189     CALL calc_coef(knon, Kcoefhq(:,:), gamah(:,:), delp(:,:), local_H(:,:), &
     204    CALL calc_coef(knon, Kcoefhq(:,:), gamah(:,:), delp(:,:), h_old(:,:), &
    190205         Ccoef_H(:,:), Dcoef_H(:,:), Acoef_H, Bcoef_H)
    191206 
     
    349364! 1)
    350365! Definition of some variables
     366    REAL, DIMENSION(klon,klev)               :: d_h, zairm
    351367!
    352368!****************************************************************************************
     
    355371    d_q(:,:)    = 0.0
    356372    d_t(:,:)    = 0.0
     373    d_h(:,:)    = 0.0
     374    f_h_bnd(:)= 0.0
    357375
    358376    psref(1:knon) = paprs(1:knon,1) 
     
    393411    q_new(1:knon,1) = Acoef_Q(1:knon) + Bcoef_Q(1:knon)*flx_q1(1:knon)*dtime
    394412    h_new(1:knon,1) = Acoef_H(1:knon) + Bcoef_H(1:knon)*flx_h1(1:knon)*dtime
    395    
     413    f_h_bnd(1:knon) = flx_h1(1:knon)
    396414!- All the other layers
    397415    DO k = 2, klev
     
    427445!
    428446!****************************************************************************************
    429 
     447    d_h_col_vdf(:) = 0.0
    430448    DO k = 1, klev
    431449       DO i = 1, knon
    432450          d_t(i,k) = h_new(i,k)/(psref(i)/pplay(i,k))**RKAPPA/RCPD - t_old(i,k)
    433451          d_q(i,k) = q_new(i,k) - q_old(i,k)
    434        END DO
     452          d_h(i,k) = h_new(i,k) - h_old(i,k)
     453!JLD          d_t(i,k) = d_h(i,k)/(psref(i)/pplay(i,k))**RKAPPA/RCPD    !correction a venir
     454    ! layer air mass
     455          zairm(i, k) = (paprs(i,k)-paprs(i,k+1))/rg
     456          d_h_col_vdf(i) = d_h_col_vdf(i) + d_h(i,k)*zairm(i,k)
     457        END DO
    435458    END DO
    436459
     
    448471       DEALLOCATE(Kcoefhq,stat=ierr)
    449472       IF ( ierr /= 0 )  PRINT*,' pb in dealllocate Kcoefhq, ierr=', ierr
     473       DEALLOCATE(h_old, d_h_col_vdf, f_h_bnd, stat=ierr)
     474       IF ( ierr /= 0 )  PRINT*,' pb in dealllocate h_old, d_h_col_vdf, f_h_bnd, ierr=', ierr
    450475    END IF
    451476  END SUBROUTINE climb_hq_up
Note: See TracChangeset for help on using the changeset viewer.