Changeset 5103 for LMDZ6/branches/Amaury_dev/libf/dyn3d/advect.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/advect.F90
r5102 r5103 1 2 1 ! $Header$ 3 2 4 SUBROUTINE advect(ucov,vcov,teta,w,massebx,masseby,du,dv,dteta)3 SUBROUTINE advect(ucov, vcov, teta, w, massebx, masseby, du, dv, dteta) 5 4 6 USE comconst_mod, ONLY: daysec 7 USE logic_mod, ONLY: conser 8 USE ener_mod, ONLY: gtot 9 10 IMPLICIT NONE 11 c======================================================================= 12 c 13 c Auteurs: P. Le Van , Fr. Hourdin . 14 c ------- 15 c 16 c Objet: 17 c ------ 18 c 19 c ************************************************************* 20 c .... calcul des termes d'advection vertic.pour u,v,teta,q ... 21 c ************************************************************* 22 c ces termes sont ajoutes a du,dv,dteta et dq . 23 c Modif F.Forget 03/94 : on retire q de advect 24 c 25 c======================================================================= 26 c----------------------------------------------------------------------- 27 c Declarations: 28 c ------------- 5 USE comconst_mod, ONLY: daysec 6 USE logic_mod, ONLY: conser 7 USE ener_mod, ONLY: gtot 29 8 30 include "dimensions.h" 31 include "paramet.h" 32 include "comgeom.h" 9 IMPLICIT NONE 10 !======================================================================= 11 ! 12 ! Auteurs: P. Le Van , Fr. Hourdin . 13 ! ------- 14 ! 15 ! Objet: 16 ! ------ 17 ! 18 ! ************************************************************* 19 ! .... calcul des termes d'advection vertic.pour u,v,teta,q ... 20 ! ************************************************************* 21 ! ces termes sont ajoutes a du,dv,dteta et dq . 22 ! Modif F.Forget 03/94 : on retire q de advect 23 ! 24 !======================================================================= 25 !----------------------------------------------------------------------- 26 ! Declarations: 27 ! ------------- 33 28 34 c Arguments: 35 c ---------- 29 include "dimensions.h" 30 include "paramet.h" 31 include "comgeom.h" 36 32 37 REAL vcov(ip1jm,llm),ucov(ip1jmp1,llm),teta(ip1jmp1,llm) 38 REAL massebx(ip1jmp1,llm),masseby(ip1jm,llm),w(ip1jmp1,llm) 39 REAL dv(ip1jm,llm),du(ip1jmp1,llm),dteta(ip1jmp1,llm) 33 ! Arguments: 34 ! ---------- 40 35 41 c Local: 42 c ------ 36 REAL :: vcov(ip1jm, llm), ucov(ip1jmp1, llm), teta(ip1jmp1, llm) 37 REAL :: massebx(ip1jmp1, llm), masseby(ip1jm, llm), w(ip1jmp1, llm) 38 REAL :: dv(ip1jm, llm), du(ip1jmp1, llm), dteta(ip1jmp1, llm) 43 39 44 REAL uav(ip1jmp1,llm),vav(ip1jm,llm),wsur2(ip1jmp1) 45 REAL unsaire2(ip1jmp1), ge(ip1jmp1) 46 REAL deuxjour, ww, gt, uu, vv 40 ! Local: 41 ! ------ 47 42 48 INTEGER ij,l 43 REAL :: uav(ip1jmp1, llm), vav(ip1jm, llm), wsur2(ip1jmp1) 44 REAL :: unsaire2(ip1jmp1), ge(ip1jmp1) 45 REAL :: deuxjour, ww, gt, uu, vv 49 46 50 REAL SSUM47 INTEGER :: ij, l 51 48 52 c----------------------------------------------------------------------- 53 c 2. Calculs preliminaires: 54 c ------------------------- 49 REAL :: SSUM 55 50 56 IF (conser) THEN 57 deuxjour = 2. * daysec 51 !----------------------------------------------------------------------- 52 ! 2. Calculs preliminaires: 53 ! ------------------------- 58 54 59 DO ij = 1, ip1jmp1 60 unsaire2(ij) = unsaire(ij) * unsaire(ij) 61 END DO 62 END IF 55 IF (conser) THEN 56 deuxjour = 2. * daysec 57 58 DO ij = 1, ip1jmp1 59 unsaire2(ij) = unsaire(ij) * unsaire(ij) 60 END DO 61 END IF 63 62 64 63 65 c------------------ -yy ----------------------------------------------66 c. Calcul de u64 !------------------ -yy ---------------------------------------------- 65 ! . Calcul de u 67 66 68 DO l=1,llm69 DO ij= iip2, ip1jmp170 uav(ij,l) = 0.25 * ( ucov(ij,l) + ucov(ij-iip1,l))71 72 DO ij= iip2, ip1jm73 uav(ij,l) = uav(ij,l) + uav(ij+iip1,l)74 75 DO ij= 1, iip176 uav(ij ,l) = 0.77 uav(ip1jm+ij,l) = 0.78 79 67 DO l = 1, llm 68 DO ij = iip2, ip1jmp1 69 uav(ij, l) = 0.25 * (ucov(ij, l) + ucov(ij - iip1, l)) 70 ENDDO 71 DO ij = iip2, ip1jm 72 uav(ij, l) = uav(ij, l) + uav(ij + iip1, l) 73 ENDDO 74 DO ij = 1, iip1 75 uav(ij, l) = 0. 76 uav(ip1jm + ij, l) = 0. 77 ENDDO 78 ENDDO 80 79 81 c------------------ -xx ----------------------------------------------82 c. Calcul de v80 !------------------ -xx ---------------------------------------------- 81 ! . Calcul de v 83 82 84 DO l=1,llm85 DO ij= 2, ip1jm86 vav(ij,l) = 0.25 * ( vcov(ij,l) + vcov(ij-1,l))87 88 DO ij = 1,ip1jm,iip189 vav(ij,l) = vav(ij+iim,l)90 91 DO ij = 1, ip1jm-192 vav(ij,l) = vav(ij,l) + vav(ij+1,l)93 94 DO ij= 1, ip1jm, iip195 vav(ij+iim,l) = vav(ij,l)96 97 83 DO l = 1, llm 84 DO ij = 2, ip1jm 85 vav(ij, l) = 0.25 * (vcov(ij, l) + vcov(ij - 1, l)) 86 ENDDO 87 DO ij = 1, ip1jm, iip1 88 vav(ij, l) = vav(ij + iim, l) 89 ENDDO 90 DO ij = 1, ip1jm - 1 91 vav(ij, l) = vav(ij, l) + vav(ij + 1, l) 92 ENDDO 93 DO ij = 1, ip1jm, iip1 94 vav(ij + iim, l) = vav(ij, l) 95 ENDDO 96 ENDDO 98 97 99 c-----------------------------------------------------------------------98 !----------------------------------------------------------------------- 100 99 101 c 102 100 ! 101 DO l = 1, llmm1 103 102 104 103 105 c...... calcul de - w/2. au niveau l+1 .......104 ! ...... calcul de - w/2. au niveau l+1 ....... 106 105 107 DO ij= 1, ip1jmp1108 wsur2( ij ) = - 0.5 * w( ij,l+1)109 106 DO ij = 1, ip1jmp1 107 wsur2(ij) = - 0.5 * w(ij, l + 1) 108 END DO 110 109 111 110 112 c..................... calcul pour du ..................111 ! ..................... calcul pour du .................. 113 112 114 DO ij = iip2 ,ip1jm-1 115 ww = wsur2 ( ij ) + wsur2( ij+1 ) 116 uu = 0.5 * ( ucov(ij,l) + ucov(ij,l+1) ) 117 du(ij,l) = du(ij,l) - ww * ( uu - uav(ij, l ) )/massebx(ij, l ) 118 du(ij,l+1)= du(ij,l+1) + ww * ( uu - uav(ij,l+1) )/massebx(ij,l+1) 113 DO ij = iip2, ip1jm - 1 114 ww = wsur2 (ij) + wsur2(ij + 1) 115 uu = 0.5 * (ucov(ij, l) + ucov(ij, l + 1)) 116 du(ij, l) = du(ij, l) - ww * (uu - uav(ij, l)) / massebx(ij, l) 117 du(ij, l + 1) = du(ij, l + 1) + ww * (uu - uav(ij, l + 1)) / massebx(ij, l + 1) 118 END DO 119 120 ! ..... correction pour du(iip1,j,l) ........ 121 ! ..... du(iip1,j,l)= du(1,j,l) ..... 122 123 !DIR$ IVDEP 124 DO ij = iip1 + iip1, ip1jm, iip1 125 du(ij, l) = du(ij - iim, l) 126 du(ij, l + 1) = du(ij - iim, l + 1) 127 END DO 128 129 ! ................. calcul pour dv ..................... 130 131 DO ij = 1, ip1jm 132 ww = wsur2(ij + iip1) + wsur2(ij) 133 vv = 0.5 * (vcov(ij, l) + vcov(ij, l + 1)) 134 dv(ij, l) = dv(ij, l) - ww * (vv - vav(ij, l)) / masseby(ij, l) 135 dv(ij, l + 1) = dv(ij, l + 1) + ww * (vv - vav(ij, l + 1)) / masseby(ij, l + 1) 136 END DO 137 138 ! 139 140 ! ............................................................ 141 ! ............... calcul pour dh ................... 142 ! ............................................................ 143 144 ! ---z 145 ! calcul de - d( teta * w ) qu'on ajoute a dh 146 ! ............... 147 148 DO ij = 1, ip1jmp1 149 ww = wsur2(ij) * (teta(ij, l) + teta(ij, l + 1)) 150 dteta(ij, l) = dteta(ij, l) - ww 151 dteta(ij, l + 1) = dteta(ij, l + 1) + ww 152 END DO 153 154 IF(conser) THEN 155 DO ij = 1, ip1jmp1 156 ge(ij) = wsur2(ij) * wsur2(ij) * unsaire2(ij) 119 157 END DO 158 gt = SSUM(ip1jmp1, ge, 1) 159 gtot(l) = deuxjour * SQRT(gt / ip1jmp1) 160 END IF 120 161 121 c ..... correction pour du(iip1,j,l) ........ 122 c ..... du(iip1,j,l)= du(1,j,l) ..... 162 END DO 123 163 124 CDIR$ IVDEP 125 DO ij = iip1 +iip1, ip1jm, iip1 126 du( ij, l ) = du( ij -iim, l ) 127 du( ij,l+1 ) = du( ij -iim,l+1 ) 128 END DO 129 130 c ................. calcul pour dv ..................... 131 132 DO ij = 1, ip1jm 133 ww = wsur2( ij+iip1 ) + wsur2( ij ) 134 vv = 0.5 * ( vcov(ij,l) + vcov(ij,l+1) ) 135 dv(ij,l) = dv(ij, l ) - ww * (vv - vav(ij, l ) )/masseby(ij, l ) 136 dv(ij,l+1)= dv(ij,l+1) + ww * (vv - vav(ij,l+1) )/masseby(ij,l+1) 137 END DO 138 139 c 140 141 c ............................................................ 142 c ............... calcul pour dh ................... 143 c ............................................................ 144 145 c ---z 146 c calcul de - d( teta * w ) qu'on ajoute a dh 147 c ............... 148 149 DO ij = 1, ip1jmp1 150 ww = wsur2(ij) * (teta(ij,l) + teta(ij,l+1) ) 151 dteta(ij, l ) = dteta(ij, l ) - ww 152 dteta(ij,l+1) = dteta(ij,l+1) + ww 153 END DO 154 155 IF( conser) THEN 156 DO ij = 1,ip1jmp1 157 ge(ij) = wsur2(ij) * wsur2(ij) * unsaire2(ij) 158 END DO 159 gt = SSUM( ip1jmp1,ge,1 ) 160 gtot(l) = deuxjour * SQRT( gt/ip1jmp1 ) 161 END IF 162 163 END DO 164 165 RETURN 166 END 164 RETURN 165 END SUBROUTINE advect
Note: See TracChangeset
for help on using the changeset viewer.