@@ -27,13 +27,16 @@ _NonlinearMedium::_NonlinearMedium(uint nSignalModes, uint nPumpModes, bool canB
27
27
28
28
_intensityProfile = (_rayleighLength != std::numeric_limits<double >::infinity () ?
29
29
intensityProfile : IntensityProfile::Constant);
30
- _envelope.resize (_nPumpModes);
31
- if (customPump.size () != 0 )
32
- setPump (customPump, chirp, delay);
33
- else
34
- setPump (pulseType, chirp, delay);
35
- for (uint m = 1 ; m < _nPumpModes; m++)
36
- _envelope[m].setZero (_nFreqs);
30
+
31
+ if (_nPumpModes > 0 ) {
32
+ _envelope.resize (_nPumpModes);
33
+ if (customPump.size () != 0 )
34
+ setPump (customPump, chirp, delay);
35
+ else
36
+ setPump (pulseType, chirp, delay);
37
+ for (uint m = 1 ; m < _nPumpModes; m++)
38
+ _envelope[m].setZero (_nFreqs);
39
+ }
37
40
}
38
41
39
42
@@ -73,16 +76,16 @@ void _NonlinearMedium::setLengths(double relativeLength, const std::vector<doubl
73
76
_z = relativeLength;
74
77
75
78
auto absComp = [](double a, double b) {return (std::abs (a) < std::abs (b));};
76
- double minDispLength = 1 / std::abs (std::max ({*std::max_element (beta2.begin (), beta2.end (), absComp),
77
- *std::max_element (beta2s.begin (), beta2s.end (), absComp),
78
- *std::max_element (beta1.begin (), beta1.end (), absComp),
79
- *std::max_element (beta1s.begin (), beta1s.end (), absComp),
80
- *std::max_element (beta3.begin (), beta3.end (), absComp),
81
- *std::max_element (beta3s.begin (), beta3s.end (), absComp)}, absComp));
79
+ double minDispLength = 1 / std::abs (std::max ({(beta2. empty () ? 0 : *std::max_element (beta2.begin (), beta2.end (), absComp) ),
80
+ (beta2s. empty ()? 0 : *std::max_element (beta2s.begin (), beta2s.end (), absComp) ),
81
+ (beta1. empty () ? 0 : *std::max_element (beta1.begin (), beta1.end (), absComp) ),
82
+ (beta1s. empty ()? 0 : *std::max_element (beta1s.begin (), beta1s.end (), absComp) ),
83
+ (beta3. empty () ? 0 : *std::max_element (beta3.begin (), beta3.end (), absComp) ),
84
+ (beta3s. empty ()? 0 : *std::max_element (beta3s.begin (), beta3s.end (), absComp) )}, absComp));
82
85
83
86
// space resolution. Note: pump step is smaller to calculate the value for intermediate RK4 steps
84
87
_nZSteps = static_cast <uint>(zPrecision * _z / std::min ({1 ., minDispLength, rayleighLength,
85
- *std::min_element (nlLength.begin (), nlLength.end ())}));
88
+ (nlLength. empty ()? 0 : *std::min_element (nlLength.begin (), nlLength.end () ))}));
86
89
_nZStepsP = 2 * _nZSteps - 1 ;
87
90
_dz = _z / (_nZSteps - 1 );
88
91
_dzp = _z / (_nZStepsP - 1 );
@@ -151,7 +154,7 @@ void _NonlinearMedium::setDispersion(const std::vector<double>& beta2, const std
151
154
_beta2 = beta2;
152
155
_beta1 = beta1;
153
156
154
- // signal phase mis-match
157
+ // signal phase mismatch
155
158
_diffBeta0 = diffBeta0;
156
159
157
160
// dispersion profile
@@ -166,11 +169,11 @@ void _NonlinearMedium::setDispersion(const std::vector<double>& beta2, const std
166
169
// incremental phases for each simulation step
167
170
_dispStepPump.resize (_nPumpModes);
168
171
for (uint m = 0 ; m < _nPumpModes; m++)
169
- _dispStepPump[m] = (1 ._I * _dispersionPump[m] * _dzp ).exp ();
172
+ _dispStepPump[m] = (( 1 ._I * _dzp) * _dispersionPump[m]).exp ();
170
173
171
174
_dispStepSign.resize (_nSignalModes);
172
175
for (uint m = 0 ; m < _nSignalModes; m++)
173
- _dispStepSign[m] = (1 ._I * _dispersionSign[m] * _dz ).exp ();
176
+ _dispStepSign[m] = (( 1 ._I * _dz) * _dispersionSign[m]).exp ();
174
177
}
175
178
176
179
0 commit comments