class Func
  def header
    print "module gms_input_func_var\n"
    print "  use datatype\n"
    print "  use mem_manager\n"
    print "  implicit none\n"
  end

  def contains
    print "contains\n"
  end

  def footer
    print "end module gms_input_func_var\n"
  end
end

class Func1
  def header1 #name = "x", "y", "z"
    print "  interface input_func_var", "\n"
  end


  def header2(type) #name = "x", "y", "z"

      print "    module procedure input_func_var_", type, "\n"

  end

  def header3
    print "  end interface\n\n"
  end

  def output(type)
      print "  subroutine input_func_var", "_", type, "(func, var)\n"
      print "    type(var_", type, "), intent(in) :: var\n"

    if type.index("x") !=nil then
      print "    integer :: i\n"
      ix   = "i + var%grid(1), "
      funcx= "                    x_minimum + dx * (i + 0.5D0 * var%grid(1)), &\n"
      funcargx="x, "
      else
      ix="1, "
      funcargx=""
      funcx= ""
    end

    if type.index("y") !=nil then
      print "    integer :: j\n"
      jy   = "j + var%grid(2), "
      funcy= "                    y_minimum + dy * (j + 0.5D0 * var%grid(2)), &\n"
      funcargy="y, "
      else
      jy = "1, "
      funcargy=""
      funcy= ""
    end

    if type.index("z") !=nil then
      print "    integer :: k\n"
      kz   = "k + var%grid(3), "
      funcz= "                    z_minimum + dz * (k + 0.5D0 * var%grid(3)), &\n"
      funcargz="z, "
    else
      kz = "1, "
      funcargz=""
      funcz= ""
    end

funcarg = ( funcargx + funcargy + funcargz ).chomp(", ")

#print "    interface \n"
#print "       real(8) function func(", funcarg, ")\n"
#print "         real(8), intent(in) :: ",funcarg, "\n"
#print "       end function func\n"
#print "    end interface\n\n"

print "    external func \n"
print "    real(8):: func \n"

if type.index("z") !=nil then
  print "    do k = 0, pub3 - plb3 - var%grid(3)\n"    
end 

if type.index("y") !=nil then
  print "      do j = 0, pub2 - plb2 - var%grid(2)\n"    
end

if type.index("x") !=nil then
  print "        do i = 0, pub1 - plb1 - var%grid(1)\n"    
end

  print "        work_", type, "(", (ix+jy+kz)  ," var%id) & \n"
  print "           = func( &\n",( funcx + funcy + funcz).chomp(", &\n"), "  & \n                  ) \n"

if type.index("x") !=nil then
  print "        end do\n"    
end

if type.index("y") !=nil then
  print "      end do \n"    
end

if type.index("z") !=nil then
  print "    end do\n"    
end 

  print "    end subroutine input_func_var_", type, "\n\n"


  end
end

func = Func.new
func1 = Func1.new

type=[7]

type[0] = "x"
type[1] = "y"
type[2] = "z"
type[3] = "xy"
type[4] = "xz"
type[5] = "yz"
type[6] = "xyz"

func.header

    func1.header1
  for  j in 0..6 do
    func1.header2(type[j])
  end
  func1.header3

func.contains

  for j in 0..6 do
    func1.output(type[j])
  end

func.footer
