Changeset 5942 for LMDZ6/trunk/libf/phylmd/climb_qbs_mod.f90
- Timestamp:
- Dec 17, 2025, 7:33:39 PM (2 weeks ago)
- File:
-
- 1 edited
-
LMDZ6/trunk/libf/phylmd/climb_qbs_mod.f90 (modified) (16 diffs)
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/trunk/libf/phylmd/climb_qbs_mod.f90
r5400 r5942 23 23 !**************************************************************************************** 24 24 ! 25 SUBROUTINE climb_qbs_down(knon, coefqbs, paprs, pplay, &25 SUBROUTINE climb_qbs_down(knon, ni, coefqbs, paprs, pplay, & 26 26 delp, temp, qbs, dtime, & 27 27 Ccoef_QBS_out, Dcoef_QBS_out, & … … 37 37 !**************************************************************************************** 38 38 INTEGER, INTENT(IN) :: knon 39 REAL, DIMENSION(klon,klev), INTENT(IN) :: coefqbs 40 REAL, DIMENSION(klon,klev), INTENT(IN) :: pplay 41 REAL, DIMENSION(klon,klev+1), INTENT(IN) :: paprs 42 REAL, DIMENSION(klon,klev), INTENT(IN) :: delp 43 REAL, DIMENSION(klon,klev), INTENT(IN) :: temp 44 REAL, DIMENSION(klon,klev), INTENT(IN) :: qbs 39 INTEGER, INTENT(IN) :: ni(knon) 40 REAL, DIMENSION(knon,klev), INTENT(IN) :: coefqbs 41 REAL, DIMENSION(knon,klev), INTENT(IN) :: pplay 42 REAL, DIMENSION(knon,klev+1), INTENT(IN) :: paprs 43 REAL, DIMENSION(knon,klev), INTENT(IN) :: delp 44 REAL, DIMENSION(knon,klev), INTENT(IN) :: temp 45 REAL, DIMENSION(knon,klev), INTENT(IN) :: qbs 45 46 REAL, INTENT(IN) :: dtime 46 47 47 48 ! Output arguments 48 49 !**************************************************************************************** 49 REAL, DIMENSION(k lon), INTENT(OUT) :: Acoef_QBS_out50 REAL, DIMENSION(k lon), INTENT(OUT) :: Bcoef_QBS_out51 52 REAL, DIMENSION(k lon,klev), INTENT(OUT) :: Ccoef_QBS_out53 REAL, DIMENSION(k lon,klev), INTENT(OUT) :: Dcoef_QBS_out54 REAL, DIMENSION(k lon,klev), INTENT(OUT) :: Kcoef_qbs_out55 REAL, DIMENSION(k lon,klev), INTENT(OUT) :: gama_qbs_out50 REAL, DIMENSION(knon), INTENT(OUT) :: Acoef_QBS_out 51 REAL, DIMENSION(knon), INTENT(OUT) :: Bcoef_QBS_out 52 53 REAL, DIMENSION(knon,klev), INTENT(OUT) :: Ccoef_QBS_out 54 REAL, DIMENSION(knon,klev), INTENT(OUT) :: Dcoef_QBS_out 55 REAL, DIMENSION(knon,klev), INTENT(OUT) :: Kcoef_qbs_out 56 REAL, DIMENSION(knon,klev), INTENT(OUT) :: gama_qbs_out 56 57 57 58 ! Local variables 58 59 !**************************************************************************************** 60 REAL :: yCcoef_QBS(knon,klev) 61 REAL :: yDcoef_QBS(knon,klev) 62 REAL :: yAcoef_QBS(knon), yBcoef_QBS(knon) 63 REAL :: yKcoefqbs(knon,klev) 64 REAL :: ygamaqbs(1:knon,2:klev) 65 59 66 LOGICAL, SAVE :: first=.TRUE. 60 67 !$OMP THREADPRIVATE(first) 61 REAL, DIMENSION(k lon) :: psref68 REAL, DIMENSION(knon) :: psref 62 69 REAL :: delz, pkh 63 INTEGER :: k, i, ierr70 INTEGER :: k, i, j, ierr 64 71 !**************************************************************************************** 65 72 ! 1) … … 92 99 ! 93 100 !**************************************************************************************** 94 Kcoefqbs(:,:) = 0.0101 yKcoefqbs(:,:) = 0.0 95 102 DO k = 2, klev 96 103 DO i = 1, knon 97 Kcoefqbs(i,k) = &104 yKcoefqbs(i,k) = & 98 105 coefqbs(i,k)*RG*RG*dtime /(pplay(i,k-1)-pplay(i,k)) & 99 106 *(paprs(i,k)*2/(temp(i,k)+temp(i,k-1))/RD)**2 … … 111 118 ! definition of gama 112 119 IF (iflag_pbl == 1) THEN 113 gamaqbs(:,:) = 0.0120 ygamaqbs(:,:) = 0.0 114 121 115 122 ! conversion de gama … … 121 128 122 129 ! convertie gradient verticale de contenu en neige soufflee en difference de neige soufflee entre centre de couches 123 gamaqbs(i,k) =gamaqbs(i,k) * delz130 ygamaqbs(i,k) = ygamaqbs(i,k) * delz 124 131 ENDDO 125 132 ENDDO 126 133 127 134 ELSE 128 gamaqbs(:,:) = 0.0135 ygamaqbs(:,:) = 0.0 129 136 ENDIF 130 137 … … 136 143 !**************************************************************************************** 137 144 138 CALL calc_coef_qbs(knon, Kcoefqbs(:,:),gamaqbs(:,:), delp(:,:), qbs(:,:), &139 Ccoef_QBS(:,:), Dcoef_QBS(:,:), Acoef_QBS,Bcoef_QBS)145 CALL calc_coef_qbs(knon, yKcoefqbs(:,:), ygamaqbs(:,:), delp(:,:), qbs(:,:), & 146 yCcoef_QBS(:,:), yDcoef_QBS(:,:), yAcoef_QBS, yBcoef_QBS) 140 147 141 148 … … 145 152 ! 146 153 !**************************************************************************************** 147 Acoef_QBS_out = Acoef_QBS148 Bcoef_QBS_out = Bcoef_QBS154 Acoef_QBS_out = yAcoef_QBS 155 Bcoef_QBS_out = yBcoef_QBS 149 156 150 157 !**************************************************************************************** … … 155 162 IF (mod(iflag_pbl_split,10) .ge.1) THEN 156 163 DO k= 1, klev 157 DO i= 1, k lon158 Ccoef_QBS_out(i,k) = Ccoef_QBS(i,k)159 Dcoef_QBS_out(i,k) = Dcoef_QBS(i,k)160 Kcoef_qbs_out(i,k) = Kcoefqbs(i,k)164 DO i= 1, knon 165 Ccoef_QBS_out(i,k) = yCcoef_QBS(i,k) 166 Dcoef_QBS_out(i,k) = yDcoef_QBS(i,k) 167 Kcoef_qbs_out(i,k) = yKcoefqbs(i,k) 161 168 IF (k.eq.1) THEN 162 169 gama_qbs_out(i,k) = 0. 163 170 ELSE 164 gama_qbs_out(i,k) = gamaqbs(i,k)171 gama_qbs_out(i,k) = ygamaqbs(i,k) 165 172 ENDIF 166 173 ENDDO … … 169 176 ENDIF ! (mod(iflag_pbl_split,2) .ge.1) 170 177 !!! 178 DO k= 1, klev 179 DO j= 1, knon 180 i=ni(j) 181 IF (k==1) THEN 182 Acoef_QBS(i) = yAcoef_QBS(j) 183 Bcoef_QBS(i) = yBcoef_QBS(j) 184 ENDIF 185 IF (k>=2) gamaqbs(i,k)=ygamaqbs(j,k) 186 Ccoef_QBS(i,k) = yCcoef_QBS(j,k) 187 Dcoef_QBS(i,k) = yDcoef_QBS(j,k) 188 Kcoefqbs(i,k) = yKcoefqbs(j,k) 189 ENDDO 190 ENDDO 171 191 172 192 END SUBROUTINE climb_qbs_down … … 182 202 !**************************************************************************************** 183 203 INTEGER, INTENT(IN) :: knon 184 REAL, DIMENSION(k lon,klev), INTENT(IN) :: Kcoef, delp185 REAL, DIMENSION(k lon,klev), INTENT(IN) :: X186 REAL, DIMENSION(k lon,2:klev), INTENT(IN) :: gama204 REAL, DIMENSION(knon,klev), INTENT(IN) :: Kcoef, delp 205 REAL, DIMENSION(knon,klev), INTENT(IN) :: X 206 REAL, DIMENSION(knon,2:klev), INTENT(IN) :: gama 187 207 188 208 ! Output arguments 189 209 !**************************************************************************************** 190 REAL, DIMENSION(k lon), INTENT(OUT) :: Acoef, Bcoef191 REAL, DIMENSION(k lon,klev), INTENT(OUT) :: Ccoef, Dcoef210 REAL, DIMENSION(knon), INTENT(OUT) :: Acoef, Bcoef 211 REAL, DIMENSION(knon,klev), INTENT(OUT) :: Ccoef, Dcoef 192 212 193 213 ! Local variables … … 240 260 !**************************************************************************************** 241 261 ! 242 SUBROUTINE climb_qbs_up(knon, dtime, qbs_old, &262 SUBROUTINE climb_qbs_up(knon, ni, dtime, qbs_old, & 243 263 flx_qbs1, paprs, pplay, & 244 264 Acoef_QBS_in, Bcoef_QBS_in, & … … 257 277 !**************************************************************************************** 258 278 INTEGER, INTENT(IN) :: knon 279 INTEGER, INTENT(IN) :: ni(knon) 259 280 REAL, INTENT(IN) :: dtime 260 REAL, DIMENSION(k lon,klev), INTENT(IN) :: qbs_old261 REAL, DIMENSION(k lon), INTENT(IN) :: flx_qbs1262 REAL, DIMENSION(k lon,klev+1), INTENT(IN) :: paprs263 REAL, DIMENSION(k lon,klev), INTENT(IN) :: pplay281 REAL, DIMENSION(knon,klev), INTENT(IN) :: qbs_old 282 REAL, DIMENSION(knon), INTENT(IN) :: flx_qbs1 283 REAL, DIMENSION(knon,klev+1), INTENT(IN) :: paprs 284 REAL, DIMENSION(knon,klev), INTENT(IN) :: pplay 264 285 265 286 !!! nrlmd le 02/05/2011 266 REAL, DIMENSION(k lon), INTENT(IN) :: Acoef_QBS_in, Bcoef_QBS_in267 REAL, DIMENSION(k lon,klev), INTENT(IN) :: Ccoef_QBS_in, Dcoef_QBS_in268 REAL, DIMENSION(k lon,klev), INTENT(IN) :: Kcoef_qbs_in, gama_qbs_in287 REAL, DIMENSION(knon), INTENT(IN) :: Acoef_QBS_in, Bcoef_QBS_in 288 REAL, DIMENSION(knon,klev), INTENT(IN) :: Ccoef_QBS_in, Dcoef_QBS_in 289 REAL, DIMENSION(knon,klev), INTENT(IN) :: Kcoef_qbs_in, gama_qbs_in 269 290 !!! 270 291 271 292 ! Output arguments 272 293 !**************************************************************************************** 273 REAL, DIMENSION(k lon,klev), INTENT(OUT) :: flux_qbs, d_qbs294 REAL, DIMENSION(knon,klev), INTENT(OUT) :: flux_qbs, d_qbs 274 295 275 296 ! Local variables 276 297 !**************************************************************************************** 298 REAL :: yCcoef_QBS(knon,klev) 299 REAL :: yDcoef_QBS(knon,klev) 300 REAL :: yAcoef_QBS(knon), yBcoef_QBS(knon) 301 REAL :: yKcoefqbs(knon,klev) 302 REAL :: ygamaqbs(1:knon,2:klev) 303 277 304 LOGICAL, SAVE :: last=.FALSE. 278 305 !$OMP THREADPRIVATE(last) 279 REAL, DIMENSION(k lon,klev) :: qbs_new280 REAL, DIMENSION(k lon) :: psref281 INTEGER :: k, i, ierr306 REAL, DIMENSION(knon,klev) :: qbs_new 307 REAL, DIMENSION(knon) :: psref 308 INTEGER :: k, i, j, ierr 282 309 !**************************************************************************************** 283 310 ! 1) 284 311 ! Definition of some variables 285 REAL, DIMENSION(k lon,klev) :: zairm312 REAL, DIMENSION(knon,klev) :: zairm 286 313 ! 287 314 !**************************************************************************************** … … 291 318 psref(1:knon) = paprs(1:knon,1) 292 319 320 DO k= 1, klev 321 DO j= 1, knon 322 i=ni(j) 323 IF (k==1) THEN 324 yAcoef_QBS(j) = Acoef_QBS(i) 325 yBcoef_QBS(j) = Bcoef_QBS(i) 326 ENDIF 327 IF (k>=2) ygamaqbs(j,k)=gamaqbs(i,k) 328 yCcoef_QBS(j,k) = Ccoef_QBS(i,k) 329 yDcoef_QBS(j,k) = Dcoef_QBS(i,k) 330 yKcoefqbs(j,k) = Kcoefqbs(i,k) 331 ENDDO 332 ENDDO 333 293 334 IF (mod(iflag_pbl_split,10) .ge.1) THEN 294 335 DO i = 1, knon 295 Acoef_QBS(i)=Acoef_QBS_in(i)296 Bcoef_QBS(i)=Bcoef_QBS_in(i)336 yAcoef_QBS(i)=Acoef_QBS_in(i) 337 yBcoef_QBS(i)=Bcoef_QBS_in(i) 297 338 ENDDO 298 339 DO k = 1, klev 299 340 DO i = 1, knon 300 Ccoef_QBS(i,k)=Ccoef_QBS_in(i,k)301 Dcoef_QBS(i,k)=Dcoef_QBS_in(i,k)302 Kcoefqbs(i,k)=Kcoef_qbs_in(i,k)341 yCcoef_QBS(i,k)=Ccoef_QBS_in(i,k) 342 yDcoef_QBS(i,k)=Dcoef_QBS_in(i,k) 343 yKcoefqbs(i,k)=Kcoef_qbs_in(i,k) 303 344 IF (k.gt.1) THEN 304 gamaqbs(i,k)=gama_qbs_in(i,k)345 ygamaqbs(i,k)=gama_qbs_in(i,k) 305 346 ENDIF 306 347 ENDDO … … 317 358 318 359 !- First layer 319 qbs_new(1:knon,1) = Acoef_QBS(1:knon) +Bcoef_QBS(1:knon)*flx_qbs1(1:knon)*dtime360 qbs_new(1:knon,1) = yAcoef_QBS(1:knon) + yBcoef_QBS(1:knon)*flx_qbs1(1:knon)*dtime 320 361 !- All the other layers 321 362 DO k = 2, klev 322 363 DO i = 1, knon 323 qbs_new(i,k) = Ccoef_QBS(i,k) +Dcoef_QBS(i,k)*qbs_new(i,k-1)364 qbs_new(i,k) = yCcoef_QBS(i,k) + yDcoef_QBS(i,k)*qbs_new(i,k-1) 324 365 END DO 325 366 END DO … … 336 377 DO k = 2, klev 337 378 DO i = 1, knon 338 flux_qbs(i,k) = ( Kcoefqbs(i,k)/RG/dtime) * &339 (qbs_new(i,k)-qbs_new(i,k-1)+ gamaqbs(i,k))379 flux_qbs(i,k) = (yKcoefqbs(i,k)/RG/dtime) * & 380 (qbs_new(i,k)-qbs_new(i,k-1)+ygamaqbs(i,k)) 340 381 END DO 341 382 END DO … … 353 394 END DO 354 395 396 DO k= 1, klev 397 DO j= 1, knon 398 i=ni(j) 399 IF (k==1) THEN 400 Acoef_QBS(i) = yAcoef_QBS(j) 401 Bcoef_QBS(i) = yBcoef_QBS(j) 402 ENDIF 403 IF (k>=2) gamaqbs(i,k)=ygamaqbs(j,k) 404 Ccoef_QBS(i,k) = yCcoef_QBS(j,k) 405 Dcoef_QBS(i,k) = yDcoef_QBS(j,k) 406 Kcoefqbs(i,k) = yKcoefqbs(j,k) 407 ENDDO 408 ENDDO 355 409 !**************************************************************************************** 356 410 ! Some deallocations
Note: See TracChangeset
for help on using the changeset viewer.
