ROOT logo
// $Id: Spheror.cxx 2088 2008-11-23 20:26:46Z 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/.

#include "Spheror.h"
#include <Glasses/ZQueen.h>

#include <TMath.h>


ClassImp(Spheror);

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

void Spheror::_init()
{
  mAmoeba = 0;
  mNVert=2; mNV=0;
  mSize=0.1; mScale=1;
}

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

TVectorF* Spheror::GimmeXYZ(const TVectorF& x)
{
  TVectorF* ret = new TVectorF(3*mNV); TVectorF& v = *ret;
  Int_t i=0, j=0;
  for(Int_t f=0; f<mNV; f++, i+=2, j+=3) {
    Float_t ct = TMath::Abs(TMath::Cos(x(i+1u)));
    Float_t cp = TMath::Cos(x(i)), sp = TMath::Sin(x(i));
    v(j) = ct*cp; v(j+1u) = ct*sp; v(j+2u) = TMath::Sin(x(i+1u));
  }
  return ret;
}

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

TVectorF* Spheror::InitialState(TRandom& rnd)
{
  mNV = mNVert;
  mState.ResizeTo(2*mNV);
  TVectorF* v = new TVectorF(2*mNV);
  for(Int_t i=0; i<2*mNV; i+=2) {
    (*v)(i)   = mState(i)    = 2*TMath::Pi()*rnd.Rndm();       // phi
    (*v)(i+1) = mState(i+1u) = TMath::ASin( 2*rnd.Rndm() - 1); // theta
  }
  return v;
}

TVectorF* Spheror::InitialPerturbations(TRandom& rnd)
{
  TVectorF* p = new TVectorF(2*mNV);
  for(Int_t i=0; i<2*mNV; i+=2) {
    (*p)(i) = TMath::Pi()/2 * ( rnd.Rndm() - 0.5 );
    (*p)(i+1) = TMath::Pi()/4 * ( rnd.Rndm() - 0.5 );
  }
  return p;
}

Float_t Spheror::Foon(const TVectorF& x)
{
  // Energy defed as sum of 1/r
  TVectorF* nkrumah = GimmeXYZ(x); TVectorF& v = *nkrumah;
  Float_t sum = 0;
  Int_t i=0;
  for(Int_t f=0; f<mNV-1; f++, i+=3) {
    Int_t j = i+3;
    for(Int_t g=f+1; g<mNV; g++, j+=3) {
#define SQR(a)	((a) * (a))
      Float_t drs = SQR(v(i)-v(j)) + SQR(v(i+1u)-v(j+1u)) + SQR(v(i+2u)-v(j+2u));
#undef SQR
      if(drs<1e-14) drs = 1e-14;
      sum += 1/TMath::Sqrt(drs);
    }
  }
  delete nkrumah;
  return sum;
}

void Spheror::SetState(const TVectorF& x)
{
  if(mState.GetNrows() != x.GetNrows()) {
    mState.ResizeTo(x);
    mNV = mState.GetNrows()/2;
  }
  mState = x;
  Stamp(FID());
}

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

void Spheror::Install() {
  WarmAmoeba* wa = new WarmAmoeba(this, "SpheroAmoeba");
  mQueen->CheckIn(wa);
  Add(wa);
  wa->SetWA_Master(this);
  wa->SetStampInterval(1);
  SetAmoeba(wa);
}

void Spheror::SelfInit() {
  TRandom rnd(0);
  auto_ptr<TVectorF> v(InitialState(rnd));
  SetState(*v);
}

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

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