// $Header: /cvs/gled-1.2/Numerica/Glasses/Spheror.cxx,v 1.5 2005/03/11 17:50:17 matevz Exp $
// Copyright (C) 1999-2005, 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>
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"
ROOT page - Home page - Class index - Class Hierarchy - Top of the page
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.