- Timestamp:
- 07/16/14 18:05:01 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/branches/SATURN_DYNAMICO/LMDZ.COMMON/libf/phystd/moistadj.F90
r222 r227 1 subroutine moistadj(ngrid, n q, pt, pq, pdq, pplev, pplay, pdtmana, pdqmana, ptimestep, rneb)1 subroutine moistadj(ngrid, nlayer, nq, pt, pq, pdq, pplev, pplay, pdtmana, pdqmana, ptimestep, rneb) 2 2 3 3 use watercommon_h, only: T_h2O_ice_liq, RLVTT, RCPD, RCPV, Psat_water, Lcpdqsat_water 4 USE tracer_h 4 USE tracer_h, only: igcm_h2o_vap, igcm_h2o_ice 5 5 6 6 implicit none … … 20 20 !===================================================================== 21 21 22 #include "dimensions.h"23 #include "dimphys.h"22 !#include "dimensions.h" 23 !#include "dimphys.h" 24 24 #include "comcstfi.h" 25 25 26 INTEGER ngrid, nq 27 28 REAL pt(ngrid,nlayermx) ! temperature (K) 29 REAL pq(ngrid,nlayermx,nq) ! tracer (kg/kg) 30 REAL pdq(ngrid,nlayermx,nq) 31 32 REAL pdqmana(ngrid,nlayermx,nq) ! tendency of tracers (kg/kg.s-1) 33 REAL pdtmana(ngrid,nlayermx) ! temperature increment 26 INTEGER,INTENT(IN) :: ngrid, nlayer, nq 27 28 REAL,INTENT(IN) :: pt(ngrid,nlayer) ! temperature (K) 29 REAL,INTENT(IN) :: pq(ngrid,nlayer,nq) ! tracer (kg/kg) 30 REAL,INTENT(IN) :: pdq(ngrid,nlayer,nq) 31 REAL,INTENT(IN) :: pplev(ngrid,nlayer+1) ! inter-layer pressure (Pa) 32 REAL,INTENT(IN) :: pplay(ngrid,nlayer) ! mid-layer pressure (Pa) 33 REAL,INTENT(IN) :: ptimestep ! physics timestep (s) 34 REAL,INTENT(OUT) :: pdqmana(ngrid,nlayer,nq) ! tracer tendencies (kg/kg.s-1) 35 REAL,INTENT(OUT) :: pdtmana(ngrid,nlayer) ! temperature increment(K/s) 36 REAL,INTENT(OUT) :: rneb(ngrid,nlayer) ! cloud fraction 34 37 35 38 ! local variables 36 REAL zt(ngrid,nlayermx) ! temperature (K) 37 REAL zq(ngrid,nlayermx) ! humidite specifique (kg/kg) 38 REAL pplev(ngrid,nlayermx+1) ! pression a inter-couche (Pa) 39 REAL pplay(ngrid,nlayermx) ! pression au milieu de couche (Pa) 40 41 REAL d_t(ngrid,nlayermx) ! temperature increment 42 REAL d_q(ngrid,nlayermx) ! incrementation pour vapeur d'eau 43 REAL d_ql(ngrid,nlayermx) ! incrementation pour l'eau liquide 44 REAL rneb(ngrid,nlayermx) ! cloud fraction 45 REAL ptimestep 39 REAL zt(ngrid,nlayer) ! temperature (K) 40 REAL zq(ngrid,nlayer) ! humidite specifique (kg/kg) 41 42 REAL d_t(ngrid,nlayer) ! temperature increment 43 REAL d_q(ngrid,nlayer) ! incrementation pour vapeur d'eau 44 REAL d_ql(ngrid,nlayer) ! incrementation pour l'eau liquide 46 45 47 46 ! REAL t_coup … … 55 54 INTEGER k1, k1p, k2, k2p 56 55 LOGICAL itest(ngrid) 57 REAL delta_q(ngrid, nlayer mx)58 DOUBLE PRECISION :: cp_new_t(nlayer mx), v_cptt(ngrid,nlayermx)59 REAL cp_delta_t(nlayer mx)60 DOUBLE PRECISION :: v_cptj(nlayer mx), v_cptjk1, v_ssig56 REAL delta_q(ngrid, nlayer) 57 DOUBLE PRECISION :: cp_new_t(nlayer), v_cptt(ngrid,nlayer) 58 REAL cp_delta_t(nlayer) 59 DOUBLE PRECISION :: v_cptj(nlayer), v_cptjk1, v_ssig 61 60 REAL v_p, v_t, v_zqs,v_cptt2,v_pratio,v_dlnpsat 62 REAL zqs(ngrid,nlayer mx), zdqs(ngrid,nlayermx),zpsat(ngrid,nlayermx),zdlnpsat(ngrid,nlayermx)61 REAL zqs(ngrid,nlayer), zdqs(ngrid,nlayer),zpsat(ngrid,nlayer),zdlnpsat(ngrid,nlayer) 63 62 REAL zq1(ngrid), zq2(ngrid) 64 DOUBLE PRECISION :: gamcpdz(ngrid,2:nlayer mx)63 DOUBLE PRECISION :: gamcpdz(ngrid,2:nlayer) 65 64 DOUBLE PRECISION :: zdp, zdpm 66 65 … … 68 67 REAL zflo ! flotabilite 69 68 70 DOUBLE PRECISION :: local_q(ngrid,nlayer mx),local_t(ngrid,nlayermx)69 DOUBLE PRECISION :: local_q(ngrid,nlayer),local_t(ngrid,nlayer) 71 70 72 71 REAL zdelta, zcor, zcvm5 … … 78 77 INTEGER,SAVE :: i_h2o=0 ! water vapour 79 78 INTEGER,SAVE :: i_ice=0 ! water ice 80 81 LOGICAL firstcall 82 SAVE firstcall 83 84 DATA firstcall /.TRUE./ 79 !$OMP THREADPRIVATE(i_h2o,i_ice) 80 81 LOGICAL,SAVE :: firstcall=.TRUE. 82 !$OMP THREADPRIVATE(firstcall) 85 83 86 84 IF (firstcall) THEN … … 96 94 97 95 ! GCM -----> subroutine variables 98 zq(1:ngrid,1:nlayer mx) = pq(1:ngrid,1:nlayermx,i_h2o)+ pdq(1:ngrid,1:nlayermx,i_h2o)*ptimestep99 zt(1:ngrid,1:nlayer mx) = pt(1:ngrid,1:nlayermx)100 pdqmana(1:ngrid,1:nlayer mx,1:nq)=0.0101 102 DO k = 1, nlayer mx96 zq(1:ngrid,1:nlayer) = pq(1:ngrid,1:nlayer,i_h2o)+ pdq(1:ngrid,1:nlayer,i_h2o)*ptimestep 97 zt(1:ngrid,1:nlayer) = pt(1:ngrid,1:nlayer) 98 pdqmana(1:ngrid,1:nlayer,1:nq)=0.0 99 100 DO k = 1, nlayer 103 101 DO i = 1, ngrid 104 102 if(zq(i,k).lt.0.)then … … 108 106 ENDDO 109 107 110 local_q(1:ngrid,1:nlayer mx) = zq(1:ngrid,1:nlayermx)111 local_t(1:ngrid,1:nlayer mx) = zt(1:ngrid,1:nlayermx)112 rneb(1:ngrid,1:nlayer mx) = 0.0113 d_ql(1:ngrid,1:nlayer mx) = 0.0114 d_t(1:ngrid,1:nlayer mx) = 0.0115 d_q(1:ngrid,1:nlayer mx) = 0.0108 local_q(1:ngrid,1:nlayer) = zq(1:ngrid,1:nlayer) 109 local_t(1:ngrid,1:nlayer) = zt(1:ngrid,1:nlayer) 110 rneb(1:ngrid,1:nlayer) = 0.0 111 d_ql(1:ngrid,1:nlayer) = 0.0 112 d_t(1:ngrid,1:nlayer) = 0.0 113 d_q(1:ngrid,1:nlayer) = 0.0 116 114 117 115 ! Calculate v_cptt 118 DO k = 1, nlayer mx116 DO k = 1, nlayer 119 117 DO i = 1, ngrid 120 118 v_cptt(i,k) = RCPD * local_t(i,k) … … 128 126 129 127 ! Calculate Gamma * Cp * dz: (gamma is the critical gradient) 130 DO k = 2, nlayer mx128 DO k = 2, nlayer 131 129 DO i = 1, ngrid 132 130 zdp = pplev(i,k)-pplev(i,k+1) … … 159 157 810 CONTINUE ! look for k1, the base of the column 160 158 k2 = k2 + 1 161 IF (k2 .GT. nlayer mx) GOTO 9999159 IF (k2 .GT. nlayer) GOTO 9999 162 160 zflo = v_cptt(i,k2-1) - v_cptt(i,k2) - gamcpdz(i,k2) 163 161 zsat=(local_q(i,k2-1)-zqs(i,k2-1))*(pplev(i,k2-1)-pplev(i,k2)) & … … 169 167 170 168 820 CONTINUE !! look for k2, the top of the column 171 IF (k2 .EQ. nlayer mx) GOTO 821169 IF (k2 .EQ. nlayer) GOTO 821 172 170 k2p = k2 + 1 173 171 zsat=zsat+(pplev(i,k2p)-pplev(i,k2p+1))*(local_q(i,k2p)-zqs(i,k2p)) … … 227 225 ! ENDDO 228 226 229 DO k = 2, nlayer mx227 DO k = 2, nlayer 230 228 zdpm = pplev(i,k-1) - pplev(i,k) 231 229 zdp = pplev(i,k) - pplev(i,k+1) … … 272 270 ! a l'endroit ou la vapeur d'eau est diminuee par l'ajustement): 273 271 274 DO k = 1, nlayer mx272 DO k = 1, nlayer 275 273 DO i = 1, ngrid 276 274 IF (itest(i)) THEN … … 291 289 ENDIF 292 290 ENDDO 293 DO k = 1, nlayer mx291 DO k = 1, nlayer 294 292 DO i = 1, ngrid 295 293 IF (itest(i)) THEN … … 300 298 ENDDO 301 299 ENDDO 302 DO k = 1, nlayer mx300 DO k = 1, nlayer 303 301 DO i = 1, ngrid 304 302 IF (itest(i)) THEN … … 308 306 ENDDO 309 307 310 DO k = 1, nlayer mx308 DO k = 1, nlayer 311 309 DO i = 1, ngrid 312 310 local_q(i, k) = MAX(local_q(i, k), seuil_vap) … … 314 312 ENDDO 315 313 316 DO k = 1, nlayer mx314 DO k = 1, nlayer 317 315 DO i = 1, ngrid 318 316 d_t(i,k) = local_t(i,k) - zt(i,k) … … 322 320 323 321 ! now subroutine -----> GCM variables 324 DO k = 1, nlayer mx322 DO k = 1, nlayer 325 323 DO i = 1, ngrid 326 324 … … 333 331 334 332 335 RETURN336 333 END
Note: See TracChangeset
for help on using the changeset viewer.