Matt Wilson asked my how I calculate the "salubrity" values for planets and moons in my star system generator, and I thought the topic would withstand wider discussion, so here goes.
I have a star system and planet generator based on the Basic and Advanced star system generation sequences that make up chapters 4 and 5 of GURPS Space
4th edition. In fact I have two: one is a straight instance of the GURPS procedures as best I could make. The other has been modified to my taste, altering some probabilities substantially, doing some things differently, and generating certain extra information. For reasons that seemed good only at the beginning, I coded it as an Excel 97 workbook with no macros.It is monstrously difficult to maintain or even understand.
One of the differences between my generator based on GURPS Space
and the generator I used to build my setting Flat Black
is that I calculate habitability differently. The GURPS approach is to add up single-digit results from table look-ups from a small number of qualities of the planet or moon, producing a "Habitability Score" ranging from -2 for airless rocks with no worthwhile minerals to (IIRC) about +8 for Earthlike worlds with rich resources. Each +1 is supposed to reflect a doubling of possible population at given tech level. It's rather crude, and it does not take into account all the things that I think would matter. On the other hand, it is designed to give a Habitability score to uninhabitable worlds, where I am content to not even discuss the habitability of anything other than what the system generates as a "Garden World" (i.e. a planet or moon with oceans of water and an atmosphere containing significant free oxygen).
I calculate two values for the habitability of a planet.
- The first is an index (i.e value for 0 to 1, expressed as a percentage) indicating how attractive the world would seem to colonists. I used to call this "Salubrity" to distinguish it from GURPS' "Habitability", but now that I am not referring readers to GURPS any more I have resumed using the more familiar "Habitability".
- The other is a rating of potential agricultural output, which limits how fast and numerous the population can grow after the colonist doom their posterity to the place.
Okay, checking the my workbook I find "Habitability Index" tabulated in column P of the sheet "system table". The cell content are just "='world details'!GY19". On the sheet "world details" column GY has cell contents like this (from row 19, without loss of generality): "=IF(AE19=" garden",MAX(0,1-(GS19-1)^2)*GT19*GU19*SQRT(GV19)*GW19*GX19,"")". Okay:
- Column AE is the world type. I don't calculate a value except for a "garden"-type world.
- When I do calculate a value it is set to at least zero whatever, because I'm a bit of a fanatic about error propagation.
- Otherwise, the salubrity index is the product of six factors (I recall that I rigged them all to range from 0 to 1), so the result is ready-normalised.
Let's look at the six factors seriatam
- 1-(GS19-1)^2) refers to column GS, which is the light level. It is a quadratic, giving a parabolic graph that is zero in complete darkness, zero at an illumination level twice that of Earth, and 1 for a planet just as well-lit as Earth. Bear in mind that this factor is simply not going to be evaluated to extreme values. A planet with very low visible illumination will usually be too cold to be a garden world anyway, and one with very high visible illumination will usually be too hot anyway.
- Column GT is a habitability factor for surface gravity. It has formula "=IF(BW19="","",MIN(1,MAX(0,2-BW19)))". The IF statement traps out blank rows and objects with no surface gravity such as rings, asteroid belts, and blank lines at the bottom of the table. BW references the world's surface gravity in Earth gees. So what we have here is a factor representing human aversion to heavy gravity. It is 1 ("we are fine with this") for all gravity values up to and including Earth normal, And then it declines linearly to 0 ("Hell no! We won't go!") at 2 gee. Note that worlds with low gravity will be excluded on other grounds (low escape velocity —> no water, no air), and that planets with gravity greater than 1.6 usually work out uninhabitable on other grounds (excessive atmosphere retention, mostly).
- GU19 has formula "IF(BW19="","",IF(FC19="",0,0.5^(IF(AO19="marginal",1,0)-ET19)))". First I trap out rows with no gravity, then assign a value of zero to rows with no atmosphere. (The difference between blank and zero results has to do with avoiding doing arithmetic on blanks while also avoiding filling tables with non-significant zeroes.) Column ET is not an atmosphere value as you might have expected. It is a modifier to GURPS Habitability for geological activity (vulcanism, plate tectonics). The exponential function reflects the fact that GURPS Habitability modifiers halve or double carrying capacity. "Marginal" atmospheres have a -1 modifier, which is included here for convenience.
- SQRT(GV19). Column GV is a factor reflecting that availability of water to support vegetation — raininess. It has the formula "=IF(BW19="","",IF(AW19="water",MAX(0,MIN(1,(0.064+(FO19-0.4)^3)/0.128)),0))", which first traps out rows with no gravity and then oceans of liquid hydrocarbons and oceans of water-ammonia eutectic mix. Then we MAX (0 to assign 0 rather than negative numbers to dry worlds, and MIN (1 to assign 100% rather than meaninglessly high values to well-watered worlds. And then we have a funky cubic of FO, the "hydrographic percentage".
File comment: "Habitability" modifier for hydrographics in my "Flat Black" system generator.
funky cubic.gif [ 14.54 KiB | Viewed 96 times ]
There's nothing clever there. It's a crude hack to represent that with hydrographics about 80% everywhere is likely near an ocean, but with the land fraction rising above 20% you start getting arid continental interiors. I just rigged the formula to produce 50% at 50% and 100% at 80%, and might as well have made it linear between them. Note that this seldom evaluates for hydrographics below 50% because the GURPS system doesn't make garden worlds drier than 50% (except for tidally locked ones).
- Column GW is a factor for average surface temperature. =IF(BW19="","",IF(L19,0,MAX(0,IF(HB19>290,1+(290-HB19)/50,1-((HB19-290)/30)^2)))). First I trap rows with no gravity and then gas giants. HB is the average surface temperature in kelvins. I observe that there are no permanent human habitations where the annual average temperature is colder than freezing point or hotter than 30 C (303 K). The IF statement distinguishes between worlds that have a uninhabitably hot belt at their equator or subsolar point on their sunny side (warmer than 290K) and those that have uninhabitably cold land and ice sheets in their polar regions or sunwards of their terminator (cooler than 290 K); the corresponding formulas are rough hacks for the proportion of land thus made uninhabitable. It's all pretty crude: I have made no attempt to estimate the efficacy of pole-ward transfer of heat by the circulation of air and water.
- Column GX is factor for the length of the day: IF(GW19="","",IF(DV19="infinite",0.15,MIN(1,MAX(0,IF(DV19>28,IF(DV19<960,1-(DV19-28)/68,MIN(0.25,(DV19-960)/2880)),IF(DV19<24,1-((24-DV19)/16)^2,1)))))). It's a bit of a monster. First I trap out blank lines. Column DV is the day length in hours. Worlds with a day-length less than 8 hours have their factor set to 0 by a MIN expression. Those with day-lengths between 8 and 24 hours have a value set by a quadratic: 0% at 8 hours, 75% at 16 hours, 100% at 24 hours. Those with day-lengths between 24 and 28 hours have it set to 100% by an MAX expression. Those with day-lengths from 28 to 96 hours have their factor tapered gently from 100% to 0% by a linear expression. Those with day-lengths 96 hours to 960 have their factor set to zero by a MAX statement. Those with day-lengths from 960 hours to 3840 hours have their factor gently tapered up from 0% to 25% by a linear expression. Those with day lengths longer than 3840 hours are assigned a factor of 25% by a MAX expression. And those with infinite day-lengths (i.e. worlds tidally locked to their stars) get assigned 15%.
Note that the way the day lengths are assigned some day-lengths are effectively impossible for Garden worlds.
I would like to improve this by modelling poleward heat transport and the storminess and windiness of weather explicitly.Carrying CapacityRelative
carrying capacity is in column GZ and has the formula =IF(GY19="","",IF(FO19="","",GS19*SQRT(GT19)*GU19*GV19*GW19*GX19*BV19^2*(1-FO19)/0.2117))
First I trap out bodies with no gravity to prevent reference errors, then those with no "hydrographics" value. The formula is pretty straightforward.
- GS is the light level — plant growth is proportional to visible illumination within the limits of a habitable planet.
- GT is the gravity factor discussed before. High gravity not only deters settlers but reduces the health and fecundity of their progeny. Maybe this ought to impact population growth rate rather than limiting population.
- GU is the bad air, earthquakes and volcanoes factor from GURPS.
- GV is the factor based on hydrographics: the proxy for raininess of the climate.
- GW is the the proportion of surface with a liveable average temperature.
- GX is the day-length factor.
- BV is the diameter of the planet. BV^2 is therefore a relative area.
- FO is the proportion of surface covered by water, so (1-FO) is the proportion comprised of land surface
- 0.2117 is Earth's value for the product of the preceding factors, and it acts as a normalising value so that RCC = 1 corresponds to the carrying capacity of Earth.
The first difference to note between Salubrity and Carrying Capacity is that the first is an intensive and the second an extensive variable. Salubrity is "how attractive is this place, qualitatively?"; Carrying Capacity is "how much nice land do we have here?" That's the effect of scaling with (1-FO)*BV^2.
The second is that plant growth is more affected by dim light than appeal-to-humans is, but is encouraged rather than deterred by light brighter than Earth's.
Third, carrying capacity is proportional to the raininess factor rather than its square root. These factors ranging from 0 to 1 that means that it is more sensitive to raininess. That's because initial colonists will be attracted to to best-watered areas and figure that the deserts don't matter because they don't have to live there, but the extent of the deserts will limit population growth.