Changeset 667 for palm/trunk/SOURCE/init_3d_model.f90
- Timestamp:
- Dec 23, 2010 12:06:00 PM (13 years ago)
- Location:
- palm/trunk/SOURCE
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
palm/trunk/SOURCE
-
Property
svn:mergeinfo
set to
(toggle deleted branches)
/palm/branches/suehring 423-666 /palm/branches/letzel/masked_output/SOURCE 296-409
-
Property
svn:mergeinfo
set to
(toggle deleted branches)
-
palm/trunk/SOURCE/init_3d_model.f90
r631 r667 7 7 ! Current revisions: 8 8 ! ----------------- 9 ! Bugfix: type conversion of '1' to 64bit for the MAX function (ngp_3d_inner) 9 ! nxl-1, nxr+1, nys-1, nyn+1 replaced by nxlg, nxrg, nysg, nyng in loops and 10 ! allocation of arrays. Calls of exchange_horiz are modified. 11 ! Call ws_init to initialize arrays needed for statistical evaluation and 12 ! optimization when ws-scheme is used. 13 ! 14 ! 15 ! Initial volume flow is now calculated by using the variable hom_sum. 16 ! Therefore the correction of initial volume flow for non-flat topography 17 ! removed (removed u_nzb_p1_for_vfc and v_nzb_p1_for_vfc) 18 ! 19 ! Changed surface boundary conditions for u and v in case of ibc_uv_b == 0 from 20 ! mirror bc to dirichlet boundary conditions (u=v=0), so that k=nzb is 21 ! representative for the height z0 22 ! 23 ! Bugfix: type conversion of '1' to 64bit for the MAX function (ngp_3d_inner) 10 24 ! 11 25 ! Former revisions: … … 101 115 !------------------------------------------------------------------------------! 102 116 117 USE advec_ws 103 118 USE arrays_3d 104 119 USE averaging … … 147 162 ngp_2dh_s_inner(nzb:nzt+1,0:statistic_regions), & 148 163 ngp_2dh_s_inner_l(nzb:nzt+1,0:statistic_regions), & 149 rmask(nys -1:nyn+1,nxl-1:nxr+1,0:statistic_regions), &164 rmask(nysg:nyng,nxlg:nxrg,0:statistic_regions), & 150 165 sums(nzb:nzt+1,pr_palm+max_pr_user), & 151 166 sums_l(nzb:nzt+1,pr_palm+max_pr_user,0:threads_per_task-1), & … … 154 169 sums_wsts_bc_l(nzb:nzt+1,0:statistic_regions), & 155 170 ts_value(dots_max,0:statistic_regions) ) 156 ALLOCATE( km_damp_x(nxl -1:nxr+1), km_damp_y(nys-1:nyn+1) )157 158 ALLOCATE( rif_1(nys -1:nyn+1,nxl-1:nxr+1), shf_1(nys-1:nyn+1,nxl-1:nxr+1), &159 ts(nys -1:nyn+1,nxl-1:nxr+1), tswst_1(nys-1:nyn+1,nxl-1:nxr+1), &160 us(nys -1:nyn+1,nxl-1:nxr+1), usws_1(nys-1:nyn+1,nxl-1:nxr+1), &161 uswst_1(nys -1:nyn+1,nxl-1:nxr+1), &162 vsws_1(nys -1:nyn+1,nxl-1:nxr+1), &163 vswst_1(nys -1:nyn+1,nxl-1:nxr+1), z0(nys-1:nyn+1,nxl-1:nxr+1) )171 ALLOCATE( km_damp_x(nxlg:nxrg), km_damp_y(nysg:nyng) ) 172 173 ALLOCATE( rif_1(nysg:nyng,nxlg:nxrg), shf_1(nysg:nyng,nxlg:nxrg), & 174 ts(nysg:nyng,nxlg:nxrg), tswst_1(nysg:nyng,nxlg:nxrg), & 175 us(nysg:nyng,nxlg:nxrg), usws_1(nysg:nyng,nxlg:nxrg), & 176 uswst_1(nysg:nyng,nxlg:nxrg), & 177 vsws_1(nysg:nyng,nxlg:nxrg), & 178 vswst_1(nysg:nyng,nxlg:nxrg), z0(nysg:nyng,nxlg:nxrg) ) 164 179 165 180 IF ( timestep_scheme(1:5) /= 'runge' ) THEN 166 181 ! 167 182 !-- Leapfrog scheme needs two timelevels of diffusion quantities 168 ALLOCATE( rif_2(nys -1:nyn+1,nxl-1:nxr+1), &169 shf_2(nys -1:nyn+1,nxl-1:nxr+1), &170 tswst_2(nys -1:nyn+1,nxl-1:nxr+1), &171 usws_2(nys -1:nyn+1,nxl-1:nxr+1), &172 uswst_2(nys -1:nyn+1,nxl-1:nxr+1), &173 vswst_2(nys -1:nyn+1,nxl-1:nxr+1), &174 vsws_2(nys -1:nyn+1,nxl-1:nxr+1) )183 ALLOCATE( rif_2(nysg:nyng,nxlg:nxrg), & 184 shf_2(nysg:nyng,nxlg:nxrg), & 185 tswst_2(nysg:nyng,nxlg:nxrg), & 186 usws_2(nysg:nyng,nxlg:nxrg), & 187 uswst_2(nysg:nyng,nxlg:nxrg), & 188 vswst_2(nysg:nyng,nxlg:nxrg), & 189 vsws_2(nysg:nyng,nxlg:nxrg) ) 175 190 ENDIF 176 191 177 192 ALLOCATE( d(nzb+1:nzta,nys:nyna,nxl:nxra), & 178 e_1(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &179 e_2(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &180 e_3(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &181 kh_1(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &182 km_1(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &183 p(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &184 pt_1(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &185 pt_2(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &186 pt_3(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &187 tend(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &188 u_1(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &189 u_2(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &190 u_3(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &191 v_1(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &192 v_2(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &193 v_3(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &194 w_1(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &195 w_2(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &196 w_3(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1) )193 e_1(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 194 e_2(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 195 e_3(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 196 kh_1(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 197 km_1(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 198 p(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 199 pt_1(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 200 pt_2(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 201 pt_3(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 202 tend(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 203 u_1(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 204 u_2(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 205 u_3(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 206 v_1(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 207 v_2(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 208 v_3(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 209 w_1(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 210 w_2(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 211 w_3(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 197 212 198 213 IF ( timestep_scheme(1:5) /= 'runge' ) THEN 199 ALLOCATE( kh_2(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &200 km_2(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1) )214 ALLOCATE( kh_2(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 215 km_2(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 201 216 ENDIF 202 217 … … 204 219 ! 205 220 !-- 2D-humidity/scalar arrays 206 ALLOCATE ( qs(nys -1:nyn+1,nxl-1:nxr+1), &207 qsws_1(nys -1:nyn+1,nxl-1:nxr+1), &208 qswst_1(nys -1:nyn+1,nxl-1:nxr+1) )221 ALLOCATE ( qs(nysg:nyng,nxlg:nxrg), & 222 qsws_1(nysg:nyng,nxlg:nxrg), & 223 qswst_1(nysg:nyng,nxlg:nxrg) ) 209 224 210 225 IF ( timestep_scheme(1:5) /= 'runge' ) THEN 211 ALLOCATE( qsws_2(nys -1:nyn+1,nxl-1:nxr+1), &212 qswst_2(nys -1:nyn+1,nxl-1:nxr+1) )226 ALLOCATE( qsws_2(nysg:nyng,nxlg:nxrg), & 227 qswst_2(nysg:nyng,nxlg:nxrg) ) 213 228 ENDIF 214 229 ! 215 230 !-- 3D-humidity/scalar arrays 216 ALLOCATE( q_1(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &217 q_2(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &218 q_3(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1) )231 ALLOCATE( q_1(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 232 q_2(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 233 q_3(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 219 234 220 235 ! 221 236 !-- 3D-arrays needed for humidity only 222 237 IF ( humidity ) THEN 223 ALLOCATE( vpt_1(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1) )238 ALLOCATE( vpt_1(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 224 239 225 240 IF ( timestep_scheme(1:5) /= 'runge' ) THEN 226 ALLOCATE( vpt_2(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1) )241 ALLOCATE( vpt_2(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 227 242 ENDIF 228 243 … … 230 245 ! 231 246 !-- Liquid water content 232 ALLOCATE ( ql_1(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1) )247 ALLOCATE ( ql_1(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 233 248 ! 234 249 !-- Precipitation amount and rate (only needed if output is switched) 235 ALLOCATE( precipitation_amount(nys -1:nyn+1,nxl-1:nxr+1), &236 precipitation_rate(nys -1:nyn+1,nxl-1:nxr+1) )250 ALLOCATE( precipitation_amount(nysg:nyng,nxlg:nxrg), & 251 precipitation_rate(nysg:nyng,nxlg:nxrg) ) 237 252 ENDIF 238 253 … … 241 256 !-- Liquid water content, change in liquid water content, 242 257 !-- real volume of particles (with weighting), volume of particles 243 ALLOCATE ( ql_1(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &244 ql_2(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &245 ql_v(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &246 ql_vp(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1) )258 ALLOCATE ( ql_1(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 259 ql_2(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 260 ql_v(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 261 ql_vp(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 247 262 ENDIF 248 263 … … 252 267 253 268 IF ( ocean ) THEN 254 ALLOCATE( saswsb_1(nys -1:nyn+1,nxl-1:nxr+1), &255 saswst_1(nys -1:nyn+1,nxl-1:nxr+1) )256 ALLOCATE( prho_1(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &257 rho_1(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &258 sa_1(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &259 sa_2(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &260 sa_3(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1) )269 ALLOCATE( saswsb_1(nysg:nyng,nxlg:nxrg), & 270 saswst_1(nysg:nyng,nxlg:nxrg) ) 271 ALLOCATE( prho_1(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 272 rho_1(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 273 sa_1(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 274 sa_2(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 275 sa_3(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 261 276 prho => prho_1 262 277 rho => rho_1 ! routines calc_mean_profile and diffusion_e require 263 278 ! density to be apointer 264 279 IF ( humidity_remote ) THEN 265 ALLOCATE( qswst_remote(nys -1:nyn+1,nxl-1:nxr+1))280 ALLOCATE( qswst_remote(nysg:nyng,nxlg:nxrg)) 266 281 qswst_remote = 0.0 267 282 ENDIF … … 272 287 !-- particle velocities 273 288 IF ( use_sgs_for_particles ) THEN 274 ALLOCATE ( diss(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1) )289 ALLOCATE ( diss(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 275 290 ELSE 276 291 ALLOCATE ( diss(2,2,2) ) ! required because diss is used as a … … 288 303 !-- 3D-arrays for the leaf area density and the canopy drag coefficient 289 304 IF ( plant_canopy ) THEN 290 ALLOCATE ( lad_s(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &291 lad_u(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &292 lad_v(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &293 lad_w(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &294 cdc(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1) )305 ALLOCATE ( lad_s(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 306 lad_u(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 307 lad_v(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 308 lad_w(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 309 cdc(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 295 310 296 311 IF ( passive_scalar ) THEN 297 ALLOCATE ( sls(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &298 sec(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1) )312 ALLOCATE ( sls(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 313 sec(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 299 314 ENDIF 300 315 301 316 IF ( cthf /= 0.0 ) THEN 302 ALLOCATE ( lai(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1), &303 canopy_heat_flux(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1) )317 ALLOCATE ( lai(nzb:nzt+1,nysg:nyng,nxlg:nxrg), & 318 canopy_heat_flux(nzb:nzt+1,nysg:nyng,nxlg:nxrg) ) 304 319 ENDIF 305 320 … … 309 324 !-- 4D-array for storing the Rif-values at vertical walls 310 325 IF ( topography /= 'flat' ) THEN 311 ALLOCATE( rif_wall(nzb:nzt+1,nys -1:nyn+1,nxl-1:nxr+1,1:4) )326 ALLOCATE( rif_wall(nzb:nzt+1,nysg:nyng,nxlg:nxrg,1:4) ) 312 327 rif_wall = 0.0 313 ENDIF314 315 !316 !-- Velocities at nzb+1 needed for volume flow control317 IF ( conserve_volume_flow ) THEN318 ALLOCATE( u_nzb_p1_for_vfc(nys:nyn), v_nzb_p1_for_vfc(nxl:nxr) )319 u_nzb_p1_for_vfc = 0.0320 v_nzb_p1_for_vfc = 0.0321 328 ENDIF 322 329 … … 325 332 !-- are needed for radiation boundary conditions 326 333 IF ( outflow_l ) THEN 327 ALLOCATE( u_m_l(nzb:nzt+1,nys -1:nyn+1,1:2), &328 v_m_l(nzb:nzt+1,nys -1:nyn+1,0:1), &329 w_m_l(nzb:nzt+1,nys -1:nyn+1,0:1) )334 ALLOCATE( u_m_l(nzb:nzt+1,nysg:nyng,1:2), & 335 v_m_l(nzb:nzt+1,nysg:nyng,0:1), & 336 w_m_l(nzb:nzt+1,nysg:nyng,0:1) ) 330 337 ENDIF 331 338 IF ( outflow_r ) THEN 332 ALLOCATE( u_m_r(nzb:nzt+1,nys -1:nyn+1,nx-1:nx), &333 v_m_r(nzb:nzt+1,nys -1:nyn+1,nx-1:nx), &334 w_m_r(nzb:nzt+1,nys -1:nyn+1,nx-1:nx) )339 ALLOCATE( u_m_r(nzb:nzt+1,nysg:nyng,nx-1:nx), & 340 v_m_r(nzb:nzt+1,nysg:nyng,nx-1:nx), & 341 w_m_r(nzb:nzt+1,nysg:nyng,nx-1:nx) ) 335 342 ENDIF 336 343 IF ( outflow_l .OR. outflow_r ) THEN 337 ALLOCATE( c_u(nzb:nzt+1,nys -1:nyn+1), c_v(nzb:nzt+1,nys-1:nyn+1), &338 c_w(nzb:nzt+1,nys -1:nyn+1) )344 ALLOCATE( c_u(nzb:nzt+1,nysg:nyng), c_v(nzb:nzt+1,nysg:nyng), & 345 c_w(nzb:nzt+1,nysg:nyng) ) 339 346 ENDIF 340 347 IF ( outflow_s ) THEN 341 ALLOCATE( u_m_s(nzb:nzt+1,0:1,nxl -1:nxr+1), &342 v_m_s(nzb:nzt+1,1:2,nxl -1:nxr+1), &343 w_m_s(nzb:nzt+1,0:1,nxl -1:nxr+1) )348 ALLOCATE( u_m_s(nzb:nzt+1,0:1,nxlg:nxrg), & 349 v_m_s(nzb:nzt+1,1:2,nxlg:nxrg), & 350 w_m_s(nzb:nzt+1,0:1,nxlg:nxrg) ) 344 351 ENDIF 345 352 IF ( outflow_n ) THEN 346 ALLOCATE( u_m_n(nzb:nzt+1,ny-1:ny,nxl -1:nxr+1), &347 v_m_n(nzb:nzt+1,ny-1:ny,nxl -1:nxr+1), &348 w_m_n(nzb:nzt+1,ny-1:ny,nxl -1:nxr+1) )353 ALLOCATE( u_m_n(nzb:nzt+1,ny-1:ny,nxlg:nxrg), & 354 v_m_n(nzb:nzt+1,ny-1:ny,nxlg:nxrg), & 355 w_m_n(nzb:nzt+1,ny-1:ny,nxlg:nxrg) ) 349 356 ENDIF 350 357 IF ( outflow_s .OR. outflow_n ) THEN 351 ALLOCATE( c_u(nzb:nzt+1,nxl -1:nxr+1), c_v(nzb:nzt+1,nxl-1:nxr+1), &352 c_w(nzb:nzt+1,nxl -1:nxr+1) )358 ALLOCATE( c_u(nzb:nzt+1,nxlg:nxrg), c_v(nzb:nzt+1,nxlg:nxrg), & 359 c_w(nzb:nzt+1,nxlg:nxrg) ) 353 360 ENDIF 354 361 … … 435 442 ! 436 443 !-- Transfer initial profiles to the arrays of the 3D model 437 DO i = nxl -1, nxr+1438 DO j = nys -1, nyn+1444 DO i = nxlg, nxrg 445 DO j = nysg, nyng 439 446 e(:,j,i) = e1d 440 447 kh(:,j,i) = kh1d … … 447 454 448 455 IF ( humidity .OR. passive_scalar ) THEN 449 DO i = nxl -1, nxr+1450 DO j = nys -1, nyn+1456 DO i = nxlg, nxrg 457 DO j = nysg, nyng 451 458 q(:,j,i) = q_init 452 459 ENDDO … … 455 462 456 463 IF ( .NOT. constant_diffusion ) THEN 457 DO i = nxl -1, nxr+1458 DO j = nys -1, nyn+1464 DO i = nxlg, nxrg 465 DO j = nysg, nyng 459 466 e(:,j,i) = e1d 460 467 ENDDO … … 505 512 ENDDO 506 513 ENDDO 507 IF ( conserve_volume_flow ) THEN 508 IF ( nxr == nx ) THEN 509 DO j = nys, nyn 510 DO k = nzb + 1, nzb_u_inner(j,nx) 511 u_nzb_p1_for_vfc(j) = u_nzb_p1_for_vfc(j) + & 512 u1d(k) * dzu(k) 513 ENDDO 514 ENDDO 515 ENDIF 516 IF ( nyn == ny ) THEN 517 DO i = nxl, nxr 518 DO k = nzb + 1, nzb_v_inner(ny,i) 519 v_nzb_p1_for_vfc(i) = v_nzb_p1_for_vfc(i) + & 520 v1d(k) * dzu(k) 521 ENDDO 522 ENDDO 523 ENDIF 524 ENDIF 514 525 515 ! 526 516 !-- WARNING: The extra boundary conditions set after running the … … 530 520 !-- --------- advection scheme: keep u and v zero one layer below 531 521 !-- the topography. 532 IF ( ibc_uv_b == 0 ) THEN 533 ! 534 !-- Satisfying the Dirichlet condition with an extra layer below 535 !-- the surface where the u and v component change their sign. 536 DO i = nxl-1, nxr+1 537 DO j = nys-1, nyn+1 538 IF ( nzb_u_inner(j,i) == 0 ) u(0,j,i) = -u(1,j,i) 539 IF ( nzb_v_inner(j,i) == 0 ) v(0,j,i) = -v(1,j,i) 540 ENDDO 541 ENDDO 542 543 ELSE 522 ! 523 !-- Following was removed, because mirror boundary condition are 524 !-- replaced by dirichlet boundary conditions 525 ! 526 ! IF ( ibc_uv_b == 0 ) THEN 527 !! 528 !!-- Satisfying the Dirichlet condition with an extra layer below 529 !!-- the surface where the u and v component change their sign. 530 ! DO i = nxl-1, nxr+1 531 ! DO j = nys-1, nyn+1 532 ! IF ( nzb_u_inner(j,i) == 0 ) u(0,j,i) = -u(1,j,i) 533 ! IF ( nzb_v_inner(j,i) == 0 ) v(0,j,i) = -v(1,j,i) 534 ! ENDDO 535 ! ENDDO 536 ! 537 ! ELSE 538 IF ( ibc_uv_b == 1 ) THEN 544 539 ! 545 540 !-- Neumann condition … … 560 555 !-- Use constructed initial profiles (velocity constant with height, 561 556 !-- temperature profile with constant gradient) 562 DO i = nxl -1, nxr+1563 DO j = nys -1, nyn+1557 DO i = nxlg, nxrg 558 DO j = nysg, nyng 564 559 pt(:,j,i) = pt_init 565 560 u(:,j,i) = u_init … … 574 569 !-- in the limiting formula!). The original values are stored to be later 575 570 !-- used for volume flow control. 576 DO i = nxl -1, nxr+1577 DO j = nys -1, nyn+1571 DO i = nxlg, nxrg 572 DO j = nysg, nyng 578 573 u(nzb:nzb_u_inner(j,i)+1,j,i) = 0.0 579 574 v(nzb:nzb_v_inner(j,i)+1,j,i) = 0.0 580 575 ENDDO 581 576 ENDDO 582 IF ( conserve_volume_flow ) THEN583 IF ( nxr == nx ) THEN584 DO j = nys, nyn585 DO k = nzb + 1, nzb_u_inner(j,nx) + 1586 u_nzb_p1_for_vfc(j) = u_nzb_p1_for_vfc(j) + &587 u_init(k) * dzu(k)588 ENDDO589 ENDDO590 ENDIF591 IF ( nyn == ny ) THEN592 DO i = nxl, nxr593 DO k = nzb + 1, nzb_v_inner(ny,i) + 1594 v_nzb_p1_for_vfc(i) = v_nzb_p1_for_vfc(i) + &595 v_init(k) * dzu(k)596 ENDDO597 ENDDO598 ENDIF599 ENDIF600 577 601 578 IF ( humidity .OR. passive_scalar ) THEN 602 DO i = nxl -1, nxr+1603 DO j = nys -1, nyn+1579 DO i = nxlg, nxrg 580 DO j = nysg, nyng 604 581 q(:,j,i) = q_init 605 582 ENDDO … … 608 585 609 586 IF ( ocean ) THEN 610 DO i = nxl -1, nxr+1611 DO j = nys -1, nyn+1587 DO i = nxlg, nxrg 588 DO j = nysg, nyng 612 589 sa(:,j,i) = sa_init 613 590 ENDDO … … 660 637 661 638 ENDIF 639 ! 640 !-- Bottom boundary 641 IF ( ibc_uv_b == 0 .OR. ibc_uv_b == 2 ) THEN 642 u(nzb,:,:) = 0.0 643 v(nzb,:,:) = 0.0 644 ENDIF 662 645 663 646 ! … … 683 666 hom(:,1,5,:) = SPREAD( u(:,nys,nxl), 2, statistic_regions+1 ) 684 667 hom(:,1,6,:) = SPREAD( v(:,nys,nxl), 2, statistic_regions+1 ) 685 IF ( ibc_uv_b == 0 ) THEN 686 hom(nzb,1,5,:) = -hom(nzb+1,1,5,:) ! due to satisfying the Dirichlet 687 hom(nzb,1,6,:) = -hom(nzb+1,1,6,:) ! condition with an extra layer 688 ! below the surface where the u and v component change their sign 668 IF ( ibc_uv_b == 0 .OR. ibc_uv_b == 2) THEN 669 hom(nzb,1,5,:) = 0.0 670 hom(nzb,1,6,:) = 0.0 689 671 ENDIF 690 672 hom(:,1,7,:) = SPREAD( pt(:,nys,nxl), 2, statistic_regions+1 ) … … 733 715 !-- Over topography surface_heatflux is replaced by wall_heatflux(0) 734 716 IF ( TRIM( topography ) /= 'flat' ) THEN 735 DO i = nxl -1, nxr+1736 DO j = nys -1, nyn+1717 DO i = nxlg, nxrg 718 DO j = nysg, nyng 737 719 IF ( nzb_s_inner(j,i) /= 0 ) THEN 738 720 shf(j,i) = wall_heatflux(0) … … 755 737 IF ( TRIM( topography ) /= 'flat' ) THEN 756 738 wall_qflux = wall_humidityflux 757 DO i = nxl -1, nxr+1758 DO j = nys -1, nyn+1739 DO i = nxlg, nxrg 740 DO j = nysg, nyng 759 741 IF ( nzb_s_inner(j,i) /= 0 ) THEN 760 742 qsws(j,i) = wall_qflux(0) … … 827 809 ENDIF 828 810 829 !830 !-- Calculate the initial volume flow at the right and north boundary831 IF ( conserve_volume_flow ) THEN832 833 volume_flow_initial_l = 0.0834 volume_flow_area_l = 0.0835 836 IF ( nxr == nx ) THEN837 DO j = nys, nyn838 DO k = nzb_2d(j,nx) + 1, nzt839 volume_flow_initial_l(1) = volume_flow_initial_l(1) + &840 u(k,j,nx) * dzu(k)841 volume_flow_area_l(1) = volume_flow_area_l(1) + dzu(k)842 ENDDO843 !844 !-- Correction if velocity at nzb+1 has been set zero further above845 volume_flow_initial_l(1) = volume_flow_initial_l(1) + &846 u_nzb_p1_for_vfc(j)847 ENDDO848 ENDIF849 850 IF ( nyn == ny ) THEN851 DO i = nxl, nxr852 DO k = nzb_2d(ny,i) + 1, nzt853 volume_flow_initial_l(2) = volume_flow_initial_l(2) + &854 v(k,ny,i) * dzu(k)855 volume_flow_area_l(2) = volume_flow_area_l(2) + dzu(k)856 ENDDO857 !858 !-- Correction if velocity at nzb+1 has been set zero further above859 volume_flow_initial_l(2) = volume_flow_initial_l(2) + &860 v_nzb_p1_for_vfc(i)861 ENDDO862 ENDIF863 864 #if defined( __parallel )865 IF ( collective_wait ) CALL MPI_BARRIER( comm2d, ierr )866 CALL MPI_ALLREDUCE( volume_flow_initial_l(1), volume_flow_initial(1),&867 2, MPI_REAL, MPI_SUM, comm2d, ierr )868 IF ( collective_wait ) CALL MPI_BARRIER( comm2d, ierr )869 CALL MPI_ALLREDUCE( volume_flow_area_l(1), volume_flow_area(1), &870 2, MPI_REAL, MPI_SUM, comm2d, ierr )871 #else872 volume_flow_initial = volume_flow_initial_l873 volume_flow_area = volume_flow_area_l874 #endif875 !876 !-- In case of 'bulk_velocity' mode, volume_flow_initial is overridden877 !-- and calculated from u|v_bulk instead.878 IF ( TRIM( conserve_volume_flow_mode ) == 'bulk_velocity' ) THEN879 volume_flow_initial(1) = u_bulk * volume_flow_area(1)880 volume_flow_initial(2) = v_bulk * volume_flow_area(2)881 ENDIF882 883 ENDIF884 811 885 812 ! … … 968 895 sa_p = sa 969 896 ENDIF 970 897 971 898 972 899 ELSEIF ( TRIM( initializing_actions ) == 'read_restart_data' .OR. & 973 900 TRIM( initializing_actions ) == 'cyclic_fill' ) & 974 901 THEN 975 902 ! … … 978 905 IF ( TRIM( initializing_actions ) == 'cyclic_fill' ) THEN 979 906 980 WRITE (9,*) 'before read_parts_of_var_list'981 CALL local_flush( 9 )982 907 CALL read_parts_of_var_list 983 WRITE (9,*) 'after read_parts_of_var_list'984 CALL local_flush( 9 )985 908 CALL close_file( 13 ) 986 909 … … 1002 925 !-- conditions are used) 1003 926 IF ( inflow_l ) THEN 1004 DO j = nys -1, nyn+1927 DO j = nysg, nyng 1005 928 DO k = nzb, nzt+1 1006 u(k,j, -1) = mean_inflow_profiles(k,1)1007 v(k,j, -1) = mean_inflow_profiles(k,2)1008 w(k,j, -1) = 0.01009 pt(k,j, -1) = mean_inflow_profiles(k,4)1010 e(k,j, -1) = mean_inflow_profiles(k,5)929 u(k,j,nxlg:-1) = mean_inflow_profiles(k,1) 930 v(k,j,nxlg:-1) = mean_inflow_profiles(k,2) 931 w(k,j,nxlg:-1) = 0.0 932 pt(k,j,nxlg:-1) = mean_inflow_profiles(k,4) 933 e(k,j,nxlg:-1) = mean_inflow_profiles(k,5) 1011 934 ENDDO 1012 935 ENDDO … … 1064 987 ! 1065 988 !-- Read binary data from restart file 1066 WRITE (9,*) 'before read_3d_binary' 1067 CALL local_flush( 9 ) 989 1068 990 CALL read_3d_binary 1069 WRITE (9,*) 'after read_3d_binary'1070 CALL local_flush( 9 )1071 991 1072 992 ! … … 1074 994 IF ( TRIM( initializing_actions ) == 'cyclic_fill' .AND. & 1075 995 topography /= 'flat' ) THEN 1076 !1077 !-- Correction of initial volume flow1078 IF ( conserve_volume_flow ) THEN1079 IF ( nxr == nx ) THEN1080 DO j = nys, nyn1081 DO k = nzb + 1, nzb_u_inner(j,nx)1082 u_nzb_p1_for_vfc(j) = u_nzb_p1_for_vfc(j) + &1083 u(k,j,nx) * dzu(k)1084 ENDDO1085 ENDDO1086 ENDIF1087 IF ( nyn == ny ) THEN1088 DO i = nxl, nxr1089 DO k = nzb + 1, nzb_v_inner(ny,i)1090 v_nzb_p1_for_vfc(i) = v_nzb_p1_for_vfc(i) + &1091 v(k,ny,i) * dzu(k)1092 ENDDO1093 ENDDO1094 ENDIF1095 ENDIF1096 1097 996 ! 1098 997 !-- Inside buildings set velocities and TKE back to zero. … … 1100 999 !-- maybe revise later. 1101 1000 IF ( timestep_scheme(1:5) == 'runge' ) THEN 1102 DO i = nxl -1, nxr+11103 DO j = nys -1, nyn+11001 DO i = nxlg, nxrg 1002 DO j = nysg, nyng 1104 1003 u (nzb:nzb_u_inner(j,i),j,i) = 0.0 1105 1004 v (nzb:nzb_v_inner(j,i),j,i) = 0.0 … … 1118 1017 ENDDO 1119 1018 ELSE 1120 DO i = nxl -1, nxr+11121 DO j = nys -1, nyn+11019 DO i = nxlg, nxrg 1020 DO j = nysg, nyng 1122 1021 u (nzb:nzb_u_inner(j,i),j,i) = 0.0 1123 1022 v (nzb:nzb_v_inner(j,i),j,i) = 0.0 … … 1139 1038 1140 1039 ! 1141 !-- Calculate the initial volume flow at the right and north boundary1142 IF ( conserve_volume_flow .AND. &1143 TRIM( initializing_actions ) == 'cyclic_fill' ) THEN1144 1145 volume_flow_initial_l = 0.01146 volume_flow_area_l = 0.01147 1148 IF ( nxr == nx ) THEN1149 DO j = nys, nyn1150 DO k = nzb_2d(j,nx) + 1, nzt1151 volume_flow_initial_l(1) = volume_flow_initial_l(1) + &1152 u(k,j,nx) * dzu(k)1153 volume_flow_area_l(1) = volume_flow_area_l(1) + dzu(k)1154 ENDDO1155 !1156 !-- Correction if velocity inside buildings has been set to zero1157 !-- further above1158 volume_flow_initial_l(1) = volume_flow_initial_l(1) + &1159 u_nzb_p1_for_vfc(j)1160 ENDDO1161 ENDIF1162 1163 IF ( nyn == ny ) THEN1164 DO i = nxl, nxr1165 DO k = nzb_2d(ny,i) + 1, nzt1166 volume_flow_initial_l(2) = volume_flow_initial_l(2) + &1167 v(k,ny,i) * dzu(k)1168 volume_flow_area_l(2) = volume_flow_area_l(2) + dzu(k)1169 ENDDO1170 !1171 !-- Correction if velocity inside buildings has been set to zero1172 !-- further above1173 volume_flow_initial_l(2) = volume_flow_initial_l(2) + &1174 v_nzb_p1_for_vfc(i)1175 ENDDO1176 ENDIF1177 1178 #if defined( __parallel )1179 IF ( collective_wait ) CALL MPI_BARRIER( comm2d, ierr )1180 CALL MPI_ALLREDUCE( volume_flow_initial_l(1), volume_flow_initial(1),&1181 2, MPI_REAL, MPI_SUM, comm2d, ierr )1182 IF ( collective_wait ) CALL MPI_BARRIER( comm2d, ierr )1183 CALL MPI_ALLREDUCE( volume_flow_area_l(1), volume_flow_area(1), &1184 2, MPI_REAL, MPI_SUM, comm2d, ierr )1185 #else1186 volume_flow_initial = volume_flow_initial_l1187 volume_flow_area = volume_flow_area_l1188 #endif1189 ENDIF1190 1191 1192 !1193 1040 !-- Calculate initial temperature field and other constants used in case 1194 1041 !-- of a sloping surface … … 1243 1090 w_m_n(:,:,:) = w(:,ny-1:ny,:) 1244 1091 ENDIF 1245 1246 ENDIF 1247 1092 1093 ENDIF 1094 ! 1095 !-- Calculate the initial volume flow at the right and north boundary 1096 IF ( conserve_volume_flow ) THEN 1097 1098 volume_flow_initial_l = 0.0 1099 volume_flow_area_l = 0.0 1100 1101 IF ( TRIM( initializing_actions ) == 'cyclic_fill' ) THEN 1102 1103 IF ( nxr == nx ) THEN 1104 DO j = nys, nyn 1105 DO k = nzb_2d(j,nx) + 1, nzt 1106 volume_flow_initial_l(1) = volume_flow_initial_l(1) + & 1107 hom_sum(k,1,0) * dzw(k) 1108 volume_flow_area_l(1) = volume_flow_area_l(1) + dzw(k) 1109 ENDDO 1110 ENDDO 1111 ENDIF 1112 1113 IF ( nyn == ny ) THEN 1114 DO i = nxl, nxr 1115 DO k = nzb_2d(ny,i) + 1, nzt 1116 volume_flow_initial_l(2) = volume_flow_initial_l(2) + & 1117 hom_sum(k,2,0) * dzw(k) 1118 volume_flow_area_l(2) = volume_flow_area_l(2) + dzw(k) 1119 ENDDO 1120 ENDDO 1121 ENDIF 1122 1123 ELSEIF ( TRIM( initializing_actions ) /= 'read_restart_data' ) THEN 1124 1125 IF ( nxr == nx ) THEN 1126 DO j = nys, nyn 1127 DO k = nzb_2d(j,nx) + 1, nzt 1128 volume_flow_initial_l(1) = volume_flow_initial_l(1) + & 1129 u(k,j,nx) * dzw(k) 1130 volume_flow_area_l(1) = volume_flow_area_l(1) + dzw(k) 1131 ENDDO 1132 ENDDO 1133 ENDIF 1134 1135 IF ( nyn == ny ) THEN 1136 DO i = nxl, nxr 1137 DO k = nzb_2d(ny,i) + 1, nzt 1138 volume_flow_initial_l(2) = volume_flow_initial_l(2) + & 1139 v(k,ny,i) * dzw(k) 1140 volume_flow_area_l(2) = volume_flow_area_l(2) + dzw(k) 1141 ENDDO 1142 ENDDO 1143 ENDIF 1144 1145 ENDIF 1146 1147 #if defined( __parallel ) 1148 CALL MPI_ALLREDUCE( volume_flow_initial_l(1), volume_flow_initial(1),& 1149 2, MPI_REAL, MPI_SUM, comm2d, ierr ) 1150 CALL MPI_ALLREDUCE( volume_flow_area_l(1), volume_flow_area(1), & 1151 2, MPI_REAL, MPI_SUM, comm2d, ierr ) 1152 1153 CALL MPI_ALLREDUCE( volume_flow_initial_l(2), volume_flow_initial(2),& 1154 2, MPI_REAL, MPI_SUM, comm2d, ierr ) 1155 CALL MPI_ALLREDUCE( volume_flow_area_l(2), volume_flow_area(2), & 1156 2, MPI_REAL, MPI_SUM, comm2d, ierr ) 1157 1158 #else 1159 volume_flow_initial = volume_flow_initial_l 1160 volume_flow_area = volume_flow_area_l 1161 #endif 1162 1163 ! 1164 !-- In case of 'bulk_velocity' mode, volume_flow_initial is overridden 1165 !-- and calculated from u|v_bulk instead. 1166 IF ( TRIM( conserve_volume_flow_mode ) == 'bulk_velocity' ) THEN 1167 volume_flow_initial(1) = u_bulk * volume_flow_area(1) 1168 volume_flow_initial(2) = v_bulk * volume_flow_area(2) 1169 ENDIF 1170 1171 ENDIF 1248 1172 ! 1249 1173 !-- Initialization of the leaf area density … … 1254 1178 CASE( 'block' ) 1255 1179 1256 DO i = nxl -1, nxr+11257 DO j = nys -1, nyn+11180 DO i = nxlg, nxrg 1181 DO j = nysg, nyng 1258 1182 lad_s(:,j,i) = lad(:) 1259 1183 cdc(:,j,i) = drag_coefficient … … 1277 1201 END SELECT 1278 1202 1279 CALL exchange_horiz( lad_s )1280 CALL exchange_horiz( cdc )1203 CALL exchange_horiz( lad_s, nbgp ) 1204 CALL exchange_horiz( cdc, nbgp ) 1281 1205 1282 1206 IF ( passive_scalar ) THEN 1283 CALL exchange_horiz( sls )1284 CALL exchange_horiz( sec )1207 CALL exchange_horiz( sls, nbgp ) 1208 CALL exchange_horiz( sec, nbgp ) 1285 1209 ENDIF 1286 1210 … … 1311 1235 lad_w(nzt+1,:,:) = lad_w(nzt,:,:) 1312 1236 1313 CALL exchange_horiz( lad_u )1314 CALL exchange_horiz( lad_v )1315 CALL exchange_horiz( lad_w )1237 CALL exchange_horiz( lad_u, nbgp ) 1238 CALL exchange_horiz( lad_v, nbgp ) 1239 CALL exchange_horiz( lad_w, nbgp ) 1316 1240 1317 1241 ! … … 1322 1246 !-- integration of the leaf area density 1323 1247 lai(:,:,:) = 0.0 1324 DO i = nxl -1, nxr+11325 DO j = nys -1, nyn+11248 DO i = nxlg, nxrg 1249 DO j = nysg, nyng 1326 1250 DO k = pch_index-1, 0, -1 1327 1251 lai(k,j,i) = lai(k+1,j,i) + & … … 1339 1263 !-- Evaluation of the upward kinematic vertical heat flux within the 1340 1264 !-- canopy 1341 DO i = nxl -1, nxr+11342 DO j = nys -1, nyn+11265 DO i = nxlg, nxrg 1266 DO j = nysg, nyng 1343 1267 DO k = 0, pch_index 1344 1268 canopy_heat_flux(k,j,i) = cthf * & … … 1384 1308 !-- Initialize quantities for special advections schemes 1385 1309 CALL init_advec 1310 IF ( momentum_advec == 'ws-scheme' .OR. & 1311 scalar_advec == 'ws-scheme' ) CALL ws_init 1386 1312 1387 1313 ! … … 1439 1365 IF ( bc_lr == 'dirichlet/radiation' ) THEN 1440 1366 1441 DO i = nxl -1, nxr+11367 DO i = nxlg, nxrg 1442 1368 IF ( i >= nx - outflow_damping_width ) THEN 1443 1369 km_damp_x(i) = km_damp_max * MIN( 1.0, & … … 1452 1378 ELSEIF ( bc_lr == 'radiation/dirichlet' ) THEN 1453 1379 1454 DO i = nxl -1, nxr+11380 DO i = nxlg, nxrg 1455 1381 IF ( i <= outflow_damping_width ) THEN 1456 1382 km_damp_x(i) = km_damp_max * MIN( 1.0, & … … 1467 1393 IF ( bc_ns == 'dirichlet/radiation' ) THEN 1468 1394 1469 DO j = nys -1, nyn+11395 DO j = nysg, nyng 1470 1396 IF ( j >= ny - outflow_damping_width ) THEN 1471 1397 km_damp_y(j) = km_damp_max * MIN( 1.0, & … … 1480 1406 ELSEIF ( bc_ns == 'radiation/dirichlet' ) THEN 1481 1407 1482 DO j = nys -1, nyn+11408 DO j = nysg, nyng 1483 1409 IF ( j <= outflow_damping_width ) THEN 1484 1410 km_damp_y(j) = km_damp_max * MIN( 1.0, & … … 1594 1520 !-- buoyancy, etc. A zero value will occur for cases where all grid points of 1595 1521 !-- the respective subdomain lie below the surface topography 1596 ngp_2dh_outer = MAX( 1, ngp_2dh_outer(:,:) ) 1522 ngp_2dh_outer = MAX( 1, ngp_2dh_outer(:,:) ) 1597 1523 ngp_3d_inner = MAX( INT(1, KIND = SELECTED_INT_KIND( 18 )), & 1598 1524 ngp_3d_inner(:) ) 1599 ngp_2dh_s_inner = MAX( 1, ngp_2dh_s_inner(:,:) ) 1525 ngp_2dh_s_inner = MAX( 1, ngp_2dh_s_inner(:,:) ) 1600 1526 1601 1527 DEALLOCATE( ngp_2dh_l, ngp_2dh_outer_l, ngp_3d_inner_l, ngp_3d_inner_tmp )
Note: See TracChangeset
for help on using the changeset viewer.