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
| Type | Intent | Optional | 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) |
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