Changeset 1128 for palm/trunk/SOURCE/time_integration.f90
- Timestamp:
- Apr 12, 2013 6:19:32 AM (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
palm/trunk/SOURCE/time_integration.f90
r1116 r1128 20 20 ! Current revisions: 21 21 ! ------------------ 22 ! 22 ! asynchronous transfer of ghost point data realized for acc-optimized version: 23 ! prognostic_equations are first called two times for those points required for 24 ! the left-right and north-south exchange, respectively, and then for the 25 ! remaining points, 26 ! those parts requiring global communication moved from prognostic_equations to 27 ! here 23 28 ! 24 29 ! Former revisions: … … 134 139 !------------------------------------------------------------------------------! 135 140 141 USE advec_ws 136 142 USE arrays_3d 137 143 USE averaging 144 USE buoyancy_mod 138 145 USE control_parameters 139 146 USE cpulog … … 147 154 USE particle_attributes 148 155 USE pegrid 156 USE production_e_mod 149 157 USE prognostic_equations_mod 150 158 USE statistics … … 212 220 !-- on the timestep scheme 213 221 CALL timestep_scheme_steering 222 223 ! 224 !-- Calculate those variables needed in the tendency terms which need 225 !-- global communication 226 IF ( .NOT. neutral ) CALL calc_mean_profile( pt, 4 ) 227 IF ( ocean ) CALL calc_mean_profile( rho, 64 ) 228 IF ( humidity ) CALL calc_mean_profile( vpt, 44 ) 229 IF ( .NOT. constant_diffusion ) CALL production_e_init 230 IF ( ( ws_scheme_mom .OR. ws_scheme_sca ) .AND. & 231 intermediate_timestep_count == 1 ) CALL ws_statistics 214 232 215 233 ! … … 224 242 CALL prognostic_equations_vector 225 243 ELSEIF ( loop_optimization == 'acc' ) THEN 244 ! i_left = nxl; i_right = nxr 245 ! j_south = nys; j_north = nyn 246 ! CALL prognostic_equations_acc 247 248 i_left = nxl; i_right = nxl+nbgp-1 249 j_south = nys; j_north = nyn 226 250 CALL prognostic_equations_acc 251 i_left = nxr-nbgp+1; i_right = nxr 252 j_south = nys; j_north = nyn 253 CALL prognostic_equations_acc 254 255 ! 256 !-- Exchange of ghost points (lateral boundary conditions) 257 IF ( background_communication ) THEN 258 259 CALL cpu_log( log_point(26), 'exchange-horiz-progn', 'start' ) 260 261 send_receive = 'lr' 262 sendrecv_in_background = .TRUE. 263 req = 0 264 req_count = 0 265 266 IF ( numprocs == 1 ) THEN ! workaround for single-core GPU runs 267 on_device = .TRUE. ! to be removed after complete porting 268 ELSE ! of ghost point exchange 269 !$acc update host( e_p, pt_p, u_p, v_p, w_p ) 270 ENDIF 271 272 CALL exchange_horiz( u_p, nbgp ) 273 CALL exchange_horiz( v_p, nbgp ) 274 CALL exchange_horiz( w_p, nbgp ) 275 CALL exchange_horiz( pt_p, nbgp ) 276 IF ( .NOT. constant_diffusion ) CALL exchange_horiz( e_p, nbgp ) 277 IF ( ocean ) THEN 278 CALL exchange_horiz( sa_p, nbgp ) 279 CALL exchange_horiz( rho, nbgp ) 280 CALL exchange_horiz( prho, nbgp ) 281 ENDIF 282 IF (humidity .OR. passive_scalar) THEN 283 CALL exchange_horiz( q_p, nbgp ) 284 IF ( cloud_physics .AND. icloud_scheme == 0 ) THEN 285 CALL exchange_horiz( qr_p, nbgp ) 286 CALL exchange_horiz( nr_p, nbgp ) 287 ENDIF 288 ENDIF 289 IF ( cloud_droplets ) THEN 290 CALL exchange_horiz( ql, nbgp ) 291 CALL exchange_horiz( ql_c, nbgp ) 292 CALL exchange_horiz( ql_v, nbgp ) 293 CALL exchange_horiz( ql_vp, nbgp ) 294 ENDIF 295 IF ( wang_kernel .OR. turbulence ) CALL exchange_horiz( diss, nbgp ) 296 297 IF ( numprocs == 1 ) THEN ! workaround for single-core GPU runs 298 on_device = .FALSE. ! to be removed after complete porting 299 ELSE ! of ghost point exchange 300 !$acc update device( e_p, pt_p, u_p, v_p, w_p ) 301 ENDIF 302 303 sendrecv_in_background = .FALSE. 304 305 CALL cpu_log( log_point(26), 'exchange-horiz-progn', 'pause' ) 306 307 ENDIF 308 309 i_left = nxl+nbgp; i_right = nxr-nbgp 310 j_south = nys; j_north = nys+nbgp-1 311 CALL prognostic_equations_acc 312 i_left = nxl+nbgp; i_right = nxr-nbgp 313 j_south = nyn-nbgp+1; j_north = nyn 314 CALL prognostic_equations_acc 315 316 IF ( background_communication ) THEN 317 CALL cpu_log( log_point(41), 'exchange-horiz-wait', 'start' ) 318 #if defined( __parallel ) 319 CALL MPI_WAITALL( req_count, req, wait_stat, ierr ) 320 #endif 321 CALL cpu_log( log_point(41), 'exchange-horiz-wait', 'pause' ) 322 323 CALL cpu_log( log_point(26), 'exchange-horiz-progn', 'continue' ) 324 325 send_receive = 'ns' 326 sendrecv_in_background = .TRUE. 327 req = 0 328 req_count = 0 329 330 IF ( numprocs == 1 ) THEN ! workaround for single-core GPU runs 331 on_device = .TRUE. ! to be removed after complete porting 332 ELSE ! of ghost point exchange 333 !$acc update host( e_p, pt_p, u_p, v_p, w_p ) 334 ENDIF 335 336 CALL exchange_horiz( u_p, nbgp ) 337 CALL exchange_horiz( v_p, nbgp ) 338 CALL exchange_horiz( w_p, nbgp ) 339 CALL exchange_horiz( pt_p, nbgp ) 340 IF ( .NOT. constant_diffusion ) CALL exchange_horiz( e_p, nbgp ) 341 IF ( ocean ) THEN 342 CALL exchange_horiz( sa_p, nbgp ) 343 CALL exchange_horiz( rho, nbgp ) 344 CALL exchange_horiz( prho, nbgp ) 345 ENDIF 346 IF (humidity .OR. passive_scalar) THEN 347 CALL exchange_horiz( q_p, nbgp ) 348 IF ( cloud_physics .AND. icloud_scheme == 0 ) THEN 349 CALL exchange_horiz( qr_p, nbgp ) 350 CALL exchange_horiz( nr_p, nbgp ) 351 ENDIF 352 ENDIF 353 IF ( cloud_droplets ) THEN 354 CALL exchange_horiz( ql, nbgp ) 355 CALL exchange_horiz( ql_c, nbgp ) 356 CALL exchange_horiz( ql_v, nbgp ) 357 CALL exchange_horiz( ql_vp, nbgp ) 358 ENDIF 359 IF ( wang_kernel .OR. turbulence ) CALL exchange_horiz( diss, nbgp ) 360 361 IF ( numprocs == 1 ) THEN ! workaround for single-core GPU runs 362 on_device = .FALSE. ! to be removed after complete porting 363 ELSE ! of ghost point exchange 364 !$acc update device( e_p, pt_p, u_p, v_p, w_p ) 365 ENDIF 366 367 sendrecv_in_background = .FALSE. 368 369 CALL cpu_log( log_point(26), 'exchange-horiz-progn', 'stop' ) 370 371 ENDIF 372 373 i_left = nxl+nbgp; i_right = nxr-nbgp 374 j_south = nys+nbgp; j_north = nyn-nbgp 375 CALL prognostic_equations_acc 376 377 IF ( background_communication ) THEN 378 CALL cpu_log( log_point(41), 'exchange-horiz-wait', 'continue' ) 379 #if defined( __parallel ) 380 CALL MPI_WAITALL( req_count, req, wait_stat, ierr ) 381 #endif 382 send_receive = 'al' 383 CALL cpu_log( log_point(41), 'exchange-horiz-wait', 'stop' ) 384 ENDIF 385 227 386 ENDIF 228 387 … … 230 389 !-- Particle transport/physics with the Lagrangian particle model 231 390 !-- (only once during intermediate steps, because it uses an Euler-step) 391 !-- ### particle model should be moved before prognostic_equations, in order 392 !-- to regard droplet interactions directly 232 393 IF ( particle_advection .AND. & 233 394 simulated_time >= particle_advection_start .AND. & … … 249 410 ! 250 411 !-- Exchange of ghost points (lateral boundary conditions) 251 CALL cpu_log( log_point(26), 'exchange-horiz-progn', 'start' ) 252 253 IF ( numprocs == 1 ) THEN ! workaround for single-core GPU runs 254 on_device = .TRUE. ! to be removed after complete porting 255 ELSE ! of ghost point exchange 256 !$acc update host( e_p, pt_p, u_p, v_p, w_p ) 257 ENDIF 258 259 CALL exchange_horiz( u_p, nbgp ) 260 CALL exchange_horiz( v_p, nbgp ) 261 CALL exchange_horiz( w_p, nbgp ) 262 CALL exchange_horiz( pt_p, nbgp ) 263 IF ( .NOT. constant_diffusion ) CALL exchange_horiz( e_p, nbgp ) 264 IF ( ocean ) THEN 265 CALL exchange_horiz( sa_p, nbgp ) 266 CALL exchange_horiz( rho, nbgp ) 267 CALL exchange_horiz( prho, nbgp ) 268 ENDIF 269 IF (humidity .OR. passive_scalar) THEN 270 CALL exchange_horiz( q_p, nbgp ) 271 IF ( cloud_physics .AND. icloud_scheme == 0 .AND. & 272 precipitation) THEN 273 CALL exchange_horiz( qr_p, nbgp ) 274 CALL exchange_horiz( nr_p, nbgp ) 275 ENDIF 276 ENDIF 277 IF ( cloud_droplets ) THEN 278 CALL exchange_horiz( ql, nbgp ) 279 CALL exchange_horiz( ql_c, nbgp ) 280 CALL exchange_horiz( ql_v, nbgp ) 281 CALL exchange_horiz( ql_vp, nbgp ) 282 ENDIF 283 IF ( wang_kernel .OR. turbulence ) CALL exchange_horiz( diss, nbgp ) 284 285 IF ( numprocs == 1 ) THEN ! workaround for single-core GPU runs 286 on_device = .FALSE. ! to be removed after complete porting 287 ELSE ! of ghost point exchange 288 !$acc update device( e_p, pt_p, u_p, v_p, w_p ) 289 ENDIF 290 291 CALL cpu_log( log_point(26), 'exchange-horiz-progn', 'stop' ) 412 IF ( .NOT. background_communication ) THEN 413 414 CALL cpu_log( log_point(26), 'exchange-horiz-progn', 'start' ) 415 416 IF ( numprocs == 1 ) THEN ! workaround for single-core GPU runs 417 on_device = .TRUE. ! to be removed after complete porting 418 ELSE ! of ghost point exchange 419 !$acc update host( e_p, pt_p, u_p, v_p, w_p ) 420 ENDIF 421 422 CALL exchange_horiz( u_p, nbgp ) 423 CALL exchange_horiz( v_p, nbgp ) 424 CALL exchange_horiz( w_p, nbgp ) 425 CALL exchange_horiz( pt_p, nbgp ) 426 IF ( .NOT. constant_diffusion ) CALL exchange_horiz( e_p, nbgp ) 427 IF ( ocean ) THEN 428 CALL exchange_horiz( sa_p, nbgp ) 429 CALL exchange_horiz( rho, nbgp ) 430 CALL exchange_horiz( prho, nbgp ) 431 ENDIF 432 IF (humidity .OR. passive_scalar) THEN 433 CALL exchange_horiz( q_p, nbgp ) 434 IF ( cloud_physics .AND. icloud_scheme == 0 ) THEN 435 CALL exchange_horiz( qr_p, nbgp ) 436 CALL exchange_horiz( nr_p, nbgp ) 437 ENDIF 438 ENDIF 439 IF ( cloud_droplets ) THEN 440 CALL exchange_horiz( ql, nbgp ) 441 CALL exchange_horiz( ql_c, nbgp ) 442 CALL exchange_horiz( ql_v, nbgp ) 443 CALL exchange_horiz( ql_vp, nbgp ) 444 ENDIF 445 IF ( wang_kernel .OR. turbulence ) CALL exchange_horiz( diss, nbgp ) 446 447 IF ( numprocs == 1 ) THEN ! workaround for single-core GPU runs 448 on_device = .FALSE. ! to be removed after complete porting 449 ELSE ! of ghost point exchange 450 !$acc update device( e_p, pt_p, u_p, v_p, w_p ) 451 ENDIF 452 453 CALL cpu_log( log_point(26), 'exchange-horiz-progn', 'stop' ) 454 455 ENDIF 292 456 293 457 !
Note: See TracChangeset
for help on using the changeset viewer.