text: !
  !     (c) 2019-2020 Guide Star Engineering, LLC
  !     This Software was developed for the US Nuclear Regulatory Commission (US NRC) under contract
  !     "Multi-Dimensional Physics Implementation into Fuel Analysis under Steady-state and Transients (FAST)",
  !     contract # NRC-HQ-60-17-C-0007
  !
  module differentiable_field_interface
    !! author: Damian Rouson
    !! date: 12/19/2019
    !!
    !! A differentiable field abstraction, deferring function evaluation and differential operator implementations to child classes
    use grid_interface, only : grid
    implicit none
  
    private
    public :: differentiable_field
  
    type, abstract :: differentiable_field
    contains
      procedure(field_interface), deferred :: evaluate
      procedure(field_interface), deferred :: laplacian
    end type
  
    abstract interface
      function field_interface(this, grid_points) result(f)
        !! Compute function values sampled at the provided locations
        import differentiable_field, grid
        implicit none
        class(differentiable_field), intent(in)  :: this
        class(grid), intent(in)  :: grid_points
        class(grid), allocatable :: f
      end function
    end interface
  
  end module differentiable_field_interface
  