Changeset 1311 for LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd/yamada4.F
- Timestamp:
- Feb 18, 2010, 2:14:02 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ4/branches/LMDZ4V5.0-dev/libf/phylmd/yamada4.F
r1299 r1311 1 1 ! 2 ! $ Id$2 ! $Header$ 3 3 ! 4 4 SUBROUTINE yamada4(ngrid,dt,g,rconst,plev,temp … … 38 38 c iflag_pbl=7 : MY 2.0.Fournier 39 39 c iflag_pbl=8 : MY 2.5 40 c iflag_pbl =9 : un test ?40 c iflag_pbl>=9 : MY 2.5 avec diffusion verticale 41 41 42 42 c....................................................................... … … 66 66 67 67 integer nlay,nlev 68 cym PARAMETER (nlay=klev)69 cym PARAMETER (nlev=klev+1)70 68 71 69 logical first … … 98 96 real fl,zzz,zl0,zq2,zn2 99 97 100 cym real rino(klon,klev+1),smyam(klon,klev),styam(klon,klev) 101 cym s ,lyam(klon,klev),knyam(klon,klev) 102 cym s ,w2yam(klon,klev),t2yam(klon,klev) 103 real,allocatable,save,dimension(:,:) :: rino,smyam,styam,lyam, 104 s knyam,w2yam,t2yam 105 cym common/pbldiag/rino,smyam,styam,lyam,knyam,w2yam,t2yam 106 c$OMP THREADPRIVATE(rino,smyam,styam,lyam,knyam,w2yam,t2yam) 98 real rino(klon,klev+1),smyam(klon,klev),styam(klon,klev) 99 s ,lyam(klon,klev),knyam(klon,klev) 100 s ,w2yam(klon,klev),t2yam(klon,klev) 107 101 logical,save :: firstcall=.true. 108 109 character (len=20) :: modname='yamada4'110 character (len=80) :: abort_message111 112 102 c$OMP THREADPRIVATE(firstcall) 113 103 frif(ri)=0.6588*(ri+0.1776-sqrt(ri*ri-0.3221*ri+0.03156)) … … 123 113 124 114 if (firstcall) then 125 allocate(rino(klon,klev+1),smyam(klon,klev),styam(klon,klev))126 allocate(lyam(klon,klev),knyam(klon,klev))127 allocate(w2yam(klon,klev),t2yam(klon,klev))128 115 allocate(l0(klon)) 129 116 firstcall=.false. … … 131 118 132 119 133 if (.not.(iflag_pbl.ge.6.and.iflag_pbl.le.9)) then 134 abort_message = 'probleme de coherence dans appel a MY' 135 CALL abort_gcm (modname,abort_message,1) 120 if (.not.(iflag_pbl.ge.6.and.iflag_pbl.le.10)) then 121 stop'probleme de coherence dans appel a MY' 136 122 endif 137 123 … … 417 403 enddo 418 404 419 c if (iflag_pbl.ge.7..and.0.eq.1) then 420 c q2(:,1)=q2(:,2) 421 c call vdif_q2(dt,g,rconst,plev,temp,kq,q2) 422 c endif 405 if (iflag_pbl.ge.9) then 406 ! print*,'YAMADA VDIF' 407 q2(:,1)=q2(:,2) 408 call vdif_q2(dt,g,rconst,ngrid,plev,temp,kq,q2) 409 endif 423 410 424 411 c Traitement des cas noctrunes avec l'introduction d'une longueur … … 497 484 return 498 485 end 486 SUBROUTINE vdif_q2(timestep,gravity,rconst,ngrid,plev,temp, 487 & kmy,q2) 488 use dimphy 489 IMPLICIT NONE 490 c....................................................................... 491 #include "dimensions.h" 492 cccc#include "dimphy.h" 493 c....................................................................... 494 c 495 c dt : pas de temps 496 497 real plev(klon,klev+1) 498 real temp(klon,klev) 499 real timestep 500 real gravity,rconst 501 real kstar(klon,klev+1),zz 502 real kmy(klon,klev+1) 503 real q2(klon,klev+1) 504 real deltap(klon,klev+1) 505 real denom(klon,klev+1),alpha(klon,klev+1),beta(klon,klev+1) 506 integer ngrid 507 508 integer i,k 509 510 ! print*,'RD=',rconst 511 do k=1,klev 512 do i=1,ngrid 513 c test 514 ! print*,'i,k',i,k 515 ! print*,'temp(i,k)=',temp(i,k) 516 ! print*,'(plev(i,k)-plev(i,k+1))=',plev(i,k),plev(i,k+1) 517 zz=(plev(i,k)+plev(i,k+1))*gravity/(rconst*temp(i,k)) 518 kstar(i,k)=0.125*(kmy(i,k+1)+kmy(i,k))*zz*zz 519 s /(plev(i,k)-plev(i,k+1))*timestep 520 enddo 521 enddo 522 523 do k=2,klev 524 do i=1,ngrid 525 deltap(i,k)=0.5*(plev(i,k-1)-plev(i,k+1)) 526 enddo 527 enddo 528 do i=1,ngrid 529 deltap(i,1)=0.5*(plev(i,1)-plev(i,2)) 530 deltap(i,klev+1)=0.5*(plev(i,klev)-plev(i,klev+1)) 531 denom(i,klev+1)=deltap(i,klev+1)+kstar(i,klev) 532 alpha(i,klev+1)=deltap(i,klev+1)*q2(i,klev+1)/denom(i,klev+1) 533 beta(i,klev+1)=kstar(i,klev)/denom(i,klev+1) 534 enddo 535 536 do k=klev,2,-1 537 do i=1,ngrid 538 denom(i,k)=deltap(i,k)+(1.-beta(i,k+1))* 539 s kstar(i,k)+kstar(i,k-1) 540 c correction d'un bug 10 01 2001 541 alpha(i,k)=(q2(i,k)*deltap(i,k) 542 s +kstar(i,k)*alpha(i,k+1))/denom(i,k) 543 beta(i,k)=kstar(i,k-1)/denom(i,k) 544 enddo 545 enddo 546 547 c Si on recalcule q2(1) 548 if(1.eq.0) then 549 do i=1,ngrid 550 denom(i,1)=deltap(i,1)+(1-beta(i,2))*kstar(i,1) 551 q2(i,1)=(q2(i,1)*deltap(i,1) 552 s +kstar(i,1)*alpha(i,2))/denom(i,1) 553 enddo 554 endif 555 c sinon, on peut sauter cette boucle... 556 557 do k=2,klev+1 558 do i=1,ngrid 559 q2(i,k)=alpha(i,k)+beta(i,k)*q2(i,k-1) 560 enddo 561 enddo 562 563 return 564 end 565 SUBROUTINE vdif_q2e(timestep,gravity,rconst,ngrid, 566 & plev,temp,kmy,q2) 567 use dimphy 568 IMPLICIT NONE 569 c....................................................................... 570 #include "dimensions.h" 571 cccc#include "dimphy.h" 572 c....................................................................... 573 c 574 c dt : pas de temps 575 576 real plev(klon,klev+1) 577 real temp(klon,klev) 578 real timestep 579 real gravity,rconst 580 real kstar(klon,klev+1),zz 581 real kmy(klon,klev+1) 582 real q2(klon,klev+1) 583 real deltap(klon,klev+1) 584 real denom(klon,klev+1),alpha(klon,klev+1),beta(klon,klev+1) 585 integer ngrid 586 587 integer i,k 588 589 do k=1,klev 590 do i=1,ngrid 591 zz=(plev(i,k)+plev(i,k+1))*gravity/(rconst*temp(i,k)) 592 kstar(i,k)=0.125*(kmy(i,k+1)+kmy(i,k))*zz*zz 593 s /(plev(i,k)-plev(i,k+1))*timestep 594 enddo 595 enddo 596 597 do k=2,klev 598 do i=1,ngrid 599 deltap(i,k)=0.5*(plev(i,k-1)-plev(i,k+1)) 600 enddo 601 enddo 602 do i=1,ngrid 603 deltap(i,1)=0.5*(plev(i,1)-plev(i,2)) 604 deltap(i,klev+1)=0.5*(plev(i,klev)-plev(i,klev+1)) 605 enddo 606 607 do k=klev,2,-1 608 do i=1,ngrid 609 q2(i,k)=q2(i,k)+ 610 s ( kstar(i,k)*(q2(i,k+1)-q2(i,k)) 611 s -kstar(i,k-1)*(q2(i,k)-q2(i,k-1)) ) 612 s /deltap(i,k) 613 enddo 614 enddo 615 616 do i=1,ngrid 617 q2(i,1)=q2(i,1)+ 618 s ( kstar(i,1)*(q2(i,2)-q2(i,1)) 619 s ) 620 s /deltap(i,1) 621 q2(i,klev+1)=q2(i,klev+1)+ 622 s ( 623 s -kstar(i,klev)*(q2(i,klev+1)-q2(i,klev)) ) 624 s /deltap(i,klev+1) 625 enddo 626 627 return 628 end
Note: See TracChangeset
for help on using the changeset viewer.