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
|