set_ix_circ Subroutine

private subroutine 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, add, CoCorner, inc1, inc2, inc3, pcorner, mcorner)

Uses

  • proc~~set_ix_circ~~UsesGraph proc~set_ix_circ set_ix_circ module~mod_global_parameters mod_global_parameters proc~set_ix_circ->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

This routine sets the indexes for the correction of the circulation according to several different cases, as grids located in different cpus, presence of corners, and different relative locations of the fine grid respect to the coarse one

Arguments

Type IntentOptional Attributes Name
integer, intent(out) :: ixFmin1(1:ndim)
integer, intent(out) :: ixFmin2(1:ndim)
integer, intent(out) :: ixFmin3(1:ndim)
integer, intent(out) :: ixFmax1(1:ndim)
integer, intent(out) :: ixFmax2(1:ndim)
integer, intent(out) :: ixFmax3(1:ndim)
integer, intent(out) :: ixtEmin1
integer, intent(out) :: ixtEmin2
integer, intent(out) :: ixtEmin3
integer, intent(out) :: ixtEmax1
integer, intent(out) :: ixtEmax2
integer, intent(out) :: ixtEmax3
integer, intent(out) :: ixEmin1(1:3)
integer, intent(out) :: ixEmin2(1:3)
integer, intent(out) :: ixEmin3(1:3)
integer, intent(out) :: ixEmax1(1:3)
integer, intent(out) :: ixEmax2(1:3)
integer, intent(out) :: ixEmax3(1:3)
integer, intent(out) :: ixfEmin1(1:3)
integer, intent(out) :: ixfEmin2(1:3)
integer, intent(out) :: ixfEmin3(1:3)
integer, intent(out) :: ixfEmax1(1:3)
integer, intent(out) :: ixfEmax2(1:3)
integer, intent(out) :: ixfEmax3(1:3)
integer, intent(in) :: igrid
integer, intent(in) :: idims
integer, intent(in) :: iside
logical, intent(in) :: add
logical, intent(in) :: CoCorner
integer, intent(in) :: inc1
integer, intent(in) :: inc2
integer, intent(in) :: inc3
logical, intent(inout) :: pcorner(1:ndim)
logical, intent(inout) :: mcorner(1:ndim)

Source Code

   subroutine 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,add,CoCorner,inc1,inc2,inc3,pcorner,&
      mcorner)
     use mod_global_parameters

     integer,intent(in)    :: igrid,idims,iside,inc1,inc2,inc3
     logical,intent(in)    :: add,CoCorner
     logical,intent(inout) :: pcorner(1:ndim),mcorner(1:ndim)
     integer,intent(out)   :: ixFmin1(1:ndim),ixFmin2(1:ndim),ixFmin3(1:ndim),&
        ixFmax1(1:ndim),ixFmax2(1:ndim),ixFmax3(1:ndim),ixtEmin1,ixtEmin2,&
        ixtEmin3,ixtEmax1,ixtEmax2,ixtEmax3,ixEmin1(1:3),ixEmin2(1:3),&
        ixEmin3(1:3),ixEmax1(1:3),ixEmax2(1:3),ixEmax3(1:3),ixfEmin1(1:3),&
        ixfEmin2(1:3),ixfEmin3(1:3),ixfEmax1(1:3),ixfEmax2(1:3),ixfEmax3(1:3) !Indices for faces and edges
     integer               :: icor1,icor2,icor3,idim1,idir,nx1,nx2,nx3,middle1,&
        middle2,middle3
     integer               :: ixtfEmin1,ixtfEmin2,ixtfEmin3,ixtfEmax1,&
        ixtfEmax2,ixtfEmax3

     ! ixF -> Indices for the _F_aces, and
     ! depends on the field component
     ! ixtE -> are the _t_otal range of the 'edge' array
     ! ixE -> are the ranges of the edge array,
     ! depending on the component
     ! ixfE -> are the ranges of the fE array (3D),
     ! and also depend on the component

     ! ... General ...
     ! Assign indices for the size of the E field array

     ixtfEmin1=ixMlo1-1;ixtfEmin2=ixMlo2-1;ixtfEmin3=ixMlo3-1;
     ixtfEmax1=ixMhi1;ixtfEmax2=ixMhi2;ixtfEmax3=ixMhi3;

     if(add) then
       nx1=(ixMhi1-ixMlo1+1)/2;nx2=(ixMhi2-ixMlo2+1)/2
       nx3=(ixMhi3-ixMlo3+1)/2;
     else
       nx1=ixMhi1-ixMlo1+1;nx2=ixMhi2-ixMlo2+1;nx3=ixMhi3-ixMlo3+1;
     end if

     do idim1=1,ndim
       ixtEmin1=0;ixtEmin2=0;ixtEmin3=0;
       ixtEmax1=nx1;ixtEmax2=nx2;ixtEmax3=nx3;
       select case(idims)
       case(1)
         ixtEmin1=1;ixtEmax1=1;
         if (iside==1) ixtfEmax1=ixtfEmin1;
         if (iside==2) ixtfEmin1=ixtfEmax1;

       case(2)
         ixtEmin2=1;ixtEmax2=1;
         if (iside==1) ixtfEmax2=ixtfEmin2;
         if (iside==2) ixtfEmin2=ixtfEmax2;

       case(3)
         ixtEmin3=1;ixtEmax3=1;
         if (iside==1) ixtfEmax3=ixtfEmin3;
         if (iside==2) ixtfEmin3=ixtfEmax3;

       end select
     end do

     ! Assign indices, considering only the face
     ! (idims and iside)
     do idim1=1,ndim
       ixFmin1(idim1)=ixMlo1-kr(idim1,1);ixFmin2(idim1)=ixMlo2-kr(idim1,2)
       ixFmin3(idim1)=ixMlo3-kr(idim1,3);
       ixFmax1(idim1)=ixMhi1;ixFmax2(idim1)=ixMhi2;ixFmax3(idim1)=ixMhi3;
       select case(idims)
       case(1)
          select case(iside)
          case(1)
          ixFmax1(idim1)=ixFmin1(idim1)
          case(2)
          ixFmin1(idim1)=ixFmax1(idim1)
          end select

       case(2)
          select case(iside)
          case(1)
          ixFmax2(idim1)=ixFmin2(idim1)
          case(2)
          ixFmin2(idim1)=ixFmax2(idim1)
          end select

       case(3)
          select case(iside)
          case(1)
          ixFmax3(idim1)=ixFmin3(idim1)
          case(2)
          ixFmin3(idim1)=ixFmax3(idim1)
          end select

       end select
     end do
     ! ... Relative position ...
     ! Restrict range using relative position
     if(add) then
       middle1=(ixMhi1+ixMlo1)/2;middle2=(ixMhi2+ixMlo2)/2
       middle3=(ixMhi3+ixMlo3)/2;

       if(inc1==1) then
         ixFmax1(:)=middle1
         ixtfEmax1=middle1
       end if
       if(inc1==2) then
         ixFmin1(:)=middle1+1
         ixtfEmin1=middle1
       end if


       if(inc2==1) then
         ixFmax2(:)=middle2
         ixtfEmax2=middle2
       end if
       if(inc2==2) then
         ixFmin2(:)=middle2+1
         ixtfEmin2=middle2
       end if


       if(inc3==1) then
         ixFmax3(:)=middle3
         ixtfEmax3=middle3
       end if
       if(inc3==2) then
         ixFmin3(:)=middle3+1
         ixtfEmin3=middle3
       end if

     end if
     ! ... Adjust ranges of edges according to direction ...
     do idim1=1,3
       ixfEmax1(idim1)=ixtfEmax1;ixfEmax2(idim1)=ixtfEmax2
       ixfEmax3(idim1)=ixtfEmax3;
       ixEmax1(idim1)=ixtEmax1;ixEmax2(idim1)=ixtEmax2
       ixEmax3(idim1)=ixtEmax3;
       ixfEmin1(idim1)=ixtfEmin1+kr(idim1,1)
       ixfEmin2(idim1)=ixtfEmin2+kr(idim1,2)
       ixfEmin3(idim1)=ixtfEmin3+kr(idim1,3);
       ixEmin1(idim1)=ixtEmin1+kr(idim1,1)
       ixEmin2(idim1)=ixtEmin2+kr(idim1,2)
       ixEmin3(idim1)=ixtEmin3+kr(idim1,3);
     end do
     ! ... Corners ...
     ! 'Coarse' corners
     if (CoCorner) then
       do idim1=idims+1,ndim
         if (pcorner(idim1)) then
           do idir=1,3!Index arrays have size ndim
             if (idir==6-idim1-idims) then
              !!! Something here has to change
              !!! Array ixfE must have size 3, while
              !!! ixE must have size ndim
              if (1==idim1) then
                 ixfEmin1(idir)=ixfEmax1(idir)
                 if (add) then
                   ixEmax1(idir) =ixEmin1(idir)
                 else
                   ixEmin1(idir) =ixEmax1(idir)
                 end if
               end if
              if (2==idim1) then
                 ixfEmin2(idir)=ixfEmax2(idir)
                 if (add) then
                   ixEmax2(idir) =ixEmin2(idir)
                 else
                   ixEmin2(idir) =ixEmax2(idir)
                 end if
               end if
              if (3==idim1) then
                 ixfEmin3(idir)=ixfEmax3(idir)
                 if (add) then
                   ixEmax3(idir) =ixEmin3(idir)
                 else
                   ixEmin3(idir) =ixEmax3(idir)
                 end if
               end if
             else
               ixEmin1(idir)=1;ixEmin2(idir)=1;ixEmin3(idir)=1;
               ixEmax1(idir)=0;ixEmax2(idir)=0;ixEmax3(idir)=0;
               ixfEmin1(idir)=1;ixfEmin2(idir)=1;ixfEmin3(idir)=1;
               ixfEmax1(idir)=0;ixfEmax2(idir)=0;ixfEmax3(idir)=0;
             end if
           end do
         end if
         if (mcorner(idim1)) then
           do idir=1,3
             if (idir==6-idim1-idims) then
              if (1==idim1) then
                 ixfEmax1(idir)=ixfEmin1(idir)
                 if (add) then
                   ixEmin1(idir) =ixEmax1(idir)
                 else
                   ixEmax1(idir) =ixEmin1(idir)
                 end if
               end if
              if (2==idim1) then
                 ixfEmax2(idir)=ixfEmin2(idir)
                 if (add) then
                   ixEmin2(idir) =ixEmax2(idir)
                 else
                   ixEmax2(idir) =ixEmin2(idir)
                 end if
               end if
              if (3==idim1) then
                 ixfEmax3(idir)=ixfEmin3(idir)
                 if (add) then
                   ixEmin3(idir) =ixEmax3(idir)
                 else
                   ixEmax3(idir) =ixEmin3(idir)
                 end if
               end if
             else
               ixEmin1(idir)=1;ixEmin2(idir)=1;ixEmin3(idir)=1;
               ixEmax1(idir)=0;ixEmax2(idir)=0;ixEmax3(idir)=0;
               ixfEmin1(idir)=1;ixfEmin2(idir)=1;ixfEmin3(idir)=1;
               ixfEmax1(idir)=0;ixfEmax2(idir)=0;ixfEmax3(idir)=0;
             end if
           end do
         end if
       end do
     else
     ! Other kinds of corners
     ! Crop ranges to account for corners
     ! When the fine fluxes are added, we consider
     ! whether they come from the same cpu or from
     ! a different one, in order to minimise the
     ! amount of communication
     ! Case for different processors still not implemented!!!
      if((idims.gt.1).and.pcorner(1)) then
         if((.not.add).or.(inc1==2)) then
 !ixFmax1(:)=ixFmax1(:)-kr(1,1);!ixFmax2(:)=ixFmax2(:)-kr(1,2);!ixFmax3(:)=ixFmax3(:)-kr(1,3);
           do idir=1,3
             if ((idir==idims).or.(idir==1)) cycle
               ixfEmax1(idir)=ixfEmax1(idir)-1
               ixEmax1(idir)=ixEmax1(idir)-1
           end do
         end if
       end if
      if((idims.gt.2).and.pcorner(2)) then
         if((.not.add).or.(inc2==2)) then
 !ixFmax1(:)=ixFmax1(:)-kr(2,1);!ixFmax2(:)=ixFmax2(:)-kr(2,2);!ixFmax3(:)=ixFmax3(:)-kr(2,3);
           do idir=1,3
             if ((idir==idims).or.(idir==2)) cycle
               ixfEmax2(idir)=ixfEmax2(idir)-1
               ixEmax2(idir)=ixEmax2(idir)-1
           end do
         end if
       end if
      if((idims.gt.3).and.pcorner(3)) then
         if((.not.add).or.(inc3==2)) then
 !ixFmax1(:)=ixFmax1(:)-kr(3,1);!ixFmax2(:)=ixFmax2(:)-kr(3,2);!ixFmax3(:)=ixFmax3(:)-kr(3,3);
           do idir=1,3
             if ((idir==idims).or.(idir==3)) cycle
               ixfEmax3(idir)=ixfEmax3(idir)-1
               ixEmax3(idir)=ixEmax3(idir)-1
           end do
         end if
       end if
      if((idims>1).and.mcorner(1)) then
         if((.not.add).or.(inc1==1)) then
 !ixFmin1(:)=ixFmin1(:)+kr(1,1);!ixFmin2(:)=ixFmin2(:)+kr(1,2);!ixFmin3(:)=ixFmin3(:)+kr(1,3);
           do idir=1,3
             if ((idir==idims).or.(idir==1)) cycle
               ixfEmin1(idir)=ixfEmin1(idir)+1
               ixEmin1(idir)=ixEmin1(idir)+1
           end do
         end if
       end if
      if((idims>2).and.mcorner(2)) then
         if((.not.add).or.(inc2==1)) then
 !ixFmin1(:)=ixFmin1(:)+kr(2,1);!ixFmin2(:)=ixFmin2(:)+kr(2,2);!ixFmin3(:)=ixFmin3(:)+kr(2,3);
           do idir=1,3
             if ((idir==idims).or.(idir==2)) cycle
               ixfEmin2(idir)=ixfEmin2(idir)+1
               ixEmin2(idir)=ixEmin2(idir)+1
           end do
         end if
       end if
      if((idims>3).and.mcorner(3)) then
         if((.not.add).or.(inc3==1)) then
 !ixFmin1(:)=ixFmin1(:)+kr(3,1);!ixFmin2(:)=ixFmin2(:)+kr(3,2);!ixFmin3(:)=ixFmin3(:)+kr(3,3);
           do idir=1,3
             if ((idir==idims).or.(idir==3)) cycle
               ixfEmin3(idir)=ixfEmin3(idir)+1
               ixEmin3(idir)=ixEmin3(idir)+1
           end do
         end if
       end if
     end if

   end subroutine set_ix_circ