class Func
  def header
    print "module gms_position_all\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_position_all\n"
  end
end

class Func1
Modname = "pos_all" 
  def header1(name) #name = "x", "y", "z"
    print "  interface ", Modname,"_", name, "\n"
  end

  def header2(name, type)
    if type.index(name) != nil then
      print "    module procedure ", Modname, "_",name ,"_", type, "\n" 
    end
  end

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

  def header4(name) #name = "x", "y", "z"
    print "  interface ", Modname,"_var_", name, "\n"
  end

  def header5(name, type)
    if type.index(name) != nil then
      print "    module procedure ", Modname, "_var_",name ,"_", type, "\n" 
    end
  end

  def header6
    print "end interface\n\n"
  end



  def output(name, type)
    if type.index(name) != nil then
      print "  function ", Modname, "_", name, "_", type, "(input) result(output)\n"
      print "    type(var_", type, "), intent(in) :: input\n"
      print "    integer :: i \n"

      if name == "x" then 
      print "    real(8), dimension(lb_axis1:ub_axis1 - plb1- input%grid(1)) :: output\n\n"
      print "    if ( input%grid(1) == 0 ) then \n"
      print "      do i = lb_axis1, ub_axis1 - plb1 \n"
      print "        output(i) = x_minimum + dx * i \n"
      print "      end do \n"
      print "    else  \n"
      print "      do i = lb_axis1, ub_axis1 - plb1- 1  \n"
      print "        output(i) = x_minimum + dx * ( i + 0.5 ) \n"
      print "      end do \n"
      print "    end if \n"
      elsif name == "y" then
      print "    real(8), dimension(lb_axis2:ub_axis2 - plb2- input%grid(2)) :: output\n\n"
      print "    if ( input%grid(2) == 0 ) then \n"
      print "      do i = lb_axis2, ub_axis2 - plb2 \n"
      print "        output(i) = y_minimum + dy * i \n"
      print "      end do \n"
      print "    else  \n"
      print "      do i = lb_axis2, ub_axis2 - plb2 - 1 \n"
      print "        output(i) = y_minimum + dy * ( i + 0.5 ) \n"
      print "      end do \n"
      print "    end if \n"
      elsif name == "z" then
      print "    real(8),dimension(lb_axis3:ub_axis3 - plb3- input%grid(3)) :: output\n\n"
      print "    if ( input%grid(3) == 0 ) then \n"
      print "      do i = lb_axis3, ub_axis3 - plb3 \n"
      print "        output(i) = z_minimum + dz * i \n"
      print "      end do \n"
      print "    else  \n"
      print "      do i = lb_axis3, ub_axis3 - plb3 - 1 \n"
      print "        output(i) = z_minimum + dz * ( i + 0.5 ) \n"
      print "      end do \n"
      print "    end if \n"

      end
       print "  end function ", Modname, "_", name, "_", type, "\n\n"
   end

#-pos_var------------------------------------------
    if type.index(name) != nil then
      print "  function ", Modname, "_var_", name, "_", type, "(input) result(output)\n"
      print "    type(var_", type, "), intent(in) :: input\n"
      print "    integer :: i, new_id \n"

      if name == "x" then 
      print "     type(var_x):: output\n\n"
      print "     call get_new_id_x(new_id)\n" 
      print "     output%id = new_id\n" 
      print "     output%grid(1) = input%grid(1)\n"
      print "     output%grid(2) = -1\n"
      print "     output%grid(3) = -1\n"
 
      print "      do i = lb_axis1+input%grid(1), ub_axis1 \n"
      print "        work_x(i,1,1,new_id) = x_minimum + dx * (i - plb1- input%grid(1) * 0.5D0)\n"
      print "      end do \n"

      elsif name == "y" then
      print "     type(var_y):: output\n\n"
      print "     call get_new_id_y(new_id)\n" 
      print "     output%id = new_id\n" 
      print "     output%grid(1) = -1\n"
      print "     output%grid(2) = input%grid(2)\n"
      print "     output%grid(3) = -1\n"

      print "      do i = lb_axis2+input%grid(2), ub_axis2 \n"
      print "        work_y(1,i,1,new_id) = y_minimum + dy * (i - plb2- input%grid(2) * 0.5D0)\n"
      print "      end do \n"

      elsif name == "z" then
      print "     type(var_z):: output\n\n"
      print "     call get_new_id_z(new_id)\n" 
      print "     output%id = new_id\n" 
      print "     output%grid(1) = -1\n"
      print "     output%grid(2) = -1\n"
      print "     output%grid(3) = input%grid(3)\n"

      print "      do i = lb_axis3+input%grid(3), ub_axis3 \n"
      print "        work_z(1,1,i,new_id) = z_minimum + dz * (i - plb3 - input%grid(3) * 0.5D0)\n"
      print "      end do \n"

      end
      print "  end function ", Modname, "_var_", name, "_", type, "\n\n"
    end
  end

end












#      print "  function ",Modname,"_", name, "_", type, "(input) result(output)\n"
#      print "    type(var_", type, "), intent(in) :: input\n"
#      print "    real, dimension(0) :: output\n"
#      print "    integer :: new_id\n\n"

#      print "    stop \"", Modname, "_", name, "_", type, "\"\n "
#      print "    output= 0.0\n "
#      print "  end function ", Modname, "_", name, "_", type, "\n\n"
#    end
#  end
#end

#list1 = open("func_list1", "r")
#list2 = open("func_list2", "r")

func = Func.new
func1 = Func1.new
#func2 = Func2.new
#func4 = Func4.new

type=[7]
name=[2]

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

name[0] = "x"
name[1] = "y"
name[2] = "z"

func.header

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

for  i in 0..2 do
  func1.header4(name[i])
  for  j in 0..6 do
    func1.header5(name[i], type[j])
  end
  func1.header6
end



func.contains

for i in 0..2 do
  for j in 0..6 do
    func1.output(name[i], type[j])
  end
end

func.footer
