openEMS/tools/sar_calculation.h

120 lines
4.0 KiB
C++

/*
* Copyright (C) 2012 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 SAR_CALCULATION_H
#define SAR_CALCULATION_H
#include <complex>
class SAR_Calculation
{
public:
SAR_Calculation();
enum SARAveragingMethod { IEEE_C95_3, IEEE_62704, SIMPLE};
//! Reset and initialize all values (will keep all SAR settings)
void Reset();
//! Set the debug level
void SetDebugLevel(int level) {m_DebugLevel=level;}
//! Set the used averaging method
void SetAveragingMethod(SARAveragingMethod method);
//! Set number of lines in all direcitions. (mandatory information)
void SetNumLines(unsigned int numLines[3]);
//! Set cell width in all direcitions. (mandatory information for averaging)
void SetCellWidth(float* cellWidth[3]);
//! Set the averaging mash. (mandatory information for averaging)
void SetAveragingMass(float mass) {m_avg_mass=mass;}
//! Set the cell volumes (optional for speedup)
void SetCellVolumes(float*** cell_volume) {m_cell_volume=cell_volume;}
//! Set the cell densities (mandatory information)
void SetCellDensities(float*** cell_density) {m_cell_density=cell_density;}
//! Set the cell conductivities (mandatory if no current density field is given)
void SetCellCondictivity(float*** cell_conductivity) {m_cell_conductivity=cell_conductivity;}
//! Set the electric field (mandatory information)
void SetEField(std::complex<float>**** field) {m_E_field=field;}
//! Set the current density field (mandatory if no conductivity distribution is given)
void SetJField(std::complex<float>**** field) {m_J_field=field;}
//! Calculate the SAR, requires a preallocated 3D array
float*** CalcSAR(float*** SAR);
//! Calculate the total power dumped
double CalcSARPower();
protected:
unsigned int m_numLines[3];
float* m_cellWidth[3];
float m_avg_mass;
float*** m_cell_volume;
float*** m_cell_density;
float*** m_cell_conductivity;
std::complex<float>**** m_E_field;
std::complex<float>**** m_J_field;
bool*** m_Vx_Used;
bool*** m_Vx_Valid;
unsigned int m_Valid;
unsigned int m_Used;
unsigned int m_Unused;
unsigned int m_AirVoxel;
int m_DebugLevel;
/*********** SAR calculation parameter and settings ***********/
float m_massTolerance;
unsigned int m_maxMassIterations;
float m_maxBGRatio;
bool m_markPartialAsUsed;
float m_UnusedRelativeVolLimit;
bool m_IgnoreFaceValid;
/*********** SAR calculations methods ********/
double CalcLocalPowerDensity(unsigned int pos[3]);
//! Calculate the local SAR
float*** CalcLocalSAR(float*** SAR);
/****** start SAR averaging and all necessary methods ********/
//! Calculate the averaged SAR
float*** CalcAveragedSAR(float*** SAR);
int FindFittingCubicalMass(unsigned int pos[3], float box_size, unsigned int start[3], unsigned int stop[3],
float partial_start[3], float partial_stop[3], float &mass, float &volume, float &bg_ratio, int disabledFace=-1, bool ignoreFaceValid=false);
bool GetCubicalMass(unsigned int pos[3], float box_size, unsigned int start[3], unsigned int stop[3],
float partial_start[3], float partial_stop[3], float &mass, float &volume, float &bg_ratio, int disabledFace=-1);
float CalcCubicalSAR(float*** SAR, unsigned int pos[3], unsigned int start[3], unsigned int stop[3], float partial_start[3], float partial_stop[3], bool assignUsed=false);
/****** end SAR averaging and all necessary methods ********/
bool CheckValid();
float CellVolume(unsigned int pos[3]);
float CellMass(unsigned int pos[3]);
};
#endif // SAR_CALCULATION_H