#!/usr/bin/python3 # This is based on the code snippet at https://commons.wikimedia.org/wiki/File:VFPt_dipole.svg . from math import * from vectorfieldplot import FieldplotDocument,Field,FieldLine # ... https://github.com/CD3/VectorFieldPlot import logging logging.basicConfig(level=logging.ERROR) # can be DEBUG, INFO, WARNING, or ERROR doc = FieldplotDocument('dipole', width=800, height=600, commons=True) k=1 # 3 for first panel field = Field({'dipoles':[[k,0,1,0]]}) n = 16 for i in range(n): a = 2.0 * pi * (0.5 + i) / n line = FieldLine(field, [1+k+cos(a), sin(a)], maxr=1000, directions='both', pass_dipoles=0) doc.draw_line(line, arrows_style=None) doc.write()
#!/usr/bin/python3 from math import * from vectorfieldplot import FieldplotDocument, Field, FieldLine # ... https://github.com/CD3/VectorFieldPlot print("generating files a.svg") # paste this code at the end of VectorFieldPlot 1.0 doc = FieldplotDocument('a', width=600, height=600, commons=True) #field = Field({'homogeneous':[[1,3]]}) a = 0.33 # ratio of constant field to current in wire curr = 0.045 # current in wire field = Field({'wires': [[0, 0, -curr]], 'homogeneous': [[a * curr, 0]]}) m = 10000 # controls resolution of search for appropriate starting points # spacing of field lines is dr/di propto 1/B propto r; this integrates to r=(const)exp(const*i) h = 3 # half-height of square box; is this right? spacing = 0.01 # extra factor to scale spacing, smaller gives smaller spacing last_nn = 999 f = 0.2 # .235 was too big # why is this needed???; bigger f excludes more double-counted lines; if f is too small, uniform # spacing at left side is disrupted by extra lines; if too big, disrupted by missing lines # Presumably this is because the software uses some units for I and B; if it was SI, then I would # expect this to be 0.5e-7...? for i in range(m): q = (i - m / 2.0) * 2.0 / m # ranges from -1 to 1 y = q * h r = abs(y) + 1.0e-6 if y > 0.0: s = 1.0 else: s = -1.0
from vectorfieldplot import FieldplotDocument, Field, FieldLine # ... https://github.com/CD3/VectorFieldPlot # based on https://commons.wikimedia.org/wiki/File:VFPt_cylindrical_coil.svg # author Geek3, GFDL size = 0.6 proportion = 4 l = size * proportion r = size * 1.0 exponent = 1.0 / 2.0 # run with exponent=1 to get a physically correct version doc = FieldplotDocument('naughty-solenoid') field = Field({'coils': [[0, 0, 0, r, l, 1]]}) n = 15 for i in range(n): a = (0.5 + i) / n a = (-1. + 2. * a) # ... after this, a ranges approximately from -1 to 1 a = copysign(abs(a)**exponent, a) # unphysical version for pedagogical use, students explain why it's impossible # makes field more intense near the walls # re copysign, see https://stackoverflow.com/questions/1986152/why-doesnt-python-have-a-sign-function a = a * size line = FieldLine(field, [0.0, a], directions='both', maxr=15.0) doc.draw_line(line, arrows_style={'dist': 3, 'offsets': [0., .5, .5, 1.]}) doc.draw_object( 'path', { 'style': 'fill:none; stroke:#808080; ' +
#!/usr/bin/python3 from math import * from vectorfieldplot import FieldplotDocument, Field, FieldLine # ... https://github.com/CD3/VectorFieldPlot print("generating file field-lines.svg") # paste this code at the end of VectorFieldPlot 1.0 doc = FieldplotDocument('field-lines', width=800, height=800) field = Field({'monopoles': [[0, -1, 1], [0, 1, -1]]}) n = 16 for i in range(n): a = (0.5 + i) / n a = 2.0 * pi * a line = FieldLine(field, [0, -1], start_v=[cos(a), sin(a)], directions='forward') doc.draw_line(line) doc.write()
#!/usr/bin/python3 from math import * from vectorfieldplot import FieldplotDocument, Field, FieldLine # ... https://github.com/CD3/VectorFieldPlot print("generating files u.svg, like charges") # paste this code at the end of VectorFieldPlot 1.0 doc = FieldplotDocument('u', width=800, height=800) field = Field({'monopoles': [[-1, 0, -1], [1, 0, -1]]}) doc.draw_charges(field) for x in [-1, 1]: line = FieldLine(field, [x, 0], start_v=[x, 0], directions='backward') doc.draw_line(line) n = 32 for i in range(n): a = 2.0 * pi * (0.5 + i) / n line = FieldLine(field, [10. * cos(a), 10. * sin(a)], directions='forward') doc.draw_line(line) doc.write() print("generating files v.svg, opposite charges") # paste this code at the end of VectorFieldPlot 1.0 doc = FieldplotDocument('v', width=800, height=800) field = Field({'monopoles': [[-1, 0, 1], [1, 0, -1]]}) doc.draw_charges(field) n = 16 for i in range(n): a = (0.5 + i) / n a = 2.0 * pi * a
from math import * from vectorfieldplot import FieldplotDocument, Field, FieldLine # ... https://github.com/CD3/VectorFieldPlot scale = 1 doc = FieldplotDocument('hw-conducting-sphere-in-uniform-field', width=600, height=600) field_direction = [0.0, -1.0] ball_radius = 1.2 * scale field = Field({ 'homogeneous': [field_direction], 'dipoles': [[ 0, 0, 4 * pi * ball_radius**3 * field_direction[0], 4 * pi * ball_radius**3 * field_direction[1] ]] }) n = 20 for i in range(n): a = -3 + 6 * (0.5 + i) / n line = FieldLine(field, [a * scale, 6 * scale], maxr=12, pass_dipoles=1) if abs((n - 1.) / 2. - i) > 7: off = 4 * [0.5] else: off = 4 * [0.25] doc.draw_line(line, arrows_style={ 'min_arrows': 2, 'max_arrows': 2, 'offsets': off, 'scale': 2.0
#!/usr/bin/python3 from math import * from vectorfieldplot import FieldplotDocument, Field, FieldLine # ... https://github.com/CD3/VectorFieldPlot print("generating files a.svg") # paste this code at the end of VectorFieldPlot 1.0 s = 1 # scale-down factor doc = FieldplotDocument('a', unit=100 / s) m = [[-0.3, 0, 1], [0.5, 0, -1], [0, -0.3, -1], [0.1, 1.3, 1]] field = Field({'monopoles': m}) doc.draw_charges(field) n = 64 k = 4 for i in range(n): a = (0.5 + i) / n a = 2.0 * pi * a for j in range(k): line = FieldLine(field, [m[j][0], m[j][1]], start_v=[cos(a), sin(a)], directions='forward') doc.draw_line(line, arrows_style=None) doc.write()
# inside the field is indeed constant Fxy = p / (2. * pi * R**3) else: # outside the field is exatly that of a point-dipole Fxy = (3. * sc.dot(p, r) * r - sc.dot(r, r) * p) / (4. * pi * d**5) return Fxy xy0 = sc.array([-1.5, 0.0]) xy1 = sc.array([1.5, 0.0]) p = sc.array([0.5, 0.5]) # magnetization R = 1.0 field = Field({ 'custom': [ lambda xy: spheremagnet_field(xy, p, xy0, R), lambda xy: spheremagnet_field(xy, p, xy1, R) ] }) # Start field lines uniformly spaced along a diameter of each sphere. # The lines on one side coincide, so only do half of the ones for the # first sphere. n = 32 first_sphere = True for xys in [xy0, xy1]: for i in range(n): if first_sphere and i >= n / 2: continue displ = R * (2 * (i + 0.5) / n - 1) * math.sqrt(0.5) p0 = (displ, -displ) + xys line = FieldLine(field,