Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Simulation of the moon. This naive simulation produces an average
- temperature by averaging energy at each point and ignoring conduction
- between adjacent surface.
- Beware that I have absolutely no expertise in this area and do not know if
- the method here is at all valid. I am also unaware of the (probably many)
- complicating factors that make real simulations more complicated and more
- accurate. This is strictly for fun.
- */
- #include <stdio.h>
- #include <math.h>
- static const double absorb = 0.864;
- static const double lunar_radius = 1737100.0;
- static const double emissivity = 0.95;
- static const double heat_capacity = 200000.0; /* wild guess (see SoD) */
- static const int rotation_step = 1; /* degree */
- /* Seconds at each rotation angle. Rotation in 1 day */
- static const double period = 24 * 60 * 60 * 28 / (360/rotation_step);
- static const double pi = 3.14159;
- static const double sb = 5.670373e-8;
- static const double sun = 1367.0;
- static inline double radians(int degrees)
- {
- return degrees * (pi / 180.0);
- }
- static inline double incoming(int lon, int lat)
- {
- return sun * absorb * sin(radians(lon)) * cos(radians(lat));
- }
- static inline double outgoing(double temp)
- {
- return emissivity * sb * pow(temp, 4);
- }
- // Calc the energy content of 1 sqm at the specified latitude in one day
- static double rotation_energy(int lat, double energy, double *max, double *avg)
- {
- double total_energy = 0.0;
- *max = 0;
- for (int lon=0; lon<360; lon+=rotation_step) {
- double temp = energy / heat_capacity;
- double out = outgoing(temp);
- double in = (lon>180) ? 0.0 : incoming(lon, lat);
- energy += (in - out) * period;
- if (energy > *max) {
- *max = energy;
- }
- total_energy += energy;
- }
- *avg = total_energy / 360;
- return energy;
- }
- // Calculate the energy content in 1 sqm over many rotations returing the
- // average over a single rotation.
- static double average_stable_energy(int lat)
- {
- double energy = 0.0;
- double max_energy = 0.0;
- double avg_energy = 0.0;
- for (int i=0; i<400; ++i) {
- energy = rotation_energy(lat, energy, &max_energy, &avg_energy);
- }
- printf("Latitude: %3d: Kelvin: min = %.0f, max = %.0f, avg = %.0f\n",
- lat, energy/heat_capacity,
- max_energy/heat_capacity,
- avg_energy/heat_capacity);
- return avg_energy;
- }
- // Estimate the surface area of a strip of Lunar surface at the specified
- // latitude.
- static double lunar_surface(int lat, int degrees)
- {
- double circumference = cos(radians(lat)) * lunar_radius * 2 * pi;
- double height = sin(radians(degrees)) * lunar_radius;
- return circumference * height;
- }
- // Calc the energy in a stripe at each latitude; average the energy over the
- // entire surface.
- int main(int argc, char **argv)
- {
- (void) argc;
- (void) argv;
- const int lat_increment = 1;
- double total_energy = 0.0;
- double total_surface = 0.0;
- for (int lat=0; lat<=180; lat += lat_increment) {
- double surface = lunar_surface(lat-90, lat_increment);
- double energy = average_stable_energy(lat-90);
- total_energy += energy * surface;
- total_surface += surface;
- }
- printf("Total surface (square kilometers) = %e\n", total_surface/1000000);
- printf("Average temp = %.0fK\n", (total_energy / total_surface) / heat_capacity);
- return 0;
- }
- /* Results with parameters shown above:
- Latitude: -90: Kelvin: min = 2, max = 2, avg = 2
- Latitude: -89: Kelvin: min = 85, max = 124, avg = 103
- Latitude: -88: Kelvin: min = 90, max = 156, avg = 119
- Latitude: -87: Kelvin: min = 92, max = 177, avg = 129
- Latitude: -86: Kelvin: min = 93, max = 193, avg = 136
- Latitude: -85: Kelvin: min = 94, max = 206, avg = 142
- Latitude: -84: Kelvin: min = 94, max = 216, avg = 147
- Latitude: -83: Kelvin: min = 95, max = 225, avg = 151
- Latitude: -82: Kelvin: min = 95, max = 234, avg = 155
- Latitude: -81: Kelvin: min = 95, max = 241, avg = 158
- Latitude: -80: Kelvin: min = 95, max = 247, avg = 161
- Latitude: -79: Kelvin: min = 96, max = 254, avg = 164
- Latitude: -78: Kelvin: min = 96, max = 259, avg = 167
- Latitude: -77: Kelvin: min = 96, max = 264, avg = 169
- Latitude: -76: Kelvin: min = 96, max = 269, avg = 172
- Latitude: -75: Kelvin: min = 96, max = 274, avg = 174
- Latitude: -74: Kelvin: min = 96, max = 278, avg = 176
- Latitude: -73: Kelvin: min = 96, max = 283, avg = 178
- Latitude: -72: Kelvin: min = 96, max = 287, avg = 180
- Latitude: -71: Kelvin: min = 96, max = 290, avg = 182
- Latitude: -70: Kelvin: min = 97, max = 294, avg = 183
- Latitude: -69: Kelvin: min = 97, max = 297, avg = 185
- Latitude: -68: Kelvin: min = 97, max = 301, avg = 187
- Latitude: -67: Kelvin: min = 97, max = 304, avg = 188
- Latitude: -66: Kelvin: min = 97, max = 307, avg = 190
- Latitude: -65: Kelvin: min = 97, max = 310, avg = 191
- Latitude: -64: Kelvin: min = 97, max = 313, avg = 192
- Latitude: -63: Kelvin: min = 97, max = 316, avg = 194
- Latitude: -62: Kelvin: min = 97, max = 318, avg = 195
- Latitude: -61: Kelvin: min = 97, max = 321, avg = 196
- Latitude: -60: Kelvin: min = 97, max = 323, avg = 197
- Latitude: -59: Kelvin: min = 97, max = 326, avg = 198
- Latitude: -58: Kelvin: min = 97, max = 328, avg = 199
- Latitude: -57: Kelvin: min = 97, max = 330, avg = 201
- Latitude: -56: Kelvin: min = 97, max = 333, avg = 202
- Latitude: -55: Kelvin: min = 97, max = 335, avg = 203
- Latitude: -54: Kelvin: min = 97, max = 337, avg = 204
- Latitude: -53: Kelvin: min = 97, max = 339, avg = 204
- Latitude: -52: Kelvin: min = 97, max = 341, avg = 205
- Latitude: -51: Kelvin: min = 97, max = 343, avg = 206
- Latitude: -50: Kelvin: min = 97, max = 344, avg = 207
- Latitude: -49: Kelvin: min = 97, max = 346, avg = 208
- Latitude: -48: Kelvin: min = 97, max = 348, avg = 209
- Latitude: -47: Kelvin: min = 97, max = 350, avg = 209
- Latitude: -46: Kelvin: min = 97, max = 351, avg = 210
- Latitude: -45: Kelvin: min = 98, max = 353, avg = 211
- Latitude: -44: Kelvin: min = 98, max = 354, avg = 212
- Latitude: -43: Kelvin: min = 98, max = 356, avg = 212
- Latitude: -42: Kelvin: min = 98, max = 357, avg = 213
- Latitude: -41: Kelvin: min = 98, max = 359, avg = 214
- Latitude: -40: Kelvin: min = 98, max = 360, avg = 214
- Latitude: -39: Kelvin: min = 98, max = 361, avg = 215
- Latitude: -38: Kelvin: min = 98, max = 362, avg = 215
- Latitude: -37: Kelvin: min = 98, max = 364, avg = 216
- Latitude: -36: Kelvin: min = 98, max = 365, avg = 216
- Latitude: -35: Kelvin: min = 98, max = 366, avg = 217
- Latitude: -34: Kelvin: min = 98, max = 367, avg = 218
- Latitude: -33: Kelvin: min = 98, max = 368, avg = 218
- Latitude: -32: Kelvin: min = 98, max = 369, avg = 218
- Latitude: -31: Kelvin: min = 98, max = 370, avg = 219
- Latitude: -30: Kelvin: min = 98, max = 371, avg = 219
- Latitude: -29: Kelvin: min = 98, max = 372, avg = 220
- Latitude: -28: Kelvin: min = 98, max = 373, avg = 220
- Latitude: -27: Kelvin: min = 98, max = 374, avg = 221
- Latitude: -26: Kelvin: min = 98, max = 375, avg = 221
- Latitude: -25: Kelvin: min = 98, max = 375, avg = 221
- Latitude: -24: Kelvin: min = 98, max = 376, avg = 222
- Latitude: -23: Kelvin: min = 98, max = 377, avg = 222
- Latitude: -22: Kelvin: min = 98, max = 378, avg = 222
- Latitude: -21: Kelvin: min = 98, max = 378, avg = 223
- Latitude: -20: Kelvin: min = 98, max = 379, avg = 223
- Latitude: -19: Kelvin: min = 98, max = 379, avg = 223
- Latitude: -18: Kelvin: min = 98, max = 380, avg = 223
- Latitude: -17: Kelvin: min = 98, max = 380, avg = 224
- Latitude: -16: Kelvin: min = 98, max = 381, avg = 224
- Latitude: -15: Kelvin: min = 98, max = 381, avg = 224
- Latitude: -14: Kelvin: min = 98, max = 382, avg = 224
- Latitude: -13: Kelvin: min = 98, max = 382, avg = 224
- Latitude: -12: Kelvin: min = 98, max = 383, avg = 225
- Latitude: -11: Kelvin: min = 98, max = 383, avg = 225
- Latitude: -10: Kelvin: min = 98, max = 383, avg = 225
- Latitude: -9: Kelvin: min = 98, max = 384, avg = 225
- Latitude: -8: Kelvin: min = 98, max = 384, avg = 225
- Latitude: -7: Kelvin: min = 98, max = 384, avg = 225
- Latitude: -6: Kelvin: min = 98, max = 384, avg = 225
- Latitude: -5: Kelvin: min = 98, max = 384, avg = 225
- Latitude: -4: Kelvin: min = 98, max = 385, avg = 226
- Latitude: -3: Kelvin: min = 98, max = 385, avg = 226
- Latitude: -2: Kelvin: min = 98, max = 385, avg = 226
- Latitude: -1: Kelvin: min = 98, max = 385, avg = 226
- Latitude: 0: Kelvin: min = 98, max = 385, avg = 226
- Latitude: 1: Kelvin: min = 98, max = 385, avg = 226
- Latitude: 2: Kelvin: min = 98, max = 385, avg = 226
- Latitude: 3: Kelvin: min = 98, max = 385, avg = 226
- Latitude: 4: Kelvin: min = 98, max = 385, avg = 226
- Latitude: 5: Kelvin: min = 98, max = 384, avg = 225
- Latitude: 6: Kelvin: min = 98, max = 384, avg = 225
- Latitude: 7: Kelvin: min = 98, max = 384, avg = 225
- Latitude: 8: Kelvin: min = 98, max = 384, avg = 225
- Latitude: 9: Kelvin: min = 98, max = 384, avg = 225
- Latitude: 10: Kelvin: min = 98, max = 383, avg = 225
- Latitude: 11: Kelvin: min = 98, max = 383, avg = 225
- Latitude: 12: Kelvin: min = 98, max = 383, avg = 225
- Latitude: 13: Kelvin: min = 98, max = 382, avg = 224
- Latitude: 14: Kelvin: min = 98, max = 382, avg = 224
- Latitude: 15: Kelvin: min = 98, max = 381, avg = 224
- Latitude: 16: Kelvin: min = 98, max = 381, avg = 224
- Latitude: 17: Kelvin: min = 98, max = 380, avg = 224
- Latitude: 18: Kelvin: min = 98, max = 380, avg = 223
- Latitude: 19: Kelvin: min = 98, max = 379, avg = 223
- Latitude: 20: Kelvin: min = 98, max = 379, avg = 223
- Latitude: 21: Kelvin: min = 98, max = 378, avg = 223
- Latitude: 22: Kelvin: min = 98, max = 378, avg = 222
- Latitude: 23: Kelvin: min = 98, max = 377, avg = 222
- Latitude: 24: Kelvin: min = 98, max = 376, avg = 222
- Latitude: 25: Kelvin: min = 98, max = 375, avg = 221
- Latitude: 26: Kelvin: min = 98, max = 375, avg = 221
- Latitude: 27: Kelvin: min = 98, max = 374, avg = 221
- Latitude: 28: Kelvin: min = 98, max = 373, avg = 220
- Latitude: 29: Kelvin: min = 98, max = 372, avg = 220
- Latitude: 30: Kelvin: min = 98, max = 371, avg = 219
- Latitude: 31: Kelvin: min = 98, max = 370, avg = 219
- Latitude: 32: Kelvin: min = 98, max = 369, avg = 218
- Latitude: 33: Kelvin: min = 98, max = 368, avg = 218
- Latitude: 34: Kelvin: min = 98, max = 367, avg = 218
- Latitude: 35: Kelvin: min = 98, max = 366, avg = 217
- Latitude: 36: Kelvin: min = 98, max = 365, avg = 216
- Latitude: 37: Kelvin: min = 98, max = 364, avg = 216
- Latitude: 38: Kelvin: min = 98, max = 362, avg = 215
- Latitude: 39: Kelvin: min = 98, max = 361, avg = 215
- Latitude: 40: Kelvin: min = 98, max = 360, avg = 214
- Latitude: 41: Kelvin: min = 98, max = 359, avg = 214
- Latitude: 42: Kelvin: min = 98, max = 357, avg = 213
- Latitude: 43: Kelvin: min = 98, max = 356, avg = 212
- Latitude: 44: Kelvin: min = 98, max = 354, avg = 212
- Latitude: 45: Kelvin: min = 98, max = 353, avg = 211
- Latitude: 46: Kelvin: min = 97, max = 351, avg = 210
- Latitude: 47: Kelvin: min = 97, max = 350, avg = 209
- Latitude: 48: Kelvin: min = 97, max = 348, avg = 209
- Latitude: 49: Kelvin: min = 97, max = 346, avg = 208
- Latitude: 50: Kelvin: min = 97, max = 344, avg = 207
- Latitude: 51: Kelvin: min = 97, max = 343, avg = 206
- Latitude: 52: Kelvin: min = 97, max = 341, avg = 205
- Latitude: 53: Kelvin: min = 97, max = 339, avg = 204
- Latitude: 54: Kelvin: min = 97, max = 337, avg = 204
- Latitude: 55: Kelvin: min = 97, max = 335, avg = 203
- Latitude: 56: Kelvin: min = 97, max = 333, avg = 202
- Latitude: 57: Kelvin: min = 97, max = 330, avg = 201
- Latitude: 58: Kelvin: min = 97, max = 328, avg = 199
- Latitude: 59: Kelvin: min = 97, max = 326, avg = 198
- Latitude: 60: Kelvin: min = 97, max = 323, avg = 197
- Latitude: 61: Kelvin: min = 97, max = 321, avg = 196
- Latitude: 62: Kelvin: min = 97, max = 318, avg = 195
- Latitude: 63: Kelvin: min = 97, max = 316, avg = 194
- Latitude: 64: Kelvin: min = 97, max = 313, avg = 192
- Latitude: 65: Kelvin: min = 97, max = 310, avg = 191
- Latitude: 66: Kelvin: min = 97, max = 307, avg = 190
- Latitude: 67: Kelvin: min = 97, max = 304, avg = 188
- Latitude: 68: Kelvin: min = 97, max = 301, avg = 187
- Latitude: 69: Kelvin: min = 97, max = 297, avg = 185
- Latitude: 70: Kelvin: min = 97, max = 294, avg = 183
- Latitude: 71: Kelvin: min = 96, max = 290, avg = 182
- Latitude: 72: Kelvin: min = 96, max = 287, avg = 180
- Latitude: 73: Kelvin: min = 96, max = 283, avg = 178
- Latitude: 74: Kelvin: min = 96, max = 278, avg = 176
- Latitude: 75: Kelvin: min = 96, max = 274, avg = 174
- Latitude: 76: Kelvin: min = 96, max = 269, avg = 172
- Latitude: 77: Kelvin: min = 96, max = 264, avg = 169
- Latitude: 78: Kelvin: min = 96, max = 259, avg = 167
- Latitude: 79: Kelvin: min = 96, max = 254, avg = 164
- Latitude: 80: Kelvin: min = 95, max = 247, avg = 161
- Latitude: 81: Kelvin: min = 95, max = 241, avg = 158
- Latitude: 82: Kelvin: min = 95, max = 234, avg = 155
- Latitude: 83: Kelvin: min = 95, max = 225, avg = 151
- Latitude: 84: Kelvin: min = 94, max = 216, avg = 147
- Latitude: 85: Kelvin: min = 94, max = 206, avg = 142
- Latitude: 86: Kelvin: min = 93, max = 193, avg = 136
- Latitude: 87: Kelvin: min = 92, max = 177, avg = 129
- Latitude: 88: Kelvin: min = 90, max = 156, avg = 119
- Latitude: 89: Kelvin: min = 85, max = 124, avg = 103
- Latitude: 90: Kelvin: min = 2, max = 2, avg = 2
- Total surface (square kilometers) = 3.791631e+07
- Average temp = 213K
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement