Ignore:
Timestamp:
Oct 7, 2015 11:56:08 PM (9 years ago)
Author:
knoop
Message:

Code annotations made doxygen readable

File:
1 edited

Legend:

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

    r1610 r1682  
    1  MODULE poismg_mod
    2 
     1!> @file poismg_fast.f90
    32!--------------------------------------------------------------------------------!
    43! This file is part of PALM.
     
    1817!--------------------------------------------------------------------------------!
    1918!
    20 ! Attention: Loop unrolling and cache optimization in SOR-Red/Black method
    21 !            still does not give the expected speedup! Further work required.
    22 !
    2319! Current revisions:
    2420! -----------------
    25 !
     21! Code annotations made doxygen readable
    2622!
    2723! Former revisions:
     
    4844! Description:
    4945! ------------
    50 ! Solves the Poisson equation for the perturbation pressure with a multigrid
    51 ! V- or W-Cycle scheme.
    52 !
    53 ! This multigrid method was originally developed for PALM by Joerg Uhlenbrock,
    54 ! September 2000 - July 2001. It has been optimised for speed by Klaus
    55 ! Ketelsen in November 2014.
     46!> Solves the Poisson equation for the perturbation pressure with a multigrid
     47!> V- or W-Cycle scheme.
     48!>
     49!> This multigrid method was originally developed for PALM by Joerg Uhlenbrock,
     50!> September 2000 - July 2001. It has been optimised for speed by Klaus
     51!> Ketelsen in November 2014.
     52!>
     53!> @attention Loop unrolling and cache optimization in SOR-Red/Black method
     54!>            still does not give the expected speedup!
     55!>
     56!> @todo Further work required.
    5657!------------------------------------------------------------------------------!
     58 MODULE poismg_mod
     59 
    5760
    5861    USE cpulog,                                                                &
     
    6568    PRIVATE
    6669
    67     INTEGER, SAVE                             ::  ind_even_odd    !: border index between even and odd k index
    68     INTEGER, DIMENSION(:), SAVE, ALLOCATABLE  ::  even_odd_level  !: stores ind_even_odd for all MG levels
    69 
    70     REAL(wp), DIMENSION(:,:), SAVE, ALLOCATABLE ::  f1_mg_b, f2_mg_b, f3_mg_b  !: blocked version of f1_mg ...
     70    INTEGER, SAVE                             ::  ind_even_odd    !< border index between even and odd k index
     71    INTEGER, DIMENSION(:), SAVE, ALLOCATABLE  ::  even_odd_level  !< stores ind_even_odd for all MG levels
     72
     73    REAL(wp), DIMENSION(:,:), SAVE, ALLOCATABLE ::  f1_mg_b, f2_mg_b, f3_mg_b  !< blocked version of f1_mg ...
    7174
    7275    INTERFACE poismg_fast
     
    8487 CONTAINS
    8588
     89!------------------------------------------------------------------------------!
     90! Description:
     91! ------------
     92!> Solves the Poisson equation for the perturbation pressure with a multigrid
     93!> V- or W-Cycle scheme.
     94!------------------------------------------------------------------------------!
    8695    SUBROUTINE poismg_fast( r )
    8796
     
    103112       IMPLICIT NONE
    104113
    105        REAL(wp) ::  maxerror          !:
    106        REAL(wp) ::  maximum_mgcycles  !:
    107        REAL(wp) ::  residual_norm     !:
    108 
    109        REAL(wp), DIMENSION(nzb:nzt+1,nys-1:nyn+1,nxl-1:nxr+1) ::  r  !:
    110 
    111        REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  p3  !:
     114       REAL(wp) ::  maxerror          !<
     115       REAL(wp) ::  maximum_mgcycles  !<
     116       REAL(wp) ::  residual_norm     !<
     117
     118       REAL(wp), DIMENSION(nzb:nzt+1,nys-1:nyn+1,nxl-1:nxr+1) ::  r  !<
     119
     120       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  p3  !<
    112121
    113122
     
    215224
    216225
    217 
    218     SUBROUTINE resid_fast( f_mg, p_mg, r )
    219 
    220226!------------------------------------------------------------------------------!
    221227! Description:
    222228! ------------
    223 ! Computes the residual of the perturbation pressure.
     229!> Computes the residual of the perturbation pressure.
    224230!------------------------------------------------------------------------------!
     231    SUBROUTINE resid_fast( f_mg, p_mg, r )
     232
    225233
    226234       USE arrays_3d,                                                          &
     
    247255       INTEGER(iwp) ::  k
    248256       INTEGER(iwp) ::  l
    249        INTEGER(iwp) :: km1      !:
    250        INTEGER(iwp) :: kp1      !:
     257       INTEGER(iwp) :: km1      !<
     258       INTEGER(iwp) :: kp1      !<
    251259
    252260       REAL(wp), DIMENSION(nzb:nzt_mg(grid_level)+1,                           &
    253261                       nys_mg(grid_level)-1:nyn_mg(grid_level)+1,              &
    254                        nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) ::  f_mg  !:
     262                       nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) ::  f_mg  !<
    255263       REAL(wp), DIMENSION(nzb:nzt_mg(grid_level)+1,                           &
    256264                       nys_mg(grid_level)-1:nyn_mg(grid_level)+1,              &
    257                        nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) ::  p_mg  !:
     265                       nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) ::  p_mg  !<
    258266       REAL(wp), DIMENSION(nzb:nzt_mg(grid_level)+1,                           &
    259267                       nys_mg(grid_level)-1:nyn_mg(grid_level)+1,              &
    260                        nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) ::  r     !:
     268                       nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) ::  r     !<
    261269
    262270!
     
    412420
    413421
    414 
    415     SUBROUTINE restrict_fast( f_mg, r )
    416 
    417422!------------------------------------------------------------------------------!
    418423! Description:
    419424! ------------
    420 ! Interpolates the residual on the next coarser grid with "full weighting"
    421 ! scheme
     425!> Interpolates the residual on the next coarser grid with "full weighting"
     426!> scheme
    422427!------------------------------------------------------------------------------!
     428    SUBROUTINE restrict_fast( f_mg, r )
     429
    423430
    424431       USE control_parameters,                                                 &
     
    435442       IMPLICIT NONE
    436443
    437        INTEGER(iwp) ::  i    !:
    438        INTEGER(iwp) ::  ic   !:
    439        INTEGER(iwp) ::  j    !:
    440        INTEGER(iwp) ::  jc   !:
    441        INTEGER(iwp) ::  k    !:
    442        INTEGER(iwp) ::  kc   !:
    443        INTEGER(iwp) ::  l    !:
    444        INTEGER(iwp) ::  km1  !:
    445        INTEGER(iwp) ::  kp1  !:
    446 
    447        REAL(wp) ::  rkjim    !:
    448        REAL(wp) ::  rkjip    !:
    449        REAL(wp) ::  rkjmi    !:
    450        REAL(wp) ::  rkjmim   !:
    451        REAL(wp) ::  rkjmip   !:
    452        REAL(wp) ::  rkjpi    !:
    453        REAL(wp) ::  rkjpim   !:
    454        REAL(wp) ::  rkjpip   !:
    455        REAL(wp) ::  rkmji    !:
    456        REAL(wp) ::  rkmjim   !:
    457        REAL(wp) ::  rkmjip   !:
    458        REAL(wp) ::  rkmjmi   !:
    459        REAL(wp) ::  rkmjmim  !:
    460        REAL(wp) ::  rkmjmip  !:
    461        REAL(wp) ::  rkmjpi   !:
    462        REAL(wp) ::  rkmjpim  !:
    463        REAL(wp) ::  rkmjpip  !:
     444       INTEGER(iwp) ::  i    !<
     445       INTEGER(iwp) ::  ic   !<
     446       INTEGER(iwp) ::  j    !<
     447       INTEGER(iwp) ::  jc   !<
     448       INTEGER(iwp) ::  k    !<
     449       INTEGER(iwp) ::  kc   !<
     450       INTEGER(iwp) ::  l    !<
     451       INTEGER(iwp) ::  km1  !<
     452       INTEGER(iwp) ::  kp1  !<
     453
     454       REAL(wp) ::  rkjim    !<
     455       REAL(wp) ::  rkjip    !<
     456       REAL(wp) ::  rkjmi    !<
     457       REAL(wp) ::  rkjmim   !<
     458       REAL(wp) ::  rkjmip   !<
     459       REAL(wp) ::  rkjpi    !<
     460       REAL(wp) ::  rkjpim   !<
     461       REAL(wp) ::  rkjpip   !<
     462       REAL(wp) ::  rkmji    !<
     463       REAL(wp) ::  rkmjim   !<
     464       REAL(wp) ::  rkmjip   !<
     465       REAL(wp) ::  rkmjmi   !<
     466       REAL(wp) ::  rkmjmim  !<
     467       REAL(wp) ::  rkmjmip  !<
     468       REAL(wp) ::  rkmjpi   !<
     469       REAL(wp) ::  rkmjpim  !<
     470       REAL(wp) ::  rkmjpip  !<
    464471
    465472       REAL(wp), DIMENSION(nzb:nzt_mg(grid_level)+1,                           &
    466473                           nys_mg(grid_level)-1:nyn_mg(grid_level)+1,          &
    467                            nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) ::  f_mg  !:
     474                           nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) ::  f_mg  !<
    468475
    469476       REAL(wp), DIMENSION(nzb:nzt_mg(grid_level+1)+1,                         &
    470477                           nys_mg(grid_level+1)-1:nyn_mg(grid_level+1)+1,      &
    471                            nxl_mg(grid_level+1)-1:nxr_mg(grid_level+1)+1) ::  r !:
     478                           nxl_mg(grid_level+1)-1:nxr_mg(grid_level+1)+1) ::  r !<
    472479
    473480!
     
    658665
    659666
    660 
    661     SUBROUTINE prolong_fast( p, temp )
    662 
    663667!------------------------------------------------------------------------------!
    664668! Description:
    665669! ------------
    666 ! Interpolates the correction of the perturbation pressure
    667 ! to the next finer grid.
     670!> Interpolates the correction of the perturbation pressure
     671!> to the next finer grid.
    668672!------------------------------------------------------------------------------!
     673    SUBROUTINE prolong_fast( p, temp )
     674
    669675
    670676       USE control_parameters,                                                 &
     
    678684       IMPLICIT NONE
    679685
    680        INTEGER(iwp) ::  i   !:
    681        INTEGER(iwp) ::  j   !:
    682        INTEGER(iwp) ::  k   !:
    683        INTEGER(iwp) ::  l   !:
    684        INTEGER(iwp) ::  kp1 !:
    685        INTEGER(iwp) ::  ke  !: Index for prolog even
    686        INTEGER(iwp) ::  ko  !: Index for prolog odd
     686       INTEGER(iwp) ::  i   !<
     687       INTEGER(iwp) ::  j   !<
     688       INTEGER(iwp) ::  k   !<
     689       INTEGER(iwp) ::  l   !<
     690       INTEGER(iwp) ::  kp1 !<
     691       INTEGER(iwp) ::  ke  !< Index for prolog even
     692       INTEGER(iwp) ::  ko  !< Index for prolog odd
    687693
    688694       REAL(wp), DIMENSION(nzb:nzt_mg(grid_level-1)+1,                         &
    689695                           nys_mg(grid_level-1)-1:nyn_mg(grid_level-1)+1,      &
    690                            nxl_mg(grid_level-1)-1:nxr_mg(grid_level-1)+1 ) ::  p  !:
     696                           nxl_mg(grid_level-1)-1:nxr_mg(grid_level-1)+1 ) ::  p  !<
    691697
    692698       REAL(wp), DIMENSION(nzb:nzt_mg(grid_level)+1,                           &
    693699                           nys_mg(grid_level)-1:nyn_mg(grid_level)+1,          &
    694                            nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) ::  temp  !:
     700                           nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) ::  temp  !<
    695701
    696702
     
    809815
    810816
    811 
    812     SUBROUTINE redblack_fast( f_mg, p_mg )
    813 
    814817!------------------------------------------------------------------------------!
    815818! Description:
    816819! ------------
    817 ! Relaxation method for the multigrid scheme. A Gauss-Seidel iteration with
    818 ! 3D-Red-Black decomposition (GS-RB) is used.
     820!> Relaxation method for the multigrid scheme. A Gauss-Seidel iteration with
     821!> 3D-Red-Black decomposition (GS-RB) is used.
    819822!------------------------------------------------------------------------------!
     823    SUBROUTINE redblack_fast( f_mg, p_mg )
     824
    820825
    821826       USE arrays_3d,                                                          &
     
    838843       IMPLICIT NONE
    839844
    840        INTEGER(iwp) :: color    !:
    841        INTEGER(iwp) :: i        !:
    842        INTEGER(iwp) :: ic       !:
    843        INTEGER(iwp) :: j        !:
    844        INTEGER(iwp) :: jc       !:
    845        INTEGER(iwp) :: jj       !:
    846        INTEGER(iwp) :: k        !:
    847        INTEGER(iwp) :: l        !:
    848        INTEGER(iwp) :: n        !:
    849        INTEGER(iwp) :: km1      !:
    850        INTEGER(iwp) :: kp1      !:
    851 
    852        LOGICAL :: unroll        !:
    853 
    854        REAL(wp) ::  wall_left   !:
    855        REAL(wp) ::  wall_north  !:
    856        REAL(wp) ::  wall_right  !:
    857        REAL(wp) ::  wall_south  !:
    858        REAL(wp) ::  wall_total  !:
    859        REAL(wp) ::  wall_top    !:
     845       INTEGER(iwp) :: color    !<
     846       INTEGER(iwp) :: i        !<
     847       INTEGER(iwp) :: ic       !<
     848       INTEGER(iwp) :: j        !<
     849       INTEGER(iwp) :: jc       !<
     850       INTEGER(iwp) :: jj       !<
     851       INTEGER(iwp) :: k        !<
     852       INTEGER(iwp) :: l        !<
     853       INTEGER(iwp) :: n        !<
     854       INTEGER(iwp) :: km1      !<
     855       INTEGER(iwp) :: kp1      !<
     856
     857       LOGICAL :: unroll        !<
     858
     859       REAL(wp) ::  wall_left   !<
     860       REAL(wp) ::  wall_north  !<
     861       REAL(wp) ::  wall_right  !<
     862       REAL(wp) ::  wall_south  !<
     863       REAL(wp) ::  wall_total  !<
     864       REAL(wp) ::  wall_top    !<
    860865
    861866       REAL(wp), DIMENSION(nzb:nzt_mg(grid_level)+1,                           &
    862867                           nys_mg(grid_level)-1:nyn_mg(grid_level)+1,          &
    863                            nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) ::  f_mg  !:
     868                           nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) ::  f_mg  !<
    864869       REAL(wp), DIMENSION(nzb:nzt_mg(grid_level)+1,                           &
    865870                           nys_mg(grid_level)-1:nyn_mg(grid_level)+1,          &
    866                            nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) ::  p_mg  !:
     871                           nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) ::  p_mg  !<
    867872
    868873       l = grid_level
     
    15201525
    15211526
    1522 
    1523     SUBROUTINE sort_k_to_even_odd_blocks( p_mg , glevel )
    1524 
    15251527!------------------------------------------------------------------------------!
    15261528! Description:
    15271529! ------------
    1528 ! Sort k-Dimension from sequential into blocks of even and odd.
    1529 ! This is required to vectorize the red-black subroutine.
    1530 ! Version for 3D-REAL arrays
     1530!> Sort k-Dimension from sequential into blocks of even and odd.
     1531!> This is required to vectorize the red-black subroutine.
     1532!> Version for 3D-REAL arrays
    15311533!------------------------------------------------------------------------------!
     1534    SUBROUTINE sort_k_to_even_odd_blocks( p_mg , glevel )
     1535
    15321536
    15331537       USE control_parameters,                                                 &
     
    15431547       REAL(wp), DIMENSION(nzb:nzt_mg(glevel)+1,                               &
    15441548                           nys_mg(glevel)-1:nyn_mg(glevel)+1,                  &
    1545                            nxl_mg(glevel)-1:nxr_mg(glevel)+1) ::  p_mg  !:
     1549                           nxl_mg(glevel)-1:nxr_mg(glevel)+1) ::  p_mg  !<
    15461550!
    15471551!--    Local variables
    1548        INTEGER(iwp) :: i        !:
    1549        INTEGER(iwp) :: j        !:
    1550        INTEGER(iwp) :: k        !:
    1551        INTEGER(iwp) :: l        !:
    1552        INTEGER(iwp) :: ind      !:
    1553        REAL(wp), DIMENSION(nzb:nzt_mg(glevel)+1) ::  tmp  !:
     1552       INTEGER(iwp) :: i        !<
     1553       INTEGER(iwp) :: j        !<
     1554       INTEGER(iwp) :: k        !<
     1555       INTEGER(iwp) :: l        !<
     1556       INTEGER(iwp) :: ind      !<
     1557       REAL(wp), DIMENSION(nzb:nzt_mg(glevel)+1) ::  tmp  !<
    15541558
    15551559
     
    15891593
    15901594
    1591 
    1592     SUBROUTINE sort_k_to_even_odd_blocks_1d( f_mg, f_mg_b, glevel )
    1593 
    15941595!------------------------------------------------------------------------------!
    15951596! Description:
    15961597! ------------
    1597 ! Sort k-Dimension from sequential into blocks of even and odd.
    1598 ! This is required to vectorize the red-black subroutine.
    1599 ! Version for 1D-REAL arrays
     1598!> Sort k-Dimension from sequential into blocks of even and odd.
     1599!> This is required to vectorize the red-black subroutine.
     1600!> Version for 1D-REAL arrays
    16001601!------------------------------------------------------------------------------!
     1602    SUBROUTINE sort_k_to_even_odd_blocks_1d( f_mg, f_mg_b, glevel )
     1603
    16011604
    16021605       USE indices,                                                            &
     
    16121615!
    16131616!--    Local variables
    1614        INTEGER(iwp) :: ind   !:
    1615        INTEGER(iwp) :: k     !:
     1617       INTEGER(iwp) :: ind   !<
     1618       INTEGER(iwp) :: k     !<
    16161619
    16171620
     
    16371640
    16381641
    1639 
    1640     SUBROUTINE sort_k_to_even_odd_blocks_int( i_mg , glevel )
    1641 
    16421642!------------------------------------------------------------------------------!
    16431643! Description:
    16441644! ------------
    1645 ! Sort k-Dimension from sequential into blocks of even and odd.
    1646 ! This is required to vectorize the red-black subroutine.
    1647 ! Version for 2D-INTEGER arrays
     1645!> Sort k-Dimension from sequential into blocks of even and odd.
     1646!> This is required to vectorize the red-black subroutine.
     1647!> Version for 2D-INTEGER arrays
    16481648!------------------------------------------------------------------------------!
     1649    SUBROUTINE sort_k_to_even_odd_blocks_int( i_mg , glevel )
     1650
    16491651
    16501652       USE control_parameters,                                                 &
     
    16601662       INTEGER(iwp), DIMENSION(nzb:nzt_mg(glevel)+1,                           &
    16611663                               nys_mg(glevel)-1:nyn_mg(glevel)+1,              &
    1662                                nxl_mg(glevel)-1:nxr_mg(glevel)+1) ::  i_mg  !:
     1664                               nxl_mg(glevel)-1:nxr_mg(glevel)+1) ::  i_mg  !<
    16631665!
    16641666!--    Local variables
    1665        INTEGER(iwp) :: i        !:
    1666        INTEGER(iwp) :: j        !:
    1667        INTEGER(iwp) :: k        !:
    1668        INTEGER(iwp) :: l        !:
    1669        INTEGER(iwp) :: ind      !:
     1667       INTEGER(iwp) :: i        !<
     1668       INTEGER(iwp) :: j        !<
     1669       INTEGER(iwp) :: k        !<
     1670       INTEGER(iwp) :: l        !<
     1671       INTEGER(iwp) :: ind      !<
    16701672       INTEGER(iwp),DIMENSION(nzb:nzt_mg(glevel)+1) ::  tmp
    16711673
     
    17121714
    17131715
    1714 
    1715     SUBROUTINE sort_k_to_sequential( p_mg )
    1716 
    17171716!------------------------------------------------------------------------------!
    17181717! Description:
    17191718! ------------
    1720 ! Sort k-dimension from blocks of even and odd into sequential
     1719!> Sort k-dimension from blocks of even and odd into sequential
    17211720!------------------------------------------------------------------------------!
     1721    SUBROUTINE sort_k_to_sequential( p_mg )
     1722
    17221723
    17231724       USE control_parameters,                                                 &
     
    17311732       REAL(wp), DIMENSION(nzb:nzt_mg(grid_level)+1,                           &
    17321733                           nys_mg(grid_level)-1:nyn_mg(grid_level)+1,          &
    1733                            nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) ::  p_mg  !:
     1734                           nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) ::  p_mg  !<
    17341735!
    17351736!--    Local variables
    1736        INTEGER(iwp) :: i        !:
    1737        INTEGER(iwp) :: j        !:
    1738        INTEGER(iwp) :: k        !:
    1739        INTEGER(iwp) :: l        !:
    1740        INTEGER(iwp) :: ind      !:
     1737       INTEGER(iwp) :: i        !<
     1738       INTEGER(iwp) :: j        !<
     1739       INTEGER(iwp) :: k        !<
     1740       INTEGER(iwp) :: l        !<
     1741       INTEGER(iwp) :: ind      !<
    17411742
    17421743       REAL(wp),DIMENSION(nzb:nzt_mg(grid_level)+1) ::  tmp
     
    17681769
    17691770
    1770 
     1771!------------------------------------------------------------------------------!
     1772! Description:
     1773! ------------
     1774!> Gather subdomain data from all PEs.
     1775!------------------------------------------------------------------------------!
    17711776    SUBROUTINE mg_gather_fast( f2, f2_sub )
    17721777
     
    17821787       IMPLICIT NONE
    17831788
    1784        INTEGER(iwp) ::  i       !:
    1785        INTEGER(iwp) ::  il      !:
    1786        INTEGER(iwp) ::  ir      !:
    1787        INTEGER(iwp) ::  j       !:
    1788        INTEGER(iwp) ::  jn      !:
    1789        INTEGER(iwp) ::  js      !:
    1790        INTEGER(iwp) ::  k       !:
    1791        INTEGER(iwp) ::  nwords  !:
     1789       INTEGER(iwp) ::  i       !<
     1790       INTEGER(iwp) ::  il      !<
     1791       INTEGER(iwp) ::  ir      !<
     1792       INTEGER(iwp) ::  j       !<
     1793       INTEGER(iwp) ::  jn      !<
     1794       INTEGER(iwp) ::  js      !<
     1795       INTEGER(iwp) ::  k       !<
     1796       INTEGER(iwp) ::  nwords  !<
    17921797
    17931798       REAL(wp), DIMENSION(nzb:nzt_mg(grid_level)+1,                           &
    17941799                       nys_mg(grid_level)-1:nyn_mg(grid_level)+1,              &
    1795                        nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) ::  f2    !:
     1800                       nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) ::  f2    !<
    17961801       REAL(wp), DIMENSION(nzb:nzt_mg(grid_level)+1,                           &
    17971802                       nys_mg(grid_level)-1:nyn_mg(grid_level)+1,              &
    1798                        nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) ::  f2_l  !:
     1803                       nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) ::  f2_l  !<
    17991804
    18001805       REAL(wp), DIMENSION(nzb:mg_loc_ind(5,myid)+1,                           &
    18011806                           mg_loc_ind(3,myid)-1:mg_loc_ind(4,myid)+1,          &
    1802                            mg_loc_ind(1,myid)-1:mg_loc_ind(2,myid)+1) ::  f2_sub  !:
     1807                           mg_loc_ind(1,myid)-1:mg_loc_ind(2,myid)+1) ::  f2_sub  !<
    18031808
    18041809
     
    18441849
    18451850
     1851!------------------------------------------------------------------------------!
     1852! Description:
     1853! ------------
     1854!> @todo It might be possible to improve the speed of this routine by using
     1855!>       non-blocking communication
     1856!------------------------------------------------------------------------------!
    18461857    SUBROUTINE mg_scatter_fast( p2, p2_sub )
    1847 !
    1848 !--    TODO: It might be possible to improve the speed of this routine by using
    1849 !--    non-blocking communication
    18501858
    18511859       USE control_parameters,                                                 &
     
    18601868       IMPLICIT NONE
    18611869
    1862        INTEGER(iwp) ::  nwords  !:
     1870       INTEGER(iwp) ::  nwords  !<
    18631871
    18641872       REAL(wp), DIMENSION(nzb:nzt_mg(grid_level-1)+1,                         &
    18651873                           nys_mg(grid_level-1)-1:nyn_mg(grid_level-1)+1,      &
    1866                            nxl_mg(grid_level-1)-1:nxr_mg(grid_level-1)+1) ::  p2  !:
     1874                           nxl_mg(grid_level-1)-1:nxr_mg(grid_level-1)+1) ::  p2  !<
    18671875
    18681876       REAL(wp), DIMENSION(nzb:mg_loc_ind(5,myid)+1,                           &
    18691877                           mg_loc_ind(3,myid)-1:mg_loc_ind(4,myid)+1,          &
    1870                            mg_loc_ind(1,myid)-1:mg_loc_ind(2,myid)+1) ::  p2_sub  !:
     1878                           mg_loc_ind(1,myid)-1:mg_loc_ind(2,myid)+1) ::  p2_sub  !<
    18711879
    18721880!
     
    18861894
    18871895
    1888 
    1889     RECURSIVE SUBROUTINE next_mg_level_fast( f_mg, p_mg, p3, r )
    1890 
    18911896!------------------------------------------------------------------------------!
    18921897! Description:
    18931898! ------------
    1894 ! This is where the multigrid technique takes place. V- and W- Cycle are
    1895 ! implemented and steered by the parameter "gamma". Parameter "nue" determines
    1896 ! the convergence of the multigrid iterative solution. There are nue times
    1897 ! RB-GS iterations. It should be set to "1" or "2", considering the time effort
    1898 ! one would like to invest. Last choice shows a very good converging factor,
    1899 ! but leads to an increase in computing time.
     1899!> This is where the multigrid technique takes place. V- and W- Cycle are
     1900!> implemented and steered by the parameter "gamma". Parameter "nue" determines
     1901!> the convergence of the multigrid iterative solution. There are nue times
     1902!> RB-GS iterations. It should be set to "1" or "2", considering the time effort
     1903!> one would like to invest. Last choice shows a very good converging factor,
     1904!> but leads to an increase in computing time.
    19001905!------------------------------------------------------------------------------!
     1906    RECURSIVE SUBROUTINE next_mg_level_fast( f_mg, p_mg, p3, r )
    19011907
    19021908       USE control_parameters,                                                 &
     
    19131919       IMPLICIT NONE
    19141920
    1915        INTEGER(iwp) ::  i            !:
    1916        INTEGER(iwp) ::  j            !:
    1917        INTEGER(iwp) ::  k            !:
    1918        INTEGER(iwp) ::  nxl_mg_save  !:
    1919        INTEGER(iwp) ::  nxr_mg_save  !:
    1920        INTEGER(iwp) ::  nyn_mg_save  !:
    1921        INTEGER(iwp) ::  nys_mg_save  !:
    1922        INTEGER(iwp) ::  nzt_mg_save  !:
     1921       INTEGER(iwp) ::  i            !<
     1922       INTEGER(iwp) ::  j            !<
     1923       INTEGER(iwp) ::  k            !<
     1924       INTEGER(iwp) ::  nxl_mg_save  !<
     1925       INTEGER(iwp) ::  nxr_mg_save  !<
     1926       INTEGER(iwp) ::  nyn_mg_save  !<
     1927       INTEGER(iwp) ::  nys_mg_save  !<
     1928       INTEGER(iwp) ::  nzt_mg_save  !<
    19231929
    19241930       REAL(wp), DIMENSION(nzb:nzt_mg(grid_level)+1,                           &
    19251931                           nys_mg(grid_level)-1:nyn_mg(grid_level)+1,          &
    1926                            nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) :: f_mg  !:
     1932                           nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) :: f_mg  !<
    19271933       REAL(wp), DIMENSION(nzb:nzt_mg(grid_level)+1,                           &
    19281934                           nys_mg(grid_level)-1:nyn_mg(grid_level)+1,          &
    1929                            nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) :: p_mg  !:
     1935                           nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) :: p_mg  !<
    19301936       REAL(wp), DIMENSION(nzb:nzt_mg(grid_level)+1,                           &
    19311937                           nys_mg(grid_level)-1:nyn_mg(grid_level)+1,          &
    1932                            nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) :: p3    !:
     1938                           nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) :: p3    !<
    19331939       REAL(wp), DIMENSION(nzb:nzt_mg(grid_level)+1,                           &
    19341940                           nys_mg(grid_level)-1:nyn_mg(grid_level)+1,          &
    1935                            nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) :: r     !:
     1941                           nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) :: r     !<
    19361942
    19371943       REAL(wp), DIMENSION(nzb:nzt_mg(grid_level-1)+1,                         &
    19381944                           nys_mg(grid_level-1)-1:nyn_mg(grid_level-1)+1,      &
    1939                            nxl_mg(grid_level-1)-1:nxr_mg(grid_level-1)+1) ::  f2  !:
     1945                           nxl_mg(grid_level-1)-1:nxr_mg(grid_level-1)+1) ::  f2  !<
    19401946       REAL(wp), DIMENSION(nzb:nzt_mg(grid_level-1)+1,                         &
    19411947                           nys_mg(grid_level-1)-1:nyn_mg(grid_level-1)+1,      &
    1942                            nxl_mg(grid_level-1)-1:nxr_mg(grid_level-1)+1) ::  p2  !:
    1943 
    1944        REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  f2_sub  !:
    1945        REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  p2_sub  !:
     1948                           nxl_mg(grid_level-1)-1:nxr_mg(grid_level-1)+1) ::  p2  !<
     1949
     1950       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  f2_sub  !<
     1951       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::  p2_sub  !<
    19461952
    19471953!
     
    22362242
    22372243
    2238 
    2239     SUBROUTINE init_even_odd_blocks
    2240 
    22412244!------------------------------------------------------------------------------!
    22422245! Description:
    22432246! ------------
    2244 ! Initial settings for sorting k-dimension from sequential order (alternate
    2245 ! even/odd) into blocks of even and odd or vice versa
     2247!> Initial settings for sorting k-dimension from sequential order (alternate
     2248!> even/odd) into blocks of even and odd or vice versa
    22462249!------------------------------------------------------------------------------!
     2250    SUBROUTINE init_even_odd_blocks
     2251
    22472252
    22482253       USE arrays_3d,                                                          &
     
    22642269!
    22652270!--    Local variables
    2266        INTEGER(iwp) ::  i     !:
    2267        INTEGER(iwp) ::  l     !:
     2271       INTEGER(iwp) ::  i     !<
     2272       INTEGER(iwp) ::  l     !<
    22682273
    22692274       LOGICAL, SAVE ::  lfirst = .TRUE.
     
    23402345
    23412346
    2342 
    2343      SUBROUTINE special_exchange_horiz ( p_mg, color )
    2344 
    23452347!------------------------------------------------------------------------------!
    23462348! Description:
    23472349! ------------
    2348 ! Special exchange_horiz subroutine for use in redblack. Transfers only
    2349 ! "red" or "black" data points.
     2350!> Special exchange_horiz subroutine for use in redblack. Transfers only
     2351!> "red" or "black" data points.
    23502352!------------------------------------------------------------------------------!
     2353     SUBROUTINE special_exchange_horiz ( p_mg, color )
     2354
    23512355
    23522356       USE control_parameters,                                                 &
     
    23642368       REAL(wp), DIMENSION(nzb:nzt_mg(grid_level)+1,                           &
    23652369                           nys_mg(grid_level)-1:nyn_mg(grid_level)+1,          &
    2366                            nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) ::  p_mg  !:
    2367 
    2368        INTEGER(iwp), intent(IN) ::  color  !:
     2370                           nxl_mg(grid_level)-1:nxr_mg(grid_level)+1) ::  p_mg  !<
     2371
     2372       INTEGER(iwp), intent(IN) ::  color  !<
    23692373!
    23702374!--    Local variables
    2371        INTEGER(iwp) ::  i,i1,i2  !:
    2372        INTEGER(iwp) ::  j,j1,j2  !:
    2373        INTEGER(iwp) ::  k        !:
    2374        INTEGER(iwp) ::  l        !:
    2375        INTEGER(iwp) ::  jys      !:
    2376        INTEGER(iwp) ::  jyn      !:
    2377        INTEGER(iwp) ::  ixl      !:
    2378        INTEGER(iwp) ::  ixr      !:
    2379        logical      ::  sendrecv_in_background_save  !:
    2380        logical      ::  synchronous_exchange_save    !:
     2375       INTEGER(iwp) ::  i,i1,i2  !<
     2376       INTEGER(iwp) ::  j,j1,j2  !<
     2377       INTEGER(iwp) ::  k        !<
     2378       INTEGER(iwp) ::  l        !<
     2379       INTEGER(iwp) ::  jys      !<
     2380       INTEGER(iwp) ::  jyn      !<
     2381       INTEGER(iwp) ::  ixl      !<
     2382       INTEGER(iwp) ::  ixr      !<
     2383       logical      ::  sendrecv_in_background_save  !<
     2384       logical      ::  synchronous_exchange_save    !<
    23812385
    23822386       REAL(wp), DIMENSION(nzb:nzt_mg(grid_level-1)+1,                         &
    23832387                           nys_mg(grid_level-1)-1:nyn_mg(grid_level-1)+1,      &
    2384                            nxl_mg(grid_level-1)-1:nxr_mg(grid_level-1)+1) ::  temp  !:
     2388                           nxl_mg(grid_level-1)-1:nxr_mg(grid_level-1)+1) ::  temp  !<
    23852389
    23862390#if defined ( __parallel )
     
    28892893#endif
    28902894
    2891 
    2892 
    28932895    END SUBROUTINE special_exchange_horiz
    28942896
Note: See TracChangeset for help on using the changeset viewer.