Commit c2b9aa353d8f2f77ac0cd00663a8d6f633fcb7bd
1 parent
c0a2a7bb
Added scattering amplitude calculation.
Showing
4 changed files
with
104 additions
and
44 deletions
Show diff stats
msinput.inp
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 | ... | ... |