source: trunk/LMDZ.MARS/libf/phymars/thermcell_dqup.F90 @ 619

Last change on this file since 619 was 619, checked in by acolaitis, 13 years ago

THERMALS: corrected improper tracer conservation that would appear in sharp tracer gradient cases. Tracer conservation is now identical to convective adjustment

  • Property svn:executable set to *
File size: 3.2 KB
Line 
1      subroutine thermcell_dqup(ngrid,nlayer,ptimestep,fm0,entr0,  &
2     &    alpha,masse0,q_therm,dq_therm,charvar,zdz)
3      implicit none
4
5! #include "iniprint.h"
6!=======================================================================
7!
8!   Calcul du transport verticale dans la couche limite en presence
9!   de "thermiques" explicitement representes
10!   calcul du dq/dt une fois qu'on connait les ascendances
11!   Version modifiee pour prendre les downdrafts a la place de la
12!   subsidence compensatoire
13!=======================================================================
14
15#include "dimensions.h"
16#include "dimphys.h"
17
18! ============================ INPUTS ============================
19
20      INTEGER, INTENT(IN) :: ngrid,nlayer
21      REAL, INTENT(IN) :: ptimestep
22      REAL, INTENT(IN) :: fm0(ngridmx,nlayermx+1)
23      REAL, INTENT(IN) ::entr0(ngridmx,nlayermx)
24      REAL, INTENT(IN) :: q_therm(ngridmx,nlayermx)
25      CHARACTER (LEN=20), INTENT(IN) :: charvar
26      REAL, INTENT(IN) :: masse0(ngridmx,nlayermx)
27      REAL, INTENT(IN) :: zdz(ngridmx,nlayermx)
28      REAL, INTENT(IN) :: alpha(ngridmx,nlayermx+1)
29
30! ============================ OUTPUTS ===========================
31
32      REAL, INTENT(OUT) :: dq_therm(ngridmx,nlayermx)  ! dq/dt -> derivative
33
34! ============================ LOCAL =============================
35
36      REAL q(ngridmx,nlayermx)
37      REAL qa(ngridmx,nlayermx)
38      REAL qd(ngridmx,nlayermx)
39      INTEGER ig,k
40      REAL gammaf(ngridmx,nlayermx),fmid(ngridmx,nlayermx)
41      REAL gammae(ngridmx,nlayermx)
42      REAL alphamid(ngridmx,nlayermx)
43
44! =========== Init ==============================================
45
46      qa(:,:)=q_therm(:,:)
47      q(:,:)=q_therm(:,:)
48
49      do ig=1,ngridmx
50         do k=1, nlayermx
51            if (fm0(ig,k)+entr0(ig,k) .gt. 0.) then
52              gammaf(ig,k)=fm0(ig,k)/(fm0(ig,k)+entr0(ig,k))
53              gammae(ig,k)=fm0(ig,k+1)/(fm0(ig,k)+entr0(ig,k))
54            else
55              gammaf(ig,k)=0.
56              gammae(ig,k)=1.
57            endif
58         enddo
59      enddo
60
61
62! =========== Updraft ============================================
63
64!      qa(:,1)=q_therm(:,1)
65
66
67      do ig=1,ngridmx
68         do k=2, nlayermx
69
70             qa(ig,k)=gammaf(ig,k)*qa(ig,k-1)+(1.-gammaf(ig,k))*q(ig,k)
71
72         enddo
73      enddo
74
75! =========== Environnement =======================================
76
77!     q(:,nlayermx)=q_therm(:,nlayermx)
78
79      do ig=1,ngridmx
80         do k=nlayermx-1, 1,-1
81 
82             q(ig,k)=gammae(ig,k)*q(ig,k+1)+(1.-gammae(ig,k))*qa(ig,k)
83
84         enddo
85      enddo
86
87! ====== dq ======================================================
88
89      dq_therm(:,:)=0.
90      fmid(:,:)=0.
91      alphamid(:,:)=0.
92
93        do ig=1, ngridmx
94           do k=1,nlayermx
95              fmid(ig,k) = 0.5*(fm0(ig,k)+fm0(ig,k+1))
96              alphamid(ig,k) = 0.5*(alpha(ig,k)+alpha(ig,k+1))
97           enddo
98        enddo
99
100        do ig=1, ngridmx
101           do k=1,nlayermx-1
102              dq_therm(ig,k)=-(1./masse0(ig,k))*(  &
103     &   (1.-alphamid(ig,k+1))*fmid(ig,k+1)*(qa(ig,k+1)-q(ig,k+1)) -   &
104     &   (1.-alphamid(ig,k))*fmid(ig,k)*(qa(ig,k)-q(ig,k))          ) &
105     &       /zdz(ig,k)
106
107           enddo
108        enddo
109      return
110      end
Note: See TracBrowser for help on using the repository browser.