Changeset 1878 for palm


Ignore:
Timestamp:
Apr 19, 2016 12:30:36 PM (8 years ago)
Author:
hellstea
Message:

New simpler synchronization for nested runs

Location:
palm/trunk/SOURCE
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • palm/trunk/SOURCE/init_3d_model.f90

    r1852 r1878  
    1919! Current revisions:
    2020! ------------------
    21 !
     21! The zeroth element of weight_pres removed as unnecessary
    2222!
    2323! Former revisions:
     
    690690!-- is done). Further below the values needed within the timestep scheme
    691691!-- will be set.
    692 !-- TO_DO: zeroth element added to weight_pres because in case of nesting
    693 !--        pres may need to be called  outside the RK-substeps. Antti will
    694 !--        check if this is really required.
    695692    ALLOCATE( weight_substep(1:intermediate_timestep_count_max),               &
    696               weight_pres(0:intermediate_timestep_count_max) )
     693              weight_pres(1:intermediate_timestep_count_max) )
    697694    weight_substep = 1.0_wp
    698695    weight_pres    = 1.0_wp
     
    16831680!-- Setting weighting factors for calculation of perturbation pressure
    16841681!-- and turbulent quantities from the RK substeps
    1685 !-- TO_DO: zeroth element is added to weight_pres because in nesting pres
    1686 !--        may need to be called outside the RK-substeps
    1687     weight_pres(0) = 1.0_wp
    16881682    IF ( TRIM(timestep_scheme) == 'runge-kutta-3' )  THEN      ! for RK3-method
    16891683
  • palm/trunk/SOURCE/pmc_interface_mod.f90

    r1851 r1878  
    2020! Current revisions:
    2121! ------------------
    22 !
    23 ! 
     22! Synchronization rewritten, logc-array index order changed for cache optimization
     23!
    2424! Former revisions:
    2525! -----------------
     
    338338    END INTERFACE
    339339
    340     INTERFACE pmci_client_synchronize
    341        MODULE PROCEDURE pmci_client_synchronize
     340    INTERFACE pmci_synchronize
     341       MODULE PROCEDURE pmci_synchronize
    342342    END INTERFACE
    343343
     
    360360    INTERFACE pmci_server_initialize
    361361       MODULE PROCEDURE pmci_server_initialize
    362     END INTERFACE
    363 
    364     INTERFACE pmci_server_synchronize
    365        MODULE PROCEDURE pmci_server_synchronize
    366362    END INTERFACE
    367363
     
    376372           server_to_client
    377373    PUBLIC pmci_client_initialize
    378     PUBLIC pmci_client_synchronize
    379374    PUBLIC pmci_datatrans
    380375    PUBLIC pmci_ensure_nest_mass_conservation
     
    382377    PUBLIC pmci_modelconfiguration
    383378    PUBLIC pmci_server_initialize
    384     PUBLIC pmci_server_synchronize
     379    PUBLIC pmci_synchronize
    385380    PUBLIC pmci_set_swaplevel
    386381
     
    12531248       IF ( nest_bound_l )  THEN
    12541249
    1255           ALLOCATE( logc_u_l(nzb:nzt_topo_nestbc_l,nys:nyn,1:2) )
    1256           ALLOCATE( logc_v_l(nzb:nzt_topo_nestbc_l,nys:nyn,1:2) )
    1257           ALLOCATE( logc_ratio_u_l(nzb:nzt_topo_nestbc_l,nys:nyn,1:2,0:ncorr-1) )
    1258           ALLOCATE( logc_ratio_v_l(nzb:nzt_topo_nestbc_l,nys:nyn,1:2,0:ncorr-1) )
     1250          ALLOCATE( logc_u_l(1:2,nzb:nzt_topo_nestbc_l,nys:nyn) )
     1251          ALLOCATE( logc_v_l(1:2,nzb:nzt_topo_nestbc_l,nys:nyn) )
     1252          ALLOCATE( logc_ratio_u_l(1:2,0:ncorr-1,nzb:nzt_topo_nestbc_l,nys:nyn) )
     1253          ALLOCATE( logc_ratio_v_l(1:2,0:ncorr-1,nzb:nzt_topo_nestbc_l,nys:nyn) )
    12591254          logc_u_l       = 0
    12601255          logc_v_l       = 0
     
    12731268             CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, j,     &
    12741269                                inc, wall_index, z0(j,i), kb, direction, ncorr )
    1275              logc_u_l(k,j,1) = lc
    1276              logc_ratio_u_l(k,j,1,0:ncorr-1) = lcr(0:ncorr-1)
     1270             logc_u_l(1,k,j) = lc
     1271             logc_ratio_u_l(1,0:ncorr-1,k,j) = lcr(0:ncorr-1)
    12771272             lcr(0:ncorr-1) = 1.0_wp
    12781273!
     
    12841279             CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, j,     &
    12851280                                inc, wall_index, z0(j,i), kb, direction, ncorr )
    1286              logc_v_l(k,j,1) = lc
    1287              logc_ratio_v_l(k,j,1,0:ncorr-1) = lcr(0:ncorr-1)
     1281             logc_v_l(1,k,j) = lc
     1282             logc_ratio_v_l(1,0:ncorr-1,k,j) = lcr(0:ncorr-1)
    12881283             lcr(0:ncorr-1) = 1.0_wp
    12891284
     
    12961291       IF ( nest_bound_r )  THEN
    12971292
    1298           ALLOCATE( logc_u_r(nzb:nzt_topo_nestbc_r,nys:nyn,1:2) )
    1299           ALLOCATE( logc_v_r(nzb:nzt_topo_nestbc_r,nys:nyn,1:2) )
    1300           ALLOCATE( logc_ratio_u_r(nzb:nzt_topo_nestbc_r,nys:nyn,1:2,0:ncorr-1) )
    1301           ALLOCATE( logc_ratio_v_r(nzb:nzt_topo_nestbc_r,nys:nyn,1:2,0:ncorr-1) )
     1293          ALLOCATE( logc_u_r(1:2,nzb:nzt_topo_nestbc_r,nys:nyn) )
     1294          ALLOCATE( logc_v_r(1:2,nzb:nzt_topo_nestbc_r,nys:nyn) )
     1295          ALLOCATE( logc_ratio_u_r(1:2,0:ncorr-1,nzb:nzt_topo_nestbc_r,nys:nyn) )
     1296          ALLOCATE( logc_ratio_v_r(1:2,0:ncorr-1,nzb:nzt_topo_nestbc_r,nys:nyn) )
    13021297          logc_u_r       = 0
    13031298          logc_v_r       = 0
     
    13151310             CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, j,     &
    13161311                                inc, wall_index, z0(j,i), kb, direction, ncorr )
    1317              logc_u_r(k,j,1) = lc
    1318              logc_ratio_u_r(k,j,1,0:ncorr-1) = lcr(0:ncorr-1)
     1312             logc_u_r(1,k,j) = lc
     1313             logc_ratio_u_r(1,0:ncorr-1,k,j) = lcr(0:ncorr-1)
    13191314             lcr(0:ncorr-1) = 1.0_wp
    13201315!
     
    13261321             CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, j,     &
    13271322                                inc, wall_index, z0(j,i), kb, direction, ncorr )
    1328              logc_v_r(k,j,1) = lc
    1329              logc_ratio_v_r(k,j,1,0:ncorr-1) = lcr(0:ncorr-1)
     1323             logc_v_r(1,k,j) = lc
     1324             logc_ratio_v_r(1,0:ncorr-1,k,j) = lcr(0:ncorr-1)
    13301325             lcr(0:ncorr-1) = 1.0_wp
    13311326
     
    13381333       IF ( nest_bound_s )  THEN
    13391334
    1340           ALLOCATE( logc_u_s(nzb:nzt_topo_nestbc_s,nxl:nxr,1:2) )
    1341           ALLOCATE( logc_v_s(nzb:nzt_topo_nestbc_s,nxl:nxr,1:2) )
    1342           ALLOCATE( logc_ratio_u_s(nzb:nzt_topo_nestbc_s,nxl:nxr,1:2,0:ncorr-1) )
    1343           ALLOCATE( logc_ratio_v_s(nzb:nzt_topo_nestbc_s,nxl:nxr,1:2,0:ncorr-1) )
     1335          ALLOCATE( logc_u_s(1:2,nzb:nzt_topo_nestbc_s,nxl:nxr) )
     1336          ALLOCATE( logc_v_s(1:2,nzb:nzt_topo_nestbc_s,nxl:nxr) )
     1337          ALLOCATE( logc_ratio_u_s(1:2,0:ncorr-1,nzb:nzt_topo_nestbc_s,nxl:nxr) )
     1338          ALLOCATE( logc_ratio_v_s(1:2,0:ncorr-1,nzb:nzt_topo_nestbc_s,nxl:nxr) )
    13441339          logc_u_s       = 0
    13451340          logc_v_s       = 0
     
    13581353             CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, j,     &
    13591354                                inc, wall_index, z0(j,i), kb, direction, ncorr )
    1360              logc_u_s(k,i,1) = lc
    1361              logc_ratio_u_s(k,i,1,0:ncorr-1) = lcr(0:ncorr-1)
     1355             logc_u_s(1,k,i) = lc
     1356             logc_ratio_u_s(1,0:ncorr-1,k,i) = lcr(0:ncorr-1)
    13621357             lcr(0:ncorr-1) = 1.0_wp
    13631358!
     
    13691364             CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, j,     &
    13701365                                inc, wall_index, z0(j,i), kb, direction, ncorr )
    1371              logc_v_s(k,i,1) = lc
    1372              logc_ratio_v_s(k,i,1,0:ncorr-1) = lcr(0:ncorr-1)
     1366             logc_v_s(1,k,i) = lc
     1367             logc_ratio_v_s(1,0:ncorr-1,k,i) = lcr(0:ncorr-1)
    13731368             lcr(0:ncorr-1) = 1.0_wp
    13741369
     
    13811376       IF ( nest_bound_n )  THEN
    13821377
    1383           ALLOCATE( logc_u_n(nzb:nzt_topo_nestbc_n,nxl:nxr,1:2) )
    1384           ALLOCATE( logc_v_n(nzb:nzt_topo_nestbc_n,nxl:nxr,1:2) )
    1385           ALLOCATE( logc_ratio_u_n(nzb:nzt_topo_nestbc_n,nxl:nxr,1:2,0:ncorr-1) )
    1386           ALLOCATE( logc_ratio_v_n(nzb:nzt_topo_nestbc_n,nxl:nxr,1:2,0:ncorr-1) )
     1378          ALLOCATE( logc_u_n(1:2,nzb:nzt_topo_nestbc_n,nxl:nxr) )
     1379          ALLOCATE( logc_v_n(1:2,nzb:nzt_topo_nestbc_n,nxl:nxr) )
     1380          ALLOCATE( logc_ratio_u_n(1:2,0:ncorr-1,nzb:nzt_topo_nestbc_n,nxl:nxr) )
     1381          ALLOCATE( logc_ratio_v_n(1:2,0:ncorr-1,nzb:nzt_topo_nestbc_n,nxl:nxr) )
    13871382          logc_u_n       = 0
    13881383          logc_v_n       = 0
     
    14011396             CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, j,     &
    14021397                                inc, wall_index, z0(j,i), kb, direction, ncorr )
    1403              logc_u_n(k,i,1) = lc
    1404              logc_ratio_u_n(k,i,1,0:ncorr-1) = lcr(0:ncorr-1)
     1398             logc_u_n(1,k,i) = lc
     1399             logc_ratio_u_n(1,0:ncorr-1,k,i) = lcr(0:ncorr-1)
    14051400             lcr(0:ncorr-1) = 1.0_wp
    14061401!
     
    14121407             CALL pmci_define_loglaw_correction_parameters( lc, lcr, k, j,     &
    14131408                                inc, wall_index, z0(j,i), kb, direction, ncorr )
    1414              logc_v_n(k,i,1) = lc
    1415              logc_ratio_v_n(k,i,1,0:ncorr-1) = lcr(0:ncorr-1)
     1409             logc_v_n(1,k,i) = lc
     1410             logc_ratio_v_n(1,0:ncorr-1,k,i) = lcr(0:ncorr-1)
    14161411             lcr(0:ncorr-1) = 1.0_wp
    14171412
     
    14291424          IF ( nest_bound_l )  THEN
    14301425
    1431              ALLOCATE( logc_w_l(nzb:nzt_topo_nestbc_l,nys:nyn,1:2) )
    1432              ALLOCATE( logc_ratio_w_l(nzb:nzt_topo_nestbc_l,nys:nyn,1:2,       &
    1433                                       0:ncorr-1) )
     1426             ALLOCATE( logc_w_l(1:2,nzb:nzt_topo_nestbc_l,nys:nyn) )
     1427             ALLOCATE( logc_ratio_w_l(1:2,0:ncorr-1,nzb:nzt_topo_nestbc_l,     &
     1428                                      nys:nyn) )
     1429
    14341430             logc_w_l       = 0
    14351431             logc_ratio_w_l = 1.0_wp
     
    14501446!--                   The direction of the wall-normal index is stored as the
    14511447!--                   sign of the logc-element.
    1452                       logc_u_l(k,j,2) = inc * lc
    1453                       logc_ratio_u_l(k,j,2,0:ncorr-1) = lcr(0:ncorr-1)
     1448                      logc_u_l(2,k,j) = inc * lc
     1449                      logc_ratio_u_l(2,0:ncorr-1,k,j) = lcr(0:ncorr-1)
    14541450                      lcr(0:ncorr-1) = 1.0_wp
    14551451                   ENDIF
     
    14671463!--                   The direction of the wall-normal index is stored as the
    14681464!--                   sign of the logc-element.
    1469                       logc_u_l(k,j,2) = inc * lc
    1470                       logc_ratio_u_l(k,j,2,0:ncorr-1) = lcr(0:ncorr-1)
     1465                      logc_u_l(2,k,j) = inc * lc
     1466                      logc_ratio_u_l(2,0:ncorr-1,k,j) = lcr(0:ncorr-1)
    14711467                      lcr(0:ncorr-1) = 1.0_wp
    14721468                   ENDIF
     
    14841480!--                   The direction of the wall-normal index is stored as the
    14851481!--                   sign of the logc-element.
    1486                       logc_w_l(k,j,2) = inc * lc
    1487                       logc_ratio_w_l(k,j,2,0:ncorr-1) = lcr(0:ncorr-1)
     1482                      logc_w_l(2,k,j) = inc * lc
     1483                      logc_ratio_w_l(2,0:ncorr-1,k,j) = lcr(0:ncorr-1)
    14881484                      lcr(0:ncorr-1) = 1.0_wp
    14891485                   ENDIF
     
    15011497!--                   The direction of the wall-normal index is stored as the
    15021498!--                   sign of the logc-element.
    1503                       logc_w_l(k,j,2) = inc * lc
    1504                       logc_ratio_w_l(k,j,2,0:ncorr-1) = lcr(0:ncorr-1)
     1499                      logc_w_l(2,k,j) = inc * lc
     1500                      logc_ratio_w_l(2,0:ncorr-1,k,j) = lcr(0:ncorr-1)
    15051501                      lcr(0:ncorr-1) = 1.0_wp
    15061502                   ENDIF
     
    15151511          IF ( nest_bound_r )  THEN
    15161512
    1517              ALLOCATE( logc_w_r(nzb:nzt_topo_nestbc_r,nys:nyn,1:2) )
    1518              ALLOCATE( logc_ratio_w_r(nzb:nzt_topo_nestbc_r,nys:nyn,1:2,       &
    1519                                       0:ncorr-1) )
     1513             ALLOCATE( logc_w_r(1:2,nzb:nzt_topo_nestbc_r,nys:nyn) )
     1514             ALLOCATE( logc_ratio_w_r(1:2,0:ncorr-1,nzb:nzt_topo_nestbc_r,     &
     1515                                      nys:nyn) )
    15201516             logc_w_r       = 0
    15211517             logc_ratio_w_r = 1.0_wp
     
    15361532!--                   The direction of the wall-normal index is stored as the
    15371533!--                   sign of the logc-element.
    1538                       logc_u_r(k,j,2) = inc * lc
    1539                       logc_ratio_u_r(k,j,2,0:ncorr-1) = lcr(0:ncorr-1)
     1534                      logc_u_r(2,k,j) = inc * lc
     1535                      logc_ratio_u_r(2,0:ncorr-1,k,j) = lcr(0:ncorr-1)
    15401536                      lcr(0:ncorr-1) = 1.0_wp
    15411537                   ENDIF
     
    15521548!--                   The direction of the wall-normal index is stored as the
    15531549!--                   sign of the logc-element.
    1554                       logc_u_r(k,j,2) = inc * lc
    1555                       logc_ratio_u_r(k,j,2,0:ncorr-1) = lcr(0:ncorr-1)
     1550                      logc_u_r(2,k,j) = inc * lc
     1551                      logc_ratio_u_r(2,0:ncorr-1,k,j) = lcr(0:ncorr-1)
    15561552                      lcr(0:ncorr-1) = 1.0_wp
    15571553                   ENDIF
     
    15681564!--                   The direction of the wall-normal index is stored as the
    15691565!--                   sign of the logc-element.
    1570                       logc_w_r(k,j,2) = inc * lc
    1571                       logc_ratio_w_r(k,j,2,0:ncorr-1) = lcr(0:ncorr-1)
     1566                      logc_w_r(2,k,j) = inc * lc
     1567                      logc_ratio_w_r(2,0:ncorr-1,k,j) = lcr(0:ncorr-1)
    15721568                      lcr(0:ncorr-1) = 1.0_wp
    15731569                   ENDIF
     
    15851581!--                   The direction of the wall-normal index is stored as the
    15861582!--                   sign of the logc-element.
    1587                       logc_w_r(k,j,2) = inc * lc
    1588                       logc_ratio_w_r(k,j,2,0:ncorr-1) = lcr(0:ncorr-1)
     1583                      logc_w_r(2,k,j) = inc * lc
     1584                      logc_ratio_w_r(2,0:ncorr-1,k,j) = lcr(0:ncorr-1)
    15891585                      lcr(0:ncorr-1) = 1.0_wp
    15901586                   ENDIF
     
    15991595          IF ( nest_bound_s )  THEN
    16001596
    1601              ALLOCATE( logc_w_s(nzb:nzt_topo_nestbc_s, nxl:nxr, 1:2) )
    1602              ALLOCATE( logc_ratio_w_s(nzb:nzt_topo_nestbc_s,nxl:nxr,1:2,       &
    1603                                       0:ncorr-1) )
     1597             ALLOCATE( logc_w_s(1:2,nzb:nzt_topo_nestbc_s,nxl:nxr) )
     1598             ALLOCATE( logc_ratio_w_s(1:2,0:ncorr-1,nzb:nzt_topo_nestbc_s,     &
     1599                                      nxl:nxr) )
    16041600             logc_w_s       = 0
    16051601             logc_ratio_w_s = 1.0_wp
     
    16201616!--                   The direction of the wall-normal index is stored as the
    16211617!--                   sign of the logc-element.
    1622                       logc_v_s(k,i,2) = inc * lc
    1623                       logc_ratio_v_s(k,i,2,0:ncorr-1) = lcr(0:ncorr-1)
     1618                      logc_v_s(2,k,i) = inc * lc
     1619                      logc_ratio_v_s(2,0:ncorr-1,k,i) = lcr(0:ncorr-1)
    16241620                      lcr(0:ncorr-1) = 1.0_wp
    16251621                   ENDIF
     
    16371633!--                   The direction of the wall-normal index is stored as the
    16381634!--                   sign of the logc-element.
    1639                       logc_v_s(k,i,2) = inc * lc
    1640                       logc_ratio_v_s(k,i,2,0:ncorr-1) = lcr(0:ncorr-1)
     1635                      logc_v_s(2,k,i) = inc * lc
     1636                      logc_ratio_v_s(2,0:ncorr-1,k,i) = lcr(0:ncorr-1)
    16411637                      lcr(0:ncorr-1) = 1.0_wp
    16421638                   ENDIF
     
    16541650!--                   The direction of the wall-normal index is stored as the
    16551651!--                   sign of the logc-element.
    1656                       logc_w_s(k,i,2) = inc * lc
    1657                       logc_ratio_w_s(k,i,2,0:ncorr - 1) = lcr(0:ncorr-1)
     1652                      logc_w_s(2,k,i) = inc * lc
     1653                      logc_ratio_w_s(2,0:ncorr-1,k,i) = lcr(0:ncorr-1)
    16581654                      lcr(0:ncorr-1) = 1.0_wp
    16591655                   ENDIF
     
    16711667!--                   The direction of the wall-normal index is stored as the
    16721668!--                   sign of the logc-element.
    1673                       logc_w_s(k,i,2) = inc * lc
    1674                       logc_ratio_w_s(k,i,2,0:ncorr-1) = lcr(0:ncorr-1)
     1669                      logc_w_s(2,k,i) = inc * lc
     1670                      logc_ratio_w_s(2,0:ncorr-1,k,i) = lcr(0:ncorr-1)
    16751671                      lcr(0:ncorr-1) = 1.0_wp
    16761672                   ENDIF
     
    16851681          IF ( nest_bound_n )  THEN
    16861682
    1687              ALLOCATE( logc_w_n(nzb:nzt_topo_nestbc_n, nxl:nxr, 1:2) )
    1688              ALLOCATE( logc_ratio_w_n(nzb:nzt_topo_nestbc_n,nxl:nxr,1:2,       &
    1689                                       0:ncorr-1) )
     1683             ALLOCATE( logc_w_n(1:2,nzb:nzt_topo_nestbc_n, nxl:nxr) )
     1684             ALLOCATE( logc_ratio_w_n(1:2,0:ncorr-1,nzb:nzt_topo_nestbc_n,     &
     1685                                      nxl:nxr) )
    16901686             logc_w_n       = 0
    16911687             logc_ratio_w_n = 1.0_wp
     
    17061702!--                   The direction of the wall-normal index is stored as the
    17071703!--                   sign of the logc-element.
    1708                       logc_v_n(k,i,2) = inc * lc
    1709                       logc_ratio_v_n(k,i,2,0:ncorr-1) = lcr(0:ncorr-1)
     1704                      logc_v_n(2,k,i) = inc * lc
     1705                      logc_ratio_v_n(2,0:ncorr-1,k,i) = lcr(0:ncorr-1)
    17101706                      lcr(0:ncorr-1) = 1.0_wp
    17111707                   ENDIF
     
    17221718!--                   The direction of the wall-normal index is stored as the
    17231719!--                   sign of the logc-element.
    1724                       logc_v_n(k,i,2) = inc * lc
    1725                       logc_ratio_v_n(k,i,2,0:ncorr-1) = lcr(0:ncorr-1)
     1720                      logc_v_n(2,k,i) = inc * lc
     1721                      logc_ratio_v_n(2,0:ncorr-1,k,i) = lcr(0:ncorr-1)
    17261722                      lcr(0:ncorr-1) = 1.0_wp
    17271723                   ENDIF
     
    17381734!--                   The direction of the wall-normal index is stored as the
    17391735!--                   sign of the logc-element.
    1740                       logc_w_n(k,i,2) = inc * lc
    1741                       logc_ratio_w_n(k,i,2,0:ncorr-1) = lcr(0:ncorr-1)
     1736                      logc_w_n(2,k,i) = inc * lc
     1737                      logc_ratio_w_n(2,0:ncorr-1,k,i) = lcr(0:ncorr-1)
    17421738                      lcr(0:ncorr-1) = 1.0_wp
    17431739                   ENDIF
     
    17541750!--                   The direction of the wall-normal index is stored as the
    17551751!--                   sign of the logc-element.
    1756                       logc_w_n(k,i,2) = inc * lc
    1757                       logc_ratio_w_n(k,i,2,0:ncorr-1) = lcr(0:ncorr-1)
     1752                      logc_w_n(2,k,i) = inc * lc
     1753                      logc_ratio_w_n(2,0:ncorr-1,k,i) = lcr(0:ncorr-1)
    17581754                      lcr(0:ncorr-1) = 1.0_wp
    17591755                   ENDIF
     
    29752971
    29762972
    2977 !-- TO_DO: the timestep sycnchronization could be done easier using
    2978 !--        an MPI_ALLREDUCE with MIN over MPI_COMM_WORLD
    2979  SUBROUTINE pmci_server_synchronize
     2973
     2974 SUBROUTINE pmci_synchronize
    29802975
    29812976#if defined( __parallel )
    29822977!
    2983 !-- Unify the time steps for each model and synchronize. This is based on the
    2984 !-- assumption that the native time step (original dt_3d) of any server is
    2985 !-- always larger than the smallest native time step of it s clients.
    2986     IMPLICIT NONE
    2987 
    2988     INTEGER(iwp) ::  client_id   !:
    2989     INTEGER(iwp) ::  ierr        !:
    2990     INTEGER(iwp) ::  m           !:
    2991 
    2992     REAL(wp), DIMENSION(1) ::  dtc         !:
    2993     REAL(wp), DIMENSION(1) ::  dtl         !:
    2994 
    2995 
    2996     CALL cpu_log( log_point_s(70), 'pmc sync', 'start' )
    2997 
    2998 !
    2999 !-- First find the smallest native time step of all the clients of the current
    3000 !-- server.
    3001     dtl(1) = 999999.9_wp
    3002     DO  m = 1, SIZE( PMC_Server_for_Client )-1
    3003        client_id = PMC_Server_for_Client(m)
    3004        IF ( myid == 0 )  THEN
    3005           CALL pmc_recv_from_client( client_id, dtc, SIZE( dtc ), 0, 101, ierr )
    3006           dtl(1) = MIN( dtl(1), dtc(1) )
    3007           dt_3d   = dtl(1)
    3008        ENDIF
    3009     ENDDO
    3010 
    3011 !
    3012 !-- Broadcast the unified time step to all server processes
    3013     CALL MPI_BCAST( dt_3d, 1, MPI_REAL, 0, comm2d, ierr )
    3014 
    3015 !
    3016 !-- Send the new time step to all the clients of the current server
    3017     DO  m = 1, SIZE( PMC_Server_for_Client ) - 1
    3018        client_id = PMC_Server_for_Client(m)
    3019        IF ( myid == 0 )  THEN
    3020           CALL pmc_send_to_client( client_id, dtl, SIZE( dtl ), 0, 102, ierr )
    3021        ENDIF
    3022     ENDDO
    3023 
    3024     CALL cpu_log( log_point_s(70), 'pmc sync', 'stop' )
    3025 
    3026 #endif
    3027  END SUBROUTINE pmci_server_synchronize
    3028 
    3029 
    3030 
    3031  SUBROUTINE pmci_client_synchronize
    3032 
    3033 #if defined( __parallel )
    3034 !
    3035 !-- Unify the time steps for each model and synchronize. This is based on the
    3036 !-- assumption that the native time step (original dt_3d) of any server is
    3037 !-- always larger than the smallest native time step of it s clients.
    3038 
    3039     IMPLICIT NONE
    3040 
    3041     INTEGER(iwp) ::  ierr   !:
    3042 
    3043     REAL(wp), DIMENSION(1) ::  dtl    !:
    3044     REAL(wp), DIMENSION(1) ::  dts    !:
    3045    
    3046 
    3047     dtl(1) = dt_3d
    3048     IF ( cpl_id > 1 )  THEN
    3049 
    3050        CALL cpu_log( log_point_s(70), 'pmc sync', 'start' )
    3051 
    3052        IF ( myid==0 )  THEN
    3053           CALL pmc_send_to_server( dtl, SIZE( dtl ), 0, 101, ierr )
    3054           CALL pmc_recv_from_server( dts, SIZE( dts ), 0, 102, ierr )
    3055           dt_3d = dts(1)
    3056        ENDIF
    3057 
    3058 !
    3059 !--    Broadcast the unified time step to all server processes
    3060        CALL MPI_BCAST( dt_3d, 1, MPI_REAL, 0, comm2d, ierr )
    3061 
    3062        CALL cpu_log( log_point_s(70), 'pmc sync', 'stop' )
    3063 
    3064     ENDIF
    3065 
    3066 #endif
    3067  END SUBROUTINE pmci_client_synchronize
     2978!-- Unify the time steps for each model and synchronize using
     2979!-- MPI_ALLREDUCE with the MPI_MIN operator over all processes using
     2980!-- the global communicator MPI_COMM_WORLD.
     2981   IMPLICIT NONE
     2982
     2983   INTEGER(iwp)           :: ierr  !:
     2984   REAL(wp), DIMENSION(1) :: dtl   !:
     2985   REAL(wp), DIMENSION(1) :: dtg   !:
     2986
     2987   
     2988   dtl(1) = dt_3d
     2989   CALL MPI_ALLREDUCE( dtl, dtg, 1, MPI_REAL, MPI_MIN, MPI_COMM_WORLD, ierr )
     2990   dt_3d  = dtg(1)
     2991
     2992 END SUBROUTINE pmci_synchronize
    30682993               
    30692994
     
    35063431      REAL(wp), DIMENSION(0:cg%nz+1,jcs:jcn,icl:icr),                          &
    35073432                                      INTENT(IN)    ::  fc      !:
    3508       REAL(wp), DIMENSION(nzb:nzt_topo_nestbc,nys:nyn,1:2,0:ncorr-1),          &
     3433      REAL(wp), DIMENSION(1:2,0:ncorr-1,nzb:nzt_topo_nestbc,nys:nyn),          &
    35093434                                      INTENT(IN)    ::  logc_ratio   !:
    35103435      REAL(wp), DIMENSION(nxlg:nxrg), INTENT(IN)    ::  r1x     !:
     
    35193444      INTEGER(iwp), DIMENSION(nysg:nyng,nxlg:nxrg), INTENT(IN) ::  kb     !:
    35203445      INTEGER(iwp), DIMENSION(nzb:nzt+1), INTENT(IN)           ::  kc     !:
    3521       INTEGER(iwp), DIMENSION(nzb:nzt_topo_nestbc,nys:nyn,1:2),                &
     3446      INTEGER(iwp), DIMENSION(1:2,nzb:nzt_topo_nestbc,nys:nyn),                &
    35223447                                          INTENT(IN)           ::  logc   !:
    35233448      INTEGER(iwp) ::  nzt_topo_nestbc   !:
     
    35893514!
    35903515!--   Generalized log-law-correction algorithm.
    3591 !--   Doubly two-dimensional index arrays logc(:,:,1:2) and log-ratio arrays
    3592 !--   logc_ratio(:,:,1:2,0:ncorr-1) have been precomputed in subroutine
     3516!--   Doubly two-dimensional index arrays logc(1:2,:,:) and log-ratio arrays
     3517!--   logc_ratio(1:2,0:ncorr-1,:,:) have been precomputed in subroutine
    35933518!--   pmci_init_loglaw_correction.
    35943519!
     
    35973522         DO  j = nys, nyn
    35983523            k = kb(j,i)+1
    3599             IF ( ( logc(k,j,1) /= 0 )  .AND.  ( logc(k,j,2) == 0 ) )  THEN
    3600                k1 = logc(k,j,1)
    3601                DO  kcorr=0,ncorr - 1
     3524            IF ( ( logc(1,k,j) /= 0 )  .AND.  ( logc(2,k,j) == 0 ) )  THEN
     3525               k1 = logc(1,k,j)
     3526               DO  kcorr = 0, ncorr - 1
    36023527                  kco = k + kcorr
    3603                   f(kco,j,i) = logc_ratio(k,j,1,kcorr) * f(k1,j,i)
     3528                  f(kco,j,i) = logc_ratio(1,kcorr,k,j) * f(k1,j,i)
    36043529               ENDDO
    36053530            ENDIF
     
    36193544            DO  j = nys, nyn
    36203545               DO  k = kb(j,i)+1, nzt_topo_nestbc
    3621                   IF ( ( logc(k,j,2) /= 0 )  .AND.  ( logc(k,j,1) == 0 ) )  THEN
     3546                  IF ( ( logc(2,k,j) /= 0 )  .AND.  ( logc(1,k,j) == 0 ) )  THEN
    36223547
    36233548!
    36243549!--                  Direction of the wall-normal index is carried in as the
    36253550!--                  sign of logc
    3626                      jinc = SIGN( 1, logc(k,j,2) )
    3627                      j1   = ABS( logc(k,j,2) )
     3551                     jinc = SIGN( 1, logc(2,k,j) )
     3552                     j1   = ABS( logc(2,k,j) )
    36283553                     DO  jcorr = 0, ncorr-1
    36293554                        jco = j + jinc * jcorr
    3630                         f(k,jco,i) = logc_ratio(k,j,2,jcorr) * f(k,j1,i)
     3555                        f(k,jco,i) = logc_ratio(2,jcorr,k,j) * f(k,j1,i)
    36313556                     ENDDO
    36323557                  ENDIF
     
    36403565            DO  j = nys, nyn
    36413566               k = kb(j,i) + 1
    3642                IF ( ( logc(k,j,2) /= 0 )  .AND.  ( logc(k,j,1) /= 0 ) )  THEN
    3643                   k1   = logc(k,j,1)                 
    3644                   jinc = SIGN( 1, logc(k,j,2) )
    3645                   j1   = ABS( logc(k,j,2) )                 
     3567               IF ( ( logc(2,k,j) /= 0 )  .AND.  ( logc(1,k,j) /= 0 ) )  THEN
     3568                  k1   = logc(1,k,j)                 
     3569                  jinc = SIGN( 1, logc(2,k,j) )
     3570                  j1   = ABS( logc(2,k,j) )                 
    36463571                  DO  jcorr = 0, ncorr-1
    36473572                     jco = j + jinc * jcorr
    36483573                     DO  kcorr = 0, ncorr-1
    36493574                        kco = k + kcorr
    3650                         f(kco,jco,i) = 0.5_wp * ( logc_ratio(k,j,1,kcorr) *    &
     3575                        f(kco,jco,i) = 0.5_wp * ( logc_ratio(1,kcorr,k,j) *    &
    36513576                                                  f(k1,j,i)                    &
    3652                                                 + logc_ratio(k,j,2,jcorr) *    &
     3577                                                + logc_ratio(2,jcorr,k,j) *    &
    36533578                                                  f(k,j1,i) )
    36543579                     ENDDO
     
    37093634      REAL(wp), DIMENSION(0:cg%nz+1,jcs:jcn,icl:icr),                          &
    37103635                                      INTENT(IN)    ::  fc            !:
    3711       REAL(wp), DIMENSION(nzb:nzt_topo_nestbc,nxl:nxr,1:2,0:ncorr-1),          &
     3636      REAL(wp), DIMENSION(1:2,0:ncorr-1,nzb:nzt_topo_nestbc,nxl:nxr),          &
    37123637                                      INTENT(IN)    ::  logc_ratio    !:
    37133638      REAL(wp), DIMENSION(nxlg:nxrg), INTENT(IN)    ::  r1x           !:
     
    37223647      INTEGER(iwp), DIMENSION(nysg:nyng,nxlg:nxrg), INTENT(IN) ::  kb    !:
    37233648      INTEGER(iwp), DIMENSION(nzb:nzt+1), INTENT(IN)           ::  kc    !:
    3724       INTEGER(iwp), DIMENSION(nzb:nzt_topo_nestbc,nxl:nxr,1:2),                &
     3649      INTEGER(iwp), DIMENSION(1:2,nzb:nzt_topo_nestbc,nxl:nxr),                &
    37253650                                          INTENT(IN)           ::  logc  !:
    37263651      INTEGER(iwp) ::  nzt_topo_nestbc   !:
     
    37893714!
    37903715!--   Generalized log-law-correction algorithm.
    3791 !--   Multiply two-dimensional index arrays logc(:,:,1:2) and log-ratio arrays
    3792 !--   logc_ratio(:,:,1:2,0:ncorr-1) have been precomputed in subroutine
     3716!--   Multiply two-dimensional index arrays logc(1:2,:,:) and log-ratio arrays
     3717!--   logc_ratio(1:2,0:ncorr-1,:,:) have been precomputed in subroutine
    37933718!--   pmci_init_loglaw_correction.
    37943719!
     
    37973722         DO  i = nxl, nxr
    37983723            k = kb(j,i) + 1
    3799             IF ( ( logc(k,i,1) /= 0 )  .AND.  ( logc(k,i,2) == 0 ) )  THEN
    3800                k1 = logc(k,i,1)
     3724            IF ( ( logc(1,k,i) /= 0 )  .AND.  ( logc(2,k,i) == 0 ) )  THEN
     3725               k1 = logc(1,k,i)
    38013726               DO  kcorr = 0, ncorr-1
    38023727                  kco = k + kcorr
    3803                   f(kco,j,i) = logc_ratio(k,i,1,kcorr) * f(k1,j,i)
     3728                  f(kco,j,i) = logc_ratio(1,kcorr,k,i) * f(k1,j,i)
    38043729               ENDDO
    38053730            ENDIF
     
    38203745!
    38213746!--               Solid surface only on left/right side of the node           
    3822                   IF ( ( logc(k,i,2) /= 0 )  .AND.  ( logc(k,i,1) == 0 ) )  THEN
     3747                  IF ( ( logc(2,k,i) /= 0 )  .AND.  ( logc(1,k,i) == 0 ) )  THEN
    38233748
    38243749!
    38253750!--                  Direction of the wall-normal index is carried in as the
    38263751!--                  sign of logc
    3827                      iinc = SIGN( 1, logc(k,i,2) )
    3828                      i1  = ABS( logc(k,i,2) )
     3752                     iinc = SIGN( 1, logc(2,k,i) )
     3753                     i1  = ABS( logc(2,k,i) )
    38293754                     DO  icorr = 0, ncorr-1
    38303755                        ico = i + iinc * icorr
    3831                         f(k,j,ico) = logc_ratio(k,i,2,icorr) * f(k,j,i1)
     3756                        f(k,j,ico) = logc_ratio(2,icorr,k,i) * f(k,j,i1)
    38323757                     ENDDO
    38333758                  ENDIF
     
    38413766            DO  i = nxl, nxr
    38423767               k = kb(j,i) + 1
    3843                IF ( ( logc(k,i,2) /= 0 )  .AND.  ( logc(k,i,1) /= 0 ) )  THEN
    3844                   k1   = logc(k,i,1)         
    3845                   iinc = SIGN( 1, logc(k,i,2) )
    3846                   i1   = ABS( logc(k,i,2) )
     3768               IF ( ( logc(2,k,i) /= 0 )  .AND.  ( logc(1,k,i) /= 0 ) )  THEN
     3769                  k1   = logc(1,k,i)         
     3770                  iinc = SIGN( 1, logc(2,k,i) )
     3771                  i1   = ABS( logc(2,k,i) )
    38473772                  DO  icorr = 0, ncorr-1
    38483773                     ico = i + iinc * icorr
    38493774                     DO  kcorr = 0, ncorr-1
    38503775                        kco = k + kcorr
    3851                         f(kco,i,ico) = 0.5_wp * ( logc_ratio(k,i,1,kcorr) *    &
     3776                        f(kco,i,ico) = 0.5_wp * ( logc_ratio(1,kcorr,k,i) *    &
    38523777                                                  f(k1,j,i)  &
    3853                                                 + logc_ratio(k,i,2,icorr) *    &
     3778                                                + logc_ratio(2,icorr,k,i) *    &
    38543779                                                  f(k,j,i1) )
    38553780                     ENDDO
  • palm/trunk/SOURCE/time_integration.f90

    r1854 r1878  
    1919! Current revisions:
    2020! ------------------
    21 !
     21! Synchronization for nested runs rewritten
    2222!
    2323! Former revisions:
     
    282282    USE pmc_interface,                                                         &
    283283        ONLY:  client_to_server, nested_run, nesting_mode,                     &
    284                pmci_client_synchronize, pmci_datatrans,                        &
    285                pmci_ensure_nest_mass_conservation,                             &
    286                pmci_server_synchronize, server_to_client
     284               pmci_datatrans, pmci_ensure_nest_mass_conservation,             &
     285               pmci_synchronize, server_to_client
    287286
    288287    USE production_e_mod,                                                      &
     
    325324!
    326325!-- Synchronize the timestep in case of nested run.
    327 !-- The server side must be called first
    328326    IF ( nested_run )  THEN
    329        CALL pmci_server_synchronize
    330        CALL pmci_client_synchronize
     327!
     328!--    Synchronization by unifying the time step.
     329!--    Global minimum of all time-steps is used for all.
     330       CALL pmci_synchronize
    331331    ENDIF
    332332
     
    368368       IF ( simulated_time /= 0.0_wp )  THEN
    369369          CALL timestep
    370 
     370!
     371!--       Synchronize the timestep in case of nested run.
    371372          IF ( nested_run )  THEN
    372373!
    373 !--          TO_DO: try to give more detailed and meaningful comments here
    374 !--          Server side must be called first
    375              CALL pmci_server_synchronize
    376              CALL pmci_client_synchronize
    377           ENDIF
    378        ENDIF
    379 
     374!--          Synchronize by unifying the time step.
     375!--          Global minimum of all time-steps is used for all.     
     376             CALL pmci_synchronize
     377          ENDIF
     378       ENDIF
    380379
    381380!
Note: See TracChangeset for help on using the changeset viewer.