00001 // rfmatch.cc 00002 00003 // Create the RF circuit for 1/2 of a twinslot, quasioptical SIS 00004 // mixer. Analyze its frequency response for matching into an SIS 00005 // junction with specified physical characteristics. 00006 // 00007 // The circuit will be modelled as follows: 00008 // 00009 // RF --- --- --- --- branch --- --- short 00010 // IN o--| |---| |---| |---| |-----+-----| |---| |---+ to 00011 // --- --- --- --- | --- --- | ground 00012 // antenna rf_1 rf_2 tune_2 o sis_cap tune_1 V 00013 // OUT 00014 // (into SIS Rn) 00015 // 00016 // Below each element is the name of the object representing it in the 00017 // program code below. The SIS junction is modelled in a purely linear 00018 // fashion as a parallel RC combination. The power coupled into the R of 00019 // the RC is what we determine in this program. 00020 00021 #include "supermix.h" 00022 00023 // ========================================================================== 00024 // THE PHYSICAL SPECIFICATIONS OF THE RF CIRCUIT: 00025 00026 // THE CHARACTERISTICS OF THE SUPERCONDUCTING FILMS 00027 struct sc_material { parameter Vgap, Tc, rho_normal; } 00028 nb = { 2.9*mVolt, 9.20*Kelvin, 5.0*Micro*Ohm*Centi*Meter }, 00029 nbtin = { 5.0*mVolt, 15.75*Kelvin, 30.0*Micro*Ohm*Centi*Meter }; 00030 00031 // THE WIDTHS AND LENGTHS OF THE MICROSTRIPS 00032 struct wl { parameter width, length; } 00033 RF1 = { 5.8*Micron, 11.2*Micron }, // transformer section 1 (nearest antenna) 00034 RF2 = { 3.3*Micron, 15.0*Micron }, // transformer section 2 00035 L1 = { 5.0*Micron, 6.9*Micron/2 }, // tuning inductor from SIS to virtual ground 00036 L2 = { 5.0*Micron, 2.5*Micron }; // tuning inductor between transformer and SIS 00037 00038 // THE LAYER THICKNESSES 00039 parameter 00040 GP_THICKNESS = 3000.*Angstrom, // ground plane superconductor thickness 00041 TOP_THICKNESS = 3000.*Angstrom, // top strip superconductor thickness 00042 SIO_THICKNESS = 4500.*Angstrom, // SiO layer generally 00043 TUNE_THICKNESS = 2500.*Angstrom; // SiO in tuning inductor 00044 00045 // SIS JUNCTION PARAMETERS 00046 parameter 00047 RNA = 21.8*Ohm*Micron*Micron, // normal resistance - area product 00048 SCAP = 82.0*fFarad/Micron/Micron, // specific capacitance (per area) 00049 AREA = 1.2*1.2*Micron*Micron; // effective junction area 00050 00051 // THE FILE NAME FOR THE ANTENNA IMPEDANCE INFORMATION 00052 const char * const ANT_FILE = "Zslot.750"; 00053 00054 00055 // ========================================================================== 00056 // CLASSES WHICH ACTUALLY CALCULATE THE SIS RN AND CAPACITANCE: 00057 00058 struct calc_Rn : public abstract_real_parameter { 00059 double get() const { return RNA/AREA; } 00060 } Rn; 00061 struct calc_Cap : public abstract_real_parameter { 00062 double get() const { return SCAP*AREA; } 00063 } Cap; 00064 00065 00066 // ========================================================================== 00067 int main() 00068 { 00069 // SET THE GLOBAL TEMPERATURE AND NORMALIZATION IMPEDANCE 00070 device::T = 4.2*Kelvin; 00071 device::Z0 = & Rn; // we use the SIS Rn as our normalizing impedance 00072 00073 00074 // CREATE THE SUPERCONDUCTING FILMS AND THE DIELECTRIC MATERIALS 00075 00076 // The top film is Niobium. 00077 super_film top; 00078 top.Vgap = & nb.Vgap; 00079 top.Tc = & nb.Tc; 00080 top.rho_normal = & nb.rho_normal; 00081 top.Thick = & TOP_THICKNESS; 00082 00083 // The groundplane is NbTiN. 00084 super_film gp; 00085 gp.Vgap = & nbtin.Vgap; 00086 gp.Tc = & nbtin.Tc; 00087 gp.rho_normal = & nbtin.rho_normal; 00088 gp.Thick = & GP_THICKNESS; 00089 00090 // Air is the dielectric above the microstrips; we just treat it as vacuum. 00091 const_diel air; 00092 air.eps = 1.0; 00093 air.tand = 0.0; 00094 00095 // SiO is the dielectric between the strip and the groundplane. 00096 const_diel sio; 00097 sio.eps = 5.6; 00098 sio.tand = 0.0; 00099 00100 00101 // CREATE THE MICROSTRIPS USING THE ABOVE MATERIALS 00102 00103 // For convenience, we first create a generic microstrip using our materials. 00104 microstrip ms; 00105 ms.ground_plane(gp); 00106 ms.substrate(sio); 00107 ms.top_strip(top); 00108 ms.superstrate(air); 00109 00110 microstrip rf_1(ms); 00111 rf_1.width = & RF1.width; 00112 rf_1.length = & RF1.length; 00113 rf_1.sub_thick = & SIO_THICKNESS; 00114 microstrip rf_2(ms); 00115 rf_2.width = & RF2.width; 00116 rf_2.length = & RF2.length; 00117 rf_2.sub_thick = & SIO_THICKNESS; 00118 microstrip tune_1(ms); 00119 tune_1.width = & L1.width; 00120 tune_1.length = & L1.length; 00121 tune_1.sub_thick = & TUNE_THICKNESS; 00122 microstrip tune_2(ms); 00123 tune_2.width = & L2.width; 00124 tune_2.length = & L2.length; 00125 tune_2.sub_thick = & TUNE_THICKNESS; 00126 00127 00128 // CREATE THE ANTENNA 00129 complex_interp Z_ant; 00130 Z_ant.touchstone(ANT_FILE, 'Z'); 00131 transformer antenna; 00132 antenna.Z2 = & Z_ant; 00133 00134 00135 // A CAPACITOR TO MODEL THE SIS JUNCTION 00136 capacitor sis_cap; 00137 sis_cap.parallel(); 00138 sis_cap.C = & Cap; // shadows our junction capacitance calculator 00139 00140 00141 // BUILD THE COMPLETE RF CIRCUIT MODEL 00142 00143 branch tee; 00144 short_term ground; 00145 00146 circuit rf; 00147 rf.connect( antenna, 2, rf_1, 1 ); 00148 rf.connect( rf_1, 2, rf_2, 1 ); 00149 rf.connect( rf_2, 2, tune_2, 1 ); 00150 rf.connect( tune_2, 2, tee, 1 ); 00151 rf.connect( tee, 2, sis_cap, 1 ); 00152 rf.connect( sis_cap, 2, tune_1, 1 ); 00153 rf.connect( tune_1, 2, ground, 1 ); 00154 00155 int input = rf.add_port( antenna, 1 ); // RF power input to antenna 00156 int output = rf.add_port( tee, 3 ); // power output into SIS resistance 00157 00158 00159 // ========================================================================== 00160 // PERFORM THE CALCULATION AND OUTPUT THE RESULTS 00161 00162 cout << fixed << setprecision(3); 00163 cout << "# 750 GHz Twinslot RF Match, antenna -> SIS" << endl; 00164 cout << "# SIS Rn (Ohm): " << Rn/Ohm << " ; SIS Cap (fF): " << Cap/fFarad << endl; 00165 cout << "#" << endl; 00166 cout << "# F(THz)" << "\t" << "S21" << "\t" << "Phase" << endl; 00167 00168 complex::out_degree(); 00169 complex::out_separator("\t"); 00170 00171 for(double f = 300.0; f <= 1500.0; f += 1.0) { 00172 device::f = f*GHz; 00173 sdata response = rf.get_data(); 00174 complex S21 = response.S[output][input]; 00175 cout << " " << device::f/(1000*GHz)<< "\t" << S21 << endl; 00176 } 00177 00178 }
Please direct comments and corrections to
supermix@submm.caltech.edu
Go to the supermix home page
Generated by
1.2.7