[4365] | 1 | SUBROUTINE thermcell_updown_dq(ngrid,nlay,lmax,eup,dup,edn,ddn,masse,theta,dtheta,thetau,thetad) |
---|
[4351] | 2 | |
---|
| 3 | !-------------------------------------------------------------- |
---|
[4365] | 4 | ! thermcell_updown_dq: calcul du transport d'un traceur en présence |
---|
| 5 | ! d'up/down drafts |
---|
[4351] | 6 | !-------------------------------------------------------------- |
---|
| 7 | |
---|
[4365] | 8 | ! Suite du travail : |
---|
| 9 | ! Calculer les tendances d'un traceur (ici theta) en tenant compte |
---|
| 10 | ! des up et down drafts et de la subsidence compensatoire. |
---|
[4351] | 11 | |
---|
[4365] | 12 | |
---|
| 13 | IMPLICIT NONE |
---|
| 14 | |
---|
| 15 | ! arguments |
---|
| 16 | |
---|
| 17 | integer,intent(in) :: ngrid,nlay |
---|
| 18 | real,intent(in), dimension(ngrid,nlay) :: eup,dup,edn,ddn,masse |
---|
| 19 | real,intent(in), dimension(ngrid,nlay) :: theta |
---|
| 20 | real,intent(out), dimension(ngrid,nlay) :: thetau,thetad,dtheta |
---|
| 21 | integer, intent(out), dimension(ngrid) :: lmax |
---|
| 22 | |
---|
| 23 | |
---|
| 24 | ! Local |
---|
| 25 | |
---|
| 26 | real, dimension(ngrid,nlay+1) :: fup,fdn |
---|
| 27 | |
---|
| 28 | integer ig,ilay |
---|
| 29 | |
---|
| 30 | fdn(:,:)=0. |
---|
| 31 | thetad(:,:)=0. |
---|
| 32 | |
---|
| 33 | ! lmax : indice tel que fu(kmax+1)=0 |
---|
| 34 | |
---|
| 35 | ! Dans ce cas, pas besoin d'initialiser thetad(lmax) ( =theta(lmax) ) |
---|
| 36 | |
---|
| 37 | do ilay=nlay,1,-1 |
---|
| 38 | do ig=1,ngrid |
---|
| 39 | if (ilay.le.lmax(ig)) then |
---|
| 40 | fdn(ig,ilay)=fdn(ig,ilay+1)+edn(ig,ilay)-ddn(ig,ilay) |
---|
| 41 | thetad(ig,ilay)=( fdn(ig,ilay+1)*thetad(ig,ilay+1) + edn(ig,ilay)*theta(ig,ilay) ) / (fdn(ig,ilay)+ddn(ig,ilay)) |
---|
| 42 | endif |
---|
| 43 | enddo |
---|
| 44 | enddo |
---|
| 45 | |
---|
| 46 | |
---|
| 47 | |
---|
| 48 | !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
---|
| 49 | ! Initialisations : |
---|
| 50 | !------------------ |
---|
| 51 | |
---|
| 52 | |
---|
| 53 | ! |
---|
| 54 | RETURN |
---|
| 55 | END |
---|
| 56 | |
---|
| 57 | !========================================================================= |
---|
| 58 | |
---|
| 59 | SUBROUTINE thermcell_down(ngrid,nlay,po,pt,pu,pv,pplay,pplev, & |
---|
| 60 | & lmax,fup,eup,dup,theta) |
---|
| 61 | |
---|
| 62 | !-------------------------------------------------------------- |
---|
| 63 | !thermcell_down: calcul des propriétés du panache descendant. |
---|
| 64 | !-------------------------------------------------------------- |
---|
| 65 | |
---|
| 66 | |
---|
[4351] | 67 | USE thermcell_ini_mod, ONLY : prt_level,RLvCp,RKAPPA,RETV |
---|
| 68 | IMPLICIT NONE |
---|
| 69 | |
---|
| 70 | ! arguments |
---|
| 71 | |
---|
| 72 | integer,intent(in) :: ngrid,nlay |
---|
[4365] | 73 | real,intent(in), dimension(ngrid,nlay) :: po,pt,pu,pv,pplay,eup,dup |
---|
| 74 | real,intent(in), dimension(ngrid,nlay) :: theta |
---|
[4351] | 75 | real,intent(in), dimension(ngrid,nlay+1) :: pplev,fup |
---|
| 76 | integer, intent(in), dimension(ngrid) :: lmax |
---|
| 77 | |
---|
| 78 | |
---|
| 79 | |
---|
| 80 | ! Local |
---|
| 81 | |
---|
[4365] | 82 | real, dimension(ngrid,nlay) :: edn,ddn,thetad |
---|
[4351] | 83 | real, dimension(ngrid,nlay+1) :: fdn |
---|
| 84 | |
---|
| 85 | integer ig,ilay |
---|
| 86 | real dqsat_dT |
---|
| 87 | logical mask(ngrid,nlay) |
---|
| 88 | |
---|
| 89 | edn(:,:)=0. |
---|
| 90 | ddn(:,:)=0. |
---|
| 91 | fdn(:,:)=0. |
---|
[4365] | 92 | thetad(:,:)=0. |
---|
[4351] | 93 | |
---|
[4365] | 94 | ! lmax : indice tel que fu(kmax+1)=0 |
---|
[4351] | 95 | |
---|
[4365] | 96 | ! Dans ce cas, pas besoin d'initialiser thetad(lmax) ( =theta(lmax) ) |
---|
[4351] | 97 | |
---|
[4365] | 98 | ! FH MODIFS APRES REUNIONS POUR COMMISSIONS |
---|
| 99 | ! quelques erreurs de declaration |
---|
| 100 | ! probleme si lmax=1 ce qui a l'air d'être le cas en début de simu. Devrait être 0 ? |
---|
| 101 | ! Remarques : |
---|
| 102 | ! on pourrait écrire la formule de thetad |
---|
| 103 | ! www=fdn(ig,ilay+1)/ (fdn(ig,ilay)+ddn(ig,ilay)) |
---|
| 104 | ! thetad(ig,ilay)= www * thetad(ig,ilay+1) + (1.-www) * theta(ig,ilay) |
---|
| 105 | ! Elle a l'avantage de bien montré la conservation, l'idée fondamentale dans le |
---|
| 106 | ! transport qu'on ne fait que sommer des "sources" au travers d'un "propagateur" |
---|
| 107 | ! (Green) |
---|
| 108 | ! Elle montre aussi beaucoup plus clairement pourquoi on n'a pas à se souccier (trop) |
---|
| 109 | ! de la possible nulité du dénominateur |
---|
| 110 | |
---|
| 111 | |
---|
| 112 | do ilay=nlay,1,-1 |
---|
[4351] | 113 | do ig=1,ngrid |
---|
[4365] | 114 | if (ilay.le.lmax(ig).and.lmax(ig)>1) then |
---|
| 115 | edn(ig,ilay)=0.5*dup(ig,ilay) |
---|
| 116 | ddn(ig,ilay)=0.5*eup(ig,ilay) |
---|
| 117 | fdn(ig,ilay)=fdn(ig,ilay+1)+edn(ig,ilay)-ddn(ig,ilay) |
---|
| 118 | thetad(ig,ilay)=( fdn(ig,ilay+1)*thetad(ig,ilay+1) + edn(ig,ilay)*theta(ig,ilay) ) / (fdn(ig,ilay)+ddn(ig,ilay)) |
---|
[4351] | 119 | endif |
---|
| 120 | enddo |
---|
| 121 | enddo |
---|
| 122 | |
---|
| 123 | ! Suite du travail : |
---|
| 124 | ! Ecrire la conservervation de theta_l dans le panache descendant |
---|
| 125 | ! Eventuellement faire la transformation theta_l -> theta_v |
---|
| 126 | ! Si l'air est sec (et qu'on oublie le côté theta_v) on peut |
---|
| 127 | ! se contenter de conserver theta. |
---|
| 128 | ! |
---|
| 129 | ! Connaissant thetadn, on peut calculer la flotabilité. |
---|
| 130 | ! Connaissant la flotabilité, on peut calculer w de proche en proche |
---|
| 131 | ! On peut calculer le detrainement de facon à garder alpha*rho = cste |
---|
| 132 | ! On en déduit l'entrainement latéral |
---|
| 133 | ! C'est le modèle des mini-projets. |
---|
| 134 | |
---|
| 135 | !^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ |
---|
| 136 | ! Initialisations : |
---|
| 137 | !------------------ |
---|
| 138 | |
---|
| 139 | |
---|
| 140 | ! |
---|
| 141 | RETURN |
---|
| 142 | END |
---|