index.html 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <!DOCTYPE html>
  2. <html lang="en">
  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. </head>
  11. <body onload=runMie()>
  12. WL from <input type="number" id="fromWL" step="any" value="300.0">
  13. to <input type="number" id="toWL" step="any" value="1000">
  14. step <input type="number" id="stepWL" step="any" value="0.1"><br>
  15. R: <input type="number" id="R" step="any" value="100">
  16. Re(n): <input type="number" id="reN" step="any" value="4">
  17. Im(n): <input type="number" id="imN" step="any" value="0.01"><br>
  18. <button id="Evaluate" onclick=runMie() autofocus>Run Mie!</button> <span id="time"></span>
  19. <div id="Selector"></div>
  20. <div id="PlotQsca" style="height:70%;">
  21. <!-- style="width:840px;height:580px;"-->
  22. </div>
  23. <script src="nmie.js"></script>
  24. <script>
  25. const total_mode_n = 4;
  26. var mode_n, mode_types;
  27. var WLs, layout, trace1, trace2;
  28. var Qsca, Qabs, Qsca_n, Qabs_n;
  29. const range = (start, stop, step = 1) =>
  30. Array(Math.ceil((stop - start) / step)).fill(start).map((x, y) => x + y * step);
  31. if (!Array.prototype.last){
  32. Array.prototype.last = function(){
  33. return this[this.length - 1];
  34. };
  35. };
  36. // Module.addOnPostRun(() => {
  37. // test.onclick =runMie()});
  38. function runMie() {
  39. const nmie = new Module.nmie()
  40. var t0 = performance.now();
  41. var fromWL = parseFloat(document.getElementById("fromWL").value);
  42. var toWL = parseFloat(document.getElementById("toWL").value);
  43. var stepWL = parseFloat(document.getElementById("stepWL").value);
  44. var R = parseFloat(document.getElementById("R").value);
  45. var reN = parseFloat(document.getElementById("reN").value);
  46. var imN = parseFloat(document.getElementById("imN").value);
  47. Qsca = [], Qabs = [];
  48. Qsca_n = [[],[]], Qabs_n = [[],[]];
  49. nmie.ClearTarget();
  50. nmie.AddTargetLayerReIm(R, reN, imN)
  51. WLs = range(fromWL,toWL,stepWL)
  52. mode_n = range(1,total_mode_n+1)
  53. mode_types = range(0,2)
  54. mode_types.forEach(function(mode_type) {
  55. mode_n.forEach(function (n) {
  56. Qsca_n[mode_type].push([]);
  57. Qabs_n[mode_type].push([]);
  58. });
  59. });
  60. WLs.forEach(function(WL) {
  61. // console.log(WL)
  62. nmie.SetModeNmaxAndType(-1, -1);
  63. nmie.SetWavelength(WL);
  64. nmie.RunMieCalculation();
  65. Qsca.push(nmie.GetQsca());
  66. Qabs.push(nmie.GetQabs());
  67. mode_types.forEach(function(mode_type) {
  68. mode_n.forEach(function (n) {
  69. nmie.SetModeNmaxAndType(n,mode_type);
  70. nmie.RunMieCalculation();
  71. Qsca_n[mode_type][n-1].push(nmie.GetQsca());
  72. Qabs_n[mode_type][n-1].push(nmie.GetQabs());
  73. });
  74. });
  75. });
  76. // console.log('Qsca_n = ', Qsca_n);
  77. trace1 = {
  78. x: WLs,
  79. y: Qsca,
  80. type: 'scatter',
  81. name: 'Qsca'
  82. };
  83. trace2 = {
  84. x: WLs,
  85. y: Qabs,
  86. type: 'scatter',
  87. name: 'Qabs'
  88. };
  89. var data = [trace1, trace2];
  90. layout = {
  91. title: {
  92. text:'Mie calculation',
  93. // font: {
  94. // family: 'Courier New, monospace',
  95. // size: 24
  96. // },
  97. xref: 'paper',
  98. x: 0.05,
  99. },
  100. xaxis: {
  101. title: {
  102. text: 'Wavelength',
  103. // font: {
  104. // family: 'Courier New, monospace',
  105. // size: 18,
  106. // color: '#7f7f7f'
  107. // }
  108. },
  109. },
  110. yaxis: {
  111. title: {
  112. text: 'Q',
  113. // font: {
  114. // family: 'Courier New, monospace',
  115. // size: 18,
  116. // color: '#7f7f7f'
  117. // }
  118. }
  119. },
  120. margin: {
  121. l: 35,
  122. r: 25,
  123. b: 35,
  124. t: 25,
  125. pad: 4
  126. }
  127. };
  128. Plotly.newPlot('PlotQsca', data, layout, {showSendToCloud: true, displaylogo: false});
  129. var t1 = performance.now();
  130. document.getElementById("time").innerHTML = "It took " + ((t1 - t0)/1000).toFixed(2) + " s.";
  131. mode_names = ['E','H'];
  132. var tmp1 = " ";
  133. mode_types.forEach(function(mode_type) {
  134. tmp1 += mode_names[mode_type]+" -> ";
  135. mode_n.forEach(function (n) {
  136. tmp1 += n.toString()+
  137. "<input type=\"checkbox\" id=\""+mode_names[mode_type]+n.toString()
  138. +"\" unchecked onclick=\"replot();\"> ";
  139. });
  140. tmp1 += "<br>";
  141. });
  142. tmp1 +="Qabs <input type=\"checkbox\" id=\"Qabs\" checked onclick=\"replot();\"> ";
  143. document.getElementById("Selector").innerHTML = tmp1;
  144. };
  145. function replot() {
  146. var checkBoxQabs = document.getElementById("Qabs");
  147. var data = [trace1];
  148. if (checkBoxQabs.checked == true) data.push(trace2);
  149. mode_types.forEach(function(mode_type) {
  150. mode_n.forEach(function (n) {
  151. var checkBox = document.getElementById(mode_names[mode_type]+n.toString());
  152. if (checkBox.checked == false) return;
  153. var trace_sca = {
  154. x: WLs,
  155. y: Qsca_n[mode_type][n-1],
  156. type: 'scatter',
  157. name: 'Qsca '+mode_names[mode_type]+n.toString()
  158. };
  159. data.push(trace_sca)
  160. if (checkBoxQabs.checked == false) return;
  161. var trace_abs = {
  162. x: WLs,
  163. y: Qabs_n[mode_type][n-1],
  164. type: 'scatter',
  165. name: 'Qabs '+mode_names[mode_type]+n.toString()
  166. };
  167. data.push(trace_abs)
  168. });
  169. });
  170. Plotly.react('PlotQsca', data, layout, {showSendToCloud: true, displaylogo: false});
  171. }
  172. </script>
  173. </body>
  174. </html>