buff-em core library documentation
The buff-em core library, libbuff, exports a C++ class named
SWGGeometry.
The public methods of this class offer access to the
computational routines provided by buff-em to implement the
discretized volume-integral-equation (VIE) approach to
computational electromagnetism.
The SWGGeometry
class is analogous to the RWGGeometry
class in
the scuff-em core library
Creating an SWGGeometry
SWGGeometry *G = new SWGGeometry("E10Sphere_533.buffgeo");
Setting up and solving the VIE system
Note: Incident fields are handled the same way as in scuff-em; see Incident fields in scuff-em.
HMatrix *M = G->AllocateVIEMatrix();
HVector *J = G->AllocateRHSVector();
cdouble E0[3] = {1.0, 0.0, 0.0};
double nHat[3] = {0.0, 0.0, 1.0};
PlaneWave *PW = new PlaneWave(E0, nHat);
G->AssembleVIEMatrix(Omega, M);
G->AssembleRHSVector(Omega, PW, J);
M->LUFactorize();
M->LUSolve(J);
Computing scattered and total fields
HMatrix *XMatrix=new HMatrix("ListOfEvaluationPoints");
HMatrix *EHIncMatrix = G->GetFields(PW, J, Omega, XMatrix);
HMatrix *EHScatMatrix = G->GetFields(0, J, Omega, XMatrix);
// E, H fields at the nth evaluation point are now in the
// nth row of the matrices, like this: Ex Ey Ez Hx Hy Hz
int np=7;
double X[3];
cdouble E[3], H[3];
XMatrix->GetEntries(np, ":", X);
E[0] = EHIncMatrix->GetEntry(np, 0) + EHScatMatrix->GetEntry(np, 0);
E[1] = EHIncMatrix->GetEntry(np, 1) + EHScatMatrix->GetEntry(np, 1);
E[2] = EHIncMatrix->GetEntry(np, 2) + EHScatMatrix->GetEntry(np, 2);
H[0] = EHIncMatrix->GetEntry(np, 3) + EHScatMatrix->GetEntry(np, 3);
H[1] = EHIncMatrix->GetEntry(np, 4) + EHScatMatrix->GetEntry(np, 4);
H[2] = EHIncMatrix->GetEntry(np, 5) + EHScatMatrix->GetEntry(np, 5);
// now X[0..2] are the coordinates of evaluation point #np
// and E[0..2], H[0..2] are the total E and H fields there
Transforming the geometry
To rotate the object named "SmallerTorus" by 90 degrees around the z axis, then displaced it upward by 3 length units:
SWGVolume *O = G->GetObjectByLabel("SmallerTorus");
if (!O)
ErrExit("no such object");
O->Transform("ROTATED 90 ABOUT 0 0 1");
O->Transform("DISPLACED 0 0 3");
Computing power, force, and torque
PFTOptions MyOptions;
InitPFTOptions(&MyOptions);
PFTOptions->PFTMethod = BUFF_PFT_JDE; // or BUFF_PFT_DSI or BUFF_PFT_OVERLAP
PFTOptions->IF = PW; // incident field is needed for some PFT methods
HMatrix *PFTMatrix=G->GetPFT(J, Omega);
// PFTMatrix->GetEntryD(no, nq) now returns the #nqth power quantity for object #no
// no=0,1, ..., G->NumObjects - 1
// nq=0,1 for absorbed, scattered power
// 2,3,4 for force (x,y,z)
// 5,6,7 for torque (x,y,z)