TABLE OF CONTENTS
cgca_m2hx/cgca_hxic [ Subroutines ]
[ Top ] [ cgca_m2hx ] [ Subroutines ]
NAME
cgca_hxic
SYNOPSIS
module procedure cgca_hxic
INPUT
! See the parent module
OUTPUT
! See INPUT
SIDE EFFECTS
None
DESCRIPTION
This routine checks that a prior hx call was done flagly, i.e. that the halo cell states are consistent with the states of the corresponding real boundary cells. This routine can be called for any internal hx algorithm, e.g. cgca_hxi or cgca_hxir.
NOTES
All images must call this routine! Lots of remote calls.
USES
All data objects from parent module cgca_m2hx by host association.
USED BY
module cgca_m2hx
SOURCE
integer :: & lbv(4) , & ! lower bounds of the "virtual" coarray ubv(4) , & ! upper bounds of the "virtual" coarray lbr(4) , & ! lower bounds of the "real" coarray, lbv+1 ubr(4) , & ! upper bounds of the "real" coarray, ubv-1 lcob(3) , & ! lower cobounds of the coarray ucob(3) , & ! upper cobounds of the coarray imgpos(3) ! position of the image in a coarray grid ! Start with 0. Any error must resuult in a positive value. flag = 0 ! check for allocated if ( .not. allocated( coarray ) ) & error stop "ERROR: cgca_hxic/m2hx_hxic: coarray is not allocated" lbv = lbound( coarray ) ubv = ubound( coarray ) lbr = lbv + 1 ubr = ubv - 1 lcob = lcobound( coarray ) ucob = ucobound( coarray ) imgpos = this_image( coarray ) ! Make sure only the virtual (halo) arrays are assigned to. ! The real array values must never appear on the left ! hand side of the assignment expressions. ! The halo exchange process is copying real array values into halos. ! There must not ever be copying real values ! to real, or halo to halo, or halo to real. ! Also, only local array must appear on the left. ! We are assigning values to the local array's virtual ! (halo) cells using values from real cells from arrays ! in other images. ! Check 2D halos in direction 1 ! op 1 if ( imgpos(1) .ne. lcob(1) ) then if ( any( & coarray( lbv(1) , lbr(2) : ubr(2) , lbr(3) : ubr(3) , : ) .ne. & coarray( ubr(1) , lbr(2) : ubr(2) , lbr(3) : ubr(3) , : ) & [ imgpos(1)-1 , imgpos(2) , imgpos(3) ] ) ) then flag = 1 ! And return immediately return end if end if ! op 2 if ( imgpos(1) .ne. ucob(1) ) then if ( any( & coarray( ubv(1) , lbr(2) : ubr(2) , lbr(3) : ubr(3) , : ) .ne. & coarray( lbr(1) , lbr(2) : ubr(2) , lbr(3) : ubr(3) , : ) & [ imgpos(1)+1 , imgpos(2) , imgpos(3) ] ) ) then flag = 1 ! And return immediately return end if end if ! exchange 2D halos in direction 2 ! op 3 if ( imgpos(2) .ne. lcob(2) ) then if ( any( & coarray( lbr(1) : ubr(1) , lbv(2) , lbr(3) : ubr(3) , : ) .ne. & coarray( lbr(1) : ubr(1) , ubr(2) , lbr(3) : ubr(3) , : ) & [ imgpos(1) , imgpos(2)-1 , imgpos(3) ] ) ) then flag = 1 ! And return immediately return end if end if ! op 4 if ( imgpos(2) .ne. ucob(2) ) then if ( any( & coarray( lbr(1) : ubr(1) , ubv(2) , lbr(3) : ubr(3) , : ) .ne. & coarray( lbr(1) : ubr(1) , lbr(2) , lbr(3) : ubr(3) , : ) & [ imgpos(1) , imgpos(2)+1 , imgpos(3) ] ) ) then flag = 1 ! And return immediately return end if end if ! exchange 2D halos in direction 3 ! op 5 if ( imgpos(3) .ne. lcob(3) ) then if ( any( & coarray( lbr(1) : ubr(1) , lbr(2) : ubr(2) , lbv(3) , : ) .ne. & coarray( lbr(1) : ubr(1) , lbr(2) : ubr(2) , ubr(3) , : ) & [ imgpos(1) , imgpos(2) , imgpos(3)-1 ] ) ) then flag = 1 ! And return immediately return end if end if ! op 6 if ( imgpos(3) .ne. ucob(3) ) then if ( any( & coarray( lbr(1) : ubr(1) , lbr(2) : ubr(2) , ubv(3) , : ) .ne. & coarray( lbr(1) : ubr(1) , lbr(2) : ubr(2) , lbr(3) , : ) & [ imgpos(1) , imgpos(2) , imgpos(3)+1 ] ) ) then flag = 1 ! And return immediately return end if end if ! exchange 1D halos parallel to direction 3 ! op 7 if ( imgpos(1) .ne. lcob(1) .and. imgpos(2) .ne. lcob(2) ) then if ( any( & coarray( lbv(1) , lbv(2) , lbr(3) : ubr(3) , : ) .ne. & coarray( ubr(1) , ubr(2) , lbr(3) : ubr(3) , : ) & [ imgpos(1)-1 , imgpos(2)-1 , imgpos(3) ] ) ) then flag = 1 ! And return immediately return end if end if ! op 8 if ( imgpos(1) .ne. ucob(1) .and. imgpos(2) .ne. lcob(2) ) then if ( any( & coarray( ubv(1) , lbv(2) , lbr(3) : ubr(3) , :) .ne. & coarray( lbr(1) , ubr(2) , lbr(3) : ubr(3) , :) & [ imgpos(1)+1 , imgpos(2)-1 , imgpos(3) ] ) ) then flag = 1 ! And return immediately return end if end if ! op 9 if ( imgpos(1) .ne. ucob(1) .and. imgpos(2) .ne. ucob(2) ) then if ( any( & coarray( ubv(1) , ubv(2) , lbr(3) : ubr(3) , : ) .ne. & coarray( lbr(1) , lbr(2) , lbr(3) : ubr(3) , : ) & [ imgpos(1)+1 , imgpos(2)+1 , imgpos(3) ] ) ) then flag = 1 ! And return immediately return end if end if ! op 10 if ( imgpos(1) .ne. lcob(1) .and. imgpos(2) .ne. ucob(2) ) then if ( any( & coarray( lbv(1) , ubv(2) , lbr(3) : ubr(3) , : ) .ne. & coarray( ubr(1) , lbr(2) , lbr(3) : ubr(3) , : ) & [ imgpos(1)-1 , imgpos(2)+1 , imgpos(3) ] ) ) then flag = 1 ! And return immediately return end if end if ! exchange 1D halos parallel to direction 1 ! op 11 if ( imgpos(2) .ne. lcob(2) .and. imgpos(3) .ne. lcob(3) ) then if ( any( & coarray( lbr(1) : ubr(1) , lbv(2) , lbv(3) , : ) .ne. & coarray( lbr(1) : ubr(1) , ubr(2) , ubr(3) , : ) & [ imgpos(1) , imgpos(2)-1 , imgpos(3)-1 ] ) ) then flag = 1 ! And return immediately return end if end if ! op 12 if ( imgpos(2) .ne. lcob(2) .and. imgpos(3) .ne. ucob(3) ) then if ( any( & coarray( lbr(1) : ubr(1) , lbv(2) , ubv(3) , : ) .ne. & coarray( lbr(1) : ubr(1) , ubr(2) , lbr(3) , : ) & [ imgpos(1) , imgpos(2)-1 , imgpos(3)+1 ] ) ) then flag = 1 ! And return immediately return end if end if ! op 13 if ( imgpos(2) .ne. ucob(2) .and. imgpos(3) .ne. ucob(3) ) then if ( any( & coarray( lbr(1) : ubr(1) , ubv(2) , ubv(3) , : ) .ne. & coarray( lbr(1) : ubr(1) , lbr(2) , lbr(3) , : ) & [ imgpos(1) , imgpos(2)+1 , imgpos(3)+1 ] ) ) then flag = 1 ! And return immediately return end if end if ! op 14 if ( imgpos(2) .ne. ucob(2) .and. imgpos(3) .ne. lcob(3) ) then if ( any( & coarray( lbr(1) : ubr(1) , ubv(2) , lbv(3) , : ) .ne. & coarray( lbr(1) : ubr(1) , lbr(2) , ubr(3) , : ) & [ imgpos(1) , imgpos(2)+1 , imgpos(3)-1 ] ) ) then flag = 1 ! And return immediately return end if end if ! exchange 1D halos parallel to direction 2 ! op 15 if ( imgpos(1) .ne. lcob(1) .and. imgpos(3) .ne. lcob(3) ) then if ( any( & coarray( lbv(1) , lbr(2) : ubr(2) , lbv(3) , : ) .ne. & coarray( ubr(1) , lbr(2) : ubr(2) , ubr(3) , : ) & [ imgpos(1)-1 , imgpos(2) , imgpos(3)-1 ] ) ) then flag = 1 ! And return immediately return end if end if ! op 16 if ( imgpos(1) .ne. ucob(1) .and. imgpos(3) .ne. lcob(3) ) then if ( any( & coarray( ubv(1) , lbr(2) : ubr(2) , lbv(3) , : ) .ne. & coarray( lbr(1) , lbr(2) : ubr(2) , ubr(3) , : ) & [ imgpos(1)+1 , imgpos(2) , imgpos(3)-1 ] ) ) then flag = 1 ! And return immediately return end if end if ! op 17 if ( imgpos(1) .ne. ucob(1) .and. imgpos(3) .ne. ucob(3) ) then if ( any( & coarray( ubv(1) , lbr(2) : ubr(2) , ubv(3) , : ) .ne. & coarray( lbr(1) , lbr(2) : ubr(2) , lbr(3) , : ) & [ imgpos(1)+1 , imgpos(2) , imgpos(3)+1 ] ) ) then flag = 1 ! And return immediately return end if end if ! op 18 if ( imgpos(1) .ne. lcob(1) .and. imgpos(3) .ne. ucob(3) ) then if ( any( & coarray( lbv(1) , lbr(2) : ubr(2) , ubv(3) , : ) .ne. & coarray( ubr(1) , lbr(2) : ubr(2) , lbr(3) , : ) & [ imgpos(1)-1 , imgpos(2) , imgpos(3)+1 ] ) ) then flag = 1 ! And return immediately return end if end if ! Exchange 8 scalar halos ! See diagram cgca1 in the manual. ! op 19 if ( (imgpos(1) .ne. lcob(1)) .and. (imgpos(2) .ne. lcob(2)) .and. & (imgpos(3) .ne. lcob(3)) ) then if ( any( & coarray( lbv(1) , lbv(2) , lbv(3) , : ) .ne. & coarray( ubr(1) , ubr(2) , ubr(3) , : ) & [ imgpos(1)-1 , imgpos(2)-1 , imgpos(3)-1 ] ) ) then flag = 1 ! And return immediately return end if end if ! op 20 if ( (imgpos(1) .ne. ucob(1)) .and. (imgpos(2) .ne. lcob(2)) .and. & (imgpos(3) .ne. lcob(3)) ) then if ( any( & coarray( ubv(1) , lbv(2) , lbv(3) , : ) .ne. & coarray( lbr(1) , ubr(2) , ubr(3) , : ) & [ imgpos(1)+1 , imgpos(2)-1 , imgpos(3)-1 ] ) ) then flag = 1 ! And return immediately return end if end if ! op 21 if ( (imgpos(1) .ne. ucob(1)) .and. (imgpos(2) .ne. ucob(2)) .and. & (imgpos(3) .ne. lcob(3)) ) then if ( any( & coarray( ubv(1) , ubv(2) , lbv(3) , : ) .ne. & coarray( lbr(1) , lbr(2) , ubr(3) , : ) & [ imgpos(1)+1 , imgpos(2)+1 , imgpos(3)-1 ] ) ) then flag = 1 ! And return immediately return end if end if ! op 22 if ( (imgpos(1) .ne. lcob(1)) .and. (imgpos(2) .ne. ucob(2)) .and. & (imgpos(3) .ne. lcob(3)) ) then if ( any( & coarray( lbv(1) , ubv(2) , lbv(3) , : ) .ne. & coarray( ubr(1) , lbr(2) , ubr(3) , : ) & [ imgpos(1)-1 , imgpos(2)+1 , imgpos(3)-1 ] ) ) then flag = 1 ! And return immediately return end if end if ! op 23 if ( (imgpos(1) .ne. lcob(1)) .and. (imgpos(2) .ne. lcob(2)) .and. & (imgpos(3) .ne. ucob(3)) ) then if ( any( & coarray( lbv(1) , lbv(2) , ubv(3) , : ) .ne. & coarray( ubr(1) , ubr(2) , lbr(3) , : ) & [ imgpos(1)-1 , imgpos(2)-1 , imgpos(3)+1 ] ) ) then flag = 1 ! And return immediately return end if end if ! op 24 if ( (imgpos(1) .ne. ucob(1)) .and. (imgpos(2) .ne. lcob(2)) .and. & (imgpos(3) .ne. ucob(3)) ) then if ( any( & coarray( ubv(1) , lbv(2) , ubv(3) , : ) .ne. & coarray( lbr(1) , ubr(2) , lbr(3) , : ) & [ imgpos(1)+1 , imgpos(2)-1 , imgpos(3)+1 ] ) ) then flag = 1 ! And return immediately return end if end if ! op 25 if ( (imgpos(1) .ne. ucob(1)) .and. (imgpos(2) .ne. ucob(2)) .and. & (imgpos(3) .ne. ucob(3)) ) then if ( any( & coarray( ubv(1) , ubv(2) , ubv(3) , : ) .ne. & coarray( lbr(1) , lbr(2) , lbr(3) , : ) & [ imgpos(1)+1 , imgpos(2)+1 , imgpos(3)+1 ] ) ) then flag = 1 ! And return immediately return end if end if ! op 26 if ( (imgpos(1) .ne. lcob(1)) .and. (imgpos(2) .ne. ucob(2)) .and. & (imgpos(3) .ne. ucob(3)) ) then if ( any( & coarray( lbv(1) , ubv(2) , ubv(3) , : ) .ne. & coarray( ubr(1) , lbr(2) , lbr(3) , : ) & [ imgpos(1)-1 , imgpos(2)+1 , imgpos(3)+1 ] ) ) then flag = 1 ! And return immediately return end if end if end procedure cgca_hxic
cgca_m2hx/m2hx_hxic [ Submodules ]
[ Top ] [ cgca_m2hx ] [ Submodules ]
NAME
m2hx_hxic
SYNOPSIS
!$Id: m2hx_hxic.f90 430 2017-06-30 07:39:43Z mexas $ submodule ( cgca_m2hx ) m2hx_hxic
DESCRIPTION
Submodule of cgca_m2hx with a hx subroutine.
AUTHOR
Anton Shterenlikht
COPYRIGHT
See LICENCE
CONTAINS
USES
Variables and parameters from the parent module cgca_m2hx.
USED BY
The parent module cgca_m2hx.
SOURCE
implicit none contains