      module face_abs_class
        implicit none
        private
        public :: face_abs
   
        type, abstract :: face_abs
          contains
          private
          procedure (face_write_abs),  deferred :: face_write
          procedure (face_equal_abs),  deferred :: face_equal
          procedure (face_le_abs),     deferred :: face_le
          procedure (face_assign_abs), deferred :: face_assign
          generic, public :: operator(.eq.) => face_equal
          generic, public :: operator(.le.) => face_le
          generic, public :: assignment(=)  => face_assign
        end type face_abs
     
        abstract interface

          logical function face_equal_abs(a,b)
            import :: face_abs
            class(face_abs), intent(in) :: a,b
          end function face_equal_abs

          logical function face_le_abs(a,b)
            import :: face_abs
            class(face_abs), intent(in) :: a,b
          end function face_le_abs

          subroutine face_assign_abs(a,b)
            import :: face_abs
            class(face_abs), intent(in) :: b
            class(face_abs), intent(out) :: a
          end subroutine face_assign_abs
    
          subroutine face_write_abs(a)
            import :: face_abs
            class(face_abs), intent(in) :: a
          end subroutine face_write_abs

        end interface

      end module face_abs_class

