# O-Day - Bagel updates 11 Jun 2022

### Detecting the oscillating magnetic fields, Free bagel builder, 3D printing and plating

#### Detecting the oscillating magnetic fields

It may only be possible to monitor the microtesla alternating magnetic fields from a bagel by using a ‘Flux Gate Magnetometer’. To understand what one is, and why it is likely the only practical solution sensitive and responsive enough, check out this NASA video:

NASA has more details in this article.

They are known for their speed and sensitivity. However, commercial versions can be VERY PRICY @ $6500 (PC Desktop) - $8000 (Mobile)!

Having said that, the TFM1186 can detect ±100 µT (±100 µT special order) with a resolution of 4 nT in all three axis at up to 68,000 samples per second with 1 sample = (Bx, By, Bz).

There is a potential to use a FAR FAR cheaper option, after all, we only need to see the time variation of the alternating micro tesla field on and oscilloscope as per the Zhvirblis paper. Therefore, one possibility is to use the 60 Euro sensors developed and sold here and develop some drive, interfacing and power to monitor them with an oscilloscope.

#### ‘Peter S.’ developed a free parametric bagel builder

Peter has developed an awesome tool using free software and an extended open code set to allow anyone to quickly produce permutations of bagel models which will allow export of STL models for 3D printing.

OpenSCAD is open source and free from here. He used a library that supports path extrude and did "git clone https://github.com/JustinSDK/dotSCAD" in the openscad library folder (which is how the includes are currently setup).

**Code for the ‘Bagel builder’**: https://pastebin.com/h5c9Ahm9

```
/**
* based off example from https://openhome.cc/eGossip/OpenSCAD/lib3x-path_extrude.html
**/
/*
*
* Version 0102a: First release with usability improvements
* Version 0103a: Fix for level 0 torus radius was calculating incorrectly, also added correct examples for D-4D using the torus center line for rad_p properly.
*/
use <dotSCAD/src/shape_circle.scad>;
use <dotSCAD/src/path_extrude.scad>;
use <dotSCAD/src/util/degrees.scad>;
function length_3d(lt) =
let(end = len(lt) - 1)
end == 0 ? lt[0] :
let(
cum_total = [
for(i = 0, s = 0, is_continue = i < end;
is_continue;
is_continue = i < end, s = is_continue ? s + sqrt((lt[i+1][0]-lt[i][0])^2+(lt[i+1][1]-lt[i][1])^2+(lt[i+1][2]-lt[i][2])^2) : undef, i = i + 1) s]
)
cum_total[end];
function single_torus_knot(q, rad, dir, phi_step) =
[
for(phi = 0; phi < 6.283185307179586; phi = phi + phi_step)
let(
phi_deg = degrees(phi),
l0_deg = phi_deg,
l1_deg = phi_deg/q[0],
l0_pos_x = rad[0]*cos(l0_deg),
l0_pos_y = 0,
l0_pos_z = rad[0]*sin(l0_deg)
)
[l0_pos_x,
l0_pos_y,
l0_pos_z]
];
function double_torus_knot(q, rad, dir, phi_step) =
[
for(phi = 0; phi < 6.283185307179586*q[0]; phi = phi + phi_step)
let(
phi_deg = degrees(phi),
l0_deg = -dir[0]*phi_deg,
l1_deg = phi_deg/q[0],
l0_pos_x = rad[0]*cos(l0_deg),
l0_pos_y = 0,
l0_pos_z = rad[0]*sin(l0_deg),
l1_pos_x = (l0_pos_x+rad[1])*cos(l1_deg)-l0_pos_y*sin(l1_deg),
l1_pos_y = (l0_pos_x+rad[1])*sin(l1_deg)+l0_pos_y*cos(l1_deg),
l1_pos_z = l0_pos_z
)
[l1_pos_x,
l1_pos_y,
l1_pos_z]
];
function triple_torus_knot(q, rad, dir, phi_step) =
[
for(phi = 0; phi < 6.283185307179586*q[0]*q[1]; phi = phi + phi_step)
let(
phi_deg = degrees(phi),
l0_deg = -dir[0]*phi_deg,
l1_deg = phi_deg/q[0],
l0_pos_x = rad[0]*cos(l0_deg),
l0_pos_y = 0,
l0_pos_z = rad[0]*sin(l0_deg),
l1_pos_x = (l0_pos_x+rad[1])*cos(l1_deg)-l0_pos_y*sin(l1_deg),
l1_pos_y = (l0_pos_x+rad[1])*sin(l1_deg)+l0_pos_y*cos(l1_deg),
l1_pos_z = l0_pos_z,
l2_deg = dir[1]*phi_deg/q[0]/q[1],
l2_pos_x = l1_pos_x,
l2_pos_y = (l1_pos_y+rad[2])*cos(l2_deg)-l1_pos_z*sin(l2_deg),
l2_pos_z = (l1_pos_y+rad[2])*sin(l2_deg)+l1_pos_z*cos(l2_deg)
)
[l2_pos_x,
l2_pos_y,
l2_pos_z]
];
function quad_torus_knot(q, rad, dir, phi_step) =
[
for(phi = 0; phi < 6.283185307179586*q[0]*q[1]*q[2]; phi = phi + phi_step)
let(
phi_deg = degrees(phi),
l0_deg = -dir[0]*phi_deg,
l1_deg = phi_deg/q[0],
l0_pos_x = rad[0]*cos(l0_deg),
l0_pos_y = 0,
l0_pos_z = rad[0]*sin(l0_deg),
l1_pos_x = (l0_pos_x+rad[1])*cos(l1_deg)-l0_pos_y*sin(l1_deg),
l1_pos_y = (l0_pos_x+rad[1])*sin(l1_deg)+l0_pos_y*cos(l1_deg),
l1_pos_z = l0_pos_z,
l2_deg = dir[1]*phi_deg/q[0]/q[1],
l2_pos_x = l1_pos_x,
l2_pos_y = (l1_pos_y+rad[2])*cos(l2_deg)-l1_pos_z*sin(l2_deg),
l2_pos_z = (l1_pos_y+rad[2])*sin(l2_deg)+l1_pos_z*cos(l2_deg),
l3_deg = -dir[2]*phi_deg/q[0]/q[1]/q[2],
l3_pos_x = l2_pos_x*cos(l3_deg)-(l2_pos_y+rad[3])*sin(l3_deg),
l3_pos_y = l2_pos_x*sin(l3_deg)+(l2_pos_y+rad[3])*cos(l3_deg),
l3_pos_z = l2_pos_z
)
[l3_pos_x,
l3_pos_y,
l3_pos_z]
];
module single_torus(q, rad_p, rad_c, dir, show_cores, phi_step, base_seg) {
wire_1_cross_section_radius = rad_c[0];
wire_1_cross_section_pts = shape_circle(wire_1_cross_section_radius,$fn=base_seg*rad_p[0]);
pts_1 = single_torus_knot(q, rad_p, dir, phi_step*rad_p[0]);
echo(pts_1);
length = length_3d(pts_1);
echo("Length Wire", length);
echo("Approx Volume Wire (length*crosssection)", length*3.141592654*rad_c[0]^2);
path_extrude(
wire_1_cross_section_pts,
[each pts_1, pts_1[0]],
closed = true,
twist = 0,
method = "AXIS_ANGLE"
);
}
module double_torus(q, rad_p, rad_c, dir, show_cores, phi_step, base_seg) {
wire_1_cross_section_radius = rad_c[0];
wire_1_cross_section_pts = shape_circle(wire_1_cross_section_radius,$fn=base_seg*rad_p[0]);
pts_1 = double_torus_knot(q, rad_p, dir, phi_step*rad_p[0]);
length = length_3d(pts_1);
echo("Length Wire", length);
echo("Approx Volume Wire (length*crosssection)", length*3.141592654*rad_c[0]^2);
path_extrude(
wire_1_cross_section_pts,
[each pts_1, pts_1[0]],
closed = true,
twist = 0,
method = "AXIS_ANGLE"
);
if (show_cores > 0) {
wire_2_cross_section_radius = rad_c[1];
wire_2_cross_section_pts = shape_circle(wire_2_cross_section_radius,$fn=base_seg*rad_p[1]);
pts_2 = double_torus_knot(q, [0,rad_p[1]], dir, phi_step*rad_p[1]);
length = length_3d(pts_2);
echo("Length Core 1", length);
echo("Approx Volume Core 1 (length*crosssection)", length*3.141592654*rad_c[1]^2);
color([1,0,0])
path_extrude(
wire_2_cross_section_pts,
[each pts_2, pts_2[0]],
closed = true,
twist = 0,
method = "AXIS_ANGLE"
);
}
}
module triple_torus(q, rad_p, rad_c, dir, show_cores, phi_step, base_seg) {
wire_1_cross_section_radius = rad_c[0];
wire_1_cross_section_pts = shape_circle(wire_1_cross_section_radius,$fn=base_seg*rad_p[0]);
pts_1 = triple_torus_knot(q, rad_p, dir, phi_step*rad_p[0]);
length = length_3d(pts_1);
echo("Length Wire", length);
echo("Approx Volume Wire (length*crosssection)", length*3.141592654*rad_c[0]^2);
path_extrude(
wire_1_cross_section_pts,
[each pts_1, pts_1[0]],
closed = true,
twist = 0,
method = "AXIS_ANGLE"
);
if (show_cores > 0) {
wire_2_cross_section_radius = rad_c[1];
wire_2_cross_section_pts = shape_circle(wire_2_cross_section_radius,$fn=base_seg*rad_p[1]);
pts_2 = triple_torus_knot(q, [0,rad_p[1],rad_p[2]], dir, phi_step*rad_p[1]);
length = length_3d(pts_2);
echo("Length Core 1", length);
echo("Approx Volume Core 1 (length*crosssection)", length*3.141592654*rad_c[1]^2);
color([1,0,0])
path_extrude(
wire_2_cross_section_pts,
[each pts_2, pts_2[0]],
closed = true,
twist = 0,
method = "AXIS_ANGLE"
);
if (show_cores > 1) {
wire_3_cross_section_radius = rad_c[2];
wire_3_cross_section_pts = shape_circle(wire_3_cross_section_radius,$fn=base_seg*rad_p[2]);
pts_3 = triple_torus_knot(q, [0,0,rad_p[2]], dir, phi_step*rad_p[2]);
length = length_3d(pts_3);
echo("Length Core 2", length);
echo("Approx Volume Core 2 (length*crosssection)", length*3.141592654*rad_c[2]^2);
color([0,1,0])
path_extrude(
wire_3_cross_section_pts,
[each pts_3, pts_3[0]],
closed = true,
twist = 0,
method = "AXIS_ANGLE"
);
}
}
}
module quad_torus(q, rad_p, rad_c, dir, show_cores, phi_step, base_seg) {
wire_1_cross_section_radius = rad_c[0];
wire_1_cross_section_pts = shape_circle(wire_1_cross_section_radius,$fn=base_seg*rad_p[0]);
pts_1 = quad_torus_knot(q, rad_p, dir, phi_step*rad_p[0]);
length = length_3d(pts_1);
echo("Length Wire", length);
echo("Approx Volume Wire (length*crosssection)", length*3.141592654*rad_c[0]^2);
path_extrude(
wire_1_cross_section_pts,
[each pts_1, pts_1[0]],
closed = true,
twist = 0,
method = "AXIS_ANGLE"
);
if (show_cores > 0) {
wire_2_cross_section_radius = rad_c[1];
wire_2_cross_section_pts = shape_circle(wire_2_cross_section_radius,$fn=base_seg*rad_p[1]);
pts_2 = quad_torus_knot(q, [0,rad_p[1],rad_p[2],rad_p[3]], dir, phi_step*rad_p[1]);
length = length_3d(pts_2);
echo("Length Core 1", length);
echo("Approx Volume Core 1 (length*crosssection)", length*3.141592654*rad_c[1]^2);
color([1,0,0])
path_extrude(
wire_2_cross_section_pts,
[each pts_2, pts_2[0]],
closed = true,
twist = 0,
method = "AXIS_ANGLE"
);
if (show_cores > 1) {
wire_3_cross_section_radius = rad_c[2];
wire_3_cross_section_pts = shape_circle(wire_3_cross_section_radius,$fn=base_seg*rad_p[2]);
pts_3 = quad_torus_knot(q, [0,0,rad_p[2],rad_p[3]], dir, phi_step*rad_p[2]);
length = length_3d(pts_3);
echo("Length Core 2", length);
echo("Approx Volume Core 2 (length*crosssection)", length*3.141592654*rad_c[2]^2);
color([0,1,0])
path_extrude(
wire_3_cross_section_pts,
[each pts_3, pts_3[0]],
closed = true,
twist = 0,
method = "AXIS_ANGLE"
);
if (show_cores > 2) {
wire_4_cross_section_radius = rad_c[3];
wire_4_cross_section_pts = shape_circle(wire_4_cross_section_radius,$fn=base_seg*rad_p[3]);
pts_4 = quad_torus_knot(q, [0,0,0,rad_p[3]], dir, phi_step*rad_p[3]);
length = length_3d(pts_4);
echo("Length Core 3", length);
echo("Approx Volume Core 3 (length*crosssection)", length*3.141592654*rad_c[3]^2);
color([0,0,1])
path_extrude(
wire_4_cross_section_pts,
[each pts_4, pts_4[0]],
closed = true,
twist = 0,
method = "AXIS_ANGLE"
);
}
}
}
}
/**
* q - number of loops per level
* rad_p - radius of torus center line per level (this is used for positioning of the wire and cores relative to the center of each parent flux loop)
* rad_c - radius of wire/cores (this is used for the wire/core model radius)
* dir - rotation direction 1 clockwise (right-handed?), -1 counter-clockwise (left-handed?)
* show_cores - number of cores to show
* phi_step - length of longitudinal wire segment in radians (this is then multiplied by the rad_p radius to reduce data in cores)
* base_seg - segments for wire diameter (this is then multiplied by the rad_p radius to reduce data in cores)
**/
// D-4D Samples
//single_torus([], [2-0.5], [0.5], [], 0, 6.283185307179586/20, 40);
//double_torus([12], [2-0.5,8-2], [0.5,1], [1], 1, 6.283185307179586/20, 20);
//triple_torus([12,18], [2-0.5,8-2,32-8], [0.5,1,4], [1,1], 2, 6.283185307179586/20, 20);
quad_torus([12,18,24], [2-0.5,8-2,32-8,128-32], [0.5,1,4,16], [1,1,1], 2, 6.283185307179586/20, 10);
```

#### Getting a 3D printed metal bagel

**“Thunderbolt” on MFMP YouTube commented**

“Heres a technique that can be used to 3d print in plastic (best results with a sls resin printer) first 3d print the high level torus and then apply a metal solution that later can be sintered so that plastic melts out but the metal remains and takes the form of the 3d print like in this video”

So I proposed that people might be able to 3D print bagels, either at home, or using a commercial service like Sculpteo prototyping resin or ultracur-epd1086, the latter of which has a Layer thickness of 100µm and accuracy of ± 100µm, and then electroless copper plate them using a kit, such as this one which costs $141.90.

For our requirements, I don’t think there is a need to melt out the substrate as long as the plating layer is suitably conductive.

edited Jun 14, 2022Hey Guys, I made another script to generate the natural donut shapes in blender. I don't expect these will be as useful as the wire coil generator script. OpenSCAD doesn't support mesh deformations so I had to write it as a Blender script.

code: https://pastebin.com/F0Q4swpK (tested on blender 3.2 under linux, if you run into compatibility issues and want to use it let me know) (updated 2022-06-14 4:00:00 UTC to fix issue with squashing the second order torus along the wrong axis, and switching over to blender mesh deform from lattice deform, thanks Bob for spotting this, redownload if you got it before then)

video: https://youtu.be/Tv2LcJiED6U

edited Jun 11, 2022Hey Bob, I tried pricing getting one of these made via SLS from https://i.facfox.com/insta3dp/.

1) A D-4D 4 level bagel made on a formlabs fuse 1 in nylon with a diameter of 16.5 cm will set one back $9 USD per unit, minimum order size of $40 USD and shipping is about $40 USD so one could order 4 for about $80.

2) The same sized D-4D bagel made with DMLS SS 316 will set one back $524 USD + shipping

3) The same sized D-4D bagel made with DMLS Aluminum will set one back $245 USD + shipping

*didn't actually order one so there's a chance they may say the model is difficult and requires extra cost*

I looked into printing it on my FDM 3d printer and I think that the 4 level bagel would be impossible because the support structure will actually be more rigid than the bagel itself, and the number of retractions will mean it's basically gauranteed there will be at least one or two places it isn't connected properly, so it would likely be broken when you try to remove supports. It might be possible with a regular resin SLS printer but I don't have one to try. Given the price to buy them in nylon is pretty cheap (except for the minimum order price and shipping) I would probably take that route if I was going to try plating it.

For the mean time I will try to print a 3 level bagel with my FDM for now. Honestly though I think building a coil winder like the other guys is the way to go. I have a feeling the low resistance is key to creating a sustained field. Even Keshe "nano coats" his coils to achieve alleged superconductivity with KOH or burning the outside with a torch to soot them (this might be worth trying with our coils too), I feel the thickness you would obtain via plating would probably be inferior to the low resistance of a solid copper wire.

Perhaps in time we could make a repository where we create a kind of instructable with all the 3d models and parts detailing how to build a coil winder so others without the mechanical expertise could try and build them. Then iteratively improve on it.

I was talking to my family afew days ago saying the fundamental issue with all these "scalar" fields is that you can't measure them with devices. Either the mechanical ones or the bioavailable ones. And here you are today with this update giving us some hope we may actually be able to measure them to do some real quantitative science.

I dunno why I didn't think of this, but I have a spectrum analyzer and a handful of these near field magnetic probes. https://www.aliexpress.com/item/32966266773.html It says "9KHz-6GHz" in the title so this may not work for the 30hz we are driving them with, I'm not sure how they came to that frequency range. If they worked they may be a cheaper easier option for people who have scopes already and want to test immediately while people work out how to interface with the FGM3-PRO you mentioned above (https://magnetometer-kit.com/wp-content/uploads/2020/09/FGM-fluxgate-magnetic-field-sensor-specifications-applications-guide.pdf) Although maybe the cheap aliexpress probes are a waste of money, as I don't see why you couldn't just use an inductor coil with a scope to measure the oscillating magnetic field, unless they are impedance matched to the oscilloscope or something.

I may be able to help make PCB's for interfacing with these sensors if someone else can help design the circuit :) I'm not good at analog electronics but I can help fabricate PCBs if someone can design something that they think would work. They have some details about a minimal circuit in the application guide datasheet I linked above.