1 #define _SCL_SECURE_NO_WARNINGS // Issue with linterp 2 #pragma warning( disable : 4244 ) // ICEDB_LOG_WARNINGs C4244 and C4267: size_t to int and int <-> _int64 3 #pragma warning( disable : 4267 ) 8 #include "../icedb/refract/refract.hpp" 9 #include "../icedb/refract/refractBase.hpp" 10 #include "../icedb/zeros.hpp" 11 #include "../icedb/units/units.hpp" 12 #include "../private/linterp.h" 13 #include "../icedb/error.hpp" 14 #include "../icedb/logging.hpp" 22 std::lock_guard<std::mutex> lock(m_setup);
23 static std::shared_ptr<InterpMultilinear<1, double > > res_water_re, res_water_im,
24 res_ice_re, res_ice_im, res_nacl_re, res_nacl_im, res_seasalt_re, res_seasalt_im;
27 const size_t nWvlengths = 90;
28 const double Dwavelengths[nWvlengths] = { 0.2, 0.25, 0.3, 0.337, 0.4, 0.488, 0.515,
29 0.55, 0.633, 0.694, 0.86, 1.06, 1.3, 1.536, 1.8, 2, 2.25, 2.5,
30 2.7, 3, 3.2, 3.392, 3.5, 3.75, 4, 4.5, 5, 5.5, 6, 6.2, 6.5,
31 7.2, 7.9, 8.2, 8.5, 8.7, 9, 9.2, 9.5, 9.8, 10, 10.591, 11,
32 11.5, 12.5, 13, 14, 14.8, 15, 16.4, 17.2, 18, 18.5, 20, 21.3,
33 22.5, 25, 27.9, 30, 35, 40, 45, 50, 55, 60, 65, 70, 80, 90,
34 100, 110, 120, 135, 150, 165, 180, 200, 250, 300, 400, 500,
35 750, 1000, 1500, 2000, 3000, 5000, 10000, 20000, 30000 };
36 static std::vector<double > wavelengths(nWvlengths);
37 for (
size_t i = 0; i < nWvlengths; ++i) wavelengths[i] = Dwavelengths[i];
38 const double water_re[nWvlengths] = { 1.396, 1.362, 1.349, 1.345, 1.339, 1.335,
39 1.334, 1.333, 1.332, 1.331, 1.329, 1.326, 1.323, 1.318, 1.312, 1.306,
40 1.292, 1.261, 1.188, 1.371, 1.478, 1.422, 1.4, 1.369, 1.351, 1.332,
41 1.325, 1.298, 1.265, 1.363, 1.339, 1.312, 1.294, 1.286, 1.278, 1.272,
42 1.262, 1.255, 1.243, 1.229, 1.218, 1.179, 1.153, 1.126, 1.123, 1.146,
43 1.21, 1.258, 1.27, 1.346, 1.386, 1.423, 1.443, 1.48, 1.491, 1.506, 1.531,
44 1.549, 1.551, 1.532, 1.519, 1.536, 1.587, 1.645, 1.703, 1.762, 1.821,
45 1.92, 1.979, 2.037, 2.06, 2.082, 2.094, 2.106, 2.109, 2.113, 2.117,
46 2.12, 2.121, 2.142, 2.177, 2.291, 2.437, 2.562, 2.705, 3.013, 3.627,
47 4.954, 6.728, 7.682 };
48 const double water_im[nWvlengths] = { 1.10E-07, 3.35E-08, 1.60E-08, 8.45E-09,
49 1.86E-09, 9.69E-10, 1.18E-09, 1.96E-09, 1.46E-08, 3.05E-08, 3.29E-07,
50 4.18E-06, 3.69E-05, 9.97E-05, 1.15E-04, 1.10E-03, 3.90E-04, 0.00174,
51 0.019, 0.272, 0.0924, 0.0204, 0.0094, 0.0035, 0.0046, 0.0134, 0.0124,
52 0.0116, 0.107, 0.088, 0.0392, 0.0321, 0.0339, 0.0351, 0.0367, 0.0379,
53 0.0399, 0.0415, 0.0444, 0.0479, 0.0508, 0.0674, 0.0968, 0.142, 0.259,
54 0.305, 0.37, 0.396, 0.402, 0.427, 0.429, 0.426, 0.421, 0.393, 0.379,
55 0.37, 0.356, 0.339, 0.328, 0.336, 0.385, 0.449, 0.514, 0.551, 0.587,
56 0.582, 0.576, 0.52, 0.49, 0.46, 0.44, 0.42, 0.41, 0.4, 0.41, 0.42,
57 0.43, 0.46, 0.49, 0.53, 0.58, 0.65, 0.73, 0.96, 1.19, 1.59, 2.14, 2.79,
61 const double ice_re[nWvlengths] = { 1.394, 1.351, 1.334, 1.326, 1.32, 1.313, 1.312,
62 1.311, 1.308, 1.306, 1.303, 1.3, 1.295, 1.29, 1.282, 1.273, 1.256, 1.225,
63 1.163, 1.045, 1.652, 1.51, 1.453, 1.391, 1.361, 1.34, 1.327, 1.299, 1.296,
64 1.313, 1.32, 1.318, 1.313, 1.306, 1.291, 1.282, 1.269, 1.261, 1.245, 1.219,
65 1.197, 1.098, 1.093, 1.176, 1.387, 1.472, 1.569, 1.579, 1.572, 1.531, 1.534,
66 1.522, 1.51, 1.504, 1.481, 1.455, 1.414, 1.358, 1.325, 1.226, 1.202, 1.299,
67 1.629, 1.767, 1.585, 1.748, 1.869, 1.903, 1.856, 1.832, 1.821, 1.819, 1.819,
68 1.823, 1.829, 1.832, 1.827, 1.807, 1.795, 1.786, 1.783, 1.782, 1.781, 1.782,
69 1.782, 1.782, 1.783, 1.784, 1.784, 1.784 };
70 const double ice_im[nWvlengths] = { 1.50E-08, 8.60E-09, 5.50E-09, 4.50E-09, 2.71E-09,
71 1.75E-09, 2.19E-09, 3.11E-09, 1.09E-08, 2.62E-08, 2.15E-07, 1.96E-06,
72 1.32E-05, 6.10E-04, 1.13E-04, 1.61E-03, 2.13E-04, 7.95E-04, 0.00293, 0.429,
73 0.283, 0.0401, 0.0161, 0.007, 0.01, 0.0287, 0.012, 0.0217, 0.0647, 0.0683,
74 0.0559, 0.0544, 0.0479, 0.039, 0.0391, 0.04, 0.0429, 0.0446, 0.0459, 0.047,
75 0.051, 0.131, 0.239, 0.36, 0.422, 0.389, 0.283, 0.191, 0.177, 0.125, 0.107,
76 0.0839, 0.076, 0.067, 0.0385, 0.0291, 0.0299, 0.049, 0.065, 0.155, 0.344,
77 0.601, 0.543, 0.42, 0.39, 0.49, 0.399, 0.235, 0.165, 0.139, 0.126, 0.12,
78 0.108, 0.0962, 0.0846, 0.065, 0.0452, 0.0222, 0.0153, 0.0125, 0.0106, 0.008,
79 0.0065, 0.0049, 0.004, 0.003, 0.0021, 0.0013, 7.90E-04, 5.90E-04 };
82 const double nacl_re[nWvlengths] = { 1.79, 1.655, 1.607, 1.587, 1.567, 1.553, 1.55,
83 1.547, 1.542, 1.539, 1.534, 1.531, 1.529, 1.528, 1.527, 1.527, 1.526, 1.525,
84 1.525, 1.524, 1.524, 1.523, 1.523, 1.522, 1.522, 1.52, 1.519, 1.517, 1.515,
85 1.515, 1.513, 1.51, 1.507, 1.505, 1.504, 1.503, 1.501, 1.5, 1.498, 1.496,
86 1.495, 1.491, 1.488, 1.484, 1.476, 1.471, 1.462, 1.454, 1.451, 1.435, 1.425,
87 1.414, 1.406, 1.382, 1.36, 1.33, 1.27, 1.17, 1.08, 0.78, 0.58, 0.27, 0.14,
88 0.31, 4.52, 5.28, 3.92, 3.17, 2.87, 2.74, 2.64, 2.59, 2.54, 2.5, 2.48, 2.47,
89 2.45, 2.44, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43, 2.43 };
90 const double nacl_im[nWvlengths] = { 3.10E-09, 2.30E-09, 1.50E-09, 8.70E-10, 3.80E-10,
91 1.10E-10, 4.90E-11, 6.80E-11, 1.10E-10, 1.50E-10, 2.40E-10, 3.50E-10,
92 4.80E-10, 6.10E-10, 7.50E-10, 8.60E-10, 1.00E-09, 1.10E-09, 1.20E-09,
93 1.40E-09, 1.50E-09, 1.60E-09, 1.65E-09, 1.80E-09, 1.80E-09, 1.80E-09,
94 1.70E-09, 2.60E-09, 4.90E-09, 5.80E-09, 7.20E-09, 1.00E-08, 1.40E-08,
95 1.50E-08, 1.60E-08, 1.70E-08, 1.90E-08, 2.00E-08, 3.00E-08, 4.40E-08,
96 5.30E-08, 8.00E-08, 1.30E-07, 3.30E-07, 1.40E-06, 2.80E-06, 8.80E-06,
97 2.30E-05, 2.70E-05, 7.60E-05, 1.30E-04, 2.00E-04, 2.90E-04, 6.20E-04,
98 9.90E-04, 0.0014, 0.0035, 0.01, 0.026, 0.14, 0.66, 1.08, 1.99, 3.46, 6.94,
99 0.761, 0.271, 0.123, 0.0968, 0.087, 0.079, 0.077, 0.072, 0.064, 0.056, 0.052,
100 0.047, 0.041, 0.03, 0.027, 0.024, 0.012, 0.008, 0.0061, 0.0047, 0.0029,
101 0.0024, 5.60E-04, 4.10E-04, 2.60E-04 };
104 const double seasalt_re[nWvlengths] = { 1.51, 1.51, 1.51, 1.51, 1.5, 1.5, 1.5,
105 1.5, 1.49, 1.49, 1.48, 1.47, 1.47, 1.46, 1.45, 1.45, 1.44, 1.43, 1.4,
106 1.61, 1.49, 1.48, 1.48, 1.47, 1.48, 1.49, 1.47, 1.42, 1.41, 1.6, 1.46,
107 1.42, 1.4, 1.42, 1.48, 1.6, 1.65, 1.61, 1.58, 1.56, 1.54, 1.5, 1.48,
108 1.48, 1.42, 1.41, 1.41, 1.43, 1.45, 1.56, 1.74, 1.78, 1.77, 1.76, 1.76,
109 1.76, 1.76, 1.77, 1.77, 1.76, 1.74, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
110 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
111 const double seasalt_im[nWvlengths] = { 1.00E-04, 5.00E-06, 2.00E-06, 4.00E-07,
112 3.00E-08, 2.00E-08, 1.00E-08, 1.00E-08, 2.00E-08, 1.00E-07, 3.00E-06,
113 2.00E-04, 4.00E-04, 6.00E-04, 8.00E-04, 0.001, 0.002, 0.004, 0.007,
114 0.01, 0.003, 0.002, 0.0016, 0.0014, 0.0014, 0.0014, 0.0025, 0.0036,
115 0.011, 0.022, 0.005, 0.007, 0.013, 0.02, 0.026, 0.03, 0.028, 0.026,
116 0.018, 0.016, 0.015, 0.014, 0.014, 0.014, 0.016, 0.018, 0.023, 0.03,
117 0.035, 0.09, 0.12, 0.13, 0.135, 0.152, 0.165, 0.18, 0.205, 0.275, 0.3,
118 0.5, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
119 0, 0, 0, 0, 0, 0, 0, 0 };
123 static std::vector< std::vector<double>::iterator > grid_iter_list;
124 grid_iter_list.push_back(wavelengths.begin());
127 static std::array<size_t, 1> grid_sizes;
128 grid_sizes[0] = wavelengths.size();
130 static size_t num_elements = grid_sizes[0];
133 res_water_re = std::shared_ptr<InterpMultilinear<1, double > >
135 (grid_iter_list.begin(), grid_sizes.begin(), water_re, water_re + num_elements));
136 res_water_im = std::shared_ptr<InterpMultilinear<1, double > >
138 (grid_iter_list.begin(), grid_sizes.begin(), water_im, water_im + num_elements));
139 res_ice_re = std::shared_ptr<InterpMultilinear<1, double > >
141 (grid_iter_list.begin(), grid_sizes.begin(), ice_re, ice_re + num_elements));
142 res_ice_im = std::shared_ptr<InterpMultilinear<1, double > >
144 (grid_iter_list.begin(), grid_sizes.begin(), ice_im, ice_im + num_elements));
145 res_nacl_re = std::shared_ptr<InterpMultilinear<1, double > >
147 (grid_iter_list.begin(), grid_sizes.begin(), nacl_re, nacl_re + num_elements));
148 res_nacl_im = std::shared_ptr<InterpMultilinear<1, double > >
150 (grid_iter_list.begin(), grid_sizes.begin(), nacl_im, nacl_im + num_elements));
151 res_seasalt_re = std::shared_ptr<InterpMultilinear<1, double > >
153 (grid_iter_list.begin(), grid_sizes.begin(), seasalt_re, seasalt_re + num_elements));
154 res_seasalt_im = std::shared_ptr<InterpMultilinear<1, double > >
156 (grid_iter_list.begin(), grid_sizes.begin(), seasalt_im, seasalt_im + num_elements));
158 if (m == hanelAmedium::WATER_RE)
return res_water_re;
159 else if (m == hanelAmedium::WATER_IM)
return res_water_im;
160 else if (m == hanelAmedium::ICE_RE)
return res_ice_re;
161 else if (m == hanelAmedium::ICE_IM)
return res_ice_im;
162 else if (m == hanelAmedium::NACL_RE)
return res_nacl_re;
163 else if (m == hanelAmedium::NACL_IM)
return res_nacl_im;
164 else if (m == hanelAmedium::SEASALT_RE)
return res_seasalt_re;
165 else if (m == hanelAmedium::SEASALT_IM)
return res_seasalt_im;
167 .add<std::string>(
"Reason",
"Bad enum input for hanelAmedium. " 169 "case that the Hanel dielectric code can handle.");
175 std::lock_guard<std::mutex> lock(m_setup);
176 static std::shared_ptr<InterpMultilinear<1, double> > res_sand_o_re, res_sand_o_im,
177 res_sand_e_re, res_sand_e_im, res_dust_re, res_dust_im;
178 if (!res_sand_o_re) {
180 const size_t nWvlengths = 68, nWvlengthsDust = 61;
181 const double D_wavelengths[nWvlengths] = { 0.2, 0.25, 0.3, 0.337, 0.4, 0.488,
182 0.515, 0.55, 0.633, 0.694, 0.86, 1.06, 1.3, 1.536, 1.8, 2, 2.25, 2.5,
183 2.7, 3, 3.2, 3.392, 3.5, 3.75, 4, 4.5, 5, 5.5, 6, 6.2, 6.5, 7.2, 7.9,
184 8.2, 8.5, 8.7, 9, 9.2, 9.5, 9.8, 10, 10.591, 11, 11.5, 12.5, 13, 14,
185 14.8, 15, 16.4, 17.2, 18, 18.5, 20, 21.3, 22.5, 25, 27.9, 30, 35, 40,
186 50, 60, 80, 100, 150, 200, 300 };
187 static std::vector<double > wavelengths(nWvlengths);
188 for (
size_t i = 0; i < nWvlengths; ++i) wavelengths[i] = D_wavelengths[i];
189 const double sand_o_re[nWvlengths] = { 1.665, 1.686, 1.677, 1.665, 1.656,
190 1.667, 1.666, 1.664, 1.655, 1.65, 1.635, 1.627, 1.623, 1.62, 1.615,
191 1.611, 1.607, 1.602, 1.597, 1.591, 1.585, 1.579, 1.576, 1.566, 1.555,
192 1.535, 1.511, 1.466, 1.42, 1.389, 1.342, 1.161, 0.662, 0.175, 0.356,
193 0.854, 0.221, 0.612, 4.274, 2.933, 2.615, 2.18, 2.015, 1.844, 1.564,
194 2.119, 1.715, 1.727, 1.669, 1.163, 2.011, 1.584, 1.346, 0.145, 0.346,
195 5.37, 0.946, 2.162, 3.446, 2.655, 2.491, 2.446, 2.388, 2.347, 2.326,
196 2.31, 2.299, 2.296 };
197 const double sand_o_im[nWvlengths] = { 0.147, 0.117, 0.09, 0.0778, 0.0335,
198 0.0109, 0.00809, 0.00474, 5.22E-04, 5.61E-05, 2.46E-04, 1.92E-06,
199 6.51E-07, 3.63E-07, 2.67E-07, 3.00E-07, 3.31E-07, 8.58E-07, 1.19E-06,
200 2.60E-05, 7.13E-06, 6.78E-06, 8.66E-06, 5.75E-05, 7.10E-05, 4.86E-04,
201 0.00539, 0.00533, 0.00656, 0.00764, 0.00571, 0.0124, 0.0922, 0.632,
202 1.82, 2.19, 2.06, 4.07, 0.356, 0.0789, 0.0474, 0.0214, 0.0172, 0.019,
203 2.02, 0.0515, 0.0394, 0.0381, 0.0348, 0.233, 0.655, 0.0912, 0.0603,
204 0.886, 2.59, 1.35, 1.84, 0.382, 0.353, 0.0243, 0.0107, 0.00613, 0.00428,
205 0.00494, 0.00187, 0.00143, 0.00121, 0.00106 };
208 const double sand_e_re[nWvlengths] = { 1.665, 1.686, 1.677, 1.665, 1.656,
209 1.667, 1.666, 1.664, 1.655, 1.65, 1.635, 1.627, 1.623, 1.62, 1.615, 1.611,
210 1.607, 1.602, 1.597, 1.591, 1.585, 1.579, 1.576, 1.566, 1.555, 1.535,
211 1.511, 1.466, 1.42, 1.389, 1.342, 1.16, 0.639, 0.155, 0.239, 1.557, 0.251,
212 1.59, 3.733, 2.794, 2.533, 2.151, 2.003, 1.859, 1.305, 2.524, 1.762, 1.58,
213 1.533, 0.955, 1.404, 0.489, 0.229, 1.389, 2.853, 2.698, 1.559, 4.4, 4.196,
214 2.836, 2.606, 2.495, 2.436, 2.389, 2.37, 2.352, 2.347, 2.343 };
215 const double sand_e_im[nWvlengths] = { 0.147, 0.117, 0.09, 0.0778, 0.0335,
216 0.0109, 0.00809, 0.00474, 5.22E-04, 5.61E-05, 2.46E-04, 1.92E-06, 6.51E-07,
217 3.63E-07, 2.67E-07, 3.00E-07, 3.31E-07, 1.09E-06, 1.59E-06, 8.69E-06,
218 4.53E-06, 6.12E-06, 8.66E-06, 3.58E-05, 7.10E-05, 3.45E-04, 0.00427, 0.00503,
219 0.00468, 0.00764, 0.00717, 0.0146, 0.0938, 0.693, 1.74, 0.709, 2.56, 5.85,
220 0.207, 0.0629, 0.0405, 0.0198, 0.016, 0.0159, 0.123, 0.291, 0.0229, 0.0293,
221 0.0333, 0.481, 0.153, 0.249, 1.1, 4.57, 0.448, 0.295, 0.154, 0.915, 1.41,
222 0.0369, 0.0151, 0.00509, 0.00319, 0.00192, 0.0014, 8.24E-04, 5.88E-04, 3.43E-04 };
225 const double dust_re[nWvlengthsDust] = { 1.53, 1.53, 1.53, 1.53, 1.53, 1.53,
226 1.53, 1.53, 1.53, 1.53, 1.52, 1.52, 1.46, 1.4, 1.33, 1.26, 1.22, 1.18, 1.18,
227 1.16, 1.22, 1.26, 1.28, 1.27, 1.26, 1.26, 1.25, 1.22, 1.15, 1.14, 1.13, 1.4,
228 1.15, 1.13, 1.3, 1.4, 1.7, 1.72, 1.73, 1.74, 1.75, 1.62, 1.62, 1.59, 1.51,
229 1.47, 1.52, 1.57, 1.57, 1.6, 1.63, 1.64, 1.64, 1.68, 1.77, 1.9, 1.97, 1.89,
231 const double dust_im[nWvlengthsDust] = { 0.07, 0.03, 0.008, 0.008, 0.008, 0.008,
232 0.008, 0.008, 0.008, 0.008, 0.008, 0.008, 0.008, 0.008, 0.008, 0.008, 0.009,
233 0.009, 0.013, 0.012, 0.01, 0.013, 0.011, 0.011, 0.012, 0.014, 0.016, 0.021,
234 0.037, 0.039, 0.042, 0.055, 0.04, 0.074, 0.09, 0.1, 0.14, 0.15, 0.162, 0.162,
235 0.162, 0.12, 0.105, 0.1, 0.09, 0.1, 0.085, 0.1, 0.1, 0.1, 0.1, 0.115, 0.12,
236 0.22, 0.28, 0.28, 0.24, 0.32, 0.42, 0.5, 0.6 };
240 static std::vector< std::vector<double>::iterator > grid_iter_list;
241 grid_iter_list.push_back(wavelengths.begin());
244 static std::array<size_t, 1> grid_sizes;
245 grid_sizes[0] = wavelengths.size();
247 static size_t num_elements = grid_sizes[0];
249 static std::array<size_t, 1> grid_sizes_small;
250 grid_sizes_small[0] = nWvlengthsDust;
252 static size_t num_elements_small = grid_sizes_small[0];
254 res_sand_o_re = std::shared_ptr<InterpMultilinear<1, double > >
256 (grid_iter_list.begin(), grid_sizes.begin(), sand_o_re, sand_o_re + num_elements));
257 res_sand_e_re = std::shared_ptr<InterpMultilinear<1, double > >
259 (grid_iter_list.begin(), grid_sizes.begin(), sand_e_re, sand_e_re + num_elements));
260 res_dust_re = std::shared_ptr<InterpMultilinear<1, double > >
262 (grid_iter_list.begin(), grid_sizes_small.begin(), dust_re, dust_re + num_elements_small));
263 res_sand_o_im = std::shared_ptr<InterpMultilinear<1, double > >
265 (grid_iter_list.begin(), grid_sizes.begin(), sand_o_im, sand_o_im + num_elements));
266 res_sand_e_im = std::shared_ptr<InterpMultilinear<1, double > >
268 (grid_iter_list.begin(), grid_sizes.begin(), sand_e_im, sand_e_im + num_elements));
269 res_dust_im = std::shared_ptr<InterpMultilinear<1, double > >
271 (grid_iter_list.begin(), grid_sizes_small.begin(), dust_im, dust_im + num_elements_small));
273 if (m == hanelBmedium::SAND_O_RE)
return res_sand_o_re;
274 else if (m == hanelBmedium::SAND_O_IM)
return res_sand_o_im;
275 else if (m == hanelBmedium::SAND_E_RE)
return res_sand_e_re;
276 else if (m == hanelBmedium::SAND_E_IM)
return res_sand_e_im;
277 else if (m == hanelBmedium::DUST_LIKE_RE)
return res_dust_re;
278 else if (m == hanelBmedium::DUST_LIKE_IM)
return res_dust_im;
280 .add<std::string>(
"Reason",
"Bad enum input for hanelBmedium. " 282 "case that the Hanel dielectric code can handle.");
294 if (f < 0 || f > 1000 || t > 273.15)
296 .add<
double>(
"Frequency (GHz)", f)
297 .add<double>(
"Temperature (K)", t)
298 .add<std::string>(
"Reason",
"Allowed freq. range (GHz) is (0,1000), and allowed temp. range is <= 273.15 K.");
300 double theta1 = 1.0 - (300.0 / t);
301 double eps0 = 77.66 - (103.3*theta1);
302 double eps1 = .0671*eps0;
304 double fp = (316.*theta1 + 146.4)*theta1 + 20.20;
308 eps = std::complex<double>(eps0 - eps1, 0) / std::complex<double>(1.0, f / fp)
309 + std::complex<double>(eps1 - eps2, 0) / std::complex<double>(1.0, f / fs)
310 + std::complex<double>(eps2, 0);
313 "mWaterLiebe result for freq: " << f <<
" temp " << t <<
" is " << m);
318 if (f < 0 || f > 500 || tK < 273.15)
320 .add<
double>(
"Frequency (GHz)", f)
321 .add<double>(
"Temperature (K)", tK)
322 .add<std::string>(
"Reason",
"Allowed freq. range (GHz) is (0,500), and temp. must be >= 273.15 K.");
324 const double as[11] = {
325 5.7230, 0.022379, -0.00071237, 5.0478,
326 -0.070315, 0.00060059, 3.6143, 0.028841,
327 0.13652, 0.0014825, 0.00024166
330 double tC = tK - 273.15;
331 if (tC < -20 || tC > 40)
333 .add<
double>(
"Frequency (GHz)", f)
334 .add<double>(
"Temperature (K)", tK)
335 .add<std::string>(
"Reason",
"Allowed temp. range (C) is (-20,40)");
339 double es = (37088.6 - (82.168*tC)) / (tC + 421.854);
341 double e1 = as[0] + (as[1] * tC) + (as[2] * tC*tC);
342 double nu1 = (45 + tC) / (as[3] + (tC*as[4]) + (tC*tC*as[5]));
343 double einf = as[6] + (tC*as[7]);
344 double nu2 = (45 + tC) / (as[8] + (tC*as[9]) + (tC*tC*as[10]));
347 const double oneover2pie0 = 17.97510;
351 eps = std::complex<double>(es - e1, 0) / (complex<double>(1, f / nu1));
352 eps += std::complex<double>(e1 - einf, 0) / (complex<double>(1, f / nu2));
353 eps += std::complex<double>(einf, -sigma * oneover2pie0 / f);
356 "mWaterFreshMeissnerWentz result for freq: " << f <<
" GHz temp " << tK <<
" K is " << m);
362 if (f < 0 || f > 1000 || t > 273.15)
364 .add<
double>(
"Frequency (GHz)", f)
365 .add<double>(
"Temperature (K)", t)
366 .add<std::string>(
"Reason",
"Allowed freq. range (GHz) is (0,1000), and allowed temp. range is <= 273.15 K.");
370 er = 3.1884 + 9.1e-4*(t - 273.0);
372 er = 3.1611 + 4.3e-4*(t - 243.0);
374 double theta = 300.0 / (t)-1.0;
375 double alpha = (0.00504 + 0.0062*theta)*exp(-22.1*theta);
376 double dbeta = exp(-9.963 + 0.0372*(t - 273.16));
377 const double B1 = 0.0207;
378 const double B2 = 1.16e-11;
379 const double b = 335;
380 double betam = B1 / t*exp(b / t) / pow((exp(b / t) - 1.0), 2) + B2*pow(f, 2.0);
381 double beta = betam + dbeta;
382 double ei = alpha / f + beta*f;
383 std::complex<double> e(er, -ei);
386 "mIceMatzler result for freq: " << f <<
" GHz and temp " << t <<
" K is " << m);
391 if (f < 0.167 || f > 8600 || t > -1 || t < -60)
393 .add<
double>(
"Frequency (GHz)", f)
394 .add<double>(
"Temperature (degC)", t)
395 .add<std::string>(
"Reason",
"Allowed freq. range (GHz) is (0.167,8600), and allowed temp. range is -60 - -1 deg C.");
398 static bool setup =
false;
399 static std::vector<double> tempCs, wavelengths;
400 static std::vector<double > vals_re, vals_im;
401 static std::shared_ptr<InterpMultilinear<2, double > > interp_ML_warren_re, interp_ML_warren_im;
402 auto setupWarren = [&]()
404 std::lock_guard<std::mutex> lock(
m_setup);
407 tempCs.push_back(-1); tempCs.push_back(-5); tempCs.push_back(-20); tempCs.push_back(-60);
408 wavelengths.reserve(62);
409 vals_re.reserve(600); vals_im.reserve(600);
412 static const double tbl[] = {
413 .1670, 1.8296, 8.30e-2, 1.8296, 8.30e-2, 1.8296, 8.30e-2, 1.8296, 8.30e-2,
414 .1778, 1.8236, 6.90e-2, 1.8236, 6.90e-2, 1.8236, 6.90e-2, 1.8236, 6.90e-2,
415 .1884, 1.8315, 5.70e-2, 1.8315, 5.70e-2, 1.8315, 5.70e-2, 1.8315, 5.70e-2,
416 .1995, 1.8275, 4.56e-2, 1.8275, 4.56e-2, 1.8275, 4.56e-2, 1.8275, 4.45e-2,
417 .2113, 1.8222, 3.79e-2, 1.8222, 3.79e-2, 1.8222, 3.79e-2, 1.8222, 3.55e-2,
418 .2239, 1.8172, 3.14e-2, 1.8172, 3.14e-2, 1.8172, 3.14e-2, 1.8172, 2.91e-2,
419 .2371, 1.8120, 2.62e-2, 1.8120, 2.62e-2, 1.8120, 2.62e-2, 1.8120, 2.44e-2,
420 .2512, 1.8070, 2.24e-2, 1.8070, 2.24e-2, 1.8070, 2.19e-2, 1.8070, 1.97e-2,
421 .2661, 1.8025, 1.96e-2, 1.8025, 1.96e-2, 1.8025, 1.88e-2, 1.8025, 1.67e-2,
422 .2818, 1.7983, 1.76e-2, 1.7983, 1.76e-2, 1.7983, 1.66e-2, 1.7983, 1.40e-2,
423 .2985, 1.7948, 1.67e-2, 1.7948, 1.67e-2, 1.7948, 1.54e-2, 1.7948, 1.26e-2,
424 .3162, 1.7921, 1.62e-2, 1.7921, 1.60e-2, 1.7921, 1.47e-2, 1.7921, 1.08e-2,
425 .3548, 1.7884, 1.55e-2, 1.7884, 1.50e-2, 1.7884, 1.35e-2, 1.7884, 8.90e-3,
426 .3981, 1.7860, 1.47e-2, 1.7860, 1.40e-2, 1.7860, 1.25e-2, 1.7860, 7.34e-3,
427 .4467, 1.7843, 1.39e-2, 1.7843, 1.31e-2, 1.7843, 1.15e-2, 1.7843, 6.40e-3,
428 .5012, 1.7832, 1.32e-2, 1.7832, 1.23e-2, 1.7832, 1.06e-2, 1.7832, 5.60e-3,
429 .5623, 1.7825, 1.25e-2, 1.7825, 1.15e-2, 1.7825, 9.77e-3, 1.7825, 5.00e-3,
430 .6310, 1.7820, 1.18e-2, 1.7820, 1.08e-2, 1.7820, 9.01e-3, 1.7820, 4.52e-3,
431 .7943, 1.7817, 1.06e-2, 1.7817, 9.46e-3, 1.7816, 7.66e-3, 1.7815, 3.68e-3,
432 1.000, 1.7816, 9.54e-3, 1.7816, 8.29e-3, 1.7814, 6.52e-3, 1.7807, 2.99e-3,
433 1.259, 1.7819, 8.56e-3, 1.7819, 7.27e-3, 1.7816, 5.54e-3, 1.7801, 2.49e-3,
434 2.500, 1.7830, 6.21e-3, 1.7830, 4.91e-3, 1.7822, 3.42e-3, 1.7789, 1.55e-3,
435 5.000, 1.7843, 4.49e-3, 1.7843, 3.30e-3, 1.7831, 2.10e-3, 1.7779, 9.61e-4,
436 10.00, 1.7852, 3.24e-3, 1.7852, 2.22e-3, 1.7838, 1.29e-3, 1.7773, 5.95e-4,
437 20.00, 1.7862, 2.34e-3, 1.7861, 1.49e-3, 1.7839, 7.93e-4, 1.7772, 3.69e-4,
438 32.00, 1.7866, 1.88e-3, 1.7863, 1.14e-3, 1.7840, 5.70e-4, 1.7772, 2.67e-4,
439 35.00, 1.7868, 1.74e-3, 1.7864, 1.06e-3, 1.7840, 5.35e-4, 1.7772, 2.51e-4,
440 40.00, 1.7869, 1.50e-3, 1.7865, 9.48e-4, 1.7840, 4.82e-4, 1.7772, 2.29e-4,
441 45.00, 1.7870, 1.32e-3, 1.7865, 8.50e-4, 1.7840, 4.38e-4, 1.7772, 2.11e-4,
442 50.00, 1.7870, 1.16e-3, 1.7865, 7.66e-4, 1.7840, 4.08e-4, 1.7772, 1.96e-4,
443 60.00, 1.7871, 8.80e-4, 1.7865, 6.30e-4, 1.7839, 3.50e-4, 1.7772, 1.73e-4,
444 70.00, 1.7871, 6.95e-4, 1.7865, 5.20e-4, 1.7838, 3.20e-4, 1.7772, 1.55e-4,
445 90.00, 1.7872, 4.64e-4, 1.7865, 3.84e-4, 1.7837, 2.55e-4, 1.7772, 1.31e-4,
446 111.0, 1.7872, 3.40e-4, 1.7865, 2.96e-4, 1.7837, 2.12e-4, 1.7772, 1.13e-4,
447 120.0, 1.7872, 3.11e-4, 1.7865, 2.70e-4, 1.7837, 2.00e-4, 1.7772, 1.06e-4,
448 130.0, 1.7872, 2.94e-4, 1.7865, 2.52e-4, 1.7837, 1.86e-4, 1.7772, 9.90e-5,
449 140.0, 1.7872, 2.79e-4, 1.7865, 2.44e-4, 1.7837, 1.75e-4, 1.7772, 9.30e-5,
450 150.0, 1.7872, 2.70e-4, 1.7865, 2.36e-4, 1.7837, 1.66e-4, 1.7772, 8.73e-5,
451 160.0, 1.7872, 2.64e-4, 1.7865, 2.30e-4, 1.7837, 1.56e-4, 1.7772, 8.30e-5,
452 170.0, 1.7872, 2.58e-4, 1.7865, 2.28e-4, 1.7837, 1.49e-4, 1.7772, 7.87e-5,
453 180.0, 1.7872, 2.52e-4, 1.7865, 2.25e-4, 1.7837, 1.44e-4, 1.7772, 7.50e-5,
454 200.0, 1.7872, 2.49e-4, 1.7865, 2.20e-4, 1.7837, 1.35e-4, 1.7772, 6.83e-5,
455 250.0, 1.7872, 2.54e-4, 1.7865, 2.16e-4, 1.7837, 1.21e-4, 1.7772, 5.60e-5,
456 290.0, 1.7872, 2.64e-4, 1.7865, 2.17e-4, 1.7837, 1.16e-4, 1.7772, 4.96e-5,
457 320.0, 1.7872, 2.74e-4, 1.7865, 2.20e-4, 1.7837, 1.16e-4, 1.7772, 4.55e-5,
458 350.0, 1.7872, 2.89e-4, 1.7665, 2.25e-4, 1.7837, 1.17e-4, 1.7772, 4.21e-5,
459 380.0, 1.7872, 3.05e-4, 1.7865, 2.32e-4, 1.7837, 1.20e-4, 1.7772, 3.91e-5,
460 400.0, 1.7872, 3.15e-4, 1.7865, 2.39e-4, 1.7837, 1.23e-4, 1.7772, 3.76e-5,
461 450.0, 1.7872, 3.46e-4, 1.7865, 2.60e-4, 1.7837, 1.32e-4, 1.7772, 3.40e-5,
462 500.0, 1.7872, 3.82e-4, 1.7865, 2.86e-4, 1.7837, 1.44e-4, 1.7772, 3.10e-5,
463 600.0, 1.7872, 4.62e-4, 1.7865, 3.56e-4, 1.7837, 1.68e-4, 1.7772, 2.64e-5,
464 640.0, 1.7872, 5.00e-4, 1.7865, 3.83e-4, 1.7837, 1.80e-4, 1.7772, 2.51e-5,
465 680.0, 1.7872, 5.50e-4, 1.7865, 4.15e-4, 1.7837, 1.90e-4, 1.7772, 2.43e-5,
466 720.0, 1.7872, 5.95e-4, 1.7865, 4.45e-4, 1.7837, 2.09e-4, 1.7772, 2.39e-5,
467 760.0, 1.7872, 6.47e-4, 1.7865, 4.76e-4, 1.7837, 2.16e-4, 1.7772, 2.37e-5,
468 800.0, 1.7872, 6.92e-4, 1.7865, 5.08e-4, 1.7837, 2.29e-4, 1.7772, 2.38e-5,
469 840.0, 1.7872, 7.42e-4, 1.7865, 5.40e-4, 1.7837, 2.40e-4, 1.7772, 2.40e-5,
470 900.0, 1.7872, 8.20e-4, 1.7865, 5.86e-4, 1.7837, 2.60e-4, 1.7772, 2.46e-5,
471 1000., 1.7872, 9.70e-4, 1.7865, 6.78e-4, 1.7837, 2.92e-4, 1.7772, 2.66e-5,
472 2000., 1.7872, 1.95e-3, 1.7865, 1.28e-3, 1.7837, 6.10e-4, 1.7772, 4.45e-5,
473 5000., 1.7872, 5.78e-3, 1.7865, 3.55e-3, 1.7840, 1.02e-3, 1.7772, 8.70e-5,
474 8600., 1.7880, 9.70e-3, 1.7872, 5.60e-3, 1.7845, 1.81e-3, 1.7780, 1.32e-4
477 for (
size_t i = 0; i < 558; ++i)
479 if (i % 9 == 0) wavelengths.push_back(tbl[i]);
480 else if (i % 9 == 1 || i % 9 == 3 || i % 9 == 5 || i % 9 == 7) vals_re.push_back(tbl[i]);
481 else vals_im.push_back(tbl[i]);
484 static std::vector< std::vector<double>::iterator > grid_iter_list;
485 grid_iter_list.push_back(tempCs.begin());
486 grid_iter_list.push_back(wavelengths.begin());
489 static std::array<size_t, 2> grid_sizes;
490 grid_sizes[0] = tempCs.size();
491 grid_sizes[1] = wavelengths.size();
493 static size_t num_elements = grid_sizes[0] * grid_sizes[1];
497 (grid_iter_list.begin(), grid_sizes.begin(), vals_re.data(), vals_re.data() + num_elements));
499 (grid_iter_list.begin(), grid_sizes.begin(), vals_im.data(), vals_im.data() + num_elements));
509 std::array<double, 2> args = { wvlen, t - 273.15 };
510 m = std::complex<double>(interp_ML_warren_re->interp(args.begin()),
511 -1.0 * interp_ML_warren_im->interp(args.begin()));
518 if (lambda < 0.2 || lambda > 30000)
520 .add<
double>(
"Wavelength (um)", lambda)
521 .add<std::string>(
"Reason",
"Allowed wavelength range (um) is (0.2,30000).");
523 array<double, 1> args = { lambda };
524 m = std::complex<double>(
setupHanelA(hanelAmedium::WATER_RE)->interp(args),
525 -1.0 *
setupHanelA(hanelAmedium::WATER_IM)->interp(args));
531 if (lambda < 0.2 || lambda > 30000)
533 .add<
double>(
"Wavelength (um)", lambda)
534 .add<std::string>(
"Reason",
"Allowed wavelength range (um) is (0.2,30000).");
536 array<double, 1> args = { lambda };
537 m = std::complex<double>(
setupHanelA(hanelAmedium::ICE_RE)->interp(args),
538 -1.0 *
setupHanelA(hanelAmedium::ICE_IM)->interp(args));
544 if (lambda < 0.2 || lambda > 30000)
546 .add<
double>(
"Wavelength (um)", lambda)
547 .add<std::string>(
"Reason",
"Allowed wavelength range (um) is (0.2,30000).");
550 array<double, 1> args = { lambda };
551 m = std::complex<double>(
setupHanelA(hanelAmedium::NACL_RE)->interp(args),
552 -1.0 *
setupHanelA(hanelAmedium::NACL_IM)->interp(args));
558 if (lambda < 0.2 || lambda > 30000)
560 .add<
double>(
"Wavelength (um)", lambda)
561 .add<std::string>(
"Reason",
"Allowed wavelength range (um) is (0.2,30000).");
563 array<double, 1> args = { lambda };
564 m = std::complex<double>(
setupHanelA(hanelAmedium::SEASALT_RE)->interp(args),
565 -1.0 *
setupHanelA(hanelAmedium::SEASALT_IM)->interp(args));
571 if (lambda < 0.2 || lambda > 300)
573 .add<
double>(
"Wavelength (um)", lambda)
574 .add<std::string>(
"Reason",
"Allowed wavelength range (um) is (0.2,300).");
576 array<double, 1> args = { lambda };
577 m = std::complex<double>(
setupHanelB(hanelBmedium::DUST_LIKE_RE)->interp(args),
578 -1.0 *
setupHanelB(hanelBmedium::DUST_LIKE_IM)->interp(args));
584 if (lambda < 0.2 || lambda > 300)
586 .add<
double>(
"Wavelength (um)", lambda)
587 .add<std::string>(
"Reason",
"Allowed wavelength range (um) is (0.2,300).");
589 array<double, 1> args = { lambda };
590 m = std::complex<double>(
setupHanelB(hanelBmedium::SAND_O_RE)->interp(args),
591 -1.0 *
setupHanelB(hanelBmedium::SAND_O_IM)->interp(args));
597 if (lambda < 0.2 || lambda > 300)
599 .add<
double>(
"Wavelength (um)", lambda)
600 .add<std::string>(
"Reason",
"Allowed wavelength range (um) is (0.2,300).");
602 array<double, 1> args = { lambda };
603 m = std::complex<double>(
setupHanelB(hanelBmedium::SAND_E_RE)->interp(args),
604 -1.0 *
setupHanelB(hanelBmedium::SAND_E_IM)->interp(args));
std::shared_ptr< InterpMultilinear< 1, double > > setupHanelA(hanelAmedium m)
void mIceWarren(double f, double t, std::complex< double > &m)
Ice complex refractive index for microwave/uv.
void mWaterHanel(double lambda, std::complex< double > &m)
Water complex refractive index for ir/vis.
void mIceMatzler(double f, double t, std::complex< double > &m)
void mNaClHanel(double lambda, std::complex< double > &m)
Sodium chloride refractive index for ir/vis.
void mSandEHanel(double lambda, std::complex< double > &m)
Sand E-ray refractive index for ir/vis (birefringent)
void mSandOHanel(double lambda, std::complex< double > &m)
Sand O-ray refractvie index for ir/vis (birefringent)
Perform interconversions between frequency, wavelength and wavenumber (GHz, Hz, m, cm, um, cm^-1, m^-1)
void mDustHanel(double lambda, std::complex< double > &m)
Dust-like particle refractive index for ir/vis.
void mWaterLiebe(double f, double t, std::complex< double > &m)
virtual double convert(double inVal) const
void mWaterFreshMeissnerWentz(double f, double t, std::complex< double > &m)
std::shared_ptr< InterpMultilinear< 1, double > > setupHanelB(hanelBmedium m)
#define ICEDB_log(c, p, x)
void mIceHanel(double lambda, std::complex< double > &m)
Ice complex refractive index for ir/vis.
void mSeaSaltHanel(double lambda, std::complex< double > &m)
Sea salt refractive index for ir/vis.