I thought of two questions regarding ringworld structures in solar systems with results I can't assume, so I will try to describe each (assume stability):

  1. If a (toroidal) ringworld were massive enough, bodies or planets nearby would orbit it in a spiral fashion along its length, as opposed to in discrete orbits "in front of" or "behind" it (I'm picturing something close to a demonstration made on the ISS that used electromagnetism but was a close analog to gravitation). What most affects the periodicity of this orbit, and how quick can this orbit occur, if the planet is earth-sized and the Ringworld has a radius of 1AU? Could this orbit be as short as one week, or one day?

  2. moved here.

  • 2
    $\begingroup$ This pretty interesting. I'd advise breaking it up into two separate questions. On a side note, this system is likely going to be incredibly unstable. Even just a star + ringworld system is unstable to perturbations, and these other bodies would likely provide the perturbations to knock the whole thing off balance, leading to a collision. $\endgroup$
    – HDE 226868
    May 1, 2017 at 18:11
  • $\begingroup$ I'd like answers to assume the star+ring are perfectly stable. I'm familiar with the issue, along with the retcons Niven employed to make it more plausible. The interactions I describe only make sense if the star+ring are a rigid, stable system. I'll also put the second question in its own question with a link to here. $\endgroup$
    – Ross
    May 1, 2017 at 18:24
  • $\begingroup$ It's reason to assume any technological species capable of building a ringworld will be capable of keeping the system of the ringworld and its star stable. $\endgroup$
    – a4android
    May 2, 2017 at 5:05
  • 1
    $\begingroup$ @Ross, do you need to have a central star? If yes, what mass range is desirable (w.r.t. our Sun)? (I'm running simulations which are going crazy when the star and ring have similar masses but works fine when star mass → 0.) $\endgroup$ May 2, 2017 at 20:37
  • $\begingroup$ @theindigamer I'd love to see some of those! :) but that sounds unfortunate. I was originally picturing a sunlike star. Looking at the knitting needle demonstration I felt there would be a goldilocks orbit that was very stable but the planet will always be pulled toward the star when it's closer. $\endgroup$
    – Ross
    May 3, 2017 at 3:25

2 Answers 2


TL;DR: Yes, helical motion around a ringworld is possible. However, it is far from uniform at larger distances (≥ 0.04 AU).

Summary of results:

For a toroidal ringworld with mass $M_R = 3 M_\text{star} = 3M_\odot$, central radius $ a = 1 \text{ AU}$ and inner radius $b = 10^{-4} a \simeq 15000\text{ km}$ (hence density $\rho \sim 8800\text{ kg/m}^3$, compare with $\rho_{\text{Fe}}\sim 7800\text{ kg/m}^3$), the relation between the mean separation from the central ring of the ringworld and the time period is given by the following graph:

T vs $\lambda$ for helical trajectories.

$\lambda a$ is the distance from the central ring. The equations are fit using the average (square) value of $\lambda$ over 1 year. The median (pentagon) and launch (circle) values of $\lambda$ are also shown. The error bars indicate the minimum and maximum value of $\lambda$. Black → no central star, orange → $M_{\text{star}} = M_{\odot}$.

The trajectory is indeed helical.

Helical trajectory around a ringworld.

We can look at the projected cross-section below. The center of the ring is at $x=-1$ (scaled by $a$, not shown), the central ring of the torus is at $x=0$. It is clear that the "inner distances" are bigger than the "outer distances" as one would naively expect. As earlier, black → no central star, orange → $M_{\text{star}} = M_{\odot}$. The first graph is translucent so you can see both cross-sections by zooming in.

Cross sections of trajectories.


For simplicity, consider a point particle; if the satellite is too large (how large?) there would be complications due to the Roche limit etc. Replace the ringworld (torus for volume calculation) with its central ring for all other calculations. Let the particle be launched from $(x,y,z)=((1-\lambda) a, 0,0)$. We only consider the regime $0.01 \leq \lambda \leq 0.1$. The lower limit prevents the particle from recognizing that the ringworld has been approximated by a ring and the upper limit prevents its orbit from being perturbed substantially by the star.

Suppose initially the radial velocity is zero. The tangential velocity for orbit around the star (initially $v_y$) should roughly be $\sqrt{G M_{\text{star}}/((1-\lambda) a)}$. The orbital velocity around the ringworld (initially $v_z$) should roughly be $\sqrt{g((1-\lambda) a,0,0) \lambda a}$ where $g(x,y,z)$ is the magnitude of the net gravitational field (a.k.a. acceleration due to gravity) as a function of position.

We're kind of stuck without a number for $g((1-\lambda) a,0,0)$.

The electric potential for a ring of charge $Q$ is given as (Ref. 1):

$$ V(r,\phi,z) = \frac{1}{4\pi\epsilon_0}\frac{Q}{2\pi}\int_0^{2\pi}\frac{d\phi'}{\sqrt{r^2-2r a\cos(\phi-\phi')+a^2+z^2}} $$

It is easy to obtain the potential for a graviational ring by substituting $\epsilon_0 \rightarrow -1/(4\pi G)$ and $Q\rightarrow M$ in the equation. One can take the gradient (with a $-$ sign) and find the field numerically.

Or one could go a few steps further and actually calculate everything. Using the equation shown earlier for one value of $M_R$ (orange in graph), one can extrapolate to other values of $M_R$ using $1/T\propto\sqrt{M_R}$ (as long as $M_R$ is not much smaller than $M_S$) as $$T = 2\pi R/v \sim 2\pi R/\sqrt{g R} \sim 1/\sqrt{M_R}$$ where $R = \lambda a$.

Implementation (Mathematica):

(Everything is in SI units unless mentioned otherwise.)

First we set up the constants. The elliptic integral for $V$ earlier is somewhat nasty and takes a while to simplify, so I simplified it once and replaced the definition with the output of the simplification.

G = 6.674 10^-11;
EarthMass = 5.9722 10^24;
SolarMass = 333000 EarthMass;
RingMass = 3 SolarMass;
AU = 1.508 10^11;
a = 1 AU;
b = 10^-4 a;
day = 24*3600 // N;
year = 365.25 day;
\[Rho] = RingMass/((2 \[Pi] a) (\[Pi] b^2)) (* roughly 8800, Fe \[Rule] 7800 *) 
(* Math *)
VRing[r_, \[Phi]_, z_, 
   MR_] = -G MR/(2 \[Pi]) ((2 Sqrt[(
       a^2 + r^2 + z^2 - 2 a r Cos[\[Phi]])/((a - r)^2 + 
        z^2)] (EllipticF[\[Pi] - \[Phi]/2, -((
           4 a r)/((a - r)^2 + z^2))] + 
         EllipticF[\[Phi]/2, -((4 a r)/((a - r)^2 + z^2))]))/(Sqrt[
      a^2 + r^2 + z^2 - 2 a r Cos[\[Phi]]]));
VRingxyz[x_, y_, z_, MR_] = 
  TransformedField["Polar" -> "Cartesian", 
   VRing[r, \[Phi], z, MR], {r, \[Phi]} -> {x, y}];
Vtot[x_, y_, z_, MR_, MS_] = -G MS/Norm[{x, y, z}] + 
   VRingxyz[x, y, z, MR];
gRing[x_, y_, z_, MR_] = -Grad[VRingxyz[x, y, z, MR], {x, y, z}];
gtot[x_, y_, z_, MR_, 
   MS_] = -Grad[Vtot[x, y, z, MR, MS], {x, y, z}] /. 
   Abs[p_] Abs'[p_] -> p;
gtotmag[x_, y_, z_, MR_, MS_] = Norm[gtot[x, y, z, MR, MS]];

Let's do a quick sanity check and see if the gravitational field is as expected.

imgWidth = 2160;
   plot_] := (Export[NotebookDirectory[] <> fname, 
    Rasterize[plot, ImageSize -> imgWidth]]; plot);
fieldPlotXLim = 1.5/Sqrt[2]; fieldPlotYLim = fieldPlotXLim;
splot = plotAndExport["field.png", #] &@
     Chop@(gtot[x1 a, y1 a, 0, RingMass, SolarMass][[1 ;; 2]])
     , {x1, -fieldPlotXLim, fieldPlotXLim}, {y1, -fieldPlotYLim, 
     , BaseStyle -> {FontSize -> 24}]];

Gravitational field flow and magnitude

Looks alright. The first graph shows the "flow" of the field (the arrows sizes are not correct). The magnitude of the field along the $x$-axis is also shown.

Now we implement the solvers for the particle trajectory.

(* Trajectory solvers with initial conditions *)

xi[\[Lambda]_] := a (1 - \[Lambda]);
yi[\[Lambda]_] := 0.;
zi[\[Lambda]_] := 0.;
vxi[\[Lambda]_] := 0.;
vyi[\[Lambda]_] := Sqrt[G SolarMass/Abs[xi[\[Lambda]]]];
vzi[\[Lambda]_, MR_] := 
  Sqrt[Abs[a - xi[\[Lambda]]] Norm@
     gRing[xi[\[Lambda]], yi[\[Lambda]], zi[\[Lambda]], MR]];
ringSol[\[Lambda]_, MR_, time_] := NDSolve[
   Flatten@{Thread[{xs''[t], ys''[t], zs''[t]} == 
       gRing[xs[t], ys[t], zs[t], MR]],
     xs'[0] == vxi[\[Lambda]], ys'[0] == vyi[\[Lambda]], 
     zs'[0] == vzi[\[Lambda], MR], 
     xs[0] == xi[\[Lambda]], ys[0] == yi[\[Lambda]], 
     zs[0] == zi[\[Lambda]]},
   {xs, ys, zs}, {t, 0, time}];

xiFull[\[Lambda]_] := xi[\[Lambda]];
yiFull[\[Lambda]_] := yi[\[Lambda]];
ziFull[\[Lambda]_] := zi[\[Lambda]];
vxiFull[\[Lambda]_] := vxi[\[Lambda]];
vyiFull[\[Lambda]_, MS_] := Sqrt[G MS/Abs[xi[\[Lambda]]]];
vziFull[\[Lambda]_, MR_, MS_] := 
  Sqrt[Abs[a - xi[\[Lambda]]] Norm@
     gtot[xi[\[Lambda]], yi[\[Lambda]], zi[\[Lambda]], MR, MS]];
fullSol[\[Lambda]_, MR_, MS_, time_, \[Epsilon]_] := NDSolve[
   Flatten@{Thread[{xs''[t], ys''[t], zs''[t]} == 
       gtot[xs[t], ys[t], zs[t], MR, MS]]
     , xs'[0] == vxiFull[\[Lambda]], ys'[0] == vyiFull[\[Lambda], MS],
      zs'[0] == (1 + \[Epsilon]) vziFull[\[Lambda], MR, MS]
     , xs[0] == xiFull[\[Lambda]], ys[0] == yiFull[\[Lambda]], 
     zs[0] == ziFull[\[Lambda]]}
   , {xs, ys, zs}, {t, 0, time}

appendVelocities[solution_] := 
 Append[solution, {vx -> xs', vy -> ys', vz -> zs'} /. solution]

We will need a bunch of functions to analyze the time period.

(* Examining the period T of rotation about the ring *)
(* findPeriod and reconstruct copied from \
https://mathematica.stackexchange.com/a/38221/9332 *)

findPeriod[data_, threshold_] := 
 Module[{fs, s1, s = {}, i, a0f, af, pf, pos, fr, frpos, fdata, 
   fdatac, n, per}, n = Length[data];
  fs = Fourier[data];
  s1 = Drop[fs, -Floor[Length[fs]/2]];
  For[i = 1, i < Length[s1], i++, 
   If[Abs[fs][[i + 1]] > threshold, AppendTo[s, i + 1]]];
  a0f = Abs[fs[[1]]]/Sqrt[n];
  af = 2/Sqrt[n] Abs[fs][[s]];
  pf = Arg[fs][[s]];
  {a0f, Transpose[{s, af, pf}]}]
reconstruct[data_, fp_] := Module[{n}, n = Length[data];
   Show[ListLinePlot[data, PlotStyle -> Black], 
    Plot[fp[[1]] + 
      Sum[fp[[2, j, 2]] Cos[
         2 Pi (fp[[2, j, 1]] - 1)/n t - fp[[2, j, 3]]], {j, 1, 
        Length[fp[[2]]]}], {t, 0, n}, PlotStyle -> Red]]];
getOrbitPeriod[solution_, totalTime_, timeStep_] := Module[{data},
   data = 
      zs[t timeStep] /. solution, {t, 0, totalTime/timeStep}];
   (* Not strictly correct as there are many frequencies but good \
enough for first approximation *)

   totalTime/(timeStep Sort[
        findPeriod[data, 10^8][[2]], #1[[2]] > #2[[2]] &][[1, 1]])];

(* The period T is observed to be linear in \[Lambda] *)
\[Lambda]TFit[\[Lambda]list_, Tlist_] := 
   Transpose@{\[Lambda]list, Tlist}, \[Lambda], \[Lambda]];

setGraphFontSize = BaseStyle -> {FontSize -> 12};
graphLineWidth = 0.003;
graphMarkerLineWidth = 0.005;
graphMarkerSize = 6;
opacity = 0.5;
polygonMarker[color_, n_] := 
  Graphics[{EdgeForm[{Thickness -> graphMarkerLineWidth, color}], 
    FaceForm[None], Polygon[CirclePoints@n]}, 
   ImageSize -> graphMarkerSize];

coloredListPlot[x_, y_, color_, PM_] := 
  ListPlot[Transpose@{x, y}, PlotStyle -> color, PlotMarkers -> PM];
\[Lambda]TFitGraph[{\[Lambda]list_, min\[Lambda]_, max\[Lambda]_, 
   mean\[Lambda]_, median\[Lambda]_}, Tlist_, color_] := 
 Module[{model = \[Lambda]TFit[mean\[Lambda], Tlist]},
   Plot[Normal[model], {\[Lambda], 0.01, Max[mean\[Lambda]]}
    , PlotStyle -> {color, Dashed, Thickness -> graphLineWidth}, 
    AxesLabel -> {"\[Lambda]", "T (days)"}
    , PlotLegends -> SwatchLegend[{color}, {Normal[model]}]
    , Evaluate@setGraphFontSize, 
    PlotRange -> {{0, Automatic}, {0, Automatic}}]
   , ErrorListPlot[
    (({{#1, #4}, ErrorBar[{#2 - #1, #3 - #1}, {0, 0}]} &) @@ # &) /@ 
     Transpose@{mean\[Lambda], min\[Lambda], max\[Lambda], Tlist}
    , PlotStyle -> {color, Thickness -> graphLineWidth}, 
    PlotMarkers -> polygonMarker[color, 4]]
   , coloredListPlot[\[Lambda]list, Tlist, 
    color, {Automatic, graphMarkerSize}]
   , coloredListPlot[median\[Lambda], Tlist, color, 
    polygonMarker[color, 5]]

Finally, we actually run the solvers and see the data.

(* Actually run simulations *)

ringSolutionTime = year;
ring\[Lambda]list = Range[0.01, 0.1, 0.01];

  ringSolutions = 
   Flatten@appendVelocities@ringSol[#, RingMass, ringSolutionTime] & /@

ringPeriods = 
  getOrbitPeriod[#, ringSolutionTime, day] & /@ ringSolutions;
{ringMaxDist, ringMinDist, ringMeanDist, ringMedianDist} = 
  Transpose[distCalc[#, ringSolutionTime, day/24] & /@ ringSolutions];

TableForm@{ring\[Lambda]list, ringMaxDist, ringMinDist, 
  ringMeanDist, ringMedianDist}

fullSolutionTime = year;
full\[Lambda]list = ring\[Lambda]list + 0.005;
  fullSolutions = 
       fullSol[#, RingMass, SolarMass, fullSolutionTime, 0] & /@ 

fullPeriods = getOrbitPeriod[#, fullSolutionTime, day] & /@ fullSolutions;
{fullMaxDist, fullMinDist, fullMeanDist, fullMedianDist} = 
  Transpose[distCalc[#, fullSolutionTime, day/24] & /@ fullSolutions];

TableForm@{full\[Lambda]list, fullMaxDist, fullMinDist, 
  fullMeanDist, fullMedianDist}

Making the $T$ vs $\lambda$ plot and seeing the trajectory (graphs in summary).

plotAndExport["Tvl.png", #] &@
  \[Lambda]TFitGraph[{ring\[Lambda]list, ringMinDist, ringMaxDist, 
    ringMeanDist, ringMedianDist}, ringPeriods, Black]
  , \[Lambda]TFitGraph[{full\[Lambda]list, fullMinDist, fullMaxDist, 
    fullMeanDist, fullMedianDist}, fullPeriods, Orange]
  , PlotRange -> {{0, Automatic}, {0, Automatic}}
plotAndExport["traj.png", #] &@
     trajectory[full\[Lambda]list[[1]], fullSolutions[[1]], 
     , trajectory[full\[Lambda]list[[1]], fullSolutions[[1]], 


  1. http://physics.oregonstate.edu/portfolios/Activities/EMActivities/ElectricPotentialRing/RingVSolutions070701.pdf
  • 3
    $\begingroup$ Holy... Wow, welcome to WorldBuilding! That's one extensive answer. I don't have any votes left for today, but I will upvote this tomorrow. Hope you stick around, looking forward to your contributions. Have fun on the site! $\endgroup$
    – Secespitus
    May 3, 2017 at 19:24
  • $\begingroup$ I'm gonna accept this before I even finish reading. Thank you very much for thoroughly exploring this! $\endgroup$
    – Ross
    May 3, 2017 at 19:38
  • 2
    $\begingroup$ Did you do a PhD thesis on ring worlds, or what? I can't judge the accuracy of this answer, really, but the effort that went into it -- WOW! Hope to see more from you! $\endgroup$
    – user
    May 3, 2017 at 19:42
  • 3
    $\begingroup$ @theindigamer Yes, I saw your participation on Physics and Academia. Welcome to Worldbuilding, we need people willing to put in the time to write answers like this! $\endgroup$
    – user
    May 3, 2017 at 19:54
  • 1
    $\begingroup$ I'm amazed. Thank you. Would consider giving you a bounty, but one is already pending so have an upvote for now, and I hope to see more from you. $\endgroup$
    – Mołot
    May 5, 2017 at 9:43

There are aspects of this question which make it quite tricky to answer. The physics demonstration of charged droplets spiralling around a charged knitting needle gives a reasonable idea of the concept you are trying to consider. Any answer will have to substitute a gravitational field for the droplets' and the knitting needle's electrostatic field. This may not be so straight forward. Anyone who knows I am wrong about this proposition, this please jump in and demolish it.

It is suggested that the ringworld will need to be massive to have an Earthlike planet in a spiral orbit around the ringworld. While it can be assumed that the Earthlike planet has a mass equivalent to that of the Earth, that's the easy part. Now to look at the unknown factors in this model.

The mass of the ringworld is unknown. The velocity of the Earthlike planet is unknown. The ringworld's mass will determine the gravitational force acting on the planet to keep it orbiting the ringworld. While the velocity of the planet will determine its probability in maintaining its orbit around the ringworld.

This suggests that the ringworld will need to be extremely massive indeed. Quite likely, the ringworld's mass will be of the order of a solar mass. That is to say a mass similar to that of the Sun. In which case, the ringworld will need to be made of ultradense matter of the type proposed by Robert L Forward in his speculative article "Far out Physics" (Analog, August 1975, pages 147-166).

The planet will have to be moving at a high velocity. This is high compared to normal planetary orbits. The Earth orbits the Sun with a velocity of 30 km/s. However, it isn't easy to devise a way of conceptualizing the relationship between the mass of the ringworld and the velocity of the planet in a spiral orbit. This depends on the distribution of mass along the length of the ringworld and the force it exerts upon an Earth-mass planet so that the planet can be kept in a spiral orbit around the ringworld.

One thing that is a worry is the fact that the charged droplets all end up falling on to the charged knitting needle. If the same behaviour applies to a planet in a spiral orbit around a massive ringworld, then the planet end up crashing onto the ultradense surface of the ringworld. While this is exciting and dramatic, it won't be good news for any inhabitants of the planet.

Any answer that can come with a solution to the problem proposed by the question will need to devise a model that describes the gravitational and velocity relationship between the ringworld and the planet in a spiral orbit in order to timescale of the planet's orbit and, possibly, the stability of this system. Currently the unknown factors make determining an answer difficult. This answer has explored the limiting factors of the problem, but has not been able to propose a solution to the OP's question.


The main problem is the shape of the gravitational field of a massive ringworld. With planets & stars the gravitational field is concentrated around a point source. The ringworld's field has an extended source. The planet could have two components of velocity. One the orbital velocity around the star, the other an orbital velocity around the ringworld. That would yield the spiral orbit.

Now this consideration suggests a possible solution. Assume that the mass of the ringworld is equal to that of the Earth-mass planet in a strip that is 12,742 kilometres wide. This width is chosen because it the diameter of an Earthlike planet. This gives a reasonable approximation for the minimum gravitational field of the massive ringworld to keep an Earth-mass planet in orbit around it. Assuming it has an orbital velocity of 8 km/s as this is the orbital velocity needed to maintain a satellite in orbit around an Earthlike planet (in this case the strip of a ringworld).

The planet orbiting the ringworld will have a heliocentric orbital velocity of 30 km/s, which is exactly the same as planet Earth, and this is only one velocity component of the planet. The other velocity component keeps the planet circulating around the ringworld. The combined velocities result in a spiral orbit around the ringworld.

The OP can plug whatever dimensions of the ringworld to establish the size of the orbit around the ringworld.

A quick calculation indicates that the mass of the ringworld will be 73,966.237 Earth masses (where 1 AU equals 150,000,00 kilometres). Just divide the circumference of the ringworld by 12,742 because we have assumed each 12,742 kilometre strip has one Earth mass.

The planet's orbit around the ringworld will be an high orbit. Possibly, something like a forty-eight hour orbit which will keep the planet far away from the ringworld. This should keep the planet safe. Also, the ringworld will have to have a narrow width. For example, around 12,000 km, that's right, roughly the Earth's diameter. Again this is to make the planet's spiral orbit safe. The radius of the orbit from the ringworld is 220,015.79 km. Offhand it's not certain if this orbit is viable. Note: this assumes the orbital velocity is 8 km/s.

  • $\begingroup$ I imagined that the planet's sun-year would be the same as Earth's year, so in the plane of the solar system it moves at your stated velocity of 30 km/s. The other unknown factors are still what I'm most interested in, and I admit it makes the question hard. I guess the question is more what combination of Ringworld mass and orbiting distance could put that (inevitable) collision off for as long as possible. $\endgroup$
    – Ross
    May 2, 2017 at 12:49
  • $\begingroup$ @Ross. That's exactly right. But as I was writing this comment that suggested a possible solution. $\endgroup$
    – a4android
    May 2, 2017 at 13:04

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .