
module modis_types
  
  ! --------------------------------------------------------------------------
  
  implicit none
  
  ! everything is private by default unless made public
  
  private
  
  public :: modis_alb_param_type
  

  ! ---------------------------------------------------------------
  !
  ! MODIS albedo scaling factors
  
  type :: modis_alb_param_type
     
     real :: sc_albvr    ! Scaling factor for direct  visible  or blacksky 0.3-0.7 
     real :: sc_albnr    ! Scaling factor for direct  infrared or blacksky 0.7-5.0
     real :: sc_albvf    ! Scaling factor for diffuse visible  or whitesky 0.3-0.7 
     real :: sc_albnf    ! Scaling factor for diffuse infrared or whitesky 0.7-5.0
     
  end type modis_alb_param_type

  ! --------------------------------------------------------------
  
  interface assignment (=)
     module procedure scalar2modis_alb_param
  end interface
  
  interface operator (*)
     module procedure modis_alb_param_times_scalar
  end interface
  
  interface operator (+)
     module procedure add_modis_alb_param
  end interface
  
contains

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

  subroutine scalar2modis_alb_param( modis_alb_param, scalar )
    
    implicit none
    
    real, intent(in) :: scalar
    
    type(modis_alb_param_type), intent(out) :: modis_alb_param
    
    modis_alb_param%sc_albvr = scalar
    modis_alb_param%sc_albnr = scalar
    modis_alb_param%sc_albvf = scalar
    modis_alb_param%sc_albnf = scalar
    
  end subroutine scalar2modis_alb_param

  ! ---------------------------------------------------
  
  function modis_alb_param_times_scalar( modis_alb_param, scalar )
    
    implicit none
    
    type(modis_alb_param_type)             :: modis_alb_param_times_scalar
    type(modis_alb_param_type), intent(in) :: modis_alb_param
    
    real, intent(in) :: scalar
    
    modis_alb_param_times_scalar%sc_albvr = modis_alb_param%sc_albvr * scalar
    modis_alb_param_times_scalar%sc_albnr = modis_alb_param%sc_albnr * scalar
    modis_alb_param_times_scalar%sc_albvf = modis_alb_param%sc_albvf * scalar
    modis_alb_param_times_scalar%sc_albnf = modis_alb_param%sc_albnf * scalar
    
  end function modis_alb_param_times_scalar

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

  function add_modis_alb_param( modis_alb_param_1, modis_alb_param_2 )
    
    implicit none

    type(modis_alb_param_type)             :: add_modis_alb_param
    type(modis_alb_param_type), intent(in) :: modis_alb_param_1, modis_alb_param_2
    
    add_modis_alb_param%sc_albvr = modis_alb_param_1%sc_albvr + modis_alb_param_2%sc_albvr
    add_modis_alb_param%sc_albnr = modis_alb_param_1%sc_albnr + modis_alb_param_2%sc_albnr 
    add_modis_alb_param%sc_albvf = modis_alb_param_1%sc_albvf + modis_alb_param_2%sc_albvf
    add_modis_alb_param%sc_albnf = modis_alb_param_1%sc_albnf + modis_alb_param_2%sc_albnf 
    
  end function add_modis_alb_param

  ! -----------------------------------------------------------
  
end module modis_types


! +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

!!$#if 0
!!$
!!$program test
!!$  
!!$  use modis_types
!!$
!!$  type(modis_alb_param_type), dimension(2,3) :: map1, map2
!!$  type(modis_alb_param_type), dimension(2)   :: map3
!!$
!!$  integer :: n, m
!!$
!!$  n=1
!!$  m=3
!!$
!!$  map1(n,m) =  1.111
!!$  map2(n,m) =  2.222
!!$  map3(n) =  0.
!!$
!!$  write (*,*) map1(n,m)
!!$  write (*,*) map2(n,m)
!!$  write (*,*) map3(n)
!!$  write (*,*)
!!$
!!$  map3(n) = map1(n,m) + map2(n,m)
!!$
!!$  write (*,*) map1(n,m)
!!$  write (*,*) map2(n,m)
!!$  write (*,*) map
!!$  write (*,*)
!!$
!!$  map3(n)%sc_albnf = map2(n,m)%sc_albnf * 40.
!!$  
!!$  write (*,*) map1(n,m)
!!$  write (*,*) map2(n,m)
!!$  write (*,*) map3(n)
!!$  write (*,*)
!!$
!!$  map3(n) = map2(n,m) * 40. + map1(n,m) * 3.
!!$
!!$  write (*,*) map1(n,m)
!!$  write (*,*) map2(n,m)
!!$  write (*,*) map3(n)
!!$  write (*,*)
!!$
!!$end program test
!!$  
!!$#endif

! =========== EOF =======================================================

