index.html 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. <!DOCTYPE html>
  2. <html lang="en" xmlns="http://www.w3.org/1999/html">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Scattnlay web</title>
  8. <link rel="stylesheet" type="text/css" href="nmie.css">
  9. <!-- <script src="https://cdn.plot.ly/plotly-latest.min.js"></script>-->
  10. <script src="plotly-latest.min.js"></script>
  11. <!-- Yandex.Metrika counter -->
  12. <script type="text/javascript" >
  13. (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
  14. m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})
  15. (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
  16. ym(54984811, "init", {
  17. clickmap:true,
  18. trackLinks:true,
  19. accurateTrackBounce:true
  20. });
  21. </script>
  22. <noscript><div><img src="https://mc.yandex.ru/watch/54984811" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
  23. <!-- /Yandex.Metrika counter -->
  24. </head>
  25. <body>
  26. <div id="Usage" style="font-size: small;">
  27. <span style="text-decoration: underline;text-emphasis: before;">Usage:</span>
  28. Feel free to use provided software, however, use it at your own risk. We make our best effort to verify
  29. it is correct, however, we do not provide any warranty.
  30. <p>
  31. If it was usefull for your project, please, cite in your related paper the following reference:
  32. <div style="font-style: italic">Mie calculation of electromagnetic near-field for a multilayered sphere</div>
  33. Konstantin Ladutenko, Umapada Pal, Antonio Rivera, Ovidio Peña-Rodríguez<br>
  34. <span style="font-weight: bold">Comp. Phys. Comm., vol. 214, pp. 225–230, 2017</span></p>
  35. </div>
  36. WL from <input type="number" id="fromWL" step="any" value="300.0">
  37. to <input type="number" id="toWL" step="any" value="1000">
  38. step <input type="number" id="stepWL" step="any" value="0.5"><br>
  39. R: <input type="number" id="R" step="any" value="100">
  40. Re(n): <input type="number" id="reN" step="any" value="4">
  41. Im(n): <input type="number" id="imN" step="any" value="0.01"><br>
  42. <button id="Evaluate" onclick=runMie() autofocus>Run Mie!</button> <span id="time"></span>
  43. <div id="Selector"></div>
  44. <div id="PlotQsca" style="height:70%;">
  45. <!-- style="width:840px;height:580px;"-->
  46. </div>
  47. <script src="nmie.js"></script>
  48. <script>
  49. 'use strict';
  50. // var importObject = {
  51. // imports: { nmie: arg => console.log(arg) }
  52. // };
  53. //
  54. // fetch('nmie.wasm').then(response =>
  55. // response.arrayBuffer()
  56. // ).then(bytes =>
  57. // WebAssembly.instantiate(bytes, importObject)
  58. // ).then(results => {
  59. // results.instance.exports.nmie();
  60. // });
  61. const total_mode_n = 4;
  62. let mode_n, mode_types;
  63. let mode_names = ['E','H'];
  64. let WLs, layout, trace1, trace2;
  65. let Qsca, Qabs, Qsca_n, Qabs_n;
  66. const range = (start, stop, step = 1) =>
  67. Array(Math.ceil((stop - start) / step)).fill(start).map((x, y) => x + y * step);
  68. if (!Array.prototype.last){
  69. Array.prototype.last = function(){
  70. return this[this.length - 1];
  71. };
  72. };
  73. // Module.addOnPostRun(() => {
  74. // test.onclick =runMie()});
  75. function runMie() {
  76. document.getElementById("Usage").style.display = 'none';
  77. const nmie = new Module.nmie()
  78. let t0 = performance.now();
  79. let fromWL = parseFloat(document.getElementById("fromWL").value);
  80. let toWL = parseFloat(document.getElementById("toWL").value);
  81. let stepWL = parseFloat(document.getElementById("stepWL").value);
  82. let R = parseFloat(document.getElementById("R").value);
  83. let reN = parseFloat(document.getElementById("reN").value);
  84. let imN = parseFloat(document.getElementById("imN").value);
  85. Qsca = [], Qabs = [];
  86. Qsca_n = [[],[]], Qabs_n = [[],[]];
  87. nmie.ClearTarget();
  88. nmie.AddTargetLayerReIm(R, reN, imN)
  89. WLs = range(fromWL,toWL,stepWL)
  90. mode_n = range(1,total_mode_n+1)
  91. mode_types = range(0,2)
  92. mode_types.forEach(function(mode_type) {
  93. mode_n.forEach(function (n) {
  94. Qsca_n[mode_type].push([]);
  95. Qabs_n[mode_type].push([]);
  96. });
  97. });
  98. WLs.forEach(function(WL) {
  99. // console.log(WL)
  100. nmie.SetModeNmaxAndType(-1, -1);
  101. nmie.SetWavelength(WL);
  102. nmie.RunMieCalculation();
  103. Qsca.push(nmie.GetQsca());
  104. Qabs.push(nmie.GetQabs());
  105. mode_types.forEach(function(mode_type) {
  106. mode_n.forEach(function (n) {
  107. nmie.SetModeNmaxAndType(n,mode_type);
  108. nmie.RunMieCalculation();
  109. Qsca_n[mode_type][n-1].push(nmie.GetQsca());
  110. Qabs_n[mode_type][n-1].push(nmie.GetQabs());
  111. });
  112. });
  113. });
  114. // console.log('Qsca_n = ', Qsca_n);
  115. trace1 = {
  116. x: WLs,
  117. y: Qsca,
  118. type: 'scatter',
  119. name: 'Qsca'
  120. };
  121. trace2 = {
  122. x: WLs,
  123. y: Qabs,
  124. type: 'scatter',
  125. name: 'Qabs'
  126. };
  127. let data = [trace1, trace2];
  128. layout = {
  129. title: {
  130. text:'Mie calculation',
  131. // font: {
  132. // family: 'Courier New, monospace',
  133. // size: 24
  134. // },
  135. xref: 'paper',
  136. x: 0.05,
  137. },
  138. xaxis: {
  139. title: {
  140. text: 'Wavelength',
  141. // font: {
  142. // family: 'Courier New, monospace',
  143. // size: 18,
  144. // color: '#7f7f7f'
  145. // }
  146. },
  147. },
  148. yaxis: {
  149. title: {
  150. text: 'Q',
  151. // font: {
  152. // family: 'Courier New, monospace',
  153. // size: 18,
  154. // color: '#7f7f7f'
  155. // }
  156. }
  157. },
  158. margin: {
  159. l: 35,
  160. r: 25,
  161. b: 35,
  162. t: 25,
  163. pad: 4
  164. }
  165. };
  166. Plotly.newPlot('PlotQsca', data, layout, {showSendToCloud: true, displaylogo: false});
  167. let t1 = performance.now();
  168. document.getElementById("time").innerHTML = "It took " + ((t1 - t0)/1000).toFixed(2) + " s.";
  169. let tmp1 = " ";
  170. mode_types.forEach(function(mode_type) {
  171. tmp1 += mode_names[mode_type]+" -> ";
  172. mode_n.forEach(function (n) {
  173. tmp1 += n.toString()+
  174. "<input type=\"checkbox\" id=\""+mode_names[mode_type]+n.toString()
  175. +"\" unchecked onclick=\"replot();\"> ";
  176. });
  177. tmp1 += "<br>";
  178. });
  179. tmp1 +="Qabs <input type=\"checkbox\" id=\"Qabs\" checked onclick=\"replot();\"> ";
  180. tmp1 +="Qsca <input type=\"checkbox\" id=\"Qsca\" checked onclick=\"replot();\"> ";
  181. document.getElementById("Selector").innerHTML = tmp1;
  182. };
  183. function replot() {
  184. let checkBoxQabs = document.getElementById("Qabs");
  185. let checkBoxQsca = document.getElementById("Qsca");
  186. let data = [];
  187. if (checkBoxQabs.checked == true) data.push(trace2);
  188. if (checkBoxQsca.checked == true) data.push(trace1);
  189. mode_types.forEach(function(mode_type) {
  190. mode_n.forEach(function (n) {
  191. let checkBox = document.getElementById(mode_names[mode_type]+n.toString());
  192. if (checkBox.checked == false) return;
  193. if (checkBoxQsca.checked == true) {
  194. let trace_sca = {
  195. x: WLs,
  196. y: Qsca_n[mode_type][n - 1],
  197. type: 'scatter',
  198. name: 'Qsca ' + mode_names[mode_type] + n.toString()
  199. };
  200. data.push(trace_sca);
  201. };
  202. if (checkBoxQabs.checked == true) {
  203. let trace_abs = {
  204. x: WLs,
  205. y: Qabs_n[mode_type][n - 1],
  206. type: 'scatter',
  207. name: 'Qabs ' + mode_names[mode_type] + n.toString()
  208. };
  209. data.push(trace_abs);
  210. };
  211. });
  212. });
  213. Plotly.react('PlotQsca', data, layout, {showSendToCloud: true, displaylogo: false});
  214. }
  215. </script>
  216. </body>
  217. </html>