//
// clusterpi.js
// Neil Gershenfeld 12/8/18
// pi calculation benchmark
// pi = 3.14159265358979323846
//
const cluster = require('cluster')
if (cluster.isMaster) 
   master()
else
   child()
function master() {
   var processes = parseInt(process.argv[2])
   var points = 1e9
   var pi = 0
   var results = 0
   var tstart = Date.now()/1000
   for (var i = 0; i < processes; i++) {
      var worker = cluster.fork({index:i,points:points})
      worker.on('message',(result) => {
         pi += result
         results += 1
         if (results == processes) {
            var tend = Date.now()/1000
            var mflops = (processes*points)*5.0*1e-6/(tend-tstart)
            console.log('pi: '+pi)
            console.log('time: '+(tend-tstart).toFixed(1)+'s')
            console.log('processes: '+processes)
            console.log('estimated MFlops: '+mflops.toFixed(1))
            process.exit()
            }
         })
      }
   }
function child() { 
   var index = parseInt(process.env.index)
   var points = parseInt(process.env.points)
   var a = 0.5
   var b = 0.75
   var c = 0.25
   var sum = 0
   var start = 1+points*index
   var end = points*(index+1)
   for (var i = start; i <= end; ++i)
      sum += a/((i-b)*(i-c))
   process.send(sum)
   }