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

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

Correction to advection problems in thermals + made the thermals model faster by limiting the vertical extension of loops with the height reached by thermals.

  • Property svn:executable set to *
File size: 2.6 KB
Line 
1      subroutine thermcell_dqup(ngrid,nlayer,ptimestep,fm,entr,detr,  &
2     &    masse0,q_therm,dq_therm,ndt,zlmax)
3      implicit none
4
5!=======================================================================
6!
7!   Calcul du transport verticale dans la couche limite en presence
8!   de "thermiques" explicitement representes
9!   calcul du dq/dt une fois qu'on connait les ascendances
10!   Version modifiee pour prendre les downdrafts a la place de la
11!   subsidence compensatoire
12!
13!   Version with sub-timestep for Martian thin layers
14!
15!=======================================================================
16
17#include "dimensions.h"
18#include "dimphys.h"
19
20! ============================ INPUTS ============================
21
22      INTEGER, INTENT(IN) :: ngrid,nlayer
23      REAL, INTENT(IN) :: ptimestep
24      REAL, INTENT(IN) :: fm(ngridmx,nlayermx+1)
25      REAL, INTENT(IN) :: entr(ngridmx,nlayermx)
26      REAL, INTENT(IN) :: detr(ngridmx,nlayermx)
27      REAL, INTENT(IN) :: q_therm(ngridmx,nlayermx)
28      REAL, INTENT(IN) :: masse0(ngridmx,nlayermx)
29      INTEGER, INTENT(IN) :: ndt
30      INTEGER, INTENT(IN) :: zlmax
31
32! ============================ OUTPUTS ===========================
33
34      REAL, INTENT(OUT) :: dq_therm(ngridmx,nlayermx)  ! dq/dt -> derivative
35
36! ============================ LOCAL =============================
37
38      REAL q(ngridmx,nlayermx)
39      REAL qa(ngridmx,nlayermx)
40      INTEGER ig,k,i
41      REAL invflux0(ngridmx,nlayermx)
42      REAL ztimestep
43
44! =========== Init ==============================================
45
46      qa(:,:)=q_therm(:,:)
47      q(:,:)=q_therm(:,:)
48
49! ====== Computing q ============================================
50
51      dq_therm(:,:)=0.
52      ztimestep=ptimestep/real(ndt)
53      invflux0(:,:)=ztimestep/masse0(:,:)     
54
55      do i=1,ndt
56
57      do ig=1,ngrid
58         qa(ig,1)=q(ig,1)
59      enddo
60
61      do k=2,zlmax
62         do ig=1,ngridmx
63            if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt.  &
64     &         1.e-5*masse0(ig,k)) then
65         qa(ig,k)=(fm(ig,k)*qa(ig,k-1)+entr(ig,k)*q(ig,k))  &
66     &     /(fm(ig,k+1)+detr(ig,k))
67            else
68               qa(ig,k)=q(ig,k)
69            endif
70         enddo
71      enddo
72
73      do k=1,zlmax
74           q(:,k)=q(:,k)+         &
75     & (detr(:,k)*qa(:,k)-entr(:,k)*q(:,k) &
76     &    -fm(:,k)*q(:,k)+fm(:,k+1)*q(:,k+1))  &
77     &               *invflux0(:,k)
78      enddo
79
80      enddo !of do i=1,ndt
81
82! ====== Derivative ==============================================
83
84
85         do k=1,zlmax
86          dq_therm(:,k)=(q(:,k)-q_therm(:,k))/ptimestep
87         enddo
88
89! ==============
90
91      return
92      end
93
Note: See TracBrowser for help on using the repository browser.