- Timestamp:
- Jul 22, 2024, 9:29:09 PM (4 months ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/Amaury_dev/libf/phylmd/Dust/cltrac_spl.f90
r5098 r5099 1 SUBROUTINE cltrac_spl(dtime,coef,yu1,yv1,t,tr, 2 . flux,paprs,pplay,d_tr)1 SUBROUTINE cltrac_spl(dtime, coef, yu1, yv1, t, tr, & 2 flux, paprs, pplay, d_tr) 3 3 4 5 6 c======================================================================7 cAuteur(s): O. Boucher (LOA/LMD) date: 199611278 cinspire de clvent9 cObjet: diffusion verticale de traceurs avec flux fixe a la surface10 cou/et flux du type c-drag11 c======================================================================12 cArguments:13 cdtime----input-R- intervalle du temps (en second)14 ccoef-----input-R- le coefficient d'echange (m**2/s) l>115 cyu1------input-R- le vent dans le 1iere couche16 cyv1------input-R- le vent dans le 1iere couche17 ct--------input-R- temperature (K)18 ctr-------input-R- la q. de traceurs19 cflux-----input-R- le flux de traceurs a la surface20 cpaprs----input-R- pression a inter-couche (Pa)21 cpplay----input-R- pression au milieu de couche (Pa)22 cdelp-----input-R- epaisseur de couche (Pa)23 ccdrag----input-R- cdrag pour le flux de surface (non active)24 ctr0------input-R- traceurs a la surface ou dans l'ocean (non active)25 cd_tr-----output-R- le changement de tr26 cflux_tr--output-R- flux de tr27 c======================================================================28 29 REALdtime30 REAL coef(klon,klev)31 REALyu1(klon), yv1(klon)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 REALflux(klon), cdrag(klon), tr0(klon)36 cREAL flux_tr(klon,klev)37 c======================================================================38 39 c======================================================================40 INTEGERi, k41 REAL zx_ctr(klon,2:klev)42 REAL zx_dtr(klon,2:klev)43 REALzx_buf(klon)44 REAL zx_coef(klon,klev)45 REAL local_tr(klon,klev)46 REALzx_alf1(klon), zx_alf2(klon), zx_flux(klon)47 c======================================================================48 cCHECKING VALUES49 !print *,'CHECKING VALUES IN CLTRAC (INI)'50 !print *,'d_tr = ',sum(d_tr),MINVAL(d_tr),MAXVAL(d_tr)51 !print *,'flux = ',sum(flux),MINVAL(flux),MAXVAL(flux)52 !print *,'tr = ',sum(tr),MINVAL(tr),MAXVAL(tr)53 c======================================================================54 55 56 local_tr(i,k) = tr(i,k)57 delp(i,k) = paprs(i,k)-paprs(i,k+1)58 59 60 c======================================================================61 62 zx_alf1(i) = (paprs(i,1)-pplay(i,2))/(pplay(i,1)-pplay(i,2))63 64 zx_flux(i) = -flux(i)*dtime*RG65 c--pour le moment le flux est prescrit66 cdrag(i) = 0.067 ccdrag(i) = coef(i,1) * (1.0+SQRT(yu1(i)**2+yv1(i)**2))68 c. * pplay(i,1)/(RD*t(i,1))69 70 zx_coef(i,1) = cdrag(i)*dtime*RG71 72 c======================================================================73 74 75 zx_coef(i,k) = coef(i,k)*RG/(pplay(i,k-1)-pplay(i,k))76 . *(paprs(i,k)*2/(t(i,k)+t(i,k-1))/RD)**277 zx_coef(i,k) = zx_coef(i,k)*dtime*RG78 79 80 c======================================================================81 82 zx_buf(i) = delp(i,1) + zx_coef(i,1)*zx_alf1(i) + zx_coef(i,2)83 zx_ctr(i,2) = (local_tr(i,1)*delp(i,1)+84 . zx_coef(i,1)*tr0(i)-zx_flux(i))/zx_buf(i)85 zx_dtr(i,2) = (zx_coef(i,2)-zx_alf2(i)*zx_coef(i,1)) /86 .zx_buf(i)87 88 c 89 90 91 zx_buf(i) = delp(i,k-1) + zx_coef(i,k)92 . + zx_coef(i,k-1)*(1.-zx_dtr(i,k-1))93 zx_ctr(i,k) = (local_tr(i,k-1)*delp(i,k-1)94 . +zx_coef(i,k-1)*zx_ctr(i,k-1) )/zx_buf(i)95 zx_dtr(i,k) = zx_coef(i,k)/zx_buf(i)96 97 98 99 local_tr(i,klev) = ( local_tr(i,klev)*delp(i,klev)100 . +zx_coef(i,klev)*zx_ctr(i,klev) )101 . / ( delp(i,klev) + zx_coef(i,klev)102 . -zx_coef(i,klev)*zx_dtr(i,klev))103 104 DO k = klev-1, 1, -1105 106 local_tr(i,k) = zx_ctr(i,k+1) + zx_dtr(i,k+1)*local_tr(i,k+1)107 108 109 c======================================================================110 !print *,'CHECKING VALUES IN CLTRAC (FIN)'111 !print *,'local_tr = ',sum(local_tr),MINVAL(local_tr),112 !. MAXVAL(local_tr)113 !print *,'zx_ctr = ',sum(zx_ctr),MINVAL(zx_ctr),MAXVAL(zx_ctr)114 !print *,'zx_dtr = ',sum(zx_dtr),MINVAL(zx_dtr),MAXVAL(zx_dtr)115 !print *,'tr = ',sum(tr),MINVAL(tr),MAXVAL(tr)116 c======================================================================117 c== flux_tr est le flux de traceur (positif vers bas)118 cDO i = 1, klon119 cflux_tr(i,1) = zx_coef(i,1)/(RG*dtime)120 cENDDO121 cDO k = 2, klev122 cDO i = 1, klon123 cflux_tr(i,k) = zx_coef(i,k)/(RG*dtime)124 c. * (local_tr(i,k)-local_tr(i,k-1))125 cENDDO126 cENDDO127 c======================================================================128 129 130 d_tr(i,k) = local_tr(i,k) - tr(i,k)131 132 133 !print *,'CHECKING VALUES IN CLTRAC (END)'134 !print *,'d_tr = ',sum(d_tr),MINVAL(d_tr),MAXVAL(d_tr)135 c 136 137 END 4 USE dimphy 5 IMPLICIT none 6 !====================================================================== 7 ! Auteur(s): O. Boucher (LOA/LMD) date: 19961127 8 ! inspire de clvent 9 ! Objet: diffusion verticale de traceurs avec flux fixe a la surface 10 ! ou/et flux du type c-drag 11 !====================================================================== 12 ! Arguments: 13 ! dtime----input-R- intervalle du temps (en second) 14 ! coef-----input-R- le coefficient d'echange (m**2/s) l>1 15 ! yu1------input-R- le vent dans le 1iere couche 16 ! yv1------input-R- le vent dans le 1iere couche 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 "dimensions.h" 29 REAL :: dtime 30 REAL :: coef(klon, klev) 31 REAL :: yu1(klon), yv1(klon) 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 ! REAL flux_tr(klon,klev) 37 !====================================================================== 38 INCLUDE "YOMCST.h" 39 !====================================================================== 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 !====================================================================== 48 ! CHECKING VALUES 49 ! print *,'CHECKING VALUES IN CLTRAC (INI)' 50 ! print *,'d_tr = ',sum(d_tr),MINVAL(d_tr),MAXVAL(d_tr) 51 ! print *,'flux = ',sum(flux),MINVAL(flux),MAXVAL(flux) 52 ! print *,'tr = ',sum(tr),MINVAL(tr),MAXVAL(tr) 53 !====================================================================== 54 DO k = 1, klev 55 DO i = 1, klon 56 local_tr(i, k) = tr(i, k) 57 delp(i, k) = paprs(i, k) - paprs(i, k + 1) 58 ENDDO 59 ENDDO 60 !====================================================================== 61 DO i = 1, klon 62 zx_alf1(i) = (paprs(i, 1) - pplay(i, 2)) / (pplay(i, 1) - pplay(i, 2)) 63 zx_alf2(i) = 1.0 - zx_alf1(i) 64 zx_flux(i) = -flux(i) * dtime * RG 65 !--pour le moment le flux est prescrit 66 cdrag(i) = 0.0 67 ! cdrag(i) = coef(i,1) * (1.0+SQRT(yu1(i)**2+yv1(i)**2)) 68 ! . * pplay(i,1)/(RD*t(i,1)) 69 tr0(i) = 0.0 70 zx_coef(i, 1) = cdrag(i) * dtime * RG 71 ENDDO 72 !====================================================================== 73 DO k = 2, klev 74 DO i = 1, klon 75 zx_coef(i, k) = coef(i, k) * RG / (pplay(i, k - 1) - pplay(i, k)) & 76 * (paprs(i, k) * 2 / (t(i, k) + t(i, k - 1)) / RD)**2 77 zx_coef(i, k) = zx_coef(i, k) * dtime * RG 78 ENDDO 79 ENDDO 80 !====================================================================== 81 DO i = 1, klon 82 zx_buf(i) = delp(i, 1) + zx_coef(i, 1) * zx_alf1(i) + zx_coef(i, 2) 83 zx_ctr(i, 2) = (local_tr(i, 1) * delp(i, 1) + & 84 zx_coef(i, 1) * tr0(i) - zx_flux(i)) / zx_buf(i) 85 zx_dtr(i, 2) = (zx_coef(i, 2) - zx_alf2(i) * zx_coef(i, 1)) / & 86 zx_buf(i) 87 ENDDO 88 89 DO k = 3, klev 90 DO i = 1, klon 91 zx_buf(i) = delp(i, k - 1) + zx_coef(i, k) & 92 + zx_coef(i, k - 1) * (1. - zx_dtr(i, k - 1)) 93 zx_ctr(i, k) = (local_tr(i, k - 1) * delp(i, k - 1) & 94 + zx_coef(i, k - 1) * zx_ctr(i, k - 1)) / zx_buf(i) 95 zx_dtr(i, k) = zx_coef(i, k) / zx_buf(i) 96 ENDDO 97 ENDDO 98 DO i = 1, klon 99 local_tr(i, klev) = (local_tr(i, klev) * delp(i, klev) & 100 + zx_coef(i, klev) * zx_ctr(i, klev)) & 101 / (delp(i, klev) + zx_coef(i, klev) & 102 - zx_coef(i, klev) * zx_dtr(i, klev)) 103 ENDDO 104 DO k = klev - 1, 1, -1 105 DO i = 1, klon 106 local_tr(i, k) = zx_ctr(i, k + 1) + zx_dtr(i, k + 1) * local_tr(i, k + 1) 107 ENDDO 108 ENDDO 109 !====================================================================== 110 ! print *,'CHECKING VALUES IN CLTRAC (FIN)' 111 ! print *,'local_tr = ',sum(local_tr),MINVAL(local_tr), 112 ! . MAXVAL(local_tr) 113 ! print *,'zx_ctr = ',sum(zx_ctr),MINVAL(zx_ctr),MAXVAL(zx_ctr) 114 ! print *,'zx_dtr = ',sum(zx_dtr),MINVAL(zx_dtr),MAXVAL(zx_dtr) 115 ! print *,'tr = ',sum(tr),MINVAL(tr),MAXVAL(tr) 116 !====================================================================== 117 !== flux_tr est le flux de traceur (positif vers bas) 118 ! DO i = 1, klon 119 ! flux_tr(i,1) = zx_coef(i,1)/(RG*dtime) 120 ! ENDDO 121 ! DO k = 2, klev 122 ! DO i = 1, klon 123 ! flux_tr(i,k) = zx_coef(i,k)/(RG*dtime) 124 ! . * (local_tr(i,k)-local_tr(i,k-1)) 125 ! ENDDO 126 ! ENDDO 127 !====================================================================== 128 DO k = 1, klev 129 DO i = 1, klon 130 d_tr(i, k) = local_tr(i, k) - tr(i, k) 131 ENDDO 132 ENDDO 133 ! print *,'CHECKING VALUES IN CLTRAC (END)' 134 ! print *,'d_tr = ',sum(d_tr),MINVAL(d_tr),MAXVAL(d_tr) 135 136 RETURN 137 END SUBROUTINE cltrac_spl
Note: See TracChangeset
for help on using the changeset viewer.