Changeset 1403 for LMDZ4/trunk/libf/phylmd/traclmdz_mod.F90
- Timestamp:
- Jul 1, 2010, 11:02:53 AM (14 years ago)
- Location:
- LMDZ4/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ4/trunk
- Property svn:mergeinfo changed
-
LMDZ4/trunk/libf/phylmd/traclmdz_mod.F90
r1279 r1403 6 6 ! only if running without any other chemestry model as INCA or REPROBUS. 7 7 ! 8 9 IMPLICIT NONE 8 10 9 11 REAL,DIMENSION(:,:),ALLOCATABLE,SAVE :: masktr ! Masque reservoir de sol traceur … … 35 37 !$OMP THREADPRIVATE(id_be) 36 38 39 !IM ajout traceurs RR 40 INTEGER,SAVE :: id_dry !traceur dry intrusions 41 !$OMP THREADPRIVATE(id_dry) 42 INTEGER,SAVE :: id_pcsat, id_pcocsat, id_pcq ! traceurs pseudo-vapeur CL qsat, qsat_oc, q 43 !$OMP THREADPRIVATE(id_pcsat, id_pcocsat, id_pcq) 44 INTEGER,SAVE :: id_pcs0, id_pcos0, id_pcq0 ! traceurs pseudo-vapeur CL qsat, qsat_oc, q 45 ! ! qui ne sont pas transportes par la convection 46 !$OMP THREADPRIVATE(id_pcs0, id_pcos0, id_pcq0) 47 48 INTEGER, SAVE:: id_o3 49 !$OMP THREADPRIVATE(id_o3) 50 ! index of ozone tracer with Cariolle parameterization 51 ! 0 means no ozone tracer 52 37 53 LOGICAL,SAVE :: rnpb=.TRUE. ! Presence du couple Rn222, Pb210 38 54 !$OMP THREADPRIVATE(rnpb) … … 47 63 USE dimphy 48 64 USE infotrac 49 IMPLICIT NONE50 65 51 66 ! Input argument … … 65 80 66 81 67 SUBROUTINE traclmdz_init(pctsrf, ftsol, tr_seri, aerosol, lessivage)82 SUBROUTINE traclmdz_init(pctsrf, ftsol, tr_seri, t_seri, pplay, sh, aerosol, lessivage) 68 83 ! This subroutine allocates and initialize module variables and control variables. 69 84 USE dimphy 70 85 USE infotrac 86 USE regr_pr_comb_coefoz_m, ONLY: alloc_coefoz 87 USE press_coefoz_m, ONLY: press_coefoz 71 88 USE carbon_cycle_mod, ONLY : carbon_cycle_init, carbon_cycle_tr, carbon_cycle_cpl 72 73 IMPLICIT NONE74 89 75 90 INCLUDE "indicesol.h" … … 78 93 REAL,DIMENSION(klon,nbsrf),INTENT(IN) :: pctsrf ! Pourcentage de sol f(nature du sol) 79 94 REAL,DIMENSION(klon,nbsrf),INTENT(IN) :: ftsol ! Temperature du sol (surf)(Kelvin) 80 REAL,DIMENSION(klon,klev,nbtr),INTENT(IN) :: tr_seri! Concentration Traceur [U/KgA] 95 !IM traceurs RR REAL,DIMENSION(klon,klev,nbtr),INTENT(IN) :: tr_seri! Concentration Traceur [U/KgA] 96 REAL,DIMENSION(klon,klev,nbtr),INTENT(INOUT) :: tr_seri! Concentration Traceur [U/KgA] 97 REAL,DIMENSION(klon,klev),INTENT(IN) :: t_seri ! Temperature 98 REAL,DIMENSION(klon,klev),INTENT(IN) :: pplay ! pression pour le mileu de chaque couche (en Pa) 99 REAL,DIMENSION(klon,klev),INTENT(IN) :: sh ! humidite specifique 81 100 82 101 ! Output variables … … 85 104 86 105 ! Local variables 87 INTEGER :: ierr, it, iiq 106 INTEGER :: ierr, it, iiq, i, k 107 REAL,DIMENSION(klon,klev) :: qsat ! pression de la vapeur a saturation 88 108 89 109 ! -------------------------------------------- … … 121 141 122 142 ! 123 ! Recherche des traceurs connus : Be7, CO2,...143 ! Recherche des traceurs connus : Be7, O3, CO2,... 124 144 ! -------------------------------------------- 125 145 id_be=0 146 id_o3=0 126 147 DO it=1,nbtr 127 148 iiq=niadv(it+2) … … 135 156 CALL init_be(pctsrf,masktr(:,id_be),tautr(id_be),vdeptr(id_be),scavtr(id_be),srcbe) 136 157 WRITE(*,*) 'Initialisation srcBe: OK' 158 ELSE IF (tname(iiq)=="O3" .OR. tname(iiq)=="o3") THEN 159 ! Recherche de l'ozone : parametrization de la chimie par Cariolle 160 id_o3=it 161 CALL alloc_coefoz ! allocate ozone coefficients 162 CALL press_coefoz ! read input pressure levels 137 163 END IF 138 164 END DO 165 166 id_dry=0 167 168 DO it=1,nbtr 169 iiq=niadv(it+2) 170 IF ( tname(iiq) == "dry" .OR. tname(iiq) == "Dry" ) THEN 171 id_dry=it 172 END IF 173 END DO 174 175 id_pcsat=0 176 DO it=1,nbtr 177 iiq=niadv(it+2) 178 IF ( tname(iiq) == "pcsat" .OR. tname(iiq) == "Pcsat" ) THEN 179 id_pcsat=it 180 END IF 181 END DO 182 183 id_pcocsat=0 184 DO it=1,nbtr 185 iiq=niadv(it+2) 186 IF ( tname(iiq) == "pcocsat" .OR. tname(iiq) == "Pcocsat" ) THEN 187 id_pcocsat=it 188 END IF 189 END DO 190 191 id_pcq=0 192 DO it=1,nbtr 193 iiq=niadv(it+2) 194 IF ( tname(iiq) == "pcq" .OR. tname(iiq) == "Pcq" ) THEN 195 id_pcq=it 196 END IF 197 END DO 198 199 id_pcs0=0 200 DO it=1,nbtr 201 iiq=niadv(it+2) 202 IF ( tname(iiq) == "pcs0" .OR. tname(iiq) == "Pcs0" ) THEN 203 id_pcs0=it 204 END IF 205 END DO 206 207 id_pcos0=0 208 DO it=1,nbtr 209 iiq=niadv(it+2) 210 IF ( tname(iiq) == "pcos0" .OR. tname(iiq) == "Pcos0" ) THEN 211 id_pcos0=it 212 END IF 213 END DO 214 215 id_pcq0=0 216 DO it=1,nbtr 217 iiq=niadv(it+2) 218 IF ( tname(iiq) == "pcq0" .OR. tname(iiq) == "Pcq0" ) THEN 219 id_pcq0=it 220 END IF 221 END DO 222 139 223 ! 140 224 ! Valeurs specifiques pour les traceurs Rn222 et Pb210 … … 159 243 END IF 160 244 245 !IM initialisation traceurs pseudo-vapeurs 246 call q_sat(klon*klev,t_seri,pplay,qsat) 247 IF ( id_pcsat /= 0 ) THEN 248 DO k = 1, klev 249 DO i = 1, klon 250 IF ( pplay(i,k).GE.85000.) THEN 251 tr_seri(i,k,id_pcsat) = qsat(i,k) 252 ELSE 253 tr_seri(i,k,id_pcsat) = 100. 254 END IF 255 END DO 256 END DO 257 END IF 258 259 IF ( id_pcocsat /= 0 ) THEN 260 DO k = 1, klev 261 DO i = 1, klon 262 IF ( pplay(i,k).GE.85000.) THEN 263 IF ( pctsrf (i, is_oce) > 0. ) THEN 264 tr_seri(i,k,id_pcocsat) = qsat(i,k) 265 ELSE 266 tr_seri(i,k,id_pcocsat) = 100. 267 END IF 268 END IF 269 END DO 270 END DO 271 END IF 272 273 IF ( id_pcq /= 0 ) THEN 274 DO k = 1, klev 275 DO i = 1, klon 276 IF ( pplay(i,k).GE.85000.) THEN 277 tr_seri(i,k,id_pcq) = sh(i,k) 278 ELSE 279 tr_seri(i,k,id_pcq) = 100. 280 END IF 281 END DO 282 END DO 283 END IF 284 285 IF ( id_pcs0 /= 0 ) THEN 286 DO k = 1, klev 287 DO i = 1, klon 288 IF ( pplay(i,k).GE.85000.) THEN 289 tr_seri(i,k,id_pcs0) = qsat(i,k) 290 ELSE 291 tr_seri(i,k,id_pcs0) = 100. 292 END IF 293 END DO 294 END DO 295 END IF 296 297 IF ( id_pcos0 /= 0 ) THEN 298 DO k = 1, klev 299 DO i = 1, klon 300 IF ( pplay(i,k).GE.85000.) THEN 301 IF ( pctsrf (i, is_oce) > 0. ) THEN 302 tr_seri(i,k,id_pcos0) = qsat(i,k) 303 ELSE 304 tr_seri(i,k,id_pcos0) = 100. 305 END IF 306 END IF 307 END DO 308 END DO 309 END IF 310 311 IF ( id_pcq0 /= 0 ) THEN 312 DO k = 1, klev 313 DO i = 1, klon 314 IF ( pplay(i,k).GE.85000.) THEN 315 tr_seri(i,k,id_pcq0) = sh(i,k) 316 ELSE 317 tr_seri(i,k,id_pcq0) = 100. 318 END IF 319 END DO 320 END DO 321 END IF 322 161 323 END SUBROUTINE traclmdz_init 162 324 163 SUBROUTINE traclmdz( & 164 nstep, pdtphys, t_seri, & 165 paprs, pplay, cdragh, coefh, & 166 yu1, yv1, ftsol, pctsrf, & 167 xlat, couchelimite, & 168 tr_seri, source, solsym, d_tr_cl) 325 SUBROUTINE traclmdz(nstep, julien, gmtime, pdtphys, t_seri, paprs, pplay, & 326 cdragh, coefh, yu1, yv1, ftsol, pctsrf, xlat, xlon, couchelimite, sh, & 327 tr_seri, source, solsym, d_tr_cl, zmasse) 169 328 170 329 USE dimphy 171 330 USE infotrac 331 USE regr_pr_comb_coefoz_m, ONLY: regr_pr_comb_coefoz 332 USE o3_chem_m, ONLY: o3_chem 172 333 USE carbon_cycle_mod, ONLY : carbon_cycle, carbon_cycle_tr, carbon_cycle_cpl 173 174 IMPLICIT NONE175 176 334 INCLUDE "YOMCST.h" 177 335 INCLUDE "indicesol.h" … … 185 343 !Configuration grille,temps: 186 344 INTEGER,INTENT(IN) :: nstep ! nombre d'appels de la physiq 345 INTEGER,INTENT(IN) :: julien ! Jour julien 346 REAL,INTENT(IN) :: gmtime 187 347 REAL,INTENT(IN) :: pdtphys ! Pas d'integration pour la physique (seconde) 188 348 REAL,DIMENSION(klon),INTENT(IN) :: xlat ! latitudes pour chaque point 349 REAL, INTENT(IN):: xlon(:) ! dim(klon) longitude 189 350 190 351 ! … … 194 355 REAL,DIMENSION(klon,klev+1),INTENT(IN) :: paprs ! pression pour chaque inter-couche (en Pa) 195 356 REAL,DIMENSION(klon,klev),INTENT(IN) :: pplay ! pression pour le mileu de chaque couche (en Pa) 357 REAL,intent(in):: zmasse (:, :) ! dim(klon,klev) density of air, in kg/m2 196 358 197 359 … … 204 366 REAL,DIMENSION(klon),INTENT(IN) :: yv1 ! vents au premier niveau 205 367 LOGICAL,INTENT(IN) :: couchelimite 368 !IM traceurs RR 369 REAL,DIMENSION(klon,klev),INTENT(IN) :: sh ! humidite specifique 206 370 207 371 ! Arguments necessaires pour les sources et puits de traceur: … … 223 387 224 388 INTEGER :: i, k, it 389 INTEGER lmt_pas ! number of time steps of "physics" per day 225 390 226 391 REAL,DIMENSION(klon) :: d_trs ! Td dans le reservoir 227 REAL,DIMENSION(klon,klev) :: delp ! epaisseur de couche (Pa)228 229 392 REAL,DIMENSION(klon,klev,nbtr) :: d_tr_dec ! Td radioactive 230 393 REAL :: zrho ! Masse Volumique de l'air KgA/m3 231 394 232 ! 395 !IM traceurs RR 396 REAL,DIMENSION(klon,klev) :: qsat ! pression de la vapeur a saturation 397 REAL :: amn, amx 233 398 ! 234 399 !================================================================= … … 245 410 END IF 246 411 412 !IM ajout traceurs RR 413 call q_sat(klon*klev,t_seri,pplay,qsat) 414 415 IF ( id_pcsat /= 0 ) THEN 416 DO k = 1, klev 417 DO i = 1, klon 418 IF ( pplay(i,k).GE.85000.) THEN 419 tr_seri(i,k,id_pcsat) = qsat(i,k) 420 END IF 421 END DO 422 END DO 423 END IF 424 425 IF ( id_pcocsat /= 0 ) THEN 426 DO k = 1, klev 427 DO i = 1, klon 428 IF ( pplay(i,k).GE.85000.) THEN 429 IF ( pctsrf (i, is_oce) > 0. ) THEN 430 tr_seri(i,k,id_pcocsat) = qsat(i,k) 431 END IF 432 END IF 433 END DO 434 END DO 435 END IF 436 437 IF ( id_pcq /= 0 ) THEN 438 DO k = 1, klev 439 DO i = 1, klon 440 IF ( pplay(i,k).GE.85000.) THEN 441 tr_seri(i,k,id_pcq) = sh(i,k) 442 END IF 443 END DO 444 END DO 445 END IF 446 447 IF ( id_pcs0 /= 0 ) THEN 448 DO k = 1, klev 449 DO i = 1, klon 450 IF ( pplay(i,k).GE.85000.) THEN 451 tr_seri(i,k,id_pcs0) = qsat(i,k) 452 END IF 453 END DO 454 END DO 455 END IF 456 457 IF ( id_pcos0 /= 0 ) THEN 458 DO k = 1, klev 459 DO i = 1, klon 460 IF ( pplay(i,k).GE.85000.) THEN 461 IF ( pctsrf (i, is_oce) > 0. ) THEN 462 tr_seri(i,k,id_pcos0) = qsat(i,k) 463 END IF 464 END IF 465 END DO 466 END DO 467 END IF 468 469 IF ( id_pcq0 /= 0 ) THEN 470 DO k = 1, klev 471 DO i = 1, klon 472 IF ( pplay(i,k).GE.85000.) THEN 473 tr_seri(i,k,id_pcq0) = sh(i,k) 474 END IF 475 END DO 476 END DO 477 END IF 247 478 248 479 DO it=1,nbtr … … 265 496 END IF 266 497 267 268 DO k = 1, klev269 DO i = 1, klon270 delp(i,k) = paprs(i,k)-paprs(i,k+1)271 END DO272 END DO273 274 498 DO it=1, nbtr 275 499 IF (couchelimite .AND. pbl_flg(it) == 0 ) THEN ! couche limite avec quantite dans le sol calculee … … 277 501 cdragh, coefh,t_seri,ftsol,pctsrf, & 278 502 tr_seri(:,:,it),trs(:,it), & 279 paprs, pplay, delp,&503 paprs, pplay, zmasse * rg, & 280 504 masktr(:,it),fshtr(:,it),hsoltr(it),& 281 505 tautr(it),vdeptr(it), & … … 294 518 END IF 295 519 END DO 296 520 521 !IM traceurs RR 522 IF ( id_pcsat /= 0 ) THEN 523 DO k = 1, klev 524 DO i = 1, klon 525 IF ( pplay(i,k).LT.85000.) THEN 526 tr_seri(i,k,id_pcsat) = MIN (qsat(i,k), tr_seri(i,k,id_pcsat)) 527 END IF 528 END DO 529 END DO 530 END IF 531 532 IF ( id_pcocsat /= 0 ) THEN 533 DO k = 1, klev 534 DO i = 1, klon 535 IF ( pplay(i,k).LT.85000.) THEN 536 tr_seri(i,k,id_pcocsat) = MIN (qsat(i,k), tr_seri(i,k,id_pcocsat)) 537 END IF 538 END DO 539 END DO 540 END IF 541 542 IF ( id_pcq /= 0 ) THEN 543 DO k = 1, klev 544 DO i = 1, klon 545 IF ( pplay(i,k).LT.85000.) THEN 546 tr_seri(i,k,id_pcq) = MIN (qsat(i,k), tr_seri(i,k,id_pcq)) 547 END IF 548 END DO 549 END DO 550 END IF 551 552 IF ( id_pcs0 /= 0 ) THEN 553 DO k = 1, klev 554 DO i = 1, klon 555 IF ( pplay(i,k).LT.85000.) THEN 556 tr_seri(i,k,id_pcs0) = MIN (qsat(i,k), tr_seri(i,k,id_pcs0)) 557 END IF 558 END DO 559 END DO 560 END IF 561 562 IF ( id_pcos0 /= 0 ) THEN 563 DO k = 1, klev 564 DO i = 1, klon 565 IF ( pplay(i,k).LT.85000.) THEN 566 tr_seri(i,k,id_pcos0) = MIN (qsat(i,k), tr_seri(i,k,id_pcos0)) 567 END IF 568 END DO 569 END DO 570 END IF 571 572 IF ( id_pcq0 /= 0 ) THEN 573 DO k = 1, klev 574 DO i = 1, klon 575 IF ( pplay(i,k).LT.85000.) THEN 576 tr_seri(i,k,id_pcq0) = MIN (qsat(i,k), tr_seri(i,k,id_pcq0)) 577 END IF 578 END DO 579 END DO 580 END IF 297 581 !====================================================================== 298 582 ! Calcul de l'effet du puits radioactif … … 312 596 313 597 !====================================================================== 598 ! Parameterization of ozone chemistry 599 !====================================================================== 600 601 IF (id_o3 /= 0) then 602 lmt_pas = NINT(86400./pdtphys) 603 IF (MOD(nstep - 1, lmt_pas) == 0) THEN 604 ! Once per day, update the coefficients for ozone chemistry: 605 CALL regr_pr_comb_coefoz(julien, xlat, paprs, pplay) 606 END IF 607 CALL o3_chem(julien, gmtime, t_seri, zmasse, pdtphys, xlat, & 608 xlon, tr_seri(:, :, id_o3)) 609 END IF 610 611 !====================================================================== 314 612 ! Calcul de cycle de carbon 315 613 !====================================================================== … … 327 625 USE infotrac 328 626 329 IMPLICIT NONE330 331 627 REAL,DIMENSION(klon,nbtr), INTENT(OUT) :: trs_out 332 628 INTEGER :: ierr
Note: See TracChangeset
for help on using the changeset viewer.