Commit c2b9aa353d8f2f77ac0cd00663a8d6f633fcb7bd

Authored by dmayerich
1 parent c0a2a7bb

Added scattering amplitude calculation.

msinput.inp
... ... @@ -39,7 +39,7 @@ max_scattering_angle_deg
39 39 number_scattering_angles
40 40 181
41 41 normalize_scattering_matrix
42   -1
  42 +0
43 43 gaussian_beam_constant
44 44 0.0d0
45 45 gaussian_beam_focal_point
... ...
mstm-gui.py
... ... @@ -98,6 +98,7 @@ class GuiWindow(QtGui.QMainWindow):
98 98 #plot results of interest
99 99 wl = self.results['lambda']
100 100  
  101 + #for a fixed orientation
101 102 if int(self.params['fixed_or_random_orientation']) == 0:
102 103 unpol = self.results['extinction_unpolarized']
103 104 para = self.results['extinction_parallel']
... ... @@ -132,33 +133,19 @@ class GuiWindow(QtGui.QMainWindow):
132 133 self.results = RunSimulation(False)
133 134  
134 135 if self.params['calculate_near_field']:
135   - #verts = self.params['near_field_plane_vertices']
136   - #dx = (verts[2] - verts[0])/(self.params.nSteps)
137   - #x = arange(verts[0], verts[2], dx)
138   - #print(len(x))
139   - #y = arange(verts[1], verts[3], dx)
140   - #X, Y = meshgrid(x, y)
  136 +
141 137 E = array(self.results.gridNearField)
142   - #pcolor(X, Y, E, cmap=cm.RdBu)
143   - #colorbar()
144   - #axis([verts[0], verts[2], verts[1], verts[3]])
  138 +
145 139  
146 140 pcolor(E, cmap=cm.RdBu)
147 141 colorbar()
  142 +
  143 + #compute the maximum field magnitude in the plane
148 144 print("Maximum enhancement: " + str(abs(E).max()))
  145 +
  146 + #get the scattering amplitude matrix
  147 + print(self.results.scatAmpMatrix[0])
149 148  
150   - # make these smaller to increase the resolution
151   - #dx, dy = 0.05, 0.05
152   -
153   - #x = arange(-3.0, 3.0001, dx)
154   - #y = arange(-3.0, 3.0001, dy)
155   - #X,Y = meshgrid(x, y)
156   -
157   - #Z = self.func3(X, Y)
158   - #pcolor(X, Y, Z, cmap=cm.RdBu, vmax=abs(Z).max(), vmin=-abs(Z).max())
159   - #colorbar()
160   - #axis([-3,3,-3,3])
161   -
162 149 show()
163 150  
164 151 def saveresults(self):
... ... @@ -184,12 +171,12 @@ class GuiWindow(QtGui.QMainWindow):
184 171 a = self.ui.spinRadius.value()
185 172  
186 173 self.ui.tblSpheres.setItem(0, 0, QtGui.QTableWidgetItem(str(a)))
187   - self.ui.tblSpheres.setItem(0, 1, QtGui.QTableWidgetItem(str(-(d + 2*a)/2)))
  174 + self.ui.tblSpheres.setItem(0, 1, QtGui.QTableWidgetItem(str(-(d/2.0 + a))))
188 175 self.ui.tblSpheres.setItem(0, 2, QtGui.QTableWidgetItem(str(0.0)))
189 176 self.ui.tblSpheres.setItem(0, 3, QtGui.QTableWidgetItem(str(0.0)))
190 177  
191 178 self.ui.tblSpheres.setItem(1, 0, QtGui.QTableWidgetItem(str(a)))
192   - self.ui.tblSpheres.setItem(1, 1, QtGui.QTableWidgetItem(str((d + 2*a)/2)))
  179 + self.ui.tblSpheres.setItem(1, 1, QtGui.QTableWidgetItem(str((d/2.0 + a))))
193 180 self.ui.tblSpheres.setItem(1, 2, QtGui.QTableWidgetItem(str(0.0)))
194 181 self.ui.tblSpheres.setItem(1, 3, QtGui.QTableWidgetItem(str(0.0)))
195 182  
... ... @@ -315,6 +302,9 @@ def RunSimulation(spectralSim = True):
315 302  
316 303 if parameters['calculate_near_field']:
317 304 results.parseNearField('nf-temp.dat')
  305 +
  306 + #get the scattering amplitude matrix
  307 + results.calcScatteringAmp()
318 308  
319 309  
320 310 #update the progress bar
... ...
mstm-main-v2.2.f90
... ... @@ -348,31 +348,61 @@
348 348 write(1,'('' perpendicular total ext, abs, scat efficiencies'')')
349 349 write(1,'(6e13.5)') qexttotper,qabstotper,qscatotper
350 350 endif
351   -
  351 +
352 352 write(1,'('' scattering matrix elements'')')
353 353 if(normalizesm.eq.0) then
354   - write(1,'('' theta s11 s22 s33'',&
355   - &'' s44'',&
356   - &'' s21 s32 s43 s31'',&
357   - &'' s42 s41'')')
  354 + write(1,'('' theta s11 s12 s13'',&
  355 + &'' s14'',&
  356 + &'' s21 s22 s23 s24'',&
  357 + &'' s31 s32 s33 s34'',&
  358 + &'' s41 s42 s43 s44'')')
358 359 do i=1,numtheta
359 360 thetad=theta1d+(theta2d-theta1d)*(i-1)/max(1.d0,dble(numtheta-1))
360   - write(1,'(f8.2,10e12.4)') thetad,smt(1,1,i),smt(2,2,i),smt(3,3,i), &
361   - smt(4,4,i),smt(1,2,i),smt(2,3,i),smt(3,4,i),smt(1,3,i), &
362   - smt(2,4,i),smt(1,4,i)
  361 + write(1,'(f8.2,16e12.4)') thetad,smt(1,1,i),smt(2,1,i),smt(3,1,i), &
  362 + smt(4,1,i),smt(1,2,i),smt(2,2,i),smt(3,2,i),smt(4,2,i), &
  363 + smt(1,3,i),smt(2,3,i),smt(3,3,i),smt(4,3,i),smt(1,4,i), &
  364 + smt(2,4,i),smt(3,4,i),smt(4,4,i)
  365 +
  366 +! write(1,'('' scattering matrix elements'')')
  367 +! if(normalizesm.eq.0) then
  368 +! write(1,'('' theta s11 s22 s33'',&
  369 +! &'' s44'',&
  370 +! &'' s21 s32 s43 s31'',&
  371 +! &'' s42 s41'')')
  372 +! do i=1,numtheta
  373 +! thetad=theta1d+(theta2d-theta1d)*(i-1)/max(1.d0,dble(numtheta-1))
  374 +! write(1,'(f8.2,10e12.4)') thetad,smt(1,1,i),smt(2,2,i),smt(3,3,i), &
  375 +! smt(4,4,i),smt(1,2,i),smt(2,3,i),smt(3,4,i),smt(1,3,i), &
  376 +! smt(2,4,i),smt(1,4,i)
363 377 enddo
364 378 else
365   - write(1,'('' theta s11 s22/s11 s33'',&
366   - &''/s11 s44'',&
367   - &''/s11 s21/s11 s32/s11 s43/s11 s31'',&
368   - &''/s11 s42/s11 s41/s11'')')
  379 +!This code was changed by David Mayericha and Thomas van Dijk
  380 + write(1,'('' theta s11 s12/s11 s13'',&
  381 + &''/s11 s14'',&
  382 + &''/s11 s21/s11 s22/s11 s23/s11 s24'',&
  383 + &''/s11 s31/s11 s32/s11 s33/s11 s34'',&
  384 + &''/s11 s41/s11 s42/s11 s43/s11 s44/s11'')')
369 385 do i=1,numtheta
370 386 thetad=theta1d+(theta2d-theta1d)*(i-1)/max(1.d0,dble(numtheta-1))
371 387 s11=smt(1,1,i)
372   - write(1,'(f8.2,10e12.4)') thetad,smt(1,1,i),smt(2,2,i)/s11,smt(3,3,i)/s11, &
373   - smt(4,4,i)/s11,smt(1,2,i)/s11,smt(2,3,i)/s11,smt(3,4,i)/s11,smt(1,3,i)/s11, &
374   - smt(2,4,i)/s11,smt(1,4,i)/s11
  388 + write(1,'(f8.2,16e12.4)') thetad,smt(1,1,i),smt(2,1,i)/s11,smt(3,1,i)/s11, &
  389 + smt(4,1,i)/s11,smt(1,2,i)/s11,smt(2,2,i)/s11,smt(3,2,i)/s11,smt(4,2,i)/s11, &
  390 + smt(1,3,i)/s11,smt(2,3,i)/s11,smt(3,3,i)/s11,smt(4,3,i)/s11,smt(1,4,i)/s11, &
  391 + smt(2,4,i)/s11,smt(3,4,i)/s11,smt(4,4,i)/s11
375 392 enddo
  393 +
  394 +!original code here
  395 +! write(1,'('' theta s11 s22/s11 s33'',&
  396 +! &''/s11 s44'',&
  397 +! &''/s11 s21/s11 s32/s11 s43/s11 s31'',&
  398 +! &''/s11 s42/s11 s41/s11'')')
  399 +! do i=1,numtheta
  400 +! thetad=theta1d+(theta2d-theta1d)*(i-1)/max(1.d0,dble(numtheta-1))
  401 +! s11=smt(1,1,i)
  402 +! write(1,'(f8.2,10e12.4)') thetad,smt(1,1,i),smt(2,2,i)/s11,smt(3,3,i)/s11, &
  403 +! smt(4,4,i)/s11,smt(1,2,i)/s11,smt(2,3,i)/s11,smt(3,4,i)/s11,smt(1,3,i)/s11, &
  404 +! smt(2,4,i)/s11,smt(1,4,i)/s11
  405 +! enddo
376 406 endif
377 407 if(fixedorrandom.eq.1) then
378 408 write(1,'('' scattering matrix expansion coefficients'')')
... ...
mstm_simparser.py
  1 +#this code parses the results of a simulation and stores them in a SimParserClass structure
1 2 from pylab import *
2 3  
3 4 class SimParserClass:
... ... @@ -12,6 +13,10 @@ class SimParserClass:
12 13 gridNearField = []
13 14 maxNearField = []
14 15  
  16 + #the stokes matrix is read from the output
  17 + stokesMatrix = []
  18 + scatAmpMatrix = []
  19 +
15 20  
16 21 def __init__(self, parameters):
17 22  
... ... @@ -23,6 +28,7 @@ class SimParserClass:
23 28 self.simResults['extinction_parallel'] = list()
24 29 self.simResults['extinction_perpendicular'] = list()
25 30 self.simResults['extinction_total'] = list()
  31 + self.simResults['detector_field'] = list()
26 32  
27 33 self.gridNearField = []
28 34 self.maxNearField = []
... ... @@ -36,10 +42,17 @@ class SimParserClass:
36 42 while True:
37 43  
38 44 line = inFile.readline().strip()
39   -
  45 +
  46 + #if the simulation is for a single plane wave
40 47 if int(self.params['fixed_or_random_orientation']) == 0:
41 48 if line == 'scattering matrix elements':
42   - break
  49 + #empty the stokes matrix
  50 + self.stokesMatrix = []
  51 + inFile.readline()
  52 + for s in range(0, 181):
  53 + values = map(float, inFile.readline().strip().split())
  54 + self.stokesMatrix.append(values)
  55 + break;
43 56 elif line == 'unpolarized total ext, abs, scat efficiencies, w.r.t. xv, and asym. parm':
44 57 values = inFile.readline().strip().split(' ')
45 58 self.simResults['extinction_unpolarized'].append(values[0])
... ... @@ -49,7 +62,8 @@ class SimParserClass:
49 62 elif line == 'perpendicular total ext, abs, scat efficiencies':
50 63 values = inFile.readline().strip().split(' ')
51 64 self.simResults['extinction_perpendicular'].append(values[0])
52   -
  65 +
  66 + #if the simulation is for random orientations
53 67 else:
54 68 if line == 'scattering matrix elements':
55 69 break
... ... @@ -83,6 +97,31 @@ class SimParserClass:
83 97  
84 98 E = array(self.gridNearField)
85 99 self.maxNearField.append(abs(E).max())
  100 +
  101 + #calculate and return the scattering amplitude matrix
  102 + def calcScatteringAmp(self):
  103 + #compute the number of entries in the stokes matrix
  104 + nEntries = len(self.stokesMatrix)
  105 +
  106 + #initialize the scattering amplitude matrix to empty
  107 + self.scatAmpMatrix = []
  108 +
  109 + for s in range(0, nEntries):
  110 + Z = self.stokesMatrix[s]
  111 +
  112 + scatEntry = []
  113 + s11 = complex(sqrt(0.5 * (Z[1] - Z[2] - Z[5] + Z[6])), 0.0)
  114 + scatEntry.append(s11)
  115 + scatEntry.append(complex(-0.5 * (Z[3] + Z[7]) / s11, 0.5 * (Z[4] + Z[8]) / s11))
  116 + scatEntry.append(complex(-0.5 * (Z[9] + Z[10]) / s11, -0.5 * (Z[13] + Z[14]) / s11))
  117 + scatEntry.append(complex(0.5 * (Z[11] + Z[12]) / s11, -0.5 * (Z[12] - Z[15]) / s11))
  118 +
  119 + self.scatAmpMatrix.append(scatEntry)
  120 +
  121 + S = self.scatAmpMatrix[0]
  122 + E = [S[0], S[2]]
  123 + self.simResults['detector_field'].append(E)
  124 + print(E)
86 125  
87 126  
88 127 def saveFile(self, fileName):
... ... @@ -101,10 +140,11 @@ class SimParserClass:
101 140 result += '\t' + str(self.simResults['extinction_unpolarized'][i])
102 141 result += '\t' + str(self.simResults['extinction_parallel'][i])
103 142 result += '\t' + str(self.simResults['extinction_perpendicular'][i])
  143 + result += '\t' + str(self.simResults['detector_field'][i][0]) + '\t' + str(self.simResults['detector_field'][i][1])
104 144  
105 145 #parse the near field if it is included in the simulation
106   - if int(parameters['calculate_near_field']) == 1:
107   - result += '\t' + str(maxNearField)
  146 + #if int(parameters['calculate_near_field']) == 1:
  147 + # result += '\t' + str(maxNearField)
108 148  
109 149 result += '\n'
110 150 return result
... ...