Changeset 5103 for LMDZ6/branches/Amaury_dev/libf/dyn3d/integrd.F90
- Timestamp:
- Jul 23, 2024, 3:29:36 PM (8 weeks ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/branches/Amaury_dev/libf/dyn3d/integrd.F90
r5102 r5103 1 2 1 ! $Id$ 3 2 4 SUBROUTINE integrd 5 $ ( nq,vcovm1,ucovm1,tetam1,psm1,massem1, 6 $ dv,du,dteta,dq,dp,vcov,ucov,teta,q,ps,masse,phis !,finvmaold 7 & ) 8 9 use control_mod, ONLY: planet_type 10 use comconst_mod, only: pi 11 USE logic_mod, ONLY: leapf 12 use comvert_mod, only: ap, bp 13 USE temps_mod, ONLY: dt 14 15 IMPLICIT NONE 16 17 18 c======================================================================= 19 c 20 c Auteur: P. Le Van 21 c ------- 22 c 23 c objet: 24 c ------ 25 c 26 c Incrementation des tendances dynamiques 27 c 28 c======================================================================= 29 c----------------------------------------------------------------------- 30 c Declarations: 31 c ------------- 32 33 include "dimensions.h" 34 include "paramet.h" 35 include "comgeom.h" 36 include "iniprint.h" 37 38 c Arguments: 39 c ---------- 40 41 integer,intent(in) :: nq ! number of tracers to handle in this routine 42 real,intent(inout) :: vcov(ip1jm,llm) ! covariant meridional wind 43 real,intent(inout) :: ucov(ip1jmp1,llm) ! covariant zonal wind 44 real,intent(inout) :: teta(ip1jmp1,llm) ! potential temperature 45 real,intent(inout) :: q(ip1jmp1,llm,nq) ! advected tracers 46 real,intent(inout) :: ps(ip1jmp1) ! surface pressure 47 real,intent(inout) :: masse(ip1jmp1,llm) ! atmospheric mass 48 real,intent(in) :: phis(ip1jmp1) ! ground geopotential !!! unused 49 ! values at previous time step 50 real,intent(inout) :: vcovm1(ip1jm,llm) 51 real,intent(inout) :: ucovm1(ip1jmp1,llm) 52 real,intent(inout) :: tetam1(ip1jmp1,llm) 53 real,intent(inout) :: psm1(ip1jmp1) 54 real,intent(inout) :: massem1(ip1jmp1,llm) 55 ! the tendencies to add 56 real,intent(in) :: dv(ip1jm,llm) 57 real,intent(in) :: du(ip1jmp1,llm) 58 real,intent(in) :: dteta(ip1jmp1,llm) 59 real,intent(in) :: dp(ip1jmp1) 60 real,intent(in) :: dq(ip1jmp1,llm,nq) !!! unused 61 ! real,intent(out) :: finvmaold(ip1jmp1,llm) !!! unused 62 63 c Local: 64 c ------ 65 66 REAL vscr( ip1jm ),uscr( ip1jmp1 ),hscr( ip1jmp1 ),pscr(ip1jmp1) 67 REAL massescr( ip1jmp1,llm ) 68 ! REAL finvmasse(ip1jmp1,llm) 69 REAL p(ip1jmp1,llmp1) 70 REAL tpn,tps,tppn(iim),tpps(iim) 71 REAL qpn,qps,qppn(iim),qpps(iim) 72 REAL deltap( ip1jmp1,llm ) 73 74 INTEGER l,ij,iq,i,j 75 76 REAL SSUM 77 78 c----------------------------------------------------------------------- 79 80 DO l = 1,llm 81 DO ij = 1,iip1 82 ucov( ij , l) = 0. 83 ucov( ij +ip1jm, l) = 0. 84 uscr( ij ) = 0. 85 uscr( ij +ip1jm ) = 0. 3 SUBROUTINE integrd & 4 (nq, vcovm1, ucovm1, tetam1, psm1, massem1, & 5 dv, du, dteta, dq, dp, vcov, ucov, teta, q, ps, masse, phis & !,finvmaold 6 ) 7 8 use control_mod, ONLY: planet_type 9 use comconst_mod, only: pi 10 USE logic_mod, ONLY: leapf 11 use comvert_mod, only: ap, bp 12 USE temps_mod, ONLY: dt 13 14 IMPLICIT NONE 15 16 17 !======================================================================= 18 ! 19 ! Auteur: P. Le Van 20 ! ------- 21 ! 22 ! objet: 23 ! ------ 24 ! 25 ! Incrementation des tendances dynamiques 26 ! 27 !======================================================================= 28 !----------------------------------------------------------------------- 29 ! Declarations: 30 ! ------------- 31 32 include "dimensions.h" 33 include "paramet.h" 34 include "comgeom.h" 35 include "iniprint.h" 36 37 ! Arguments: 38 ! ---------- 39 40 integer, intent(in) :: nq ! number of tracers to handle in this routine 41 real, intent(inout) :: vcov(ip1jm, llm) ! covariant meridional wind 42 real, intent(inout) :: ucov(ip1jmp1, llm) ! covariant zonal wind 43 real, intent(inout) :: teta(ip1jmp1, llm) ! potential temperature 44 real, intent(inout) :: q(ip1jmp1, llm, nq) ! advected tracers 45 real, intent(inout) :: ps(ip1jmp1) ! surface pressure 46 real, intent(inout) :: masse(ip1jmp1, llm) ! atmospheric mass 47 real, intent(in) :: phis(ip1jmp1) ! ground geopotential !!! unused 48 ! ! values at previous time step 49 real, intent(inout) :: vcovm1(ip1jm, llm) 50 real, intent(inout) :: ucovm1(ip1jmp1, llm) 51 real, intent(inout) :: tetam1(ip1jmp1, llm) 52 real, intent(inout) :: psm1(ip1jmp1) 53 real, intent(inout) :: massem1(ip1jmp1, llm) 54 ! ! the tendencies to add 55 real, intent(in) :: dv(ip1jm, llm) 56 real, intent(in) :: du(ip1jmp1, llm) 57 real, intent(in) :: dteta(ip1jmp1, llm) 58 real, intent(in) :: dp(ip1jmp1) 59 real, intent(in) :: dq(ip1jmp1, llm, nq) !!! unused 60 ! real,intent(out) :: finvmaold(ip1jmp1,llm) !!! unused 61 62 ! Local: 63 ! ------ 64 65 REAL :: vscr(ip1jm), uscr(ip1jmp1), hscr(ip1jmp1), pscr(ip1jmp1) 66 REAL :: massescr(ip1jmp1, llm) 67 ! REAL finvmasse(ip1jmp1,llm) 68 REAL :: p(ip1jmp1, llmp1) 69 REAL :: tpn, tps, tppn(iim), tpps(iim) 70 REAL :: qpn, qps, qppn(iim), qpps(iim) 71 REAL :: deltap(ip1jmp1, llm) 72 73 INTEGER :: l, ij, iq, i, j 74 75 REAL :: SSUM 76 77 !----------------------------------------------------------------------- 78 79 DO l = 1, llm 80 DO ij = 1, iip1 81 ucov(ij, l) = 0. 82 ucov(ij + ip1jm, l) = 0. 83 uscr(ij) = 0. 84 uscr(ij + ip1jm) = 0. 85 ENDDO 86 ENDDO 87 88 89 ! ............ integration de ps .............. 90 91 CALL SCOPY(ip1jmp1 * llm, masse, 1, massescr, 1) 92 93 DO ij = 1, ip1jmp1 94 pscr (ij) = ps(ij) 95 ps (ij) = psm1(ij) + dt * dp(ij) 96 ENDDO 97 ! 98 DO ij = 1, ip1jmp1 99 IF(ps(ij)<0.) THEN 100 write(lunout, *) "integrd: negative surface pressure ", ps(ij) 101 write(lunout, *) " at node ij =", ij 102 ! ! since ij=j+(i-1)*jjp1 , we have 103 j = modulo(ij, jjp1) 104 i = 1 + (ij - j) / jjp1 105 write(lunout, *) " lon = ", rlonv(i) * 180. / pi, " deg", & 106 " lat = ", rlatu(j) * 180. / pi, " deg" 107 CALL abort_gcm("integrd", "", 1) 108 ENDIF 109 ENDDO 110 ! 111 DO ij = 1, iim 112 tppn(ij) = aire(ij) * ps(ij) 113 tpps(ij) = aire(ij + ip1jm) * ps(ij + ip1jm) 114 ENDDO 115 tpn = SSUM(iim, tppn, 1) / apoln 116 tps = SSUM(iim, tpps, 1) / apols 117 DO ij = 1, iip1 118 ps(ij) = tpn 119 ps(ij + ip1jm) = tps 120 ENDDO 121 ! 122 ! ... Calcul de la nouvelle masse d'air au dernier temps integre t+1 ... 123 ! 124 CALL pression (ip1jmp1, ap, bp, ps, p) 125 CALL massdair (p, masse) 126 127 ! Ehouarn : we don't use/need finvmaold and finvmasse, 128 ! so might as well not compute them 129 ! CALL SCOPY( ijp1llm , masse, 1, finvmasse, 1 ) 130 ! CALL filtreg( finvmasse, jjp1, llm, -2, 2, .TRUE., 1 ) 131 ! 132 133 ! ............ integration de ucov, vcov, h .............. 134 135 DO l = 1, llm 136 137 DO ij = iip2, ip1jm 138 uscr(ij) = ucov(ij, l) 139 ucov(ij, l) = ucovm1(ij, l) + dt * du(ij, l) 140 ENDDO 141 142 DO ij = 1, ip1jm 143 vscr(ij) = vcov(ij, l) 144 vcov(ij, l) = vcovm1(ij, l) + dt * dv(ij, l) 145 ENDDO 146 147 DO ij = 1, ip1jmp1 148 hscr(ij) = teta(ij, l) 149 teta (ij, l) = tetam1(ij, l) * massem1(ij, l) / masse(ij, l) & 150 + dt * dteta(ij, l) / masse(ij, l) 151 ENDDO 152 153 ! .... Calcul de la valeur moyenne, unique aux poles pour teta ...... 154 ! 155 ! 156 DO ij = 1, iim 157 tppn(ij) = aire(ij) * teta(ij, l) 158 tpps(ij) = aire(ij + ip1jm) * teta(ij + ip1jm, l) 159 ENDDO 160 tpn = SSUM(iim, tppn, 1) / apoln 161 tps = SSUM(iim, tpps, 1) / apols 162 163 DO ij = 1, iip1 164 teta(ij, l) = tpn 165 teta(ij + ip1jm, l) = tps 166 ENDDO 167 ! 168 169 IF(leapf) THEN 170 CALL SCOPY (ip1jmp1, uscr(1), 1, ucovm1(1, l), 1) 171 CALL SCOPY (ip1jm, vscr(1), 1, vcovm1(1, l), 1) 172 CALL SCOPY (ip1jmp1, hscr(1), 1, tetam1(1, l), 1) 173 END IF 174 175 ENDDO ! of DO l = 1,llm 176 177 178 ! 179 ! ....... integration de q ...... 180 ! 181 !$$$ IF( iadv(1).NE.3.AND.iadv(2).NE.3 ) THEN 182 !$$$c 183 !$$$ IF( forward .OR. leapf ) THEN 184 !$$$ DO iq = 1,2 185 !$$$ DO l = 1,llm 186 !$$$ DO ij = 1,ip1jmp1 187 !$$$ q(ij,l,iq) = ( q(ij,l,iq)*finvmaold(ij,l) + dtvr *dq(ij,l,iq) )/ 188 !$$$ $ finvmasse(ij,l) 189 !$$$ ENDDO 190 !$$$ ENDDO 191 !$$$ ENDDO 192 !$$$ ELSE 193 !$$$ DO iq = 1,2 194 !$$$ DO l = 1,llm 195 !$$$ DO ij = 1,ip1jmp1 196 !$$$ q( ij,l,iq ) = q( ij,l,iq ) * finvmaold(ij,l) / finvmasse(ij,l) 197 !$$$ ENDDO 198 !$$$ ENDDO 199 !$$$ ENDDO 200 !$$$ 201 !$$$ END IF 202 !$$$c 203 !$$$ ENDIF 204 205 if (planet_type=="earth") then 206 ! Earth-specific treatment of first 2 tracers (water) 207 DO l = 1, llm 208 DO ij = 1, ip1jmp1 209 deltap(ij, l) = p(ij, l) - p(ij, l + 1) 210 ENDDO 211 ENDDO 212 213 CALL qminimum(q, nq, deltap) 214 215 ! 216 ! ..... Calcul de la valeur moyenne, unique aux poles pour q ..... 217 ! 218 219 DO iq = 1, nq 220 DO l = 1, llm 221 222 DO ij = 1, iim 223 qppn(ij) = aire(ij) * q(ij, l, iq) 224 qpps(ij) = aire(ij + ip1jm) * q(ij + ip1jm, l, iq) 86 225 ENDDO 226 qpn = SSUM(iim, qppn, 1) / apoln 227 qps = SSUM(iim, qpps, 1) / apols 228 229 DO ij = 1, iip1 230 q(ij, l, iq) = qpn 231 q(ij + ip1jm, l, iq) = qps 232 ENDDO 233 87 234 ENDDO 88 89 90 c ............ integration de ps .............. 91 92 CALL SCOPY(ip1jmp1*llm, masse, 1, massescr, 1) 93 94 DO ij = 1,ip1jmp1 95 pscr (ij) = ps(ij) 96 ps (ij) = psm1(ij) + dt * dp(ij) 97 ENDDO 98 c 99 DO ij = 1,ip1jmp1 100 IF( ps(ij)<0. ) THEN 101 write(lunout,*) "integrd: negative surface pressure ",ps(ij) 102 write(lunout,*) " at node ij =", ij 103 ! since ij=j+(i-1)*jjp1 , we have 104 j=modulo(ij,jjp1) 105 i=1+(ij-j)/jjp1 106 write(lunout,*) " lon = ",rlonv(i)*180./pi, " deg", 107 & " lat = ",rlatu(j)*180./pi, " deg" 108 CALL abort_gcm("integrd", "", 1) 109 ENDIF 110 ENDDO 111 c 112 DO ij = 1, iim 113 tppn(ij) = aire( ij ) * ps( ij ) 114 tpps(ij) = aire(ij+ip1jm) * ps(ij+ip1jm) 115 ENDDO 116 tpn = SSUM(iim,tppn,1)/apoln 117 tps = SSUM(iim,tpps,1)/apols 118 DO ij = 1, iip1 119 ps( ij ) = tpn 120 ps(ij+ip1jm) = tps 121 ENDDO 122 c 123 c ... Calcul de la nouvelle masse d'air au dernier temps integre t+1 ... 124 c 125 CALL pression ( ip1jmp1, ap, bp, ps, p ) 126 CALL massdair ( p , masse ) 127 128 ! Ehouarn : we don't use/need finvmaold and finvmasse, 129 ! so might as well not compute them 130 ! CALL SCOPY( ijp1llm , masse, 1, finvmasse, 1 ) 131 ! CALL filtreg( finvmasse, jjp1, llm, -2, 2, .TRUE., 1 ) 132 c 133 134 c ............ integration de ucov, vcov, h .............. 135 136 DO l = 1,llm 137 138 DO ij = iip2,ip1jm 139 uscr( ij ) = ucov( ij,l ) 140 ucov( ij,l ) = ucovm1( ij,l ) + dt * du( ij,l ) 141 ENDDO 142 143 DO ij = 1,ip1jm 144 vscr( ij ) = vcov( ij,l ) 145 vcov( ij,l ) = vcovm1( ij,l ) + dt * dv( ij,l ) 146 ENDDO 147 148 DO ij = 1,ip1jmp1 149 hscr( ij ) = teta(ij,l) 150 teta ( ij,l ) = tetam1(ij,l) * massem1(ij,l) / masse(ij,l) 151 & + dt * dteta(ij,l) / masse(ij,l) 152 ENDDO 153 154 c .... Calcul de la valeur moyenne, unique aux poles pour teta ...... 155 c 156 c 157 DO ij = 1, iim 158 tppn(ij) = aire( ij ) * teta( ij ,l) 159 tpps(ij) = aire(ij+ip1jm) * teta(ij+ip1jm,l) 160 ENDDO 161 tpn = SSUM(iim,tppn,1)/apoln 162 tps = SSUM(iim,tpps,1)/apols 163 164 DO ij = 1, iip1 165 teta( ij ,l) = tpn 166 teta(ij+ip1jm,l) = tps 167 ENDDO 168 c 169 170 IF(leapf) THEN 171 CALL SCOPY ( ip1jmp1, uscr(1), 1, ucovm1(1, l), 1 ) 172 CALL SCOPY ( ip1jm, vscr(1), 1, vcovm1(1, l), 1 ) 173 CALL SCOPY ( ip1jmp1, hscr(1), 1, tetam1(1, l), 1 ) 174 END IF 175 176 ENDDO ! of DO l = 1,llm 177 178 179 c 180 c ....... integration de q ...... 181 c 182 c$$$ IF( iadv(1).NE.3.AND.iadv(2).NE.3 ) THEN 183 c$$$c 184 c$$$ IF( forward .OR. leapf ) THEN 185 c$$$ DO iq = 1,2 186 c$$$ DO l = 1,llm 187 c$$$ DO ij = 1,ip1jmp1 188 c$$$ q(ij,l,iq) = ( q(ij,l,iq)*finvmaold(ij,l) + dtvr *dq(ij,l,iq) )/ 189 c$$$ $ finvmasse(ij,l) 190 c$$$ ENDDO 191 c$$$ ENDDO 192 c$$$ ENDDO 193 c$$$ ELSE 194 c$$$ DO iq = 1,2 195 c$$$ DO l = 1,llm 196 c$$$ DO ij = 1,ip1jmp1 197 c$$$ q( ij,l,iq ) = q( ij,l,iq ) * finvmaold(ij,l) / finvmasse(ij,l) 198 c$$$ ENDDO 199 c$$$ ENDDO 200 c$$$ ENDDO 201 c$$$ 202 c$$$ END IF 203 c$$$c 204 c$$$ ENDIF 205 206 if (planet_type=="earth") then 207 ! Earth-specific treatment of first 2 tracers (water) 208 DO l = 1, llm 209 DO ij = 1, ip1jmp1 210 deltap(ij,l) = p(ij,l) - p(ij,l+1) 211 ENDDO 212 ENDDO 213 214 CALL qminimum( q, nq, deltap ) 215 216 c 217 c ..... Calcul de la valeur moyenne, unique aux poles pour q ..... 218 c 219 220 DO iq = 1, nq 221 DO l = 1, llm 222 223 DO ij = 1, iim 224 qppn(ij) = aire( ij ) * q( ij ,l,iq) 225 qpps(ij) = aire(ij+ip1jm) * q(ij+ip1jm,l,iq) 226 ENDDO 227 qpn = SSUM(iim,qppn,1)/apoln 228 qps = SSUM(iim,qpps,1)/apols 229 230 DO ij = 1, iip1 231 q( ij ,l,iq) = qpn 232 q(ij+ip1jm,l,iq) = qps 233 ENDDO 234 235 ENDDO 236 ENDDO 237 238 ! Ehouarn: forget about finvmaold 239 ! CALL SCOPY( ijp1llm , finvmasse, 1, finvmaold, 1 ) 240 241 endif ! of if (planet_type.eq."earth") 242 c 243 c 244 c ..... FIN de l'integration de q ....... 245 246 c ................................................................. 247 248 249 IF( leapf ) THEN 250 CALL SCOPY ( ip1jmp1 , pscr , 1, psm1 , 1 ) 251 CALL SCOPY ( ip1jmp1*llm, massescr, 1, massem1, 1 ) 252 END IF 253 254 RETURN 255 END 235 ENDDO 236 237 ! Ehouarn: forget about finvmaold 238 ! CALL SCOPY( ijp1llm , finvmasse, 1, finvmaold, 1 ) 239 240 endif ! of if (planet_type.eq."earth") 241 ! 242 ! 243 ! ..... FIN de l'integration de q ....... 244 245 ! ................................................................. 246 247 IF(leapf) THEN 248 CALL SCOPY (ip1jmp1, pscr, 1, psm1, 1) 249 CALL SCOPY (ip1jmp1 * llm, massescr, 1, massem1, 1) 250 END IF 251 252 RETURN 253 END SUBROUTINE integrd
Note: See TracChangeset
for help on using the changeset viewer.