summaryrefslogtreecommitdiff
path: root/openEMS/tools/AdrOp.h
blob: e4a690bbf1b92a6562f77b255a496d87d9399ba1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*
*	Copyright (C) 2010 Thorsten Liebig (Thorsten.Liebig@gmx.de)
*
*	This program is free software: you can redistribute it and/or modify
*	it under the terms of the GNU General Public License as published by
*	the Free Software Foundation, either version 3 of the License, or
*	(at your option) any later version.
*
*	This program is distributed in the hope that it will be useful,
*	but WITHOUT ANY WARRANTY; without even the implied warranty of
*	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*	GNU General Public License for more details.
*
*	You should have received a copy of the GNU General Public License
*	along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

/*!
\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"

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" + additional (transitory) shift
	unsigned int GetShiftedPos(int ny=-1, int step=0);
	///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