Changeset 327 for codes/icosagcm/trunk/src/caldyn_gcm.f90
- Timestamp:
- 02/09/15 20:18:34 (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
codes/icosagcm/trunk/src/caldyn_gcm.f90
r295 r327 201 201 IF(caldyn_eta==eta_mass) THEN 202 202 CALL send_message(f_ps,req_ps) 203 CALL wait_message(req_ps)204 203 ELSE 205 204 CALL send_message(f_mass,req_mass) 206 CALL wait_message(req_mass)207 205 END IF 208 206 207 CALL send_message(f_theta_rhodz,req_theta_rhodz) 209 208 CALL send_message(f_u,req_u) 210 CALL wait_message(req_u)211 CALL send_message(f_theta_rhodz,req_theta_rhodz)212 CALL wait_message(req_theta_rhodz)213 214 ! CALL wait_message(req_u)215 ! CALL wait_message(req_theta_rhodz)216 209 217 210 SELECT CASE(caldyn_conserv) … … 232 225 233 226 CALL send_message(f_qu,req_qu) 234 CALL wait_message(req_qu)227 ! CALL wait_message(req_qu) 235 228 236 229 DO ind=1,ndomain … … 364 357 365 358 IF(caldyn_eta==eta_mass) THEN 366 !CALL wait_message(req_ps)359 CALL wait_message(req_ps) 367 360 ELSE 368 !CALL wait_message(req_mass)361 CALL wait_message(req_mass) 369 362 END IF 370 !CALL wait_message(req_theta_rhodz)363 CALL wait_message(req_theta_rhodz) 371 364 372 365 IF(caldyn_eta==eta_mass) THEN ! Compute mass & theta 373 366 DO l = ll_begin,ll_end 374 !CALL test_message(req_u)367 CALL test_message(req_u) 375 368 !DIR$ SIMD 376 369 DO ij=ij_begin_ext,ij_end_ext … … 382 375 ELSE ! Compute only theta 383 376 DO l = ll_begin,ll_end 384 !CALL test_message(req_u)377 CALL test_message(req_u) 385 378 !DIR$ SIMD 386 379 DO ij=ij_begin_ext,ij_end_ext … … 390 383 END IF 391 384 392 !CALL wait_message(req_u)385 CALL wait_message(req_u) 393 386 394 387 !!! Compute shallow-water potential vorticity … … 446 439 INTEGER :: i,j,ij,l 447 440 REAL(rstd) :: p_ik, exner_ik 441 INTEGER,SAVE ::ij_omp_begin_ext, ij_omp_end_ext 442 !$OMP THREADPRIVATE(ij_omp_begin_ext, ij_omp_end_ext) 443 LOGICAL,SAVE :: first=.TRUE. 444 !$OMP THREADPRIVATE(first) 445 448 446 449 447 CALL trace_start("compute_geopot") 448 449 IF (first) THEN 450 first=.FALSE. 451 CALL distrib_level(ij_end_ext-ij_begin_ext+1,ij_omp_begin_ext,ij_omp_end_ext) 452 ij_omp_begin_ext=ij_omp_begin_ext+ij_begin_ext-1 453 ij_omp_end_ext=ij_omp_end_ext+ij_begin_ext-1 454 ENDIF 450 455 451 456 IF(caldyn_eta==eta_mass) THEN 452 457 453 458 !!! Compute exner function and geopotential 454 IF (is_omp_level_master) THEN ! no openMP on vertical due to dependency455 459 DO l = 1,llm 456 ! !$OMP DO SCHEDULE(STATIC)457 460 !DIR$ SIMD 458 DO ij=ij_ begin_ext,ij_end_ext461 DO ij=ij_omp_begin_ext,ij_omp_end_ext 459 462 p_ik = ptop + mass_ak(l) + mass_bk(l)*ps(ij) ! FIXME : leave ps for the moment ; change ps to Ms later 460 463 ! p_ik = ptop + g*(mass_ak(l)+ mass_bk(l)*ps(i,j)) … … 465 468 ENDDO 466 469 ENDDO 467 ENDIF470 ! ENDIF 468 471 ELSE 469 472 ! We are using a Lagrangian vertical coordinate … … 474 477 IF(boussinesq) THEN ! compute only geopotential : pressure pk will be computed in compute_caldyn_horiz 475 478 ! specific volume 1 = dphi/g/rhodz 476 IF (is_omp_level_master) THEN ! no openMP on vertical due to dependency 477 DO l = 1,llm 478 ! !$OMP DO SCHEDULE(STATIC) 479 !DIR$ SIMD 480 DO ij=ij_begin_ext,ij_end_ext 481 geopot(ij,l+1) = geopot(ij,l) + g*rhodz(ij,l) 482 ENDDO 479 ! IF (is_omp_level_master) THEN ! no openMP on vertical due to dependency 480 DO l = 1,llm 481 !DIR$ SIMD 482 DO ij=ij_omp_begin_ext,ij_omp_end_ext 483 geopot(ij,l+1) = geopot(ij,l) + g*rhodz(ij,l) 483 484 ENDDO 484 END IF485 ENDDO 485 486 ELSE ! non-Boussinesq, compute geopotential and Exner pressure 486 487 ! uppermost layer 487 IF (is_omp_level_master) THEN ! no openMP on vertical due to dependency 488 488 489 !DIR$ SIMD 490 DO ij=ij_omp_begin_ext,ij_omp_end_ext 491 pk(ij,llm) = ptop + (.5*g)*rhodz(ij,llm) 492 END DO 493 ! other layers 494 DO l = llm-1, 1, -1 495 !DIR$ SIMD 496 DO ij=ij_omp_begin_ext,ij_omp_end_ext 497 pk(ij,l) = pk(ij,l+1) + (.5*g)*(rhodz(ij,l)+rhodz(ij,l+1)) 498 END DO 499 END DO 500 ! surface pressure (for diagnostics) 501 DO ij=ij_omp_begin_ext,ij_omp_end_ext 502 ps(ij) = pk(ij,1) + (.5*g)*rhodz(ij,1) 503 END DO 504 505 ! specific volume v = kappa*theta*pi/p = dphi/g/rhodz 506 DO l = 1,llm 489 507 !DIR$ SIMD 490 DO ij=ij_begin_ext,ij_end_ext 491 pk(ij,llm) = ptop + (.5*g)*rhodz(ij,llm) 492 END DO 493 ! other layers 494 DO l = llm-1, 1, -1 495 496 ! !$OMP DO SCHEDULE(STATIC) 497 !DIR$ SIMD 498 DO ij=ij_begin_ext,ij_end_ext 499 pk(ij,l) = pk(ij,l+1) + (.5*g)*(rhodz(ij,l)+rhodz(ij,l+1)) 500 END DO 501 END DO 502 ! surface pressure (for diagnostics) 503 DO ij=ij_begin_ext,ij_end_ext 504 ps(ij) = pk(ij,1) + (.5*g)*rhodz(ij,1) 505 END DO 506 507 ! specific volume v = kappa*theta*pi/p = dphi/g/rhodz 508 DO l = 1,llm 509 510 ! !$OMP DO SCHEDULE(STATIC) 511 !DIR$ SIMD 512 DO ij=ij_begin_ext,ij_end_ext 513 p_ik = pk(ij,l) 514 exner_ik = cpp * (p_ik/preff) ** kappa 515 geopot(ij,l+1) = geopot(ij,l) + (g*kappa)*rhodz(ij,l)*theta(ij,l)*exner_ik/p_ik 516 pk(ij,l) = exner_ik 517 ENDDO 508 DO ij=ij_omp_begin_ext,ij_omp_end_ext 509 p_ik = pk(ij,l) 510 exner_ik = cpp * (p_ik/preff) ** kappa 511 geopot(ij,l+1) = geopot(ij,l) + (g*kappa)*rhodz(ij,l)*theta(ij,l)*exner_ik/p_ik 512 pk(ij,l) = exner_ik 518 513 ENDDO 519 END IF514 ENDDO 520 515 END IF 521 516 … … 562 557 DO l = ll_begin, ll_end 563 558 !!! Compute mass and theta fluxes 564 !IF (caldyn_conserv==energy) CALL test_message(req_qu)559 IF (caldyn_conserv==energy) CALL test_message(req_qu) 565 560 !DIR$ SIMD 566 561 DO ij=ij_begin_ext,ij_end_ext … … 602 597 CASE(energy) ! energy-conserving TRiSK 603 598 604 !CALL wait_message(req_qu)599 CALL wait_message(req_qu) 605 600 606 601 DO l=ll_begin,ll_end … … 796 791 REAL(rstd),INTENT(INOUT) :: wflux(iim*jjm,llm+1) ! vertical mass flux (kg/m2/s) 797 792 REAL(rstd),INTENT(INOUT) :: wwuu(iim*3*jjm,llm+1) 798 REAL(rstd),INTENT( OUT) :: du(iim*3*jjm,llm)799 REAL(rstd),INTENT( OUT) :: dtheta_rhodz(iim*jjm,llm)793 REAL(rstd),INTENT(INOUT) :: du(iim*3*jjm,llm) 794 REAL(rstd),INTENT(INOUT) :: dtheta_rhodz(iim*jjm,llm) 800 795 REAL(rstd),INTENT(OUT) :: dps(iim*jjm) 801 796 … … 803 798 INTEGER :: i,j,ij,l 804 799 REAL(rstd) :: p_ik, exner_ik 800 INTEGER,SAVE ::ij_omp_begin, ij_omp_end 801 !$OMP THREADPRIVATE(ij_omp_begin, ij_omp_end) 802 LOGICAL,SAVE :: first=.TRUE. 803 !$OMP THREADPRIVATE(first) 804 805 806 CALL trace_start("compute_geopot") 807 808 IF (first) THEN 809 first=.FALSE. 810 CALL distrib_level(ij_end-ij_begin+1,ij_omp_begin,ij_omp_end) 811 ij_omp_begin=ij_omp_begin+ij_begin-1 812 ij_omp_end=ij_omp_end+ij_begin-1 813 ENDIF 805 814 806 815 ! REAL(rstd) :: wwuu(iim*3*jjm,llm+1) ! tmp var, don't know why but gain 30% on the whole code in opemp … … 812 821 !$OMP BARRIER 813 822 !!! cumulate mass flux convergence from top to bottom 814 IF (is_omp_level_master) THEN823 ! IF (is_omp_level_master) THEN 815 824 DO l = llm-1, 1, -1 816 825 ! IF (caldyn_conserv==energy) CALL test_message(req_qu) … … 818 827 !!$OMP DO SCHEDULE(STATIC) 819 828 !DIR$ SIMD 820 DO ij=ij_ begin,ij_end829 DO ij=ij_omp_begin,ij_omp_end 821 830 convm(ij,l) = convm(ij,l) + convm(ij,l+1) 822 831 ENDDO 823 832 ENDDO 824 ENDIF833 ! ENDIF 825 834 826 835 !$OMP BARRIER
Note: See TracChangeset
for help on using the changeset viewer.