Changeset 1806 for LMDZ5/trunk
- Timestamp:
- Jul 19, 2013, 4:25:17 PM (11 years ago)
- Location:
- LMDZ5/trunk/libf/dyn3dmem
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/trunk/libf/dyn3dmem/guide_loc_mod.F90
r1733 r1806 295 295 use parallel 296 296 USE control_mod 297 USE write_field_loc 297 298 298 299 IMPLICIT NONE … … 313 314 !$OMP THREADPRIVATE(first) 314 315 LOGICAL :: f_out ! sortie guidage 315 REAL, DIMENSION (ijb_u:ije_u,llm) :: f_add ! var aux: champ de guidage 316 REAL, ALLOCATABLE, SAVE, DIMENSION (:,:) :: f_addu ! var aux: champ de guidage 317 REAL, ALLOCATABLE, SAVE, DIMENSION (:,:) :: f_addv ! var aux: champ de guidage 316 318 ! Variables pour fonction Exner (P milieu couche) 317 REAL, DIMENSION (iip1,jjb_u:jje_u,llm) :: pk, pkf318 REAL, DIMENSION (iip1,jjb_u:jje_u,llm) :: alpha, beta319 REAL, DIMENSION (iip1,jjb_u:jje_u) :: pks319 REAL, ALLOCATABLE, SAVE, DIMENSION (:,:,:) :: pk, pkf 320 REAL, ALLOCATABLE, SAVE, DIMENSION (:,:,:) :: alpha, beta 321 REAL, ALLOCATABLE, SAVE, DIMENSION (:,:) :: pks 320 322 REAL :: unskap 321 REAL, DIMENSION (ijb_u:ije_u,llmp1) :: p ! besoin si guide_P323 REAL, ALLOCATABLE, SAVE, DIMENSION (:,:) :: p ! besoin si guide_P 322 324 ! Compteurs temps: 323 325 INTEGER, SAVE :: step_rea,count_no_rea,itau_test ! lecture guidage … … 329 331 330 332 INTEGER :: i,j,l 331 333 332 334 !$OMP MASTER 333 335 ijbu=ij_begin ; ijeu=ij_end ; ijnu=ijeu-ijbu+1 … … 358 360 first=.FALSE. 359 361 !$OMP MASTER 362 ALLOCATE(f_addu(ijb_u:ije_u,llm) ) 363 ALLOCATE(f_addv(ijb_v:ije_v,llm) ) 364 ALLOCATE(pk(iip1,jjb_u:jje_u,llm) ) 365 ALLOCATE(pkf(iip1,jjb_u:jje_u,llm) ) 366 ALLOCATE(alpha(iip1,jjb_u:jje_u,llm) ) 367 ALLOCATE(beta(iip1,jjb_u:jje_u,llm) ) 368 ALLOCATE(pks(iip1,jjb_u:jje_u) ) 369 ALLOCATE(p(ijb_u:ije_u,llmp1) ) 360 370 CALL guide_init 361 371 !$OMP END MASTER … … 367 377 factt=dtvr*iperiod/daysec 368 378 !$OMP MASTER 369 call tau2alpha(3, iip1,jjnb_v ,factt,tau_min_v,tau_max_v,alpha_v)370 call tau2alpha(2, iip1,jjnb_u,factt,tau_min_u,tau_max_u,alpha_u)371 call tau2alpha(1, iip1,jjnb_u,factt,tau_min_T,tau_max_T,alpha_T)372 call tau2alpha(1, iip1,jjnb_u,factt,tau_min_P,tau_max_P,alpha_P)373 call tau2alpha(1, iip1,jjnb_u,factt,tau_min_Q,tau_max_Q,alpha_Q)379 call tau2alpha(3, iip1, jjb_v, jje_v, factt, tau_min_v, tau_max_v, alpha_v) 380 call tau2alpha(2, iip1, jjb_u, jje_u, factt, tau_min_u, tau_max_u, alpha_u) 381 call tau2alpha(1, iip1, jjb_u, jje_u, factt, tau_min_T, tau_max_T, alpha_T) 382 call tau2alpha(1, iip1, jjb_u, jje_u, factt, tau_min_P, tau_max_P, alpha_P) 383 call tau2alpha(1, iip1, jjb_u, jje_u, factt, tau_min_Q, tau_max_Q, alpha_Q) 374 384 ! correction de rappel dans couche limite 375 385 if (guide_BL) then … … 381 391 endif 382 392 !$OMP END MASTER 393 !$OMP BARRIER 383 394 ! ini_anal: etat initial egal au guidage 384 395 IF (ini_anal) THEN 385 396 CALL guide_interp(ps,teta) 386 IF (guide_u) ucov(ijbu:ijeu,:)=ugui2(ijbu:ijeu,:) 387 IF (guide_v) vcov(ijbv:ijev,:)=ugui2(ijbv:ijev,:) 388 IF (guide_T) teta(ijbu:ijeu,:)=tgui2(ijbu:ijeu,:) 389 IF (guide_Q) q(ijbu:ijeu,:)=qgui2(ijbu:ijeu,:) 397 !$OMP DO 398 DO l=1,llm 399 IF (guide_u) ucov(ijbu:ijeu,l)=ugui2(ijbu:ijeu,l) 400 IF (guide_v) vcov(ijbv:ijev,l)=ugui2(ijbv:ijev,l) 401 IF (guide_T) teta(ijbu:ijeu,l)=tgui2(ijbu:ijeu,l) 402 IF (guide_Q) q(ijbu:ijeu,l)=qgui2(ijbu:ijeu,l) 403 ENDDO 404 390 405 IF (guide_P) THEN 406 !$OMP MASTER 391 407 ps(ijbu:ijeu)=psgui2(ijbu:ijeu) 408 !$OMP END MASTER 409 !$OMP BARRIER 392 410 CALL pression_loc(ijnb_u,ap,bp,ps,p) 393 411 CALL massdair_loc(p,masse) 412 !$OMP BARRIER 394 413 ENDIF 395 414 RETURN … … 398 417 IF (guide_u) THEN 399 418 !+tard CALL writefield_u('unat',unat1) 400 CALL writefield_u('ucov',ucov)419 ! CALL writefield_u('ucov',ucov) 401 420 ENDIF 402 421 IF (guide_T) THEN 403 422 !+tard CALL writefield_p('tnat',tnat1) 404 CALL writefield_u('teta',teta)423 ! CALL writefield_u('teta',teta) 405 424 ENDIF 406 425 … … 424 443 stop 425 444 ELSE 445 !$OMP MASTER 426 446 IF (guide_v) vnat1(:,jjbv:jjev,:)=vnat2(:,jjbv:jjev,:) 427 447 IF (guide_u) unat1(:,jjbu:jjeu,:)=unat2(:,jjbu:jjeu,:) … … 430 450 IF (guide_plevs.EQ.2) pnat1(:,jjbu:jjeu,:)=pnat2(:,jjbu:jjeu,:) 431 451 IF (guide_P.OR.guide_plevs.EQ.1) psnat1(:,jjbu:jjeu)=psnat2(:,jjbu:jjeu) 452 !$OMP END MASTER 453 !$OMP BARRIER 432 454 step_rea=step_rea+1 433 455 itau_test=itau … … 435 457 'apres ',count_no_rea,' non lectures' 436 458 IF (guide_2D) THEN 459 !$OMP MASTER 437 460 CALL guide_read2D(step_rea) 461 !$OMP END MASTER 462 !$OMP BARRIER 438 463 ELSE 464 !$OMP MASTER 439 465 CALL guide_read(step_rea) 466 !$OMP END MASTER 467 !$OMP BARRIER 440 468 ENDIF 441 469 count_no_rea=0 … … 460 488 ENDIF 461 489 462 !----------------------------------------------------------------------- 490 ! CALL WriteField_u('ucov_guide',ucov) 491 ! CALL WriteField_v('vcov_guide',vcov) 492 ! CALL WriteField_u('teta_guide',teta) 493 ! CALL WriteField_u('masse_guide',masse) 494 495 496 !----------------------------------------------------------------------- 463 497 ! Ajout des champs de guidage 464 498 !----------------------------------------------------------------------- … … 473 507 CALL exner_milieu_loc(ip1jmp1,ps,p,beta,pks,pk,pkf) 474 508 endif 509 !$OMP BARRIER 475 510 unskap=1./kappa 511 !$OMP DO 476 512 DO l = 1, llm 477 513 DO j=jjbu,jjeu … … 481 517 ENDDO 482 518 ENDDO 519 !$OMP MASTER 483 520 CALL guide_out("P",jjp1,llm,p,1.) 521 !$OMP END MASTER 522 !$OMP BARRIER 484 523 ENDIF 485 524 486 525 if (guide_u) then 487 526 if (guide_add) then 488 f_add(ijbu:ijeu,:)=(1.-tau)*ugui1(ijbu:ijeu,:)+tau*ugui2(ijbu:ijeu,:) 527 !$OMP DO 528 DO l=1,llm 529 f_addu(ijbu:ijeu,l)=(1.-tau)*ugui1(ijbu:ijeu,l)+tau*ugui2(ijbu:ijeu,l) 530 ENDDO 489 531 else 490 f_add(ijbu:ijeu,:)=(1.-tau)*ugui1(ijbu:ijeu,:)+tau*ugui2(ijbu:ijeu,:)-ucov(ijbu:ijeu,:) 532 !$OMP DO 533 DO l=1,llm 534 f_addu(ijbu:ijeu,l)=(1.-tau)*ugui1(ijbu:ijeu,l)+tau*ugui2(ijbu:ijeu,l)-ucov(ijbu:ijeu,l) 535 ENDDO 491 536 endif 492 493 if (guide_zon) CALL guide_zonave_u(1,llm,f_add) 494 CALL guide_addfield_u(llm,f_add,alpha_u) 495 IF (f_out) CALL guide_out("U",jjp1,llm,f_add(:,:),factt) 496 ucov(ijbu:ijeu,:)=ucov(ijbu:ijeu,:)+f_add(ijbu:ijeu,:) 537 538 ! CALL WriteField_u('f_addu',f_addu) 539 540 if (guide_zon) CALL guide_zonave_u(1,llm,f_addu) 541 CALL guide_addfield_u(llm,f_addu,alpha_u) 542 ! CALL WriteField_u('f_addu',f_addu) 543 ! CALL WriteField_u('alpha_u',alpha_u) 544 !$OMP MASTER 545 IF (f_out) CALL guide_out("U",jjp1,llm,f_addu(:,:),factt) 546 !$OMP END MASTER 547 !$OMP BARRIER 548 549 !$OMP DO 550 DO l=1,llm 551 ucov(ijbu:ijeu,l)=ucov(ijbu:ijeu,l)+f_addu(ijbu:ijeu,l) 552 ENDDO 553 497 554 endif 498 555 499 556 if (guide_T) then 500 557 if (guide_add) then 501 f_add(ijbu:ijeu,:)=(1.-tau)*tgui1(ijbu:ijeu,:)+tau*tgui2(ijbu:ijeu,:) 558 !$OMP DO 559 DO l=1,llm 560 f_addu(ijbu:ijeu,l)=(1.-tau)*tgui1(ijbu:ijeu,l)+tau*tgui2(ijbu:ijeu,l) 561 ENDDO 502 562 else 503 f_add(ijbu:ijeu,:)=(1.-tau)*tgui1(ijbu:ijeu,:)+tau*tgui2(ijbu:ijeu,:)-teta(ijbu:ijeu,:) 563 !$OMP DO 564 DO l=1,llm 565 f_addu(ijbu:ijeu,l)=(1.-tau)*tgui1(ijbu:ijeu,l)+tau*tgui2(ijbu:ijeu,l)-teta(ijbu:ijeu,l) 566 ENDDO 504 567 endif 505 if (guide_zon) CALL guide_zonave_u(2,llm,f_add) 506 CALL guide_addfield_u(llm,f_add,alpha_T) 507 IF (f_out) CALL guide_out("T",jjp1,llm,f_add(:,:),factt) 508 teta(ijbu:ijeu,:)=teta(ijbu:ijeu,:)+f_add(ijbu:ijeu,:) 568 if (guide_zon) CALL guide_zonave_u(2,llm,f_addu) 569 CALL guide_addfield_u(llm,f_addu,alpha_T) 570 !$OMP MASTER 571 IF (f_out) CALL guide_out("T",jjp1,llm,f_addu(:,:),factt) 572 !$OMP END MASTER 573 !$OMP BARRIER 574 !$OMP DO 575 DO l=1,llm 576 teta(ijbu:ijeu,l)=teta(ijbu:ijeu,l)+f_addu(ijbu:ijeu,l) 577 ENDDO 509 578 endif 510 579 511 580 if (guide_P) then 512 581 if (guide_add) then 513 f_add(ijbu:ijeu,1)=(1.-tau)*psgui1(ijbu:ijeu)+tau*psgui2(ijbu:ijeu) 582 !$OMP MASTER 583 f_addu(ijbu:ijeu,1)=(1.-tau)*psgui1(ijbu:ijeu)+tau*psgui2(ijbu:ijeu) 584 !$OMP END MASTER 585 !$OMP BARRIER 514 586 else 515 f_add(ijbu:ijeu,1)=(1.-tau)*psgui1(ijbu:ijeu)+tau*psgui2(ijbu:ijeu)-ps(ijbu:ijeu) 587 !$OMP MASTER 588 f_addu(ijbu:ijeu,1)=(1.-tau)*psgui1(ijbu:ijeu)+tau*psgui2(ijbu:ijeu)-ps(ijbu:ijeu) 589 !$OMP END MASTER 590 !$OMP BARRIER 516 591 endif 517 if (guide_zon) CALL guide_zonave_u(2,1,f_add(ijb_u:ije_u,1)) 518 CALL guide_addfield_u(1,f_add(ijb_u:ije_u,1),alpha_P) 519 IF (f_out) CALL guide_out("SP",jjp1,1,f_add(1:ip1jmp1,1),factt) 520 ps(ijbu:ijeu)=ps(ijbu:ijeu)+f_add(ijbu:ijeu,1) 592 if (guide_zon) CALL guide_zonave_u(2,1,f_addu(ijb_u:ije_u,1)) 593 CALL guide_addfield_u(1,f_addu(ijb_u:ije_u,1),alpha_P) 594 !$OMP MASTER 595 IF (f_out) CALL guide_out("SP",jjp1,1,f_addu(1:ip1jmp1,1),factt) 596 !$OMP END MASTER 597 !$OMP BARRIER 598 !$OMP MASTER 599 ps(ijbu:ijeu)=ps(ijbu:ijeu)+f_addu(ijbu:ijeu,1) 600 !$OMP END MASTER 601 !$OMP BARRIER 521 602 CALL pression_loc(ijnb_u,ap,bp,ps,p) 522 603 CALL massdair_loc(p,masse) 604 !$OMP BARRIER 523 605 endif 524 606 525 607 if (guide_Q) then 526 608 if (guide_add) then 527 f_add(ijbu:ijeu,:)=(1.-tau)*qgui1(ijbu:ijeu,:)+tau*qgui2(ijbu:ijeu,:) 609 !$OMP DO 610 DO l=1,llm 611 f_addu(ijbu:ijeu,l)=(1.-tau)*qgui1(ijbu:ijeu,l)+tau*qgui2(ijbu:ijeu,l) 612 ENDDO 528 613 else 529 f_add(ijbu:ijeu,:)=(1.-tau)*qgui1(ijbu:ijeu,:)+tau*qgui2(ijbu:ijeu,:)-q(ijbu:ijeu,:) 614 !$OMP DO 615 DO l=1,llm 616 f_addu(ijbu:ijeu,l)=(1.-tau)*qgui1(ijbu:ijeu,l)+tau*qgui2(ijbu:ijeu,l)-q(ijbu:ijeu,l) 617 ENDDO 530 618 endif 531 if (guide_zon) CALL guide_zonave_u(2,llm,f_add) 532 CALL guide_addfield_u(llm,f_add,alpha_Q) 533 IF (f_out) CALL guide_out("Q",jjp1,llm,f_add(:,:),factt) 534 q(ijbu:ijeu,:)=q(ijbu:ijeu,:)+f_add(ijbu:ijeu,:) 619 if (guide_zon) CALL guide_zonave_u(2,llm,f_addu) 620 CALL guide_addfield_u(llm,f_addu,alpha_Q) 621 !$OMP MASTER 622 IF (f_out) CALL guide_out("Q",jjp1,llm,f_addu(:,:),factt) 623 !$OMP END MASTER 624 !$OMP BARRIER 625 626 !$OMP DO 627 DO l=1,llm 628 q(ijbu:ijeu,l)=q(ijbu:ijeu,l)+f_addu(ijbu:ijeu,l) 629 ENDDO 535 630 endif 536 631 537 632 if (guide_v) then 538 633 if (guide_add) then 539 f_add(ijbv:ijev,:)=(1.-tau)*vgui1(ijbv:ijev,:)+tau*vgui2(ijbv:ijev,:) 634 !$OMP DO 635 DO l=1,llm 636 f_addv(ijbv:ijev,l)=(1.-tau)*vgui1(ijbv:ijev,l)+tau*vgui2(ijbv:ijev,l) 637 ENDDO 638 540 639 else 541 f_add(ijbv:ijev,:)=(1.-tau)*vgui1(ijbv:ijev,:)+tau*vgui2(ijbv:ijev,:)-vcov(ijbv:ijev,:) 640 !$OMP DO 641 DO l=1,llm 642 f_addv(ijbv:ijev,l)=(1.-tau)*vgui1(ijbv:ijev,l)+tau*vgui2(ijbv:ijev,l)-vcov(ijbv:ijev,l) 643 ENDDO 644 542 645 endif 646 ! CALL WriteField_v('f_addv',f_addv) 647 648 if (guide_zon) CALL guide_zonave_v(2,jjm,llm,f_addv(ijb_v:ije_v,:)) 649 ! CALL WriteField_v('f_addv',f_addv) 543 650 544 if (guide_zon) CALL guide_zonave_v(2,jjm,llm,f_add(ijb_v:ije_v,:)) 545 CALL guide_addfield_v(llm,f_add(ijb_v:ije_v,:),alpha_v) 546 IF (f_out) CALL guide_out("V",jjm,llm,f_add(1:ip1jm,:),factt) 547 vcov(ijbv:ijev,:)=vcov(ijbv:ijev,:)+f_add(ijbv:ijev,:) 651 CALL guide_addfield_v(llm,f_addv(ijb_v:ije_v,:),alpha_v) 652 ! CALL WriteField_v('f_addv',f_addv) 653 ! CALL WriteField_v('alpha_v',alpha_v) 654 !$OMP MASTER 655 IF (f_out) CALL guide_out("V",jjm,llm,f_addv(1:ip1jm,:),factt) 656 !$OMP END MASTER 657 !$OMP BARRIER 658 ! CALL WriteField_v('f_addv',f_addv) 659 660 !$OMP DO 661 DO l=1,llm 662 vcov(ijbv:ijev,l)=vcov(ijbv:ijev,l)+f_addv(ijbv:ijev,l) 663 ENDDO 548 664 endif 665 666 ! CALL WriteField_u('ucov_guide',ucov) 667 ! CALL WriteField_v('vcov_guide',vcov) 668 ! CALL WriteField_u('teta_guide',teta) 669 ! CALL WriteField_u('masse_guide',masse) 549 670 550 671 END SUBROUTINE guide_main … … 566 687 INTEGER :: l 567 688 689 !$OMP DO 568 690 DO l=1,vsize 569 691 field(ijbu:ijeu,l)=alpha(ijbu:ijeu)*field(ijbu:ijeu,l)*alpha_pcor(l) … … 588 710 INTEGER :: l 589 711 712 !$OMP DO 590 713 DO l=1,vsize 591 714 field(ijbv:ijev,l)=alpha(ijbv:ijev)*field(ijbv:ijev,l)*alpha_pcor(l) … … 612 735 ! Local variables 613 736 LOGICAL, SAVE :: first=.TRUE. 737 !$OMP THREADPRIVATE(first) 738 614 739 INTEGER, DIMENSION (2), SAVE :: imin, imax ! averaging domain 740 !$OMP THREADPRIVATE(imin,imax) 615 741 INTEGER :: i,j,l,ij 616 742 REAL, DIMENSION (iip1) :: lond ! longitude in Deg. … … 636 762 ENDIF 637 763 638 fieldm=0.639 764 765 !$OMP DO 640 766 DO l=1,vsize 767 fieldm(:,l)=0. 641 768 ! Compute zonal average 642 769 … … 680 807 ! Local variables 681 808 LOGICAL, SAVE :: first=.TRUE. 809 !$OMP THREADPRIVATE(first) 682 810 INTEGER, DIMENSION (2), SAVE :: imin, imax ! averaging domain 811 !$OMP THREADPRIVATE(imin, imax) 683 812 INTEGER :: i,j,l,ij 684 813 REAL, DIMENSION (iip1) :: lond ! longitude in Deg. … … 704 833 ENDIF 705 834 706 fieldm=0. 707 835 !$OMP DO 708 836 DO l=1,vsize 709 837 ! Compute zonal average 838 fieldm(:,l)=0. 710 839 DO j=jjbv,jjev 711 840 DO i=imin(typ),imax(typ) … … 744 873 745 874 LOGICAL, SAVE :: first=.TRUE. 875 !$OMP THREADPRIVATE(first) 746 876 ! Variables pour niveaux pression: 747 REAL, DIMENSION (iip1,jjb_u:jje_u,nlevnc) :: plnc1,plnc2 !niveaux pression guidage748 REAL, DIMENSION (iip1,jjb_u:jje_u,llm) :: plunc,plsnc !niveaux pression modele749 REAL, DIMENSION (iip1,jjb_v:jje_v,llm) :: plvnc !niveaux pression modele750 REAL, DIMENSION (iip1,jjb_u:jje_u,llmp1) :: p ! pression intercouches751 REAL, DIMENSION (iip1,jjb_u:jje_u,llm) :: pls, pext ! var intermediaire752 REAL, DIMENSION (iip1,jjb_u:jje_u,llm) :: pbarx753 REAL, DIMENSION (iip1,jjb_v:jje_v,llm) :: pbary877 REAL, ALLOCATABLE, SAVE, DIMENSION (:,:,:) :: plnc1,plnc2 !niveaux pression guidage 878 REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:) :: plunc,plsnc !niveaux pression modele 879 REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:) :: plvnc !niveaux pression modele 880 REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:) :: p ! pression intercouches 881 REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:) :: pls, pext ! var intermediaire 882 REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:) :: pbarx 883 REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:) :: pbary 754 884 ! Variables pour fonction Exner (P milieu couche) 755 REAL, DIMENSION (iip1,jjb_u:jje_u,llm) :: pk, pkf756 REAL, DIMENSION (iip1,jjb_u:jje_u,llm) :: alpha, beta757 REAL , DIMENSION (iip1,jjb_u:jje_u) :: pks885 REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:) :: pk, pkf 886 REAL, ALLOCATABLE, SAVE, DIMENSION (:,:,:) :: alpha, beta 887 REAL ,ALLOCATABLE, SAVE, DIMENSION (:,:) :: pks 758 888 REAL :: unskap 759 889 ! Pression de vapeur saturante 760 REAL, DIMENSION (ijb_u:ije_u,llm) :: qsat890 REAL, ALLOCATABLE, SAVE,DIMENSION (:,:) :: qsat 761 891 !Variables intermediaires interpolation 762 REAL, DIMENSION (iip1,jjb_u:jje_u,llm) :: zu1,zu2763 REAL, DIMENSION (iip1,jjb_v:jje_v,llm) :: zv1,zv2892 REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:) :: zu1,zu2 893 REAL, ALLOCATABLE, SAVE,DIMENSION (:,:,:) :: zv1,zv2 764 894 765 895 INTEGER :: i,j,l,ij … … 770 900 ! Calcul des niveaux de pression champs guidage (pour T et Q) 771 901 ! ----------------------------------------------------------------- 902 IF (first) THEN 903 !$OMP MASTER 904 ALLOCATE(plnc1(iip1,jjb_u:jje_u,nlevnc) ) 905 ALLOCATE(plnc2(iip1,jjb_u:jje_u,nlevnc) ) 906 ALLOCATE(plunc(iip1,jjb_u:jje_u,llm) ) 907 ALLOCATE(plsnc(iip1,jjb_u:jje_u,llm) ) 908 ALLOCATE(plvnc(iip1,jjb_v:jje_v,llm) ) 909 ALLOCATE(p(iip1,jjb_u:jje_u,llmp1) ) 910 ALLOCATE(pls(iip1,jjb_u:jje_u,llm) ) 911 ALLOCATE(pext(iip1,jjb_u:jje_u,llm) ) 912 ALLOCATE(pbarx(iip1,jjb_u:jje_u,llm) ) 913 ALLOCATE(pbary(iip1,jjb_v:jje_v,llm) ) 914 ALLOCATE(pk(iip1,jjb_u:jje_u,llm) ) 915 ALLOCATE(pkf(iip1,jjb_u:jje_u,llm) ) 916 ALLOCATE(alpha(iip1,jjb_u:jje_u,llm) ) 917 ALLOCATE(beta(iip1,jjb_u:jje_u,llm) ) 918 ALLOCATE(pks (iip1,jjb_u:jje_u) ) 919 ALLOCATE(qsat(ijb_u:ije_u,llm) ) 920 ALLOCATE(zu1(iip1,jjb_u:jje_u,llm) ) 921 ALLOCATE(zu2(iip1,jjb_u:jje_u,llm) ) 922 ALLOCATE(zv1(iip1,jjb_v:jje_v,llm) ) 923 ALLOCATE(zv2(iip1,jjb_v:jje_v,llm) ) 924 !$OMP END MASTER 925 !$OMP BARRIER 926 ENDIF 927 928 929 930 772 931 IF (guide_plevs.EQ.0) THEN 932 !$OMP DO 773 933 DO l=1,nlevnc 774 934 DO j=jjbu,jjeu … … 783 943 if (first) then 784 944 first=.FALSE. 945 !$OMP MASTER 785 946 print*,'Guide: verification ordre niveaux verticaux' 786 947 print*,'LMDZ :' … … 815 976 enddo 816 977 endif 978 !$OMP END MASTER 817 979 endif 818 980 … … 823 985 ! .... Calcul de pls , pression au milieu des couches ,en Pascals 824 986 IF (guide_plevs.EQ.1) THEN 987 !$OMP DO 825 988 DO l=1,llm 826 989 DO j=jjbu,jjeu … … 838 1001 endif 839 1002 unskap=1./kappa 1003 !$OMP BARRIER 1004 !$OMP DO 840 1005 DO l = 1, llm 841 1006 DO j=jjbu,jjeu … … 848 1013 849 1014 ! calcul des pressions pour les grilles u et v 1015 !$OMP DO 850 1016 do l=1,llm 851 1017 do j=jjbu,jjeu … … 858 1024 CALL Register_Hallo_u(pext,llm,1,2,2,1,Req) 859 1025 CALL SendRequest(Req) 1026 !$OMP BARRIER 860 1027 CALL WaitRequest(Req) 1028 !$OMP BARRIER 861 1029 862 1030 call massbar_loc(pext, pbarx, pbary ) 1031 !$OMP BARRIER 1032 !$OMP DO 863 1033 do l=1,llm 864 1034 do j=jjbu,jjeu … … 869 1039 enddo 870 1040 enddo 1041 !$OMP DO 871 1042 do l=1,llm 872 1043 do j=jjbv,jjev … … 882 1053 ! ----------------------------------------------------------------- 883 1054 if (guide_P) then 1055 !$OMP MASTER 884 1056 do j=jjbu,jjeu 885 1057 do i=1,iim … … 891 1063 psgui2(iip1*j)=psnat2(1,j) 892 1064 enddo 1065 !$OMP END MASTER 1066 !$OMP BARRIER 893 1067 endif 894 1068 … … 896 1070 ! Calcul des nouvelles valeurs des niveaux de pression du guidage 897 1071 IF (guide_plevs.EQ.1) THEN 1072 !$OMP DO 898 1073 DO l=1,nlevnc 899 1074 DO j=jjbu,jjeu … … 905 1080 ENDDO 906 1081 ELSE IF (guide_plevs.EQ.2) THEN 1082 !$OMP DO 907 1083 DO l=1,nlevnc 908 1084 DO j=jjbu,jjeu … … 916 1092 917 1093 ! Interpolation verticale 1094 !$OMP MASTER 918 1095 CALL pres2lev(tnat1(:,jjbu:jjeu,:),zu1(:,jjbu:jjeu,:),nlevnc,llm, & 919 1096 plnc1(:,jjbu:jjeu,:),plsnc(:,jjbu:jjeu,:),iip1,jjnu,invert_p) 920 1097 CALL pres2lev(tnat2(:,jjbu:jjeu,:),zu2(:,jjbu:jjeu,:),nlevnc,llm, & 921 1098 plnc2(:,jjbu:jjeu,:),plsnc(:,jjbu:jjeu,:),iip1,jjnu,invert_p) 922 1099 !$OMP END MASTER 1100 !$OMP BARRIER 923 1101 ! Conversion en variables GCM 1102 !$OMP DO 924 1103 do l=1,llm 925 1104 do j=jjbu,jjeu … … 958 1137 ! Calcul des nouvelles valeurs des niveaux de pression du guidage 959 1138 IF (guide_plevs.EQ.1) THEN 1139 !$OMP DO 960 1140 DO l=1,nlevnc 961 1141 DO j=jjbu,jjeu … … 967 1147 ENDDO 968 1148 ELSE IF (guide_plevs.EQ.2) THEN 1149 !$OMP DO 969 1150 DO l=1,nlevnc 970 1151 DO j=jjbu,jjeu … … 978 1159 979 1160 ! Interpolation verticale 1161 !$OMP MASTER 980 1162 CALL pres2lev(qnat1(:,jjbu:jjeu,:),zu1(:,jjbu:jjeu,:),nlevnc,llm, & 981 1163 plnc1(:,jjbu:jjeu,:),plsnc(:,jjbu:jjeu,:),iip1,jjnu,invert_p) 982 1164 CALL pres2lev(qnat2(:,jjbu:jjeu,:),zu2(:,jjbu:jjeu,:),nlevnc,llm, & 983 1165 plnc2(:,jjbu:jjeu,:),plsnc(:,jjbu:jjeu,:),iip1,jjnu,invert_p) 1166 !$OMP END MASTER 1167 !$OMP BARRIER 984 1168 985 1169 ! Conversion en variables GCM 986 1170 ! On suppose qu'on a la bonne variable dans le fichier de guidage: 987 1171 ! Hum.Rel si guide_hr, Hum.Spec. sinon. 1172 !$OMP DO 988 1173 do l=1,llm 989 1174 do j=jjbu,jjeu … … 1010 1195 enddo 1011 1196 IF (guide_hr) THEN 1012 CALL q_sat(iip1*jjnu*llm,teta(:,jjbu:jjeu,:)*pk(:,jjbu:jjeu,:)/cpp, & 1013 plsnc(:,jjbu:jjeu,:),qsat(ijbu:ijeu,:)) 1014 qgui1(ijbu:ijeu,:)=qgui1(ijbu:ijeu,:)*qsat(ijbu:ijeu,:)*0.01 !hum. rel. en % 1015 qgui2(ijbu:ijeu,:)=qgui2(ijbu:ijeu,:)*qsat(ijbu:ijeu,:)*0.01 1197 !$OMP DO 1198 do l=1,llm 1199 CALL q_sat(iip1*jjnu,teta(:,jjbu:jjeu,l)*pk(:,jjbu:jjeu,l)/cpp, & 1200 plsnc(:,jjbu:jjeu,l),qsat(ijbu:ijeu,l)) 1201 qgui1(ijbu:ijeu,l)=qgui1(ijbu:ijeu,l)*qsat(ijbu:ijeu,l)*0.01 !hum. rel. en % 1202 qgui2(ijbu:ijeu,l)=qgui2(ijbu:ijeu,l)*qsat(ijbu:ijeu,l)*0.01 1203 enddo 1204 1016 1205 ENDIF 1017 1206 ENDIF … … 1020 1209 ! Calcul des nouvelles valeurs des niveaux de pression du guidage 1021 1210 IF (guide_plevs.EQ.1) THEN 1211 !$OMP DO 1022 1212 DO l=1,nlevnc 1023 1213 DO j=jjbu,jjeu … … 1033 1223 ENDDO 1034 1224 ELSE IF (guide_plevs.EQ.2) THEN 1225 !$OMP DO 1035 1226 DO l=1,nlevnc 1036 1227 DO j=jjbu,jjeu … … 1048 1239 1049 1240 ! Interpolation verticale 1241 !$OMP MASTER 1050 1242 CALL pres2lev(unat1(:,jjbu:jjeu,:),zu1(:,jjbu:jjeu,:),nlevnc,llm, & 1051 1243 plnc1(:,jjbu:jjeu,:),plunc(:,jjbu:jjeu,:),iip1,jjnu,invert_p) 1052 1244 CALL pres2lev(unat2(:,jjbu:jjeu,:),zu2(:,jjbu:jjeu,:),nlevnc,llm, & 1053 1245 plnc2(:,jjbu:jjeu,:),plunc(:,jjbu:jjeu,:),iip1,jjnu,invert_p) 1246 !$OMP END MASTER 1247 !$OMP BARRIER 1054 1248 1055 1249 ! Conversion en variables GCM 1250 !$OMP DO 1056 1251 do l=1,llm 1057 1252 do j=jjbu,jjeu … … 1085 1280 CALL Register_Hallo_u(psnat2,1,1,2,2,1,Req) 1086 1281 CALL SendRequest(Req) 1282 !$OMP BARRIER 1087 1283 CALL WaitRequest(Req) 1284 !$OMP BARRIER 1285 !$OMP DO 1088 1286 DO l=1,nlevnc 1089 1287 DO j=jjbv,jjev … … 1100 1298 CALL Register_Hallo_u(pnat2,llm,1,2,2,1,Req) 1101 1299 CALL SendRequest(Req) 1300 !$OMP BARRIER 1102 1301 CALL WaitRequest(Req) 1302 !$OMP BARRIER 1303 !$OMP DO 1103 1304 DO l=1,nlevnc 1104 1305 DO j=jjbv,jjev … … 1113 1314 ENDIF 1114 1315 ! Interpolation verticale 1316 1317 !$OMP MASTER 1115 1318 CALL pres2lev(vnat1(:,jjbv:jjev,:),zv1(:,jjbv:jjev,:),nlevnc,llm, & 1116 1319 plnc1(:,jjbv:jjev,:),plvnc(:,jjbv:jjev,:),iip1,jjnv,invert_p) 1117 1320 CALL pres2lev(vnat2(:,jjbv:jjev,:),zv2(:,jjbv:jjev,:),nlevnc,llm, & 1118 1321 plnc2(:,jjbv:jjev,:),plvnc(:,jjbv:jjev,:),iip1,jjnv,invert_p) 1322 !$OMP END MASTER 1323 !$OMP BARRIER 1119 1324 ! Conversion en variables GCM 1325 !$OMP DO 1120 1326 do l=1,llm 1121 1327 do j=jjbv,jjev … … 1135 1341 1136 1342 !======================================================================= 1137 SUBROUTINE tau2alpha(typ,pim, pjm,factt,taumin,taumax,alpha)1343 SUBROUTINE tau2alpha(typ,pim,jjb,jje,factt,taumin,taumax,alpha) 1138 1344 1139 1345 ! Calcul des constantes de rappel alpha (=1/tau) … … 1149 1355 ! input arguments : 1150 1356 INTEGER, INTENT(IN) :: typ ! u(2),v(3), ou scalaire(1) 1151 INTEGER, INTENT(IN) :: pim,pjm ! dimensions en lat, lon 1357 INTEGER, INTENT(IN) :: pim ! dimensions en lon 1358 INTEGER, INTENT(IN) :: jjb,jje ! dimensions en lat 1152 1359 REAL, INTENT(IN) :: factt ! pas de temps en fraction de jour 1153 1360 REAL, INTENT(IN) :: taumin,taumax 1154 1361 ! output arguments: 1155 REAL, DIMENSION(pim, pjm), INTENT(OUT) :: alpha1362 REAL, DIMENSION(pim,jjb:jje), INTENT(OUT) :: alpha 1156 1363 1157 1364 ! local variables: … … 1175 1382 !----------------------------------------------------------------------- 1176 1383 IF (guide_reg) THEN 1177 do j= 1,pjm1384 do j=jjb,jje 1178 1385 do i=1,pim 1179 1386 if (typ.eq.2) then … … 1271 1478 ENDIF !first 1272 1479 1273 do j= 1,pjm1480 do j=jjb,jje 1274 1481 do i=1,pim 1275 1482 if (typ.eq.1) then … … 1297 1504 enddo 1298 1505 enddo 1506 1299 1507 ENDIF ! guide_reg 1300 1508 -
LMDZ5/trunk/libf/dyn3dmem/leapfrog_loc.F
r1793 r1806 307 307 #ifdef CPP_IOIPSL 308 308 if (ok_guide) then 309 !$OMP MASTER310 309 call guide_main(itau,ucov,vcov,teta,q,masse,ps) 311 !$OMP END MASTER312 310 !$OMP BARRIER 313 311 endif
Note: See TracChangeset
for help on using the changeset viewer.