瀏覽代碼

initial implementation of SaveSimulationNearField.vue

Konstantin Ladutenko 3 年之前
父節點
當前提交
409bc6bf3d

+ 1 - 1
guiapp/src/components/nearfield/GetNearFieldRefinedSettings.vue

@@ -9,7 +9,7 @@
       <div class="row justify-center items-baseline">
         <div class="col-auto text-center q-py-xs q-pr-md">
           <div :style="flexRowTitleStyle">
-            <span  class="text-italic">2<sup>&thinsp;nd</sup></span> side resolution
+            y-side resolution
           </div>
         </div>
         <div class="col-xs-grow col-sm">

+ 2 - 6
guiapp/src/components/nearfield/PlotNearField.vue

@@ -93,19 +93,15 @@ export default defineComponent({
           y.push(toUnits(yi + j * dx.value, units.value))
         }
       }
+      $store.commit('plotRuntime/setNearFieldCoords',{x:x, y:y})
       return {x:x, y:y}
     })
 
     const limitFrom = computed( ()=>$store.state.plotRuntime.nearFieldLimitFrom )
     const limitTo = computed(()=>$store.state.plotRuntime.nearFieldLimitTo )
 
-    const nearFieldEk = computed( ()=>$store.state.plotRuntime.nearFieldEk)
-    const nearFieldHk = computed( ()=>$store.state.plotRuntime.nearFieldHk)
-    const nearFieldEH = computed( ()=>$store.state.plotRuntime.nearFieldEH)
     const nearFieldStore = computed(()=>{
-      let nearFieldStoreLocal = nearFieldEk.value
-      if (crossSection.value == nearFieldPlane.Hk) nearFieldStoreLocal = nearFieldHk.value
-      if (crossSection.value == nearFieldPlane.EH) nearFieldStoreLocal = nearFieldEH.value
+      let nearFieldStoreLocal = $store.state.plotRuntime.nearFieldEabs
       $store.commit('plotRuntime/setNearFieldDataTo', getMaxFromHeatmap(nearFieldStoreLocal))
       $store.commit('plotRuntime/setNearFieldDataFrom', getMinFromHeatmap(nearFieldStoreLocal))
       $store.commit('plotRuntime/setNearFieldLimitTo', $store.state.plotRuntime.nearFieldDataTo)

+ 10 - 13
guiapp/src/components/nearfield/RunSimulationNearField.vue

@@ -19,13 +19,13 @@
           </template>
         </q-btn>
     </div>
-<!--    <div class="col-xs-grow col-sm q-px-xs">-->
-<!--      <div class="row justify-xs-center justify-sm-start items-baseline">-->
-<!--        <div class="col-auto">-->
-<!--          <SaveSimulationNearField/>-->
-<!--        </div>-->
-<!--      </div>-->
-<!--    </div>-->
+    <div class="col-xs-grow col-sm q-px-xs">
+      <div class="row justify-xs-center justify-sm-start items-baseline">
+        <div class="col-auto">
+          <SaveSimulationNearField/>
+        </div>
+      </div>
+    </div>
   </div>
 </template>
 
@@ -33,13 +33,12 @@
 import {computed, defineComponent, nextTick} from 'vue'
 import {useStore} from 'src/store'
 import {cloneDeep} from 'lodash'
-import {nearFieldPlane} from 'src/store/simulation-setup/state';
-// import SaveSimulationNearField from 'components/nearfield/SaveSimulationNearField.vue'
+import SaveSimulationNearField from 'components/nearfield/SaveSimulationNearField.vue'
 
 
 export default defineComponent({
   name: 'RunSimulationNearField',
-  // components: {SaveSimulationNearField},
+  components: {SaveSimulationNearField},
   setup() {
     const $store = useStore()
 
@@ -101,9 +100,7 @@ export default defineComponent({
                 isMarkUnconvergedAsNaN
             )
             const Eabs = nmie.GetFieldEabs()
-            if (crossSection == nearFieldPlane.Ek) $store.commit('plotRuntime/setNearFieldEk', Eabs)
-            if (crossSection == nearFieldPlane.Hk) $store.commit('plotRuntime/setNearFieldHk', Eabs)
-            if (crossSection == nearFieldPlane.EH) $store.commit('plotRuntime/setNearFieldEH', Eabs)
+            $store.commit('plotRuntime/setNearField', Eabs)
             const nmieTotalRunTime = (performance.now() - nmieStartedTime) / 1000
             // console.log('Total simulation time:', nmieTotalRunTime, 's')
             $store.commit('simulationSetup/setNmieNearFieldTotalRunTime', nmieTotalRunTime)

+ 80 - 0
guiapp/src/components/nearfield/SaveSimulationNearField.vue

@@ -0,0 +1,80 @@
+<template>
+  <q-btn
+      color="primary"
+      no-caps
+      :disable="data ? false : true"
+      @click="saveSpectrumSimulation"
+  >Save</q-btn>
+</template>
+
+<script lang="ts">
+import {
+  computed,
+  defineComponent,
+    // ref,
+  // watch
+  // nextTick
+} from 'vue'
+import {useStore} from 'src/store'
+// import {getModeName, range, rangeInt} from 'components/utils'
+// import {cloneDeep} from 'lodash'
+import {saveAs} from 'file-saver'
+// import {nearFieldPlane} from 'src/store/simulation-setup/state';
+
+
+export default defineComponent({
+  name: 'SaveSimulationNearField',
+
+  setup() {
+    const $store = useStore()
+
+
+    const coordX = computed(() => $store.state.plotRuntime.nearFieldCoordX)
+    const coordY = computed(() => $store.state.plotRuntime.nearFieldCoordY)
+    const data = computed(() => $store.state.plotRuntime.nearFieldEabs)
+
+    return {
+      data,
+      saveSpectrumSimulation(){
+        if (!data.value) return
+        const fileHeader = '# # You can open and plot this file using Python\n' +
+            '# # (without manually removing this header, it will be skipped), see example below.\n' +
+            '# import numpy as np\n' +
+            '# from matplotlib import pyplot as plt\n' +
+            '# data = np.genfromtxt(\'scattnlay-spectra.txt\', skip_header=21, names=True, delimiter=\', \')\n' +
+            '# x = data[data.dtype.names[0]] # x-axis has units\n' +
+            '# # Possible labels for spectrum data: Qsca, Qabs, Qext,\n' +
+            '# # Qsca_E_dipole, etc. (see last comment before spectra data)\n' +
+            '# a = data[\'Qsca\']\n' +
+            '# b = data[\'Qsca_E_dipole\']\n' +
+            '# c = data[\'Qsca_H_dipole\']\n' +
+            '# \n' +
+            '# plt.figure()\n' +
+            '# plt.plot(x, a, label=\'Qsca\')\n' +
+            '# plt.plot(x, b, label=\'Qsca E dipole\')\n' +
+            '# plt.plot(x, c, label=\'Qsca H dipole\')\n' +
+            '# plt.legend()\n' +
+            '# plt.xlabel(data.dtype.names[0].replace(\'_\', \', \'))\n' +
+            '# plt.ylabel(\'Normalized cross-sections\')\n' +
+            '# plt.show()\n\n'
+        let columnNames = '# X, Y, Eabs\n'
+        let body = ''
+        for (let i = 0; i < data.value.length; ++i) {
+          let row = coordX.value[i].toString() + ', '
+              + coordY.value[i].toString() + ', '
+              + data.value[i].toString()
+          row += '\n'
+          body += row
+        }
+
+        const scattnlayNearField = new Blob([fileHeader+columnNames+body
+            ],
+            {type: 'text/plain;charset=utf-8',
+              endings: 'native'}  //TODO test if newline is correctly written in Windows, MacOS
+        )
+        saveAs(scattnlayNearField, 'scattnlay-near-field.txt');
+      }
+    }
+  },
+})
+</script>

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

@@ -6,9 +6,11 @@ import { getModeName, toUnits } from 'components/utils'
 
 
 const mutation: MutationTree<prsi> = {
-  setNearFieldEk (state: prsi, val: Float64Array) {state.nearFieldEk = cloneDeep(val)},
-  setNearFieldHk (state: prsi, val: Float64Array) {state.nearFieldHk = cloneDeep(val)},
-  setNearFieldEH (state: prsi, val: Float64Array) {state.nearFieldEH = cloneDeep(val)},
+  setNearField (state: prsi, val: Float64Array) {state.nearFieldEabs = cloneDeep(val)},
+  setNearFieldCoords (state: prsi, val: {x:number[], y:number[]} ) {
+    state.nearFieldCoordX = cloneDeep(val.x)
+    state.nearFieldCoordY = cloneDeep(val.y)
+  },
   setNearFieldDataFrom (state: prsi, val: number) {state.nearFieldDataFrom = val},
   setNearFieldDataTo (state: prsi, val: number) {state.nearFieldDataTo = val},
   setNearFieldLimitFrom (state: prsi, val: number) {state.nearFieldLimitFrom = val},

+ 8 - 7
guiapp/src/store/plot-runtime/state.ts

@@ -18,9 +18,9 @@ export interface spectraData {
 
 export interface plotRuntimeStateInterface {
   // Near field
-  nearFieldEk:Float64Array|undefined
-  nearFieldHk:Float64Array|undefined
-  nearFieldEH:Float64Array|undefined
+  nearFieldEabs:Float64Array|undefined
+  nearFieldCoordX: number []
+  nearFieldCoordY: number []
   nearFieldDataFrom: number
   nearFieldDataTo: number
   nearFieldLimitFrom: number
@@ -50,9 +50,9 @@ export interface plotRuntimeStateInterface {
 }
 
 function state(): plotRuntimeStateInterface {
-  const nearFieldEk = undefined
-  const nearFieldEH = undefined
-  const nearFieldHk = undefined
+  const nearFieldEabs = undefined
+  const nearFieldCoordX:number[] = []
+  const nearFieldCoordY:number[] = []
   const nearFieldDataFrom = 0
   const nearFieldDataTo = 1e300
   const nearFieldLimitFrom = 0
@@ -109,7 +109,8 @@ function state(): plotRuntimeStateInterface {
   const isLogPlot = false
 
   return {
-    nearFieldEk, nearFieldHk, nearFieldEH,
+    nearFieldEabs: nearFieldEabs,
+    nearFieldCoordX, nearFieldCoordY,
     nearFieldDataFrom,  nearFieldDataTo,
     nearFieldLimitFrom, nearFieldLimitTo,
     WLs, WLsInUnits,