Changeset 2848 for LMDZ5/trunk/libf/phylmd
- Timestamp:
- Apr 13, 2017, 7:07:54 PM (8 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/trunk/libf/phylmd/add_phys_tend_mod.F90
r2812 r2848 223 223 224 224 if (fl_ebil .GT. 0) then 225 ! Reset variables 226 zqw_col(:,:) = 0. 227 zql_col(:,:) = 0. 228 zqs_col(:,:) = 0. 229 zek_col(:,:) = 0. 230 zh_dair_col(:,:) = 0. 231 zh_qw_col(:,:) = 0. 232 zh_ql_col(:,:) = 0. 233 zh_qs_col(:,:) = 0. 225 ! ------------------------------------------------ 226 ! Compute vertical sum for each atmospheric column 227 ! ------------------------------------------------ 228 n=1 ! begining of time step 234 229 235 230 zcpvap = rcpv 236 231 zcwat = rcw 237 232 zcice = rcs 238 !JLD write (*,*) "rcpd, zcpvap, zcwat, zcice ",rcpd, zcpvap, zcwat, zcice 239 240 ! ------------------------------------------------ 241 ! Compute vertical sum for each atmospheric column 242 ! ------------------------------------------------ 243 n=1 ! begining of time step 244 DO k = 1, klev 245 DO i = 1, klon 246 ! Watter mass 247 zqw_col(i,n) = zqw_col(i,n) + q_seri(i, k)*zairm(i, k) 248 zql_col(i,n) = zql_col(i,n) + ql_seri(i, k)*zairm(i, k) 249 zqs_col(i,n) = zqs_col(i,n) + qs_seri(i, k)*zairm(i, k) 250 ! Kinetic Energy 251 zek_col(i,n) = zek_col(i,n) + 0.5*(u_seri(i,k)**2+v_seri(i,k)**2)*zairm(i, k) 252 ! Air enthalpy : dry air, water vapour, liquid, solid 253 zh_dair_col(i,n) = zh_dair_col(i,n) + rcpd*(1.-q_seri(i,k)-ql_seri(i,k)-qs_seri(i,k))* & 254 zairm(i, k)*t_seri(i, k) 255 zh_qw_col(i,n) = zh_qw_col(i,n) + zcpvap*t_seri(i, k) *q_seri(i, k)*zairm(i, k) !jyg 256 zh_ql_col(i,n) = zh_ql_col(i,n) + (zcpvap*t_seri(i, k) - rlvtt)*ql_seri(i, k)*zairm(i, k) !jyg 257 zh_qs_col(i,n) = zh_qs_col(i,n) + (zcpvap*t_seri(i, k) - rlstt)*qs_seri(i, k)*zairm(i, k) !jyg 258 END DO 259 END DO 260 ! compute total air enthalpy 261 zh_col(:,n) = zh_dair_col(:,n) + zh_qw_col(:,n) + zh_ql_col(:,n) + zh_qs_col(:,n) 233 234 CALL integr_v(klon, klev, zcpvap, & 235 t_seri, q_seri, ql_seri, qs_seri, u_seri, v_seri, zairm, & 236 zqw_col(:,n), zql_col(:,n), zqs_col(:,n), zek_col(:,n), zh_dair_col(:,n), & 237 zh_qw_col(:,n), zh_ql_col(:,n), zh_qs_col(:,n), zh_col(:,n)) 262 238 263 239 end if ! end if (fl_ebil .GT. 0) … … 465 441 ! ------------------------------------------------ 466 442 n=2 ! end of time step 467 DO k = 1, klev 468 DO i = 1, klon 469 ! Watter mass 470 zqw_col(i,n) = zqw_col(i,n) + q_seri(i, k)*zairm(i, k) 471 zql_col(i,n) = zql_col(i,n) + ql_seri(i, k)*zairm(i, k) 472 zqs_col(i,n) = zqs_col(i,n) + qs_seri(i, k)*zairm(i, k) 473 ! Kinetic Energy 474 zek_col(i,n) = zek_col(i,n) + 0.5*(u_seri(i,k)**2+v_seri(i,k)**2)*zairm(i, k) 475 ! Air enthalpy : dry air, water vapour, liquid, solid 476 zh_dair_col(i,n) = zh_dair_col(i,n) + rcpd*(1.-q_seri(i,k)-ql_seri(i,k)-qs_seri(i,k))* & 477 zairm(i, k)*t_seri(i, k) 478 zh_qw_col(i,n) = zh_qw_col(i,n) + zcpvap*t_seri(i, k) *q_seri(i, k)*zairm(i, k) !jyg 479 zh_ql_col(i,n) = zh_ql_col(i,n) + (zcpvap*t_seri(i, k) - rlvtt)*ql_seri(i, k)*zairm(i, k) !jyg 480 zh_qs_col(i,n) = zh_qs_col(i,n) + (zcpvap*t_seri(i, k) - rlstt)*qs_seri(i, k)*zairm(i, k) !jyg 481 END DO 482 END DO 483 ! compute total air enthalpy 484 zh_col(:,n) = zh_dair_col(:,n) + zh_qw_col(:,n) + zh_ql_col(:,n) + zh_qs_col(:,n) 443 444 CALL integr_v(klon, klev, zcpvap, & 445 t_seri, q_seri, ql_seri, qs_seri, u_seri, v_seri, zairm, & 446 zqw_col(:,n), zql_col(:,n), zqs_col(:,n), zek_col(:,n), zh_dair_col(:,n), & 447 zh_qw_col(:,n), zh_ql_col(:,n), zh_qs_col(:,n), zh_col(:,n)) 485 448 486 449 ! ------------------------------------------------ … … 517 480 RETURN 518 481 END SUBROUTINE add_phys_tend 482 483 SUBROUTINE diag_phys_tend (nlon, nlev, uu, vv, temp, qv, ql, qs, & 484 zdu,zdv,zdt,zdq,zdql,zdqs,paprs,text) 485 !====================================================================== 486 ! Ajoute les tendances des variables physiques aux variables 487 ! d'etat de la dynamique t_seri, q_seri ... 488 ! On en profite pour faire des tests sur les tendances en question. 489 !====================================================================== 490 491 492 !====================================================================== 493 ! Declarations 494 !====================================================================== 495 496 USE phys_state_var_mod, ONLY : dtime, ftsol 497 USE geometry_mod, ONLY: longitude_deg, latitude_deg 498 USE print_control_mod, ONLY: prt_level 499 USE cmp_seri_mod 500 USE phys_output_var_mod, ONLY : d_qw_col, d_ql_col, d_qs_col, d_qt_col, d_ek_col, d_h_dair_col & 501 & , d_h_qw_col, d_h_ql_col, d_h_qs_col, d_h_col 502 IMPLICIT none 503 include "YOMCST.h" 504 include "clesphys.h" 505 506 ! Arguments : 507 !------------ 508 INTEGER, INTENT(IN) :: nlon, nlev 509 REAL, DIMENSION(nlon,nlev), INTENT(IN) :: uu, vv 510 REAL, DIMENSION(nlon,nlev), INTENT(IN) :: temp, qv, ql, qs 511 REAL, DIMENSION(nlon,nlev), INTENT(IN) :: zdu, zdv 512 REAL, DIMENSION(nlon,nlev), INTENT(IN) :: zdt, zdq, zdql, zdqs 513 REAL, DIMENSION(nlon,nlev+1), INTENT(IN) :: paprs 514 CHARACTER*(*), INTENT(IN) :: text 515 516 ! Local : 517 !-------- 518 REAL, DIMENSION(nlon,nlev) :: uu_n, vv_n 519 REAL, DIMENSION(nlon,nlev) :: temp_n, qv_n, ql_n, qs_n 520 521 522 ! 523 INTEGER k, n 524 525 integer debug_level 526 logical, save :: first=.true. 527 !$OMP THREADPRIVATE(first) 528 ! 529 !====================================================================== 530 ! Variables for energy conservation tests 531 !====================================================================== 532 ! 533 534 ! zh_col------- total enthalpy of vertical air column 535 ! (air with watter vapour, liquid and solid) (J/m2) 536 ! zh_dair_col--- total enthalpy of dry air (J/m2) 537 ! zh_qw_col---- total enthalpy of watter vapour (J/m2) 538 ! zh_ql_col---- total enthalpy of liquid watter (J/m2) 539 ! zh_qs_col---- total enthalpy of solid watter (J/m2) 540 ! zqw_col------ total mass of watter vapour (kg/m2) 541 ! zql_col------ total mass of liquid watter (kg/m2) 542 ! zqs_col------ total mass of solid watter (kg/m2) 543 ! zek_col------ total kinetic energy (kg/m2) 544 ! 545 REAL zairm(nlon, nlev) ! layer air mass (kg/m2) 546 REAL zqw_col(nlon,2) 547 REAL zql_col(nlon,2) 548 REAL zqs_col(nlon,2) 549 REAL zek_col(nlon,2) 550 REAL zh_dair_col(nlon,2) 551 REAL zh_qw_col(nlon,2), zh_ql_col(nlon,2), zh_qs_col(nlon,2) 552 REAL zh_col(nlon,2) 553 554 !====================================================================== 555 ! Initialisations 556 557 IF (prt_level >= 5) then 558 write (*,*) "In diag_phys_tend, after ",text 559 call flush 560 end if 561 562 debug_level=10 563 if (first) then 564 print *,"TestJLD rcpv, rcw, rcs",rcpv, rcw, rcs 565 first=.false. 566 endif 567 ! 568 ! print *,'add_phys_tend: paprs ',paprs 569 !====================================================================== 570 ! Diagnostics for energy conservation tests 571 !====================================================================== 572 DO k = 1, nlev 573 ! layer air mass 574 zairm(:, k) = (paprs(:,k)-paprs(:,k+1))/rg 575 END DO 576 577 if (fl_ebil .GT. 0) then 578 ! ------------------------------------------------ 579 ! Compute vertical sum for each atmospheric column 580 ! ------------------------------------------------ 581 n=1 ! begining of time step 582 583 CALL integr_v(nlon, nlev, rcpv, & 584 temp, qv, ql, qs, uu, vv, zairm, & 585 zqw_col(:,n), zql_col(:,n), zqs_col(:,n), zek_col(:,n), zh_dair_col(:,n), & 586 zh_qw_col(:,n), zh_ql_col(:,n), zh_qs_col(:,n), zh_col(:,n)) 587 588 end if ! end if (fl_ebil .GT. 0) 589 590 !====================================================================== 591 ! Ajout des tendances sur le vent, la temperature et les diverses phases de l'eau 592 !====================================================================== 593 594 uu_n(:,:)=uu(:,:)+zdu(:,:) 595 vv_n(:,:)=vv(:,:)+zdv(:,:) 596 qv_n(:,:)=qv(:,:)+zdq(:,:) 597 ql_n(:,:)=ql(:,:)+zdql(:,:) 598 qs_n(:,:)=qs(:,:)+zdqs(:,:) 599 temp_n(:,:)=temp(:,:)+zdt(:,:) 600 601 602 603 !====================================================================== 604 ! Diagnostics for energy conservation tests 605 !====================================================================== 606 607 if (fl_ebil .GT. 0) then 608 609 ! ------------------------------------------------ 610 ! Compute vertical sum for each atmospheric column 611 ! ------------------------------------------------ 612 n=2 ! end of time step 613 614 CALL integr_v(nlon, nlev, rcpv, & 615 temp_n, qv_n, ql_n, qs_n, uu_n, vv_n, zairm, & 616 zqw_col(:,n), zql_col(:,n), zqs_col(:,n), zek_col(:,n), zh_dair_col(:,n), & 617 zh_qw_col(:,n), zh_ql_col(:,n), zh_qs_col(:,n), zh_col(:,n)) 618 619 ! ------------------------------------------------ 620 ! Compute the changes by unit of time 621 ! ------------------------------------------------ 622 623 d_qw_col(:) = (zqw_col(:,2)-zqw_col(:,1))/dtime 624 d_ql_col(:) = (zql_col(:,2)-zql_col(:,1))/dtime 625 d_qs_col(:) = (zqs_col(:,2)-zqs_col(:,1))/dtime 626 d_qt_col(:) = d_qw_col(:) + d_ql_col(:) + d_qs_col(:) 627 628 d_ek_col(:) = (zek_col(:,2)-zek_col(:,1))/dtime 629 630 print *,'zdu ', zdu 631 print *,'zdv ', zdv 632 print *,'d_ek_col, zek_col(2), zek_col(1) ',d_ek_col(1), zek_col(1,2), zek_col(1,1) 633 634 d_h_dair_col(:) = (zh_dair_col(:,2)-zh_dair_col(:,1))/dtime 635 d_h_qw_col(:) = (zh_qw_col(:,2)-zh_qw_col(:,1))/dtime 636 d_h_ql_col(:) = (zh_ql_col(:,2)-zh_ql_col(:,1))/dtime 637 d_h_qs_col(:) = (zh_qs_col(:,2)-zh_qs_col(:,1))/dtime 638 639 d_h_col = (zh_col(:,2)-zh_col(:,1))/dtime 640 641 end if ! end if (fl_ebil .GT. 0) 642 ! 643 644 RETURN 645 END SUBROUTINE diag_phys_tend 646 647 SUBROUTINE integr_v(nlon, nlev, zcpvap, & 648 temp, qv, ql, qs, uu, vv, zairm, & 649 zqw_col, zql_col, zqs_col, zek_col, zh_dair_col, & 650 zh_qw_col, zh_ql_col, zh_qs_col, zh_col) 651 652 IMPLICIT none 653 include "YOMCST.h" 654 655 INTEGER, INTENT(IN) :: nlon,nlev 656 REAL, INTENT(IN) :: zcpvap 657 REAL, DIMENSION(nlon,nlev), INTENT(IN) :: temp, qv, ql, qs, uu, vv 658 REAL, DIMENSION(nlon,nlev), INTENT(IN) :: zairm 659 REAL, DIMENSION(nlon), INTENT(OUT) :: zqw_col 660 REAL, DIMENSION(nlon), INTENT(OUT) :: zql_col 661 REAL, DIMENSION(nlon), INTENT(OUT) :: zqs_col 662 REAL, DIMENSION(nlon), INTENT(OUT) :: zek_col 663 REAL, DIMENSION(nlon), INTENT(OUT) :: zh_dair_col 664 REAL, DIMENSION(nlon), INTENT(OUT) :: zh_qw_col 665 REAL, DIMENSION(nlon), INTENT(OUT) :: zh_ql_col 666 REAL, DIMENSION(nlon), INTENT(OUT) :: zh_qs_col 667 REAL, DIMENSION(nlon), INTENT(OUT) :: zh_col 668 669 INTEGER :: i, k 670 671 672 ! Reset variables 673 zqw_col(:) = 0. 674 zql_col(:) = 0. 675 zqs_col(:) = 0. 676 zek_col(:) = 0. 677 zh_dair_col(:) = 0. 678 zh_qw_col(:) = 0. 679 zh_ql_col(:) = 0. 680 zh_qs_col(:) = 0. 681 682 !JLD write (*,*) "rcpd, zcpvap, zcwat, zcice ",rcpd, zcpvap, zcwat, zcice 683 684 ! ------------------------------------------------ 685 ! Compute vertical sum for each atmospheric column 686 ! ------------------------------------------------ 687 DO k = 1, nlev 688 DO i = 1, nlon 689 ! Watter mass 690 zqw_col(i) = zqw_col(i) + qv(i, k)*zairm(i, k) 691 zql_col(i) = zql_col(i) + ql(i, k)*zairm(i, k) 692 zqs_col(i) = zqs_col(i) + qs(i, k)*zairm(i, k) 693 ! Kinetic Energy 694 zek_col(i) = zek_col(i) + 0.5*(uu(i,k)**2+vv(i,k)**2)*zairm(i, k) 695 ! Air enthalpy : dry air, water vapour, liquid, solid 696 zh_dair_col(i) = zh_dair_col(i) + rcpd*(1.-qv(i,k)-ql(i,k)-qs(i,k))* & 697 zairm(i, k)*temp(i, k) 698 zh_qw_col(i) = zh_qw_col(i) + zcpvap*temp(i, k) *qv(i, k)*zairm(i, k) !jyg 699 zh_ql_col(i) = zh_ql_col(i) + (zcpvap*temp(i, k) - rlvtt)*ql(i, k)*zairm(i, k) !jyg 700 zh_qs_col(i) = zh_qs_col(i) + (zcpvap*temp(i, k) - rlstt)*qs(i, k)*zairm(i, k) !jyg 701 END DO 702 END DO 703 ! compute total air enthalpy 704 zh_col(:) = zh_dair_col(:) + zh_qw_col(:) + zh_ql_col(:) + zh_qs_col(:) 705 706 END SUBROUTINE integr_v 519 707 520 708 SUBROUTINE prt_enerbil (text, itap) … … 624 812 write(*,9000) text,"enerbil: snow, bil_lat, bil_sens", snow_lsc(1), rlstt * snow_lsc(1), -(rcs-rcpd)*t_seri(1,1) * snow_lsc(1) 625 813 end if 814 CASE("convection") specific_diag 815 if ( prt_level .GE. 5) then 816 write(*,9000) text,"enerbil: rain, bil_lat, bil_sens", rain_con(1), rlvtt * rain_con(1), -(rcw-rcpd)*t_seri(1,1) * rain_con(1) 817 write(*,9000) text,"enerbil: snow, bil_lat, bil_sens", snow_con(1), rlstt * snow_con(1), -(rcs-rcpd)*t_seri(1,1) * snow_con(1) 818 end if 626 819 END SELECT specific_diag 627 820 628 9000 format (1x,A8,2x,A3 0,10E15.6)821 9000 format (1x,A8,2x,A35,10E15.6) 629 822 630 823 end if ! end if (fl_ebil .GT. 0)
Note: See TracChangeset
for help on using the changeset viewer.