瀏覽代碼

update plot on change of source units

Konstantin Ladutenko 3 年之前
父節點
當前提交
56bd7059de

+ 1 - 16
guiapp/src/components/GetPlotSettings.vue

@@ -18,12 +18,6 @@
                     @focus="processInputFill"
           />
         </div>
-        <div class="col-auto q-py-xs q-px-sm">
-          <q-checkbox v-model="isRemovePlots" size="sm">
-            remove previous spectra
-          </q-checkbox>
-        </div>
-
       </div>
     </div>
   </div>
@@ -54,14 +48,6 @@ export default defineComponent({
       set: val => $store.commit('simulationSetup/setPlotLabel', val)
     })
 
-    const isRemovePlots = computed({
-      get: ()=> $store.state.plotRuntime.isRemovePlots,
-      set: val => {
-        $store.commit('plotRuntime/setIsRemovePlots', val)
-        $store.commit('plotRuntime/updateSpectraPlot')
-      }
-    })
-
     const shadowText = computed(()=>{
       const numberOfLayers = $store.state.simulationSetup.gui.layers.length
       let particleType = 'bulk'
@@ -73,8 +59,7 @@ export default defineComponent({
     })
 
     return { flexRowTitleStyle, basicSelectorWidthStyle, basicWidthStyle,
-      plotLabel, isRemovePlots,
-      shadowText,
+      plotLabel, shadowText,
 
       processInputFill (e:KeyboardEvent) {
         if (e === void 0) {

+ 19 - 4
guiapp/src/components/PlotSelector.vue

@@ -1,5 +1,12 @@
 <template>
   <div class="row items-baseline">
+    <div class="col-auto q-py-xs q-px-sm">
+      <q-checkbox v-model="isRemovePlots" size="sm">
+        remove previous spectra
+      </q-checkbox>
+    </div>
+  </div>
+  <div class="row items-baseline">
     <div class="col-xs-grow col-sm-auto q-px-sm">
       <q-table
               title="Values to plot"
@@ -69,6 +76,7 @@ import {
   } from 'vue'
 import { useStore } from 'src/store'
 import { cloneDeep } from 'lodash'
+import { getModeName} from 'components/utils'
 import { flexRowTitleStyle,
 } from 'components/config'
 
@@ -78,6 +86,15 @@ export default defineComponent({
 
   setup() {
     const $store = useStore()
+
+    const isRemovePlots = computed({
+      get: ()=> $store.state.plotRuntime.isRemovePlots,
+      set: val => {
+        $store.commit('plotRuntime/setIsRemovePlots', val)
+        $store.commit('plotRuntime/updateSpectraPlot')
+      }
+    })
+
     const isPlotQsca = computed({
       get: () => $store.state.plotRuntime.isPlotQsca,
       set: val => $store.commit('plotRuntime/setQscaPlotToggle', val)
@@ -146,10 +163,7 @@ export default defineComponent({
     const columns = computed(()=> {
       let columns = [{ name: 'name', label: '',  align: 'left', field: '', headerStyle:''}]
       for (let i=1; i<=guiNumberOfModes.value; ++i) {
-        let label_computed = Math.pow(2, i).toString()
-        if (i == 1) label_computed = 'dipole'
-        if (i == 2) label_computed = 'quadrupole'
-        if (i == 3) label_computed = 'octupole'
+        let label_computed = getModeName(i)
         let text_color = ''
         if (i > simulatedNumberOfModes.value ) text_color='color:LightGray'
         columns.push({
@@ -209,6 +223,7 @@ export default defineComponent({
     )
 
     return {flexRowTitleStyle,
+      isRemovePlots,
       isPlotQsca, isPlotQabs, isPlotQext,
       guiNumberOfModes, simulatedNumberOfModes,
       columns, rows,

+ 25 - 0
guiapp/src/components/PlotSpectra.vue

@@ -14,6 +14,7 @@ import {
   computed,
   watch
 } from 'vue'
+import { toUnits } from 'components/utils'
 
 export default defineComponent({
   name: 'PlotSpectra',
@@ -41,6 +42,30 @@ export default defineComponent({
     const isPlotModeH = computed( ()=>$store.state.plotRuntime.isPlotModeH)
     watch(isPlotModeH, ()=>$store.commit('plotRuntime/updateSpectraPlot'), { deep: true })
 
+    const sourceUnits = computed( ()=>$store.state.guiRuntime.sourceUnits)
+    function setPlotTitle() {
+      let title=''
+      if (sourceUnits.value.endsWith('Hz')) {
+        title = 'Frequency, ' + sourceUnits.value;
+      } else if (sourceUnits.value.endsWith('eV')) {
+        title = 'Energy, ' + sourceUnits.value;
+      } else if (sourceUnits.value.endsWith('s')) {
+        title = 'Period, ' + sourceUnits.value;
+      } else {
+        title = 'Wavelength, ' + sourceUnits.value;
+      }
+      $store.commit('plotRuntime/updateXAxisTitle', title)
+    }
+
+    function updateSpectraPlotUnits(){
+      setPlotTitle()
+      $store.commit('plotRuntime/setWLsInUnits', sourceUnits.value)
+      $store.commit('plotRuntime/updateSpectraPlot')
+    }
+
+    updateSpectraPlotUnits()
+    watch(sourceUnits, ()=> updateSpectraPlotUnits())
+
     return {}
   }
 })

+ 15 - 1
guiapp/src/components/RunSimulationSpectrum.vue

@@ -29,7 +29,7 @@ import {
   computed, watch,
 } from 'vue'
 import { useStore } from 'src/store'
-import { range, rangeInt } from 'components/utils'
+import {range, rangeInt, toUnits} from 'components/utils'
 import { cloneDeep } from 'lodash'
 
 export default defineComponent({
@@ -47,10 +47,21 @@ export default defineComponent({
 
     const isNmieLoaded = computed(()=>{ return $store.state.simulationSetup.isNmieLoaded })
 
+    const sourceUnits = computed( ()=>$store.state.guiRuntime.sourceUnits)
+
     function getWLs(){
       const fromWL = $store.state.simulationSetup.current.fromWL
       const toWL = $store.state.simulationSetup.current.toWL
       const pointsWL = $store.state.simulationSetup.current.pointsWL
+      if (sourceUnits.value.endsWith('Hz') || sourceUnits.value.endsWith('eV')) {
+        const fromF = 1./fromWL
+        const toF = 1./toWL
+        const stepF = (fromF-toF)/(pointsWL-1)
+        const Fs = range(toF, fromF, stepF);
+        let WLs = []
+        for (const f of Fs) WLs.push(1./f)
+        return WLs
+      }
       const stepWL = (toWL-fromWL)/(pointsWL-1)
       const WLs = range(fromWL, toWL, stepWL);
       return WLs
@@ -124,7 +135,10 @@ export default defineComponent({
           const nmieTotalRunTime = (performance.now()-nmieStartedTime)/1000
           // console.log('Total simulation time:', nmieTotalRunTime, 's')
           $store.commit('simulationSetup/setNmieTotalRunTime', nmieTotalRunTime)
+
           $store.commit('plotRuntime/setQ', {WLs, Qsca, Qabs, Qext, Qsca_n, Qabs_n, Qext_n})
+          $store.commit('plotRuntime/setWLsInUnits', sourceUnits.value)
+
           $store.commit('plotRuntime/updateNumberOfPlotsFromPreviousSimulations')
           $store.commit('plotRuntime/setCommonLabel', $store.state.simulationSetup.current.plotLabel)
           $store.commit('simulationSetup/setPlotLabel', '')

+ 7 - 0
guiapp/src/components/utils.ts

@@ -1,3 +1,10 @@
+export function getModeName(i:number) {
+    if (i == 1) return 'dipole'
+    if (i == 2) return 'quadrupole'
+    if (i == 3) return 'octupole'
+    return  Math.pow(2, i).toString()
+}
+
 export function isAlmostSame(a:number,b:number) {
     if ( Math.abs((a-b)/(a+b)) < 1e-15) return true
     return false

+ 1 - 1
guiapp/src/pages/Spectrum.vue

@@ -19,7 +19,7 @@
 <!--    </div>-->
     <div class="q-ma-sm"/>
     <PlotSelector/>
-    <div class="q-ma-sm"/>
+    <div class="q-ma-xs"/>
     <PlotSpectra/>
   </q-page>
 </template>

+ 52 - 5
guiapp/src/store/plot-runtime/mutations.ts

@@ -1,7 +1,9 @@
 import { MutationTree } from 'vuex'
-import { plotRuntimeStateInterface as prsi, spectraData } from './state'
-import {cloneDeep} from 'lodash'
+import { cloneDeep } from 'lodash'
 import { Data } from 'plotly.js-dist-min'
+import { plotRuntimeStateInterface as prsi, spectraData } from './state'
+import { getModeName, toUnits } from 'components/utils'
+
 
 const mutation: MutationTree<prsi> = {
   setQ (state: prsi, val: spectraData) {
@@ -14,6 +16,11 @@ const mutation: MutationTree<prsi> = {
     state.Qext_n = cloneDeep(val.Qext_n)
   },
 
+  setWLsInUnits (state:prsi, sourceUnits:string) {
+    state.WLsInUnits.length = 0
+    for (const WL of state.WLs) state.WLsInUnits.push(toUnits(WL, sourceUnits))
+  },
+
   setQscaPlotToggle (state: prsi, val: boolean) {state.isPlotQsca = val},
   setQabsPlotToggle (state: prsi, val: boolean) {state.isPlotQabs = val},
   setQextPlotToggle (state: prsi, val: boolean) {state.isPlotQext = val},
@@ -36,6 +43,10 @@ const mutation: MutationTree<prsi> = {
     for (let i = 0; i< val.length; ++i) state.isPlotModeH[i] = val[i]
   },
 
+  updateXAxisTitle (state:prsi, val:string) {
+    if (state.spectraPlot.layout.xaxis) state.spectraPlot.layout.xaxis.title = val
+  },
+
   updateNumberOfPlotsFromPreviousSimulations(state: prsi) {
     state.numberOfPlotsFromPreviousSimulations = state.spectraPlot.data.length
   },
@@ -46,7 +57,7 @@ const mutation: MutationTree<prsi> = {
     const label:string = state.commonLabel
     if (state.isPlotQscaTotal) {
       const traceQsca: Partial<Data> = {
-        x: state.WLs,
+        x: state.WLsInUnits,
         y: state.Qsca,
         type: 'scatter',
         name: 'Qsca '+label
@@ -56,7 +67,7 @@ const mutation: MutationTree<prsi> = {
 
     if (state.isPlotQabsTotal) {
       const traceQabs: Partial<Data> = {
-        x: state.WLs,
+        x: state.WLsInUnits,
         y: state.Qabs,
         type: 'scatter',
         name: 'Qabs '+label
@@ -66,7 +77,7 @@ const mutation: MutationTree<prsi> = {
 
     if (state.isPlotQextTotal) {
       const traceQext: Partial<Data> = {
-        x: state.WLs,
+        x: state.WLsInUnits,
         y: state.Qext,
         type: 'scatter',
         name: 'Qext '+label
@@ -74,6 +85,42 @@ const mutation: MutationTree<prsi> = {
       state.spectraPlot.data.push(traceQext)
     }
 
+    const typeNames = ['E', 'H']
+    const totalEvaluatedModes = state.Qsca_n[0].length
+
+    for (let modeType = 0; modeType < 2; ++modeType) {
+      for (let mode_n = 0; mode_n < totalEvaluatedModes; ++mode_n) {
+        const isPlotMode = modeType === 0 ? state.isPlotModeE : state.isPlotModeH;
+        if (!isPlotMode[mode_n]) continue;
+        if (state.isPlotQsca) {
+          const traceQsca: Partial<Data> = {
+            x: state.WLsInUnits,
+            y: state.Qsca_n[modeType][mode_n],
+            type: 'scatter',
+            name: 'Qsca ' + typeNames[modeType] + ' ' + getModeName(mode_n + 1)+' '+label
+          };
+          state.spectraPlot.data.push(traceQsca);
+        }
+        if (state.isPlotQabs) {
+          const traceQabs: Partial<Data> = {
+            x: state.WLsInUnits,
+            y: state.Qabs_n[modeType][mode_n],
+            type: 'scatter',
+            name: 'Qabs ' + typeNames[modeType] + ' ' + getModeName(mode_n + 1)+' '+label
+          };
+          state.spectraPlot.data.push(traceQabs);
+        }
+        if (state.isPlotQext) {
+          const traceQext: Partial<Data> = {
+            x: state.WLsInUnits,
+            y: state.Qext_n[modeType][mode_n],
+            type: 'scatter',
+            name: 'Qext ' + typeNames[modeType] + ' ' + getModeName(mode_n + 1)+' '+label
+          };
+          state.spectraPlot.data.push(traceQext);
+        }
+      }
+    }
 
 
   },

+ 5 - 3
guiapp/src/store/plot-runtime/state.ts

@@ -18,6 +18,7 @@ export interface spectraData {
 
 export interface plotRuntimeStateInterface {
   WLs: number[]
+  WLsInUnits: number[]
   Qsca:number[]
   Qabs:number[]
   Qext:number[]
@@ -40,15 +41,16 @@ export interface plotRuntimeStateInterface {
 
 function state(): plotRuntimeStateInterface {
   const WLs:number[] = []
+  const WLsInUnits:number[] = []
   const Qsca:number[] = [], Qabs:number[] = [], Qext:number[] = []
   const Qsca_n:number[][][] = [[], []]
   const Qabs_n:number[][][] = [[], []]
   const Qext_n:number[][][] = [[], []]
   const isPlotQsca = true
-  const isPlotQabs = true
+  const isPlotQabs = false
   const isPlotQext = false
   const isPlotQscaTotal = true
-  const isPlotQabsTotal = true
+  const isPlotQabsTotal = false
   const isPlotQextTotal = false
   const isPlotModeE:boolean[] = [true]
   const isPlotModeH:boolean[] = [true]
@@ -87,7 +89,7 @@ function state(): plotRuntimeStateInterface {
   }
   const isRemovePlots = true
 
-  return { WLs,
+  return { WLs, WLsInUnits,
     Qsca, Qabs, Qext, Qsca_n, Qabs_n, Qext_n,
     spectraPlot, isPlotQsca, isPlotQabs, isPlotQext,
     isPlotQscaTotal, isPlotQabsTotal, isPlotQextTotal,

+ 1 - 1
guiapp/src/store/simulation-setup/state.ts

@@ -29,7 +29,7 @@ export interface simulationSetupStateInterface {
 }
 
 function setupFactory(hostIndex = 1,
-                      fromWL = 300, toWL=1000, pointsWL=101, currentWL = 300,
+                      fromWL = 400, toWL=1000, pointsWL=201, currentWL = 400,
                       layers = [
                         {layerWidth:100, n:4, k:0.01,
                           materialName:'nk-constant',