forked from ALaDyn/piccante
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstructures.h
More file actions
241 lines (194 loc) · 7.62 KB
/
structures.h
File metadata and controls
241 lines (194 loc) · 7.62 KB
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
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
/* Copyright 2014 - Andrea Sgattoni, Luca Fedeli, Stefano Sinigardi */
/*******************************************************************************
This file is part of piccante.
piccante 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.
piccante 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 piccante. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
#ifndef __STRUCTURES_H__
#define __STRUCTURES_H__
#define _USE_MATH_DEFINES
#define NUMBER_OF_PLASMA_FUNCTIONS 19
#include <cmath>
#include "commons.h"
#include <cstdio>
#include <iostream>
#if defined(_MSC_VER)
#include "gsl/gsl_rng.h" // gnu scientific linux per generatore di numeri casuali
#include "gsl/gsl_randist.h"
#else
#include <gsl/gsl_rng.h> // gnu scientific linux per generatore di numeri casuali
#include <gsl/gsl_randist.h>
#endif
struct SPHERES{
float *coords;
int NSpheres;
float rmin[3], rmax[3];
float fillingFactor;
};
struct PLASMAparams{
double rminbox[3];
double rmaxbox[3];
double left_ramp_length;
double right_ramp_length;
double left_scale_length;
double right_scale_length;
double density_coefficient;
double left_ramp_min_density;
double right_ramp_min_density;
SPHERES *spheres;
void *additional_params;
PLASMAparams operator=(const PLASMAparams& p1);
};
#define NBIN_SPECTRUM 1000;
struct SPECIEspectrum{
double Kmax;
double Dk;
int Nbin;
double *values;
};
struct DUMP_CONTROL{
bool doRestart, doDump;
int restartFromDump;
double dumpEvery;
};
typedef double(*distrib_function)(double x, double y, double z, PLASMAparams plist, double Z, double A);
class PLASMA
{
public:
PLASMAparams params;
distrib_function density_function;
PLASMA();
PLASMA(const PLASMA& other);
PLASMA operator=(const PLASMA& p1);
void setRampLength(double rlength);
void setLeftRampLength(double rlength);
void setRightRampLength(double rlength);
void setScaleLength(double slength);
void setLeftScaleLength(double slength);
void setRightScaleLength(double slength);
void setDensityCoefficient(double dcoeff);
void setDensityCoefficient(double dcoeff, double lambda);
void setRampMinDensity(double minden);
void setLeftRampMinDensity(double minden);
void setRightRampMinDensity(double minden);
void setAdditionalParams(void* addpar);
void setMinBox(double xmin, double ymin, double zmin);
void setMaxBox(double xmax, double ymax, double zmax);
void setXRangeBox(double xmin, double xmax);
void setYRangeBox(double ymin, double ymax);
void setZRangeBox(double zmin, double zmax);
~PLASMA();
static const int maxdF = NUMBER_OF_PLASMA_FUNCTIONS;
static const std::string dFNames[];
static const distrib_function dFPoint[];
static bool isGrating(int dfIndex);
};
//Pre-defined density functions
double box(double x, double y, double z, PLASMAparams plist, double Z, double A);
double left_linear_ramp(double x, double y, double z, PLASMAparams plist, double Z, double A);
double right_linear_ramp(double x, double y, double z, PLASMAparams plist, double Z, double A);
double left_right_linear_ramp(double x, double y, double z, PLASMAparams plist, double Z, double A);
double left_fixed_exp_ramp(double x, double y, double z, PLASMAparams plist, double Z, double A);
double right_fixed_exp_ramp(double x, double y, double z, PLASMAparams plist, double Z, double A);
double left_right_fixed_exp_ramp(double x, double y, double z, PLASMAparams plist, double Z, double A);
double left_free_exp_ramp(double x, double y, double z, PLASMAparams plist, double Z, double A);
double right_free_exp_ramp(double x, double y, double z, PLASMAparams plist, double Z, double A);
double left_right_free_exp_ramp(double x, double y, double z, PLASMAparams plist, double Z, double A);
double left_soft_ramp(double x, double y, double z, PLASMAparams plist, double Z, double A);
double* rough_box_prepareAdditionalParams(gsl_rng* rng, double roughness, double shift);
double rough_box(double x, double y, double z, PLASMAparams plist, double Z, double A);
double rough_box_edgeCalc(double x0, double y0, double x, double y, int order, double* FFT_params, double roughness);
double box_minus_box(double x, double y, double z, PLASMAparams plist, double Z, double A);
double left_grating(double x, double y, double z, PLASMAparams plist, double Z, double A);
double square_func(double x);
double left_square_grating(double x, double y, double z, PLASMAparams plist, double Z, double A);
double guide(double x, double y, double z, PLASMAparams plist, double Z, double A);
double modGrat(double x, double y, double z, PLASMAparams plist, double Z, double A);
double spoofGrat(double x, double y, double z, PLASMAparams plist, double Z, double A);
double spheres(double x, double y, double z, PLASMAparams plist, double Z, double A);
//************** LASER PULSE TYPES *******
enum laserPulseType{ DEFAULT_PULSE, GAUSSIAN, PLANE_WAVE, COS2_PLANE_WAVE, COS2_PLATEAU_PLANE_WAVE };
enum pulsePolarization{ P_POLARIZATION, S_POLARIZATION, CIRCULAR_POLARIZATION };
class laserPulse
{
public:
laserPulseType type;
pulsePolarization polarization;
double t_FWHM;
double waist;
double focus_position;
double laser_pulse_initial_position;
double normalized_amplitude;
double lambda0;
bool rotation;
double angle;
double rotation_center_along_x;
double rise_time;
laserPulse();
~laserPulse();
laserPulse(const laserPulse& other);
laserPulse operator=(const laserPulse& p1);
void setFocusPosition(double _focus_position);
void setPulseInitialPosition(double _laser_pulse_initial_position);
void setLambda(double _lambda0);
void setWaist(double _waist);
void setDurationFWHM(double _t_FWHM);
void setNormalizedAmplitude(double _normalized_amplitude);
void setRiseTime(double _rise_time);
void setRotationAngleAndCenter(double _angle, double _rotation_center_along_x);
void setGaussianPulse(double _waist, double _t_FWHM, double _normalized_amplitude);
void setPlaneWave(double _normalized_amplitude);
void setCos2PlaneWave(double _t_FWHM, double _normalized_amplitude);
void setCos2PlateauPlaneWave(double _t_FWHM, double _rise_time, double _normalized_amplitude);
void setGaussianPulse();
void setPlaneWave();
void setCos2PlaneWave();
void setCos2PlateauPlaneWave();
void setPPolarization();
void setSPolarization();
void setCircularPolarization();
};
//************** FIELD COORDINATES *******
#define _INTG_CRD 0
#define _HALF_CRD 1;
#define _NULL_CRD -1;
struct integer_or_halfinteger{
char x;
char y;
char z;
};
//************** PARTICLES DISTRIBUTION FUNCTION *******
enum tempDistribType{ WATERBAG, WATERBAG_3TEMP, UNIF_SPHERE, SUPERGAUSSIAN, MAXWELL, JUTTNER, SPECIAL };
class tempDistrib{
public:
tempDistribType type;
tempDistrib();
void setWaterbag(double _p0);
void setWaterbag3Temp(double _p0_x, double _p0_y, double _p0_z);
void setUnifSphere(double _p0);
void setSupergaussian(double _p0, double _alpha);
void setMaxwell(double _temp);
void setJuttner(double _a);
void setSpecial(double _a);
bool isInit();
friend class SPECIE;
private:
double p0;
double p0_x;
double p0_y;
double p0_z;
double alpha;
double temp;
double a;
bool init;
};
//**************** SPHERES *****************/
#endif