#!/usr/bin/env ruby
#
# 表題  DCPAM6 benchmark 結果の描画
#
# 履歴  2025/10/04  竹広真一
#
require "numru/dcl"
include NumRu

#---------- 描画設定 ----------
index=[1,2]
type=[13,23,33,43,63,753]

# CoreMin   = 0.5  ; CoreMax   = 64
# ETimeMin  = 1e-3 ; ETimeMax  = 1e-1
# GFlopsMin = 1e1  ; GFlopsMax = 2e2


filelst= ARGV

if filelst == [] then
  raise "Usage : #{$0} logfiles"
  filelst=["w_mpi_module_bench_OMP1.log",\
           "w_mpi_module_bench_OMP2.log",\
           "w_mpi_module_bench_OMP4.log"]
end

#
#---------- データ読み込み ----------
#
#i=0
omp=[]
mpi=[]
etime_s2g=[]
etime_g2s=[]
gflops_s2g=[]
gflops_g2s=[]

filelst.each do |file|
  File.open(file){|f|
    f.each_line{|line|
      if line[0] != "#" then
        ary = line.chomp.split
        if ary[0] != nil then
          omp.push(ary[0].to_i)
          mpi.push(ary[1].to_i)
          etime_s2g.push(ary[2].to_f)
          etime_g2s.push(ary[3].to_f)
          gflops_s2g.push(ary[4].to_f)
          gflops_g2s.push(ary[5].to_f)
        end
      end
    }
  }
end
#
#---------- データ順序変え ----------
#
# omp の値で分類
#
nomp = omp.size

omplist = omp.uniq.sort
nompl = omplist.size

rmiss  = DCL.glrget('RMISS')
omps   = NArray.float(nomp,nompl).fill!(rmiss)
mpis   = NArray.float(nomp,nompl).fill!(rmiss)
core   = NArray.float(nomp,nompl).fill!(rmiss)
etimes_s2g = NArray.float(nomp,nompl).fill!(rmiss)
etimes_g2s = NArray.float(nomp,nompl).fill!(rmiss)
gflopss_s2g = NArray.float(nomp,nompl).fill!(rmiss)
gflopss_g2s = NArray.float(nomp,nompl).fill!(rmiss)

for j in 0..nompl-1 do
  ii=0
  for i in 0..nomp-1 do
    if omp[i] == omplist[j] then
      omps[ii,j]   = omp[i]
      mpis[ii,j]   = mpi[i]
      etimes_s2g[ii,j] = etime_s2g[i]
      etimes_g2s[ii,j] = etime_g2s[i]
      gflopss_s2g[ii,j] = gflops_s2g[i]
      gflopss_g2s[ii,j] = gflops_g2s[i]
      core[ii,j]   = omp[i]*mpi[i]
      ii=ii+1
    end
  end
end
#
#---------- 描画 ----------
#
DCL.gllset('LMISS',true)

if ! Math.const_defined?(:CoreMin) then
  CoreMin = DCL.rmin(core,core.size,1)
  CoreMax = DCL.rmax(core,core.size,1)
end
if ! Math.const_defined?(:ETimeMin) then
  ETimeMin =  DCL.rgnlt([DCL.rmin(etime_s2g,etime_s2g.size,1),\
                         DCL.rmax(etime_g2s,etime_s2g.size,1)].min)
  ETimeMax =  DCL.rgngt([DCL.rmax(etime_s2g,etime_s2g.size,1),\
                         DCL.rmax(etime_g2s,etime_s2g.size,1)].max)
end
if ! Math.const_defined?(:GFlopsMin) then
  GFlopsMin = DCL.rgnlt([DCL.rmin(gflops_s2g,gflops_s2g.size,1),\
                         DCL.rmax(gflops_g2s,gflops_s2g.size,1)].min)
  GFlopsMax = DCL.rgngt([DCL.rmax(gflops_s2g,gflops_s2g.size,1),\
                         DCL.rmax(gflops_g2s,gflops_s2g.size,1)].max)
end

DCL.gropn(1)
DCL.grfrm
DCL.grsvpt( 0.2, 0.8, 0.2, 0.8 )
DCL.grswnd( CoreMin, CoreMax, ETimeMin, ETimeMax )
DCL.grstrn(4)
DCL.grstrf
DCL.ussttl( '#core', '', 'elapsed time (S2G/G2S)','s')

for j in 0..nompl-1 do
  DCL.uulinz( core[true,j], etimes_s2g[true,j], index[0], type[j] )
  DCL.uulinz( core[true,j], etimes_g2s[true,j], index[0], type[j] )
end
DCL.usdaxs

DCL.grfrm
DCL.grsvpt( 0.2, 0.8, 0.2, 0.8 )
DCL.grswnd( CoreMin, CoreMax, GFlopsMin, GFlopsMax )
DCL.grstrn(4)
DCL.grstrf
DCL.ussttl( '#core', '', 'GFlops (S2G/G2S)','s')

for j in 0..nompl-1 do
  DCL.uulinz( core[true,j], gflopss_s2g[true,j], index[0], type[j] )
  DCL.uulinz( core[true,j], gflopss_g2s[true,j], index[1], type[j] )
end

DCL.usdaxs
DCL.grcls

