Changeset 2359
- Timestamp:
- Sep 4, 2015, 6:48:31 PM (9 years ago)
- Location:
- LMDZ5/trunk/libf/phylmd
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
LMDZ5/trunk/libf/phylmd/orbite.F90
r2346 r2359 102 102 END SUBROUTINE angle 103 103 ! ==================================================================== 104 SUBROUTINE zenang(longi, gmtime, pdtrad , lat, long, pmu0, frac)104 SUBROUTINE zenang(longi, gmtime, pdtrad1, pdtrad2, lat, long, pmu0, frac) 105 105 USE dimphy 106 106 IMPLICIT NONE … … 114 114 ! fournit des moyennes de pmu0 et non des valeurs 115 115 ! instantanees, du coup frac prend toutes les valeurs 116 ! entre 0 et 1. 116 ! entre 0 et 1. La routine integre entre gmtime+pdtrad1 et 117 ! gmtime+pdtrad2 avec pdtrad1 et pdtrad2 exprimes en secondes. 117 118 ! Date : premiere version le 13 decembre 1994 118 119 ! revu pour GCM le 30 septembre 1996 120 ! revu le 3 septembre 2015 pour les bornes de l'integrale 119 121 ! =============================================================== 120 122 ! longi : la longitude vraie de la terre dans son plan 121 123 ! solaire a partir de l'equinoxe de printemps (degre) 122 124 ! gmtime : temps universel en fraction de jour 123 ! pdtrad : pas de temps du rayonnement (secondes) 125 ! pdtrad1 : borne inferieure du pas de temps du rayonnement (secondes) 126 ! pdtrad2 : borne inferieure du pas de temps du rayonnement (secondes) 127 ! pdtrad2-pdtrad1 correspond a pdtrad, le pas de temps du rayonnement (secondes) 124 128 ! lat------INPUT : latitude en degres 125 129 ! long-----INPUT : longitude en degres 126 ! pmu0-----OUTPUT: angle zenithal moyen entre gmtime et gmtime+pdtrad127 ! frac-----OUTPUT: ensoleillement moyen entre gmtime et gmtime+pdtrad128 ! ================================================================ 129 include "YOMCST.h" 130 ! ================================================================ 131 REAL, INTENT (IN) :: longi, gmtime, pdtrad 130 ! pmu0-----OUTPUT: angle zenithal moyen entre gmtime+pdtrad1 et gmtime+pdtrad2 131 ! frac-----OUTPUT: ensoleillement moyen entre gmtime+pdtrad1 et gmtime+pdtrad2 132 ! ================================================================ 133 include "YOMCST.h" 134 ! ================================================================ 135 REAL, INTENT (IN) :: longi, gmtime, pdtrad1, pdtrad2 132 136 REAL lat(klon), long(klon), pmu0(klon), frac(klon) 133 137 ! ================================================================ … … 143 147 REAL lat_sun ! declinaison en radian 144 148 REAL lon_sun ! longitude solaire en radian 145 REAL latr ! latitude du pt de grille en radian149 REAL latr ! latitude du pt de grille en radian 146 150 ! ================================================================ 147 151 … … 153 157 lat_sun = asin(sin(lon_sun)*sin(incl)) 154 158 155 gmtime1 = gmtime*86400. 156 gmtime2 = gmtime*86400. + pdtrad 159 gmtime1 = gmtime*86400. + pdtrad1 160 gmtime2 = gmtime*86400. + pdtrad2 157 161 158 162 DO i = 1, klon … … 160 164 latr = lat(i)*pi_local/180. 161 165 162 ! --pose probleme quand lat=+/-90 degres163 164 ! omega = -TAN(latr)*TAN(lat_sun)165 ! omega = ACOS(omega)166 ! IF (latr.GE.(pi_local/2.+lat_sun)167 ! . .OR. latr.LE.(-pi_local/2.+lat_sun)) THEN168 ! omega = 0.0 ! nuit polaire169 ! ENDIF170 ! IF (latr.GE.(pi_local/2.-lat_sun)171 ! . .OR. latr.LE.(-pi_local/2.-lat_sun)) THEN172 ! omega = pi_local ! journee polaire173 ! ENDIF174 175 ! --remplace par cela (le cas par defaut est different)176 177 166 omega = 0.0 !--nuit polaire 167 178 168 IF (latr>=(pi_local/2.-lat_sun) .OR. latr<=(-pi_local/2.-lat_sun)) THEN 179 169 omega = pi_local ! journee polaire 180 170 END IF 171 181 172 IF (latr<(pi_local/2.+lat_sun) .AND. latr>(-pi_local/2.+lat_sun) .AND. & 182 173 latr<(pi_local/2.-lat_sun) .AND. latr>(-pi_local/2.-lat_sun)) THEN -
LMDZ5/trunk/libf/phylmd/phys_state_var_mod.F90
r2345 r2359 97 97 !$OMP THREADPRIVATE(clwcon0th,rnebcon0th) 98 98 ! radiation outputs 99 REAL,ALLOCATABLE,SAVE :: zswdn0(:,:), zswdn(:,:) 100 !$OMP THREADPRIVATE(zswdn0,zswdn) 101 REAL,ALLOCATABLE,SAVE :: zswup0(:,:), zswup(:,:) 102 !$OMP THREADPRIVATE(zswup0,zswup) 99 103 REAL,ALLOCATABLE,SAVE :: swdn0(:,:), swdn(:,:) 100 104 !$OMP THREADPRIVATE(swdn0,swdn) … … 340 344 REAL,ALLOCATABLE,SAVE :: lwup0p(:,:), lwupp(:,:) 341 345 !$OMP THREADPRIVATE(lwdn0p, lwdnp, lwup0p, lwupp) 346 REAL,ALLOCATABLE,SAVE :: zswdn0p(:,:), zswdnp(:,:) 347 REAL,ALLOCATABLE,SAVE :: zswup0p(:,:), zswupp(:,:) 348 !$OMP THREADPRIVATE(zswdn0p, zswdnp, zswup0p, zswupp) 342 349 REAL,ALLOCATABLE,SAVE :: swdn0p(:,:), swdnp(:,:) 343 350 REAL,ALLOCATABLE,SAVE :: swup0p(:,:), swupp(:,:) … … 458 465 ALLOCATE(clwcon0th(klon,klev),rnebcon0th(klon,klev)) 459 466 ! radiation outputs 467 ALLOCATE(zswdn0(klon,klevp1), zswdn(klon,klevp1)) 468 ALLOCATE(zswup0(klon,klevp1), zswup(klon,klevp1)) 460 469 ALLOCATE(swdn0(klon,klevp1), swdn(klon,klevp1)) 461 470 ALLOCATE(swup0(klon,klevp1), swup(klon,klevp1)) … … 557 566 ALLOCATE(lwdn0p(klon,klevp1), lwdnp(klon,klevp1)) 558 567 ALLOCATE(lwup0p(klon,klevp1), lwupp(klon,klevp1)) 568 ALLOCATE(zswdn0p(klon,klevp1), zswdnp(klon,klevp1)) 569 ALLOCATE(zswup0p(klon,klevp1), zswupp(klon,klevp1)) 559 570 ALLOCATE(swdn0p(klon,klevp1), swdnp(klon,klevp1)) 560 571 ALLOCATE(swup0p(klon,klevp1), swupp(klon,klevp1)) … … 611 622 deallocate(clwcon0th, rnebcon0th) 612 623 ! radiation outputs 624 deallocate(zswdn0, zswdn) 625 deallocate(zswup0, zswup) 613 626 deallocate(swdn0, swdn) 614 627 deallocate(swup0, swup) … … 687 700 deallocate(lwdn0p, lwdnp) 688 701 deallocate(lwup0p, lwupp) 702 deallocate(zswdn0p, zswdnp) 703 deallocate(zswup0p, zswupp) 689 704 deallocate(swdn0p, swdnp) 690 705 deallocate(swup0p, swupp) -
LMDZ5/trunk/libf/phylmd/physiq.F90
r2357 r2359 143 143 !====================================================================== 144 144 ! Clef controlant l'activation du cycle diurne: 145 !cc LOGICAL cycle_diurne 146 !cc PARAMETER (cycle_diurne=.FALSE.) 145 ! en attente du codage des cles par Fred 146 INTEGER iflag_cycle_diurne 147 PARAMETER (iflag_cycle_diurne=1) 147 148 !====================================================================== 148 149 ! Modele thermique du sol, a activer pour le cycle diurne: … … 589 590 ! 590 591 REAL dist, rmu0(klon), fract(klon) 591 REAL zdtime, zlongi 592 REAL zrmu0(klon), zfract(klon), swradcorr(klon) 593 REAL zdtime, zdtime1, zdtime2, zlongi 592 594 ! 593 595 REAL qcheck … … 1070 1072 print*,'iflag_coupl,iflag_clos,iflag_wake', & 1071 1073 iflag_coupl,iflag_clos,iflag_wake 1072 print*,' CYCLE_DIURNE',cycle_diurne1074 print*,'iflag_CYCLE_DIURNE', iflag_cycle_diurne 1073 1075 ! 1074 1076 IF (iflag_con.EQ.2.AND.iflag_cld_th.GT.-1) THEN … … 1122 1124 ENDIF 1123 1125 1124 !IM cf. AM 081204 BEG1125 PRINT*,'cycle_diurne3 =',cycle_diurne1126 !IM cf. AM 081204 END1127 !1128 1126 CALL printflag( tabcntr0,radpas,ok_journe, & 1129 1127 ok_instan, ok_region ) … … 1149 1147 ENDIF 1150 1148 ! 1151 IF (dtime*REAL(radpas).GT.21600..AND. cycle_diurne) THEN1149 IF (dtime*REAL(radpas).GT.21600..AND.iflag_cycle_diurne.GE.1) THEN 1152 1150 WRITE(lunout,*)'Nbre d appels au rayonnement insuffisant' 1153 1151 WRITE(lunout,*)"Au minimum 4 appels par jour si cycle diurne" … … 1821 1819 ! non nul aux poles. 1822 1820 IF (abs(solarlong0-1000.)<1.e-4) then 1823 call zenang_an( cycle_diurne,jH_cur,rlat,rlon,rmu0,fract)1821 call zenang_an(iflag_cycle_diurne.GE.1,jH_cur,rlat,rlon,rmu0,fract) 1824 1822 ELSE 1825 ! Avec ou sans cycle diurne 1826 IF (cycle_diurne) THEN 1823 ! recode par Olivier Boucher en sept 2015 1824 SELECT CASE (iflag_cycle_diurne) 1825 CASE(0) 1826 ! Sans cycle diurne 1827 CALL angle(zlongi, rlat, fract, rmu0) 1828 CASE(1) 1829 ! Avec cycle diurne sans application des poids 1830 ! bit comparable a l ancienne formulation cycle_diurne=true 1831 ! on integre entre gmtime et gmtime+radpas 1827 1832 zdtime=dtime*REAL(radpas) ! pas de temps du rayonnement (s) 1828 CALL zenang(zlongi,jH_cur,zdtime,rlat,rlon,rmu0,fract) 1829 ELSE 1830 CALL angle(zlongi, rlat, fract, rmu0) 1831 ENDIF 1833 CALL zenang(zlongi,jH_cur,0.0,zdtime,rlat,rlon,rmu0,fract) 1834 CASE(2) 1835 ! Avec cycle diurne sans application des poids 1836 ! On integre entre gmtime-pdtphys et gmtime+pdtphys*(radpas-1) 1837 ! Comme cette routine est appele a tous les pas de temps de la physique 1838 ! meme si le rayonnement n'est pas appele je remonte en arriere les 1839 ! radpas-1 pas de temps suivant. Petite ruse pour prendre en compte le 1840 ! premier pas de temps la physique ou itaprad=0 1841 zdtime1=dtime*REAL(-MOD(itaprad,4)-1) 1842 zdtime2=dtime*REAL(radpas-MOD(itaprad,4)-1) 1843 CALL zenang(zlongi,jH_cur,zdtime1,zdtime2,rlat,rlon,rmu0,fract) 1844 END SELECT 1832 1845 ENDIF 1833 1834 ! AI Janv 20141835 do i = 1, klon1836 if (fract(i).le.0.) then1837 JrNt(i)=0.1838 else1839 JrNt(i)=1.1840 endif1841 enddo1842 1846 1843 1847 if (mydebug) then … … 3562 3566 topsw0,toplw0,solsw0,sollw0, & 3563 3567 lwdn0, lwdn, lwup0, lwup, & 3564 swdn0, swdn, swup0,swup, &3568 zswdn0, zswdn, zswup0, zswup, & 3565 3569 ok_ade, ok_aie, & 3566 3570 tau_aero, piz_aero, cg_aero, & … … 3608 3612 topsw0,toplw0,solsw0,sollw0, & 3609 3613 lwdn0, lwdn, lwup0, lwup, & 3610 swdn0, swdn, swup0,swup, &3614 zswdn0, zswdn, zswup0, zswup, & 3611 3615 topswad_aero, solswad_aero, & 3612 3616 topswai_aero, solswai_aero, & … … 3664 3668 topsw0p,toplw0p,solsw0p,sollw0p, & 3665 3669 lwdn0p, lwdnp, lwup0p, lwupp, & 3666 swdn0p, swdnp, swup0p,swupp, &3670 zswdn0p, zswdnp, zswup0p, zswupp, & 3667 3671 topswad_aerop, solswad_aerop, & 3668 3672 topswai_aerop, solswai_aerop, & … … 3706 3710 swup=0. ! MPL 27102011 pour les fichiers AMMA_profiles et AMMA_scalars 3707 3711 swup0=0. 3708 swdn=0.3709 swdn0=0.3712 zswdn=0. 3713 zswdn0=0. 3710 3714 lwup=0. 3711 3715 lwup0=0. … … 3715 3719 3716 3720 ! 3721 ! Calculer les poids a appliquer sur le SW 3722 ! sortie JrNt = jour-nuit 3723 ! recode par Olivier Boucher en sept 2015 3724 ! 3725 3726 SELECT CASE (iflag_cycle_diurne) 3727 ! 3728 CASE(0) 3729 ! Sans cycle diurne 3730 swradcorr=1.0 3731 JrNt = 1.0 3732 CASE(1) 3733 ! Avec cycle diurne sans les poids 3734 swradcorr=1.0 3735 JrNt=0.0 3736 WHERE (fract.GT.0.0) JrNt=1.0 3737 CASE(2) 3738 ! Avec cycle diurne et les poids 3739 zdtime1=-dtime !--on corrige le rayonnement pour representer le 3740 zdtime2=0.0 !--pas de temps de la physique qui se termine 3741 CALL zenang(zlongi,jH_cur,zdtime1,zdtime2,rlat,rlon,zrmu0,zfract) 3742 swradcorr=0.0 3743 WHERE (rmu0.GE.1.e-10 .OR. fract.GE.1.e-10) swradcorr=zfract/fract*zrmu0/rmu0 3744 JrNt=0.0 3745 WHERE (zfract.GT.0.0) JrNt=1.0 3746 END SELECT 3747 3748 ! 3749 ! Corriger les flux SW pour le cycle diurne ameliore 3750 ! recode par Olivier Boucher en sept 2015 3751 ! 3752 3753 DO k=1, klev+1 3754 swdn0(:,k)=swradcorr(:)*zswdn0(:,k) 3755 swdn(:,k) =swradcorr(:)*zswdn(:,k) 3756 swup0(:,k)=swradcorr(:)*zswup0(:,k) 3757 swup(:,k) =swradcorr(:)*zswup(:,k) 3758 ENDDO 3759 if (ok_4xCO2atm) then 3760 DO k=1, klev+1 3761 swdn0p(:,k)=swradcorr(:)*zswdn0p(:,k) 3762 swdnp(:,k) =swradcorr(:)*zswdnp(:,k) 3763 swup0p(:,k)=swradcorr(:)*zswup0p(:,k) 3764 swupp(:,k) =swradcorr(:)*zswupp(:,k) 3765 ENDDO 3766 endif 3767 3768 ! 3717 3769 ! Ajouter la tendance des rayonnements (tous les pas) 3718 3770 ! 3719 d_t_swr(:,:)=heat(:,:)*dtime/RDAY 3720 d_t_lwr(:,:)=-cool(:,:)*dtime/RDAY 3721 d_t_sw0(:,:)=heat0(:,:)*dtime/RDAY 3722 d_t_lw0(:,:)=-cool0(:,:)*dtime/RDAY 3771 3772 DO k=1, klev 3773 d_t_swr(:,k)=swradcorr(:)*heat(:,k)*dtime/RDAY 3774 d_t_sw0(:,k)=swradcorr(:)*heat0(:,k)*dtime/RDAY 3775 d_t_lwr(:,k)=-cool(:,k)*dtime/RDAY 3776 d_t_lw0(:,k)=-cool0(:,k)*dtime/RDAY 3777 ENDDO 3778 3723 3779 CALL add_phys_tend(du0,dv0,d_t_swr,dq0,dql0,dqi0,paprs,'SW',abortphy) 3724 3780 CALL add_phys_tend(du0,dv0,d_t_lwr,dq0,dql0,dqi0,paprs,'LW',abortphy)
Note: See TracChangeset
for help on using the changeset viewer.