29import matplotlib.pyplot
as plt
32''' Testing routine for different dipole formulations
34 run using "python vectorpotentialdipole_verify.py [arg1] [arg2]" where arg1 is a number from 0 to 4
35 for different test profile starting positions, directions, and dipole tilts.
37 If arg2 is present, the code also calculates verification of derivative terms.
39 Generates plots of magnetic field components for different dipole models along cuts through the
40 simulation domain. For derivative analysis, calculates the derivatives along said cuts analytically
41 and numerically and outputs the ratio.
46 testset = int(sys.argv[1])
57plt.switch_backend(
'Agg')
59outfilename =
"./vecpotdip_verify_"+str(testset)+
".png"
69 line_start = np.array([0,0,0])
74 line_start = np.array([0,0,0])
79 line_start = np.array([-3,-3,-3])
84 line_start = np.array([-3,-3,-3])
89 line_start = np.array([0,0,0])
92 tilt_angle_theta = 45.
94 line_start = np.array([0,0,0])
100 line_start = np.array([0,0,0])
102print(
"Test set "+str(testset)+
" line start "+str(line_start)+
" tilt phi "+str(tilt_angle_phi)+
" tilt theta "+str(tilt_angle_theta)+
" line theta "+str(line_theta))
104line_phi = np.array([0,45,80,90,110,135])*math.pi/180.
105line_theta = np.zeros(len(line_phi)) + line_theta * math.pi/180.
119fig.set_size_inches(20,30)
120nsubplots=len(line_theta)
121for i
in range(nsubplots):
122 fig.add_subplot(nsubplots,1,i+1)
125radii = np.arange(0.1,100,step)*RE
129fig.suptitle(
r"Profiles starting from ("+str(line_start[0])+
","+str(line_start[1])+
","+str(line_start[2])+
") [RE] with dipole tilt $\Phi="+str(int(tilt_angle_phi))+
"$, $\Theta="+str(int(tilt_angle_theta))+
"$", fontsize=fontsize)
131for i
in range(nsubplots):
135 ax.text(0.2,0.08,
r"profile with $\theta="+str(int(line_theta[i]*180./math.pi))+
"$, $\phi="+str(int(line_phi[i]*180./math.pi))+
"$",transform=ax.transAxes, bbox=dict(facecolor=
'white', alpha=0.7), fontsize=fontsize)
137 xv = line_start[0]*RE + radii*np.sin(line_phi[i])*np.cos(line_theta[i])
138 yv = line_start[1]*RE + radii*np.sin(line_phi[i])*np.sin(line_theta[i])
139 zv = line_start[2]*RE + radii*np.cos(line_phi[i])
141 B1 = np.zeros([nr,4])
142 B2 = np.zeros([nr,4])
143 B3 = np.zeros([nr,4])
144 B4 = np.zeros([nr,4])
148 B1[j,k] = dip.getX(xv[j],yv[j],zv[j],0,k,0)
149 B2[j,k] = dip.get_old(xv[j],yv[j],zv[j],0,k,0)
150 B3[j,k] = B2[j,k] + mdip.get_old(xv[j],yv[j],zv[j],0,k,0)
151 B4[j,k] = dip.get_ldp(xv[j],yv[j],zv[j],0,k,0)
152 B4[j,k] = B4[j,k] + mdip.get_ldp(xv[j],yv[j],zv[j],0,k,0)
153 if plotmagnitude
is True:
154 B1[j,3] = np.linalg.norm(B1[j,0:3])
155 B2[j,3] = np.linalg.norm(B2[j,0:3])
156 B3[j,3] = np.linalg.norm(B3[j,0:3])
157 B4[j,3] = np.linalg.norm(B4[j,0:3])
159 colors=[
'r',
'k',
'b',
'magenta']
160 coords = [
'x',
'y',
'z',
'mag']
163 if plotmagnitude
is True:
166 ax.plot(radiiRE, B1[:,k], c=colors[k], linestyle=
'-', linewidth=linewidth, label=
'vectorpot B'+coords[k], zorder=-10)
167 ax.plot(radiiRE, B2[:,k], c=colors[k], linestyle=
'--', linewidth=linewidth, label=
'regular B'+coords[k])
168 ax.plot(radiiRE, B3[:,k], c=colors[k], linestyle=
':', linewidth=linewidth, label=
'reg+mirror B'+coords[k])
169 if tilt_angle_phi<epsilon:
170 ax.plot(radiiRE, B4[:,k], c=colors[k], linestyle=
'-.', linewidth=linewidth, label=
'line+mirror B'+coords[k])
172 ax.set_xlabel(
r"$r$ [$r_\mathrm{E}$]", fontsize=fontsize)
175 ax.set_yscale(
'symlog', linthreshy=linthresh)
176 for item
in ax.get_xticklabels():
177 item.set_fontsize(fontsize)
178 for item
in ax.get_yticklabels():
179 item.set_fontsize(fontsize)
181 ylims = np.array(ax.get_ylim())
188handles, labels = axes[-1].get_legend_handles_labels()
189axes[-1].legend(handles, labels, fontsize=fontsize)
191fig.savefig(outfilename)
200 print(
"derivatives d"+coords[kkk])
201 dB1 = np.zeros([nr,3,3])
202 dB2 = np.zeros([nr,3,3])
203 dB3 = np.zeros([nr,3,3])
204 dB4 = np.zeros([nr,3,3])
208 fig.set_size_inches(20,30)
209 for i
in range(nsubplots):
210 fig.add_subplot(nsubplots,1,i+1)
211 axes = fig.get_axes()
213 fig.suptitle(
r"Numerical and analytical derivative ratios, profiles starting from ("+str(line_start[0])+
","+str(line_start[1])+
","+str(line_start[2])+
") [RE] with dipole tilt $\Phi="+str(int(tilt_angle_phi))+
"$, $\Theta="+str(int(tilt_angle_theta))+
"$", fontsize=fontsize)
215 for i
in range(nsubplots):
216 print(
"derivatives subplot ",i)
219 xv = line_start[0]*RE + radii*np.sin(line_phi[i])*np.cos(line_theta[i])
220 yv = line_start[1]*RE + radii*np.sin(line_phi[i])*np.sin(line_theta[i])
221 zv = line_start[2]*RE + radii*np.cos(line_phi[i])
225 B1[j,k] = dip.getX(xv[j],yv[j],zv[j],0,k,0)
226 B2[j,k] = dip.get_old(xv[j],yv[j],zv[j],0,k,0)
227 B3[j,k] = B2[j,k] + mdip.get_old(xv[j],yv[j],zv[j],0,k,0)
228 B4[j,k] = dip.get_ldp(xv[j],yv[j],zv[j],0,k,0)
229 B4[j,k] = B4[j,k] + mdip.get_ldp(xv[j],yv[j],zv[j],0,k,0)
232 dB1[j,k,kk] = dip.getX(xv[j],yv[j],zv[j],1,k,kk)
233 dB2[j,k,kk] = dip.get_old(xv[j],yv[j],zv[j],1,k,kk)
234 dB3[j,k,kk] = dB2[j,k,kk] + mdip.get_old(xv[j],yv[j],zv[j],1,k,kk)
235 dB4[j,k,kk] = dip.get_ldp(xv[j],yv[j],zv[j],1,k,kk)
236 dB4[j,k,kk] = dB4[j,k,kk] + mdip.get_ldp(xv[j],yv[j],zv[j],1,k,kk)
239 for j
in np.arange(1,nr-1):
244 cdbx=(dip.getX(xv[j]+step2*RE,yv[j],zv[j],0,k,0) - dip.getX(xv[j]-step2*RE,yv[j],zv[j],0,k,0))/(2*step2*RE)
245 if abs(cdbx) > epsilon*B1[j,k]:
246 dB1[j,k,0] = dB1[j,k,0]/cdbx
247 elif (
abs(cdbx)<epsilon*B1[j,k])
and (
abs(dB1[j,k,0])<epsilon*B1[j,k]):
251 if abs(B1[j,k])<epsilon:
254 cdbx=(dip.get_old(xv[j]+step2*RE,yv[j],zv[j],0,k,0) - dip.get_old(xv[j]-step2*RE,yv[j],zv[j],0,k,0))/(2*step2*RE)
255 if abs(cdbx) > epsilon*B2[j,k]:
256 dB2[j,k,0] = dB2[j,k,0]/cdbx
257 elif (
abs(cdbx)<epsilon*B2[j,k])
and (
abs(dB2[j,k,0])<epsilon*B2[j,k]):
261 if abs(B2[j,k])<epsilon:
264 cdbx=(dip.get_old(xv[j]+step2*RE,yv[j],zv[j],0,k,0)+mdip.get_old(xv[j]+step2*RE,yv[j],zv[j],0,k,0) - dip.get_old(xv[j]-step2*RE,yv[j],zv[j],0,k,0) - mdip.get_old(xv[j]-step2*RE,yv[j],zv[j],0,k,0))/(2*step2*RE)
265 if abs(cdbx) > epsilon*B3[j,k]:
266 dB3[j,k,0] = dB3[j,k,0]/cdbx
267 elif (
abs(cdbx)<epsilon*B3[j,k])
and (
abs(dB3[j,k,0])<epsilon*B3[j,k]):
271 if abs(B3[j,k])<epsilon:
274 cdbx=(dip.get_ldp(xv[j]+step2*RE,yv[j],zv[j],0,k,0)+mdip.get_ldp(xv[j]+step2*RE,yv[j],zv[j],0,k,0) - dip.get_ldp(xv[j]-step2*RE,yv[j],zv[j],0,k,0) - mdip.get_ldp(xv[j]-step2*RE,yv[j],zv[j],0,k,0))/(2*step2*RE)
275 if abs(cdbx) > epsilon*B4[j,k]:
276 dB4[j,k,0] = dB4[j,k,0]/cdbx
277 elif (
abs(cdbx)<epsilon*B4[j,k])
and (
abs(dB4[j,k,0])<epsilon*B4[j,k]):
281 if abs(B4[j,k])<epsilon:
286 cdby=(dip.getX(xv[j],yv[j]+step2*RE,zv[j],0,k,0) - dip.getX(xv[j],yv[j]-step2*RE,zv[j],0,k,0))/(2*step2*RE)
287 if abs(cdby) > epsilon*B1[j,k]:
288 dB1[j,k,1] = dB1[j,k,1]/cdby
289 elif (
abs(cdby)<epsilon*B1[j,k])
and (
abs(dB1[j,k,1])<epsilon*B1[j,k]):
293 if abs(B1[j,k])<epsilon:
296 cdby=(dip.get_old(xv[j],yv[j]+step2*RE,zv[j],0,k,0) - dip.get_old(xv[j],yv[j]-step2*RE,zv[j],0,k,0))/(2*step2*RE)
297 if abs(cdby) > epsilon*B2[j,k]:
298 dB2[j,k,1] = dB2[j,k,1]/cdby
299 elif (
abs(cdby)<epsilon*B2[j,k])
and (
abs(dB2[j,k,1])<epsilon*B2[j,k]):
303 if abs(B2[j,k])<epsilon:
306 cdby=(dip.get_old(xv[j],yv[j]+step2*RE,zv[j],0,k,0)+mdip.get_old(xv[j],yv[j]+step2*RE,zv[j],0,k,0) - dip.get_old(xv[j],yv[j]-step2*RE,zv[j],0,k,0) - mdip.get_old(xv[j],yv[j]-step2*RE,zv[j],0,k,0))/(2*step2*RE)
307 if abs(cdby) > epsilon*B3[j,k]:
308 dB3[j,k,1] = dB3[j,k,1]/cdby
309 elif (
abs(cdby)<epsilon*B3[j,k])
and (
abs(dB3[j,k,1])<epsilon*B3[j,k]):
313 if abs(B3[j,k])<epsilon:
316 cdby=(dip.get_ldp(xv[j],yv[j]+step2*RE,zv[j],0,k,0)+mdip.get_ldp(xv[j],yv[j]+step2*RE,zv[j],0,k,0) - dip.get_ldp(xv[j],yv[j]-step2*RE,zv[j],0,k,0) - mdip.get_ldp(xv[j],yv[j]-step2*RE,zv[j],0,k,0))/(2*step2*RE)
317 if abs(cdby) > epsilon*B4[j,k]:
318 dB4[j,k,1] = dB4[j,k,1]/cdby
319 elif (
abs(cdby)<epsilon*B4[j,k])
and (
abs(dB4[j,k,1])<epsilon*B4[j,k]):
323 if abs(B4[j,k])<epsilon:
328 cdbz=(dip.getX(xv[j],yv[j],zv[j]+step2*RE,0,k,0) - dip.getX(xv[j],yv[j],zv[j]-step2*RE,0,k,0))/(2*step2*RE)
329 if abs(cdbz) > epsilon*B1[j,k]:
330 dB1[j,k,2] = dB1[j,k,2]/cdbz
331 elif (
abs(cdbz)<epsilon*B1[j,k])
and (
abs(dB1[j,k,2])<epsilon*B1[j,k]):
335 if abs(B1[j,k])<epsilon:
338 cdbz=(dip.get_old(xv[j],yv[j],zv[j]+step2*RE,0,k,0) - dip.get_old(xv[j],yv[j],zv[j]-step2*RE,0,k,0))/(2*step2*RE)
339 if abs(cdbz) > epsilon*B2[j,k]:
340 dB2[j,k,2] = dB2[j,k,2]/cdbz
341 elif (
abs(cdbz)<epsilon*B2[j,k])
and (
abs(dB2[j,k,2])<epsilon*B2[j,k]):
345 if abs(B2[j,k])<epsilon:
348 cdbz=(dip.get_old(xv[j],yv[j],zv[j]+step2*RE,0,k,0)+mdip.get_old(xv[j],yv[j],zv[j]+step2*RE,0,k,0) - dip.get_old(xv[j],yv[j],zv[j]-step2*RE,0,k,0) - mdip.get_old(xv[j],yv[j],zv[j]-step2*RE,0,k,0))/(2*step2*RE)
349 if abs(cdbz) > epsilon*B3[j,k]:
350 dB3[j,k,2] = dB3[j,k,2]/cdbz
351 elif (
abs(cdbz)<epsilon*B3[j,k])
and (
abs(dB3[j,k,2])<epsilon*B3[j,k]):
355 if abs(B3[j,k])<epsilon:
358 cdbz=(dip.get_ldp(xv[j],yv[j],zv[j]+step2*RE,0,k,0)+mdip.get_ldp(xv[j],yv[j],zv[j]+step2*RE,0,k,0) - dip.get_ldp(xv[j],yv[j],zv[j]-step2*RE,0,k,0) - mdip.get_ldp(xv[j],yv[j],zv[j]-step2*RE,0,k,0))/(2*step2*RE)
359 if abs(cdbz) > epsilon*B4[j,k]:
360 dB4[j,k,2] = dB4[j,k,2]/cdbz
361 elif (
abs(cdbz)<epsilon*B4[j,k])
and (
abs(dB4[j,k,2])<epsilon*B4[j,k]):
365 if abs(B4[j,k])<epsilon:
368 print(np.ma.amin(np.ma.masked_invalid(dB1)),np.ma.amax(np.ma.masked_invalid(dB1)))
369 print(np.ma.amin(np.ma.masked_invalid(dB2)),np.ma.amax(np.ma.masked_invalid(dB2)))
370 print(np.ma.amin(np.ma.masked_invalid(dB3)),np.ma.amax(np.ma.masked_invalid(dB3)))
371 print(np.ma.amin(np.ma.masked_invalid(dB4)),np.ma.amax(np.ma.masked_invalid(dB4)))
379 coords = [
'x',
'y',
'z']
394 ax.plot(radiiRE, dB1[:,k,kkk], c=colors[k], linestyle=
'-', linewidth=linewidth, label=
'vectorpot dB'+coords[k]+
'/d'+coords[kkk])
395 ax.plot(radiiRE, dB2[:,k,kkk], c=colors[k], linestyle=
'--', linewidth=linewidth, label=
'regular dB'+coords[k]+
'/d'+coords[kkk])
396 ax.plot(radiiRE, dB3[:,k,kkk], c=colors[k], linestyle=
':', linewidth=linewidth, label=
'reg+mirror dB'+coords[k]+
'/d'+coords[kkk])
397 if tilt_angle_phi<epsilon:
398 ax.plot(radiiRE, dB4[:,k,kkk], c=colors[k], linestyle=
'-.', linewidth=linewidth, label=
'line+mirror dB'+coords[k]+
'/d'+coords[kkk])
400 ax.text(0.2,0.08,
r"profile with $\theta="+str(int(line_theta[i]*180./math.pi))+
"$, $\phi="+str(int(line_phi[i]*180./math.pi))+
"$",transform=ax.transAxes, bbox=dict(facecolor=
'white', alpha=0.7), fontsize=fontsize)
403 ax.set_xlabel(
r"$r$ [$r_\mathrm{E}$]", fontsize=fontsize)
408 ax.set_ylim([-.1,1.1])
410 for item
in ax.get_xticklabels():
411 item.set_fontsize(fontsize)
412 for item
in ax.get_yticklabels():
413 item.set_fontsize(fontsize)
415 handles, labels = axes[-1].get_legend_handles_labels()
416 axes[-1].legend(handles, labels, fontsize=fontsize).set_zorder(10)
418 fig.savefig(outfilename[:-4]+
"_d"+coords[kkk]+outfilename[-4:])
static ARCH_HOSTDEV VecSimple< T > abs(const VecSimple< T > &l)