#include "libscl.h"
#include <omp.h>

using namespace scl;
using namespace std;

int main (int argc, char** argp, char** envp)
{
  realmat a;
  if(!vecread("a.dat",a)) error("Read failed");

  a = T(a);

  cout << a << '\n';
  
  INTEGER anrow = a.nrow();
  INTEGER ancol = a.ncol();

  string msg;

  INTEGER chunk = 2;
  INTEGER tid;

  REAL fnorm = 0.0;
  REAL sum;

  #pragma omp parallel shared(chunk, fnorm) private(tid, msg, sum)
  {
    tid = omp_get_thread_num();
    //#pragma omp for schedule (static, chunk)
    #pragma omp for schedule (dynamic)
    for (INTEGER j=1; j<=ancol; ++j) {
      msg = "Thread" + fmt('d',3,tid)();
      msg += " did col" + fmt('d',3,j)() + "\n";
      cout << msg;
      sum = 0.0;
      for (INTEGER i=1; i<=anrow; ++i) {
        sum += pow(a(i,j),2);
      }
      #pragma omp critical
      { fnorm += sum; }
    }
  }
  fnorm = sqrt(fnorm);
  cout << "\nFrobenius norm = " << fnorm << '\n';
  return 0;
}


