aboutsummaryrefslogtreecommitdiff
path: root/src/devices/generic_2x2_coupler.h
diff options
context:
space:
mode:
authorClément Zrounba <6691770+clement-z@users.noreply.github.com>2023-09-30 23:06:01 +0200
committerClément Zrounba <6691770+clement-z@users.noreply.github.com>2023-09-30 23:26:46 +0200
commitff9b8bb838ecdfbfc1dc81038fcf3b2a87636982 (patch)
tree21f27be782ce11c6d00b96ce100a2bff88141b2e /src/devices/generic_2x2_coupler.h
downloadspecs-ff9b8bb838ecdfbfc1dc81038fcf3b2a87636982.tar.gz
specs-ff9b8bb838ecdfbfc1dc81038fcf3b2a87636982.zip
Initial release
Diffstat (limited to 'src/devices/generic_2x2_coupler.h')
-rw-r--r--src/devices/generic_2x2_coupler.h86
1 files changed, 86 insertions, 0 deletions
diff --git a/src/devices/generic_2x2_coupler.h b/src/devices/generic_2x2_coupler.h
new file mode 100644
index 0000000..6cafc17
--- /dev/null
+++ b/src/devices/generic_2x2_coupler.h
@@ -0,0 +1,86 @@
+#pragma once
+
+#include "devices/generic_transmission_device.h"
+
+class Generic2x2Coupler : public GenericTransmissionDevice {
+public:
+ Generic2x2Coupler(sc_module_name name
+ , const double &k_power = 0.0
+ , const double &insertion_loss = 0.0)
+ : GenericTransmissionDevice(name, 4)
+ {
+ setCouplingFactor(k_power);
+ setInsertionLoss(insertion_loss);
+ }
+
+ void setCouplingFactor(const double &k_power)
+ {
+ assert(isfinite(k_power) && k_power >= 0 && k_power <= 1);
+ m_k_power = k_power;
+ }
+
+ void setInsertionLoss(const double &insertion_loss)
+ {
+ assert(isfinite(insertion_loss) && insertion_loss >= 0);
+ m_insertion_loss = insertion_loss;
+ }
+
+private:
+
+ virtual void prepareTM()
+ {
+ TM.clear();
+ TM.resize(nports);
+
+ double lambda0 = 1550e-9;
+ double transmission_cross = sqrt(m_k_power) * pow(10.0, -m_insertion_loss/20.0);
+ transmission_cross = max(0.0, min(1.0, transmission_cross));
+ double transmission_through = sqrt(1 - m_k_power) * pow(10.0, -m_insertion_loss/20.0);
+ transmission_through = max(0.0, min(1.0, transmission_through));
+ double phi_through = 0.0;
+ double phi_cross = M_PI / 2.0;
+ double tau = 0.0;
+ size_t k;
+
+ // cout << transmission_through << endl;
+ // cout << transmission_cross << endl;
+ // cout << m_k_power << endl << endl << endl;
+
+ // (13, 14, 23, 24 are the only active ones)
+
+ // S13
+ k = 0*nports + 2;
+ TM.Mactive[k] = true;
+ TM.Malpha[k] = {transmission_through};
+ TM.Mphi[k] = {phi_through};
+ TM.Mtau[k] = {tau};
+
+ // S14
+ k = 0*nports + 3;
+ TM.Mactive[k] = true;
+ TM.Malpha[k] = {transmission_cross};
+ TM.Mphi[k] = {phi_cross};
+ TM.Mtau[k] = {tau};
+
+ // S23
+ k = 1*nports + 2;
+ TM.Mactive[k] = true;
+ TM.Malpha[k] = {transmission_cross};
+ TM.Mphi[k] = {phi_cross};
+ TM.Mtau[k] = {tau};
+
+ // S24
+ k = 1*nports + 3;
+ TM.Mactive[k] = true;
+ TM.Malpha[k] = {transmission_through};
+ TM.Mphi[k] = {phi_through};
+ TM.Mtau[k] = {tau};
+
+ // cout << TM.Mphi.size() << endl;
+ // cout << TM.Mphi[0].size() << endl;
+ // cout << TM.Mphi[1].size() << endl;
+ }
+
+ double m_insertion_loss;
+ double m_k_power; // power coupling factor (1-k = transmission factor)
+}; \ No newline at end of file