⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 radarfdtd.h

📁 fdtd3 C++.rar 3维电磁散射通用程序
💻 H
字号:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <float.h>
#include <time.h> 

/* Define the precision */
#define PRECISION double

#define VERSION_INFO "RadarFDTD Version 6.0 by Carsten Aulbert (Carsten.Aulbert@gmx.net)"
/* Define some common acronyms for the materialConstants array */
#define DTMUDX 0
#define DTEPSDX 1
#define DTMUDY 2
#define DTEPSDY 3
#define DTMUDZ 4
#define DTEPSDZ 5
#define DTSIGEPS 6
#define EPSILON 7
#define SIGMA 8

/* define pi if not defined */
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif

/* under which number a value is considered zero */
#define LIMIT 1e-50

/* Now there are some physical constants, don't fiddle around with them too mucyh ;) */
#define LIGHT_SPEED 299792458.0
#define LIGHT_SPEED_SQUARED 89875517873681764.0
#define MU_0 1.2566370614359172953850573533118011536788677597500423283899778369231265625144835994512139301368468271e-6
#define EPSILON_0 8.8541878176203898505365630317107502606083701665994498081024171524053950954599821142852891607182008932e-12

class CradarFDTD
{
private:

	#ifdef DEBUG
		FILE *loggingFile;
	#endif

	/* Usually I do not like global variables, but if I had not chosen to use these, the function prototypes would have been quite long! */

	/* global variables go here */
		
	int i,j,k;                          /* indices of 3D array of cells */
	int nx, ny, nz;                     /* number of cells along axes */
	int posX1, posY1, posX2, posY2;
	PRECISION allocatedBytes;// = 0.0;        /* tracker of how much memory is used */
	int iteration;// = 0;                  /* iteration counter */
	
	PRECISION mytmp;
	PRECISION stimulus;// = 0.0;              /* stimulus value */
	PRECISION currentSimulationTime;// = 0.0; /* current simulation time [s] */
	PRECISION totalSimulationTime;// = 0.0;   /* total simulation time [s] */
	PRECISION omega;                       /* angular frequency for stimulus [radians/second] */
	PRECISION lambda;                      /* wavelength of stimulus [m] */
	PRECISION dx, dy, dz;                  /* space differentials, i.e. size of a cell [m]*/
	PRECISION dt,tmp;                          /* time differential [s] */
	PRECISION ***ex, ***ey, ***ez;         /* pointers to 3D-arrays */
	PRECISION ***hx, ***hy, ***hz;         /* pointers to 3D-arrays */
	
	unsigned short int ***material;        /* layout of material */
	PRECISION **materialConstants;         /* constants for various materials */
	PRECISION tmpout;                      /* tmp output */
	
	long int programStartTime;             /* number of seconds since 01/01/1970*/
	long int tmpTime, tmpTimeRemaining;
	float tmpTimePerStep;
	int tmpRemainingDays,tmpRemainingHours,tmpRemainingMinutes,tmpRemainingSeconds;
	char timeString[1024];
	char addString[1024];
	 
	PRECISION ***pmlEXYBottomYZ, ***pmlEXZBottomYZ; /* pml values */
	PRECISION ***pmlEYXBottomYZ, ***pmlEYZBottomYZ; /* pml values */
	PRECISION ***pmlEZXBottomYZ, ***pmlEZYBottomYZ; /* pml values */
	PRECISION ***pmlHXYBottomYZ, ***pmlHXZBottomYZ; /* pml values */
	PRECISION ***pmlHYXBottomYZ, ***pmlHYZBottomYZ; /* pml values */
	PRECISION ***pmlHZXBottomYZ, ***pmlHZYBottomYZ; /* pml values */
	
	PRECISION ***pmlEXYBottomXY, ***pmlEXZBottomXY; /* pml values */
	PRECISION ***pmlEYXBottomXY, ***pmlEYZBottomXY; /* pml values */
	PRECISION ***pmlEZXBottomXY, ***pmlEZYBottomXY; /* pml values */
	PRECISION ***pmlHXYBottomXY, ***pmlHXZBottomXY; /* pml values */
	PRECISION ***pmlHYXBottomXY, ***pmlHYZBottomXY; /* pml values */
	PRECISION ***pmlHZXBottomXY, ***pmlHZYBottomXY; /* pml values */
	
	PRECISION ***pmlEXYBottomXZ, ***pmlEXZBottomXZ; /* pml values */
	PRECISION ***pmlEYXBottomXZ, ***pmlEYZBottomXZ; /* pml values */
	PRECISION ***pmlEZXBottomXZ, ***pmlEZYBottomXZ; /* pml values */
	PRECISION ***pmlHXYBottomXZ, ***pmlHXZBottomXZ; /* pml values */
	PRECISION ***pmlHYXBottomXZ, ***pmlHYZBottomXZ; /* pml values */
	PRECISION ***pmlHZXBottomXZ, ***pmlHZYBottomXZ; /* pml values */
	
	PRECISION ***pmlEXYTopYZ, ***pmlEXZTopYZ; /* pml values */
	PRECISION ***pmlEYXTopYZ, ***pmlEYZTopYZ; /* pml values */
	PRECISION ***pmlEZXTopYZ, ***pmlEZYTopYZ; /* pml values */
	PRECISION ***pmlHXYTopYZ, ***pmlHXZTopYZ; /* pml values */
	PRECISION ***pmlHYXTopYZ, ***pmlHYZTopYZ; /* pml values */
	PRECISION ***pmlHZXTopYZ, ***pmlHZYTopYZ; /* pml values */
	
	PRECISION ***pmlEXYTopXY, ***pmlEXZTopXY; /* pml values */
	PRECISION ***pmlEYXTopXY, ***pmlEYZTopXY; /* pml values */
	PRECISION ***pmlEZXTopXY, ***pmlEZYTopXY; /* pml values */
	PRECISION ***pmlHXYTopXY, ***pmlHXZTopXY; /* pml values */
	PRECISION ***pmlHYXTopXY, ***pmlHYZTopXY; /* pml values */
	PRECISION ***pmlHZXTopXY, ***pmlHZYTopXY; /* pml values */
	
	PRECISION ***pmlEXYTopXZ, ***pmlEXZTopXZ; /* pml values */
	PRECISION ***pmlEYXTopXZ, ***pmlEYZTopXZ; /* pml values */
	PRECISION ***pmlEZXTopXZ, ***pmlEZYTopXZ; /* pml values */
	PRECISION ***pmlHXYTopXZ, ***pmlHXZTopXZ; /* pml values */
	PRECISION ***pmlHYXTopXZ, ***pmlHYZTopXZ; /* pml values */
	PRECISION ***pmlHZXTopXZ, ***pmlHZYTopXZ; /* pml values */
	
	PRECISION ***pmlComplexEXYBottomYZ, ***pmlComplexEXZBottomYZ; /* pml values */
	PRECISION ***pmlComplexEYXBottomYZ, ***pmlComplexEYZBottomYZ; /* pml values */
	PRECISION ***pmlComplexEZXBottomYZ, ***pmlComplexEZYBottomYZ; /* pml values */
	
	PRECISION ***pmlComplexEXYBottomXY, ***pmlComplexEXZBottomXY; /* pml values */
	PRECISION ***pmlComplexEYXBottomXY, ***pmlComplexEYZBottomXY; /* pml values */
	PRECISION ***pmlComplexEZXBottomXY, ***pmlComplexEZYBottomXY; /* pml values */
	
	PRECISION ***pmlComplexEXYBottomXZ, ***pmlComplexEXZBottomXZ; /* pml values */
	PRECISION ***pmlComplexEYXBottomXZ, ***pmlComplexEYZBottomXZ; /* pml values */
	PRECISION ***pmlComplexEZXBottomXZ, ***pmlComplexEZYBottomXZ; /* pml values */
	
	PRECISION ***pmlComplexEXYTopYZ, ***pmlComplexEXZTopYZ; /* pml values */
	PRECISION ***pmlComplexEYXTopYZ, ***pmlComplexEYZTopYZ; /* pml values */
	PRECISION ***pmlComplexEZXTopYZ, ***pmlComplexEZYTopYZ; /* pml values */
	
	PRECISION ***pmlComplexEXYTopXY, ***pmlComplexEXZTopXY; /* pml values */
	PRECISION ***pmlComplexEYXTopXY, ***pmlComplexEYZTopXY; /* pml values */
	PRECISION ***pmlComplexEZXTopXY, ***pmlComplexEZYTopXY; /* pml values */
	
	PRECISION ***pmlComplexEXYTopXZ, ***pmlComplexEXZTopXZ; /* pml values */
	PRECISION ***pmlComplexEYXTopXZ, ***pmlComplexEYZTopXZ; /* pml values */
	PRECISION ***pmlComplexEZXTopXZ, ***pmlComplexEZYTopXZ; /* pml values */
	
	PRECISION ***pmlSigmaXBottomYZ, ***pmlSigmaXStarBottomYZ;
	PRECISION ***pmlSigmaXBottomXY, ***pmlSigmaXStarBottomXY;
	PRECISION ***pmlSigmaXBottomXZ, ***pmlSigmaXStarBottomXZ;
	PRECISION ***pmlSigmaXTopYZ, ***pmlSigmaXStarTopYZ;
	PRECISION ***pmlSigmaXTopXY, ***pmlSigmaXStarTopXY;
	PRECISION ***pmlSigmaXTopXZ, ***pmlSigmaXStarTopXZ;
	
	PRECISION ***pmlSigmaYBottomYZ, ***pmlSigmaYStarBottomYZ;
	PRECISION ***pmlSigmaYBottomXY, ***pmlSigmaYStarBottomXY;
	PRECISION ***pmlSigmaYBottomXZ, ***pmlSigmaYStarBottomXZ;
	PRECISION ***pmlSigmaYTopYZ, ***pmlSigmaYStarTopYZ;
	PRECISION ***pmlSigmaYTopXY, ***pmlSigmaYStarTopXY;
	PRECISION ***pmlSigmaYTopXZ, ***pmlSigmaYStarTopXZ;
	
	PRECISION ***pmlSigmaZBottomYZ, ***pmlSigmaZStarBottomYZ;
	PRECISION ***pmlSigmaZBottomXY, ***pmlSigmaZStarBottomXY;
	PRECISION ***pmlSigmaZBottomXZ, ***pmlSigmaZStarBottomXZ;
	PRECISION ***pmlSigmaZTopYZ, ***pmlSigmaZStarTopYZ;
	PRECISION ***pmlSigmaZTopXY, ***pmlSigmaZStarTopXY;
	PRECISION ***pmlSigmaZTopXZ, ***pmlSigmaZStarTopXZ;
	
	
	/* stretching parameters */
	
	PRECISION ***pmlSXBottomYZ, ***pmlSYBottomYZ, ***pmlSZBottomYZ;
	PRECISION ***pmlSXTopYZ, ***pmlSYTopYZ, ***pmlSZTopYZ;
	PRECISION ***pmlSXBottomXY, ***pmlSYBottomXY, ***pmlSZBottomXY;
	PRECISION ***pmlSXTopXY, ***pmlSYTopXY, ***pmlSZTopXY;
	PRECISION ***pmlSXBottomXZ, ***pmlSYBottomXZ, ***pmlSZBottomXZ;
	PRECISION ***pmlSXTopXZ, ***pmlSYTopXZ, ***pmlSZTopXZ;
	
	/* materials within pmls */
	
	unsigned short int ***pmlMaterialBottomYZ, ***pmlMaterialTopYZ;
	unsigned short int ***pmlMaterialBottomXY, ***pmlMaterialTopXY;
	unsigned short int ***pmlMaterialBottomXZ, ***pmlMaterialTopXZ;

    /* read the config files*/	
	
	int currentConfigFileVersion; //= 3; /* this is needed to detect older config-files */
//	int nx, ny, nz; /* number of cells in that direction */
	PRECISION dim_X, dim_Y, dim_Z; /* overall dimension of simulation space */
	int pmlWidth; /* width of absobing pmls */
	int maxAllowedMemory; /* Maximum number of bytes allowd for storing */
	int maxIteration; /* max number of iteration steps */
	int timeToPlotReceiver, timeToPlotSnapshot; /* decide when to plot */
	int maxMaterials; /* maximum number of materials */
	int transX, transY, transZ; /* position of transmitter */
	int maxReceiver; /* max number of receiver boxes*/
	int **receiver; /* receiver positions */
	int **tmpReceiver; /* temp. receiver array */
	int **tmpTransmitter; /* temp. transmitter positions */
	int **transmitter; /* transmitter positions */
	int maxTransmitter; /* max. number of transmitter boxes */
	PRECISION shortestWavelength; /* shortest desired wavelength [m] */
	PRECISION theoreticalReflection; 
	char *materialFilename;
	int numberOfBoxes, currentMaterial, numberOfReceiverBoxes, numberOfTransmitterBoxes, tmpCounter;
	int snapshotMode, snapshotPosition, snapshotPlane;
	PRECISION transmitterAmplitude;
	PRECISION transmitterCharacteristicTime;
	PRECISION transmitterFrequency;
	PRECISION transmitterParameter;
	PRECISION simulationLength;
	PRECISION maxSigma;
	PRECISION maxStretching;
	PRECISION minWavelength;
	int stretchSteepness;
	int transmitterMode;
	int transmitterStimulusComponent;
	int storage;// = 0;

public:	
/* for output files*/	
//	FILE *foutput;
//	char filename[1024];
//	char directory[1024];                  /* work directory */
//	char outputFilename[1024];             /* output filename for receiver data*/
//	char stimulusFilename[1024];           /* output filename for wave data*/
//	#ifdef DEBUG
//	int tmpMaterial;
//	#endif

private:
	PRECISION ***MyAllocPrecision(int dimensionX, int dimensionY, int dimensionZ, PRECISION value, int *storage);
	unsigned short int ***MyAllocShortInt(int dimensionX, int dimensionY, int dimensionZ, int *storage);
	int MyFreePrecision(PRECISION ***pointer, int x, int y, int z);
	int MyFreeShortInt(unsigned short int ***pointer, int x, int y, int z);
	void PrintCorrectOrder(PRECISION number, FILE *output);

	PRECISION ReturnConductivity (PRECISION position, PRECISION pmlThickness, PRECISION maxConductivity);
	PRECISION ReturnFieldStrength(int x, int y, int z, int mode);
	PRECISION ReturnStretching (PRECISION position, PRECISION pmlThickness, PRECISION maxStretching, int stretchSteepness);
	void SetConductivities(void);
	void SetPMLMaterial(void);
	void ShowWhirl(FILE *output, long int counter);
	void UpdateInnerEx(void);
	void UpdateInnerEy(void);
	void UpdateInnerEz(void);
	void UpdateInnerHx(void);
	void UpdateInnerHy(void);
	void UpdateInnerHz(void);
	void UpdatePMLComplexE(void);
	void UpdatePMLEx(void);
	void UpdatePMLEy(void);
	void UpdatePMLEz(void);
	void UpdatePMLHx(void);
	void UpdatePMLHy(void);
	void UpdatePMLHz(void);
	void ReadNextLine (FILE *file, char s[]);	
	void ReadConfigfile(char *directory, char *filename);
public:
	CradarFDTD();
	~CradarFDTD();
	void Simulating(char* m_strDirectory,char* m_strFileName);

	
};













⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -