123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- <!DOCTYPE html>
- <html lang="en" xmlns="http://www.w3.org/1999/html">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <meta http-equiv="X-UA-Compatible" content="ie=edge">
- <title>Scattnlay web</title>
- <link rel="stylesheet" type="text/css" href="nmie.css">
- <!-- <script src="https://cdn.plot.ly/plotly-latest.min.js"></script>-->
- <script src="plotly-latest.min.js"></script>
- <!-- Yandex.Metrika counter -->
- <script type="text/javascript" >
- (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
- 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)})
- (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
- ym(54984811, "init", {
- clickmap:true,
- trackLinks:true,
- accurateTrackBounce:true
- });
- </script>
- <noscript><div><img src="https://mc.yandex.ru/watch/54984811" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
- <!-- /Yandex.Metrika counter -->
- </head>
- <body>
- <div id="Usage" style="font-size: small;">
- <span style="text-decoration: underline;text-emphasis: before;">Usage:</span>
- Feel free to use provided software, however, use it at your own risk. We make our best effort to verify
- it is correct, however, we do not provide any warranty.
- <p>
- If it was usefull for your project, please, cite in your related paper the following reference:
- <div style="font-style: italic">Mie calculation of electromagnetic near-field for a multilayered sphere</div>
- Konstantin Ladutenko, Umapada Pal, Antonio Rivera, Ovidio Peña-Rodríguez<br>
- <span style="font-weight: bold">Comp. Phys. Comm., vol. 214, pp. 225–230, 2017</span></p>
- </div>
- WL from <input type="number" id="fromWL" step="any" value="300.0">
- to <input type="number" id="toWL" step="any" value="1000">
- step <input type="number" id="stepWL" step="any" value="0.5"><br>
- R: <input type="number" id="R" step="any" value="100">
- Re(n): <input type="number" id="reN" step="any" value="4">
- Im(n): <input type="number" id="imN" step="any" value="0.01"><br>
- <button id="Evaluate" onclick=runMie() autofocus>Run Mie!</button> <span id="time"></span>
- <div id="Selector"></div>
- <div id="PlotQsca" style="height:70%;">
- <!-- style="width:840px;height:580px;"-->
- </div>
- <script src="nmie.js"></script>
- <script>
- 'use strict';
- // var importObject = {
- // imports: { nmie: arg => console.log(arg) }
- // };
- //
- // fetch('nmie.wasm').then(response =>
- // response.arrayBuffer()
- // ).then(bytes =>
- // WebAssembly.instantiate(bytes, importObject)
- // ).then(results => {
- // results.instance.exports.nmie();
- // });
- const total_mode_n = 4;
- let mode_n, mode_types;
- let mode_names = ['E','H'];
- let WLs, layout, trace1, trace2;
- let Qsca, Qabs, Qsca_n, Qabs_n;
- const range = (start, stop, step = 1) =>
- Array(Math.ceil((stop - start) / step)).fill(start).map((x, y) => x + y * step);
- if (!Array.prototype.last){
- Array.prototype.last = function(){
- return this[this.length - 1];
- };
- };
- // Module.addOnPostRun(() => {
- // test.onclick =runMie()});
- function runMie() {
- document.getElementById("Usage").style.display = 'none';
- const nmie = new Module.nmie()
- let t0 = performance.now();
- let fromWL = parseFloat(document.getElementById("fromWL").value);
- let toWL = parseFloat(document.getElementById("toWL").value);
- let stepWL = parseFloat(document.getElementById("stepWL").value);
- let R = parseFloat(document.getElementById("R").value);
- let reN = parseFloat(document.getElementById("reN").value);
- let imN = parseFloat(document.getElementById("imN").value);
- Qsca = [], Qabs = [];
- Qsca_n = [[],[]], Qabs_n = [[],[]];
- nmie.ClearTarget();
- nmie.AddTargetLayerReIm(R, reN, imN)
- WLs = range(fromWL,toWL,stepWL)
- mode_n = range(1,total_mode_n+1)
- mode_types = range(0,2)
- mode_types.forEach(function(mode_type) {
- mode_n.forEach(function (n) {
- Qsca_n[mode_type].push([]);
- Qabs_n[mode_type].push([]);
- });
- });
- WLs.forEach(function(WL) {
- // console.log(WL)
- nmie.SetModeNmaxAndType(-1, -1);
- nmie.SetWavelength(WL);
- nmie.RunMieCalculation();
- Qsca.push(nmie.GetQsca());
- Qabs.push(nmie.GetQabs());
- mode_types.forEach(function(mode_type) {
- mode_n.forEach(function (n) {
- nmie.SetModeNmaxAndType(n,mode_type);
- nmie.RunMieCalculation();
- Qsca_n[mode_type][n-1].push(nmie.GetQsca());
- Qabs_n[mode_type][n-1].push(nmie.GetQabs());
- });
- });
- });
- // console.log('Qsca_n = ', Qsca_n);
- trace1 = {
- x: WLs,
- y: Qsca,
- type: 'scatter',
- name: 'Qsca'
- };
- trace2 = {
- x: WLs,
- y: Qabs,
- type: 'scatter',
- name: 'Qabs'
- };
- let data = [trace1, trace2];
- layout = {
- title: {
- text:'Mie calculation',
- // font: {
- // family: 'Courier New, monospace',
- // size: 24
- // },
- xref: 'paper',
- x: 0.05,
- },
- xaxis: {
- title: {
- text: 'Wavelength',
- // font: {
- // family: 'Courier New, monospace',
- // size: 18,
- // color: '#7f7f7f'
- // }
- },
- },
- yaxis: {
- title: {
- text: 'Q',
- // font: {
- // family: 'Courier New, monospace',
- // size: 18,
- // color: '#7f7f7f'
- // }
- }
- },
- margin: {
- l: 35,
- r: 25,
- b: 35,
- t: 25,
- pad: 4
- }
- };
- Plotly.newPlot('PlotQsca', data, layout, {showSendToCloud: true, displaylogo: false});
- let t1 = performance.now();
- document.getElementById("time").innerHTML = "It took " + ((t1 - t0)/1000).toFixed(2) + " s.";
- let tmp1 = " ";
- mode_types.forEach(function(mode_type) {
- tmp1 += mode_names[mode_type]+" -> ";
- mode_n.forEach(function (n) {
- tmp1 += n.toString()+
- "<input type=\"checkbox\" id=\""+mode_names[mode_type]+n.toString()
- +"\" unchecked onclick=\"replot();\"> ";
- });
- tmp1 += "<br>";
- });
- tmp1 +="Qabs <input type=\"checkbox\" id=\"Qabs\" checked onclick=\"replot();\"> ";
- tmp1 +="Qsca <input type=\"checkbox\" id=\"Qsca\" checked onclick=\"replot();\"> ";
- document.getElementById("Selector").innerHTML = tmp1;
- };
- function replot() {
- let checkBoxQabs = document.getElementById("Qabs");
- let checkBoxQsca = document.getElementById("Qsca");
- let data = [];
- if (checkBoxQabs.checked == true) data.push(trace2);
- if (checkBoxQsca.checked == true) data.push(trace1);
- mode_types.forEach(function(mode_type) {
- mode_n.forEach(function (n) {
- let checkBox = document.getElementById(mode_names[mode_type]+n.toString());
- if (checkBox.checked == false) return;
- if (checkBoxQsca.checked == true) {
- let trace_sca = {
- x: WLs,
- y: Qsca_n[mode_type][n - 1],
- type: 'scatter',
- name: 'Qsca ' + mode_names[mode_type] + n.toString()
- };
- data.push(trace_sca);
- };
- if (checkBoxQabs.checked == true) {
- let trace_abs = {
- x: WLs,
- y: Qabs_n[mode_type][n - 1],
- type: 'scatter',
- name: 'Qabs ' + mode_names[mode_type] + n.toString()
- };
- data.push(trace_abs);
- };
- });
- });
- Plotly.react('PlotQsca', data, layout, {showSendToCloud: true, displaylogo: false});
- }
- </script>
- </body>
- </html>
|