- Timestamp:
- Mar 15, 2010, 5:37:02 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd/thermcell_dv2.F90
r1146 r1326 10 10 ! de "thermiques" explicitement representes 11 11 ! calcul du dq/dt une fois qu'on connait les ascendances 12 ! 13 ! Vectorisation, FH : 2010/03/08 12 14 ! 13 15 !======================================================================= … … 31 33 real qa(ngrid,nlay),detr(ngrid,nlay),zf,zf2 32 34 real wvd(ngrid,nlay+1),wud(ngrid,nlay+1) 33 real gamma0 ,gamma(ngrid,nlay+1)35 real gamma0(ngrid,nlay+1),gamma(ngrid,nlay+1) 34 36 real ue(ngrid,nlay),ve(ngrid,nlay) 35 real dua,dva 37 LOGICAL ltherm(ngrid,nlay) 38 real dua(ngrid,nlay),dva(ngrid,nlay) 36 39 integer iter 37 40 38 integer ig,k 41 integer ig,k,nlarga0 42 43 !------------------------------------------------------------------------- 39 44 40 45 ! calcul du detrainement 46 !--------------------------- 47 48 print*,'THERMCELL DV2 OPTIMISE 3' 49 50 nlarga0=0. 41 51 42 52 do k=1,nlay … … 59 69 do k=2,nlay 60 70 do ig=1,ngrid 61 if ((fm(ig,k+1)+detr(ig,k))*ptimestep.gt. & 62 & 1.e-5*masse(ig,k)) then 63 ! On itère sur la valeur du coeff de freinage. 64 ! gamma0=rho(ig,k)*(zlev(ig,k+1)-zlev(ig,k)) 65 !IM 060508 beg 66 ! if(0.5*(fraca(ig,k+1)+fraca(ig,k)).LT.0.) THEN 67 ! print*,'th_dv2 ig k fraca(:,k) fraca(:k+1)', & 68 ! & ig,k,fraca(ig,k),fraca(ig,k+1) 69 ! endif 70 ! if(larga(ig).EQ.0.) THEN 71 ! print*,'th_dv2 ig larga=0.',ig 72 ! endif 73 if(larga(ig).GT.0.) THEN 74 !IM 060508 end 75 gamma0=masse(ig,k) & 71 ltherm(ig,k)=(fm(ig,k+1)+detr(ig,k))*ptimestep > 1.e-5*masse(ig,k) 72 if(ltherm(ig,k).and.larga(ig)>0.) then 73 gamma0(ig,k)=masse(ig,k) & 76 74 & *sqrt( 0.5*(fraca(ig,k+1)+fraca(ig,k)) ) & 77 75 & *0.5/larga(ig) & 78 76 & *1. 79 !IM 060508 beg 80 else 81 if(prt_level.GE.10) print*,'WARNING cas ELSE on initialise gamma0=0.' 82 gamma0=0. 83 endif !(larga(ig).GT.0.) THEN 84 !IM 060508 end 85 ! s *0.5 86 ! gamma0=0. 87 zf=0.5*(fraca(ig,k)+fraca(ig,k+1)) 77 else 78 gamma0(ig,k)=0. 79 endif 80 if (ltherm(ig,k).and.larga(ig)<=0.) nlarga0=nlarga0+1 81 enddo 82 enddo 83 84 gamma(:,:)=0. 85 86 do k=2,nlay 87 88 do ig=1,ngrid 89 if (ltherm(ig,k)) then 90 dua(ig,k)=ua(ig,k-1)-u(ig,k-1) 91 dva(ig,k)=va(ig,k-1)-v(ig,k-1) 92 else 93 ua(ig,k)=u(ig,k) 94 va(ig,k)=v(ig,k) 95 ue(ig,k)=u(ig,k) 96 ve(ig,k)=v(ig,k) 97 endif 98 enddo 99 100 101 ! Debut des iterations 102 !---------------------- 103 do iter=1,5 104 do ig=1,ngrid 105 ! Pour memoire : calcul prenant en compte la fraction reelle 106 ! zf=0.5*(fraca(ig,k)+fraca(ig,k+1)) 107 ! zf2=1./(1.-zf) 108 ! Calcul avec fraction infiniement petite 88 109 zf=0. 89 zf2=1. /(1.-zf)90 ! la première fois on multiplie le coefficient de freinage 91 ! par le module du vent dans la couche en dessous.92 dua=ua(ig,k-1)-u(ig,k-1) 93 dva=va(ig,k-1)-v(ig,k-1) 94 do iter=1,5110 zf2=1. 111 112 ! la première fois on multiplie le coefficient de freinage 113 ! par le module du vent dans la couche en dessous. 114 ! Mais pourquoi donc ??? 115 if (ltherm(ig,k)) then 95 116 ! On choisit une relaxation lineaire. 96 gamma(ig,k)=gamma0 117 ! gamma(ig,k)=gamma0(ig,k) 97 118 ! On choisit une relaxation quadratique. 98 gamma(ig,k)=gamma0 *sqrt(dua**2+dva**2)119 gamma(ig,k)=gamma0(ig,k)*sqrt(dua(ig,k)**2+dva(ig,k)**2) 99 120 ua(ig,k)=(fm(ig,k)*ua(ig,k-1) & 100 121 & +(zf2*entr(ig,k)+gamma(ig,k))*u(ig,k)) & … … 105 126 & /(fm(ig,k+1)+detr(ig,k)+entr(ig,k)*zf*zf2 & 106 127 & +gamma(ig,k)) 107 ! print*,k,ua(ig,k),va(ig,k),u(ig,k),v(ig,k),dua ,dva108 dua =ua(ig,k)-u(ig,k)109 dva =va(ig,k)-v(ig,k)128 ! print*,k,ua(ig,k),va(ig,k),u(ig,k),v(ig,k),dua(ig,k),dva(ig,k) 129 dua(ig,k)=ua(ig,k)-u(ig,k) 130 dva(ig,k)=va(ig,k)-v(ig,k) 110 131 ue(ig,k)=(u(ig,k)-zf*ua(ig,k))*zf2 111 132 ve(ig,k)=(v(ig,k)-zf*va(ig,k))*zf2 112 enddo 113 else 114 ua(ig,k)=u(ig,k) 115 va(ig,k)=v(ig,k) 116 ue(ig,k)=u(ig,k) 117 ve(ig,k)=v(ig,k) 118 gamma(ig,k)=0. 119 endif 133 endif 120 134 enddo 121 enddo 135 ! Fin des iterations 136 !-------------------- 137 enddo 122 138 139 enddo ! k=2,nlay 140 141 142 ! Calcul du flux vertical de moment dans l'environnement. 143 !--------------------------------------------------------- 123 144 do k=2,nlay 124 145 do ig=1,ngrid … … 134 155 enddo 135 156 157 ! calcul des tendances. 158 !----------------------- 136 159 do k=1,nlay 137 160 do ig=1,ngrid 138 !IM139 if(prt_level.GE.10) print*,'th_dv2 ig k gamma entr detr ua ue va ve wud wvd masse',ig,k,gamma(ig,k), &140 & entr(ig,k),detr(ig,k),ua(ig,k),ue(ig,k),va(ig,k),ve(ig,k),wud(ig,k),wvd(ig,k),wud(ig,k+1),wvd(ig,k+1), &141 & masse(ig,k)142 !143 161 du(ig,k)=((detr(ig,k)+gamma(ig,k))*ua(ig,k) & 144 162 & -(entr(ig,k)+gamma(ig,k))*ue(ig,k) & … … 152 170 enddo 153 171 172 173 ! Sorties eventuelles. 174 !---------------------- 175 176 if(prt_level.GE.10) then 177 do k=1,nlay 178 do ig=1,ngrid 179 print*,'th_dv2 ig k gamma entr detr ua ue va ve wud wvd masse',ig,k,gamma(ig,k), & 180 & entr(ig,k),detr(ig,k),ua(ig,k),ue(ig,k),va(ig,k),ve(ig,k),wud(ig,k),wvd(ig,k),wud(ig,k+1),wvd(ig,k+1), & 181 & masse(ig,k) 182 enddo 183 enddo 184 endif 185 ! 186 if (nlarga0>0) then 187 print*,'WARNING !!!!!! DANS THERMCELL_DV2 ' 188 print*,nlarga0,' points pour lesquels laraga=0. dans un thermique' 189 print*,'Il faudrait decortiquer ces points' 190 endif 191 154 192 return 155 193 end
Note: See TracChangeset
for help on using the changeset viewer.