[628] | 1 | subroutine thermcell_dqup(ngrid,nlayer,ptimestep,fm,entr,detr, & |
---|
| 2 | & masse0,q_therm,dq_therm,ndt,zlmax) |
---|
[337] | 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 |
---|
[628] | 12 | ! |
---|
| 13 | ! Version with sub-timestep for Martian thin layers |
---|
| 14 | ! |
---|
[337] | 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 |
---|
[628] | 24 | REAL, INTENT(IN) :: fm(ngridmx,nlayermx+1) |
---|
| 25 | REAL, INTENT(IN) :: entr(ngridmx,nlayermx) |
---|
| 26 | REAL, INTENT(IN) :: detr(ngridmx,nlayermx) |
---|
[337] | 27 | REAL, INTENT(IN) :: q_therm(ngridmx,nlayermx) |
---|
| 28 | REAL, INTENT(IN) :: masse0(ngridmx,nlayermx) |
---|
[628] | 29 | INTEGER, INTENT(IN) :: ndt |
---|
| 30 | INTEGER, INTENT(IN) :: zlmax |
---|
[337] | 31 | |
---|
| 32 | ! ============================ OUTPUTS =========================== |
---|
| 33 | |
---|
[342] | 34 | REAL, INTENT(OUT) :: dq_therm(ngridmx,nlayermx) ! dq/dt -> derivative |
---|
[337] | 35 | |
---|
| 36 | ! ============================ LOCAL ============================= |
---|
| 37 | |
---|
| 38 | REAL q(ngridmx,nlayermx) |
---|
| 39 | REAL qa(ngridmx,nlayermx) |
---|
[628] | 40 | INTEGER ig,k,i |
---|
| 41 | REAL invflux0(ngridmx,nlayermx) |
---|
| 42 | REAL ztimestep |
---|
[621] | 43 | |
---|
[337] | 44 | ! =========== Init ============================================== |
---|
| 45 | |
---|
| 46 | qa(:,:)=q_therm(:,:) |
---|
| 47 | q(:,:)=q_therm(:,:) |
---|
| 48 | |
---|
[628] | 49 | ! ====== Computing q ============================================ |
---|
[621] | 50 | |
---|
[628] | 51 | dq_therm(:,:)=0. |
---|
| 52 | ztimestep=ptimestep/real(ndt) |
---|
| 53 | invflux0(:,:)=ztimestep/masse0(:,:) |
---|
[621] | 54 | |
---|
[628] | 55 | do i=1,ndt |
---|
| 56 | |
---|
[621] | 57 | do ig=1,ngrid |
---|
| 58 | qa(ig,1)=q(ig,1) |
---|
[620] | 59 | enddo |
---|
[621] | 60 | |
---|
[628] | 61 | do k=2,zlmax |
---|
[621] | 62 | do ig=1,ngridmx |
---|
[628] | 63 | if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt. & |
---|
[621] | 64 | & 1.e-5*masse0(ig,k)) then |
---|
[628] | 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)) |
---|
[621] | 67 | else |
---|
| 68 | qa(ig,k)=q(ig,k) |
---|
| 69 | endif |
---|
| 70 | enddo |
---|
[337] | 71 | enddo |
---|
| 72 | |
---|
[628] | 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) |
---|
[619] | 78 | enddo |
---|
| 79 | |
---|
[628] | 80 | enddo !of do i=1,ndt |
---|
[337] | 81 | |
---|
[628] | 82 | ! ====== Derivative ============================================== |
---|
[621] | 83 | |
---|
[337] | 84 | |
---|
[628] | 85 | do k=1,zlmax |
---|
[621] | 86 | dq_therm(:,k)=(q(:,k)-q_therm(:,k))/ptimestep |
---|
| 87 | enddo |
---|
[337] | 88 | |
---|
[628] | 89 | ! ============== |
---|
| 90 | |
---|
[337] | 91 | return |
---|
| 92 | end |
---|
[628] | 93 | |
---|