6  integer :: itag, irecv, isend
 
    7  integer, 
dimension(:), 
allocatable :: recvrequest, sendrequest
 
    8  integer, 
dimension(:,:), 
allocatable :: recvstatus, sendstatus
 
   11  integer, 
dimension(:), 
allocatable :: recvrequest_stg, sendrequest_stg
 
   12  integer, 
dimension(:,:), 
allocatable :: recvstatus_stg, sendstatus_stg
 
   37    integer :: iigrid, igrid, ipe, igridco, ipeco, level, ic^
d 
   38    integer, 
dimension(2^D&) :: igridfi, ipefi
 
   39    integer :: n_coarsen, n_refine
 
   50    n_coarsen = count(
coarsen(:, :))
 
   51    n_refine = count(
refine(:, :))
 
   58    recvrequest=mpi_request_null
 
   59    sendrequest=mpi_request_null
 
   64      recvrequest_stg=mpi_request_null
 
   65      sendrequest_stg=mpi_request_null
 
   75                sibling%node => tree%node%child(ic^
d)%node
 
   76                ipefi(ic^
d)=sibling%node%ipe
 
   77                igridfi(ic^
d)=sibling%node%igrid
 
   81             igridco=getnode(ipeco)
 
   83             call coarsen_tree_leaf(igridco,ipeco,igridfi,ipefi,active)
 
   85             call coarsen_grid_siblings(igridco,ipeco,igridfi,ipefi,active)
 
   89                if (ipefi(ic^d)==ipeco) 
then 
   90                   call putnode(igridfi(ic^d),ipefi(ic^d))
 
   91                   coarsen(igridfi(ic^d),ipefi(ic^d))=.false.
 
   99      call mpi_waitall(irecv,recvrequest,recvstatus,ierrmpi)
 
  100      if(stagger_grid) 
call mpi_waitall(irecv,recvrequest_stg,recvstatus_stg,ierrmpi)
 
  103      call mpi_waitall(isend,sendrequest,sendstatus,ierrmpi)
 
  104      if(stagger_grid) 
call mpi_waitall(isend,sendrequest_stg,sendstatus_stg,ierrmpi)
 
  107    deallocate(recvstatus,recvrequest,sendstatus,sendrequest)
 
  108    if(stagger_grid) 
deallocate(recvstatus_stg,recvrequest_stg,sendstatus_stg,sendrequest_stg)
 
  112       do igrid=1,max_blocks
 
  113          if (coarsen(igrid,ipe)) 
then 
  119             call putnode(igrid,ipe)
 
  120             coarsen(igrid,ipe)=.false.
 
  126       do igrid=1,max_blocks
 
  127          if (refine(igrid,ipe)) 
then 
  130                igridfi(ic^d)=getnode(ipe)
 
  134             call refine_tree_leaf(igridfi,ipefi,igrid,ipe,active)
 
  136             if (ipe==mype) 
call refine_grids(igridfi,ipefi,igrid,ipe,active)
 
  139             call putnode(igrid,ipe)
 
  140             refine(igrid,ipe)=.false.
 
  149    if(.not.time_advance) 
call mpi_barrier(icomm,ierrmpi)
 
  151    if(stagger_grid) 
call end_comm_faces
 
  156    call amr_morton_order()
 
  162    call build_connectivity
 
  170    if (time_advance) 
then 
  171       call getbc(global_time+dt,0.d0,ps,iwstart,nwgc)
 
  173       call getbc(global_time,0.d0,ps,iwstart,nwgc)
 
  176    if (use_multigrid) 
call mg_update_refinement(n_coarsen, n_refine)
 
  178    if (
associated(usr_after_refine)) 
then 
  179       call usr_after_refine(n_coarsen, n_refine)
 
 
  186  subroutine proper_nesting
 
  191    logical, 
dimension(:,:), 
allocatable :: refine2
 
  192    integer :: iigrid, igrid, level, ic^
d, inp^
d, i^
d, my_neighbor_type,ipe
 
  194    type(
tree_node_ptr) :: tree, p_neighbor, my_parent, sibling, my_neighbor, &
 
  211          if (.not.
associated(tree%node)) 
exit 
  213          if (
refine(tree%node%igrid,tree%node%ipe)) 
then 
  214             ic^
d=1+modulo(tree%node%ig^
d-1,2);
 
  215             {
do inp^db=ic^db-2,ic^db-1\}
 
  216                if (inp^
d==0|.and.) cycle
 
  217                p_neighbor%node => tree%node%parent%node
 
  219                   p_neighbor%node => p_neighbor%node%neighbor(ic^
d,^
d)%node
 
  220                   if (.not.
associated(p_neighbor%node)) cycle
 
  222                if (p_neighbor%node%leaf) 
then 
  223                   refine(p_neighbor%node%igrid,p_neighbor%node%ipe)=.true.
 
  228          tree%node => tree%node%next%node
 
  235    do iigrid=1,igridstail; igrid=igrids(iigrid);
 
  236       if (refine(igrid,mype).and.coarsen(igrid,mype)) coarsen(igrid,mype)=.false.
 
  240    sendbuf(:)=coarsen(:,mype)
 
  241    call mpi_allgather(sendbuf,max_blocks,mpi_logical,coarsen,max_blocks, &
 
  242                       mpi_logical,icomm,ierrmpi)
 
  244    do level=levmax,max(2,levmin),-1
 
  245       tree%node => level_head(level)%node
 
  247          if (.not.
associated(tree%node)) 
exit 
  249          if (coarsen(tree%node%igrid,tree%node%ipe)) 
then 
  251             my_parent%node => tree%node%parent%node
 
  254    check1:  {
do ic^db=1,2\}
 
  255                sibling%node => my_parent%node%child(ic^d)%node
 
  256                if (sibling%node%leaf) 
then 
  257                   if (coarsen(sibling%node%igrid,sibling%node%ipe)) cycle
 
  266    check2:     {
do ic^db=1,2\}
 
  267                   sibling%node => my_parent%node%child(ic^d)%node
 
  268                   {
do i^db=ic^db-2,ic^db-1\}
 
  269                      if (i^d==0|.and.) cycle
 
  270                      call find_neighbor(my_neighbor,my_neighbor_type, &
 
  272                      select case (my_neighbor_type)
 
  273                      case (neighbor_sibling)
 
  274                         if (refine(my_neighbor%node%igrid, &
 
  275                                    my_neighbor%node%ipe)) 
then 
  282                         neighborchild%node=>my_neighbor%node%child(1^d&)%node
 
  283                         if (neighborchild%node%leaf) 
then 
  284                            if (coarsen(neighborchild%node%igrid, &
 
  285                                        neighborchild%node%ipe)) 
then 
  298          tree%node => tree%node%next%node
 
  307      type(tree_node_ptr) :: sibling
 
  310         sibling%node => my_parent%node%child(ic^d)%node
 
  311         if (sibling%node%leaf) 
then 
  312            coarsen(sibling%node%igrid,sibling%node%ipe)=.false.
 
 
  319  end subroutine proper_nesting
 
  322  subroutine coarsen_grid_siblings(igrid,ipe,child_igrid,child_ipe,active)
 
  328    integer, 
intent(in) :: igrid, ipe
 
  329    integer, 
dimension(2^D&), 
intent(in) :: child_igrid, child_ipe
 
  330    logical, 
intent(in) :: active
 
  332    integer :: igridFi, ipeFi, ixCo^L, ixCoG^L, ixCoM^L, ic^D, idir
 
  337    if (.not. active) 
then 
  338       if (ipe == 
mype) 
then 
  341          igridfi=child_igrid(ic^d)
 
  342          ipefi=child_ipe(ic^d)
 
  353       igridfi=child_igrid(ic^d)
 
  354       ipefi=child_ipe(ic^d)
 
  356       if (ipefi==mype) 
then 
  357          ^d&dxlevel(^d)=rnode(rpdx^d_,igridfi);
 
  359             ixcomin^d=ixmlo^d+(ic^d-1)*(ixmhi^d-ixmlo^d+1)/2;
 
  360             ixcomax^d=ixmhi^d+(ic^d-2)*(ixmhi^d-ixmlo^d+1)/2;
 
  362             call coarsen_grid(ps(igridfi),ixg^ll,ixm^ll,ps(igrid),ixg^ll,ixco^l)
 
  367             ixcogmax^d=ixghi^d/2+nghostcells;
 
  368             ixcom^l=ixcog^l^lsubnghostcells;
 
  369             call coarsen_grid(ps(igridfi),ixg^ll,ixm^ll,psc(igridfi), &
 
  375             call mpi_isend(psc(igridfi)%w,1,type_coarse_block,ipe,itag, &
 
  376                            icomm,sendrequest(isend),ierrmpi)
 
  377             if(stagger_grid) 
then 
  380                 itag_stg=(npe+ipefi+1)+igridfi*(ndir-1+idir)
 
  381                 call mpi_isend(psc(igridfi)%ws,1,type_coarse_block_stg(idir,ic^d),ipe,itag_stg, &
 
  382                              icomm,sendrequest_stg(isend),ierrmpi)
 
  391             call mpi_irecv(ps(igrid)%w,1,type_sub_block(ic^d),ipefi,itag, &
 
  392                            icomm,recvrequest(irecv),ierrmpi)
 
  393             if(stagger_grid) 
then 
  396                 itag_stg=(npe+ipefi+1)+igridfi*(ndir-1+idir)
 
  397                 call mpi_irecv(ps(igrid)%ws,1,type_sub_block_stg(idir,ic^d),ipefi,itag_stg, &
 
  398                                icomm,recvrequest_stg(irecv),ierrmpi)
 
  405  end subroutine coarsen_grid_siblings
 
subroutine unflag_coarsen_siblings
subroutine, public store_faces
To achive consistency and thus conservation of divergence, when refining a block we take into account...
subroutine, public comm_faces
When refining a coarse block with fine neighbours, it is necessary prolong consistently with the alre...
subroutine, public find_neighbor(my_neighbor, my_neighbor_type, tree, id, pole)
find neighors of all blocks
subroutine, public putnode(igrid, ipe)
subroutine, public alloc_node(igrid)
allocate arrays on igrid node
integer function, public getnode(ipe)
Get first available igrid on processor ipe.
Module to coarsen and refine grids for AMR.
subroutine, public amr_coarsen_refine
coarsen and refine blocks to update AMR grid
subroutine, public coarsen_grid(sfi, ixfigl, ixfil, sco, ixcogl, ixcol)
coarsen one grid to its coarser representative
Module with basic grid data structures.
logical, dimension(:,:), allocatable, save refine
logical, dimension(:,:), allocatable, save coarsen
AMR flags and grids-in-use identifier per processor (igrid,ipe)
type(tree_node_ptr), dimension(:,:), allocatable, save igrid_to_node
Array to go from an [igrid, ipe] index to a node pointer.
type(tree_node_ptr), dimension(:), allocatable, save level_head
The head pointer of the linked list per refinement level.
subroutine, public get_level_range
subroutine, public build_connectivity
subroutine, public getigrids
subroutine, public refine_tree_leaf(child_igrid, child_ipe, igrid, ipe, active)
subroutine, public coarsen_tree_leaf(igrid, ipe, child_igrid, child_ipe, active)
update ghost cells of all blocks including physical boundaries
This module contains definitions of global parameters and variables and some generic functions/subrou...
integer, parameter ndim
Number of spatial dimensions for grid variables.
logical stagger_grid
True for using stagger grid.
integer icomm
The MPI communicator.
integer mype
The rank of the current MPI task.
double precision, dimension(:), allocatable, parameter d
integer ierrmpi
A global MPI error return code.
integer npe
The number of MPI tasks.
integer nbufferx
Number of cells as buffer zone.
integer refine_max_level
Maximal number of AMR levels.
integer max_blocks
The maximum number of grid blocks in a processor.
subroutine, public initial_condition(igrid)
fill in initial condition
Module to couple the octree-mg library to AMRVAC. This file uses the VACPP preprocessor,...
subroutine, public refine_grids(child_igrid, child_ipe, igrid, ipe, active)
refine one block to its children blocks
subroutine, public selectgrids
Module with all the methods that users can customize in AMRVAC.
procedure(after_refine), pointer usr_after_refine