fix_edges Subroutine

public subroutine fix_edges(psuse, idimmin, idimmax)

Uses

  • proc~~fix_edges~~UsesGraph proc~fix_edges fix_edges module~mod_global_parameters mod_global_parameters proc~fix_edges->module~mod_global_parameters module~mod_basic_types mod_basic_types module~mod_global_parameters->module~mod_basic_types module~mod_connectivity mod_connectivity module~mod_global_parameters->module~mod_connectivity module~mod_constants mod_constants module~mod_global_parameters->module~mod_constants module~mod_physicaldata mod_physicaldata module~mod_global_parameters->module~mod_physicaldata module~mod_variables mod_variables module~mod_global_parameters->module~mod_variables mpi mpi module~mod_global_parameters->mpi module~mod_variables->module~mod_basic_types

Arguments

Type IntentOptional Attributes Name
type(state) :: psuse(max_blocks)
integer, intent(in) :: idimmin
integer, intent(in) :: idimmax

Called by

proc~~fix_edges~~CalledByGraph proc~fix_edges fix_edges proc~recalculateb recalculateB proc~recalculateb->proc~fix_edges proc~improve_initial_condition improve_initial_condition proc~improve_initial_condition->proc~recalculateb proc~main main proc~main->proc~improve_initial_condition program~agile agile program~agile->proc~main

Source Code

   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