Changeset 1191 for LMDZ4/branches
- Timestamp:
- Jun 24, 2009, 11:56:13 AM (15 years ago)
- Location:
- LMDZ4/branches/LMDZ4-dev/libf
- Files:
-
- 3 added
- 8 edited
- 8 moved
Legend:
- Unmodified
- Added
- Removed
-
LMDZ4/branches/LMDZ4-dev/libf/dyn3d/infotrac.F90
r1180 r1191 21 21 INTEGER, ALLOCATABLE, DIMENSION(:), SAVE :: niadv ! equivalent dyn / physique 22 22 23 ! Variables for INCA23 ! conv_flg(it)=0 : convection desactivated for tracer number it 24 24 INTEGER, ALLOCATABLE, DIMENSION(:), SAVE :: conv_flg 25 ! pbl_flg(it)=0 : boundary layer diffusion desactivaded for tracer number it 25 26 INTEGER, ALLOCATABLE, DIMENSION(:), SAVE :: pbl_flg 26 27 28 CHARACTER(len=4),SAVE :: type_trac 29 27 30 CONTAINS 28 31 … … 80 83 descrq(20)='SLP' 81 84 descrq(30)='PRA' 85 86 87 IF (config_inca=='none') THEN 88 type_trac='lmdz' 89 ELSE 90 type_trac='inca' 91 END IF 82 92 83 93 !----------------------------------------------------------------------- … … 87 97 ! 88 98 !----------------------------------------------------------------------- 89 IF ( config_inca == 'none') THEN99 IF (type_trac == 'lmdz') THEN 90 100 OPEN(90,file='traceur.def',form='formatted',status='old', iostat=ierr) 91 101 IF(ierr.EQ.0) THEN … … 109 119 END IF 110 120 ! 111 ! Allocate variables depending on nqtrue 121 ! Allocate variables depending on nqtrue and nbtr 112 122 ! 113 123 ALLOCATE(tnom_0(nqtrue), hadv(nqtrue), vadv(nqtrue)) 114 115 IF (config_inca /= 'none') THEN 116 ! Varaibles only needed in case of INCA 117 ALLOCATE(conv_flg(nbtr), pbl_flg(nbtr), tracnam(nbtr)) 118 END IF 119 124 ALLOCATE(conv_flg(nbtr), pbl_flg(nbtr), tracnam(nbtr)) 125 conv_flg(:) = 1 ! convection activated for all tracers 126 pbl_flg(:) = 1 ! boundary layer activated for all tracers 127 120 128 !----------------------------------------------------------------------- 121 129 ! 2) Choix des schemas d'advection pour l'eau et les traceurs … … 144 152 ! Get choice of advection schema from file tracer.def or from INCA 145 153 !--------------------------------------------------------------------- 146 IF ( config_inca == 'none') THEN154 IF (type_trac == 'lmdz') THEN 147 155 IF(ierr.EQ.0) THEN 148 156 ! Continue to read tracer.def … … 172 180 END DO 173 181 174 ELSE ! config_inca='aero' ou 'chem'182 ELSE ! type_trac=inca : config_inca='aero' ou 'chem' 175 183 ! le module de chimie fournit les noms des traceurs 176 184 ! et les schemas d'advection associes. … … 191 199 END DO 192 200 193 END IF ! config_inca201 END IF ! type_trac 194 202 195 203 !----------------------------------------------------------------------- … … 319 327 ! 320 328 DEALLOCATE(tnom_0, hadv, vadv) 321 IF (config_inca /= 'none')DEALLOCATE(tracnam)329 DEALLOCATE(tracnam) 322 330 323 331 999 FORMAT (i2,1x,i2,1x,a8) -
LMDZ4/branches/LMDZ4-dev/libf/dyn3dpar/infotrac.F90
r1180 r1191 21 21 INTEGER, ALLOCATABLE, DIMENSION(:), SAVE :: niadv ! equivalent dyn / physique 22 22 23 ! Variables for INCA23 ! conv_flg(it)=0 : convection desactivated for tracer number it 24 24 INTEGER, ALLOCATABLE, DIMENSION(:), SAVE :: conv_flg 25 ! pbl_flg(it)=0 : boundary layer diffusion desactivaded for tracer number it 25 26 INTEGER, ALLOCATABLE, DIMENSION(:), SAVE :: pbl_flg 26 27 28 CHARACTER(len=4),SAVE :: type_trac 29 27 30 CONTAINS 28 31 … … 80 83 descrq(20)='SLP' 81 84 descrq(30)='PRA' 85 86 87 IF (config_inca=='none') THEN 88 type_trac='lmdz' 89 ELSE 90 type_trac='inca' 91 END IF 82 92 83 93 !----------------------------------------------------------------------- … … 87 97 ! 88 98 !----------------------------------------------------------------------- 89 IF ( config_inca == 'none') THEN99 IF (type_trac == 'lmdz') THEN 90 100 OPEN(90,file='traceur.def',form='formatted',status='old', iostat=ierr) 91 101 IF(ierr.EQ.0) THEN … … 109 119 END IF 110 120 ! 111 ! Allocate variables depending on nqtrue 121 ! Allocate variables depending on nqtrue and nbtr 112 122 ! 113 123 ALLOCATE(tnom_0(nqtrue), hadv(nqtrue), vadv(nqtrue)) 114 115 IF (config_inca /= 'none') THEN 116 ! Varaibles only needed in case of INCA 117 ALLOCATE(conv_flg(nbtr), pbl_flg(nbtr), tracnam(nbtr)) 118 END IF 119 124 ALLOCATE(conv_flg(nbtr), pbl_flg(nbtr), tracnam(nbtr)) 125 conv_flg(:) = 1 ! convection activated for all tracers 126 pbl_flg(:) = 1 ! boundary layer activated for all tracers 127 120 128 !----------------------------------------------------------------------- 121 129 ! 2) Choix des schemas d'advection pour l'eau et les traceurs … … 144 152 ! Get choice of advection schema from file tracer.def or from INCA 145 153 !--------------------------------------------------------------------- 146 IF ( config_inca == 'none') THEN154 IF (type_trac == 'lmdz') THEN 147 155 IF(ierr.EQ.0) THEN 148 156 ! Continue to read tracer.def … … 172 180 END DO 173 181 174 ELSE ! config_inca='aero' ou 'chem'182 ELSE ! type_trac=inca : config_inca='aero' ou 'chem' 175 183 ! le module de chimie fournit les noms des traceurs 176 184 ! et les schemas d'advection associes. … … 191 199 END DO 192 200 193 END IF ! config_inca201 END IF ! type_trac 194 202 195 203 !----------------------------------------------------------------------- … … 319 327 ! 320 328 DEALLOCATE(tnom_0, hadv, vadv) 321 IF (config_inca /= 'none')DEALLOCATE(tracnam)329 DEALLOCATE(tracnam) 322 330 323 331 999 FORMAT (i2,1x,i2,1x,a8) -
LMDZ4/branches/LMDZ4-dev/libf/phylmd/YOECUMF.h
r776 r1191 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 C ---------------------------------------------------------------- 5 C* *COMMON* *YOECUMF* - PARAMETERS FOR CUMULUS MASSFLUX SCHEME 6 C ---------------------------------------------------------------- 7 C 8 COMMON /YOECUMF/ 9 L LMFPEN,LMFSCV,LMFMID,LMFDD,LMFDUDV, 10 R ENTRPEN,ENTRSCV,ENTRMID,ENTRDD,CMFCTOP, 11 R CMFCMAX,CMFCMIN,CMFDEPS,RHCDD,CPRCON 12 C 4 ! ATTENTION!!!!: ce fichier include est compatible format fixe/format libre 5 ! veillez n'utiliser que des ! pour les commentaires 6 ! et bien positionner les & des lignes de continuation 7 ! (les placer en colonne 6 et en colonne 73) 8 ! 9 ! ---------------------------------------------------------------- 10 !* *COMMON* *YOECUMF* - PARAMETERS FOR CUMULUS MASSFLUX SCHEME 11 ! ---------------------------------------------------------------- 12 ! 13 COMMON /YOECUMF/ & 14 & LMFPEN,LMFSCV,LMFMID,LMFDD,LMFDUDV, & 15 & ENTRPEN,ENTRSCV,ENTRMID,ENTRDD,CMFCTOP, & 16 & CMFCMAX,CMFCMIN,CMFDEPS,RHCDD,CPRCON 17 13 18 LOGICAL LMFPEN,LMFSCV,LMFMID,LMFDD,LMFDUDV 14 19 REAL ENTRPEN, ENTRSCV, ENTRMID, ENTRDD 15 20 REAL CMFCTOP, CMFCMAX, CMFCMIN, CMFDEPS, RHCDD, CPRCON 16 c$OMP THREADPRIVATE(/YOECUMF/)17 C 18 *if (DOC,declared) <> 'UNKNOWN'19 C* *COMMON* *YOECUMF* - PARAMETERS FOR CUMULUS MASSFLUX SCHEME20 C 21 CM.TIEDTKE E. C. M. W. F. 18/1/8922 C 23 CNAME TYPE PURPOSE24 C---- ---- -------25 C 26 CLMFPEN LOGICAL TRUE IF PENETRATIVE CONVECTION IS SWITCHED ON27 CLMFSCV LOGICAL TRUE IF SHALLOW CONVECTION IS SWITCHED ON28 CLMFMID LOGICAL TRUE IF MIDLEVEL CONVECTION IS SWITCHED ON29 CLMFDD LOGICAL TRUE IF CUMULUS DOWNDRAFT IS SWITCHED ON30 CLMFDUDV LOGICAL TRUE IF CUMULUS FRICTION IS SWITCHED ON31 CENTRPEN REAL ENTRAINMENT RATE FOR PENETRATIVE CONVECTION32 CENTRSCV REAL ENTRAINMENT RATE FOR SHALLOW CONVECTION33 CENTRMID REAL ENTRAINMENT RATE FOR MIDLEVEL CONVECTION34 CENTRDD REAL ENTRAINMENT RATE FOR CUMULUS DOWNDRAFTS35 CCMFCTOP REAL RELAT. CLOUD MASSFLUX AT LEVEL ABOVE NONBUOYANC36 CCMFCMAX REAL MAXIMUM MASSFLUX VALUE ALLOWED FOR37 CCMFCMIN REAL MINIMUM MASSFLUX VALUE (FOR SAFETY)38 CCMFDEPS REAL FRACTIONAL MASSFLUX FOR DOWNDRAFTS AT LFS39 CRHCDD REAL RELATIVE SATURATION IN DOWNDRAFTS40 CCPRCON REAL COEFFICIENTS FOR DETERMINING CONVERSION41 CFROM CLOUD WATER TO RAIN42 *ifend43 C----------------------------------------------------------------21 !$OMP THREADPRIVATE(/YOECUMF/) 22 ! 23 !*if (DOC,declared) <> 'UNKNOWN' 24 !* *COMMON* *YOECUMF* - PARAMETERS FOR CUMULUS MASSFLUX SCHEME 25 ! 26 ! M.TIEDTKE E. C. M. W. F. 18/1/89 27 ! 28 ! NAME TYPE PURPOSE 29 ! ---- ---- ------- 30 ! 31 ! LMFPEN LOGICAL TRUE IF PENETRATIVE CONVECTION IS SWITCHED ON 32 ! LMFSCV LOGICAL TRUE IF SHALLOW CONVECTION IS SWITCHED ON 33 ! LMFMID LOGICAL TRUE IF MIDLEVEL CONVECTION IS SWITCHED ON 34 ! LMFDD LOGICAL TRUE IF CUMULUS DOWNDRAFT IS SWITCHED ON 35 ! LMFDUDV LOGICAL TRUE IF CUMULUS FRICTION IS SWITCHED ON 36 ! ENTRPEN REAL ENTRAINMENT RATE FOR PENETRATIVE CONVECTION 37 ! ENTRSCV REAL ENTRAINMENT RATE FOR SHALLOW CONVECTION 38 ! ENTRMID REAL ENTRAINMENT RATE FOR MIDLEVEL CONVECTION 39 ! ENTRDD REAL ENTRAINMENT RATE FOR CUMULUS DOWNDRAFTS 40 ! CMFCTOP REAL RELAT. CLOUD MASSFLUX AT LEVEL ABOVE NONBUOYANC 41 ! CMFCMAX REAL MAXIMUM MASSFLUX VALUE ALLOWED FOR 42 ! CMFCMIN REAL MINIMUM MASSFLUX VALUE (FOR SAFETY) 43 ! CMFDEPS REAL FRACTIONAL MASSFLUX FOR DOWNDRAFTS AT LFS 44 ! RHCDD REAL RELATIVE SATURATION IN DOWNDRAFTS 45 ! CPRCON REAL COEFFICIENTS FOR DETERMINING CONVERSION 46 ! FROM CLOUD WATER TO RAIN 47 !*ifend 48 ! ---------------------------------------------------------------- -
LMDZ4/branches/LMDZ4-dev/libf/phylmd/cltrac.F90
r1188 r1191 1 1 ! 2 ! $ Header$2 ! $Id $ 3 3 ! 4 SUBROUTINE cltrac(dtime,coef,t,tr,flux,paprs,pplay,delp, 5 s d_tr)6 USE dimphy7 IMPLICIT none 8 c====================================================================== 9 c Auteur(s): O. Boucher (LOA/LMD) date: 19961127 10 c inspire de clvent 11 c Objet: diffusion verticale de traceurs avec flux fixe a la surface 12 c ou/et flux du type c-drag 13 c====================================================================== 14 c Arguments: 15 c dtime----input-R- intervalle du temps (en second)16 c coef-----input-R- le coefficient d'echange (m**2/s) l>117 c t--------input-R- temperature (K)18 c tr-------input-R- la q. de traceurs19 c flux-----input-R- le flux de traceurs a la surface20 c paprs----input-R- pression a inter-couche (Pa)21 c pplay----input-R- pression au milieu de couche (Pa)22 c delp-----input-R- epaisseur de couche (Pa)23 c cdrag----input-R- cdrag pour le flux de surface (non active)24 c tr0------input-R- traceurs a la surface ou dans l'ocean (non active)25 c d_tr-----output-R- le changement de tr26 c flux_tr--output-R- flux de tr27 c======================================================================28 cym#include "dimensions.h"29 cym#include "dimphy.h" 30 REAL dtime31 REAL coef(klon,klev) 32 REAL t(klon,klev), tr(klon,klev)33 REAL paprs(klon,klev+1), pplay(klon,klev), delp(klon,klev)34 REAL d_tr(klon,klev)35 REAL flux(klon), cdrag(klon), tr0(klon)36 c REAL flux_tr(klon,klev) 37 c====================================================================== 38 #include "YOMCST.h" 39 c====================================================================== 40 INTEGER i, k 41 REAL zx_ctr(klon,2:klev)42 REAL zx_dtr(klon,2:klev) 43 REAL zx_buf(klon) 44 REAL zx_coef(klon,klev) 45 REAL local_tr(klon,klev) 46 REAL zx_alf1(klon), zx_alf2(klon), zx_flux(klon)47 c====================================================================== 48 DO k = 1, klev49 DO i = 1, klon50 local_tr(i,k) = tr(i,k)51 ENDDO52 ENDDO53 c 4 SUBROUTINE cltrac(dtime,coef,t,tr,flux,paprs,pplay,delp,d_tr) 5 USE dimphy 6 IMPLICIT NONE 7 !====================================================================== 8 ! Auteur(s): O. Boucher (LOA/LMD) date: 19961127 9 ! inspire de clvent 10 ! Objet: diffusion verticale de traceurs avec flux fixe a la surface 11 ! ou/et flux du type c-drag 12 ! 13 ! Arguments: 14 !----------- 15 ! dtime....input-R- intervalle du temps (en secondes) 16 ! coef.....input-R- le coefficient d'echange (m**2/s) l>1 17 ! t........input-R- temperature (K) 18 ! tr.......input-R- la q. de traceurs 19 ! flux.....input-R- le flux de traceurs a la surface 20 ! paprs....input-R- pression a inter-couche (Pa) 21 ! pplay....input-R- pression au milieu de couche (Pa) 22 ! delp.....input-R- epaisseur de couche (Pa) 23 ! cdrag....input-R- cdrag pour le flux de surface (non active) 24 ! tr0......input-R- traceurs a la surface ou dans l'ocean (non active) 25 ! d_tr.....output-R- le changement de tr 26 ! flux_tr..output-R- flux de tr 27 !====================================================================== 28 include "YOMCST.h" 29 ! 30 ! Entree 31 ! 32 REAL,INTENT(IN) :: dtime 33 REAL,DIMENSION(klon,klev),INTENT(IN) :: coef 34 REAL,DIMENSION(klon,klev),INTENT(IN) :: t, tr 35 REAL,DIMENSION(klon),INTENT(IN) :: flux !(at/s/m2) 36 REAL,DIMENSION(klon,klev+1),INTENT(IN) :: paprs 37 REAL,DIMENSION(klon,klev),INTENT(IN) :: pplay, delp 38 ! 39 ! Sorties 40 ! 41 REAL ,DIMENSION(klon,klev),INTENT(OUT) :: d_tr 42 ! REAL ,DIMENSION(klon,klev),INTENT(OUT) :: flux_tr 43 ! 44 ! Local 45 ! 46 INTEGER :: i, k 47 REAL,DIMENSION(klon) :: cdrag, tr0 48 REAL,DIMENSION(klon,klev) :: zx_ctr 49 REAL,DIMENSION(klon,klev) :: zx_dtr 50 REAL,DIMENSION(klon) :: zx_buf 51 REAL,DIMENSION(klon,klev) :: zx_coef 52 REAL,DIMENSION(klon,klev) :: local_tr 53 REAL,DIMENSION(klon) :: zx_alf1,zx_alf2,zx_flux 54 54 55 c====================================================================== 56 DO i = 1, klon 57 zx_alf1(i) = (paprs(i,1)-pplay(i,2))/(pplay(i,1)-pplay(i,2)) 58 zx_alf2(i) = 1.0 - zx_alf1(i) 59 zx_flux(i) = -flux(i)*dtime*RG 60 c--pour le moment le flux est prescrit 61 c--cdrag et zx_coef(1) vaut 0 62 cdrag(i) = 0.0 63 tr0(i) = 0.0 64 zx_coef(i,1) = cdrag(i)*dtime*RG 65 ENDDO 66 c====================================================================== 67 DO k = 2, klev 68 DO i = 1, klon 69 zx_coef(i,k) = coef(i,k)*RG/(pplay(i,k-1)-pplay(i,k)) 70 . *(paprs(i,k)*2/(t(i,k)+t(i,k-1))/RD)**2 71 zx_coef(i,k) = zx_coef(i,k)*dtime*RG 72 ENDDO 73 ENDDO 74 c====================================================================== 75 DO i = 1, klon 76 zx_buf(i) = delp(i,1) + zx_coef(i,1)*zx_alf1(i) + zx_coef(i,2) 77 zx_ctr(i,2) = (local_tr(i,1)*delp(i,1)+ 78 . zx_coef(i,1)*tr0(i)-zx_flux(i))/zx_buf(i) 79 zx_dtr(i,2) = (zx_coef(i,2)-zx_alf2(i)*zx_coef(i,1)) / 80 . zx_buf(i) 81 ENDDO 82 c 83 DO k = 3, klev 84 DO i = 1, klon 85 zx_buf(i) = delp(i,k-1) + zx_coef(i,k) 86 . + zx_coef(i,k-1)*(1.-zx_dtr(i,k-1)) 87 zx_ctr(i,k) = (local_tr(i,k-1)*delp(i,k-1) 88 . +zx_coef(i,k-1)*zx_ctr(i,k-1) )/zx_buf(i) 89 zx_dtr(i,k) = zx_coef(i,k)/zx_buf(i) 90 ENDDO 91 ENDDO 92 DO i = 1, klon 93 local_tr(i,klev) = ( local_tr(i,klev)*delp(i,klev) 94 . +zx_coef(i,klev)*zx_ctr(i,klev) ) 95 . / ( delp(i,klev) + zx_coef(i,klev) 96 . -zx_coef(i,klev)*zx_dtr(i,klev) ) 97 ENDDO 98 DO k = klev-1, 1, -1 99 DO i = 1, klon 100 local_tr(i,k) = zx_ctr(i,k+1) + zx_dtr(i,k+1)*local_tr(i,k+1) 101 ENDDO 102 ENDDO 103 c====================================================================== 104 c== flux_tr est le flux de traceur (positif vers bas) 105 c DO i = 1, klon 106 c flux_tr(i,1) = zx_coef(i,1)/(RG*dtime) 107 c ENDDO 108 c DO k = 2, klev 109 c DO i = 1, klon 110 c flux_tr(i,k) = zx_coef(i,k)/(RG*dtime) 111 c . * (local_tr(i,k)-local_tr(i,k-1)) 112 c ENDDO 113 c ENDDO 114 c====================================================================== 115 DO k = 1, klev 116 DO i = 1, klon 117 d_tr(i,k) = local_tr(i,k) - tr(i,k) 118 ENDDO 119 ENDDO 120 c 121 RETURN 122 END 55 !====================================================================== 56 57 DO k = 1, klev 58 DO i = 1, klon 59 local_tr(i,k) = tr(i,k) 60 ENDDO 61 ENDDO 62 63 !====================================================================== 64 65 DO i = 1, klon 66 zx_alf1(i) = (paprs(i,1)-pplay(i,2))/(pplay(i,1)-pplay(i,2)) 67 zx_alf2(i) = 1.0 - zx_alf1(i) 68 zx_flux(i) = -flux(i)*dtime*RG 69 ! Pour le moment le flux est prescrit cdrag et zx_coef(1) vaut 0 70 cdrag(i) = 0.0 71 tr0(i) = 0.0 72 zx_coef(i,1) = cdrag(i)*dtime*RG 73 zx_ctr(i,1)=0. 74 zx_dtr(i,1)=0. 75 ENDDO 76 77 !====================================================================== 78 79 DO k = 2, klev 80 DO i = 1, klon 81 zx_coef(i,k) = coef(i,k)*RG/(pplay(i,k-1)-pplay(i,k)) & 82 *(paprs(i,k)*2/(t(i,k)+t(i,k-1))/RD)**2 83 zx_coef(i,k) = zx_coef(i,k)*dtime*RG 84 ENDDO 85 ENDDO 86 87 !====================================================================== 88 89 DO i = 1, klon 90 zx_buf(i) = delp(i,1) + zx_coef(i,1)*zx_alf1(i) + zx_coef(i,2) 91 ! 92 zx_ctr(i,2) = (local_tr(i,1)*delp(i,1)+ & 93 zx_coef(i,1)*tr0(i)-zx_flux(i))/zx_buf(i) 94 ! 95 zx_dtr(i,2) = (zx_coef(i,2)-zx_alf2(i)*zx_coef(i,1)) / & 96 zx_buf(i) 97 ENDDO 98 99 DO k = 3, klev 100 DO i = 1, klon 101 zx_buf(i) = delp(i,k-1) + zx_coef(i,k) & 102 + zx_coef(i,k-1)*(1.-zx_dtr(i,k-1)) 103 zx_ctr(i,k) = (local_tr(i,k-1)*delp(i,k-1) & 104 +zx_coef(i,k-1)*zx_ctr(i,k-1) )/zx_buf(i) 105 zx_dtr(i,k) = zx_coef(i,k)/zx_buf(i) 106 ENDDO 107 ENDDO 108 109 DO i = 1, klon 110 local_tr(i,klev) = ( local_tr(i,klev)*delp(i,klev) & 111 +zx_coef(i,klev)*zx_ctr(i,klev) ) & 112 / ( delp(i,klev) + zx_coef(i,klev) & 113 -zx_coef(i,klev)*zx_dtr(i,klev) ) 114 ENDDO 115 116 DO k = klev-1, 1, -1 117 DO i = 1, klon 118 local_tr(i,k) = zx_ctr(i,k+1) + zx_dtr(i,k+1)*local_tr(i,k+1) 119 ENDDO 120 ENDDO 121 122 !====================================================================== 123 !== flux_tr est le flux de traceur (positif vers bas) 124 ! DO i = 1, klon 125 ! flux_tr(i,1) = zx_coef(i,1)/(RG*dtime) 126 ! ENDDO 127 ! DO k = 2, klev 128 ! DO i = 1, klon 129 ! flux_tr(i,k) = zx_coef(i,k)/(RG*dtime) 130 ! . * (local_tr(i,k)-local_tr(i,k-1)) 131 ! ENDDO 132 ! ENDDO 133 !====================================================================== 134 DO k = 1, klev 135 DO i = 1, klon 136 d_tr(i,k) = local_tr(i,k) - tr(i,k) 137 ENDDO 138 ENDDO 139 140 END SUBROUTINE cltrac -
LMDZ4/branches/LMDZ4-dev/libf/phylmd/cltracrn.F90
r1188 r1191 1 !$Id $ 2 3 SUBROUTINE cltracrn( itr, dtime,u1lay, v1lay, & 4 cdrag,coef,t,ftsol,pctsrf, & 5 tr,trs,paprs,pplay,delp, & 6 masktr,fshtr,hsoltr,tautr,vdeptr, & 7 lat,d_tr,d_trs ) 8 9 USE dimphy 10 IMPLICIT NONE 11 !====================================================================== 12 ! Auteur(s): Alex/LMD) date: fev 99 13 ! inspire de clqh + clvent 14 ! Objet: diffusion verticale de traceurs avec quantite de traceur ds 15 ! le sol ( reservoir de sol de radon ) 16 ! 17 ! note : pour l'instant le traceur dans le sol et le flux sont 18 ! calcules mais ils ne servent que de diagnostiques 19 ! seule la tendance sur le traceur est sortie (d_tr) 20 !--------------------------------------------------------------------- 21 ! Arguments: 22 ! itr......input-R- le type de traceur 1- Rn 2 - Pb 23 ! dtime....input-R- intervalle du temps (en secondes) ~ pdtphys 24 ! u1lay....input-R- vent u de la premiere couche (m/s) 25 ! v1lay....input-R- vent v de la premiere couche (m/s) 26 ! cdrag....input-R- cdrag 27 ! coef.....input-R- le coefficient d'echange (m**2/s) l>1, valable uniquement pour k entre 2 et klev 28 ! t........input-R- temperature (K) 29 ! paprs....input-R- pression a inter-couche (Pa) 30 ! pplay....input-R- pression au milieu de couche (Pa) 31 ! delp.....input-R- epaisseur de couche (Pa) 32 ! ftsol....input-R- temperature du sol (en Kelvin) 33 ! tr.......input-R- traceurs 34 ! trs......input-R- traceurs dans le sol 35 ! masktr...input-R- Masque reservoir de sol traceur (1 = reservoir) 36 ! fshtr....input-R- Flux surfacique de production dans le sol 37 ! tautr....input-R- Constante de decroissance du traceur 38 ! vdeptr...input-R- Vitesse de depot sec dans la couche brownienne 39 ! hsoltr...input-R- Epaisseur equivalente du reservoir de sol 40 ! lat......input-R- latitude en degree 41 ! d_tr.....output-R- le changement de "tr" 42 ! d_trs....output-R- le changement de "trs" 43 !====================================================================== 44 include "YOMCST.h" 45 include "indicesol.h" 1 46 ! 2 SUBROUTINE cltracrn( itr, dtime,u1lay, v1lay, 3 e cdrag,coef,t,ftsol,pctsrf, 4 e tr,trs,paprs,pplay,delp, 5 e masktr,fshtr,hsoltr,tautr,vdeptr, 6 e lat, 7 s d_tr,d_trs ) 8 9 USE dimphy 10 IMPLICIT none 11 c====================================================================== 12 c Auteur(s): Alex/LMD) date: fev 99 13 c inspire de clqh + clvent 14 c Objet: diffusion verticale de traceurs avec quantite de traceur ds 15 c le sol ( reservoir de sol de radon ) 16 c 17 c note : pour l'instant le traceur dans le sol et le flux sont 18 c calcules mais ils ne servent que de diagnostiques 19 c seule la tendance sur le traceur est sortie (d_tr) 20 c====================================================================== 21 c Arguments: 22 c itr--- -input-R- le type de traceur 1- Rn 2 - Pb 23 c dtime----input-R- intervalle du temps (en second) 24 c u1lay----input-R- vent u de la premiere couche (m/s) 25 c v1lay----input-R- vent v de la premiere couche (m/s) 26 c cdrag----input-R- cdrag 27 c coef-----input-R- le coefficient d'echange (m**2/s) l>1, valable uniquement pour k entre 2 et klev 28 c t--------input-R- temperature (K) 29 c paprs----input-R- pression a inter-couche (Pa) 30 c pplay----input-R- pression au milieu de couche (Pa) 31 c delp-----input-R- epaisseur de couche (Pa) 32 c ftsol----input-R- temperature du sol (en Kelvin) 33 c tr-------input-R- traceurs 34 c trs------input-R- traceurs dans le sol 35 c masktr---input-R- Masque reservoir de sol traceur (1 = reservoir) 36 c fshtr----input-R- Flux surfacique de production dans le sol 37 c tautr----input-R- Constante de decroissance du traceur 38 c vdeptr---input-R- Vitesse de depot sec dans la couche brownienne 39 c hsoltr---input-R- Epaisseur equivalente du reservoir de sol 40 c lat-----input-R- latitude en degree 41 c d_tr-----output-R- le changement de "tr" 42 c d_trs----output-R- le changement de "trs" 43 c====================================================================== 44 cym#include "dimensions.h" 45 cym#include "dimphy.h" 46 #include "YOMCST.h" 47 #include "indicesol.h" 48 c====================================================================== 49 REAL dtime 50 REAL u1lay(klon), v1lay(klon) 51 REAL cdrag(klon) 52 REAL coef(klon,klev) 53 REAL t(klon,klev), ftsol(klon,nbsrf), pctsrf(klon,nbsrf) 54 REAL tr(klon,klev), trs(klon) 55 REAL paprs(klon,klev+1), pplay(klon,klev), delp(klon,klev) 56 REAL masktr(klon) 57 REAL fshtr(klon) 58 REAL hsoltr 59 REAL tautr 60 REAL vdeptr 61 REAL lat(klon) 62 REAL d_tr(klon,klev) 63 c====================================================================== 64 REAL flux_tr(klon,klev) ! (diagnostic) flux de traceur 65 REAL d_trs(klon) ! (diagnostic) traceur ds le sol 66 c====================================================================== 67 INTEGER i, k, itr, n, l 68 REAL rotrhi(klon) 69 REAL zx_coef(klon,klev) 70 REAL zx_buf(klon) 71 REAL zx_ctr(klon,klev) 72 REAL zx_dtr(klon,klev) 73 REAL zx_trs(klon) 74 REAL zx_a, zx_b 75 76 REAL local_tr(klon,klev) 77 REAL local_trs(klon) 78 REAL zts(klon) 79 REAL zx_alpha1(klon), zx_alpha2(klon) 80 c====================================================================== 81 cAA Pour l'instant les 4 types de surface ne sont pas pris en compte 82 cAA On fabrique avec zts un champ de temperature de sol 83 cAA que le pondere par la fraction de nature de sol. 84 c 85 c print*,'PASSAGE DANS CLTRACRN' 86 87 DO i = 1,klon 88 zts(i) = 0. 89 ENDDO 90 c 91 DO n=1,nbsrf 92 DO i = 1,klon 93 zts(i) = zts(i) + ftsol(i,n)*pctsrf(i,n) 94 ENDDO 95 ENDDO 96 c 97 DO i = 1,klon 98 rotrhi(i) = RD * zts(i) / hsoltr 99 END DO 100 c 101 DO k = 1, klev 102 DO i = 1, klon 103 local_tr(i,k) = tr(i,k) 104 ENDDO 105 ENDDO 106 c 107 DO i = 1, klon 108 local_trs(i) = trs(i) 109 ENDDO 110 c====================================================================== 111 cAA Attention si dans clmain zx_alf1(i) = 1.0 112 cAA Il doit y avoir coherence (dc la meme chose ici) 113 114 DO i = 1, klon 115 cAA zx_alpha1(i) = (paprs(i,1)-pplay(i,2))/(pplay(i,1)-pplay(i,2)) 116 zx_alpha1(i) = 1.0 117 zx_alpha2(i) = 1.0 - zx_alpha1(i) 118 ENDDO 119 c====================================================================== 120 DO i = 1, klon 121 zx_coef(i,1) = cdrag(i) 122 . * (1.0+SQRT(u1lay(i)**2+v1lay(i)**2)) 123 . * pplay(i,1)/(RD*t(i,1)) 124 zx_coef(i,1) = zx_coef(i,1) * dtime*RG 125 ENDDO 126 c 127 DO k = 2, klev 128 DO i = 1, klon 129 zx_coef(i,k) = coef(i,k)*RG/(pplay(i,k-1)-pplay(i,k)) 130 . *(paprs(i,k)*2/(t(i,k)+t(i,k-1))/RD)**2 131 zx_coef(i,k) = zx_coef(i,k) * dtime*RG 132 ENDDO 133 ENDDO 134 c====================================================================== 135 DO i = 1, klon 136 zx_buf(i) = delp(i,klev) + zx_coef(i,klev) 137 zx_ctr(i,klev) = local_tr(i,klev)*delp(i,klev)/zx_buf(i) 138 zx_dtr(i,klev) = zx_coef(i,klev) / zx_buf(i) 139 ENDDO 140 c 141 DO l = klev-1, 2 , -1 142 DO i = 1, klon 143 zx_buf(i) = delp(i,l)+zx_coef(i,l) 144 . +zx_coef(i,l+1)*(1.-zx_dtr(i,l+1)) 145 zx_ctr(i,l) = ( local_tr(i,l)*delp(i,l) 146 . + zx_coef(i,l+1)*zx_ctr(i,l+1) )/zx_buf(i) 147 zx_dtr(i,l) = zx_coef(i,l) / zx_buf(i) 148 ENDDO 149 ENDDO 150 c 151 DO i = 1, klon 152 zx_buf(i) = delp(i,1) + zx_coef(i,2)*(1.-zx_dtr(i,2)) 153 . + masktr(i) * zx_coef(i,1) 154 . *( zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2) ) 155 zx_ctr(i,1) = ( local_tr(i,1)*delp(i,1) 156 . + zx_ctr(i,2) 157 . *(zx_coef(i,2) 158 . - masktr(i) * zx_coef(i,1) 159 . *zx_alpha2(i) ) ) / zx_buf(i) 160 zx_dtr(i,1) = masktr(i) * zx_coef(i,1) / zx_buf(i) 161 ENDDO 162 c====================================================================== 163 c Calculer d'abord local_trs nouvelle quantite dans le reservoir 164 c de sol 165 c 166 c------------------------- 167 c Au dessus des continents 168 c------------------------- 169 c Le pb peut se deposer partout : vdeptr = 10-3 m/s 170 c Le Rn est traiter commme une couche Brownienne puisque vdeptr = 0. 171 c 172 DO i = 1, klon 173 c 174 IF ( NINT(masktr(i)) .EQ. 1 ) THEN 175 zx_trs(i) = local_trs(i) 176 zx_a = zx_trs(i) 177 . +fshtr(i)*dtime*rotrhi(i) 178 . +rotrhi(i)*masktr(i)*zx_coef(i,1)/RG 179 . *(zx_ctr(i,1)*(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2)) 180 . +zx_alpha2(i)*zx_ctr(i,2)) 181 zx_b = 1. + rotrhi(i)*masktr(i)*zx_coef(i,1)/RG 182 . * (1.-zx_dtr(i,1) 183 . *(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2))) 184 . + dtime / tautr 185 cAA: Pour l'instant, pour aller vite, le depot sec est traite 186 C comme une decroissance 187 . + dtime * vdeptr / hsoltr 188 zx_trs(i) = zx_a / zx_b 189 local_trs(i) = zx_trs(i) 190 ENDIF 191 c 192 c Si on est entre 60N et 70N on divise par 2 l'emanation 193 c-------------------------------------------------------- 194 c 195 IF 196 . ( (itr.eq.1.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GE.60. 197 . .AND.lat(i).LE.70.) 198 . .OR. 199 . (itr.eq.2.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GE.60. 200 . .AND.lat(i).LE.70.) ) 201 . THEN 202 zx_trs(i) = local_trs(i) 203 zx_a = zx_trs(i) 204 . +(fshtr(i)/2.)*dtime*rotrhi(i) 205 . +rotrhi(i)*masktr(i)*zx_coef(i,1)/RG 206 . *(zx_ctr(i,1)*(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2)) 207 . +zx_alpha2(i)*zx_ctr(i,2)) 208 zx_b = 1. + rotrhi(i)*masktr(i)*zx_coef(i,1)/RG 209 . * (1.-zx_dtr(i,1) 210 . *(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2))) 211 . + dtime / tautr 212 . + dtime * vdeptr / hsoltr 213 zx_trs(i) = zx_a / zx_b 214 local_trs(i) = zx_trs(i) 215 ENDIF 216 c 217 c---------------------------------------------- 218 c Au dessus des oceans et aux hautes latitudes 219 c---------------------------------------------- 220 c 221 c au dessous de -60S pas d'emission de radon au dessus 222 c des oceans et des continents 223 c--------------------------------------------------------------- 224 225 IF ( (itr.EQ.1.AND.NINT(masktr(i)).EQ.0) 226 . .OR. 227 . (itr.EQ.1.AND.NINT(masktr(i)).EQ.1.AND.lat(i).LT.-60.)) 228 . THEN 229 zx_trs(i) = 0. 230 local_trs(i) = 0. 231 END IF 232 233 c au dessus de 70 N pas d'emission de radon au dessus 234 c des oceans et des continents 235 c-------------------------------------------------------------- 236 IF ( (itr.EQ.1.AND.NINT(masktr(i)).EQ.0) 237 . .OR. 238 . (itr.EQ.1.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GT.70.)) 239 . THEN 240 zx_trs(i) = 0. 241 local_trs(i) = 0. 242 END IF 243 244 c Au dessus des oceans la source est nulle 245 c----------------------------------------- 246 c 247 IF (itr.eq.1.AND.NINT(masktr(i)).EQ.0) THEN 248 zx_trs(i) = 0. 249 local_trs(i) = 0. 250 END IF 251 c 252 ENDDO ! sur le i=1,klon 253 c 254 c====================================================================== 255 c==== une fois on a zx_trs, on peut faire l'iteration ======== 256 c 257 DO i = 1, klon 258 local_tr(i,1) = zx_ctr(i,1)+zx_dtr(i,1)*zx_trs(i) 259 ENDDO 260 DO l = 2, klev 261 DO i = 1, klon 262 local_tr(i,l) 263 . = zx_ctr(i,l) + zx_dtr(i,l)*local_tr(i,l-1) 264 ENDDO 265 ENDDO 266 c====================================================================== 267 c== Calcul du flux de traceur (flux_tr): UA/(m**2 s) 268 c 269 DO i = 1, klon 270 flux_tr(i,1) = masktr(i)*zx_coef(i,1)/RG 271 . * (zx_alpha1(i)*local_tr(i,1)+zx_alpha2(i)*local_tr(i,2) 272 . -zx_trs(i)) / dtime 273 ENDDO 274 DO l = 2, klev 275 DO i = 1, klon 276 flux_tr(i,l) = zx_coef(i,l)/RG 277 . * (local_tr(i,l)-local_tr(i,l-1)) / dtime 278 ENDDO 279 ENDDO 280 c====================================================================== 281 c== Calcul des tendances du traceur ds le sol et dans l'atmosphere 282 c 283 DO l = 1, klev 284 DO i = 1, klon 285 d_tr(i,l) = local_tr(i,l) - tr(i,l) 286 ENDDO 287 ENDDO 288 DO i = 1, klon 289 d_trs(i) = local_trs(i) - trs(i) 290 ENDDO 291 c====================================================================== 292 c 293 RETURN 294 END 47 !Entrees 48 INTEGER,INTENT(IN) :: itr 49 REAL,INTENT(IN) :: dtime 50 REAL,DIMENSION(klon),INTENT(IN) :: u1lay, v1lay 51 REAL,DIMENSION(klon),INTENT(IN) :: cdrag 52 REAL,DIMENSION(klon,klev),INTENT(IN) :: coef, t 53 REAL,DIMENSION(klon,nbsrf),INTENT(IN) :: ftsol, pctsrf 54 REAL,DIMENSION(klon,klev),INTENT(IN) :: tr 55 REAL,DIMENSION(klon),INTENT(IN) :: trs 56 REAL,DIMENSION(klon,klev+1),INTENT(IN) :: paprs 57 REAL,DIMENSION(klon,klev),INTENT(IN) :: pplay, delp 58 REAL,DIMENSION(klon),INTENT(IN) :: masktr 59 REAL,DIMENSION(klon),INTENT(IN) :: fshtr 60 REAL,INTENT(IN) :: hsoltr 61 REAL,INTENT(IN) :: tautr 62 REAL,INTENT(IN) :: vdeptr 63 REAL,DIMENSION(klon),INTENT(IN) :: lat 64 65 !Sorties 66 REAL,DIMENSION(klon,klev),INTENT(OUT) :: d_tr 67 REAL,DIMENSION(klon),INTENT(OUT) :: d_trs ! (diagnostic) traceur ds le sol 68 69 !Locales 70 REAL,DIMENSION(klon,klev) :: flux_tr ! (diagnostic) flux de traceur 71 INTEGER :: i, k, n, l 72 REAL,DIMENSION(klon) :: rotrhi 73 REAL,DIMENSION(klon,klev) :: zx_coef 74 REAL,DIMENSION(klon) :: zx_buf 75 REAL,DIMENSION(klon,klev) :: zx_ctr 76 REAL,DIMENSION(klon,klev) :: zx_dtr 77 REAL,DIMENSION(klon) :: zx_trs 78 REAL :: zx_a, zx_b 79 80 REAL,DIMENSION(klon,klev) :: local_tr 81 REAL,DIMENSION(klon) :: local_trs 82 REAL,DIMENSION(klon) :: zts ! champ de temperature du sol 83 REAL,DIMENSION(klon) :: zx_alpha1, zx_alpha2 84 !====================================================================== 85 !AA Pour l'instant les 4 types de surface ne sont pas pris en compte 86 !AA On fabrique avec zts un champ de temperature de sol 87 !AA que le pondere par la fraction de nature de sol. 88 89 DO i = 1,klon 90 zts(i) = 0. 91 ENDDO 92 93 DO n=1,nbsrf 94 DO i = 1,klon 95 zts(i) = zts(i) + ftsol(i,n)*pctsrf(i,n) 96 ENDDO 97 ENDDO 98 99 DO i = 1,klon 100 rotrhi(i) = RD * zts(i) / hsoltr 101 ENDDO 102 103 DO k = 1, klev 104 DO i = 1, klon 105 local_tr(i,k) = tr(i,k) 106 ENDDO 107 ENDDO 108 109 DO i = 1, klon 110 local_trs(i) = trs(i) 111 ENDDO 112 !====================================================================== 113 !AA Attention si dans clmain zx_alf1(i) = 1.0 114 !AA Il doit y avoir coherence (dc la meme chose ici) 115 116 DO i = 1, klon 117 !AA zx_alpha1(i) = (paprs(i,1)-pplay(i,2))/(pplay(i,1)-pplay(i,2)) 118 zx_alpha1(i) = 1.0 119 zx_alpha2(i) = 1.0 - zx_alpha1(i) 120 ENDDO 121 !====================================================================== 122 DO i = 1, klon 123 zx_coef(i,1) = cdrag(i)*(1.0+SQRT(u1lay(i)**2+v1lay(i)**2)) & 124 *pplay(i,1)/(RD*t(i,1)) 125 zx_coef(i,1) = zx_coef(i,1) * dtime*RG 126 ENDDO 127 128 DO k = 2, klev 129 DO i = 1, klon 130 zx_coef(i,k) = coef(i,k)*RG/(pplay(i,k-1)-pplay(i,k)) & 131 *(paprs(i,k)*2/(t(i,k)+t(i,k-1))/RD)**2 132 zx_coef(i,k) = zx_coef(i,k) * dtime*RG 133 ENDDO 134 ENDDO 135 !====================================================================== 136 DO i = 1, klon 137 zx_buf(i) = delp(i,klev) + zx_coef(i,klev) 138 zx_ctr(i,klev) = local_tr(i,klev)*delp(i,klev)/zx_buf(i) 139 zx_dtr(i,klev) = zx_coef(i,klev) / zx_buf(i) 140 ENDDO 141 142 DO l = klev-1, 2 , -1 143 DO i = 1, klon 144 zx_buf(i) = delp(i,l)+zx_coef(i,l) & 145 +zx_coef(i,l+1)*(1.-zx_dtr(i,l+1)) 146 147 zx_ctr(i,l) = ( local_tr(i,l)*delp(i,l) & 148 + zx_coef(i,l+1)*zx_ctr(i,l+1) )/zx_buf(i) 149 zx_dtr(i,l) = zx_coef(i,l) / zx_buf(i) 150 ENDDO 151 ENDDO 152 153 DO i = 1, klon 154 zx_buf(i) = delp(i,1) + zx_coef(i,2)*(1.-zx_dtr(i,2)) & 155 + masktr(i) * zx_coef(i,1) & 156 *( zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2) ) 157 158 zx_ctr(i,1) = ( local_tr(i,1)*delp(i,1) & 159 + zx_ctr(i,2) & 160 *(zx_coef(i,2) & 161 - masktr(i) * zx_coef(i,1) & 162 *zx_alpha2(i) ) ) / zx_buf(i) 163 zx_dtr(i,1) = masktr(i) * zx_coef(i,1) / zx_buf(i) 164 ENDDO 165 !====================================================================== 166 ! Calculer d'abord local_trs nouvelle quantite dans le reservoir 167 ! de sol 168 !===================================================================== 169 170 DO i = 1, klon 171 !------------------------- 172 ! Au dessus des continents 173 !-- 174 ! Le pb peut se deposer partout : vdeptr = 10-3 m/s 175 ! Le Rn est traiter commme une couche Brownienne puisque vdeptr = 0. 176 !------------------------------------------------------------------- 177 IF ( NINT(masktr(i)) .EQ. 1 ) THEN 178 zx_trs(i) = local_trs(i) 179 zx_a = zx_trs(i) & 180 +fshtr(i)*dtime*rotrhi(i) & 181 +rotrhi(i)*masktr(i)*zx_coef(i,1)/RG & 182 *(zx_ctr(i,1)*(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2)) & 183 +zx_alpha2(i)*zx_ctr(i,2)) 184 ! Pour l'instant, pour aller vite, le depot sec est traite comme une decroissance 185 zx_b = 1. + rotrhi(i)*masktr(i)*zx_coef(i,1)/RG & 186 * (1.-zx_dtr(i,1) & 187 *(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2))) & 188 + dtime / tautr & 189 + dtime * vdeptr / hsoltr 190 zx_trs(i) = zx_a / zx_b 191 local_trs(i) = zx_trs(i) 192 ENDIF 193 !-------------------------------------------------------- 194 ! Si on est entre 60N et 70N on divise par 2 l'emanation 195 !-------------------------------------------------------- 196 197 IF ( (itr.eq.1.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GE.60..AND.lat(i).LE.70.).OR. & 198 (itr.eq.2.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GE.60..AND.lat(i).LE.70.) ) THEN 199 zx_trs(i) = local_trs(i) 200 zx_a = zx_trs(i) & 201 +(fshtr(i)/2.)*dtime*rotrhi(i) & 202 +rotrhi(i)*masktr(i)*zx_coef(i,1)/RG & 203 *(zx_ctr(i,1)*(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2)) & 204 +zx_alpha2(i)*zx_ctr(i,2)) 205 ! 206 zx_b = 1. + rotrhi(i)*masktr(i)*zx_coef(i,1)/RG & 207 * (1.-zx_dtr(i,1) & 208 *(zx_alpha1(i)+zx_alpha2(i)*zx_dtr(i,2))) & 209 + dtime / tautr & 210 + dtime * vdeptr / hsoltr 211 ! 212 zx_trs(i) = zx_a / zx_b 213 local_trs(i) = zx_trs(i) 214 ENDIF 215 216 !---------------------------------------------- 217 ! Au dessus des oceans et aux hautes latitudes 218 !-- 219 ! au dessous de -60S pas d'emission de radon au dessus 220 ! des oceans et des continents 221 !--------------------------------------------------------------- 222 223 IF ( (itr.EQ.1.AND.NINT(masktr(i)).EQ.0).OR. & 224 (itr.EQ.1.AND.NINT(masktr(i)).EQ.1.AND.lat(i).LT.-60.)) THEN 225 zx_trs(i) = 0. 226 local_trs(i) = 0. 227 END IF 228 !-- 229 ! au dessus de 70 N pas d'emission de radon au dessus 230 ! des oceans et des continents 231 !-------------------------------------------------------------- 232 IF ( (itr.EQ.1.AND.NINT(masktr(i)).EQ.0).OR. & 233 (itr.EQ.1.AND.NINT(masktr(i)).EQ.1.AND.lat(i).GT.70.)) THEN 234 zx_trs(i) = 0. 235 local_trs(i) = 0. 236 END IF 237 !--------------------------------------------- 238 ! Au dessus des oceans la source est nulle 239 !-------------------------------------------- 240 241 IF (itr.eq.1.AND.NINT(masktr(i)).EQ.0) THEN 242 zx_trs(i) = 0. 243 local_trs(i) = 0. 244 END IF 245 246 ENDDO ! sur le i=1,klon 247 ! 248 !====================================================================== 249 ! Une fois on a zx_trs, on peut faire l'iteration 250 !====================================================================== 251 252 DO i = 1, klon 253 local_tr(i,1) = zx_ctr(i,1)+zx_dtr(i,1)*zx_trs(i) 254 ENDDO 255 DO l = 2, klev 256 DO i = 1, klon 257 local_tr(i,l) = zx_ctr(i,l) + zx_dtr(i,l)*local_tr(i,l-1) 258 ENDDO 259 ENDDO 260 !====================================================================== 261 ! Calcul du flux de traceur (flux_tr): UA/(m**2 s) 262 !====================================================================== 263 DO i = 1, klon 264 flux_tr(i,1) = masktr(i)*zx_coef(i,1)/RG & 265 * (zx_alpha1(i)*local_tr(i,1)+zx_alpha2(i)*local_tr(i,2) & 266 -zx_trs(i)) / dtime 267 ENDDO 268 DO l = 2, klev 269 DO i = 1, klon 270 flux_tr(i,l) = zx_coef(i,l)/RG & 271 * (local_tr(i,l)-local_tr(i,l-1)) / dtime 272 ENDDO 273 ENDDO 274 !====================================================================== 275 ! Calcul des tendances du traceur ds le sol et dans l'atmosphere 276 !====================================================================== 277 DO l = 1, klev 278 DO i = 1, klon 279 d_tr(i,l) = local_tr(i,l) - tr(i,l) 280 ENDDO 281 ENDDO 282 DO i = 1, klon 283 d_trs(i) = local_trs(i) - trs(i) 284 ENDDO 285 286 END SUBROUTINE cltracrn -
LMDZ4/branches/LMDZ4-dev/libf/phylmd/cvltr.F90
r1188 r1191 1 c 2 c $Header$ 3 c 4 SUBROUTINE cvltr(pdtime,da, phi, mp,paprs,pplay,x,upd,dnd,dx) 5 USE dimphy 6 IMPLICIT NONE 7 c===================================================================== 8 c Objet : convection des traceurs / KE 9 c Auteurs: M-A Filiberti and J-Y Grandpeix 10 c===================================================================== 11 c 12 cym#include "dimensions.h" 13 cym#include "dimphy.h" 14 #include "YOMCST.h" 15 #include "YOECUMF.h" 16 c 17 REAL pdtime 18 REAL paprs(klon,klev+1) ! pression aux 1/2 couches (bas en haut) 19 REAL pplay(klon,klev) ! pression pour le milieu de chaque couche 20 REAL x(klon,klev) ! q de traceur (bas en haut) 21 REAL dx(klon,klev) ! tendance de traceur (bas en haut) 22 real da(klon,klev),phi(klon,klev,klev),mp(klon,klev) 23 REAL upd(klon,klev) ! saturated updraft mass flux 24 REAL dnd(klon,klev) ! saturated downdraft mass flux 25 c 26 c--variables locales 27 real zed(klon,klev),zmd(klon,klev,klev) 28 real za(klon,klev,klev) 29 real zmfd(klon,klev),zmfa(klon,klev) 30 real zmfp(klon,klev),zmfu(klon,klev) 31 integer i,k,j 32 c test conservation 33 c real conserv 34 c ========================================= 35 c calcul des tendances liees au downdraft 36 c ========================================= 37 zed(:,:)=0. 38 zmfd(:,:)=0. 39 zmfa(:,:)=0. 40 zmfu(:,:)=0. 41 zmfp(:,:)=0. 42 zmd(:,:,:)=0. 43 za(:,:,:)=0. 44 c entrainement 45 do k=1,klev-1 46 do i=1,klon 47 zed(i,k)=max(0.,mp(i,k)-mp(i,k+1)) 48 end do 49 end do 50 c 51 c calcul de la matrice d echange 52 c matrice de distribution de la masse entrainee en k 53 c 54 do k=1,klev 55 do i=1,klon 56 zmd(i,k,k)=zed(i,k) 57 end do 58 end do 59 do k=2,klev 60 do j=k-1,1,-1 61 do i=1,klon 62 if(mp(i,j+1).ne.0) then 63 zmd(i,j,k)=zmd(i,j+1,k)*min(1.,mp(i,j)/mp(i,j+1)) 64 endif 65 end do 66 end do 67 end do 68 do k=1,klev 69 do j=1,klev-1 70 do i=1,klon 71 za(i,j,k)=max(0.,zmd(i,j+1,k)-zmd(i,j,k)) 72 end do 73 end do 74 end do 75 c 76 c rajout du terme lie a l ascendance induite 77 c 78 do j=2,klev 79 do i=1,klon 80 za(i,j,j-1)=za(i,j,j-1)+mp(i,j) 81 end do 82 end do 83 C 84 c tendances 85 c 86 do k=1,klev 87 do j=1,klev 88 do i=1,klon 89 zmfd(i,j)=zmfd(i,j)+za(i,j,k)*(x(i,k)-x(i,j)) 90 end do 91 end do 92 end do 93 c 94 c ========================================= 95 c calcul des tendances liees aux flux satures 96 c ========================================= 97 do j=1,klev 98 do i=1,klon 99 zmfa(i,j)=da(i,j)*(x(i,1)-x(i,j)) 100 end do 101 end do 102 do k=1,klev 103 do j=1,klev 104 do i=1,klon 105 zmfp(i,j)=zmfp(i,j)+phi(i,j,k)*(x(i,k)-x(i,j)) 106 end do 107 end do 108 end do 109 do j=1,klev-1 110 do i=1,klon 111 zmfu(i,j)=max(0.,upd(i,j+1)+dnd(i,j+1))*(x(i,j+1)-x(i,j)) 112 end do 113 end do 114 do j=2,klev 115 do i=1,klon 116 zmfu(i,j)=zmfu(i,j) 117 . +min(0.,upd(i,j)+dnd(i,j))*(x(i,j)-x(i,j-1)) 118 end do 119 end do 1 ! 2 ! $Id $ 3 ! 4 SUBROUTINE cvltr(pdtime,da, phi, mp,paprs,pplay,x,upd,dnd,dx) 5 USE dimphy 6 IMPLICIT NONE 7 !===================================================================== 8 ! Objet : convection des traceurs / KE 9 ! Auteurs: M-A Filiberti and J-Y Grandpeix 10 !===================================================================== 120 11 121 c ========================================= 122 c--calcul final des tendances 123 c ========================================= 124 do k=1, klev 125 do i=1, klon 126 dx(i,k)=(zmfd(i,k)+zmfu(i,k) 127 . +zmfa(i,k)+zmfp(i,k))*pdtime 128 . *RG/(paprs(i,k)-paprs(i,k+1)) 129 c print*,'dx',k,dx(i,k) 130 enddo 131 enddo 132 c 133 c test de conservation du traceur 134 c conserv=0. 135 c do k=1, klev 136 c do i=1, klon 137 c conserv=conserv+dx(i,k)* 138 c . (paprs(i,k)-paprs(i,k+1))/RG 139 C 140 c enddo 141 c enddo 142 c print *,'conserv',conserv 12 include "YOMCST.h" 13 include "YOECUMF.h" 14 15 ! Entree 16 REAL,INTENT(IN) :: pdtime 17 REAL,DIMENSION(klon,klev),INTENT(IN) :: da 18 REAL,DIMENSION(klon,klev,klev),INTENT(IN) :: phi 19 REAL,DIMENSION(klon,klev),INTENT(IN) :: mp 20 REAL,DIMENSION(klon,klev+1),INTENT(IN) :: paprs ! pression aux 1/2 couches (bas en haut) 21 REAL,DIMENSION(klon,klev),INTENT(IN) :: pplay ! pression pour le milieu de chaque couche 22 REAL,DIMENSION(klon,klev),INTENT(IN) :: x ! q de traceur (bas en haut) 23 REAL,DIMENSION(klon,klev),INTENT(IN) :: upd ! saturated updraft mass flux 24 REAL,DIMENSION(klon,klev),INTENT(IN) :: dnd ! saturated downdraft mass flux 25 26 ! Sortie 27 REAL,DIMENSION(klon,klev),INTENT(OUT) :: dx ! tendance de traceur (bas en haut) 28 29 ! Variables locales 30 REAL,DIMENSION(klon,klev) :: zed 31 REAL,DIMENSION(klon,klev,klev) :: zmd 32 REAL,DIMENSION(klon,klev,klev) :: za 33 REAL,DIMENSION(klon,klev) :: zmfd,zmfa 34 REAL,DIMENSION(klon,klev) :: zmfp,zmfu 35 INTEGER :: i,k,j 36 37 ! ========================================= 38 ! calcul des tendances liees au downdraft 39 ! ========================================= 40 zed(:,:)=0. 41 zmfd(:,:)=0. 42 zmfa(:,:)=0. 43 zmfu(:,:)=0. 44 zmfp(:,:)=0. 45 zmd(:,:,:)=0. 46 za(:,:,:)=0. 47 ! entrainement 48 DO k=1,klev-1 49 DO i=1,klon 50 zed(i,k)=max(0.,mp(i,k)-mp(i,k+1)) 51 END DO 52 END DO 53 54 ! calcul de la matrice d echange 55 ! matrice de distribution de la masse entrainee en k 56 57 DO k=1,klev 58 DO i=1,klon 59 zmd(i,k,k)=zed(i,k) 60 END DO 61 END DO 62 DO k=2,klev 63 DO j=k-1,1,-1 64 DO i=1,klon 65 if(mp(i,j+1).ne.0) then 66 zmd(i,j,k)=zmd(i,j+1,k)*min(1.,mp(i,j)/mp(i,j+1)) 67 ENDif 68 END DO 69 END DO 70 END DO 71 DO k=1,klev 72 DO j=1,klev-1 73 DO i=1,klon 74 za(i,j,k)=max(0.,zmd(i,j+1,k)-zmd(i,j,k)) 75 END DO 76 END DO 77 END DO 78 ! 79 ! rajout du terme lie a l ascendance induite 80 ! 81 DO j=2,klev 82 DO i=1,klon 83 za(i,j,j-1)=za(i,j,j-1)+mp(i,j) 84 END DO 85 END DO 86 ! 87 ! tendances 88 ! 89 DO k=1,klev 90 DO j=1,klev 91 DO i=1,klon 92 zmfd(i,j)=zmfd(i,j)+za(i,j,k)*(x(i,k)-x(i,j)) 93 END DO 94 END DO 95 END DO 96 ! 97 ! ========================================= 98 ! calcul des tendances liees aux flux satures 99 ! ========================================= 100 DO j=1,klev 101 DO i=1,klon 102 zmfa(i,j)=da(i,j)*(x(i,1)-x(i,j)) 103 END DO 104 END DO 105 DO k=1,klev 106 DO j=1,klev 107 DO i=1,klon 108 zmfp(i,j)=zmfp(i,j)+phi(i,j,k)*(x(i,k)-x(i,j)) 109 END DO 110 END DO 111 END DO 112 DO j=1,klev-1 113 DO i=1,klon 114 zmfu(i,j)=max(0.,upd(i,j+1)+dnd(i,j+1))*(x(i,j+1)-x(i,j)) 115 END DO 116 END DO 117 DO j=2,klev 118 DO i=1,klon 119 zmfu(i,j)=zmfu(i,j)+min(0.,upd(i,j)+dnd(i,j))*(x(i,j)-x(i,j-1)) 120 END DO 121 END DO 122 123 ! ========================================= 124 ! calcul final des tendances 125 ! ========================================= 126 DO k=1, klev 127 DO i=1, klon 128 dx(i,k)=(zmfd(i,k)+zmfu(i,k) & 129 +zmfa(i,k)+zmfp(i,k))*pdtime & 130 *RG/(paprs(i,k)-paprs(i,k+1)) 131 ! print*,'dx',k,dx(i,k) 132 ENDDO 133 ENDDO 134 135 ! test de conservation du traceur 136 ! conserv=0. 137 ! DO k=1, klev 138 ! DO i=1, klon 139 ! conserv=conserv+dx(i,k)* & 140 ! (paprs(i,k)-paprs(i,k+1))/RG 141 ! ENDDO 142 ! ENDDO 143 ! print *,'conserv',conserv 143 144 144 return 145 end 145 END SUBROUTINE cvltr -
LMDZ4/branches/LMDZ4-dev/libf/phylmd/ini_histrac.h
r1115 r1191 1 1 ! 2 ! $ Header$2 ! $Id $ 3 3 ! 4 IF (ecrit_tra>0. .AND. config_inca == 'none') THEN 5 c$OMP MASTER 6 CALL ymds2ju(annee_ref, 1, day_ref, 0.0, zjulian) 7 c 8 CALL histbeg_phy("histrac", itau_phy, zjulian, pdtphys, 9 . nhori, nid_tra) 10 CALL histvert(nid_tra, "presnivs", "Vertical levels", "mb", 11 . klev, presnivs, nvert) 4 #ifdef CPP_IOIPSL 12 5 6 IF (ecrit_tra>0. .AND. config_inca == 'none') THEN 7 !$OMP MASTER 8 CALL ymds2ju(annee_ref, 1, day_ref, 0.0, zjulian) 9 CALL histbeg_phy("histrac", itau_phy, zjulian, pdtphys,nhori, nid_tra) 10 CALL histvert(nid_tra, "presnivs", "Vertical levels", "mb",klev, presnivs, nvert) 13 11 12 zsto = pdtphys 13 zout = ecrit_tra 14 CALL histdef(nid_tra, "phis", "Surface geop. height", "-", & 15 iim,jj_nb,nhori, 1,1,1, -99, 32,"once", zsto,zout) 16 CALL histdef(nid_tra, "aire", "Grid area", "-", & 17 iim,jj_nb,nhori, 1,1,1, -99, 32,"once", zsto,zout) 14 18 15 zsto = pdtphys 16 zout = ecrit_tra 17 c 18 CALL histdef(nid_tra, "phis", "Surface geop. height", "-", 19 . iim,jj_nb,nhori, 1,1,1, -99, 32, 20 . "once", zsto,zout) 21 c 22 CALL histdef(nid_tra, "aire", "Grid area", "-", 23 . iim,jj_nb,nhori, 1,1,1, -99, 32, 24 . "once", zsto,zout) 25 DO it=1,nbtr 26 C champ 2D 27 iq=it+2 28 iiq=niadv(iq) 29 CALL histdef(nid_tra, tname(iiq), ttext(iiq), "U/kga", 30 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 31 . "ave(X)", zsto,zout) 32 if (lessivage) THEN 33 CALL histdef(nid_tra, "fl"//tname(iiq),"Flux "//ttext(iiq), 34 . "U/m2/s",iim,jj_nb,nhori, klev,1,klev,nvert, 32, 35 . "ave(X)", zsto,zout) 36 endif 19 !TRACEURS 20 !---------------- 21 DO it = 1,nbtr 22 iiq = niadv(it+2) 37 23 38 c---Ajout Olivia 39 CALL histdef(nid_tra, "d_tr_th_"//tname(iiq), 40 . "tendance thermique"// ttext(iiq), "?", 41 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 42 . "ave(X)", zsto,zout) 43 c 44 if(iflag_con.GE.2) then 45 CALL histdef(nid_tra, "d_tr_cv_"//tname(iiq), 46 . "tendance convection"// ttext(iiq), "?", 47 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 48 . "ave(X)", zsto,zout) 49 endif !(iflag_con.GE.2) then 50 CALL histdef(nid_tra, "d_tr_cl_"//tname(iiq), 51 . "tendance couche limite"// ttext(iiq), "?", 52 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 53 . "ave(X)", zsto,zout) 54 c---fin Olivia 24 ! CONCENTRATIONS 25 CALL histdef(nid_tra, tname(iiq), ttext(iiq), "U/kga", & 26 iim,jj_nb,nhori, klev,1,klev,nvert, 32,"ave(X)", zsto,zout) 55 27 56 ENDDO 28 ! TD LESSIVAGE 29 IF (lessivage .AND. aerosol(it)) THEN 30 CALL histdef(nid_tra, "fl"//tname(iiq),"Flux "//ttext(iiq), & 31 "U/m2/s",iim,jj_nb,nhori, klev,1,klev,nvert, 32, & 32 "ave(X)", zsto,zout) 33 END IF 57 34 58 CALL histdef(nid_tra, "pyu1", "Vent niv 1", "-", 59 . iim,jj_nb,nhori, 1,1,1, -99, 32, 60 . "inst(X)", zout,zout) 35 ! TD THERMIQUES 36 IF (iflag_thermals.gt.0) THEN 37 CALL histdef(nid_tra, "d_tr_th_"//tname(iiq), & 38 "tendance thermique"// ttext(iiq), "?", & 39 iim,jj_nb,nhori, klev,1,klev,nvert, 32, & 40 "ave(X)", zsto,zout) 41 ENDIF 61 42 62 CALL histdef(nid_tra, "pyv1", "Vent niv 1", "-", 63 . iim,jj_nb,nhori, 1,1,1, -99, 32, 64 . "inst(X)", zout,zout) 65 CALL histdef(nid_tra, "psrf1", "nature sol", "-", 66 . iim,jj_nb,nhori, 1,1,1, -99, 32, 67 . "inst(X)", zout,zout) 68 CALL histdef(nid_tra, "psrf2", "nature sol", "-", 69 . iim,jj_nb,nhori, 1,1,1, -99, 32, 70 . "inst(X)", zout,zout) 71 CALL histdef(nid_tra, "psrf3", "nature sol", "-", 72 . iim,jj_nb,nhori, 1,1,1, -99, 32, 73 . "inst(X)", zout,zout) 74 CALL histdef(nid_tra, "psrf4", "nature sol", "-", 75 . iim,jj_nb,nhori, 1,1,1, -99, 32, 76 . "inst(X)", zout,zout) 77 CALL histdef(nid_tra, "ftsol1", "temper sol", "-", 78 . iim,jj_nb,nhori, 1,1,1, -99, 32, 79 . "inst(X)", zout,zout) 80 CALL histdef(nid_tra, "ftsol2", "temper sol", "-", 81 . iim,jj_nb,nhori, 1,1,1, -99, 32, 82 . "inst(X)", zout,zout) 83 CALL histdef(nid_tra, "ftsol3", "temper sol", "-", 84 . iim,jj_nb,nhori, 1,1,1, -99, 32, 85 . "inst", zout,zout) 86 CALL histdef(nid_tra, "ftsol4", "temper sol", "-", 87 . iim,jj_nb,nhori, 1,1,1, -99, 32, 88 . "inst(X)", zout,zout) 89 CALL histdef(nid_tra, "pplay", "flux u mont","-", 90 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 91 . "inst(X)", zout,zout) 92 CALL histdef(nid_tra, "t", "flux u mont","-", 93 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 94 . "inst(X)", zout,zout) 95 CALL histdef(nid_tra, "mfu", "flux u mont","-", 96 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 97 . "ave(X)", zsto,zout) 98 CALL histdef(nid_tra, "mfd", "flux u decen","-", 99 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 100 . "ave(X)", zsto,zout) 101 CALL histdef(nid_tra, "en_u", "flux u mont","-", 102 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 103 . "ave(X)", zsto,zout) 104 CALL histdef(nid_tra, "en_d", "flux u mont","-", 105 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 106 . "ave(X)", zsto,zout) 107 CALL histdef(nid_tra, "de_d", "flux u mont","-", 108 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 109 . "ave(X)", zsto,zout) 110 CALL histdef(nid_tra, "de_u", "flux u decen","-", 111 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 112 . "ave(X)", zsto,zout) 113 CALL histdef(nid_tra, "coefh", "turbulent coef","-", 114 . iim,jj_nb,nhori, klev,1,klev,nvert, 32, 115 . "ave(X)", zsto,zout) 43 ! TD CONVECTION 44 IF (iflag_con.GE.2) THEN 45 CALL histdef(nid_tra, "d_tr_cv_"//tname(iiq), & 46 "tendance convection"// ttext(iiq), "?", & 47 iim,jj_nb,nhori, klev,1,klev,nvert, 32, & 48 "ave(X)", zsto,zout) 49 ENDIF 116 50 117 c 118 CALL histend(nid_tra) 119 ndex2d = 0 120 ndex3d = 0 121 ndex = 0 122 c$OMP END MASTER 123 END IF ! ecrit_tra>0. .AND. config_inca == 'none' 51 ! TD COUCHE-LIMITE 52 CALL histdef(nid_tra, "d_tr_cl_"//tname(iiq), & 53 "tendance couche limite"// ttext(iiq), "?", & 54 iim,jj_nb,nhori, klev,1,klev,nvert, 32, & 55 "ave(X)", zsto,zout) 56 ENDDO 57 !--------------- 58 ! 59 ! VENT (niveau 1) 60 CALL histdef(nid_tra, "pyu1", "Vent niv 1", "-", & 61 iim,jj_nb,nhori, 1,1,1, -99, 32, & 62 "inst(X)", zout,zout) 63 CALL histdef(nid_tra, "pyv1", "Vent niv 1", "-", & 64 iim,jj_nb,nhori, 1,1,1, -99, 32, & 65 "inst(X)", zout,zout) 66 67 ! TEMPERATURE DU SOL 68 CALL histdef(nid_tra, "ftsol1", "temper sol", "-", & 69 iim,jj_nb,nhori, 1,1,1, -99, 32, & 70 "inst(X)", zout,zout) 71 CALL histdef(nid_tra, "ftsol2", "temper sol", "-", & 72 iim,jj_nb,nhori, 1,1,1, -99, 32, & 73 "inst(X)", zout,zout) 74 CALL histdef(nid_tra, "ftsol3", "temper sol", "-", & 75 iim,jj_nb,nhori, 1,1,1, -99, 32, & 76 "inst", zout,zout) 77 CALL histdef(nid_tra, "ftsol4", "temper sol", "-", & 78 iim,jj_nb,nhori, 1,1,1, -99, 32, & 79 "inst(X)", zout,zout) 80 81 ! NATURE DU SOL 82 CALL histdef(nid_tra, "psrf1", "nature sol", "-", & 83 iim,jj_nb,nhori, 1,1,1, -99, 32, & 84 "inst(X)", zout,zout) 85 CALL histdef(nid_tra, "psrf2", "nature sol", "-", & 86 iim,jj_nb,nhori, 1,1,1, -99, 32, & 87 "inst(X)", zout,zout) 88 CALL histdef(nid_tra, "psrf3", "nature sol", "-", & 89 iim,jj_nb,nhori, 1,1,1, -99, 32, & 90 "inst(X)", zout,zout) 91 CALL histdef(nid_tra, "psrf4", "nature sol", "-", & 92 iim,jj_nb,nhori, 1,1,1, -99, 32, & 93 "inst(X)", zout,zout) 94 ! DIVERS 95 CALL histdef(nid_tra, "pplay", "flux u mont","-", & 96 iim,jj_nb,nhori, klev,1,klev,nvert, 32, & 97 "inst(X)", zout,zout) 98 CALL histdef(nid_tra, "t", "flux u mont","-", & 99 iim,jj_nb,nhori, klev,1,klev,nvert, 32, & 100 "inst(X)", zout,zout) 101 CALL histdef(nid_tra, "mfu", "flux u mont","-", & 102 iim,jj_nb,nhori, klev,1,klev,nvert, 32, & 103 "ave(X)", zsto,zout) 104 CALL histdef(nid_tra, "mfd", "flux u decen","-", & 105 iim,jj_nb,nhori, klev,1,klev,nvert, 32, & 106 "ave(X)", zsto,zout) 107 CALL histdef(nid_tra, "en_u", "flux u mont","-", & 108 iim,jj_nb,nhori, klev,1,klev,nvert, 32, & 109 "ave(X)", zsto,zout) 110 CALL histdef(nid_tra, "en_d", "flux u mont","-", & 111 iim,jj_nb,nhori, klev,1,klev,nvert, 32, & 112 "ave(X)", zsto,zout) 113 CALL histdef(nid_tra, "de_d", "flux u mont","-", & 114 iim,jj_nb,nhori, klev,1,klev,nvert, 32, & 115 "ave(X)", zsto,zout) 116 CALL histdef(nid_tra, "de_u", "flux u decen","-", & 117 iim,jj_nb,nhori, klev,1,klev,nvert, 32, & 118 "ave(X)", zsto,zout) 119 CALL histdef(nid_tra, "coefh", "turbulent coef","-", & 120 iim,jj_nb,nhori, klev,1,klev,nvert, 32, & 121 "ave(X)", zsto,zout) 122 123 CALL histend(nid_tra) 124 !$OMP END MASTER 125 END IF ! ecrit_tra>0. .AND. config_inca == 'none' 126 127 #endif 128 -
LMDZ4/branches/LMDZ4-dev/libf/phylmd/initrrnpb.F90
r1188 r1191 1 1 ! 2 ! $ Header$2 ! $Id $ 3 3 ! 4 SUBROUTINE initrrnpb(ftsol,pctsrf,masktr,fshtr,hsoltr,tautr 5 . ,vdeptr,scavtr) 6 USE dimphy 7 USE infotrac, ONLY : nbtr 8 IMPLICIT none 9 c====================================================================== 10 c Auteur(s): AA + CG (LGGE/CNRS) Date 24-06-94 11 c Objet: initialisation des constantes des traceurs 12 CAA Revison pour le controle avec la temperature du sol 13 cAA 14 CAA it = 1 radon ss controle de ts 15 cAA it = 2 plomb ss controle de ts 16 c====================================================================== 17 c Arguments: 18 c nbtr------input-I- nombre de vrais traceurs (sans l'eau) 19 c ftsol-------input-R- Temperature du sol (Kelvin) 20 c pctsrf-----input-R- Nature de sol (pourcentage de sol) 21 c masktr---output-R- Masque reservoir de sol traceur (1 = reservoir) 22 c fshtr----output-R- Flux surfacique de production dans le sol 23 c hsoltr---output-R- Epaisseur du reservoir de sol 24 c tautr----output-R- Constante de decroissance du traceur 25 c vdeptr---output-R- Vitesse de depot sec dans la couche Brownienne 26 c scavtr---output-R- Coefficient de lessivage 27 c====================================================================== 28 cym#include "dimensions.h" 29 cym#include "dimphy.h" 30 #include "indicesol.h" 31 c====================================================================== 32 C 33 INTEGER i, it 34 REAL pctsrf(klon,nbsrf) !Pourcentage de sol (f(nature du sol)) 35 REAL ftsol(klon,nbsrf) ! Temperature du sol pour le controle Rn 36 c ! le cas echeant 37 REAL masktr(klon,nbtr) ! Masque de l'echange avec la surface 38 c (possible => 1 ) 39 REAL fshtr(klon,nbtr) ! Flux surfacique dans le reservoir de sol 40 REAL hsoltr(nbtr) ! Epaisseur equivalente du reservoir de sol 41 REAL tautr(nbtr) ! Constante de decroissance radioactive 42 REAL vdeptr(nbtr) ! Vitesse de depot sec dans la couche Brownienne 43 REAL scavtr(nbtr) ! Coefficient de lessivage 44 REAL s 45 C 46 WRITE(*,'(''PASSAGE initrrnpb ...'',$)') 47 print*,'nbtr= ',nbtr 48 print*,'nbsrf= ',nbsrf 49 print*,'klon= ',klon 50 C 51 C Puis les initialisation specifiques a chaque traceur (pour le moment, Rn222) 52 C 53 C 54 C Radon it = 1 55 c 56 IF ( nbtr .LE. 0 ) STOP 'initrrnpb pas glop pas glop' 57 it = 1 58 s = 1.E4 ! Source: atome par m2 59 hsoltr(it) = 0.1 ! Hauteur equivalente du reservoir : 60 c 1 m * porosite 0.1 61 tautr(it) = 4.765E5 ! Decroissance du radon, secondes 62 cAA 63 c tautr(it) = 4.765E55 ! Decroissance du radon,infinie 64 cAA 65 vdeptr(it) = 0. ! Pas de depot sec pour le radon 66 scavtr(it) = 0. ! Pas de lessivage pour le radon 4 SUBROUTINE initrrnpb(ftsol,pctsrf,masktr,fshtr,hsoltr,tautr,vdeptr,scavtr) 5 USE dimphy 6 USE infotrac, ONLY : nbtr 7 IMPLICIT NONE 8 !====================================================================== 9 ! Auteur(s): AA + CG (LGGE/CNRS) Date 24-06-94 10 ! Objet: initialisation des constantes des traceurs 11 !AA Revison pour le controle avec la temperature du sol 12 !AA 13 !AA it = 1 radon ss controle de ts 14 !AA it = 2 plomb ss controle de ts 15 !====================================================================== 16 ! Arguments: 17 ! nbtr.............. nombre de vrais traceurs (sans l'eau) 18 ! ftsol....input-R- Temperature du sol (Kelvin) 19 ! pctsrf...input-R- Nature de sol (pourcentage de sol) 20 ! masktr...output-R- Masque reservoir de sol traceur (1 = reservoir) 21 ! fshtr....output-R- Flux surfacique de production dans le reservoir de sol 22 ! hsoltr...output-R- Epaisseur equivalente du reservoir de sol 23 ! tautr....output-R- Constante de decroissance radioactive du traceur 24 ! vdeptr...output-R- Vitesse de depot sec dans la couche Brownienne 25 ! scavtr...output-R- Coefficient de lessivage 26 !====================================================================== 27 INCLUDE "indicesol.h" 28 !====================================================================== 67 29 68 print*, '-------------- SOURCE DU RADON ------------------------ ' 69 print*,'it = ',it 70 print*,'Source : ', s 71 print*,'Hauteur equivalente du reservoir de sol: ',hsoltr(it) 72 print*,'Decroissance (s): ', tautr(it) 73 print*,'Vitesse de depot sec: ',vdeptr(it) 74 print*,'Facteur de lessivage: ',scavtr(it) 30 REAL,DIMENSION(klon,nbsrf),INTENT(IN) :: pctsrf 31 REAL,DIMENSION(klon,nbsrf),INTENT(IN) :: ftsol 32 REAL,DIMENSION(klon,nbtr),INTENT(OUT) :: masktr 33 REAL,DIMENSION(klon,nbtr),INTENT(OUT) :: fshtr 34 REAL,DIMENSION(nbtr),INTENT(OUT) :: hsoltr 35 REAL,DIMENSION(nbtr),INTENT(OUT) :: tautr 36 REAL,DIMENSION(nbtr),INTENT(OUT) :: vdeptr 37 REAL,DIMENSION(nbtr),INTENT(OUT) :: scavtr 38 INTEGER :: i, it 39 REAL :: s 75 40 76 DO i = 1,klon 77 masktr(i,it) = 0. 78 IF ( NINT(pctsrf(i,1)) .EQ. 1 ) masktr(i,it) = 1. 79 fshtr(i,it) = s * masktr(i,it) 41 WRITE(*,*)'PASSAGE initrrnpb ...' 42 ! 43 ! Radon it = 1 44 !---------------- 45 IF ( nbtr .LE. 0 ) STOP '**PHYTRAC:initrrnpb:** nbtr < 0; verifier RN dans traceur.def' 46 it = 1 47 s = 1.E4 ! Source: atome par m2 48 hsoltr(it) = 0.1 ! Hauteur equivalente du reservoir : 49 ! 1 m * porosite 0.1 50 tautr(it) = 4.765E5 ! Decroissance du radon, secondes 51 vdeptr(it) = 0. ! Pas de depot sec pour le radon 52 scavtr(it) = 0. ! Pas de lessivage pour le radon 53 54 WRITE(*,*)'-------------- SOURCE DU RADON ------------------------ ' 55 WRITE(*,*)'it = ',it 56 WRITE(*,*)'Source : ', s 57 WRITE(*,*)'Hauteur equivalente du reservoir de sol: ',hsoltr(it) 58 WRITE(*,*)'Decroissance (s): ', tautr(it) 59 WRITE(*,*)'Vitesse de depot sec: ',vdeptr(it) 60 WRITE(*,*)'Facteur de lessivage: ',scavtr(it) 80 61 81 cAA 82 cAA quelques tests 83 cAA POur l'instant le pctsrf(i,3) = 1.0 84 cAA lorsqu'il ya de la terre mias ne prend aucune autre valeur 85 cAA il n'est donc pas necessaire de multiplier fshtr par pctsrf 86 cAA 87 c print*, '------------------------------------------ ' 88 c print*, 'masktr(',i,it,')= ',masktr(i,it) 89 c print*, 'fshtr(',i,it,')= ',fshtr(i,it) 90 c print*, 'pctsrf(',i,',1)= ',pctsrf(i,1) 91 c print*, 'pctsrf(',i,',2)= ',pctsrf(i,2) 92 c print*, 'pctsrf(',i,',3)= ',pctsrf(i,3) 93 c print*, 'pctsrf(',i,',4)= ',pctsrf(i,4) 94 c print*, 's = ',s 95 c print*, '------------------------------------------ ' 62 DO i = 1,klon 63 masktr(i,it) = 0. 64 IF ( NINT(pctsrf(i,1)) .EQ. 1 ) masktr(i,it) = 1. 65 fshtr(i,it) = s * masktr(i,it) 66 END DO 67 ! 68 ! 210Pb it = 2 69 !---------------- 70 IF ( nbtr .LE. 1 ) STOP '**PHYTRAC**:initrrnpb:** nbtr <= 1; verifier PB dans traceur.def' 71 it = 2 72 s = 0. ! Pas de source 73 hsoltr(it) = 10. ! Hauteur equivalente du reservoir 74 ! a partir duquel le depot Brownien a lieu 75 tautr(it) = 1.028E9 ! Decroissance du Pb210, secondes 76 vdeptr(it) = 1.E-3 ! 1 mm/s pour le 210Pb 77 scavtr(it) = .5 ! Lessivage du Pb210 78 DO i = 1,klon 79 masktr(i,it) = 1. ! Le depot sec peut avoir lieu partout 80 fshtr(i,it) = s * masktr(i,it) 81 END DO 82 WRITE(*,*)'-------------- SOURCE DU PLOMB ------------------------ ' 83 WRITE(*,*)'it = ',it 84 WRITE(*,*)'Source : ', s 85 WRITE(*,*)'Hauteur equivalente du reservoir : ',hsoltr(it) 86 WRITE(*,*)'Decroissance (s): ', tautr(it) 87 WRITE(*,*)'Vitesse de depot sec: ',vdeptr(it) 88 WRITE(*,*)'Facteur de lessivage: ',scavtr(it) 96 89 97 END DO 98 C 99 C 210Pb it = 2 100 C 101 IF ( nbtr .LE. 1 ) STOP 'initrrnpb pas glop pas glop' 102 it = 2 103 s = 0. ! Pas de source !!! 104 hsoltr(it) = 10. ! Hauteur equivalente du reservoir 105 c a partir duquel le 106 c depot Brownien a lieu 107 tautr(it) = 1.028E9 ! Decroissance du Pb210, secondes 108 vdeptr(it) = 1.E-3 ! 1 mm/s pour le 210Pb 109 scavtr(it) = .5 ! Lessivage du Pb210 110 DO i = 1,klon 111 masktr(i,it) = 1. ! Le depot sec peut avoir lieu partout 112 fshtr(i,it) = s * masktr(i,it) 113 END DO 114 print*, '-------------- SOURCE DU PLOMB ------------------------ ' 115 print*,'it = ',it 116 print*,'Source : ', s 117 print*,'Hauteur equivalente du reservoir : ',hsoltr(it) 118 print*,'Decroissance (s): ', tautr(it) 119 print*,'Vitesse de depot sec: ',vdeptr(it) 120 print*,'Facteur de lessivage: ',scavtr(it) 121 c 122 WRITE(*,*) 'initialisation rnpb ok' 123 c 124 RETURN 125 END 90 WRITE(*,*) 'Initialisation RN et PB ok' 91 92 END SUBROUTINE initrrnpb -
LMDZ4/branches/LMDZ4-dev/libf/phylmd/minmaxqfi.F90
r1188 r1191 1 1 ! 2 ! $ Header$2 ! $Id$ 3 3 ! 4 5 6 IMPLICIT none4 SUBROUTINE minmaxqfi(zq,qmin,qmax,comment) 5 USE dimphy 6 IMPLICIT NONE 7 7 8 cym#include "dimensions.h" 9 cym#include "dimphy.h" 8 ! Entrees 9 REAL,DIMENSION(klon,klev), INTENT(IN) :: zq 10 REAL,INTENT(IN) :: qmin,qmax 11 CHARACTER(LEN=*),INTENT(IN) :: comment 10 12 11 CHARACTER*(*) comment 12 real qmin,qmax 13 real zq(klon,klev) 14 15 INTEGER jadrs(klon), jbad, k, i 16 17 DO k = 1, klev 18 jbad = 0 19 DO i = 1, klon 20 IF (zq(i,k).GT.qmax .OR. zq(i,k).LT.qmin) THEN 21 jbad = jbad + 1 22 jadrs(jbad) = i 23 ENDIF 24 ENDDO 25 IF (jbad.GT.0) THEN 26 PRINT*, comment 27 DO i = 1, jbad 28 PRINT*, "i,k,q=", jadrs(i),k,zq(jadrs(i),k) 29 ENDDO 30 ENDIF 31 ENDDO 32 33 return 34 end 13 ! Local 14 INTEGER,DIMENSION(klon) :: jadrs 15 INTEGER :: i, jbad, k 16 17 DO k = 1, klev 18 jbad = 0 19 DO i = 1, klon 20 IF (zq(i,k).GT.qmax .OR. zq(i,k).LT.qmin) THEN 21 jbad = jbad + 1 22 jadrs(jbad) = i 23 ENDIF 24 ENDDO 25 IF (jbad.GT.0) THEN 26 WRITE(*,*)comment 27 DO i = 1, jbad 28 WRITE(*,*) "i,k,q=", jadrs(i),k,zq(jadrs(i),k) 29 ENDDO 30 ENDIF 31 ENDDO 32 33 END SUBROUTINE minmaxqfi -
LMDZ4/branches/LMDZ4-dev/libf/phylmd/nflxtr.F90
r1188 r1191 1 1 ! 2 ! $ Header$2 ! $Id $ 3 3 ! 4 SUBROUTINE nflxtr(pdtime,pmfu,pmfd,pen_u,pde_u,pen_d,pde_d, 5 . pplay,paprs,x,dx) 6 USE dimphy 7 IMPLICIT NONE 8 c===================================================================== 9 c Objet : Melange convectif de traceurs a partir des flux de masse 10 c Date : 13/12/1996 -- 13/01/97 11 c Auteur: O. Boucher (LOA) sur inspiration de Z. X. Li (LMD), 12 c Brinkop et Sausen (1996) et Boucher et al. (1996). 13 c ATTENTION : meme si cette routine se veut la plus generale possible, 14 c elle a herite de certaines notations et conventions du 15 c schema de Tiedtke (1993). 16 c --En particulier, les couches sont numerotees de haut en bas !!! 17 c Ceci est valable pour les flux 18 c mais pas pour les entrees x, pplay, paprs !!!! 19 c --pmfu est positif, pmfd est negatif 20 c --Tous les flux d'entrainements et de detrainements sont positifs 21 c contrairement au schema de Tiedtke d'ou les changements de signe!!!! 22 c===================================================================== 23 c 24 cym#include "dimensions.h" 25 cym#include "dimphy.h" 26 #include "YOMCST.h" 27 #include "YOECUMF.h" 28 c 29 REAL pdtime 30 c--les flux sont definis au 1/2 niveaux 31 c--pmfu(klev+1) et pmfd(klev+1) sont implicitement nuls 32 REAL pmfu(klon,klev) ! flux de masse dans le panache montant 33 REAL pmfd(klon,klev) ! flux de masse dans le panache descendant 34 REAL pen_u(klon,klev) ! flux entraine dans le panache montant 35 REAL pde_u(klon,klev) ! flux detraine dans le panache montant 36 REAL pen_d(klon,klev) ! flux entraine dans le panache descendant 37 REAL pde_d(klon,klev) ! flux detraine dans le panache descendant 4 SUBROUTINE nflxtr(pdtime,pmfu,pmfd,pen_u,pde_u,pen_d,pde_d,pplay,paprs,x,dx) 5 USE dimphy 6 IMPLICIT NONE 7 !===================================================================== 8 ! Objet : Melange convectif de traceurs a partir des flux de masse 9 ! Date : 13/12/1996 -- 13/01/97 10 ! Auteur: O. Boucher (LOA) sur inspiration de Z. X. Li (LMD), 11 ! Brinkop et Sausen (1996) et Boucher et al. (1996). 12 ! ATTENTION : meme si cette routine se veut la plus generale possible, 13 ! elle a herite de certaines notations et conventions du 14 ! schema de Tiedtke (1993). 15 ! 1. En particulier, les couches sont numerotees de haut en bas !!! 16 ! Ceci est valable pour les flux 17 ! mais pas pour les entrees x, pplay, paprs !!!! 18 ! 2. pmfu est positif, pmfd est negatif 19 ! 3. Tous les flux d'entrainements et de detrainements sont positifs 20 ! contrairement au schema de Tiedtke d'ou les changements de signe!!!! 21 !===================================================================== 22 ! 23 include "YOMCST.h" 24 include "YOECUMF.h" 38 25 39 REAL pplay(klon,klev) ! pression aux couches (bas en haut) 40 REAL paprs(klon,klev+1) ! pression aux 1/2 couches (bas en haut) 41 REAL x(klon,klev) ! q de traceur (bas en haut) 42 REAL dx(klon,klev) ! tendance de traceur (bas en haut) 43 c 44 c--flux convectifs mais en variables locales 45 REAL zmfu(klon,klev+1) 46 REAL zmfd(klon,klev+1) 47 REAL zen_u(klon,klev) 48 REAL zde_u(klon,klev) 49 REAL zen_d(klon,klev) 50 REAL zde_d(klon,klev) 51 real zmfe 52 c 53 c--variables locales 54 c--les flux de x sont definis aux 1/2 niveaux 55 c--xu et xd sont definis aux niveaux complets 56 REAL xu(klon,klev) ! q de traceurs dans le panache montant 57 REAL xd(klon,klev) ! q de traceurs dans le panache descendant 58 REAL zmfux(klon,klev+1) ! flux de x dans le panache montant 59 REAL zmfdx(klon,klev+1) ! flux de x dans le panache descendant 60 REAL zmfex(klon,klev+1) ! flux de x dans l'environnement 61 INTEGER i, k 62 REAL zmfmin 63 PARAMETER (zmfmin=1.E-10) 26 REAL,INTENT(IN) :: pdtime ! pdtphys 27 ! 28 ! les flux sont definis au 1/2 niveaux 29 ! => pmfu(klev+1) et pmfd(klev+1) sont implicitement nuls 30 ! 31 REAL,DIMENSION(klon,klev),INTENT(IN) :: pmfu ! flux de masse dans le panache montant 32 REAL,DIMENSION(klon,klev),INTENT(IN) :: pmfd ! flux de masse dans le panache descendant 33 REAL,DIMENSION(klon,klev),INTENT(IN) :: pen_u ! flux entraine dans le panache montant 34 REAL,DIMENSION(klon,klev),INTENT(IN) :: pde_u ! flux detraine dans le panache montant 35 REAL,DIMENSION(klon,klev),INTENT(IN) :: pen_d ! flux entraine dans le panache descendant 36 REAL,DIMENSION(klon,klev),INTENT(IN) :: pde_d ! flux detraine dans le panache descendant 64 37 65 c ========================================= 66 c 67 c 68 c Extension des flux UP et DN sur klev+1 niveaux 69 c ========================================= 70 do k=1,klev 71 do i=1,klon 72 zmfu(i,k)=pmfu(i,k) 73 zmfd(i,k)=pmfd(i,k) 74 enddo 75 enddo 76 do i=1,klon 77 zmfu(i,klev+1)=0. 78 zmfd(i,klev+1)=0. 79 enddo 38 REAL,DIMENSION(klon,klev),INTENT(IN) :: pplay ! pression aux couches (bas en haut) 39 REAL,DIMENSION(klon,klev+1),INTENT(IN) :: paprs ! pression aux 1/2 couches (bas en haut) 40 REAL,DIMENSION(klon,klev),INTENT(IN) :: x ! q de traceur (bas en haut) 41 REAL,DIMENSION(klon,klev),INTENT(INOUT) :: dx ! tendance de traceur (bas en haut) 80 42 81 c--modif pour diagnostiquer les detrainements 82 c ========================================= 83 c on privilegie l'ajustement de l'entrainement dans l'ascendance. 43 ! flux convectifs mais en variables locales 44 REAL,DIMENSION(klon,klev+1) :: zmfu ! copie de pmfu avec klev+1 = 0 45 REAL,DIMENSION(klon,klev+1) :: zmfd ! copie de pmfd avec klev+1 = 0 46 REAL,DIMENSION(klon,klev) :: zen_u 47 REAL,DIMENSION(klon,klev) :: zde_u 48 REAL,DIMENSION(klon,klev) :: zen_d 49 REAL,DIMENSION(klon,klev) :: zde_d 50 REAL :: zmfe 84 51 85 do k=1, klev 86 do i=1, klon 87 zen_d(i,k)=pen_d(i,k) 88 zde_u(i,k)=pde_u(i,k) 89 zde_d(i,k) =-zmfd(i,k+1)+zmfd(i,k)+zen_d(i,k) 90 zen_u(i,k) = zmfu(i,k+1)-zmfu(i,k)+zde_u(i,k) 91 enddo 92 enddo 93 c 94 c--calcul des flux dans le panache montant 95 c ========================================= 96 c 97 c Dans la premiere couche, on prend q comme valeur de qu 98 c 99 do i=1, klon 100 zmfux(i,1)=0.0 101 enddo 102 c 103 c Autres couches 104 do k=1,klev 105 do i=1, klon 106 if ((zmfu(i,k+1)+zde_u(i,k)).lt.zmfmin) THEN 107 xu(i,k)=x(i,k) 108 else 109 xu(i,k)=(zmfux(i,k)+zen_u(i,k)*x(i,k)) 110 s /(zmfu(i,k+1)+zde_u(i,k)) 111 endif 112 zmfux(i,k+1)=zmfu(i,k+1)*xu(i,k) 113 enddo 114 enddo 115 c 116 c--calcul des flux dans le panache descendant 117 c ========================================= 118 c 119 do i=1, klon 120 zmfdx(i,klev+1)=0.0 121 enddo 122 c 123 do k=klev,1,-1 124 do i=1, klon 125 if ((zde_d(i,k)-zmfd(i,k)).lt.zmfmin) THEN 126 xd(i,k)=x(i,k) 127 else 128 xd(i,k)=(zmfdx(i,k+1)-zen_d(i,k)*x(i,k)) / 129 . (zmfd(i,k)-zde_d(i,k)) 130 endif 131 zmfdx(i,k)=zmfd(i,k)*xd(i,k) 132 enddo 133 enddo 134 c 135 c--introduction du flux de retour dans l'environnement 136 c ========================================= 137 c 138 do k=2, klev 139 do i=1, klon 140 zmfe=-zmfu(i,k)-zmfd(i,k) 141 if (zmfe.le.0.) then 142 zmfex(i,k)= zmfe*x(i,k) 143 else 144 zmfex(i,k)= zmfe*x(i,k-1) 145 endif 146 enddo 147 enddo 52 ! variables locales 53 ! les flux de x sont definis aux 1/2 niveaux 54 ! xu et xd sont definis aux niveaux complets 55 REAL,DIMENSION(klon,klev) :: xu ! q de traceurs dans le panache montant 56 REAL,DIMENSION(klon,klev) :: xd ! q de traceurs dans le panache descendant 57 REAL,DIMENSION(klon,klev+1) :: zmfux ! flux de x dans le panache montant 58 REAL,DIMENSION(klon,klev+1) :: zmfdx ! flux de x dans le panache descendant 59 REAL,DIMENSION(klon,klev+1) :: zmfex ! flux de x dans l'environnement 60 INTEGER :: i, k 61 REAL,PARAMETER :: zmfmin=1.E-10 148 62 149 do i=1, klon 150 zmfex(i,1)=0. 151 zmfex(i,klev+1)=0. 152 enddo 153 c 154 c--calcul final des tendances 155 c 156 do k=1, klev 157 do i=1, klon 158 dx(i,k)=RG/(paprs(i,k)-paprs(i,k+1))*pdtime* 159 . ( zmfux(i,k) - zmfux(i,k+1) + 160 . zmfdx(i,k) - zmfdx(i,k+1) + 161 . zmfex(i,k) - zmfex(i,k+1) ) 162 enddo 163 enddo 164 c 165 return 166 end 63 ! ============================================== 64 ! Extension des flux UP et DN sur klev+1 niveaux 65 ! ============================================== 66 DO k=1,klev 67 DO i=1,klon 68 zmfu(i,k)=pmfu(i,k) 69 zmfd(i,k)=pmfd(i,k) 70 ENDDO 71 ENDDO 72 DO i=1,klon 73 zmfu(i,klev+1)=0. 74 zmfd(i,klev+1)=0. 75 ENDDO 76 ! ========================================== 77 ! modif pour diagnostiquer les detrainements 78 ! ========================================== 79 ! on privilegie l'ajustement de l'entrainement dans l'ascendance. 80 81 DO k=1, klev 82 DO i=1, klon 83 zen_d(i,k)=pen_d(i,k) 84 zde_u(i,k)=pde_u(i,k) 85 zde_d(i,k) =-zmfd(i,k+1)+zmfd(i,k)+zen_d(i,k) 86 zen_u(i,k) = zmfu(i,k+1)-zmfu(i,k)+zde_u(i,k) 87 ENDDO 88 ENDDO 89 ! ========================================= 90 ! calcul des flux dans le panache montant 91 ! ========================================= 92 ! 93 ! Dans la premiere couche, on prend q comme valeur de qu 94 95 DO i=1, klon 96 zmfux(i,1)=0.0 97 ENDDO 98 99 ! Autres couches 100 DO k=1,klev 101 DO i=1, klon 102 IF ((zmfu(i,k+1)+zde_u(i,k)).lt.zmfmin) THEN 103 xu(i,k)=x(i,k) 104 ELSE 105 xu(i,k)=(zmfux(i,k)+zen_u(i,k)*x(i,k))/(zmfu(i,k+1)+zde_u(i,k)) 106 ENDIF 107 zmfux(i,k+1)=zmfu(i,k+1)*xu(i,k) 108 ENDDO 109 ENDDO 110 ! ========================================== 111 ! calcul des flux dans le panache descendant 112 ! ========================================== 113 114 DO i=1, klon 115 zmfdx(i,klev+1)=0.0 116 ENDDO 117 118 DO k=klev,1,-1 119 DO i=1, klon 120 IF ((zde_d(i,k)-zmfd(i,k)).lt.zmfmin) THEN 121 xd(i,k)=x(i,k) 122 ELSE 123 xd(i,k)=(zmfdx(i,k+1)-zen_d(i,k)*x(i,k))/(zmfd(i,k)-zde_d(i,k)) 124 ENDIF 125 zmfdx(i,k)=zmfd(i,k)*xd(i,k) 126 ENDDO 127 ENDDO 128 ! =================================================== 129 ! introduction du flux de retour dans l'environnement 130 ! =================================================== 131 132 DO k=2, klev 133 DO i=1, klon 134 zmfe=-zmfu(i,k)-zmfd(i,k) 135 IF (zmfe.le.0.) then 136 zmfex(i,k)= zmfe*x(i,k) 137 ELSE 138 zmfex(i,k)= zmfe*x(i,k-1) 139 ENDIF 140 ENDDO 141 ENDDO 142 143 DO i=1, klon 144 zmfex(i,1)=0. 145 zmfex(i,klev+1)=0. 146 ENDDO 147 ! ========================== 148 ! calcul final des tendances 149 ! ========================== 150 DO k=1, klev 151 DO i=1, klon 152 dx(i,k)=RG/(paprs(i,k)-paprs(i,k+1))*pdtime* & 153 ( zmfux(i,k) - zmfux(i,k+1) + & 154 zmfdx(i,k) - zmfdx(i,k+1) + & 155 zmfex(i,k) - zmfex(i,k+1) ) 156 ENDDO 157 ENDDO 158 159 END SUBROUTINE nflxtr -
LMDZ4/branches/LMDZ4-dev/libf/phylmd/phyetat0.F
r1054 r1191 19 19 USE iostart 20 20 USE write_field_phy 21 USE infotrac 22 USE traclmdz_mod, ONLY : traclmdz_from_restart 23 21 24 IMPLICIT none 22 25 c====================================================================== … … 48 51 REAL run_off_lic_0(klon) 49 52 REAL fractint(klon) 53 REAL trs(klon,nbtr) 50 54 51 55 CHARACTER*6 ocean_in … … 62 66 INTEGER length 63 67 PARAMETER (length=100) 68 INTEGER it, iiq 64 69 REAL tab_cntrl(length), tabcntr0(length) 65 70 CHARACTER*7 str7 … … 983 988 PRINT*,'(ecart-type) wake_fip:', xmin, xmax 984 989 c 990 c Read and send field trs to traclmdz 991 c 992 IF (type_trac == 'lmdz') THEN 993 DO it=1,nbtr 994 iiq=niadv(it+2) 995 CALL get_field("trs_"//tname(iiq),trs(:,it),found) 996 IF (.NOT. found) THEN 997 PRINT*, 998 $ "phyetat0: Le champ <trs_"//tname(iiq)//"> est absent" 999 PRINT*, "Depart legerement fausse. Mais je continue" 1000 trs(:,it) = 0. 1001 ENDIF 1002 xmin = 1.0E+20 1003 xmax = -1.0E+20 1004 xmin = MINval(trs(:,it)) 1005 xmax = MAXval(trs(:,it)) 1006 PRINT*,"(ecart-type) trs_"//tname(iiq)//" :", xmin, xmax 1007 1008 END DO 1009 1010 CALL traclmdz_from_restart(trs) 1011 END IF 1012 985 1013 986 1014 c on ferme le fichier … … 1005 1033 CALL fonte_neige_init(run_off_lic_0) 1006 1034 1035 1007 1036 RETURN 1008 1037 END -
LMDZ4/branches/LMDZ4-dev/libf/phylmd/phyredem.F
r1001 r1191 12 12 USE phys_state_var_mod 13 13 USE iostart 14 USE traclmdz_mod, ONLY : traclmdz_to_restart 15 USE infotrac 14 16 15 17 IMPLICIT none … … 42 44 REAL agesno(klon,nbsrf) 43 45 REAL run_off_lic_0(klon) 46 REAL trs(klon,nbtr) 44 47 c 45 48 INTEGER nid, nvarid, idim1, idim2, idim3 … … 52 55 CHARACTER (len=7) :: str7 53 56 CHARACTER (len=2) :: str2 54 57 INTEGER :: it, iiq 58 55 59 c====================================================================== 56 60 c … … 311 315 CALL put_field("WAKE_FIP","",wake_fip) 312 316 317 318 ! trs from traclmdz_mod 319 IF (type_trac == 'lmdz') THEN 320 CALL traclmdz_to_restart(trs) 321 DO it=1,nbtr 322 iiq=niadv(it+2) 323 CALL put_field("trs_"//tname(iiq),"",trs(:,it)) 324 END DO 325 END IF 326 313 327 CALL close_restartphy 314 328 !$OMP BARRIER -
LMDZ4/branches/LMDZ4-dev/libf/phylmd/physiq.F
r1188 r1191 111 111 PARAMETER (ok_stratus=.FALSE.) 112 112 c====================================================================== 113 LOGICAL, SAVE :: rnpb=.TRUE.114 c$OMP THREADPRIVATE(rnpb)115 113 REAL amn, amx 116 114 INTEGER igout … … 3133 3131 c==================================================================== 3134 3132 C 3135 IF (config_inca /= 'none') rnpb=.FALSE. 3136 3137 call phytrac ( rnpb, 3138 I itap, 3139 I julien, 3140 I gmtime, 3141 I debut, 3142 I lafin, 3143 I nlon, 3144 I klev, 3145 I dtime, 3146 I u, 3147 I v, 3148 I t, 3149 I paprs, 3150 I pplay, 3151 I pmfu, 3152 I pmfd, 3153 I pen_u, 3154 I pde_u, 3155 I pen_d, 3156 I pde_d, 3157 I cdragh, 3158 I coefh, 3159 I fm_therm, 3160 I entr_therm, 3161 I u1, 3162 I v1, 3163 I ftsol, 3164 I pctsrf, 3165 I rlat, 3166 I frac_impa, 3167 I frac_nucl, 3168 I rlon, 3169 I presnivs, 3170 I pphis, 3171 I pphi, 3172 I albsol1, 3173 I qx(1,1,1), 3174 I rhcl, 3175 I cldfra, 3176 I rneb, 3177 I diafra, 3178 I cldliq, 3179 I itop_con, 3180 I ibas_con, 3181 I pmflxr, 3182 I pmflxs, 3183 I prfl, 3184 I psfl, 3185 I da, 3186 I phi, 3187 I mp, 3188 I upwd, 3189 I dnwd, 3190 I aerosol_couple, 3191 I flxmass_w, 3192 I tau_aero, 3193 I piz_aero, 3194 I cg_aero, 3195 I ccm, 3196 I rfname, 3197 O tr_seri) 3133 3134 call phytrac ( 3135 I itap, julien, gmtime, debut, 3136 I lafin, dtime, u, v, t, 3137 I paprs, pplay, pmfu, pmfd, 3138 I pen_u, pde_u, pen_d, pde_d, 3139 I cdragh, coefh, fm_therm, entr_therm, 3140 I u1, v1, ftsol, pctsrf, 3141 I rlat, frac_impa, frac_nucl,rlon, 3142 I presnivs, pphis, pphi, albsol1, 3143 I qx(:,:,ivap),rhcl, cldfra, rneb, 3144 I diafra, cldliq, itop_con, ibas_con, 3145 I pmflxr, pmflxs, prfl, psfl, 3146 I da, phi, mp, upwd, 3147 I dnwd, aerosol_couple, flxmass_w, 3148 I tau_aero, piz_aero, cg_aero, ccm, 3149 I rfname, 3150 O tr_seri) 3198 3151 3199 3152 IF (offline) THEN -
LMDZ4/branches/LMDZ4-dev/libf/phylmd/phytrac.F90
r1188 r1191 1 ! 2 c 3 c 4 SUBROUTINE phytrac (rnpb, 5 I nstep, 6 I julien, 7 I gmtime, 8 I debutphy, 9 I lafin, 10 I nlon, 11 I nlev, 12 I pdtphys, 13 I u, 14 I v, 15 I t_seri, 16 I paprs, 17 I pplay, 18 I pmfu, 19 I pmfd, 20 I pen_u, 21 I pde_u, 22 I pen_d, 23 I pde_d, 24 I cdragh, 25 I coefh, 26 I fm_therm, 27 I entr_therm, 28 I yu1, 29 I yv1, 30 I ftsol, 31 I pctsrf, 32 I xlat, 33 I frac_impa, 34 I frac_nucl, 35 I xlon, 36 I presnivs, 37 I pphis, 38 I pphi, 39 I albsol, 40 I sh, 41 I rh, 42 I cldfra, 43 I rneb, 44 I diafra, 45 I cldliq, 46 I itop_con, 47 I ibas_con, 48 I pmflxr, 49 I pmflxs, 50 I prfl, 51 I psfl, 52 I da, 53 I phi, 54 I mp, 55 I upwd, 56 I dnwd, 57 I aerosol_couple, 58 I flxmass_w, 59 I tau_aero, 60 I piz_aero, 61 I cg_aero, 62 I ccm, 63 I rfname, 64 O tr_seri) 65 66 USE ioipsl 67 USE dimphy 68 USE infotrac 69 USE mod_grid_phy_lmdz 70 USE mod_phys_lmdz_para 71 USE comgeomphy 72 USE iophy 73 USE vampir 74 75 IMPLICIT none 76 c====================================================================== 77 c Auteur(s) FH 78 c Objet: Moniteur general des tendances traceurs 79 c 80 cAA Remarques en vrac: 81 cAA-------------------- 82 cAA 2/ Le choix du radon et du pb se fait juste avec un data 83 cAA (peu propre). Peut-etre pourrait-on prevoir dans l'avenir 84 cAA une variable "type de traceur" 85 c====================================================================== 86 #include "YOMCST.h" 87 #include "dimensions.h" 88 #include "indicesol.h" 89 #include "clesphys.h" 90 #include "temps.h" 91 #include "paramet.h" 92 #include "control.h" 93 #include "thermcell.h" 94 c====================================================================== 95 96 c Arguments: 97 c 98 c EN ENTREE: 99 c ========== 100 c 101 c divers: 102 c ------- 103 c 104 integer nlon ! nombre de points horizontaux 105 integer nlev ! nombre de couches verticales 106 integer nstep ! appel physique 107 integer julien !jour julien 108 integer itop_con(nlon) 109 integer ibas_con(nlon) 110 real gmtime 111 real pdtphys ! pas d'integration pour la physique (seconde) 112 real t_seri(nlon,nlev) ! temperature 113 real tr_seri(nlon,nlev,nbtr) ! traceur 114 real u(klon,klev) 115 real v(klon,klev) 116 real sh(nlon,nlev) ! humidite specifique 117 real rh(nlon,nlev) ! humidite relative 118 real cldliq(nlon,nlev) ! eau liquide nuageuse 119 real cldfra(nlon,nlev) ! fraction nuageuse (tous les nuages) 120 real diafra(nlon,nlev) ! fraction nuageuse (convection ou stratus artificiels) 121 real rneb(nlon,nlev) ! fraction nuageuse (grande echelle) 122 real albsol(nlon) ! albedo surface 123 real paprs(nlon,nlev+1) ! pression pour chaque inter-couche (en Pa) 124 real ps(nlon) ! pression surface 125 real pplay(nlon,nlev) ! pression pour le mileu de chaque couche (en Pa) 126 real pphi(nlon,klev) ! geopotentiel 127 real pphis(klon) 128 REAL presnivs(klev) 129 logical debutphy ! le flag de l'initialisation de la physique 130 logical lafin ! le flag de la fin de la physique 131 c Olivia 132 integer nsplit 133 REAL pmflxr(klon,klev+1), pmflxs(klon,klev+1) !--lessivage convection 134 REAL prfl(klon,klev+1), psfl(klon,klev+1) !--lessivage large-scale 135 LOGICAL aerosol_couple 136 137 REAL flxmass_w(klon,klev) 138 CHARACTER(len=8) :: solsym(nbtr) 139 integer la 140 REAL :: tau_aero(klon,klev,9,2) 141 REAL :: piz_aero(klon,klev,9,2) 142 REAL :: cg_aero(klon,klev,9,2) 143 character*4 :: rfname(9) 144 REAL :: ccm(klon,klev,2) 145 c 146 c convection: 147 c ----------- 148 c 149 REAL pmfu(nlon,nlev) ! flux de masse dans le panache montant 150 REAL pmfd(nlon,nlev) ! flux de masse dans le panache descendant 151 REAL pen_u(nlon,nlev) ! flux entraine dans le panache montant 152 153 c 154 c thermiques: 155 c ----------- 156 c 157 real fm_therm(klon,klev+1),entr_therm(klon,klev) 158 real fm_therm1(klon,klev) 159 c 160 REAL pde_u(nlon,nlev) ! flux detraine dans le panache montant 161 REAL pen_d(nlon,nlev) ! flux entraine dans le panache descendant 162 REAL pde_d(nlon,nlev) ! flux detraine dans le panache descendant 163 c KE 164 real da(nlon,nlev),phi(nlon,nlev,nlev),mp(nlon,nlev) 165 REAL upwd(nlon,nlev) ! saturated updraft mass flux 166 REAL dnwd(nlon,nlev) ! saturated downdraft mass flux 167 168 c 169 c Couche limite: 170 c -------------- 171 c 172 REAL cdragh(nlon,nlev)! coeff drag pour T et Q 173 REAL coefh(nlon,nlev) ! coeff melange CL 174 REAL yu1(nlon) ! vents au premier niveau 175 REAL yv1(nlon) ! vents au premier niveau 176 REAL xlat(nlon) ! latitudes pour chaque point 177 REAL xlon(nlon) ! longitudes pour chaque point 178 179 c 180 c Lessivage: 181 c ---------- 182 c 183 c pour le ON-LINE 184 c 185 REAL frac_impa(nlon,nlev) ! fraction d'aerosols impactes 186 REAL frac_nucl(nlon,nlev) ! fraction d'aerosols nuclees 187 c 188 cAA 189 cAA Arguments necessaires pour les sources et puits de traceur: 190 cAA ---------------- 191 cAA 192 real ftsol(nlon,nbsrf) ! Temperature du sol (surf)(Kelvin) 193 real pctsrf(nlon,nbsrf) ! Pourcentage de sol f(nature du sol) 194 c abder 195 real pftsol1(nlon),pftsol2(nlon),pftsol3(nlon),pftsol4(nlon) 196 real ppsrf1(nlon),ppsrf2(nlon),ppsrf3(nlon),ppsrf4(nlon) 197 c fin 198 cAA ---------------------------- 199 cAA VARIABLES LOCALES TRACEURS 200 cAA ---------------------------- 201 cAA 202 cAA Sources et puits des traceurs: 203 cAA ------------------------------ 204 cAA 205 cAA Pour l'instant seuls les cas du rn et du pb ont ete envisages. 206 207 REAL source(klon,nbtr) ! a voir lorsque le flux est prescrit 208 cAA 209 cAA Pour la source de radon et son reservoir de sol 210 cAA ................................................ 211 212 REAL,save,allocatable :: trs(:,:) ! Conc. radon ds le sol 213 c$OMP THREADPRIVATE(trs) 214 REAL :: trs_tmp(klon_glo) 215 216 REAL,save,allocatable :: masktr(:,:) ! Masque reservoir de sol traceur 217 c Masque de l'echange avec la surface 218 c (1 = reservoir) ou (possible => 1 ) 219 c$OMP THREADPRIVATE(masktr) 220 REAL,save,allocatable :: fshtr(:,:) ! Flux surfacique dans le reservoir de sol 221 c$OMP THREADPRIVATE(fshtr) 222 REAL,save,allocatable :: hsoltr(:) ! Epaisseur equivalente du reservoir de sol 223 c$OMP THREADPRIVATE(hsoltr) 224 REAL,save,allocatable :: tautr(:) ! Constante de decroissance radioactive 225 c$OMP THREADPRIVATE(tautr) 226 REAL,save,allocatable :: vdeptr(:) ! Vitesse de depot sec dans la couche Brownienne 227 c$OMP THREADPRIVATE(vdeptr) 228 REAL,save,allocatable :: scavtr(:) ! Coefficient de lessivage 229 c$OMP THREADPRIVATE(scavtr) 230 cAA 231 CHARACTER*2 itn 232 C maf ioipsl 233 CHARACTER*2 str2 234 INTEGER nhori, nvert 235 REAL zsto, zout, zjulian 236 INTEGER, SAVE :: nid_tra 237 c$OMP THREADPRIVATE(nid_tra) 238 INTEGER, SAVE :: nid_tra2,nid_tra3 239 c$OMP THREADPRIVATE(nid_tra2,nid_tra3) 240 INTEGER ndex(1) 241 INTEGER ndex2d(iim*(jjm+1)),ndex3d(iim*(jjm+1)*klev) 242 REAL zx_tmp_fi2d(klon) ! variable temporaire grille physique 243 REAL zx_tmp_fi3d(klon,klev) ! variable temporaire pour champs 3D 244 REAL zx_tmp_2d(iim,jjm+1), zx_tmp_3d(iim,jjm+1,klev) 245 REAL zx_lon(iim,jjm+1), zx_lat(iim,jjm+1) 246 c 247 integer itau_w ! pas de temps ecriture = nstep + itau_phy 248 c 249 logical ok_sync 250 parameter (ok_sync = .true.) 251 C 252 C nature du traceur 253 c 254 logical,save,allocatable :: aerosol(:) ! Nature du traceur 255 c ! aerosol(it) = true => aerosol 256 c ! aerosol(it) = false => gaz 257 c ! nat_trac(it) = 1. aerosol 258 logical,save,allocatable :: clsol(:) ! clsol(it) = true => CL sol calculee 259 logical,save,allocatable :: radio(:) ! radio(it)=true => decroisssance radioactive 260 c$OMP THREADPRIVATE(aerosol,clsol,radio) 261 C 262 c====================================================================== 263 c 264 c Declaration des procedures appelees 265 c 266 c--modif convection tiedtke 267 INTEGER i, k, it 268 INTEGER iq, iiq 269 REAL delp(klon,klev) 270 c--end modif 271 c 272 c Variables liees a l'ecriture de la bande histoire physique 273 c 274 c Variables locales pour effectuer les appels en serie 275 c---------------------------------------------------- 276 c 277 REAL d_tr(klon,klev), d_trs(klon) ! tendances de traceurs 278 REAL d_tr_cl(klon,klev,nbtr) ! tendance de traceurs couche limite 279 REAL d_tr_cv(klon,klev,nbtr) ! tendance de traceurs conv pour chq traceur 280 REAL d_tr_th(klon,klev,nbtr) ! la tendance des thermiques 281 REAL d_tr_dec(klon,klev,nbtr) ! la tendance de la decroissance 282 c ! radioactive du rn - > pb 283 REAL d_tr_lessi_impa(klon,klev,nbtr) ! la tendance du lessivage 284 c ! par impaction 285 REAL d_tr_lessi_nucl(klon,klev,nbtr) ! la tendance du lessivage 286 c ! par nucleation 287 REAL fluxrn(klon,klev) 288 REAL fluxpb(klon,klev) 289 REAL pbimpa(klon,klev) 290 REAL pbnucl(klon,klev) 291 REAL rn(klon,klev) 292 REAL pb(klon,klev) 293 REAL flestottr(klon,klev,nbtr) ! flux de lessivage 294 c ! dans chaque couche 295 real zmasse(klon,klev) 296 real ztra_th(klon,klev) 297 298 C 299 character*20 modname 300 character*80 abort_message 301 c 302 c Controles 303 c------------- 304 logical first,couchelimite,convection,lessivage,sorties, 305 s rnpb,inirnpb 306 save first,couchelimite,convection,lessivage, 307 s sorties,inirnpb 308 c$OMP THREADPRIVATE(first,couchelimite,convection,lessivage, 309 c$OMP+ sorties,inirnpb) 310 c data first,couchelimite,convection,lessivage,sorties 311 c s /.true.,.true.,.false.,.true.,.true./ 312 c Olivia 313 data first,couchelimite,convection,lessivage, 314 s sorties 315 s /.true.,.true.,.true.,.true.,.true./ 316 317 ! Variables needed for configuration with INCA 318 INTEGER :: lastgas 319 INTEGER :: ncsec 320 321 REAL, PARAMETER :: dry_mass = 28.966 322 REAL, POINTER :: hbuf(:) 323 REAL, ALLOCATABLE :: obuf(:) 324 REAL :: calday 325 REAL :: pdel(klon,klev) 326 c 327 c====================================================================== 328 329 modname='phytrac' 330 331 ps(:)=paprs(:,1) 332 333 if (debutphy) then 334 allocate( trs(klon,nbtr) ) 335 allocate( masktr(klon,nbtr)) 336 allocate( fshtr(klon,nbtr) ) 337 allocate( hsoltr(nbtr)) 338 allocate( tautr(nbtr)) 339 allocate( vdeptr(nbtr)) 340 allocate( scavtr(nbtr)) 341 allocate( aerosol(nbtr)) 342 allocate( clsol(nbtr)) 343 allocate( radio(nbtr)) 344 345 346 ! FH 2008/05/09 correction de la frequence d'ecriture des traceurs 347 ! ecrit_tra = FLOAT(NINT(86400./pdtphys *ecritphy)) 348 print*,'dans phytrac ',pdtphys,ecrit_tra 349 350 inirnpb=rnpb 351 PRINT*, 'La frequence de sortie traceurs est ', ecrit_tra 352 C 353 c============================================================= 354 c Initialisation des sorties 355 c============================================================= 356 357 #ifdef CPP_IOIPSL 358 #include "ini_histrac.h" 359 #endif 360 361 c====================================================================== 362 c Initialisation de certaines variables pour le Rn et le Pb 363 c====================================================================== 364 365 c Initialisation du traceur dans le sol (couche limite radonique) 366 c 367 c print*,'valeur de debut dans phytrac :',debutphy 368 trs(:,:) = 0. 369 c$OMP MASTER 370 if (is_mpi_root) then 371 trs_tmp(:)=0. 372 open (99,file='starttrac',status='old', 373 . err=999,form='formatted') 374 read(99,*) (trs_tmp(i),i=1,klon_glo) 375 999 close(99) 376 endif 377 c$OMP END MASTER 378 call Scatter(trs_tmp,trs(:,1)) 379 380 c print*, 'apres starttrac' 381 382 c Initialisation de la fraction d'aerosols lessivee 383 c 384 d_tr_lessi_impa(:,:,:) = 0. 385 d_tr_lessi_nucl(:,:,:) = 0. 386 c 387 c Initialisation de la nature des traceurs 388 c 389 DO it = 1, nbtr 390 aerosol(it) = .FALSE. ! Tous les traceurs sont des gaz par defaut 391 radio(it) = .FALSE. ! Par defaut pas de passage par radiornpb 392 clsol(it) = .FALSE. ! Par defaut couche limite avec flux prescrit 393 ENDDO 394 c 395 ENDIF ! fin debutphy 396 c Initialisation du traceur dans le sol (couche limite radonique) 397 if(inirnpb) THEN 398 c 399 radio(1)= .true. 400 radio(2)= .true. 401 clsol(1)= .true. 402 clsol(2)= .true. 403 aerosol(2) = .TRUE. ! le Pb est un aerosol 404 c 405 call initrrnpb (ftsol,pctsrf,masktr,fshtr,hsoltr,tautr 406 . ,vdeptr,scavtr) 407 inirnpb=.false. 408 endif 409 410 411 IF (config_inca == 'none') THEN 412 DO i=1,nlon 413 pftsol1(i) = ftsol(i,1) 414 pftsol2(i) = ftsol(i,2) 415 pftsol3(i) = ftsol(i,3) 416 pftsol4(i) = ftsol(i,4) 417 418 ppsrf1(i) = pctsrf(i,1) 419 ppsrf2(i) = pctsrf(i,2) 420 ppsrf3(i) = pctsrf(i,3) 421 ppsrf4(i) = pctsrf(i,4) 422 423 ENDDO 424 425 ELSE ! config_inca /=none 426 #ifdef INCA 427 call VTe(VTphysiq) 428 call VTb(VTinca) 429 430 !====================================================================== 431 ! Chimie 432 !====================================================================== 433 434 calday = FLOAT(julien) + gmtime 435 ncsec = NINT (86400.*gmtime) 436 437 DO k = 1, nlev 438 pdel(:,k) = paprs(:,k) - paprs (:,k+1) 1 !$Id $ 2 3 SUBROUTINE phytrac( & 4 nstep, julien, gmtime, debutphy, & 5 lafin, pdtphys, u, v, t_seri, & 6 paprs, pplay, pmfu, pmfd, & 7 pen_u, pde_u, pen_d, pde_d, & 8 cdragh, coefh, fm_therm, entr_therm,& 9 yu1, yv1, ftsol, pctsrf, & 10 xlat, frac_impa,frac_nucl,xlon, & 11 presnivs, pphis, pphi, albsol, & 12 sh, rh, cldfra, rneb, & 13 diafra, cldliq, itop_con, ibas_con, & 14 pmflxr, pmflxs, prfl, psfl, & 15 da, phi, mp, upwd, & 16 dnwd, aerosol_couple, flxmass_w, & 17 tau_aero, piz_aero, cg_aero, ccm, & 18 rfname, & 19 tr_seri) 20 ! 21 !====================================================================== 22 ! Auteur(s) FH 23 ! Objet: Moniteur general des tendances traceurs 24 !====================================================================== 25 26 USE ioipsl 27 USE dimphy 28 USE infotrac 29 USE mod_grid_phy_lmdz 30 USE mod_phys_lmdz_para 31 USE comgeomphy 32 USE iophy 33 USE traclmdz_mod 34 USE tracinca_mod 35 36 37 IMPLICIT NONE 38 39 INCLUDE "YOMCST.h" 40 INCLUDE "dimensions.h" 41 INCLUDE "indicesol.h" 42 INCLUDE "clesphys.h" 43 INCLUDE "temps.h" 44 INCLUDE "paramet.h" 45 INCLUDE "control.h" 46 INCLUDE "thermcell.h" 47 !========================================================================== 48 ! -- ARGUMENT DESCRIPTION -- 49 !========================================================================== 50 51 ! Input arguments 52 !---------------- 53 !Configuration grille,temps: 54 INTEGER,INTENT(IN) :: nstep ! Appel physique 55 INTEGER,INTENT(IN) :: julien ! Jour julien 56 REAL,INTENT(IN) :: gmtime 57 REAL,INTENT(IN) :: pdtphys ! Pas d'integration pour la physique (seconde) 58 LOGICAL,INTENT(IN) :: debutphy ! le flag de l'initialisation de la physique 59 LOGICAL,INTENT(IN) :: lafin ! le flag de la fin de la physique 60 61 REAL,DIMENSION(klon),INTENT(IN) :: xlat ! latitudes pour chaque point 62 REAL,DIMENSION(klon),INTENT(IN) :: xlon ! longitudes pour chaque point 63 ! 64 !Physique: 65 !-------- 66 REAL,DIMENSION(klon,klev),INTENT(IN) :: t_seri ! Temperature 67 REAL,DIMENSION(klon,klev),INTENT(IN) :: u ! 68 REAL,DIMENSION(klon,klev),INTENT(IN) :: v ! 69 REAL,DIMENSION(klon,klev),INTENT(IN) :: sh ! humidite specifique 70 REAL,DIMENSION(klon,klev),INTENT(IN) :: rh ! humidite relative 71 REAL,DIMENSION(klon,klev+1),INTENT(IN) :: paprs ! pression pour chaque inter-couche (en Pa) 72 REAL,DIMENSION(klon,klev),INTENT(IN) :: pplay ! pression pour le mileu de chaque couche (en Pa) 73 REAL,DIMENSION(klon,klev),INTENT(IN) :: pphi ! geopotentiel 74 REAL,DIMENSION(klon),INTENT(IN) :: pphis 75 REAL,DIMENSION(klev),INTENT(IN) :: presnivs 76 REAL,DIMENSION(klon,klev),INTENT(IN) :: cldliq ! eau liquide nuageuse 77 REAL,DIMENSION(klon,klev),INTENT(IN) :: cldfra ! fraction nuageuse (tous les nuages) 78 REAL,DIMENSION(klon,klev),INTENT(IN) :: diafra ! fraction nuageuse (convection ou stratus artificiels) 79 REAL,DIMENSION(klon,klev),INTENT(IN) :: rneb ! fraction nuageuse (grande echelle) 80 INTEGER,DIMENSION(klon),INTENT(IN) :: itop_con 81 INTEGER,DIMENSION(klon),INTENT(IN) :: ibas_con 82 REAL,DIMENSION(klon),INTENT(IN) :: albsol ! albedo surface 83 ! 84 !Convection: 85 !---------- 86 REAL,DIMENSION(klon,klev),INTENT(IN) :: pmfu ! flux de masse dans le panache montant 87 REAL,DIMENSION(klon,klev),INTENT(IN) :: pmfd ! flux de masse dans le panache descendant 88 REAL,DIMENSION(klon,klev),INTENT(IN) :: pen_u ! flux entraine dans le panache montant 89 REAL,DIMENSION(klon,klev),INTENT(IN) :: pde_u ! flux detraine dans le panache montant 90 REAL,DIMENSION(klon,klev),INTENT(IN) :: pen_d ! flux entraine dans le panache descendant 91 REAL,DIMENSION(klon,klev),INTENT(IN) :: pde_d ! flux detraine dans le panache descendant 92 93 !...Tiedke 94 REAL,DIMENSION(klon,klev+1),INTENT(IN) :: pmflxr, pmflxs ! Flux precipitant de pluie, neige aux interfaces [convection] 95 REAL,DIMENSION(klon,klev+1),INTENT(IN) :: prfl, psfl ! Flux precipitant de pluie, neige aux interfaces [large-scale] 96 97 LOGICAL,INTENT(IN) :: aerosol_couple 98 REAL,DIMENSION(klon,klev),INTENT(IN) :: flxmass_w 99 REAL,DIMENSION(klon,klev,9,2),INTENT(IN) :: tau_aero 100 REAL,DIMENSION(klon,klev,9,2),INTENT(IN) :: piz_aero 101 REAL,DIMENSION(klon,klev,9,2),INTENT(IN) :: cg_aero 102 CHARACTER(len=4),DIMENSION(9),INTENT(IN) :: rfname 103 REAL,DIMENSION(klon,klev,2),INTENT(IN) :: ccm 104 !... K.Emanuel 105 REAL,DIMENSION(klon,klev),INTENT(IN) :: da 106 REAL,DIMENSION(klon,klev,klev),INTENT(IN):: phi 107 REAL,DIMENSION(klon,klev),INTENT(IN) :: mp 108 REAL,DIMENSION(klon,klev),INTENT(IN) :: upwd ! saturated updraft mass flux 109 REAL,DIMENSION(klon,klev),INTENT(IN) :: dnwd ! saturated downdraft mass flux 110 ! 111 !Thermiques: 112 !---------- 113 REAL,DIMENSION(klon,klev+1),INTENT(IN) :: fm_therm 114 REAL,DIMENSION(klon,klev),INTENT(IN) :: entr_therm 115 ! 116 !Couche limite: 117 !-------------- 118 ! 119 REAL,DIMENSION(klon,klev),INTENT(IN) :: cdragh ! coeff drag pour T et Q 120 REAL,DIMENSION(klon,klev),INTENT(IN) :: coefh ! coeff melange CL (m**2/s) 121 REAL,DIMENSION(klon),INTENT(IN) :: yu1 ! vents au premier niveau 122 REAL,DIMENSION(klon),INTENT(IN) :: yv1 ! vents au premier niveau 123 ! 124 !Lessivage: 125 !---------- 126 ! 127 ! pour le ON-LINE 128 ! 129 REAL,DIMENSION(klon,klev),INTENT(IN) :: frac_impa ! fraction d'aerosols non impactes 130 REAL,DIMENSION(klon,klev),INTENT(IN) :: frac_nucl ! fraction d'aerosols non nuclees 131 132 ! Arguments necessaires pour les sources et puits de traceur: 133 REAL,DIMENSION(klon,nbsrf),INTENT(IN) :: ftsol ! Temperature du sol (surf)(Kelvin) 134 REAL,DIMENSION(klon,nbsrf),INTENT(IN) :: pctsrf ! Pourcentage de sol (nature du sol) 135 136 137 ! Output argument 138 !---------------- 139 REAL,DIMENSION(klon,klev,nbtr),INTENT(INOUT) :: tr_seri ! Concentration Traceur [U/KgA] 140 141 !======================================================================================= 142 ! -- LOCAL VARIABLES -- 143 !======================================================================================= 144 145 INTEGER :: i, k, it 146 INTEGER :: nsplit 147 148 !Sources et Reservoirs de traceurs (ex:Radon): 149 !-------------------------------------------- 150 ! 151 REAL,DIMENSION(:,:),ALLOCATABLE,SAVE :: source ! a voir lorsque le flux de surface est prescrit 152 !$OMP THREADPRIVATE(source) 153 154 ! 155 !Entrees/Sorties: (cf ini_histrac.h et write_histrac.h) 156 !--------------- 157 INTEGER :: iiq, ierr 158 INTEGER :: nhori, nvert 159 REAL :: zsto, zout, zjulian 160 INTEGER,SAVE :: nid_tra ! pointe vers le fichier histrac.nc 161 !$OMP THREADPRIVATE(nid_tra) 162 REAL,DIMENSION(klon) :: zx_tmp_fi2d ! variable temporaire grille physique 163 INTEGER :: itau_w ! pas de temps ecriture = nstep + itau_phy 164 LOGICAL,PARAMETER :: ok_sync=.TRUE. 165 166 ! 167 ! Nature du traceur 168 !------------------ 169 LOGICAL,DIMENSION(:),ALLOCATABLE,SAVE :: aerosol ! aerosol(it) = true => aerosol => lessivage 170 !$OMP THREADPRIVATE(aerosol) ! aerosol(it) = false => gaz 171 REAL,DIMENSION(klon,klev) :: delp ! epaisseur de couche (Pa) 172 ! 173 ! Tendances de traceurs (Td): 174 !------------------------ 175 ! 176 REAL,DIMENSION(klon,klev) :: d_tr ! Td dans l'atmosphere 177 REAL,DIMENSION(klon,klev,nbtr) :: d_tr_cl ! Td couche limite/traceur 178 REAL,DIMENSION(klon,klev,nbtr) :: d_tr_cv ! Td convection/traceur 179 REAL,DIMENSION(klon,klev,nbtr) :: d_tr_th ! Td thermique 180 REAL,DIMENSION(klon,klev,nbtr) :: d_tr_lessi_impa ! Td du lessivage par impaction 181 REAL,DIMENSION(klon,klev,nbtr) :: d_tr_lessi_nucl ! Td du lessivage par nucleation 182 ! 183 ! Physique 184 !---------- 185 REAL,DIMENSION(klon,klev,nbtr) :: flestottr ! flux de lessivage dans chaque couche 186 REAL,DIMENSION(klon,klev) :: zmasse ! densité atmosphérique Kg/m2 187 REAL,DIMENSION(klon,klev) :: ztra_th 188 189 !Controles: 190 !--------- 191 LOGICAL,SAVE :: couchelimite=.TRUE. 192 LOGICAL,SAVE :: convection=.TRUE. 193 LOGICAL,SAVE :: lessivage 194 !$OMP THREADPRIVATE(couchelimite,convection,lessivage) 195 196 CHARACTER(len=8),DIMENSION(nbtr) :: solsym 197 198 199 !###################################################################### 200 ! -- INITIALIZATION -- 201 !###################################################################### 202 IF (debutphy) THEN 203 WRITE(*,*) 'FIRST TIME IN PHYTRAC : pdtphys(sec) = ',pdtphys,'ecrit_tra (sec) = ',ecrit_tra 204 ALLOCATE( source(klon,nbtr), stat=ierr) 205 IF (ierr /= 0) CALL abort_gcm('phytrac', 'pb in allocation 1',1) 206 207 ALLOCATE( aerosol(nbtr), stat=ierr) 208 IF (ierr /= 0) CALL abort_gcm('phytrac', 'pb in allocation 2',1) 209 210 211 ! Initialize module for specific tracers 212 SELECT CASE(type_trac) 213 CASE('lmdz') 214 CALL traclmdz_init(pctsrf, ftsol, aerosol, lessivage) 215 CASE('inca') 216 source(:,:)=0. 217 CALL tracinca_init(aerosol,lessivage) 218 END SELECT 219 ! 220 ! Initialize diagnostic output 221 ! ---------------------------- 222 INCLUDE "ini_histrac.h" 223 224 END IF 225 !############################################ END INITIALIZATION ####### 226 227 !=============================================================================== 228 ! -- Do specific treatment according to chemestry model or local LMDZ tracers 229 ! 230 !=============================================================================== 231 SELECT CASE(type_trac) 232 CASE('lmdz') 233 ! -- Traitement des traceurs avec traclmdz 234 235 CALL traclmdz(& 236 pdtphys, t_seri, & 237 paprs, pplay, cdragh, coefh, & 238 yu1, yv1, ftsol, pctsrf, & 239 xlat, couchelimite, & 240 tr_seri, source, solsym, d_tr_cl) 241 242 CASE('inca') 243 ! -- CHIMIE INCA config_inca = aero or chem -- 244 245 CALL tracinca(& 246 nstep, julien, gmtime, lafin, & 247 pdtphys, t_seri, paprs, pplay, & 248 pmfu, ftsol, pctsrf, pphis, & 249 pphi, albsol, sh, rh, & 250 cldfra, rneb, diafra, cldliq, & 251 itop_con, ibas_con, pmflxr, pmflxs, & 252 prfl, psfl, aerosol_couple, flxmass_w, & 253 tau_aero, piz_aero, cg_aero, ccm, & 254 rfname, & 255 tr_seri, source, solsym) 256 END SELECT 257 258 !====================================================================== 259 ! -- Calcul de l'effet de la convection -- 260 !====================================================================== 261 IF (convection) THEN 262 DO it=1, nbtr 263 IF ( conv_flg(it) == 0 ) CYCLE 264 265 IF (iflag_con.LT.2) THEN 266 d_tr_cv(:,:,:)=0. 267 ELSE IF (iflag_con.EQ.2) THEN 268 !..Tiedke 269 CALL nflxtr(pdtphys, pmfu, pmfd, pen_u, pde_u, pen_d, pde_d, & 270 pplay, paprs, tr_seri(:,:,it), d_tr_cv(:,:,it)) 271 ELSE 272 !..K.Emanuel 273 CALL cvltr(pdtphys, da, phi, mp, paprs,pplay, tr_seri(:,:,it),& 274 upwd,dnwd,d_tr_cv(:,:,it)) 275 END IF 276 277 DO k = 1, klev 278 DO i = 1, klon 279 tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr_cv(i,k,it) 280 END DO 439 281 END DO 440 282 441 IF (config_inca == 'aero') THEN 442 CALL aerosolmain (aerosol_couple, 443 $ tr_seri, 444 $ pdtphys, 445 $ pplay, 446 $ pdel, 447 $ prfl, 448 $ pmflxr, 449 $ psfl, 450 $ pmflxs, 451 $ pmfu, 452 $ itop_con, 453 $ ibas_con, 454 $ pphi, 455 $ airephy, ! paire, 456 $ nstep, 457 $ rneb, ! for chimiaq 458 $ t_seri, ! for chimiaq 459 $ rh, 460 $ tau_aero, 461 $ piz_aero, 462 $ cg_aero, 463 $ rfname, 464 $ ccm, 465 $ lafin) 283 CALL minmaxqfi(tr_seri(:,:,it),0.,1.e33,'convection it = '//solsym(it)) 284 285 END DO ! nbtr 286 END IF ! convection 287 288 !====================================================================== 289 ! -- Calcul de l'effet des thermiques -- 290 !====================================================================== 291 292 DO k=1,klev 293 DO i=1,klon 294 zmasse(i,k)=(paprs(i,k)-paprs(i,k+1))/rg 295 END DO 296 END DO 297 298 DO it=1,nbtr 299 DO k=1,klev 300 DO i=1,klon 301 d_tr_th(i,k,it)=0. 302 tr_seri(i,k,it)=MAX(tr_seri(i,k,it),0.) 303 tr_seri(i,k,it)=MIN(tr_seri(i,k,it),1.e10) 304 END DO 305 END DO 306 END DO 307 308 IF (iflag_thermals.GT.0) THEN 309 nsplit=10 310 DO it=1, nbtr 311 DO isplit=1,nsplit 312 313 CALL dqthermcell(klon,klev,pdtphys/nsplit, & 314 fm_therm,entr_therm,zmasse, & 315 tr_seri(1:klon,1:klev,it),d_tr,ztra_th) 316 317 DO k=1,klev 318 DO i=1,klon 319 d_tr(i,k)=pdtphys*d_tr(i,k)/nsplit 320 d_tr_th(i,k,it)=d_tr_th(i,k,it)+d_tr(i,k) 321 tr_seri(i,k,it)=MAX(tr_seri(i,k,it)+d_tr(i,k),0.) 322 END DO 323 END DO 324 END DO ! nsplit 325 END DO ! it 326 END IF ! Thermiques 327 328 !====================================================================== 329 ! -- Calcul de l'effet de la couche limite -- 330 !====================================================================== 331 332 IF (couchelimite) THEN 333 334 DO k = 1, klev 335 DO i = 1, klon 336 delp(i,k) = paprs(i,k)-paprs(i,k+1) 337 END DO 338 END DO 339 340 DO it=1, nbtr 341 342 IF( pbl_flg(it) /= 0 ) THEN 343 344 CALL cltrac(pdtphys, coefh,t_seri, & 345 tr_seri(:,:,it), source(:,it), & 346 paprs, pplay, delp, & 347 d_tr_cl(:,:,it)) 348 349 DO k = 1, klev 350 DO i = 1, klon 351 tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr_cl(i,k,it) 352 END DO 353 END DO 466 354 END IF 467 355 468 CALL chemmain (tr_seri, !mmr 469 $ nstep, !nstep 470 $ calday, !calday 471 $ julien, !ncdate 472 $ ncsec, !ncsec 473 $ 1, !lat 474 $ pdtphys, !delt 475 $ paprs(1,1), !ps 476 $ pplay, !pmid 477 $ pdel, !pdel 478 $ airephy, 479 $ pctsrf(1,1),!oro 480 $ ftsol, !tsurf 481 $ albsol, !albs 482 $ pphi, !zma 483 $ pphis, !phis 484 $ cldfra, !cldfr 485 $ rneb, !cldfr_st 486 $ diafra, !cldfr_cv 487 $ itop_con, !cldtop 488 $ ibas_con, !cldbot 489 $ cldliq, !cwat 490 $ prfl, !flxrst 491 $ pmflxr, !flxrcv 492 $ psfl, !flxsst 493 $ pmflxs, !flxscv 494 $ pmfu, !flxupd 495 $ flxmass_w, !flxmass_w 496 $ t_seri, !tfld 497 $ sh, !sh 498 $ rh, !rh 499 $ iip1, !nx 500 $ jjp1, !ny 501 $ source, 502 $ solsym) 503 504 505 call VTe(VTinca) 506 call VTb(VTphysiq) 507 #endif 508 END IF ! config_inca 509 c====================================================================== 510 c Calcul de l'effet de la convection 511 c====================================================================== 512 c print*,'Avant convection' 513 do it=1,nbtr 514 WRITE(itn,'(i2)') it 515 c call diagtracphy(tr_seri(:,:,it),paprs,'Avant conv'//itn) 516 enddo 517 518 if (convection) then 519 520 c print*,'Pas de temps dans phytrac : ',pdtphys 521 DO it=1, nbtr 522 523 IF ( config_inca/='none') THEN 524 IF ( conv_flg(it) == 0 ) CYCLE 525 END IF 526 527 if (iflag_con.lt.2) then 528 d_tr_cv=0. 529 else if (iflag_con.eq.2) then 530 c tiedke 531 CALL nflxtr(pdtphys, pmfu, pmfd, pen_u, pde_u, pen_d, pde_d, 532 . pplay, paprs, tr_seri(1,1,it), d_tr_cv(1,1,it)) 533 else 534 c KE 535 call cvltr(pdtphys, da, phi, mp, paprs,pplay, tr_seri(1,1,it), 536 . upwd,dnwd,d_tr_cv(1,1,it)) 537 endif 538 539 DO k = 1, nlev 540 DO i = 1, klon 541 tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr_cv(i,k,it) 542 ENDDO 543 ENDDO 544 545 IF (config_inca == 'none') THEN 546 CALL minmaxqfi(tr_seri(1,1,it),0.,1.e33,'convection it = '//itn) 547 ELSE 548 CALL minmaxqfi(tr_seri(1,1,it),0.,1.e33,'convection it = ' 549 . //solsym(it)) 550 END IF 551 552 ENDDO 553 554 endif ! convection 555 c print*,'Apres convection' 556 c do it=1,nbtr 557 c WRITE(itn,'(i1)') it 558 c call diagtracphy(tr_seri(:,:,it),paprs,'Avant conv'//itn) 559 c enddo 560 561 562 c====================================================================== 563 c Calcul de l'effet des thermiques 564 c====================================================================== 565 566 do k=1,klev 567 do i=1,klon 568 zmasse(i,k)=(paprs(i,k)-paprs(i,k+1))/rg 569 enddo 570 enddo 571 572 c print*,'masse dans ph ',zmasse 573 do it=1,nbtr 574 do k=1,klev 575 do i=1,klon 576 d_tr_th(i,k,it)=0. 577 tr_seri(i,k,it)=max(tr_seri(i,k,it),0.) 578 tr_seri(i,k,it)=min(tr_seri(i,k,it),1.e10) 579 enddo 580 enddo 581 enddo 582 583 if (iflag_thermals.gt.0) then 584 c print*,'calcul de leffet des thermiques' 585 nsplit=10 586 DO it=1, nbtr 587 c WRITE(itn,'(i1)') it 588 c CALL minmaxqfi(tr_seri(1,1,it),1.e10,-1.e33,'conv it='//itn) 589 c print*,'avant dqthermiquesretro' 590 c call dump2d(iim,jjm-1,tr_seri(2,1,1),'TR_SERI ') 591 592 do isplit=1,nsplit 593 c Abderr 25 11 02 594 C Thermiques 595 c print*,'Avant dans phytrac' 596 call dqthermcell(klon,klev,pdtphys/nsplit 597 . ,fm_therm,entr_therm,zmasse 598 . ,tr_seri(1:klon,1:klev,it),d_tr,ztra_th) 599 600 do k=1,klev 601 do i=1,klon 602 d_tr(i,k)=pdtphys*d_tr(i,k)/nsplit 603 d_tr_th(i,k,it)=d_tr_th(i,k,it)+d_tr(i,k) 604 tr_seri(i,k,it)=max(tr_seri(i,k,it)+d_tr(i,k),0.) 605 enddo 606 enddo 607 enddo ! nsplit 608 c print*,'apres thermiques' 609 c call dump2d(iim,jjm-1,d_tr_th(1,1,1),'d_tr_th ') 610 c do k=1,klev 611 c print*,'d_tr_th(',k,')=',tr_seri(280,k,1) 612 c enddo 613 614 c WRITE(itn,'(i1)') it 615 c CALL minmaxqfi(tr_seri(1,1,it),1.e10,-1.e33,'therm it='//itn) 616 ENDDO ! it 617 endif ! Thermiques 618 c print*,'ATTENTION: sdans thermniques' 619 620 c====================================================================== 621 c Calcul de l'effet de la couche limite 622 c====================================================================== 623 c print *,'Avant couchelimite' 624 c do it=1,nbtr 625 c WRITE(itn,'(i1)') it 626 c call diagtracphy(tr_seri(:,:,it),paprs,'Avant CL '//itn) 627 c enddo 628 629 if (couchelimite) then 630 631 DO k = 1, nlev 632 DO i = 1, klon 633 delp(i,k) = paprs(i,k)-paprs(i,k+1) 634 ENDDO 635 ENDDO 636 637 C maf modif pour tenir compte du cas rnpb + traceur 638 DO it=1, nbtr 639 640 IF ( config_inca/='none' ) THEN 641 IF( pbl_flg(it) == 0 ) CYCLE 642 END IF 643 644 c print *,'it',it,clsol(it) 645 if (clsol(it)) then ! couche limite avec quantite dans le sol calculee 646 CALL cltracrn(it, pdtphys, yu1, yv1, 647 e cdragh, coefh,t_seri,ftsol,pctsrf, 648 e tr_seri(1,1,it),trs(1,it), 649 e paprs, pplay, delp, 650 e masktr(1,it),fshtr(1,it),hsoltr(it), 651 e tautr(it),vdeptr(it), 652 e xlat, 653 s d_tr_cl(1,1,it),d_trs) 654 DO k = 1, nlev 655 DO i = 1, klon 656 tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr_cl(i,k,it) 657 ENDDO 658 ENDDO 659 c 660 c Traceur ds sol 661 c 662 DO i = 1, klon 663 trs(i,it) = trs(i,it) + d_trs(i) 664 END DO 665 C 666 C maf provisoire suppression des prints 667 C WRITE(itn,'(i1)') it 668 C CALL minmaxqfi(tr_seri(1,1,it),0.,1.e33,'cltracrn it='//itn) 669 else ! couche limite avec flux prescrit 670 671 IF (config_inca == 'none') THEN 672 Cmaf provisoire source / traceur a creer 673 DO i=1, klon 674 source(i,it) = 0.0 ! pas de source, pour l'instant 675 ENDDO 676 END IF 677 678 CALL cltrac(pdtphys, coefh,t_seri, 679 s tr_seri(1,1,it), source(:,it), 680 e paprs, pplay, delp, 681 s d_tr_cl(1,1,it)) 682 DO k = 1, nlev 683 DO i = 1, klon 684 tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr_cl(i,k,it) 685 ENDDO 686 ENDDO 687 Cmaf WRITE(itn,'(i1)') it 688 cmaf CALL minmaxqfi(tr_seri(1,1,it),0.,1.e33,'cltracn it='//itn) 689 endif 690 ENDDO 691 c 692 endif ! couche limite 693 694 c print*,'Apres couchelimite' 695 c do it=1,nbtr 696 c WRITE(itn,'(i1)') it 697 c call diagtracphy(tr_seri(:,:,it),paprs,'Avant CL '//itn) 698 c enddo 699 700 c====================================================================== 701 c Calcul de l'effet du puits radioactif 702 c====================================================================== 703 704 C MAF il faudrait faire une modification pour passer dans radiornpb 705 c si radio=true mais pour l'instant radiornpb propre au cas rnpb 706 if(rnpb) then 707 c print *, 'decroissance radiactive activee' 708 call radiornpb (tr_seri,pdtphys,tautr,d_tr_dec) 709 C 710 DO it=1,nbtr 711 if(radio(it)) then 712 DO k = 1, nlev 713 DO i = 1, klon 714 tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr_dec(i,k,it) 715 ENDDO 716 ENDDO 717 WRITE(itn,'(i1)') it 718 CALL minmaxqfi(tr_seri(1,1,it),0.,1.e33,'puits rn it='//itn) 719 endif 720 ENDDO 721 c 722 endif ! rnpb decroissance radioactive 723 C 724 c====================================================================== 725 c Calcul de l'effet de la precipitation 726 c====================================================================== 727 728 c print*,'LESSIVAGE =',lessivage 729 IF (lessivage) THEN 730 731 c print*,'avant lessivage' 732 733 d_tr_lessi_nucl(:,:,:) = 0. 734 d_tr_lessi_impa(:,:,:) = 0. 735 flestottr(:,:,:) = 0. 736 c 737 c tendance des aerosols nuclees et impactes 738 c 739 DO it = 1, nbtr 740 IF (aerosol(it)) THEN 741 DO k = 1, nlev 356 END DO 357 358 END IF ! couche limite 359 360 361 !====================================================================== 362 ! Calcul de l'effet de la precipitation 363 !====================================================================== 364 365 IF (lessivage) THEN 366 367 d_tr_lessi_nucl(:,:,:) = 0. 368 d_tr_lessi_impa(:,:,:) = 0. 369 flestottr(:,:,:) = 0. 370 !========================= 371 ! LESSIVAGE LARGE SCALE : 372 !========================= 373 374 ! Tendance des aerosols nuclees et impactes 375 ! ----------------------------------------- 376 DO it = 1, nbtr 377 IF (aerosol(it)) THEN 378 DO k = 1, klev 742 379 DO i = 1, klon 743 d_tr_lessi_nucl(i,k,it) = d_tr_lessi_nucl(i,k,it) + 744 s ( 1 - frac_nucl(i,k) )*tr_seri(i,k,it) 745 d_tr_lessi_impa(i,k,it) = d_tr_lessi_impa(i,k,it) + 746 s ( 1 - frac_impa(i,k) )*tr_seri(i,k,it) 747 ENDDO 748 ENDDO 749 ENDIF 750 ENDDO 751 c 752 c Mises a jour des traceurs + calcul des flux de lessivage 753 c Mise a jour due a l'impaction et a la nucleation 754 c 755 c call dump2d(iim,jjm-1,frac_impa(2:klon-1,10),'FRACIMPA') 756 c call dump2d(iim,jjm-1,frac_nucl(2:klon-1,10),'FRACNUCL') 757 c call dump2d(iim,jjm-1,tr_seri(2:klon-1,10,3),'TRACEUR3') 758 DO it = 1, nbtr 759 c print*,'IT=',it,aerosol(it) 760 IF (aerosol(it)) THEN 761 c print*,'IT=',it,' On lessive' 762 DO k = 1, nlev 763 DO i = 1, klon 764 tr_seri(i,k,it)=tr_seri(i,k,it) 765 s *frac_impa(i,k)*frac_nucl(i,k) 766 ENDDO 767 ENDDO 768 ENDIF 769 ENDDO 770 c call dump2d(iim,jjm-1,tr_seri(2:klon-1,10,3),'TRACEUR3B') 771 c 772 c Flux lessivage total 773 c 774 DO it = 1, nbtr 775 DO k = 1, nlev 776 DO i = 1, klon 777 flestottr(i,k,it) = flestottr(i,k,it) - 778 s ( d_tr_lessi_nucl(i,k,it) + 779 s d_tr_lessi_impa(i,k,it) ) * 780 s ( paprs(i,k)-paprs(i,k+1) ) / 781 s (RG * pdtphys) 782 ENDDO 783 ENDDO 784 c 785 Cmaf WRITE(itn,'(i1)') it 786 Cmaf CALL minmaxqfi(tr_seri(1,1,it),0.,1.e33,'tr(lessi) it='//itn) 787 ENDDO 788 c 789 c print*,'apres lessivage' 790 ENDIF 791 Cc 792 DO k = 1, nlev 793 DO i = 1, klon 794 fluxrn(i,k) = flestottr(i,k,1) 795 fluxpb(i,k) = flestottr(i,k,2) 796 rn(i,k) = tr_seri(i,k,1) 797 pb(i,k) = tr_seri(i,k,2) 798 pbnucl(i,k)=d_tr_lessi_nucl(i,k,2) 799 pbimpa(i,k)=d_tr_lessi_impa(i,k,2) 800 ENDDO 801 ENDDO 802 803 c============================================================= 804 c Ecriture des sorties 805 c============================================================= 806 807 #ifdef CPP_IOIPSL 808 #include "write_histrac.h" 809 #endif 810 811 c============================================================= 812 813 if (lafin) then 814 print*, 'c est la fin de la physique' 815 call Gather(trs(:,1),trs_tmp) 816 c$OMP MASTER 817 if (is_mpi_root) then 818 819 open (99,file='restarttrac', form='formatted') 820 do i=1,klon_glo 821 write(99,*) trs_tmp(i) 822 enddo 823 PRINT*, 'Ecriture du fichier restarttrac' 824 close(99) 825 endif 826 c$OMP END MASTER 827 else 828 c print*, 'physique pas fini' 829 endif 830 831 832 RETURN 833 END 380 d_tr_lessi_nucl(i,k,it) = d_tr_lessi_nucl(i,k,it) + & 381 ( 1 - frac_nucl(i,k) )*tr_seri(i,k,it) 382 d_tr_lessi_impa(i,k,it) = d_tr_lessi_impa(i,k,it) + & 383 ( 1 - frac_impa(i,k) )*tr_seri(i,k,it) 384 385 ! 386 ! Flux lessivage total 387 ! ------------------------------------------------------------ 388 flestottr(i,k,it) = flestottr(i,k,it) - & 389 ( d_tr_lessi_nucl(i,k,it) + & 390 d_tr_lessi_impa(i,k,it) ) * & 391 ( paprs(i,k)-paprs(i,k+1) ) / & 392 (RG * pdtphys) 393 ! 394 ! Mise a jour des traceurs due a l'impaction,nucleation 395 ! ---------------------------------------------------------------------- 396 tr_seri(i,k,it)=tr_seri(i,k,it)*frac_impa(i,k)*frac_nucl(i,k) 397 END DO 398 END DO 399 END IF 400 END DO 401 402 END IF ! lessivage 403 404 !============================================================= 405 ! Ecriture des sorties 406 !============================================================= 407 INCLUDE "write_histrac.h" 408 409 410 END SUBROUTINE phytrac -
LMDZ4/branches/LMDZ4-dev/libf/phylmd/radio_decay.F90
r1188 r1191 1 1 ! 2 ! $ Header$2 ! $Id $ 3 3 ! 4 SUBROUTINE radiornpb(tr,dtime,tautr,d_tr) 5 USE dimphy 6 USE infotrac, ONLY : nbtr 7 IMPLICIT none 8 c====================================================================== 9 c Auteur(s): AA + CG (LGGE/CNRS) Date 24-06-94 10 c Objet: Decroissance radioactive d'un traceur dans l'atmosphere 11 CG240694 : Pour un traceur, le radon 12 CG161294 : Plus un 2eme traceur, le 210Pb. Le radon decroit en plomb. 13 c====================================================================== 14 c Arguments: 15 c====================================================================== 16 cym#include "dimensions.h" 17 cym#include "dimphy.h" 18 c====================================================================== 19 C 20 INTEGER i , k , it 21 REAL tr(klon,klev,nbtr) , d_tr(klon,klev,nbtr) 22 REAL dtime 23 REAL tautr(nbtr) 24 C 25 c WRITE(*,'(''PASSAGE radiornpb ... '',$)') 26 C Attention, pour un pas de temps beaucoup plus petit que la decroissance!!! 4 SUBROUTINE radio_decay(radio,rnpb,dtime,tautr,tr,d_tr) 5 ! 6 ! Caluclate radioactive decay for all tracers with radio(it)=true 7 ! 8 USE dimphy 9 USE infotrac, ONLY : nbtr 10 IMPLICIT NONE 11 !----------------------------------------------------------------------- 12 ! Auteur(s): AA + CG (LGGE/CNRS) Date 24-06-94 13 ! Objet: Calcul de la tendance radioactive des traceurs type radioelements 14 !CG240694 : Pour un traceur, le radon 15 !CG161294 : Plus un 2eme traceur, le 210Pb. Le radon decroit en plomb. 16 !----------------------------------------------------------------------- 17 ! 18 ! Entrees 19 ! 20 LOGICAL,DIMENSION(nbtr),INTENT(IN) :: radio ! .true. = traceur radioactif 21 LOGICAL,INTENT(IN) :: rnpb ! .true. = decroissance RN = source PB 22 REAL,INTENT(IN) :: dtime ! Pas de temps physique (secondes) 23 REAL,DIMENSION(nbtr),INTENT(IN) :: tautr ! Constante de decroissance radioactive 24 REAL,DIMENSION(klon,klev,nbtr),INTENT(IN) :: tr ! Concentrations traceurs U/kgA 25 ! 26 ! Sortie 27 ! 28 REAL,DIMENSION(klon,klev,nbtr),INTENT(OUT) :: d_tr ! Tendance de decroissance radioactive 29 ! 30 ! Locales 31 ! 32 INTEGER :: i,k,it 27 33 28 DO it = 1,2 29 IF ( tautr(it) .GT. 0. ) THEN 30 DO k = 1,klev 31 DO i = 1,klon 32 d_tr(i,k,it) = - tr(i,k,it) * dtime / tautr(it) 33 END DO 34 END DO 35 ELSE 36 DO k = 1,klev 37 DO i = 1,klon 38 d_tr(i,k,it) = 0. 39 END DO 40 END DO 41 END IF 42 END DO 43 C 44 CG161294 : Cas particulier radon 1 => plomb 2 45 c 46 DO k = 1,klev 34 35 DO it = 1,nbtr 36 IF ( radio(it) ) THEN 37 IF (tautr(it) .GT. 0.) THEN 38 DO k = 1,klev 39 DO i = 1,klon 40 d_tr(i,k,it) = - tr(i,k,it) * dtime / tautr(it) 41 END DO 42 END DO 43 ELSE 44 d_tr(:,:,it) = 0. 45 END IF 46 ELSE 47 d_tr(:,:,it) = 0. 48 END IF 49 END DO 50 !------------------------------------------------------- 51 !CG161294 : Cas particulier radon [it=1] => plomb [it=2] 52 !------------------------------------------------------- 53 IF ( rnpb ) THEN 54 DO k = 1,klev 47 55 DO i = 1,klon 48 d_tr(i,k,2) = d_tr(i,k,2) - d_tr(i,k,1)56 d_tr(i,k,2) = d_tr(i,k,2) - d_tr(i,k,1) 49 57 ENDDO 50 ENDDO 51 c 52 c WRITE(*,*) ' radiornpb OK' 53 c 54 RETURN 55 END 58 ENDDO 59 ENDIF 60 61 END SUBROUTINE radio_decay -
LMDZ4/branches/LMDZ4-dev/libf/phylmd/write_histrac.h
r1115 r1191 1 !$Id $ 2 !*************************************** 3 ! ECRITURE DU FICHIER : histrac.nc 4 !*************************************** 5 #ifdef CPP_IOIPSL 6 IF (ecrit_tra > 0. .AND. config_inca == 'none') THEN 7 8 itau_w = itau_phy + nstep 9 10 CALL histwrite_phy(nid_tra,"phis",itau_w,pphis) 11 CALL histwrite_phy(nid_tra,"aire",itau_w,airephy) 12 13 !TRACEURS 14 !---------------- 15 DO it=1,nbtr 16 iiq=niadv(it+2) 17 18 ! CONCENTRATIONS 19 CALL histwrite_phy(nid_tra,tname(iiq),itau_w,tr_seri(:,:,it)) 20 21 ! TD LESSIVAGE 22 IF (lessivage .AND. aerosol(it)) THEN 23 CALL histwrite_phy(nid_tra,"fl"//tname(iiq),itau_w,flestottr(:,:,it)) 24 ENDIF 25 26 ! TD THERMIQUES 27 IF (iflag_thermals.gt.0) THEN 28 CALL histwrite_phy(nid_tra,"d_tr_th_"//tname(iiq),itau_w,d_tr_th(:,:,it)) 29 ENDIF 30 31 ! TD CONVECTION 32 IF (iflag_con.GE.2) THEN 33 CALL histwrite_phy(nid_tra,"d_tr_cv_"//tname(iiq),itau_w,d_tr_cv(:,:,it)) 34 ENDIF 35 36 ! TD COUCHE-LIMITE 37 CALL histwrite_phy(nid_tra,"d_tr_cl_"//tname(iiq),itau_w,d_tr_cl(:,:,it)) 38 ENDDO 39 !--------------- 1 40 ! 2 ! $Header$3 41 ! 42 ! VENT (niveau 1) 43 CALL histwrite_phy(nid_tra,"pyu1",itau_w,yu1) 44 CALL histwrite_phy(nid_tra,"pyv1",itau_w,yv1) 45 ! 46 ! TEMPERATURE DU SOL 47 zx_tmp_fi2d(:)=ftsol(:,1) 48 CALL histwrite_phy(nid_tra,"ftsol1",itau_w,zx_tmp_fi2d) 49 zx_tmp_fi2d(:)=ftsol(:,2) 50 CALL histwrite_phy(nid_tra,"ftsol2",itau_w,zx_tmp_fi2d) 51 zx_tmp_fi2d(:)=ftsol(:,3) 52 CALL histwrite_phy(nid_tra,"ftsol3",itau_w,zx_tmp_fi2d) 53 zx_tmp_fi2d(:)=ftsol(:,4) 54 CALL histwrite_phy(nid_tra,"ftsol4",itau_w,zx_tmp_fi2d) 55 ! 56 ! NATURE DU SOL 57 zx_tmp_fi2d(:)=pctsrf(:,1) 58 CALL histwrite_phy(nid_tra,"psrf1",itau_w,zx_tmp_fi2d) 59 zx_tmp_fi2d(:)=pctsrf(:,2) 60 CALL histwrite_phy(nid_tra,"psrf2",itau_w,zx_tmp_fi2d) 61 zx_tmp_fi2d(:)=pctsrf(:,3) 62 CALL histwrite_phy(nid_tra,"psrf3",itau_w,zx_tmp_fi2d) 63 zx_tmp_fi2d(:)=pctsrf(:,4) 64 CALL histwrite_phy(nid_tra,"psrf4",itau_w,zx_tmp_fi2d) 65 66 ! DIVERS 67 CALL histwrite_phy(nid_tra,"pplay",itau_w,pplay) 68 CALL histwrite_phy(nid_tra,"t",itau_w,t_seri) 69 CALL histwrite_phy(nid_tra,"mfu",itau_w,pmfu) 70 CALL histwrite_phy(nid_tra,"mfd",itau_w,pmfd) 71 CALL histwrite_phy(nid_tra,"en_u",itau_w,pen_u) 72 CALL histwrite_phy(nid_tra,"en_d",itau_w,pen_d) 73 CALL histwrite_phy(nid_tra,"de_d",itau_w,pde_d) 74 CALL histwrite_phy(nid_tra,"de_u",itau_w,pde_u) 75 CALL histwrite_phy(nid_tra,"coefh",itau_w,coefh) 4 76 5 IF (ecrit_tra>0. .AND. config_inca == 'none') THEN 6 ndex = 0 7 ndex2d = 0 8 ndex3d = 0 9 c 10 itau_w = itau_phy + nstep 77 IF (ok_sync) THEN 78 !$OMP MASTER 79 CALL histsync(nid_tra) 80 !$OMP END MASTER 81 ENDIF 11 82 12 CALL histwrite_phy(nid_tra,"phis",itau_w,pphis) 13 C 14 CALL histwrite_phy(nid_tra,"aire",itau_w,airephy) 83 ENDIF !ecrit_tra>0. .AND. config_inca == 'none' 15 84 16 DO it=1,nbtr 17 iiq=niadv(it+2) 18 19 CALL histwrite_phy(nid_tra,tname(iiq),itau_w,tr_seri(:,:,it)) 20 if (lessivage) THEN 21 CALL histwrite_phy(nid_tra,"fl"//tname(iiq),itau_w, 22 . flestottr(:,:,it)) 23 endif 24 25 c----Olivia 26 CALL histwrite_phy(nid_tra,"d_tr_th_"//tname(iiq),itau_w, 27 . d_tr_th(:,:,it)) 28 29 if(iflag_con.GE.2) then 30 CALL histwrite_phy(nid_tra,"d_tr_cv_"//tname(iiq),itau_w, 31 . d_tr_cv(:,:,it)) 32 endif !(iflag_con.GE.2) then 33 CALL histwrite_phy(nid_tra,"d_tr_cl_"//tname(iiq),itau_w, 34 . d_tr_cl(:,:,it)) 35 c---fin Olivia 36 37 ENDDO 38 39 40 C abder 41 CALL histwrite_phy(nid_tra,"pyu1",itau_w,yu1) 42 43 CALL histwrite_phy(nid_tra,"pyv1",itau_w,yv1) 44 45 CALL histwrite_phy(nid_tra,"ftsol1",itau_w,pftsol1) 46 47 CALL histwrite_phy(nid_tra,"ftsol2",itau_w,pftsol2) 48 49 CALL histwrite_phy(nid_tra,"ftsol3",itau_w,pftsol3) 50 51 CALL histwrite_phy(nid_tra,"ftsol4",itau_w,pftsol4) 52 53 CALL histwrite_phy(nid_tra,"psrf1",itau_w,ppsrf1) 54 55 CALL histwrite_phy(nid_tra,"psrf2",itau_w,ppsrf2) 56 57 CALL histwrite_phy(nid_tra,"psrf3",itau_w,ppsrf3) 58 59 CALL histwrite_phy(nid_tra,"psrf4",itau_w,ppsrf4) 60 CALL histwrite_phy(nid_tra,"pplay",itau_w,pplay) 61 62 CALL histwrite_phy(nid_tra,"t",itau_w,t_seri) 63 CALL histwrite_phy(nid_tra,"mfu",itau_w,pmfu) 64 CALL histwrite_phy(nid_tra,"mfd",itau_w,pmfd) 65 CALL histwrite_phy(nid_tra,"en_u",itau_w,pen_u) 66 CALL histwrite_phy(nid_tra,"en_d",itau_w,pen_d) 67 CALL histwrite_phy(nid_tra,"de_d",itau_w,pde_d) 68 CALL histwrite_phy(nid_tra,"de_u",itau_w,pde_u) 69 CALL histwrite_phy(nid_tra,"coefh",itau_w,coefh) 70 71 72 c abder 73 74 if (ok_sync) then 75 c$OMP MASTER 76 call histsync(nid_tra) 77 c$OMP END MASTER 78 endif 79 80 END IF !ecrit_tra>0. .AND. config_inca == 'none' 81 82 83 85 #endif
Note: See TracChangeset
for help on using the changeset viewer.