ROOT logo
// $Id: MultiSpheror.cxx 2456 2010-10-17 18:31:40Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

//__________________________________________________________________________
// MultiSpheror
//
//

#include "MultiSpheror.h"
#include "MultiSpheror.c7"

#include "Spheror.h"
#include <Glasses/ZQueen.h>
#include <Glasses/SaturnInfo.h>
#include <Gled/GledMirDefs.h>

#include <TRandom.h>


ClassImp(MultiSpheror);

/**************************************************************************/

void MultiSpheror::_init()
{
  mNVert = 20;
  mDx = 3;
  mNGrid = 4;
  mNG = mNtoDo = mNDone = 0;
}

/**************************************************************************/

void MultiSpheror::Init()
{
  if(mNG != 0) {
    mListMutex.Lock();
    Stepper<Spheror> s(this);
    while(s.step()) {
      s->GetAmoeba()->SetHost(0);
      s->GetAmoeba()->SetWA_Master(0);
      s->SetAmoeba(0);
    }
    mListMutex.Unlock();
    ClearList();
    mNG = 0;
  }

  mNG = mNGrid; mNtoDo = mNG*mNG; mNDone = 0;

  // This will give different state on different nodes. But it is just
  // to have sth to draw. Spherors will be reinited upon thread start-up.
  TRandom rnd(0);

  for(UShort_t i=0; i<mNtoDo; ++i) {
    UShort_t ki = i % mNG;
    UShort_t kj = i / mNG;

    Spheror* s = new Spheror(GForm("S(%hu,%hu)", ki, kj));
    s->MoveLF(1, mDx*(ki - 0.5*mNG));
    s->MoveLF(2, mDx*(kj - 0.5*mNG));
    s->SetNVert(mNVert);
    s->SetBeautyP(true);
    s->SetColor(1, 1, 0.5);
    auto_ptr<TVectorF> v(s->InitialState(rnd));
    s->SetState(*v);

    mQueen->CheckIn(s); s->Install(); Add(s);
    // Could get first ... and torture it further ...
  }
  Stamp(FID());
}

void MultiSpheror::ClaimCPUs()
{
  static const Exc_t _eh("MultiSpheror::ClaimCPUs ");

  if(IsSunSpace() == false)
    return;

  if(mNDone >= mNtoDo) {
    throw(_eh + Identify() + "finished.");
  }

  list<Spheror*> todo;
  {
    GMutexHolder llck(mListMutex);
    Stepper<Spheror> s(this);
    while(s.step()) {
      if(s->GetAmoeba()->GetHost() == 0)
	todo.push_back(*s);
    }
  }
  if(todo.empty())
    throw(_eh + "nothing to do.");

  lpZGlass_t sats;
  mSaturn->GetSaturnInfo()->GetMoons()->CopyList(sats);
  sats.push_back(mSaturn->GetSaturnInfo());
  for(lpZGlass_i s=sats.begin(); s!=sats.end(); ++s) {
    if(mNDone >= mNtoDo) break;
    SaturnInfo* si = dynamic_cast<SaturnInfo*>(*s);
    if(si && si->GetLAvg5() < si->GetCPU_Num()) {
      Spheror* spheror = todo.front();
      SP_MIR(spheror->GetAmoeba(), SetHost, si);
      SP_MIR(spheror->GetAmoeba(), Start);
      ++mNDone; Stamp(FID());
      todo.pop_front();
    }
  }

}
 MultiSpheror.cxx:1
 MultiSpheror.cxx:2
 MultiSpheror.cxx:3
 MultiSpheror.cxx:4
 MultiSpheror.cxx:5
 MultiSpheror.cxx:6
 MultiSpheror.cxx:7
 MultiSpheror.cxx:8
 MultiSpheror.cxx:9
 MultiSpheror.cxx:10
 MultiSpheror.cxx:11
 MultiSpheror.cxx:12
 MultiSpheror.cxx:13
 MultiSpheror.cxx:14
 MultiSpheror.cxx:15
 MultiSpheror.cxx:16
 MultiSpheror.cxx:17
 MultiSpheror.cxx:18
 MultiSpheror.cxx:19
 MultiSpheror.cxx:20
 MultiSpheror.cxx:21
 MultiSpheror.cxx:22
 MultiSpheror.cxx:23
 MultiSpheror.cxx:24
 MultiSpheror.cxx:25
 MultiSpheror.cxx:26
 MultiSpheror.cxx:27
 MultiSpheror.cxx:28
 MultiSpheror.cxx:29
 MultiSpheror.cxx:30
 MultiSpheror.cxx:31
 MultiSpheror.cxx:32
 MultiSpheror.cxx:33
 MultiSpheror.cxx:34
 MultiSpheror.cxx:35
 MultiSpheror.cxx:36
 MultiSpheror.cxx:37
 MultiSpheror.cxx:38
 MultiSpheror.cxx:39
 MultiSpheror.cxx:40
 MultiSpheror.cxx:41
 MultiSpheror.cxx:42
 MultiSpheror.cxx:43
 MultiSpheror.cxx:44
 MultiSpheror.cxx:45
 MultiSpheror.cxx:46
 MultiSpheror.cxx:47
 MultiSpheror.cxx:48
 MultiSpheror.cxx:49
 MultiSpheror.cxx:50
 MultiSpheror.cxx:51
 MultiSpheror.cxx:52
 MultiSpheror.cxx:53
 MultiSpheror.cxx:54
 MultiSpheror.cxx:55
 MultiSpheror.cxx:56
 MultiSpheror.cxx:57
 MultiSpheror.cxx:58
 MultiSpheror.cxx:59
 MultiSpheror.cxx:60
 MultiSpheror.cxx:61
 MultiSpheror.cxx:62
 MultiSpheror.cxx:63
 MultiSpheror.cxx:64
 MultiSpheror.cxx:65
 MultiSpheror.cxx:66
 MultiSpheror.cxx:67
 MultiSpheror.cxx:68
 MultiSpheror.cxx:69
 MultiSpheror.cxx:70
 MultiSpheror.cxx:71
 MultiSpheror.cxx:72
 MultiSpheror.cxx:73
 MultiSpheror.cxx:74
 MultiSpheror.cxx:75
 MultiSpheror.cxx:76
 MultiSpheror.cxx:77
 MultiSpheror.cxx:78
 MultiSpheror.cxx:79
 MultiSpheror.cxx:80
 MultiSpheror.cxx:81
 MultiSpheror.cxx:82
 MultiSpheror.cxx:83
 MultiSpheror.cxx:84
 MultiSpheror.cxx:85
 MultiSpheror.cxx:86
 MultiSpheror.cxx:87
 MultiSpheror.cxx:88
 MultiSpheror.cxx:89
 MultiSpheror.cxx:90
 MultiSpheror.cxx:91
 MultiSpheror.cxx:92
 MultiSpheror.cxx:93
 MultiSpheror.cxx:94
 MultiSpheror.cxx:95
 MultiSpheror.cxx:96
 MultiSpheror.cxx:97
 MultiSpheror.cxx:98
 MultiSpheror.cxx:99
 MultiSpheror.cxx:100
 MultiSpheror.cxx:101
 MultiSpheror.cxx:102
 MultiSpheror.cxx:103
 MultiSpheror.cxx:104
 MultiSpheror.cxx:105
 MultiSpheror.cxx:106
 MultiSpheror.cxx:107
 MultiSpheror.cxx:108
 MultiSpheror.cxx:109
 MultiSpheror.cxx:110
 MultiSpheror.cxx:111
 MultiSpheror.cxx:112
 MultiSpheror.cxx:113
 MultiSpheror.cxx:114
 MultiSpheror.cxx:115