Changeset 5246 for LMDZ6/trunk/libf/dyn3dmem/advect_new_loc.F90
- Timestamp:
- Oct 21, 2024, 2:58:45 PM (23 hours ago)
- File:
-
- 1 moved
Legend:
- Unmodified
- Added
- Removed
-
LMDZ6/trunk/libf/dyn3dmem/advect_new_loc.F90
r5245 r5246 2 2 ! $Header$ 3 3 ! 4 SUBROUTINE advect_new_loc(ucov,vcov,teta,w,massebx,masseby, 5 &du,dv,dteta)6 7 8 9 10 11 12 13 c=======================================================================14 c 15 cAuteurs: P. Le Van , Fr. Hourdin .16 c-------17 c 18 cObjet:19 c------20 c 21 c*************************************************************22 c.... calcul des termes d'advection vertic.pour u,v,teta,q ...23 c*************************************************************24 cces termes sont ajoutes a du,dv,dteta et dq .25 cModif F.Forget 03/94 : on retire q de advect26 c 27 c=======================================================================28 c-----------------------------------------------------------------------29 cDeclarations:30 c-------------31 32 33 34 35 36 cArguments:37 c----------38 39 REALvcov(ijb_v:ije_v,llm),ucov(ijb_u:ije_u,llm)40 REALteta(ijb_u:ije_u,llm)41 REALmassebx(ijb_u:ije_u,llm),masseby(ijb_v:ije_v,llm)42 REALw(ijb_u:ije_u,llm)43 REALdv(ijb_v:ije_v,llm),du(ijb_u:ije_u,llm)44 REALdteta(ijb_u:ije_u,llm)45 cLocal:46 c------47 48 REALwsur2(ijb_u:ije_u)49 REALunsaire2(ijb_u:ije_u), ge(ijb_u:ije_u)50 REALdeuxjour, ww, gt, uu, vv51 52 INTEGERij,l,ijb,ije53 54 REALSSUM55 56 57 58 c-----------------------------------------------------------------------59 c2. Calculs preliminaires:60 c-------------------------61 62 63 64 65 DO 1ij = 1, ip1jmp166 67 1 CONTINUE68 69 70 71 c------------------ -yy ----------------------------------------------72 c. Calcul de u73 74 c$OMP MASTER75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 c$OMP END MASTER102 c$OMP BARRIER103 104 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 105 106 107 108 109 110 111 112 cDO ij = iip2, ip1jmp1113 cuav(ij,l) = 0.25 * ( ucov(ij,l) + ucov(ij-iip1,l) )114 cENDDO115 116 cDO ij = iip2, ip1jm117 cuav(ij,l) = uav(ij,l) + uav(ij+iip1,l)118 cENDDO119 120 121 122 uav(ij,l)=0.25*(ucov(ij,l)+ucov(ij-iip1,l))123 .+0.25*(ucov(ij+iip1,l)+ucov(ij,l))124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 c$OMP END DO 140 ccall write_field3d_p('uav',reshape(uav,(/iip1,jjp1,llm/)))141 142 c------------------ -xx ----------------------------------------------143 c. Calcul de v144 145 146 147 148 149 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 c$OMP END DO171 ccall write_field3d_p('vav',reshape(vav,(/iip1,jjm,llm/)))172 173 c-----------------------------------------------------------------------174 c$OMP BARRIER175 176 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK)177 DO 20l = 1, llmm1178 179 180 c...... calcul de - w/2. au niveau l+1 .......181 182 183 184 185 DO 5ij = ijb, ije186 187 5 CONTINUE188 189 190 c..................... calcul pour du ..................191 192 193 194 195 196 197 DO 6ij = ijb ,ije-1198 ww = wsur2 ( ij ) + wsur2( ij+1 )199 200 201 202 6 CONTINUE203 204 c................. calcul pour dv .....................205 206 207 208 209 DO 8ij = ijb, ije210 211 212 213 214 8 CONTINUE215 216 c 217 218 c............................................................219 c............... calcul pour dh ...................220 c............................................................221 222 c---z223 ccalcul de - d( teta * w ) qu'on ajoute a dh224 c...............225 226 227 228 DO 15ij = ijb, ije229 230 231 232 15 CONTINUE233 234 cym ---> conser a voir plus tard235 236 cIF( conser) THEN237 c 238 cDO 17 ij = 1,ip1jmp1239 cge(ij) = wsur2(ij) * wsur2(ij) * unsaire2(ij)240 c17 CONTINUE241 cgt = SSUM( ip1jmp1,ge,1 )242 cgtot(l) = deuxjour * SQRT( gt/ip1jmp1 )243 cEND IF244 245 20 CONTINUE246 c$OMP END DO247 248 249 250 251 252 #ifdef DEBUG_IO 253 CALL WriteField_u('du_bis',du)4 SUBROUTINE advect_new_loc(ucov,vcov,teta,w,massebx,masseby, & 5 du,dv,dteta) 6 USE parallel_lmdz 7 USE write_field_loc 8 USE advect_new_mod 9 USE comconst_mod, ONLY: daysec 10 USE logic_mod, ONLY: conser 11 12 IMPLICIT NONE 13 !======================================================================= 14 ! 15 ! Auteurs: P. Le Van , Fr. Hourdin . 16 ! ------- 17 ! 18 ! Objet: 19 ! ------ 20 ! 21 ! ************************************************************* 22 ! .... calcul des termes d'advection vertic.pour u,v,teta,q ... 23 ! ************************************************************* 24 ! ces termes sont ajoutes a du,dv,dteta et dq . 25 ! Modif F.Forget 03/94 : on retire q de advect 26 ! 27 !======================================================================= 28 !----------------------------------------------------------------------- 29 ! Declarations: 30 ! ------------- 31 32 include "dimensions.h" 33 include "paramet.h" 34 include "comgeom.h" 35 36 ! Arguments: 37 ! ---------- 38 39 REAL :: vcov(ijb_v:ije_v,llm),ucov(ijb_u:ije_u,llm) 40 REAL :: teta(ijb_u:ije_u,llm) 41 REAL :: massebx(ijb_u:ije_u,llm),masseby(ijb_v:ije_v,llm) 42 REAL :: w(ijb_u:ije_u,llm) 43 REAL :: dv(ijb_v:ije_v,llm),du(ijb_u:ije_u,llm) 44 REAL :: dteta(ijb_u:ije_u,llm) 45 ! Local: 46 ! ------ 47 48 REAL :: wsur2(ijb_u:ije_u) 49 REAL :: unsaire2(ijb_u:ije_u), ge(ijb_u:ije_u) 50 REAL :: deuxjour, ww, gt, uu, vv 51 52 INTEGER :: ij,l,ijb,ije 53 EXTERNAL SSUM 54 REAL :: SSUM 55 56 57 58 !----------------------------------------------------------------------- 59 ! 2. Calculs preliminaires: 60 ! ------------------------- 61 62 IF (conser.AND.1==0) THEN 63 deuxjour = 2. * daysec 64 65 DO ij = 1, ip1jmp1 66 unsaire2(ij) = unsaire(ij) * unsaire(ij) 67 END DO 68 END IF 69 70 71 !------------------ -yy ---------------------------------------------- 72 ! . Calcul de u 73 74 !$OMP MASTER 75 ijb=ij_begin 76 ije=ij_end 77 if (pole_nord) ijb=ijb+iip1 78 if (pole_sud) ije=ije-iip1 79 80 DO ij=ijb,ije 81 du2(ij,1)=0. 82 du1(ij,llm)=0. 83 ENDDO 84 85 ijb=ij_begin 86 ije=ij_end 87 if (pole_sud) ije=ij_end-iip1 88 89 DO ij=ijb,ije 90 dv2(ij,1)=0. 91 dv1(ij,llm)=0. 92 ENDDO 93 94 ijb=ij_begin 95 ije=ij_end 96 97 DO ij=ijb,ije 98 dteta2(ij,1)=0. 99 dteta1(ij,llm)=0. 100 ENDDO 101 !$OMP END MASTER 102 !$OMP BARRIER 103 104 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 105 DO l=1,llm 106 107 ijb=ij_begin 108 ije=ij_end 109 if (pole_nord) ijb=ijb+iip1 110 if (pole_sud) ije=ije-iip1 111 112 ! DO ij = iip2, ip1jmp1 113 ! uav(ij,l) = 0.25 * ( ucov(ij,l) + ucov(ij-iip1,l) ) 114 ! ENDDO 115 116 ! DO ij = iip2, ip1jm 117 ! uav(ij,l) = uav(ij,l) + uav(ij+iip1,l) 118 ! ENDDO 119 120 DO ij = ijb, ije 121 122 uav(ij,l)=0.25*(ucov(ij,l)+ucov(ij-iip1,l)) & 123 +0.25*(ucov(ij+iip1,l)+ucov(ij,l)) 124 ENDDO 125 126 if (pole_nord) then 127 DO ij = 1, iip1 128 uav(ij ,l) = 0. 129 ENDDO 130 endif 131 132 if (pole_sud) then 133 DO ij = 1, iip1 134 uav(ip1jm+ij,l) = 0. 135 ENDDO 136 endif 137 138 ENDDO 139 !$OMP END DO 140 ! call write_field3d_p('uav',reshape(uav,(/iip1,jjp1,llm/))) 141 142 !------------------ -xx ---------------------------------------------- 143 ! . Calcul de v 144 145 ijb=ij_begin 146 ije=ij_end 147 if (pole_sud) ije=ij_end-iip1 148 149 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 150 DO l=1,llm 151 152 DO ij = ijb+1, ije 153 vav(ij,l) = 0.25 * ( vcov(ij,l) + vcov(ij-1,l) ) 154 ENDDO 155 156 DO ij = ijb,ije,iip1 157 vav(ij,l) = vav(ij+iim,l) 158 ENDDO 159 160 161 DO ij = ijb, ije-1 162 vav(ij,l) = vav(ij,l) + vav(ij+1,l) 163 ENDDO 164 165 DO ij = ijb, ije, iip1 166 vav(ij+iim,l) = vav(ij,l) 167 ENDDO 168 169 ENDDO 170 !$OMP END DO 171 ! call write_field3d_p('vav',reshape(vav,(/iip1,jjm,llm/))) 172 173 !----------------------------------------------------------------------- 174 !$OMP BARRIER 175 176 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 177 DO l = 1, llmm1 178 179 180 ! ...... calcul de - w/2. au niveau l+1 ....... 181 ijb=ij_begin 182 ije=ij_end+iip1 183 if (pole_sud) ije=ij_end 184 185 DO ij = ijb, ije 186 wsur2( ij ) = - 0.5 * w( ij,l+1 ) 187 END DO 188 189 190 ! ..................... calcul pour du .................. 191 192 ijb=ij_begin 193 ije=ij_end 194 if (pole_nord) ijb=ijb+iip1 195 if (pole_sud) ije=ije-iip1 196 197 DO ij = ijb ,ije-1 198 ww = wsur2 ( ij ) + wsur2( ij+1 ) 199 uu = 0.5 * ( ucov(ij,l) + ucov(ij,l+1) ) 200 du1(ij,l) = ww * ( uu - uav(ij, l ) )/massebx(ij, l ) 201 du2(ij,l+1)= ww * ( uu - uav(ij,l+1) )/massebx(ij,l+1) 202 END DO 203 204 ! ................. calcul pour dv ..................... 205 ijb=ij_begin 206 ije=ij_end 207 if (pole_sud) ije=ij_end-iip1 208 209 DO ij = ijb, ije 210 ww = wsur2( ij+iip1 ) + wsur2( ij ) 211 vv = 0.5 * ( vcov(ij,l) + vcov(ij,l+1) ) 212 dv1(ij,l) = ww * (vv - vav(ij, l ) )/masseby(ij, l ) 213 dv2(ij,l+1)= ww * (vv - vav(ij,l+1) )/masseby(ij,l+1) 214 END DO 215 216 ! 217 218 ! ............................................................ 219 ! ............... calcul pour dh ................... 220 ! ............................................................ 221 222 ! ---z 223 ! calcul de - d( teta * w ) qu'on ajoute a dh 224 ! ............... 225 ijb=ij_begin 226 ije=ij_end 227 228 DO ij = ijb, ije 229 ww = wsur2(ij) * (teta(ij,l) + teta(ij,l+1) ) 230 dteta1(ij, l ) = ww 231 dteta2(ij,l+1) = ww 232 END DO 233 234 ! ym ---> conser a voir plus tard 235 236 ! IF( conser) THEN 237 ! 238 ! DO 17 ij = 1,ip1jmp1 239 ! ge(ij) = wsur2(ij) * wsur2(ij) * unsaire2(ij) 240 ! 17 CONTINUE 241 ! gt = SSUM( ip1jmp1,ge,1 ) 242 ! gtot(l) = deuxjour * SQRT( gt/ip1jmp1 ) 243 ! END IF 244 245 END DO 246 !$OMP END DO 247 248 ijb=ij_begin 249 ije=ij_end 250 if (pole_nord) ijb=ijb+iip1 251 if (pole_sud) ije=ije-iip1 252 #ifdef DEBUG_IO 253 CALL WriteField_u('du_bis',du) 254 254 #endif 255 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 256 257 258 259 260 261 262 263 ENDDO264 265 c$OMP END DO NOWAIT266 #ifdef DEBUG_IO 267 CALL WriteField_u('du1',du1)268 CALL WriteField_u('du2',du2)269 CALL WriteField_u('du_bis',du)255 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 256 DO l=1,llm 257 DO ij=ijb,ije-1 258 du(ij,l)=du(ij,l)+du2(ij,l)-du1(ij,l) 259 ENDDO 260 261 DO ij = ijb+iip1-1, ije, iip1 262 du( ij, l ) = du( ij -iim, l ) 263 ENDDO 264 ENDDO 265 !$OMP END DO NOWAIT 266 #ifdef DEBUG_IO 267 CALL WriteField_u('du1',du1) 268 CALL WriteField_u('du2',du2) 269 CALL WriteField_u('du_bis',du) 270 270 #endif 271 272 273 274 275 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 276 277 278 279 280 281 c$OMP END DO NOWAIT 282 283 284 285 c$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 286 287 288 289 290 291 c$OMP END DO NOWAIT 292 293 294 END 271 ijb=ij_begin 272 ije=ij_end 273 if (pole_sud) ije=ij_end-iip1 274 275 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 276 DO l=1,llm 277 DO ij=ijb,ije 278 dv(ij,l)=dv(ij,l)+dv2(ij,l)-dv1(ij,l) 279 ENDDO 280 ENDDO 281 !$OMP END DO NOWAIT 282 ijb=ij_begin 283 ije=ij_end 284 285 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK) 286 DO l=1,llm 287 DO ij=ijb,ije 288 dteta(ij,l)=dteta(ij,l)+dteta2(ij,l)-dteta1(ij,l) 289 ENDDO 290 ENDDO 291 !$OMP END DO NOWAIT 292 293 RETURN 294 END SUBROUTINE advect_new_loc
Note: See TracChangeset
for help on using the changeset viewer.