Skip to content

Commit a1b518f

Browse files
committed
FullyNonlinearMedium can be simplified by removing its own constructor etc, consolidating functionality with NonlinearMedium for consistency, and allowing us to use field
1 parent 1cfd36d commit a1b518f

File tree

4 files changed

+24
-60
lines changed

4 files changed

+24
-60
lines changed

src/_FullyNonlinearMedium.cpp

Lines changed: 0 additions & 37 deletions
This file was deleted.

src/_FullyNonlinearMedium.hpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,10 @@ class _FullyNonlinearMedium : public _NonlinearMedium {
3232
_FullyNonlinearMedium(uint nSignalModes, bool canBePoled, uint nFieldModes, double relativeLength, std::initializer_list<double> nlLength,
3333
std::initializer_list<double> beta2s, std::initializer_list<double> beta1s, std::initializer_list<double> beta3s,
3434
std::initializer_list<double> diffBeta0, double rayleighLength, double tMax, uint tPrecision, uint zPrecision,
35-
IntensityProfile intensityProfile, const Eigen::Ref<const Arrayd>& poling=Eigen::Ref<const Arrayd>(Arrayd{}));
36-
37-
// Same as _NonlinearMedium except that no pump variables are set
38-
inline void setDispersion(const std::vector<double>& beta2s, const std::vector<double>& beta1s,
39-
const std::vector<double>& beta3s, std::initializer_list<double> diffBeta0);
35+
IntensityProfile intensityProfile, const Eigen::Ref<const Arrayd>& poling=Eigen::Ref<const Arrayd>(Arrayd{})) :
36+
_NonlinearMedium(nSignalModes, 0, canBePoled, nFieldModes, relativeLength, nlLength, {}, beta2s, Eigen::Ref<const Arraycd>(Arraycd{}),
37+
PulseType{}, {}, beta1s, {}, beta3s, diffBeta0, rayleighLength, tMax, tPrecision, zPrecision, intensityProfile, 0, 0, poling)
38+
{_dzp = _nZStepsP = 0;};
4039

4140
inline double relativeAmplitude(double i) const {
4241
switch (_intensityProfile) {

src/_NonlinearMedium.cpp

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,16 @@ _NonlinearMedium::_NonlinearMedium(uint nSignalModes, uint nPumpModes, bool canB
2727

2828
_intensityProfile = (_rayleighLength != std::numeric_limits<double>::infinity() ?
2929
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+
}
3740
}
3841

3942

@@ -73,16 +76,16 @@ void _NonlinearMedium::setLengths(double relativeLength, const std::vector<doubl
7376
_z = relativeLength;
7477

7578
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));
8285

8386
// space resolution. Note: pump step is smaller to calculate the value for intermediate RK4 steps
8487
_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()))}));
8689
_nZStepsP = 2 * _nZSteps - 1;
8790
_dz = _z / (_nZSteps - 1);
8891
_dzp = _z / (_nZStepsP - 1);
@@ -151,7 +154,7 @@ void _NonlinearMedium::setDispersion(const std::vector<double>& beta2, const std
151154
_beta2 = beta2;
152155
_beta1 = beta1;
153156

154-
// signal phase mis-match
157+
// signal phase mismatch
155158
_diffBeta0 = diffBeta0;
156159

157160
// dispersion profile
@@ -166,11 +169,11 @@ void _NonlinearMedium::setDispersion(const std::vector<double>& beta2, const std
166169
// incremental phases for each simulation step
167170
_dispStepPump.resize(_nPumpModes);
168171
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();
170173

171174
_dispStepSign.resize(_nSignalModes);
172175
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();
174177
}
175178

176179

src/_NonlinearMedium.hpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,6 @@ friend class Cascade;
7474
const std::vector<double>& beta1s, const std::vector<double>& beta3, const std::vector<double>& beta3s,
7575
std::initializer_list<double> diffBeta0);
7676
_NonlinearMedium() : _nSignalModes(), _nPumpModes(), _nFieldModes() {};
77-
_NonlinearMedium(uint nSignalModes, uint nFieldModes) : _nSignalModes(nSignalModes), _nPumpModes(), _nFieldModes(nFieldModes) {}
7877

7978
virtual void dispatchSignalSim(const Arraycd& inputProf, bool inTimeDomain, uint inputMode,
8079
std::vector<Array2Dcd>& signalFreq, std::vector<Array2Dcd>& signalTime,

0 commit comments

Comments
 (0)