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 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
|
/*
* 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/>.
*/
#ifndef OPERATOR_BASE_H
#define OPERATOR_BASE_H
#include "ContinuousStructure.h"
#include "tools/global.h"
#include "Common/processing.h"
#include "string"
typedef struct
{
std::vector<unsigned int> posPath[3];
std::vector<unsigned short> dir;
} Grid_Path;
//! Abstract base-class for a common operator
class Operator_Base
{
public:
virtual ~Operator_Base();
virtual bool SetGeometryCSX(ContinuousStructure* geo);
virtual ContinuousStructure* GetGeometryCSX() const {return CSX;}
//! Get the timestep used by this operator
virtual double GetTimestep() const {return dT;}
//! Get the number of cells or nodes defined by this operator
virtual double GetNumberCells() const =0;
//! Get the number of timesteps satisfying the nyquist condition (may depend on the excitation)
virtual unsigned int GetNumberOfNyquistTimesteps() const =0;
//! Returns the number of lines as needed for post-processing etc.
virtual unsigned int GetNumberOfLines(int ny, bool full=false) const =0;
//! Get the name for the given direction: 0 -> x, 1 -> y, 2 -> z
virtual std::string GetDirName(int ny) const;
//! Get the grid drawing unit in m
virtual double GetGridDelta() const =0;
//! Get the disc line in \a n direction (in drawing units)
virtual double GetDiscLine(int n, unsigned int pos, bool dualMesh=false) const =0;
//! Get the disc line delta in \a n direction (in drawing units)
virtual double GetDiscDelta(int n, unsigned int pos, bool dualMesh=false) const =0;
//! Get the node width for a given direction \a n and a given mesh position \a pos
virtual double GetNodeWidth(int ny, const unsigned int pos[3], bool dualMesh = false) const =0;
//! Get the node area for a given direction \a n and a given mesh position \a pos
virtual double GetNodeArea(int ny, const unsigned int pos[3], bool dualMesh = false) const =0;
//! Get the length of an FDTD edge (unit is meter).
virtual double GetEdgeLength(int ny, const unsigned int pos[3], bool dualMesh = false) const =0;
//! Get the area around an edge for a given direction \a n and a given mesh posisition \a pos
/*!
This will return the area around an edge with a given direction, measured at the middle of the edge.
In a cartesian mesh this is equal to the NodeArea, may be different in other coordinate systems.
*/
virtual double GetEdgeArea(int ny, const unsigned int pos[3], bool dualMesh = false) const =0;
//! Get the volume of an FDTD cell
virtual double GetCellVolume(const unsigned int pos[3], bool dualMesh = false) const =0;
//! Snap the given coodinates to mesh indices, return box dimension
virtual bool SnapToMesh(const double* coord, unsigned int* uicoord, bool dualMesh=false, bool fullMesh=false, bool* inside=NULL) const =0;
//! Snap a given box to the operator mesh, uiStart will be always <= uiStop
/*!
\param[in] start the box-start coorindate
\param[in] stop the box-stopt coorindate
\param[out] uiStart the snapped box-start coorindate index
\param[out] uiStop the snapped box-stop coorindate index
\param[in] dualMesh snap to main or dual mesh (default is main mesh)
\param[in] SnapMethod Snapping method, 0=snap to closest line, 1/(2)=snap such that given box is inside (outside) the snapped lines
\return returns the box dimension or -1 if box is not inside the simulation domain
*/
virtual int SnapBox2Mesh(const double* start, const double* stop, unsigned int* uiStart, unsigned int* uiStop, bool dualMesh=false, bool fullMesh=false, int SnapMethod=0, bool* bStartIn=NULL, bool* bStopIn=NULL) const =0;
//! Set the boundary conditions
virtual void SetBoundaryCondition(int* BCs) {for (int n=0; n<6; ++n) m_BC[n]=BCs[n];}
//! Set flags to store material data for post-processing
virtual void SetMaterialStoreFlags(int type, bool val);
//! Check storage flags and cleanup
virtual void CleanupMaterialStorage() = 0;
//! Get stored discrete material (if storage is enabled).
virtual double GetDiscMaterial(int type, int ny, const unsigned int pos[3]) const = 0;
//! Get the cell center coordinate usable for material averaging (Warning, may not be the yee cell center)
bool GetCellCenterMaterialAvgCoord(const unsigned int pos[3], double coord[3]) const;
//! Get the cell center coordinate usable for material averaging (Warning, may not be the yee cell center)
virtual bool GetCellCenterMaterialAvgCoord(const int pos[3], double coord[3]) const = 0;
virtual std::vector<CSPrimitives*> GetPrimitivesBoundBox(int posX, int posY, int posZ, CSProperties::PropertyType type=CSProperties::ANY) const = 0;
//! Set the background material (default is vacuum)
virtual void SetBackgroundMaterial(double epsR=0, double mueR=0, double kappa=0, double sigma=0, double density=0);
//! Get background rel. electric permittivity
double GetBackgroundEpsR() const {return m_BG_epsR;}
//! Set background rel. electric permittivity
void SetBackgroundEpsR(double val);
//! Get background rel. magnetic permeability
double GetBackgroundMueR() const {return m_BG_mueR;}
//! Set background rel. magnetic permeability
void SetBackgroundMueR(double val);
//! Get background electric conductivity
double GetBackgroundKappa() const {return m_BG_kappa;}
//! Set background electric conductivity
void SetBackgroundKappa(double val);
//! Get background magnetic conductivity (artificial)
double GetBackgroundSigma() const {return m_BG_sigma;}
//! Set background magnetic conductivity (artificial)
void SetBackgroundSigma(double val);
//! Get background mass density
double GetBackgroundDensity() const {return m_BG_density;}
//! Set background mass density
void SetBackgroundDensity(double val);
protected:
Operator_Base();
ContinuousStructure* CSX;
virtual void Init();
//! Cleanup data and reset
void Delete();
virtual void Reset();
//! boundary conditions
int m_BC[6];
//! The operator timestep
double dT;
//! bool flag array to store material data for post-processing
bool m_StoreMaterial[4];
//! background materials
double m_BG_epsR;
double m_BG_mueR;
double m_BG_kappa;
double m_BG_sigma;
double m_BG_density;
CoordinateSystem m_MeshType;
unsigned int numLines[3];
double* discLines[3];
double gridDelta;
};
#endif // OPERATOR_BASE_H
|