|
@@ -5,19 +5,27 @@
|
|
|
<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>
|
|
|
</head>
|
|
|
-<body>
|
|
|
-WL from <input type="number" id="fromWL" step="any" value="400.0">
|
|
|
+<body onload=runMie()>
|
|
|
+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="5"><br>
|
|
|
+step <input type="number" id="stepWL" step="any" value="0.1"><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" autofocus>Run Mie!</button> <span id="time"></span>
|
|
|
-<div id="PlotQsca" style="width:640px;height:580px;" ></div>
|
|
|
- <script src="/nmie.js"></script>
|
|
|
+<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>
|
|
|
+ const total_mode_n = 4;
|
|
|
+ var mode_n, mode_types;
|
|
|
+ var WLs, layout, trace1, trace2;
|
|
|
+ var 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){
|
|
@@ -25,8 +33,9 @@ Im(n): <input type="number" id="imN" step="any" value="0.01"><br>
|
|
|
return this[this.length - 1];
|
|
|
};
|
|
|
};
|
|
|
- Module.addOnPostRun(() => {
|
|
|
- Evaluate.onclick = () => {
|
|
|
+ // Module.addOnPostRun(() => {
|
|
|
+ // test.onclick =runMie()});
|
|
|
+ function runMie() {
|
|
|
const nmie = new Module.nmie()
|
|
|
var t0 = performance.now();
|
|
|
var fromWL = parseFloat(document.getElementById("fromWL").value);
|
|
@@ -35,46 +44,44 @@ Im(n): <input type="number" id="imN" step="any" value="0.01"><br>
|
|
|
var R = parseFloat(document.getElementById("R").value);
|
|
|
var reN = parseFloat(document.getElementById("reN").value);
|
|
|
var imN = parseFloat(document.getElementById("imN").value);
|
|
|
+ Qsca = [], Qabs = [];
|
|
|
+ Qsca_n = [[],[]], Qabs_n = [[],[]];
|
|
|
nmie.ClearTarget();
|
|
|
nmie.AddTargetLayerReIm(R, reN, imN)
|
|
|
- var WLs = range(fromWL,toWL,stepWL)
|
|
|
- var Qsca = [], Qabs = [];
|
|
|
- var Qsca_n = [[],[]], Qabs_n = [[],[]];
|
|
|
- var mode_n = range(1,4)
|
|
|
- var mode_n1 = range(1,5)
|
|
|
- var mode_types = range(0,2)
|
|
|
+ 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_n1.forEach(function (n) {
|
|
|
+ mode_n.forEach(function (n) {
|
|
|
Qsca_n[mode_type].push([]);
|
|
|
Qabs_n[mode_type].push([]);
|
|
|
});
|
|
|
});
|
|
|
WLs.forEach(function(WL) {
|
|
|
- console.log(WL)
|
|
|
+ // console.log(WL)
|
|
|
nmie.SetModeNmaxAndType(-1, -1);
|
|
|
nmie.SetWavelength(WL);
|
|
|
nmie.RunMieCalculation();
|
|
|
Qsca.push(nmie.GetQsca());
|
|
|
Qabs.push(nmie.GetQabs());
|
|
|
- mode_n.forEach(function (n) {
|
|
|
- mode_types.forEach(function(mode_type) {
|
|
|
- console.log(mode_type,n-1,Qsca_n[mode_type,0,n-1])
|
|
|
+ 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());
|
|
|
+ Qsca_n[mode_type][n-1].push(nmie.GetQsca());
|
|
|
+ Qabs_n[mode_type][n-1].push(nmie.GetQabs());
|
|
|
});
|
|
|
});
|
|
|
});
|
|
|
- console.log('Qsca_n = ', Qsca_n);
|
|
|
- var trace1 = {
|
|
|
+ // console.log('Qsca_n = ', Qsca_n);
|
|
|
+ trace1 = {
|
|
|
x: WLs,
|
|
|
y: Qsca,
|
|
|
type: 'scatter',
|
|
|
name: 'Qsca'
|
|
|
};
|
|
|
|
|
|
- var trace2 = {
|
|
|
+ trace2 = {
|
|
|
x: WLs,
|
|
|
y: Qabs,
|
|
|
type: 'scatter',
|
|
@@ -82,7 +89,7 @@ Im(n): <input type="number" id="imN" step="any" value="0.01"><br>
|
|
|
};
|
|
|
|
|
|
var data = [trace1, trace2];
|
|
|
- var layout = {
|
|
|
+ layout = {
|
|
|
title: {
|
|
|
text:'Mie calculation',
|
|
|
// font: {
|
|
@@ -111,13 +118,63 @@ Im(n): <input type="number" id="imN" step="any" value="0.01"><br>
|
|
|
// color: '#7f7f7f'
|
|
|
// }
|
|
|
}
|
|
|
+ },
|
|
|
+ margin: {
|
|
|
+ l: 35,
|
|
|
+ r: 25,
|
|
|
+ b: 35,
|
|
|
+ t: 25,
|
|
|
+ pad: 4
|
|
|
}
|
|
|
};
|
|
|
Plotly.newPlot('PlotQsca', data, layout, {showSendToCloud: true, displaylogo: false});
|
|
|
var t1 = performance.now();
|
|
|
document.getElementById("time").innerHTML = "It took " + ((t1 - t0)/1000).toFixed(2) + " s.";
|
|
|
+
|
|
|
+ mode_names = ['E','H'];
|
|
|
+ var 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();\"> ";
|
|
|
+ document.getElementById("Selector").innerHTML = tmp1;
|
|
|
+
|
|
|
+
|
|
|
};
|
|
|
- })
|
|
|
+
|
|
|
+ function replot() {
|
|
|
+ var checkBoxQabs = document.getElementById("Qabs");
|
|
|
+ var data = [trace1];
|
|
|
+ if (checkBoxQabs.checked == true) data.push(trace2);
|
|
|
+ mode_types.forEach(function(mode_type) {
|
|
|
+ mode_n.forEach(function (n) {
|
|
|
+ var checkBox = document.getElementById(mode_names[mode_type]+n.toString());
|
|
|
+ if (checkBox.checked == false) return;
|
|
|
+ var 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 == false) return;
|
|
|
+ var 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>
|