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