! POP_GridTypeMappings.f90
!
! Author : Joseph Schoonover
! E-mail : jschoonover@lanl.gov, schoonover.numerics@gmail.com
!
! Copyright 2017 Joseph Schoonover, Los Alamos National Laboratory
! 
! Redistribution and use in source and binary forms, with or without
! modification,
! are permitted provided that the following conditions are met:
! 
! 1. Redistributions of source code must retain the above copyright notice, this
! list of conditions and the following disclaimer.
! 
! 2. Redistributions in binary form must reproduce the above copyright notice,
! this list of conditions and the following disclaimer in the 
! documentation and/or other materials provided with the distribution.
! 
! 3. Neither the name of the copyright holder nor the names of its contributors
! may be used to endorse or promote products derived from this 
!  software without specific prior written permission.
! 
! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 
! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
! CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
! EXEMPLARY,  OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
! PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
! BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
! LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
! NEGLIGENCE  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
! SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
!
! ////////////////////////////////////////////////////////////////////////////////////////////////


MODULE POP_GridTypeMappings

! src/common/
USE ConstantsDictionary


IMPLICIT NONE

CONTAINS



 
 SUBROUTINE GetTrueIJ( meshtype, i, j, nX, nY, true_i, true_j )
 
   IMPLICIT NONE
   INTEGER, INTENT(in)    :: meshtype, i, j, nX, nY
   INTEGER, INTENT(inout) :: true_i, true_j

      IF( meshtype == PeriodicTripole )THEN
 
         CALL GetTrueIJ_PeriodicTripole( i, j, nX, nY, true_i, true_j )

      ELSE

         PRINT*, 'Module POP_GridTypeMappings : S/R GetTrueIJ : Unknown Grid Type'
         STOP

      ENDIF

 END SUBROUTINE GetTrueIJ
!
 SUBROUTINE GetTrueIJ_PeriodicTripole( i, j, nX, nY, true_i, true_j )
   IMPLICIT NONE
   INTEGER, INTENT(in)  :: i, j, nX, nY
   INTEGER, INTENT(out) :: true_i, true_j
   ! Local
   INTEGER :: dj

      IF( j > nY )THEN
   
         dj = j - nY
         true_j = nY - (dj-1)
         IF( i == 0 .OR. i == nX+1 )THEN
            true_i = i
         ELSE 
            true_i = nX-(i-1)
         ENDIF
   
      ELSE
   
         true_j = j
          
         ! Taking care of the x-periodicity in the map
         IF( i < 1 )THEN
            true_i = nX + i
         ELSEIF( i > nX )THEN
            true_i = i-nX
         ELSE
            true_i = i
         ENDIF
   
      ENDIF
   
 END SUBROUTINE GetTrueIJ_PeriodicTripole

END MODULE POP_GridTypeMappings
