subroutine mirror_grid_local(local_tile,global_tile1,start,count,ndims,tileno)
real(ESMF_KIND_R8) , intent(INOUT) :: local_tile(:,:,:)
real(ESMF_KIND_R8) , intent(INOUT) :: global_tile1(:,:,:)
integer, intent(IN) :: start(2), count(2)
integer, intent(IN) :: ndims, tileno
integer :: i,j,n,n1,n2,nreg, npx, npy
integer :: ii, jj
real(ESMF_KIND_R8) :: x1,y1,z1, x2,y2,z2, ang
!
! Mirror Across the 0-longitude
!
npx = size(global_tile1,1)
npy = size(global_tile1,2)
do j=1,ceiling(npy/2.)
do i=1,ceiling(npx/2.)
x1 = 0.25 * (ABS(global_tile1(i ,j ,1)) + &
ABS(global_tile1(npx-(i-1),j ,1)) + &
ABS(global_tile1(i ,npy-(j-1),1)) + &
ABS(global_tile1(npx-(i-1),npy-(j-1),1)))
global_tile1(i ,j ,1) = SIGN(x1,global_tile1(i ,j ,1))
global_tile1(npx-(i-1),j ,1) = SIGN(x1,global_tile1(npx-(i-1),j ,1))
global_tile1(i ,npy-(j-1),1) = SIGN(x1,global_tile1(i ,npy-(j-1),1))
global_tile1(npx-(i-1),npy-(j-1),1) = SIGN(x1,global_tile1(npx-(i-1),npy-(j-1),1))
y1 = 0.25 * (ABS(global_tile1(i ,j ,2)) + &
ABS(global_tile1(npx-(i-1),j ,2)) + &
ABS(global_tile1(i ,npy-(j-1),2)) + &
ABS(global_tile1(npx-(i-1),npy-(j-1),2)))
global_tile1(i ,j ,2) = SIGN(y1,global_tile1(i ,j ,2))
global_tile1(npx-(i-1),j ,2) = SIGN(y1,global_tile1(npx-(i-1),j ,2))
global_tile1(i ,npy-(j-1),2) = SIGN(y1,global_tile1(i ,npy-(j-1),2))
global_tile1(npx-(i-1),npy-(j-1),2) = SIGN(y1,global_tile1(npx-(i-1),npy-(j-1),2))
! force dateline/greenwich-meridion consitency
if (mod(npx,2) /= 0) then
if ( (i==1+(npx-1)/2.0) ) then
global_tile1(i,j ,1) = 0.0
global_tile1(i,npy-(j-1),1) = 0.0
endif
endif
enddo
enddo
if (tileno == 1) then
local_tile=global_tile1(start(1):start(1)+count(1), start(2):start(2)+count(2),:)
else
do j=start(2),start(2)+count(2)
do i=start(1),start(1)+count(1)
x1 = global_tile1(i,j,1)
y1 = global_tile1(i,j,2)
z1 = radius
if (tileno == 2) then
ang = -90.
call rot_3d( 3, x1, y1, z1, ang, x2, y2, z2, 1, 1) ! rotate about the z-axis
elseif (tileno == 3) then
ang = -90.
call rot_3d( 3, x1, y1, z1, ang, x2, y2, z2, 1, 1) ! rotate about the z-axis
ang = 90.
call rot_3d( 1, x2, y2, z2, ang, x1, y1, z1, 1, 1) ! rotate about the x-axis
x2=x1
y2=y1
z2=z1
! force North Pole and dateline/greenwich-meridion consitency
if (mod(npx,2) /= 0) then
if ( (i==1+(npx-1)/2.0) .and. (i==j) ) then
x2 = 0.0
y2 = pi/2.0
endif
if ( (j==1+(npy-1)/2.0) .and. (i < 1+(npx-1)/2.0) ) then
x2 = 0.0
endif
if ( (j==1+(npy-1)/2.0) .and. (i > 1+(npx-1)/2.0) ) then
x2 = pi
endif
endif
elseif (tileno == 4) then
ang = -180.
call rot_3d( 3, x1, y1, z1, ang, x2, y2, z2, 1, 1) ! rotate about the z-axis
ang = 90.
call rot_3d( 1, x2, y2, z2, ang, x1, y1, z1, 1, 1) ! rotate about the x-axis
x2=x1
y2=y1
z2=z1
! force dateline/greenwich-meridion consitency
if (mod(npx,2) /= 0) then
if ( (j==1+(npy-1)/2.0) ) then
x2 = pi
endif
endif
elseif (tileno == 5) then
ang = 90.
call rot_3d( 3, x1, y1, z1, ang, x2, y2, z2, 1, 1) ! rotate about the z-axis
ang = 90.
call rot_3d( 2, x2, y2, z2, ang, x1, y1, z1, 1, 1) ! rotate about the y-axis
x2=x1
y2=y1
z2=z1
elseif (tileno == 6) then
ang = 90.
call rot_3d( 2, x1, y1, z1, ang, x2, y2, z2, 1, 1) ! rotate about the y-axis
ang = 0.
call rot_3d( 3, x2, y2, z2, ang, x1, y1, z1, 1, 1) ! rotate about the z-axis
x2=x1
y2=y1
z2=z1
! force South Pole and dateline/greenwich-meridion consitency
if (mod(npx,2) /= 0) then
if ( (i==1+(npx-1)/2.0) .and. (i==j) ) then
x2 = 0.0
y2 = -pi/2.0
endif
if ( (i==1+(npx-1)/2.0) .and. (j > 1+(npy-1)/2.0) ) then
x2 = 0.0
endif
if ( (i==1+(npx-1)/2.0) .and. (j < 1+(npy-1)/2.0) ) then
x2 = pi
endif
endif
endif
ii=i-start(1)+1
jj=j-start(2)+1
local_tile(ii,jj,1) = x2
local_tile(ii,jj,2) = y2
enddo
enddo
endif
end subroutine mirror_grid_local