subroutine fix_edges(psuse,idimmin,idimmax)
use mod_global_parameters
type(state) :: psuse(max_blocks)
integer, intent(in) :: idimmin,idimmax
integer :: iigrid, igrid, idims, iside, iotherside, i1,i2,i3, ic1,ic2,ic3,&
inc1,inc2,inc3, ixMcmin1,ixMcmin2,ixMcmin3,ixMcmax1,ixMcmax2,ixMcmax3
integer :: nbuf, ibufnext
integer :: ibufnext_cc
integer :: pi1,pi2,pi3, mi1,mi2,mi3, ph1,ph2,ph3, mh1,mh2,mh3 !To detect corners
integer :: ixEmin1(1:3),ixEmin2(1:3),ixEmin3(1:3),ixEmax1(1:3),&
ixEmax2(1:3),ixEmax3(1:3), ixtEmin1,ixtEmin2,ixtEmin3,ixtEmax1,&
ixtEmax2,ixtEmax3, ixFmin1(1:ndim),ixFmin2(1:ndim),ixFmin3(1:ndim),&
ixFmax1(1:ndim),ixFmax2(1:ndim),ixFmax3(1:ndim), ixfEmin1(1:3),&
ixfEmin2(1:3),ixfEmin3(1:3),ixfEmax1(1:3),ixfEmax2(1:3),ixfEmax3(1:3)
integer :: nx1,nx2,nx3, idir, ix, ipe_neighbor, ineighbor
logical :: pcorner(1:ndim),mcorner(1:ndim)
!!if (nrecv_ct>0) then
!! call MPI_WAITALL(nrecv_ct,cc_recvreq,cc_recvstat,ierrmpi)
!!end if
!!! Initialise buffer counter again
!!ibuf=1
!!ibuf_cc=1
!!do iigrid=1,igridstail; igrid=igrids(iigrid);
!! do idims= idimmin,idimmax
!! do iside=1,2
!! i1=kr(1,idims)*(2*iside-3);i2=kr(2,idims)*(2*iside-3)
!! i3=kr(3,idims)*(2*iside-3);
!! if (neighbor_pole(i1,i2,i3,igrid)/=0) cycle
!! select case(neighbor_type(i1,i2,i3,igrid))
!! case(neighbor_fine)
!! ! The first neighbour is finer
!! if (.not.neighbor_active(i1,i2,i3,&
!! igrid).or..not.neighbor_active(0,0,0,igrid) ) then
!! do ic3=1+int((1-i3)/2),2-int((1+i3)/2)
!! inc3=2*i3+ic3
!! do ic2=1+int((1-i2)/2),2-int((1+i2)/2)
!! inc2=2*i2+ic2
!! do ic1=1+int((1-i1)/2),2-int((1+i1)/2)
!! inc1=2*i1+ic1
!! ipe_neighbor=neighbor_child(2,inc1,inc2,inc3,igrid)
!! !! When the neighbour is in a different process
!! if (ipe_neighbor/=mype) then
!! ibufnext=ibuf+isize(idims)
!! ibuf=ibufnext
!! end if
!! end do
!! end do
!! end do
!! cycle
!! end if
!! ! Check if there are corners
!! pcorner=.false.
!! mcorner=.false.
!! do idir=1,ndim
!! pi1=i1+kr(idir,1);pi2=i2+kr(idir,2);pi3=i3+kr(idir,3);
!! mi1=i1-kr(idir,1);mi2=i2-kr(idir,2);mi3=i3-kr(idir,3);
!! ph1=pi1-kr(idims,1)*(2*iside-3)
!! ph2=pi2-kr(idims,2)*(2*iside-3)
!! ph3=pi3-kr(idims,3)*(2*iside-3);
!! mh1=mi1-kr(idims,1)*(2*iside-3)
!! mh2=mi2-kr(idims,2)*(2*iside-3)
!! mh3=mi3-kr(idims,3)*(2*iside-3);
!! if (neighbor_type(ph1,ph2,ph3,&
!! igrid)==neighbor_fine) pcorner(idir)=.true.
!! if (neighbor_type(mh1,mh2,mh3,&
!! igrid)==neighbor_fine) mcorner(idir)=.true.
!! end do
!! ! Calculate indices range
!! call set_ix_circ(ixFmin1,ixFmin2,ixFmin3,ixFmax1,ixFmax2,ixFmax3,&
!! ixtEmin1,ixtEmin2,ixtEmin3,ixtEmax1,ixtEmax2,ixtEmax3,ixEmin1,&
!! ixEmin2,ixEmin3,ixEmax1,ixEmax2,ixEmax3,ixfEmin1,ixfEmin2,&
!! ixfEmin3,ixfEmax1,ixfEmax2,ixfEmax3,igrid,idims,iside,.false.,&
!! .false.,0,0,0,pcorner,mcorner)
!! ! Remove coarse part of circulation
!! call add_sub_circ(ixFmin1,ixFmin2,ixFmin3,ixFmax1,ixFmax2,ixFmax3,&
!! ixtEmin1,ixtEmin2,ixtEmin3,ixtEmax1,ixtEmax2,ixtEmax3,ixEmin1,&
!! ixEmin2,ixEmin3,ixEmax1,ixEmax2,ixEmax3,ixfEmin1,ixfEmin2,&
!! ixfEmin3,ixfEmax1,ixfEmax2,ixfEmax3,pflux(iside,idims,&
!! igrid)%edge,idims,iside,.false.,psuse(igrid))
!! ! Add fine part of the circulation
!! do ic3=1+int((1-i3)/2),2-int((1+i3)/2)
!! inc3=2*i3+ic3
!! do ic2=1+int((1-i2)/2),2-int((1+i2)/2)
!! inc2=2*i2+ic2
!! do ic1=1+int((1-i1)/2),2-int((1+i1)/2)
!! inc1=2*i1+ic1
!! ineighbor=neighbor_child(1,inc1,inc2,inc3,igrid)
!! ipe_neighbor=neighbor_child(2,inc1,inc2,inc3,igrid)
!! iotherside=3-iside
!! nx1=(ixMhi1-ixMlo1+1)/2;nx2=(ixMhi2-ixMlo2+1)/2
!! nx3=(ixMhi3-ixMlo3+1)/2;
!! call set_ix_circ(ixFmin1,ixFmin2,ixFmin3,ixFmax1,ixFmax2,&
!! ixFmax3,ixtEmin1,ixtEmin2,ixtEmin3,ixtEmax1,ixtEmax2,&
!! ixtEmax3,ixEmin1,ixEmin2,ixEmin3,ixEmax1,ixEmax2,ixEmax3,&
!! ixfEmin1,ixfEmin2,ixfEmin3,ixfEmax1,ixfEmax2,ixfEmax3,igrid,&
!! idims,iside,.true.,.false.,inc1,inc2,inc3,pcorner,mcorner)
!! if (ipe_neighbor==mype) then
!! call add_sub_circ(ixFmin1,ixFmin2,ixFmin3,ixFmax1,ixFmax2,&
!! ixFmax3,ixtEmin1,ixtEmin2,ixtEmin3,ixtEmax1,ixtEmax2,&
!! ixtEmax3,ixEmin1,ixEmin2,ixEmin3,ixEmax1,ixEmax2,ixEmax3,&
!! ixfEmin1,ixfEmin2,ixfEmin3,ixfEmax1,ixfEmax2,ixfEmax3,&
!! pflux(iotherside,idims,ineighbor)%edge,idims,iside,.true.,&
!! psuse(igrid))
!! else
!! ibufnext=ibuf+isize(idims)
!! call add_sub_circ(ixFmin1,ixFmin2,ixFmin3,ixFmax1,ixFmax2,&
!! ixFmax3,ixtEmin1,ixtEmin2,ixtEmin3,ixtEmax1,ixtEmax2,&
!! ixtEmax3,ixEmin1,ixEmin2,ixEmin3,ixEmax1,ixEmax2,ixEmax3,&
!! ixfEmin1,ixfEmin2,ixfEmin3,ixfEmax1,ixfEmax2,ixfEmax3,&
!! reshape(source=recvbuffer(ibufnext-&
!! isize_stg(idims):ibufnext-1),shape=(/ ixtEmax1-ixtEmin1+1,&
!! ixtEmax2-ixtEmin2+1,ixtEmax3-ixtEmin3+1 ,3-1 /)),idims,&
!! iside,.true.,psuse(igrid))
!! ibuf=ibufnext
!! end if
!! end do
!! end do
!! end do
!! case(neighbor_sibling)
!! ! The first neighbour is at the same level
!! ! Check if there are corners
!! do idir=idims+1,ndim
!! pcorner=.false.
!! mcorner=.false.
!! pi1=i1+kr(idir,1);pi2=i2+kr(idir,2);pi3=i3+kr(idir,3);
!! mi1=i1-kr(idir,1);mi2=i2-kr(idir,2);mi3=i3-kr(idir,3);
!! ph1=pi1-kr(idims,1)*(2*iside-3)
!! ph2=pi2-kr(idims,2)*(2*iside-3)
!! ph3=pi3-kr(idims,3)*(2*iside-3);
!! mh1=mi1-kr(idims,1)*(2*iside-3)
!! mh2=mi2-kr(idims,2)*(2*iside-3)
!! mh3=mi3-kr(idims,3)*(2*iside-3);
!! if (neighbor_type(pi1,pi2,pi3,&
!! igrid)==neighbor_fine.and.neighbor_type(ph1,ph2,ph3,&
!! igrid)==neighbor_sibling.and.neighbor_pole(pi1,pi2,pi3,&
!! igrid)==0) then
!! pcorner(idir)=.true.
!! ! Remove coarse part
!! ! Set indices
!! call set_ix_circ(ixFmin1,ixFmin2,ixFmin3,ixFmax1,ixFmax2,&
!! ixFmax3,ixtEmin1,ixtEmin2,ixtEmin3,ixtEmax1,ixtEmax2,&
!! ixtEmax3,ixEmin1,ixEmin2,ixEmin3,ixEmax1,ixEmax2,ixEmax3,&
!! ixfEmin1,ixfEmin2,ixfEmin3,ixfEmax1,ixfEmax2,ixfEmax3,&
!! igrid,idims,iside,.false.,.true.,0,0,0,pcorner,mcorner)
!! ! Remove
!! call add_sub_circ(ixFmin1,ixFmin2,ixFmin3,ixFmax1,ixFmax2,&
!! ixFmax3,ixtEmin1,ixtEmin2,ixtEmin3,ixtEmax1,ixtEmax2,&
!! ixtEmax3,ixEmin1,ixEmin2,ixEmin3,ixEmax1,ixEmax2,ixEmax3,&
!! ixfEmin1,ixfEmin2,ixfEmin3,ixfEmax1,ixfEmax2,ixfEmax3,&
!! pflux(iside,idims,igrid)%edge,idims,iside,.false.,&
!! psuse(igrid))
!! ! Add fine part
!! ! Find relative position of finer grid
!! do ix=1,2
!! inc1=kr(idims,1)*3*(iside-1)+3*kr(idir,1)+kr(6-idir-idims,&
!! 1)*ix
!! inc2=kr(idims,2)*3*(iside-1)+3*kr(idir,2)+kr(6-idir-idims,&
!! 2)*ix
!! inc3=kr(idims,3)*3*(iside-1)+3*kr(idir,3)+kr(6-idir-idims,&
!! 3)*ix;
!! ineighbor=neighbor_child(1,inc1,inc2,inc3,igrid)
!! ipe_neighbor=neighbor_child(2,inc1,inc2,inc3,igrid)
!! iotherside=3-iside
!! ! Set indices
!! call set_ix_circ(ixFmin1,ixFmin2,ixFmin3,ixFmax1,ixFmax2,&
!! ixFmax3,ixtEmin1,ixtEmin2,ixtEmin3,ixtEmax1,ixtEmax2,&
!! ixtEmax3,ixEmin1,ixEmin2,ixEmin3,ixEmax1,ixEmax2,ixEmax3,&
!! ixfEmin1,ixfEmin2,ixfEmin3,ixfEmax1,ixfEmax2,ixfEmax3,&
!! igrid,idims,iside,.true.,.true.,inc1,inc2,inc3,pcorner,&
!! mcorner)
!! ! add
!! if (ipe_neighbor==mype) then
!! call add_sub_circ(ixFmin1,ixFmin2,ixFmin3,ixFmax1,ixFmax2,&
!! ixFmax3,ixtEmin1,ixtEmin2,ixtEmin3,ixtEmax1,ixtEmax2,&
!! ixtEmax3,ixEmin1,ixEmin2,ixEmin3,ixEmax1,ixEmax2,ixEmax3,&
!! ixfEmin1,ixfEmin2,ixfEmin3,ixfEmax1,ixfEmax2,ixfEmax3,&
!! pflux(iotherside,idims,ineighbor)%edge,idims,iside,&
!! .true.,psuse(igrid))
!! else
!! ibufnext_cc=ibuf_cc+isize_stg(idims)
!! call add_sub_circ(ixFmin1,ixFmin2,ixFmin3,ixFmax1,ixFmax2,&
!! ixFmax3,ixtEmin1,ixtEmin2,ixtEmin3,ixtEmax1,ixtEmax2,&
!! ixtEmax3,ixEmin1,ixEmin2,ixEmin3,ixEmax1,ixEmax2,ixEmax3,&
!! ixfEmin1,ixfEmin2,ixfEmin3,ixfEmax1,ixfEmax2,ixfEmax3,&
!! reshape(source=recvbuffer_cc(ibuf_cc:ibufnext_cc-1),&
!! shape=(/ ixtEmax1-ixtEmin1+1,ixtEmax2-ixtEmin2+1,&
!! ixtEmax3-ixtEmin3+1 ,3-1 /)),idims,iside,.true.,&
!! psuse(igrid))
!! ibuf_cc=ibufnext_cc
!! end if
!! end do
!! ! Set CoCorner to false again for next step
!! pcorner(idir)=.false.
!! end if
!! if (neighbor_type(mi1,mi2,mi3,&
!! igrid)==neighbor_fine.and.neighbor_type(mh1,mh2,mh3,&
!! igrid)==neighbor_sibling.and.neighbor_pole(mi1,mi2,mi3,&
!! igrid)==0) then
!! mcorner(idir)=.true.
!! ! Remove coarse part
!! ! Set indices
!! call set_ix_circ(ixFmin1,ixFmin2,ixFmin3,ixFmax1,ixFmax2,&
!! ixFmax3,ixtEmin1,ixtEmin2,ixtEmin3,ixtEmax1,ixtEmax2,&
!! ixtEmax3,ixEmin1,ixEmin2,ixEmin3,ixEmax1,ixEmax2,ixEmax3,&
!! ixfEmin1,ixfEmin2,ixfEmin3,ixfEmax1,ixfEmax2,ixfEmax3,&
!! igrid,idims,iside,.false.,.true.,0,0,0,pcorner,mcorner)
!! ! Remove
!! call add_sub_circ(ixFmin1,ixFmin2,ixFmin3,ixFmax1,ixFmax2,&
!! ixFmax3,ixtEmin1,ixtEmin2,ixtEmin3,ixtEmax1,ixtEmax2,&
!! ixtEmax3,ixEmin1,ixEmin2,ixEmin3,ixEmax1,ixEmax2,ixEmax3,&
!! ixfEmin1,ixfEmin2,ixfEmin3,ixfEmax1,ixfEmax2,ixfEmax3,&
!! pflux(iside,idims,igrid)%edge,idims,iside,.false.,&
!! psuse(igrid))
!! ! Add fine part
!! ! Find relative position of finer grid
!! do ix=1,2
!! inc1=kr(idims,1)*3*(iside-1)+kr(6-idir-idims,1)*ix
!! inc2=kr(idims,2)*3*(iside-1)+kr(6-idir-idims,2)*ix
!! inc3=kr(idims,3)*3*(iside-1)+kr(6-idir-idims,3)*ix;
!! ineighbor=neighbor_child(1,inc1,inc2,inc3,igrid)
!! ipe_neighbor=neighbor_child(2,inc1,inc2,inc3,igrid)
!! iotherside=3-iside
!! ! Set indices
!! call set_ix_circ(ixFmin1,ixFmin2,ixFmin3,ixFmax1,ixFmax2,&
!! ixFmax3,ixtEmin1,ixtEmin2,ixtEmin3,ixtEmax1,ixtEmax2,&
!! ixtEmax3,ixEmin1,ixEmin2,ixEmin3,ixEmax1,ixEmax2,ixEmax3,&
!! ixfEmin1,ixfEmin2,ixfEmin3,ixfEmax1,ixfEmax2,ixfEmax3,&
!! igrid,idims,iside,.true.,.true.,inc1,inc2,inc3,pcorner,&
!! mcorner)
!! ! add
!! if (ipe_neighbor==mype) then
!! call add_sub_circ(ixFmin1,ixFmin2,ixFmin3,ixFmax1,ixFmax2,&
!! ixFmax3,ixtEmin1,ixtEmin2,ixtEmin3,ixtEmax1,ixtEmax2,&
!! ixtEmax3,ixEmin1,ixEmin2,ixEmin3,ixEmax1,ixEmax2,&
!! ixEmax3,ixfEmin1,ixfEmin2,ixfEmin3,ixfEmax1,ixfEmax2,&
!! ixfEmax3,pflux(iotherside,idims,ineighbor)%edge,idims,&
!! iside,.true.,psuse(igrid))
!! else
!! ibufnext_cc=ibuf_cc+isize_stg(idims)
!! call add_sub_circ(ixFmin1,ixFmin2,ixFmin3,ixFmax1,ixFmax2,&
!! ixFmax3,ixtEmin1,ixtEmin2,ixtEmin3,ixtEmax1,ixtEmax2,&
!! ixtEmax3,ixEmin1,ixEmin2,ixEmin3,ixEmax1,ixEmax2,&
!! ixEmax3,ixfEmin1,ixfEmin2,ixfEmin3,ixfEmax1,ixfEmax2,&
!! ixfEmax3,reshape(source=recvbuffer_cc(&
!! ibuf_cc:ibufnext_cc-1),shape=(/ ixtEmax1-ixtEmin1+1,&
!! ixtEmax2-ixtEmin2+1,ixtEmax3-ixtEmin3+1 ,3-1 /)),idims,&
!! iside,.true.,psuse(igrid))
!! ibuf_cc=ibufnext_cc
!! end if
!! end do
!! ! Set CoCorner to false again for next step
!! mcorner(idir)=.false.
!! end if
!! end do
!! end select
!! end do
!! end do
!!end do
!!if (nsend_ct>0) call MPI_WAITALL(nsend_ct,cc_sendreq,cc_sendstat,ierrmpi)
end subroutine fix_edges