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

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

Thermals. Finally corrected advection scheme... The bug was coming from a non conservation of fluxes, not from the advection scheme itself.

  • Property svn:executable set to *
File size: 3.1 KB
Line 
1      subroutine thermcell_dqup(ngrid,nlayer,ptimestep,fm0,entr0,  &
2     &    masse0,q_therm,dq_therm)
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      REAL, INTENT(IN) :: masse0(ngridmx,nlayermx)
26
27! ============================ OUTPUTS ===========================
28
29      REAL, INTENT(OUT) :: dq_therm(ngridmx,nlayermx)  ! dq/dt -> derivative
30
31! ============================ LOCAL =============================
32
33      REAL q(ngridmx,nlayermx)
34      REAL qa(ngridmx,nlayermx)
35      INTEGER ig,k
36      REAL detr(ngridmx,nlayermx),entr(ngridmx,nlayermx)
37      REAL wqd(ngridmx,nlayermx+1)
38      REAL zzm
39
40! =========== Init ==============================================
41
42      qa(:,:)=q_therm(:,:)
43      q(:,:)=q_therm(:,:)
44      entr(:,:)=entr0(:,:)
45      detr(:,:)=0.
46
47      do k=1,nlayermx
48         do ig=1,ngridmx
49            detr(ig,k)=fm0(ig,k)-fm0(ig,k+1)+entr(ig,k)
50            if (detr(ig,k).lt.0.) then
51               entr(ig,k)=entr(ig,k)-detr(ig,k)
52               detr(ig,k)=0.
53            endif
54         enddo
55      enddo
56
57! =========== Updraft ============================================
58
59      do ig=1,ngrid
60         qa(ig,1)=q(ig,1)
61      enddo
62
63      do k=2,nlayermx
64         do ig=1,ngridmx
65            if ((fm0(ig,k+1)+detr(ig,k))*ptimestep.gt.  &
66     &         1.e-5*masse0(ig,k)) then
67         qa(ig,k)=(fm0(ig,k)*qa(ig,k-1)+entr(ig,k)*q(ig,k))  &
68     &     /(fm0(ig,k+1)+detr(ig,k))
69            else
70               qa(ig,k)=q(ig,k)
71            endif
72         enddo
73      enddo
74
75! =========== Subsidence ==========================================
76
77      do k=2,nlayermx
78         do ig=1,ngridmx
79
80! Schema avec advection sur plus qu'une maille.
81            zzm=masse0(ig,k)/ptimestep
82            if (fm0(ig,k)>zzm) then
83               wqd(ig,k)=(zzm*q(ig,k)+(fm0(ig,k)-zzm)*q(ig,k+1))
84            else
85               wqd(ig,k)=fm0(ig,k)*q(ig,k)
86            endif
87         enddo
88      enddo
89      do ig=1,ngrid
90         wqd(ig,1)=0.
91         wqd(ig,nlayermx+1)=0.
92      enddo
93
94
95! ====== dq ======================================================
96
97      dq_therm(:,:)=0.
98
99         do k=1,nlayermx-1
100           q(:,k)=q(:,k)+         &
101     & (detr(:,k)*qa(:,k)-entr(:,k)*q(:,k) &
102     &       -wqd(:,k)+wqd(:,k+1))  &
103     &               *ptimestep/masse0(:,k)
104         enddo
105
106         do k=1,nlayermx-1
107          dq_therm(:,k)=(q(:,k)-q_therm(:,k))/ptimestep
108         enddo
109
110      return
111      end
Note: See TracBrowser for help on using the repository browser.