# File lib/numru/nusdas.rb, line 365
    def parse_nusdas_def
      dname = File.join(@root, "nusdas_def")
      unless File.exist?(dname)
        dname = File.join(@root, "NUSDAS_DEF")
      end
      return nil unless File.exist?(dname)
      fname = Dir[File.join(dname,"*def")]
      if fname.length > 2
        raise "There are multiple nusdas def files"
      end
      fname = fname[0]
      params = Hash.new
      File.open(fname){|file|
        line = file.gets
        while(line)
          ary = line.chop.split
          if ary[0]
            name = ary[0].downcase.to_sym
            if params[name]
              unless Array === params[name][0]
                params[name] = [ params[name] ]
              end
              params[name].push(val=ary[1..-1])
            else
              params[name] = val = ary[1..-1]
            end
          end
          line = file.gets
          while /^\s/ =~ line
            val.push *line.chop.split
            line = file.gets
          end
        end
      }

      if val = params[:type1]
        @type1 = val.join.ljust(8)
        @meta[:projection] = @@projection_abbrs[val[1]]
      else
        raise 'type1 must be exist in nusdas_def'
      end

      if val = params[:type2]
        @type2 = val.join.ljust(4)
      else
        raise 'type2 must be exist in nusdas_def'
      end

      if val = params[:type3]
        @type3 = val[0].ljust(4)
      else
        raise 'type3 must be exist in nusdas_def'
      end

      if val = params[:size]
        @meta[:size] = [val[0].to_i, val[1].to_i]
      else
        raise 'size must be exist in nusdas_def'
      end

      if val = params[:distance]
        @meta[:distance] = [val[0].to_f, val[1].to_f]
      else
        @meta[:distance] = [0.0, 0.0]
      end

      if val = params[:basepoint]
        @meta[:basepoint] = [val[0].to_f, val[1].to_f]
        bp21 = /E$/ =~ val[2] ? val[2][0..-2] : val[2]
        bp20 = /E$/ =~ val[3] ? val[3][0..-2] : val[3]
        @meta[:basepoint2] = [bp20.to_f, bp21.to_f]
      else
        @meta[:basepoint] = [0.0, 0.0]
        @meta[:basepoint2] = [0.0, 0.0]
      end

      if val = params[:others]
        s1 = /E$/ =~ val[0] ? val[0][0..-2] : val[0]
        s0 = /N$/ =~ val[1] ? val[1][0..-2] : val[1]
        @meta[:others] = [s0.to_f, s1.to_f]
        s1 = /E$/ =~ val[2] ? val[2][0..-2] : val[2]
        s0 = /N$/ =~ val[3] ? val[3][0..-2] : val[3]
        @meta[:others2] = [s0.to_f, s1.to_f]
      else
        @meta[:others] = [0.0, 0.0]
        @meta[:others2] = [0.0, 0.0]
      end

      if val = params[:standard]
        s1 = /E$/ =~ val[0] ? val[0][0..-2] : val[0]
        s0 = /N$/ =~ val[1] ? val[1][0..-2] : val[1]
        @meta[:standard] = [s0.to_f, s1.to_f]
        s1 = /E$/ =~ val[2] ? val[2][0..-2] : val[2]
        s0 = /N$/ =~ val[3] ? val[3][0..-2] : val[3]
        @meta[:standard2] = [s0.to_f, s1.to_f]
      else
        @meta[:standard] = [0.0, 0.0]
        @meta[:standard2] = [0.0, 0.0]
      end

      if val = params[:creator]
        @meta[:creator] = val.join(" ")
      else
        @meta[:creator] = 'Japan Meteorological Agency, http://www.jma.go.jp/'
      end

      if val = params[:plane]
        @meta[:nplane] = val[0].to_i
      else
        raise 'plane must be exist in nusdas_def'
      end

      if val = params[:plane1]
        @meta[:planes] = val.collect{|s| s.ljust(6)}
      else
        raise 'plane1 must be exist in nusdas_def'
      end

      if val = params[:plane2]
        @meta[:planes2] = val.collect{|s| s.ljust(6)}
      else
        @meta[:planes2] = @meta[:plenes]
      end

      if val = params[:element]
        i = val[0].to_i
        @meta[:nelement] = i
        @meta[:elements] = Array.new
      else
        raise 'element must be exist in nusdas_def'
      end

      if val = params[:elementmap]
        if Array === val[0]
          len = val.length
          @meta[:elements] = ary = Array.new(len)
          len.times{|n| ary[n] = val[n][0].ljust(6) }
        else
          @meta[:elements] = [val[0].ljust(6)]
        end
      else
        raise 'elementmap must be exist in nusdas_def'
      end
      if @meta[:nelement] != @meta[:elements].length
        raise "number of elementmap is not same as element in nusdas_def"
      end

      if val = params[:information]
        if Array === val[0]
          len = val.length
          @meta[:info] = ary = Array.new
          len.times{|n| ary[n] = val[n][0] }
        else
          @meta[:info] = [val[0]]
        end
      else
        @meta[:info] = Array.new
      end
      @meta[:ninfo] = @meta[:info].length

      if val = params[:subcntl]
        @meta[:nsubc] = val[0].to_i
      else
        @meta[:nsubc] = 0
      end

      if val = params[:member]
        @meta[:nmember] = n = val[0].to_i
        params[:member_io] = val[1].upcase

        val = params[:memberlist]
        @meta[:members] = val.collect{|s| s.ljust(4)}
        if n != @meta[:members].length
          raise "number of memberlist is not same as member in nusdas_def"
        end
      else
        @meta[:nmember] = 1
        @meta[:members] = ["    "]
      end

      if val = params[:validtime]
        @meta[:nvalidtime] = val[0].to_i
        if /(IN|OUT)/ =~ val[1].upcase
          params[:validtime_io] = val[1]
          @meta[:validtime_unit] = val[2]
        elsif /(IN|OUT)/ =~ val[2].upcase
          params[:validtime_io] = val[2]
          @meta[:validtime_unit] = val[1]
        else
          raise "validtime is invalid in nusdas_def"
        end
      else
        raise 'validtime must be exist in nusdas_def'
      end

      if val = params[:validtime1]
        case val[0]
        when "ARITHMETIC"
          @meta[:validtimes] = NArray.int(@meta[:nvalidtime]).indgen(val[1].to_i,val[2].to_i)
        when "ALL_LIST"
          if @meta[:nvalidtime] != val.length-1
            raise "number of validtime1 is not same as validtime in nusdas_def"
          end
          na = NArray.int(@meta[:nvalidtime])
          val[1..-1].each_with_index{|s,i| na[i] = s.to_i}
          @meta[:validtimes] = na
        else
          raise "validtime1 is invalid in nusdas_def"
        end
      else
        raise 'validtime1 must be exist in nusdas_def'
      end

      if val = params[:validtime2]
        na = NArray.int(@meta[:nvalidtime])
        ft = val[0].to_i
        if ft > 0
          if @meta[:nvalidtime] != val.length
            raise "number of validtime2 is not same as validtime in nusdas_def"
          end
          val.each_with_index{|s,i| na[i] = s.to_i}
        else
          na.fill(-ft)
        end
        @meta[:validtimes2] = na
      else
        @meta[:validtimes2] = NArray.int(@meta[:nvalidtime]).fill(1)
      end

      if val = params[:missing]
        @meta[:missing] = val[0]
      else
        @meta[:missing] = 'NONE'
      end

      if val = params[:packing]
        @meta[:packing] = val[0]
      else
        @meta[:packing] = '2UPC'
      end

      if val = params[:value]
        @meta[:value] = val[0]
      else
        @meta[:value] = 'PVAL'
      end


      if path = params[:path]
        case path[0].upcase
        when 'NWP_PATH_S'
          fpat = File.join(@root,'_3d_name','_validtime')
        when 'NWP_PATH_BS'
          fpat = File.join(@root,'_3d_name','_basetime')
        when 'NWP_PATH_M'
          fpat = File.join(@root,'_3d_name','_member','_validtime')
        when 'NWP_PATH_VM'
          fpat = File.join(@root,'_3d_name','_member')
        when 'RELATIVE_PATH'
          fname = params[:filename]
          rpath = path[1]
          fpat = File.join(@root,rpath)
          fpat = File.join(fpat,fname[0]) if fname
        else
          raise "path is invalide in nusdas_def"
        end
      else
        fname = params[:filename]
        rpath = "_model/_attribute/_space/_time/_name/_basetime"
        rpath = File.join(rpath,"_member") if params[:member_io] == "OUT"
        rpath = File.join(rpath,"_validtime") if params[:validtime_io] == "OUT"
        fpat = File.join(@root,rpath)
        fpat = File.join(fpat,fname[0]) if fname
      end

      ary = Array.new
      fpat.sub!(/_model/,@type1[0,4])
      fpat.sub!(/_space/,@type1[-4,4])
      fpat.sub!(/_2d/,@type1[4,2])
      fpat.sub!(/_3d/,@type1[6,2])
      fpat.sub!(/_time/,@type2[0,2])
      fpat.sub!(/_time/,@type2[-2,2])
      fpat.sub!(/_name/,@type3)
      fpat.sub!(/_basetime/,'*')
      fpat.sub!(/_validtime/,'*')

      if /_member/ =~ fpat
        mem = @meta[:members]
        len = mem.length
        fpats = Array.new(len)
        len.times{|n| fpats[n] = fpat.sub(/_member/, mem[n]) }
      else
        fpats = [fpat]
      end

      ary = Array.new
      fpats.each{|s|
        s.gsub!(/\s/,'_')
        ary += Dir[s]
      }
      return ary
    end