MODULE GRIDPOINT_BUFFERS_MIX

!     Purpose.
!     --------
!           GRIDPOINT_BUFFERS_MIX defines the type "gridpoint buffer",
!           and the operations to create and destroy instances of
!           the type.

!     Author.
!     -------
!        Mike Fisher *ECMWF*

!     Modifications.
!     --------------
!        Original : 1999-11-10
!        M.Hamrud      01-Oct-2003 CY28 Cleaning

!     ------------------------------------------------------------------

USE PARKIND1  ,ONLY : JPIM     ,JPRB
USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK

USE YOMCT0   , ONLY : NPRINTLEV , LALLOPR
USE YOMGEM   , ONLY : NGPTOT
USE YOMLUN   , ONLY : NULOUT

IMPLICIT NONE
SAVE

PRIVATE
PUBLIC gridpoint_buffer, &
 & ALLOCATE_GRIDPOINT_BUFFER, &
 & ALLOCATED_GRIDPOINT_BUFFER, &
 & DEALLOCATE_GRIDPOINT_BUFFER  

TYPE gridpoint_buffer 
CHARACTER(LEN=1), POINTER :: CLNAME(:)
INTEGER(KIND=JPIM) :: IFIELDS
INTEGER(KIND=JPIM) :: IDGEN
INTEGER(KIND=JPIM) :: IDGENL
INTEGER(KIND=JPIM) :: IBLEN
INTEGER(KIND=JPIM) :: IPACK
LOGICAL   :: LFILLED
REAL(KIND=JPRB),    POINTER :: GPBUF(:)
END TYPE gridpoint_buffer

#include "abor1.intfb.h"

!-----------------------------------------------------------------------

CONTAINS
SUBROUTINE ALLOCATE_GRIDPOINT_BUFFER (CDNAME,YDGPBUF,KFIELDS,KPACK, &
                                &     KGPTOT)

TYPE (gridpoint_buffer),INTENT(OUT)        :: YDGPBUF
CHARACTER(LEN=*) , INTENT(IN)  :: CDNAME
INTEGER(KIND=JPIM)        , INTENT(IN)  :: KFIELDS,KPACK
INTEGER(KIND=JPIM)        , INTENT(IN),OPTIONAL  :: KGPTOT

INTEGER(KIND=JPIM)   ::   J, IGPTOT
REAL(KIND=JPRB)      :: ZDUM
REAL(KIND=JPRB) :: ZHOOK_HANDLE

IF (LHOOK) CALL DR_HOOK('GRIDPOINT_BUFFERS_MIX:ALLOCATE_GRIDPOINT_BUFFER',0,ZHOOK_HANDLE)

IF(PRESENT(KGPTOT))THEN
   IGPTOT=KGPTOT
ELSE
   IGPTOT=NGPTOT
ENDIF

ALLOCATE (YDGPBUF%CLNAME(LEN(CDNAME)))

DO J=1,LEN(CDNAME)
  YDGPBUF%CLNAME(J)  = CDNAME(J:J)
ENDDO

YDGPBUF%IFIELDS = KFIELDS
YDGPBUF%IPACK   = KPACK

IF (KPACK > 1) CALL ABOR1('ALLOCATE_GRIDPOINT_BUFFER: KPACK > 1')
YDGPBUF%IBLEN = IGPTOT  * KFIELDS

ALLOCATE (YDGPBUF%GPBUF(YDGPBUF%IBLEN))
IF (NPRINTLEV >= 1.OR. LALLOPR) &
 & WRITE(NULOUT,91) CDNAME,SIZE(YDGPBUF%GPBUF),SHAPE(YDGPBUF%GPBUF)  
YDGPBUF%GPBUF(:) = HUGE(ZDUM)
YDGPBUF%LFILLED = .FALSE.

IF (LHOOK) CALL DR_HOOK('GRIDPOINT_BUFFERS_MIX:ALLOCATE_GRIDPOINT_BUFFER',1,ZHOOK_HANDLE)
91  FORMAT(1X,'ALLOCATED GRIDPOINT BUFFER ',A,', SIZE=',I8,', SHAPE=',7I8)
END SUBROUTINE ALLOCATE_GRIDPOINT_BUFFER

SUBROUTINE DEALLOCATE_GRIDPOINT_BUFFER (YDGPBUF)
TYPE (gridpoint_buffer),INTENT(INOUT) :: YDGPBUF
INTEGER(KIND=JPIM) :: J
REAL(KIND=JPRB) :: ZHOOK_HANDLE

IF (LHOOK) CALL DR_HOOK('GRIDPOINT_BUFFERS_MIX:DEALLOCATE_GRIDPOINT_BUFFER',0,ZHOOK_HANDLE)
IF (NPRINTLEV >= 1.OR. LALLOPR) &
 & WRITE(NULOUT,92) (YDGPBUF%CLNAME(J),J=1,SIZE(YDGPBUF%CLNAME))  

IF (ASSOCIATED(YDGPBUF%GPBUF))  DEALLOCATE (YDGPBUF%GPBUF)
IF (ASSOCIATED(YDGPBUF%CLNAME)) DEALLOCATE (YDGPBUF%CLNAME)
YDGPBUF%LFILLED = .FALSE.

IF (LHOOK) CALL DR_HOOK('GRIDPOINT_BUFFERS_MIX:DEALLOCATE_GRIDPOINT_BUFFER',1,ZHOOK_HANDLE)
92  FORMAT(1X,'DEALLOCATED GRIDPOINT BUFFER:,',100A1)
END SUBROUTINE DEALLOCATE_GRIDPOINT_BUFFER

LOGICAL FUNCTION ALLOCATED_GRIDPOINT_BUFFER (YDGPBUF)
TYPE (gridpoint_buffer),INTENT(IN) :: YDGPBUF
ALLOCATED_GRIDPOINT_BUFFER =  ASSOCIATED (YDGPBUF%GPBUF)
END FUNCTION ALLOCATED_GRIDPOINT_BUFFER

END MODULE GRIDPOINT_BUFFERS_MIX

