Initial commit

pull/1/head
Thorsten Liebig 2010-02-28 22:48:03 +01:00
commit 6fa5b4140a
12 changed files with 1549 additions and 0 deletions

9
.gitignore vendored Normal file
View File

@ -0,0 +1,9 @@
release/
debug/
doc/
obj/
Makefile*
*~
*.so*
*.pro.user
openEMS

448
FDTD/cartoperator.cpp Normal file
View File

@ -0,0 +1,448 @@
#include "cartoperator.h"
CartOperator::CartOperator()
{
Init();
}
CartOperator::~CartOperator()
{
Reset();
}
void CartOperator::Init()
{
CSX = NULL;
MainOp=NULL;
DualOp=NULL;
for (int n=0;n<3;++n)
{
discLines[n]=NULL;
EC_C[n]=NULL;
EC_G[n]=NULL;
EC_L[n]=NULL;
EC_R[n]=NULL;
vv[n]=NULL;
vi[n]=NULL;
iv[n]=NULL;
ii[n]=NULL;
}
}
void CartOperator::Reset()
{
for (int n=0;n<3;++n)
{
delete[] EC_C[n];
delete[] EC_G[n];
delete[] EC_L[n];
delete[] EC_R[n];
delete[] vv[n];
delete[] vi[n];
delete[] iv[n];
delete[] ii[n];
}
delete MainOp;
delete DualOp;
Init();
}
void CartOperator::SetGeometryCSX(ContinuousStructure* geo)
{
if (geo==NULL) return;
Reset();
CSX = geo;
CSRectGrid* grid=CSX->GetGrid();
for (int n=0;n<3;++n)
{
discLines[n] = grid->GetLines(n,discLines[n],numLines[n],true);
if (numLines[n]<3) {cerr << "CartOperator::SetGeometryCSX: you need at least 3 disc-lines in every direction (3D!)!!!" << endl; Reset(); return;}
}
MainOp = new AdrOp(numLines[0],numLines[1],numLines[2]);
MainOp->SetGrid(discLines[0],discLines[1],discLines[2]);
if (grid->GetDeltaUnit()<=0) {cerr << "CartOperator::SetGeometryCSX: grid delta unit must not be <=0 !!!" << endl; Reset(); return;}
else gridDelta=grid->GetDeltaUnit();
MainOp->SetGridDelta(1);
MainOp->AddCellAdrOp();
}
int CartOperator::CalcECOperator()
{
if (Calc_EC()==0)
return -1;
CalcTimestep();
for (int n=0;n<3;++n)
{
delete[] vv[n];
vv[n] = new FDTD_FLOAT[MainOp->GetSize()];
delete[] vi[n];
vi[n] = new FDTD_FLOAT[MainOp->GetSize()];
delete[] iv[n];
iv[n] = new FDTD_FLOAT[MainOp->GetSize()];
delete[] ii[n];
ii[n] = new FDTD_FLOAT[MainOp->GetSize()];
for (unsigned int i=0;i<MainOp->GetSize();++i)
{
vv[n][i] = (1-dT*EC_G[n][i]/2/EC_C[n][i])/(1+dT*EC_G[n][i]/2/EC_C[n][i]);
vi[n][i] = (dT/EC_C[n][i])/(1+dT*EC_G[n][i]/2/EC_C[n][i]);
ii[n][i] = (1-dT*EC_R[n][i]/2/EC_L[n][i])/(1+dT*EC_R[n][i]/2/EC_L[n][i]);
iv[n][i] = (dT/EC_L[n][i])/(1+dT*EC_R[n][i]/2/EC_L[n][i]);
// cerr << iv[n][i] << endl;
}
}
//cleanup
for (int n=0;n<3;++n)
{
delete[] EC_C[n];EC_C[n]=NULL;
delete[] EC_G[n];EC_G[n]=NULL;
delete[] EC_L[n];EC_L[n]=NULL;
delete[] EC_R[n];EC_R[n]=NULL;
}
//Always apply PEC to all boundary's
bool PEC[6]={0,0,0,0,0,0};
ApplyElectricBC(PEC);
return 0;
}
void CartOperator::ApplyElectricBC(bool* dirs)
{
if (dirs==NULL) return;
unsigned int pos[3];
unsigned int ipos;
for (int n=0;n<3;++n)
{
int nP = (n+1)%3;
int nPP = (n+2)%3;
for (pos[nP]=0;pos[nP]<numLines[nP];++pos[nP])
{
for (pos[nPP]=0;pos[nPP]<numLines[nPP];++pos[nPP])
{
pos[n]=0;
ipos=MainOp->SetPos(pos[0],pos[1],pos[2]);
vv[n][ipos] *= (FDTD_FLOAT)!dirs[2*n];
vi[n][ipos] *= (FDTD_FLOAT)!dirs[2*n];
pos[n]=numLines[n]-1;
ipos=MainOp->SetPos(pos[0],pos[1],pos[2]);
vv[n][ipos] *= (FDTD_FLOAT)!dirs[2*n+1];
vi[n][ipos] *= (FDTD_FLOAT)!dirs[2*n+1];
}
}
}
}
void CartOperator::ApplyMagneticBC(bool* dirs)
{
if (dirs==NULL) return;
unsigned int pos[3];
unsigned int ipos;
for (int n=0;n<3;++n)
{
int nP = (n+1)%3;
int nPP = (n+2)%3;
for (pos[nP]=0;pos[nP]<numLines[nP];++pos[nP])
{
for (pos[nPP]=0;pos[nPP]<numLines[nPP];++pos[nPP])
{
pos[n]=0;
ipos=MainOp->SetPos(pos[0],pos[1],pos[2]);
ii[n][ipos] *= (FDTD_FLOAT)!dirs[2*n];
iv[n][ipos] *= (FDTD_FLOAT)!dirs[2*n];
pos[n]=numLines[n]-2;
ipos=MainOp->SetPos(pos[0],pos[1],pos[2]);
ii[n][ipos] *= (FDTD_FLOAT)!dirs[2*n+1];
iv[n][ipos] *= (FDTD_FLOAT)!dirs[2*n+1];
}
}
}
}
bool CartOperator::Calc_ECPos(int n, unsigned int* pos, double* inEC)
{
double coord[3];
double shiftCoord[3];
int nP = (n+1)%3;
int nPP = (n+2)%3;
coord[0] = discLines[0][pos[0]];
coord[1] = discLines[1][pos[1]];
coord[2] = discLines[2][pos[2]];
unsigned int ipos = MainOp->SetPos(pos[0],pos[1],pos[2]);
double delta=MainOp->GetIndexDelta(n,pos[n]);
double deltaP=MainOp->GetIndexDelta(nP,pos[nP]);
double deltaPP=MainOp->GetIndexDelta(nPP,pos[nPP]);
double delta_M=MainOp->GetIndexDelta(n,pos[n]-1);
double deltaP_M=MainOp->GetIndexDelta(nP,pos[nP]-1);
double deltaPP_M=MainOp->GetIndexDelta(nPP,pos[nPP]-1);
//******************************* epsilon,kappa averaging *****************************//
//shift up-right
shiftCoord[n] = coord[n]+delta*0.5;
shiftCoord[nP] = coord[nP]+deltaP*0.25;
shiftCoord[nPP] = coord[nPP]+deltaPP*0.25;
CSProperties* prop = CSX->GetPropertyByCoordPriority(shiftCoord,CSProperties::MATERIAL);
if (prop)
{
CSPropMaterial* mat = prop->ToMaterial();
inEC[0] = mat->GetEpsilon(n)*fabs(deltaP*deltaPP);
inEC[1] = mat->GetKappa(n)*fabs(deltaP*deltaPP);
}
else
{
inEC[0] = 1*fabs(deltaP*deltaPP);
inEC[1] = 0;
}
//shift up-left
shiftCoord[n] = coord[n]+delta*0.5;
shiftCoord[nP] = coord[nP]-deltaP_M*0.25;
shiftCoord[nPP] = coord[nPP]+deltaPP*0.25;
prop = CSX->GetPropertyByCoordPriority(shiftCoord,CSProperties::MATERIAL);
if (prop)
{
CSPropMaterial* mat = prop->ToMaterial();
inEC[0] += mat->GetEpsilon(n)*fabs(deltaP*deltaPP);
inEC[1] += mat->GetKappa(n)*fabs(deltaP*deltaPP);
}
else
{
inEC[0] += 1*fabs(deltaP*deltaPP);
inEC[1] += 0;
}
//shift down-right
shiftCoord[n] = coord[n]+delta*0.5;
shiftCoord[nP] = coord[nP]+deltaP*0.25;
shiftCoord[nPP] = coord[nPP]-deltaPP_M*0.25;
prop = CSX->GetPropertyByCoordPriority(shiftCoord,CSProperties::MATERIAL);
if (prop)
{
CSPropMaterial* mat = prop->ToMaterial();
inEC[0] += mat->GetEpsilon(n)*fabs(deltaP*deltaPP);
inEC[1] += mat->GetKappa(n)*fabs(deltaP*deltaPP);
}
else
{
inEC[0] += 1*fabs(deltaP*deltaPP);
inEC[1] += 0;
}
//shift down-left
shiftCoord[n] = coord[n]+delta*0.5;
shiftCoord[nP] = coord[nP]-deltaP_M*0.25;
shiftCoord[nPP] = coord[nPP]-deltaPP_M*0.25;
prop = CSX->GetPropertyByCoordPriority(shiftCoord,CSProperties::MATERIAL);
if (prop)
{
CSPropMaterial* mat = prop->ToMaterial();
inEC[0] += mat->GetEpsilon(n)*fabs(deltaP*deltaPP);
inEC[1] += mat->GetKappa(n)*fabs(deltaP*deltaPP);
}
else
{
inEC[0] += 1*fabs(deltaP*deltaPP);
inEC[1] += 0;
}
inEC[0]*=gridDelta/fabs(delta)/4*__EPS0__;
inEC[1]*=gridDelta/fabs(delta)/4;
//******************************* mu,sigma averaging *****************************//
//shift down
shiftCoord[n] = coord[n]-delta_M*0.25;
shiftCoord[nP] = coord[nP]+deltaP*0.5;
shiftCoord[nPP] = coord[nPP]+deltaPP*0.5;
prop = CSX->GetPropertyByCoordPriority(shiftCoord,CSProperties::MATERIAL);
if (prop)
{
CSPropMaterial* mat = prop->ToMaterial();
inEC[2] = fabs(delta_M) / mat->GetMue(n);
if (mat->GetSigma(n))
inEC[3] = fabs(delta_M) / mat->GetSigma(n);
else
inEC[3] = 0;
}
else
{
inEC[2] = fabs(delta_M);
inEC[3] = 0;
}
//shift up
shiftCoord[n] = coord[n]+delta*0.25;
shiftCoord[nP] = coord[nP]+deltaP*0.5;
shiftCoord[nPP] = coord[nPP]+deltaPP*0.5;
prop = CSX->GetPropertyByCoordPriority(shiftCoord,CSProperties::MATERIAL);
if (prop)
{
CSPropMaterial* mat = prop->ToMaterial();
inEC[2] += mat->GetMue(n)*fabs(delta);
if (mat->GetSigma(n))
inEC[3] += fabs(delta)/mat->GetSigma(n);
else
inEC[3] = 0;
}
else
{
inEC[2] += 1*fabs(delta);
inEC[3] = 0;
}
inEC[2] = gridDelta * fabs(deltaP*deltaPP) * 2 * __MUE0__ / inEC[2];
if (inEC[3]) inEC[3]=gridDelta*fabs(deltaP*deltaPP) * 2 / inEC[3];
return true;
}
bool CartOperator::Calc_EffMatPos(int n, unsigned int* pos, double* inMat)
{
int nP = (n+1)%3;
int nPP = (n+2)%3;
unsigned int ipos = MainOp->SetPos(pos[0],pos[1],pos[2]);
double delta=MainOp->GetIndexDelta(n,pos[n]);
double deltaP=MainOp->GetIndexDelta(nP,pos[nP]);
double deltaPP=MainOp->GetIndexDelta(nPP,pos[nPP]);
double delta_M=MainOp->GetIndexDelta(n,pos[n]-1);
double deltaP_M=MainOp->GetIndexDelta(nP,pos[nP]-1);
double deltaPP_M=MainOp->GetIndexDelta(nPP,pos[nPP]-1);
this->Calc_ECPos(n,pos,inMat);
inMat[0] *= (delta*delta)/MainOp->GetNodeVolume(ipos)/gridDelta;
inMat[1] *= (delta*delta)/MainOp->GetNodeVolume(ipos)/gridDelta;
inMat[2] *= 0.5*(fabs(delta_M) + fabs(delta)) / fabs(deltaP*deltaPP) / gridDelta;
inMat[3] *= 0.5*(fabs(delta_M) + fabs(delta)) / fabs(deltaP*deltaPP) / gridDelta;
}
bool CartOperator::Calc_EC()
{
if (CSX==NULL) {cerr << "CartOperator::Calc_EC: CSX not given or invalid!!!" << endl; return false;}
unsigned int ipos;
unsigned int pos[3];
double inEC[4];
for (int n=0;n<3;++n)
{
//init x-cell-array
delete[] EC_C[n];
delete[] EC_G[n];
delete[] EC_L[n];
delete[] EC_R[n];
EC_C[n] = new double[MainOp->GetSize()];
EC_G[n] = new double[MainOp->GetSize()];
EC_L[n] = new double[MainOp->GetSize()];
EC_R[n] = new double[MainOp->GetSize()];
for (unsigned int i=0;i<MainOp->GetSize();i++) //init all
{
EC_C[n][i]=0;
EC_G[n][i]=0;
EC_L[n][i]=0;
EC_R[n][i]=0;
}
for (pos[2]=0;pos[2]<numLines[2];++pos[2])
{
for (pos[1]=0;pos[1]<numLines[1];++pos[1])
{
for (pos[0]=0;pos[0]<numLines[0];++pos[0])
{
Calc_ECPos(n,pos,inEC);
ipos = MainOp->SetPos(pos[0],pos[1],pos[2]);
EC_C[n][ipos]=inEC[0];
EC_G[n][ipos]=inEC[1];
EC_L[n][ipos]=inEC[2];
EC_R[n][ipos]=inEC[3];
}
}
}
}
return true;
}
double CartOperator::CalcTimestep()
{
dT=1e200;
double newT;
unsigned int pos[3];
unsigned int ipos;
unsigned int ipos_PM;
unsigned int ipos_PPM;
MainOp->SetReflection2Cell();
for (int n=0;n<3;++n)
{
int nP = (n+1)%3;
int nPP = (n+2)%3;
for (pos[2]=0;pos[2]<numLines[2];++pos[2])
{
for (pos[1]=0;pos[1]<numLines[1];++pos[1])
{
for (pos[0]=0;pos[0]<numLines[0];++pos[0])
{
ipos = MainOp->SetPos(pos[0],pos[1],pos[2]);
ipos_PM = MainOp->Shift(nP,-1);
MainOp->ResetShift();
ipos_PPM= MainOp->Shift(nPP,-1);
MainOp->ResetShift();
newT = 2/sqrt( ( 4/EC_L[nP][ipos] + 4/EC_L[nP][ipos_PPM] + 4/EC_L[nPP][ipos] + 4/EC_L[nPP][ipos_PM]) / EC_C[n][ipos] );
if (newT<dT) dT=newT;
}
}
}
}
// cerr << "Timestep: " << dT << endl;
return 0;
}
unsigned int CartOperator::GetVoltageExcitation(unsigned int* &index, FDTD_FLOAT** &excit_amp, FDTD_FLOAT* &excit_delay)
{
vector<unsigned int> vIndex;
vector<FDTD_FLOAT> vExcit[3];
vector<FDTD_FLOAT> vDelay;
unsigned int ipos;
unsigned int pos[3];
double coord[3];
for (pos[2]=0;pos[2]<numLines[2];++pos[2])
{
for (pos[1]=0;pos[1]<numLines[1];++pos[1])
{
for (pos[0]=0;pos[0]<numLines[0];++pos[0])
{
ipos = MainOp->SetPos(pos[0],pos[1],pos[2]);
coord[0] = discLines[0][pos[0]];
coord[1] = discLines[1][pos[1]];
coord[2] = discLines[2][pos[2]];
CSProperties* prop = CSX->GetPropertyByCoordPriority(coord,CSProperties::ELECTRODE);
if (prop)
{
CSPropElectrode* elec = prop->ToElectrode();
if (elec->GetType()==0)
{
vIndex.push_back(ipos);
for (int n=0;n<3;++n)
{
double delta=MainOp->GetIndexDelta(n,pos[n]);
vExcit[n].push_back(elec->GetWeightedExcitation(n,coord)*delta);
}
}
}
}
}
}
cerr << "size:" << vIndex.size() << endl;
}

63
FDTD/cartoperator.h Normal file
View File

@ -0,0 +1,63 @@
#ifndef CARTOPERATOR_H
#define CARTOPERATOR_H
#include "ContinuousStructure.h"
#include "tools/AdrOp.h"
#include "tools/constants.h"
#define FDTD_FLOAT float
class CartOperator
{
public:
CartOperator();
virtual ~CartOperator();
void SetGeometryCSX(ContinuousStructure* geo);
int CalcECOperator();
void ApplyElectricBC(bool* dirs); //applied by default to all boundaries
void ApplyMagneticBC(bool* dirs);
double GetTimestep() {return dT;};
/*!
Get the voltage excitations. Returns number of excitations, listed position in index, with amplitude in all 3 directions and a possible time delay.
*/
unsigned int GetVoltageExcitation(unsigned int* &index, FDTD_FLOAT** &excit_amp, FDTD_FLOAT* &excit_delay);
void Reset();
protected:
void Init();
ContinuousStructure* CSX;
AdrOp* MainOp;
AdrOp* DualOp;
double* discLines[3];
unsigned int numLines[3];
double gridDelta;
double dT; //FDTD timestep!
//EC operator
FDTD_FLOAT* vv[3]; //calc new voltage from old voltage
FDTD_FLOAT* vi[3]; //calc new voltage from old current
FDTD_FLOAT* ii[3]; //calc new current from old current
FDTD_FLOAT* iv[3]; //calc new current from old voltage
//Calc timestep only internal use
double CalcTimestep();
//EC elements, internal only!
bool Calc_EC();
bool Calc_ECPos(int n, unsigned int* pos, double* inEC);
bool Calc_EffMatPos(int n, unsigned int* pos, double* inMat);
double* EC_C[3];
double* EC_G[3];
double* EC_L[3];
double* EC_R[3];
};
#endif // CARTOPERATOR_H

34
main.cpp Normal file
View File

@ -0,0 +1,34 @@
#include <iostream>
#include <time.h>
#include "FDTD/cartoperator.h"
#include "ContinuousStructure.h"
using namespace std;
int main(int argc, char *argv[])
{
cout << "Hello World" << endl;
fprintf(stderr,"%e\n",1.4456);
time_t startTime=time(NULL);
ContinuousStructure CSX;
CSX.ReadFromXML("csx-files/1Mill.xml");
CartOperator cop;
cop.SetGeometryCSX(&CSX);
cop.CalcECOperator();
unsigned int* index = NULL;
FDTD_FLOAT** amp=NULL;
FDTD_FLOAT* delay=NULL;
unsigned int nEx = cop.GetVoltageExcitation(index,amp,delay);
time_t OpDoneTime=time(NULL);
cerr << "Time for operator: " << difftime(OpDoneTime,startTime) << endl;
return 0;
}

20
openEMS.pro Normal file
View File

@ -0,0 +1,20 @@
# -------------------------------------------------
# Project created by QtCreator 2010-02-26T22:34:51
# -------------------------------------------------
QT -= gui
TARGET = openEMS
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
OBJECTS_DIR = obj
INCLUDEPATH += ../CSXCAD
LIBS += -L../CSXCAD \
-lCSXCAD
SOURCES += main.cpp \
FDTD/cartoperator.cpp \
tools/ErrorMsg.cpp \
tools/AdrOp.cpp
HEADERS += FDTD/cartoperator.h \
tools/ErrorMsg.h \
tools/AdrOp.h \
tools/constants.h

503
tools/AdrOp.cpp Normal file
View File

@ -0,0 +1,503 @@
#include "AdrOp.h"
AdrOp::AdrOp(unsigned int muiImax, unsigned int muiJmax, unsigned int muiKmax, unsigned int muiLmax)
{
//error-handling...
error = new ErrorMsg(9); if (error==NULL) { fprintf(stderr,"Memory allocation failed!! exiting... \0"); exit(1); }
error->SetMsg(1,"Adress Operator: Memory allocation failed!! exiting... \0");
error->SetMsg(2,"Adress Operator: Invalid Adress requested!! exiting... \0");
error->SetMsg(3,"Adress Operator: Invalid Position set!! exiting...\0");
error->SetMsg(4,"Adress Operator: Invalid jump or passing end of iteration!! exiting...\0");
error->SetMsg(5,"Adress Operator: 4D not yet implemented!! exiting... \0");
error->SetMsg(6,"Adress Operator: Position not set!! exiting... \0");
error->SetMsg(7,"Adress Operator: Cells not added to Adress Operator!! exiting... \0");
error->SetMsg(8,"Adress Operator: Invalid Node!! exiting... \0");
error->SetMsg(9,"Adress Operator: Grid invalid!! exiting... \0");
//if (muiImax<0) muiImax=0;
//if (muiJmax<0) muiJmax=0;
//if (muiKmax<0) muiKmax=0;
//if (muiLmax<0) muiLmax=0;
uiDimension=0;
if (muiImax>0) uiDimension++;
else exit(-1);
if (muiJmax>0) uiDimension++;
else exit(-2);
if (muiKmax>0) uiDimension++;
if ( (muiLmax>0) && (muiKmax>0) ) uiDimension++;
// cout << "\n-----Adress Operator created: Dimension: " << uiDimension << "----" <<endl;
uiImax=muiImax;
uiJmax=muiJmax;
uiKmax=muiKmax;
uiLmax=muiLmax=0;
if (uiDimension==2) uiSize=uiImax*uiJmax;
else if (uiDimension==3) uiSize=uiImax*uiJmax*uiKmax;
else if (uiDimension==4) uiSize=uiImax*uiJmax*uiKmax*uiLmax;
else uiSize=0;
bPosSet=false;
if (uiDimension==4) error->Error(5);
iIshift=iJshift=iKshift=0;
reflect=false;
uiTypeOffset=0;
clCellAdr=NULL;
dGrid[0]=NULL;dGrid[1]=NULL;dGrid[2]=NULL;dGrid[3]=NULL;
dDeltaUnit=1;
bDebug=false;
}
AdrOp::AdrOp(AdrOp* origOP)
{
clCellAdr=NULL;
error=NULL; // has to be done!!!
uiDimension=origOP->uiDimension;
uiSize=origOP->uiSize;
uiImax=origOP->uiImax;
uiJmax=origOP->uiJmax;
uiKmax=origOP->uiKmax;
uiLmax=origOP->uiLmax;
uiIpos=origOP->uiIpos;
uiJpos=origOP->uiJpos;
uiKpos=origOP->uiKpos;
uiLpos=origOP->uiLpos;
for (int ii=0;ii<4;++ii) dGrid[ii]=origOP->dGrid[ii];
dDeltaUnit=origOP->dDeltaUnit;
iIshift=origOP->iIshift;
iJshift=origOP->iJshift;
iKshift=origOP->iKshift;
for (int ii=0;ii<3;++ii) iCellShift[ii]=origOP->iCellShift[ii];
i=origOP->i;
j=origOP->j;
k=origOP->k;
l=origOP->l;
reflect=origOP->reflect;
uiTypeOffset=origOP->uiTypeOffset;
bPosSet=origOP->bPosSet;
bDebug=origOP->bDebug;
// return;
if (origOP->clCellAdr!=NULL) clCellAdr= new AdrOp(origOP->clCellAdr);
}
AdrOp::~AdrOp()
{
// cerr << "\n------Adress Operator deconstructed-----\n" << endl;
delete error; error=NULL;
delete clCellAdr; clCellAdr=NULL;
}
unsigned int AdrOp::SetPos(unsigned int muiIpos, unsigned int muiJpos, unsigned int muiKpos, unsigned int muiLpos)
{
if (bDebug) fprintf(stderr,"AdrOp Debug:: SetPos(%d,%d,%d,%d) Max(%d,%d,%d,%d) \n",muiIpos,muiJpos,muiKpos,muiLpos,uiImax,uiJmax,uiKmax,uiLmax);
bPosSet=false;
if (muiIpos<uiImax) uiIpos=muiIpos;
else error->Error(3);
if (muiJpos<uiJmax) uiJpos=muiJpos;
else error->Error(3);
if ((muiKpos>=uiKmax) && (uiDimension>2)) error->Error(3);
else if (uiDimension>2) uiKpos=muiKpos;
if ((muiLpos>=uiLmax) && (uiDimension>3)) error->Error(3);
else if (uiDimension>3) uiLpos=muiLpos;
bPosSet=true;
// cerr << "Position i:" << uiIpos << " j: " << uiJpos << " k: " << uiKpos << " l: " << 0 << " MAX: i:" << uiImax << " j: " << uiJmax << " k: " << uiKmax << endl; //debug
ADRESSEXPENSE(0,0,0,0,uiDimension+1,18)
return GetPos();
}
bool AdrOp::SetPosChecked(unsigned int muiIpos, unsigned int muiJpos, unsigned int muiKpos, unsigned int muiLpos)
{
bPosSet=true;
if (muiIpos<uiImax) uiIpos=muiIpos;
else bPosSet=false;
if (muiJpos<uiJmax) uiJpos=muiJpos;
else bPosSet=false;
if ((muiKpos>=uiKmax) && (uiDimension>2)) bPosSet=false;
else if (uiDimension>2) uiKpos=muiKpos;
if ((muiLpos>=uiLmax) && (uiDimension>3)) bPosSet=false;
else if (uiDimension>3) uiLpos=muiLpos;
ADRESSEXPENSE(0,0,0,0,uiDimension+1,18)
return bPosSet;
}
void AdrOp::SetGrid(double *gridI,double *gridJ,double *gridK,double *gridL)
{
dGrid[0]=gridI;
dGrid[1]=gridJ;
dGrid[2]=gridK;
dGrid[3]=gridL;
ADRESSEXPENSE(0,0,0,0,4,0)
}
bool AdrOp::CheckPos(unsigned int muiIpos, unsigned int muiJpos, unsigned int muiKpos, unsigned int muiLpos)
{
bPosSet=true;
if ((muiIpos>=uiImax)) bPosSet=false;
if ((muiJpos>=uiJmax)) bPosSet=false;
if ((muiKpos>=uiKmax) && (uiDimension>2)) bPosSet=false;
if ((muiLpos>=uiLmax) && (uiDimension>3)) bPosSet=false;
ADRESSEXPENSE(0,0,0,0,uiDimension+1,18)
return bPosSet;
}
bool AdrOp::CheckRelativePos(int muiIrel,int muiJrel,int muiKrel, int muiLrel)
{
bPosSet=true;
if ((muiIrel+(int)uiIpos<0) || (muiIrel+(int)uiIpos>=(int)uiImax)) bPosSet=false;
if ((muiJrel+(int)uiJpos<0) || (muiJrel+(int)uiJpos>=(int)uiJmax)) bPosSet=false;
if (((muiKrel+(int)uiKpos<0) || (muiKrel+(int)uiKpos>=(int)uiKmax)) && (uiDimension>2)) bPosSet=false;
if (((muiLrel+(int)uiLpos<0) || (muiLrel+(int)uiLpos>=(int)uiLmax)) && (uiDimension>3)) bPosSet=false;
ADRESSEXPENSE(2*uiDimension,0,0,0,uiDimension+1,18)
return bPosSet;
}
unsigned int AdrOp::GetPos(int muiIrel, int muiJrel, int muiKrel, int muiLrel)
{
if (bPosSet==false) error->Error(6);
if (reflect)
{
#if EXPENSE_LOG==1
if (muiIrel+(int)uiIpos<0) ADRESSEXPENSE(2,1,0,0,1,0)
if (muiIrel+(int)uiIpos>(int)uiImax-1) ADRESSEXPENSE(4,1,0,0,1,0)
if (muiJrel+(int)uiJpos<0) ADRESSEXPENSE(2,1,0,0,1,0)
if (muiJrel+(int)uiJpos>(int)uiJmax-1) ADRESSEXPENSE(4,1,0,0,1,0)
if (muiKrel+(int)uiKpos<0) ADRESSEXPENSE(2,1,0,0,1,0)
if (muiKrel+(int)uiKpos>(int)uiKmax-1) ADRESSEXPENSE(4,1,0,0,1,0)
#endif
if (muiIrel+(int)uiIpos<0) muiIrel=-2*uiIpos-muiIrel-uiTypeOffset;
if (muiIrel+(int)uiIpos>(int)uiImax-1) muiIrel=2*(uiImax-1-uiIpos)-muiIrel+uiTypeOffset;
if (muiJrel+(int)uiJpos<0) muiJrel=-2*uiJpos-muiJrel-uiTypeOffset;
if (muiJrel+(int)uiJpos>(int)uiJmax-1) muiJrel=2*(uiJmax-1-uiJpos)-muiJrel+uiTypeOffset;
if (muiKrel+(int)uiKpos<0) muiKrel=-2*uiKpos-muiKrel-uiTypeOffset;
if (muiKrel+(int)uiKpos>(int)uiKmax-1) muiKrel=2*(uiKmax-1-uiKpos)-muiKrel+uiTypeOffset;
}
if (uiDimension==2)
{
ADRESSEXPENSE(7,1,0,0,0,7)
if ( (muiIrel+uiIpos<uiImax) && (muiJrel+uiJpos<uiJmax) )
return (muiIrel+uiIpos)+(muiJrel+uiJpos)*uiImax;
else error->Error(2);
return 0;
}
else if (uiDimension==3)
{
ADRESSEXPENSE(9,3,0,0,0,11)
if ( (muiIrel+uiIpos<uiImax) && (muiJrel+uiJpos<uiJmax) && (muiKrel+uiKpos<uiKmax) )
return (muiIrel+uiIpos) + (muiJrel+uiJpos)*uiImax + (muiKrel+uiKpos)*uiJmax*uiImax;
else error->Error(2);
return 0;
}
else return 0;
}
unsigned int AdrOp::GetPosFromNode(int ny, unsigned int uiNode)
{
while (ny<0) ny+=uiDimension;
ny=ny%uiDimension;
unsigned int help=uiNode,i=0,j=0,k=0,l=0;
i=help%uiImax;
help=help/uiImax;
j=help%uiJmax;
help=help/uiJmax;
if (uiKmax>0)
{
k=help%uiKmax;
help=help/uiKmax;
l=help;
}
if (!CheckPos(i,j,k,l)) error->Error(8);
ADRESSEXPENSE(0,7,0,0,13,4)
switch (ny)
{
case 0:
{
return i;
break;
}
case 1:
{
return j;
break;
}
case 2:
{
return k;
break;
}
case 3:
{
return l;
break;
}
}
return 0;
}
double AdrOp::GetNodeVolume(unsigned int uiNode)
{
for (unsigned int n=0;n<uiDimension;n++) if (dGrid[n]==NULL) error->Error(9);
double dVol=1;
unsigned int uiMax[4]={uiImax,uiJmax,uiKmax,uiLmax};
unsigned int uiPos[4]={GetPosFromNode(0,uiNode),GetPosFromNode(1,uiNode),GetPosFromNode(2,uiNode),GetPosFromNode(3,uiNode)};
for (unsigned int n=0;n<uiDimension;n++)
{
if ((uiPos[n]>0) && (uiPos[n]<uiMax[n]-1)) { dVol*=0.5*dDeltaUnit*(dGrid[n][uiPos[n]+1]-dGrid[n][uiPos[n]-1]); ADRESSEXPENSE(4,0,1,3,0,4) }
else if ((uiPos[n]==0) && (uiPos[n]<uiMax[n]-1)) { dVol*=dDeltaUnit*(dGrid[n][uiPos[n]+1]-dGrid[n][uiPos[n]]); ADRESSEXPENSE(3,0,1,2,0,4) }
else if ((uiPos[n]>0) && (uiPos[n]==uiMax[n]-1)) { dVol*=dDeltaUnit*(dGrid[n][uiPos[n]]-dGrid[n][uiPos[n]-1]); ADRESSEXPENSE(3,0,1,2,0,4) }
}
return dVol;
}
double AdrOp::GetIndexWidth(int ny, int index)
{
for (unsigned int n=0;n<uiDimension;n++) if (dGrid[n]==NULL) error->Error(9);
double width=0;
while (ny<0) ny+=uiDimension;
ny=ny%uiDimension;
unsigned int uiMax[4]={uiImax,uiJmax,uiKmax,uiLmax};
if ((index>0) && (index<(int)uiMax[ny]-1)) width= (dGrid[ny][index+1]-dGrid[ny][index-1])/2*dDeltaUnit;
else if ((index==0) && (index<(int)uiMax[ny]-1)) width=(dGrid[ny][index+1]-dGrid[ny][index])*dDeltaUnit;
else if ((index>0) && (index==(int)uiMax[ny]-1)) width=(dGrid[ny][index]-dGrid[ny][index-1])*dDeltaUnit;
else width= 0;
return width;
}
double AdrOp::GetIndexCoord(int ny, int index)
{
for (unsigned int n=0;n<uiDimension;n++) if (dGrid[n]==NULL) error->Error(9);
while (ny<0) ny+=uiDimension;
ny=ny%uiDimension;
unsigned int uiMax[4]={uiImax,uiJmax,uiKmax,uiLmax};
if (index<0) index=0;
if (index>=(int)uiMax[ny]) index=uiMax[ny]-1;
return dGrid[ny][index]*dDeltaUnit;
}
double AdrOp::GetIndexDelta(int ny, int index)
{
if (index<0) return GetIndexCoord(ny, 0) - GetIndexCoord(ny, 1);
unsigned int uiMax[4]={uiImax,uiJmax,uiKmax,uiLmax};
if (index>=(int)uiMax[ny]-1) return GetIndexCoord(ny, (int)uiMax[ny]-2) - GetIndexCoord(ny, (int)uiMax[ny]-1);
return GetIndexCoord(ny, index+1) - GetIndexCoord(ny, index);
}
unsigned int AdrOp::Shift(int ny, int step)
{
if (bPosSet==false) error->Error(6);
while (ny<0) ny+=uiDimension;
ny=ny%uiDimension;
switch (ny)
{
case 0:
{
iIshift=step;
// if ((int)uiIpos+step<0) iIshift=-2*uiIpos-iIshift;
// else if ((int)uiIpos+step>=(int)uiImax) iIshift=-1*iIshift+2*(uiImax-1-uiIpos);
break;
}
case 1:
{
iJshift=step;
// if ((int)uiJpos+iJshift<0) iJshift=-2*uiJpos-iJshift;
// else if ((int)uiJpos+iJshift>=(int)uiJmax) iJshift=-1*iJshift+2*(uiJmax-1-uiJpos);
break;
}
case 2:
{
iKshift=step;
// if ((int)uiKpos+iKshift<0) iKshift=-2*uiKpos-iKshift;
// else if ((int)uiKpos+iKshift>=(int)uiKmax) iKshift=-1*iKshift+2*(uiKmax-1-uiKpos);
break;
}
}
ADRESSEXPENSE(1,1,0,0,2,3)
return GetPos(iIshift,iJshift,iKshift);
}
bool AdrOp::CheckShift(int ny, int step)
{
while (ny<0) ny+=uiDimension;
ny=ny%uiDimension;
int shift[3]={0,0,0};
shift[ny]=step;
if (this->CheckPos(uiIpos+shift[0],uiJpos+shift[1],uiKpos+shift[2]))
{
this->Shift(ny,step);
return true;
}
else return false;
}
unsigned int AdrOp::GetShiftedPos()
{
return GetPos(iIshift,iJshift,iKshift);
}
void AdrOp::ResetShift()
{
iIshift=iJshift=iKshift=0;
}
unsigned int AdrOp::Iterate(int jump)
{
if (abs(jump)>=(int)uiImax) error->Error(4);
i=uiIpos+jump;
if (i>=uiImax)
{
i=i-uiImax;
j=uiJpos+1;
if (j>=uiJmax)
{
j=0;
if (uiDimension==3)
{
k=uiKpos+1;
if (k>=uiKmax) k=0;
uiKpos=k;
}
}
uiIpos=i;
uiJpos=j;
return GetPos();
}
else
{
uiIpos=i;
return GetPos();
}
}
unsigned int AdrOp::GetSize()
{
return uiSize;
}
void AdrOp::SetReflection2Node()
{
reflect=true;
uiTypeOffset=0;
}
void AdrOp::SetReflection2Cell()
{
reflect=true;
uiTypeOffset=1;
}
void AdrOp::SetReflectionOff()
{
reflect=false;
}
AdrOp* AdrOp::AddCellAdrOp()
{
if (clCellAdr!=NULL) return clCellAdr;
if (uiDimension==3) clCellAdr = new AdrOp(uiImax-1,uiJmax-1,uiKmax-1);
else if (uiDimension==2) clCellAdr = new AdrOp(uiImax-1,uiJmax-1);
else clCellAdr=NULL;
if (clCellAdr!=NULL)
{
clCellAdr->SetPos(0,0,0);
clCellAdr->SetReflection2Cell();
}
iCellShift[0]=iCellShift[1]=iCellShift[2]=0;
return clCellAdr;
}
AdrOp* AdrOp::DeleteCellAdrOp()
{
delete clCellAdr; clCellAdr=NULL;
return NULL;
}
unsigned int AdrOp::ShiftCell(int ny, int step)
{
if (clCellAdr==NULL) error->Error(7);
while (ny<0) ny+=uiDimension;
ny=ny%uiDimension;
iCellShift[ny]=step;
ADRESSEXPENSE(3,1,0,0,1,2)
return clCellAdr->GetPos(uiIpos+iCellShift[0],uiJpos+iCellShift[1],uiKpos+iCellShift[2]);
}
bool AdrOp::ShiftCellCheck(int ny, int step)
{
return clCellAdr->CheckShift(ny,step);
}
void AdrOp::ResetCellShift()
{
if (clCellAdr==NULL) error->Error(7);
iCellShift[0]=iCellShift[1]=iCellShift[2]=0;
}
unsigned int AdrOp::GetCellPos(bool incShift)
{
if (bPosSet==false) error->Error(6);
if (clCellAdr==NULL) error->Error(7);
#if EXPENSE_LOG==1
if (incShift) ADRESSEXPENSE(3,0,0,0,0,2)
#endif
if (incShift) return clCellAdr->GetPos(uiIpos+iCellShift[0],uiJpos+iCellShift[1],uiKpos+iCellShift[2]);
else return clCellAdr->GetPos(uiIpos,uiJpos,uiKpos);
}
unsigned int AdrOp::GetCellPos(int i, int j, int k)
{
if (bPosSet==false) error->Error(6);
return clCellAdr->GetPos(uiIpos+i,uiJpos+j,uiKpos+k);
}
double AdrOp::GetShiftCellVolume(int ny, int step)
{
for (unsigned int n=0;n<uiDimension;n++) if (dGrid[n]==NULL) error->Error(9);
int uiMax[4]={uiImax-1,uiJmax-1,uiKmax-1,uiLmax-1};
while (ny<0) ny+=uiDimension;
ny=ny%uiDimension;
iCellShift[ny]=step;
int uiPos[4]={uiIpos+iCellShift[0],uiJpos+iCellShift[1],uiKpos+iCellShift[2]};
double dVol=1;
for (unsigned int n=0;n<uiDimension;++n)
{
if (uiMax[n]>0)
{
while ((uiPos[n]<0) || (uiPos[n]>=uiMax[n]))
{
if (uiPos[n]<0) uiPos[n]=-1*uiPos[n]-1;
else if (uiPos[n]>=uiMax[n]) uiPos[n]=uiMax[n]-(uiPos[n]-uiMax[n]+1);
}
dVol*=(dGrid[n][uiPos[n]+1]-dGrid[n][uiPos[n]])*dDeltaUnit;
}
}
return dVol;
}
deltaAdrOp::deltaAdrOp(unsigned int max)
{
uiMax=max;
}
deltaAdrOp::~deltaAdrOp()
{
}
void deltaAdrOp::SetMax(unsigned int max)
{
uiMax=max;
}
unsigned int deltaAdrOp::GetAdr(int pos)
{
if (uiMax==1) return 0;
if (pos<0) pos=pos*-1;
else if (pos>(int)uiMax-1) pos=2*(uiMax-1)-pos+1;
if ((pos<0) || (pos>(int)uiMax-1)) {fprintf(stderr," Error exiting... "); getchar(); exit(-1);}
return pos;
}

133
tools/AdrOp.h Normal file
View File

@ -0,0 +1,133 @@
/*!
\class AdrOp
\author Thorsten Liebig
\version $Revision: 1.10 $
\date $Date: 2006/10/29 18:50:44 $
*/
#ifndef ADROP_H
#define ADROP_H
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include "ExpenseLog.h"
#include "ErrorMsg.h"
using namespace std;
class AdrOp{
public:
///Constructor, define dimension/size here
AdrOp(unsigned int muiImax, unsigned int muiYmax, unsigned int muiKmax=0, unsigned int muiLmax=0);
///Copy-Constructor
AdrOp(AdrOp* origOP);
///Deconstructor
virtual ~AdrOp();
///Set the current n-dim position, get 1-dim array position as return value
/*!A position has to be set or all other methodes will case error! \n The methode will exit with error message if invalid position is set! \sa ErrorMsg */
unsigned int SetPos(unsigned int muiIpos, unsigned int muiJpos, unsigned int muiKpos=0, unsigned int muiLpos=0);
bool SetPosChecked(unsigned int muiIpos, unsigned int muiJpos, unsigned int muiKpos=0, unsigned int muiLpos=0);
void SetGrid(double *gridI,double *gridJ,double *gridK=NULL,double *gridL=NULL);
void SetGridDelta(double delta) {this->dDeltaUnit=delta;};
bool CheckPos(unsigned int muiIpos, unsigned int muiJpos, unsigned int muiKpos=0, unsigned int muiLpos=0);
bool CheckRelativePos(int muiIrel=0,int muiJrel=0,int muiKrel=0, int muiLrel=0);
///will return current 1-dim position, in addition to a relative n-dim shift
/*!In case of crossing the boundaries, activate reflection or an error will be invoked\sa SetReflection2Node \sa SetReflection2Cell \sa SetReflectionOff */
unsigned int GetPos(int muiIrel=0,int muiJrel=0,int muiKrel=0, int muiLrel=0);
double GetNodeVolume(unsigned int uiNode);
double GetIndexWidth(int ny, int index);
double GetIndexCoord(int ny, int index);
///Get the gird delta at the given index of direction ny. (if index<0 return negative value as index=0 would give, if index>=max-1 returns negative value as index=max-2 would give)
double GetIndexDelta(int ny, int index);
// double GetCellVolume(unsigned int uiCell);
unsigned int GetPosFromNode(int ny, unsigned int uiNode);
///Set a shift in ny direction (e.g. 0 for i-direction)
/*!Shift set by this methode will be ignored by methode GetPos*/
unsigned int Shift(int ny, int step);
///Set a checked shift in ny direction (e.g. 0 for i-direction)
/*!Shift set by this methode will be ignored by methode GetPos*/
bool CheckShift(int ny, int step);
///Returns the current 1-dim position including shift by methode "Shift"
unsigned int GetShiftedPos();
///Reset shift set by "Shift"-methode
void ResetShift();
///Iterates through AdrOp; --- obsolete ---
unsigned int Iterate(int jump=1);
///Retruns size of array
unsigned int GetSize();
///Set mode to reflect by node
/*!1D-example (6 nodes): \image html node_reflect.PNG order: 0,1,2,3,4,5,4,3,...*/
void SetReflection2Node();
///Set mode to reflect by cell
/*!1D-example (5 cells): \image html cell_reflect.PNG order: 0,1,2,3,4,4,3,...*/
void SetReflection2Cell();
///Deactivate reflection (default)
void SetReflectionOff();
///Add a cell adress operator (dimensions: i-1 j-1 k-1 l-1)
/*!\image html cells_nodes.png */
AdrOp* AddCellAdrOp();
AdrOp* GetCellAdrOp() {return clCellAdr;};
///Deconstructed cell adress operator if no longer needed
AdrOp* DeleteCellAdrOp();
///Shift cell in ny dircetion; cell reflection is active
unsigned int ShiftCell(int ny, int step);
///Shift cell in ny dircetion; cell reflection is active; return check
bool ShiftCellCheck(int ny, int step);
///Reset cell shift
void ResetCellShift();
///Get current cell position from cell adress operator
unsigned int GetCellPos(bool incShift=true);
///Get cell position from cell adress operator
unsigned int GetCellPos(int i, int j, int k=0);
//get volume of cell; incl shift
double GetShiftCellVolume(int ny, int step);
void SetDebugOn() {this->bDebug=true;};
void SetDebugOff() {this->bDebug=false;};
protected:
AdrOp *clCellAdr;
unsigned int uiDimension;
unsigned int uiSize;
unsigned int uiImax,uiJmax,uiKmax,uiLmax;
unsigned int uiIpos, uiJpos, uiKpos, uiLpos;
double *dGrid[4];
double dDeltaUnit;
int iIshift, iJshift, iKshift;
int iCellShift[3];
unsigned int i,j,k,l;
bool reflect;
unsigned int uiTypeOffset;
bool bPosSet;
bool bDebug;
ErrorMsg *error;
};
class deltaAdrOp
{
public:
deltaAdrOp(unsigned int max=0);
virtual ~deltaAdrOp();
void SetMax(unsigned int max);
unsigned int GetAdr(int pos);
protected:
unsigned int uiMax;
};
#endif // ADROP_H

66
tools/ErrorMsg.cpp Normal file
View File

@ -0,0 +1,66 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ErrorMsg.h"
ErrorMsg::ErrorMsg(unsigned int NoMessage)
{
NoMsg=NoMessage;
if (NoMsg>0) Msg = new char*[NoMsg]; if (Msg==NULL) { fprintf(stderr,"Memory allocation failed!! exiting... \0"); exit(1); }
for (unsigned int i=0;i<NoMsg;i++) Msg[i]=NULL;
}
ErrorMsg::~ErrorMsg()
{
for (unsigned int i=0;i<NoMsg;i++) {delete[] Msg[i]; Msg[i]=NULL;};
delete[] Msg; Msg=NULL;
}
void ErrorMsg::SetMsg(unsigned int nr, char *Message)
{
if ((nr<1) || (nr>NoMsg) || (Message==NULL)) ownError();
Msg[nr-1] = new char[strlen(Message)+1]; if (Msg[nr-1]==NULL) { fprintf(stderr,"Memory allocation failed!! exiting... \0"); exit(1); }
Msg[nr-1]=strcpy(Msg[nr-1],Message);
}
void ErrorMsg::Error(unsigned int nr,char *chAddMsg)
{
if ((nr>0) && (nr<=NoMsg))
{
if (Msg[nr-1]!=NULL) fprintf(stderr,"%s",Msg[nr-1]);
else fprintf(stderr,"unkown error occured!! Error code: %d exiting...",nr);
if (chAddMsg!=NULL) fprintf(stderr,"%s",chAddMsg);
getchar();
exit(nr);
}
else
{
fprintf(stderr,"unkown error occured!! Error code: %d exiting...",nr);
getchar();
exit(nr);
}
}
void ErrorMsg::Error(unsigned int nr,int addNr)
{
if ((nr>0) && (nr<=NoMsg))
{
if (Msg[nr-1]!=NULL) fprintf(stderr,"%s",Msg[nr-1]);
else fprintf(stderr,"unkown error occured!! Error code: %d exiting...",nr);
fprintf(stderr,"%d",addNr);
getchar();
exit(nr);
}
else
{
fprintf(stderr,"unkown error occured!! Error code: %d exiting...",nr);
getchar();
exit(nr);
}
}
void ErrorMsg::ownError(void)
{
fprintf(stdout," Error occured by using Error Message class!! ... exiting...");
exit(-1);
}

33
tools/ErrorMsg.h Normal file
View File

@ -0,0 +1,33 @@
/*!
\class ErrorMsg
\author Thorsten Liebig
\version $Revision: 1.2 $
\date $Date: 2006/01/25 11:47:07 $
*/
#ifndef _ERRORMSG_H_
#define _ERRORMSG_H_
class ErrorMsg
{
public:
///Constructor defines number of error messages
ErrorMsg(unsigned int NoMessage=0);
///Deconstructor
virtual ~ErrorMsg();
///Methode for defining error messages
/*! \param nr Number of defining error message \param *Message Set error message string \sa Error */
void SetMsg(unsigned int nr, char *Message);
///Call an error message. Will exit the program!
/*! \param nr Number of called error message. default is 0 \sa SetMsg*/
void Error(unsigned int nr=0,char *chAddMsg=0);
void Error(unsigned int nr,int addNr);
protected:
void ownError(void);
unsigned int NoMsg;
char **Msg;
};
#endif //_ERRORMSG_H_

141
tools/ExpenseLog.cpp Normal file
View File

@ -0,0 +1,141 @@
#include "ExpenseLog.h"
ExpenseModule::ExpenseModule(const char* moduleName)
{
chModuleName=moduleName;
uiDoubleAdditions=uiDoubleMultiplications=uiIntAdditions=uiIntMultiplications=uiAssignments=uiBoolOp=0;
uiMrdDA=uiMrdDM=uiMrdIA=uiMrdIM=uiMrdAssign=uiMrdBO=0;
}
ExpenseModule::~ExpenseModule() {};
void ExpenseModule::Clear()
{
uiDoubleAdditions=uiDoubleMultiplications=uiIntAdditions=uiIntMultiplications=uiAssignments=uiBoolOp=0;
uiMrdDA=uiMrdDM=uiMrdIA=uiMrdIM=uiMrdAssign=uiMrdBO=0;
}
void ExpenseModule::AddDoubleAdditons(unsigned int number)
{
uiDoubleAdditions+=number;
if (uiDoubleAdditions>=MRD)
{
uiDoubleAdditions-=MRD;
++uiMrdDA;
}
}
void ExpenseModule::AddDoubleMultiplications(unsigned int number)
{
uiDoubleMultiplications+=number;
if (uiDoubleMultiplications>=MRD)
{
uiDoubleMultiplications-=MRD;
++uiMrdDM;
}
}
void ExpenseModule::AddIntAdditons(unsigned int number)
{
uiIntAdditions+=number;
if (uiIntAdditions>=MRD)
{
uiIntAdditions-=MRD;
++uiMrdIA;
}
}
void ExpenseModule::AddIntMultiplications(unsigned int number)
{
uiIntMultiplications+=number;
if (uiIntMultiplications>=MRD)
{
uiIntMultiplications-=MRD;
++uiMrdIM;
}
}
void ExpenseModule::AddAssignments(unsigned int number)
{
uiAssignments+=number;
if (uiAssignments>=MRD)
{
uiAssignments-=MRD;
++uiMrdAssign;
}
}
void ExpenseModule::AddBoolOperations(unsigned int number)
{
uiBoolOp+=number;
if (uiBoolOp>=MRD)
{
uiBoolOp-=MRD;
++uiMrdBO;
}
}
void ExpenseModule::AddOperations(unsigned int IntAdd, unsigned int IntMul, unsigned int DoubleAdd, unsigned int DoubleMul, unsigned int Assigns, unsigned int BoolOp)
{
this->AddIntAdditons(IntAdd);
this->AddIntMultiplications(IntMul);
this->AddDoubleAdditons(DoubleAdd);
this->AddDoubleMultiplications(DoubleMul);
this->AddAssignments(Assigns);
this->AddBoolOperations(BoolOp);
}
void ExpenseModule::PrintfSelf(FILE* file)
{
fprintf(file,"\n***********\n Module: %s\n Additions:\n Double: %3.0d%9d\tInteger: %3.0d%9d",chModuleName,uiMrdDA,uiDoubleAdditions,uiMrdIA,uiIntAdditions);
fprintf(file,"\n\n Multiplications:\n Double: %3.0d%9d\tInteger: %3.0d%9d\n",uiMrdDM,uiDoubleMultiplications,uiMrdIM,uiIntMultiplications);
fprintf(file,"\n Assignments: %3.0d%9d\tBool Operations: %3.0d%9d\n",uiMrdAssign,uiAssignments,uiMrdBO,uiBoolOp);
fprintf(file,"\n***********\n");
}
/***********************************************************************************************************************/
ExpenseLog::ExpenseLog(void)
{
}
ExpenseLog::~ExpenseLog(void)
{
for (size_t i=0;i<vModules.size();++i) {delete vModules.at(i); vModules.at(i)=NULL;}
vModules.clear();
}
ExpenseModule* ExpenseLog::AddModule(const char* name)
{
ExpenseModule* newModule = new ExpenseModule(name);
vModules.push_back(newModule);
return newModule;
}
void ExpenseLog::PrintAll(FILE *file)
{
double totalAdd=0,totalMul=0,totalBool=0,totalAssign=0;
fprintf(stderr,"\n ----------------\n Expense Log PrintOut\n Nr of Modules: %d\n",vModules.size());
for (size_t i=0;i<vModules.size();++i)
{
totalAdd+=((double)vModules.at(i)->uiIntAdditions+(double)vModules.at(i)->uiDoubleAdditions) + 1e9*((double)vModules.at(i)->uiMrdIA+(double)vModules.at(i)->uiMrdIA);
totalMul+=((double)vModules.at(i)->uiIntMultiplications+(double)vModules.at(i)->uiDoubleMultiplications) + 1e9*(double)(vModules.at(i)->uiMrdIM+vModules.at(i)->uiMrdIM);
totalBool+=(double)vModules.at(i)->uiBoolOp + 1e9*(double)vModules.at(i)->uiMrdBO;
totalAssign+=(double)vModules.at(i)->uiAssignments + 1e9*(double)vModules.at(i)->uiMrdAssign;
vModules.at(i)->PrintfSelf(file);
}
fprintf(stderr," Total:\n Additions: %e Multiplications: %e\n Bool Operations: %e Assignments: %e\n",totalAdd,totalMul,totalBool,totalAssign);
fprintf(stderr,"\n ----------------\n");
}
void ExpenseLog::ClearAll()
{
for (size_t i=0;i<vModules.size();++i)
{
vModules.at(i)->Clear();
}
}

92
tools/ExpenseLog.h Normal file
View File

@ -0,0 +1,92 @@
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;
#define EXPENSE_LOG 0
#define MRD 1000000000
#if EXPENSE_LOG==1
#define EXPENSE_DEFINE \
ExpenseLog EL; \
ExpenseModule* EngineExpense=EL.AddModule("Static Engine Expenses"); \
ExpenseModule* PPExpense=EL.AddModule("Static Post Processing"); \
ExpenseModule* AdrOpExpense=EL.AddModule("Adress Operator");
#define EXTERN_EXPENSE_DEFINE extern ExpenseLog EL;
#define ENGINEEXPENSE_DEFINE extern ExpenseModule* EngineExpense;
#define POSTPROCEXPENSE_DEFINE extern ExpenseModule* PPExpense;
#define ADREXPENSE_DEFINE extern ExpenseModule* AdrOpExpense;
#define ENGINEEXPENSE(IA,IM,DA,DM,AS,BO) EngineExpense->AddOperations((IA),(IM),(DA),(DM),(AS),(BO));
#define POSTPROCEXPENSE(IA,IM,DA,DM,AS,BO) PPExpense->AddOperations((IA),(IM),(DA),(DM),(AS),(BO));
#define ADRESSEXPENSE(IA,IM,DA,DM,AS,BO) AdrOpExpense->AddOperations((IA),(IM),(DA),(DM),(AS),(BO));
#define EXPENSEPRINT EL.PrintAll(stderr);
#define EXPENSECLEAR EL.ClearAll();
#else
#define EXPENSE_DEFINE
#define EXTERN_EXPENSE_DEFINE
#define ENGINEEXPENSE_DEFINE
#define POSTPROCEXPENSE_DEFINE
#define ADREXPENSE_DEFINE
#define ENGINEEXPENSE(IA,IM,DA,DM,AS,BO)
#define POSTPROCEXPENSE(IA,IM,DA,DM,AS,BO)
#define ADRESSEXPENSE(IA,IM,DA,DM,AS,BO)
#define EXPENSEPRINT
#define EXPENSECLEAR
#endif
class ExpenseModule
{
friend class ExpenseLog;
public:
ExpenseModule(const char* moduleName);
~ExpenseModule();
void Clear();
void AddDoubleAdditons(unsigned int number);
void AddDoubleMultiplications(unsigned int number);
void AddIntAdditons(unsigned int number);
void AddIntMultiplications(unsigned int number);
void AddAssignments(unsigned int number);
void AddBoolOperations(unsigned int number);
void AddOperations(unsigned int IntAdd, unsigned int IntMul, unsigned int DoubleAdd, unsigned int DoubleMul, unsigned int Assigns, unsigned int BoolOp);
void PrintfSelf(FILE* file=stdout);
protected:
const char* chModuleName;
unsigned int uiDoubleAdditions;
unsigned int uiDoubleMultiplications;
unsigned int uiIntAdditions;
unsigned int uiIntMultiplications;
unsigned int uiAssignments;
unsigned int uiBoolOp;
unsigned int uiMrdDA;
unsigned int uiMrdDM;
unsigned int uiMrdIA;
unsigned int uiMrdIM;
unsigned int uiMrdAssign;
unsigned int uiMrdBO;
};
class ExpenseLog
{
public:
ExpenseLog(void);
~ExpenseLog(void);
ExpenseModule* AddModule(const char* name);
void PrintAll(FILE *file=stdout);
void ClearAll();
protected:
vector<ExpenseModule*> vModules;
};

7
tools/constants.h Normal file
View File

@ -0,0 +1,7 @@
#ifndef CONSTANTS_H
#define CONSTANTS_H
#define __EPS0__ 8.85418781762e-12
#define __MUE0__ 1.256637062e-6
#endif // CONSTANTS_H