Advertisement
Guest User

Lunar Temperature Simulation

a guest
Jan 13th, 2013
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 13.28 KB | None | 0 0
  1. /*
  2.   Simulation of the moon.  This naive simulation produces an average
  3.   temperature by averaging energy at each point and ignoring conduction
  4.   between adjacent surface.
  5.  
  6.   Beware that I have absolutely no expertise in this area and do not know if
  7.   the method here is at all valid.  I am also unaware of the (probably many)
  8.   complicating factors that make real simulations more complicated and more
  9.   accurate.  This is strictly for fun.
  10.  */
  11.  
  12. #include <stdio.h>
  13. #include <math.h>
  14.  
  15. static const double absorb = 0.864;
  16. static const double lunar_radius = 1737100.0;
  17. static const double emissivity = 0.95;
  18. static const double heat_capacity = 200000.0; /* wild guess (see SoD) */
  19. static const int    rotation_step = 1; /* degree */
  20. /* Seconds at each rotation angle. Rotation in 1 day */
  21. static const double period = 24 * 60 * 60 * 28 / (360/rotation_step);
  22. static const double pi = 3.14159;
  23. static const double sb = 5.670373e-8;
  24. static const double sun = 1367.0;
  25.  
  26. static inline double radians(int degrees)
  27. {
  28.     return degrees * (pi / 180.0);
  29. }
  30.  
  31. static inline double incoming(int lon, int lat)
  32. {
  33.     return sun * absorb * sin(radians(lon)) * cos(radians(lat));
  34. }
  35.  
  36. static inline double outgoing(double temp)
  37. {
  38.     return emissivity * sb * pow(temp, 4);
  39. }
  40.  
  41. // Calc the energy content of 1 sqm at the specified latitude in one day
  42. static double rotation_energy(int lat, double energy, double *max, double *avg)
  43. {
  44.     double total_energy = 0.0;
  45.     *max = 0;
  46.  
  47.     for (int lon=0; lon<360; lon+=rotation_step) {
  48.         double temp = energy / heat_capacity;
  49.         double out  = outgoing(temp);
  50.         double in   = (lon>180) ? 0.0 : incoming(lon, lat);
  51.  
  52.         energy += (in - out) * period;
  53.         if (energy > *max) {
  54.             *max = energy;
  55.         }
  56.         total_energy += energy;
  57.     }
  58.     *avg = total_energy / 360;
  59.     return energy;
  60. }
  61.  
  62. // Calculate the energy content in 1 sqm over many rotations returing the
  63. // average over a single rotation.
  64. static double average_stable_energy(int lat)
  65. {
  66.     double energy = 0.0;
  67.     double max_energy = 0.0;
  68.     double avg_energy = 0.0;
  69.  
  70.     for (int i=0; i<400; ++i) {
  71.         energy = rotation_energy(lat, energy, &max_energy, &avg_energy);
  72.     }
  73.     printf("Latitude: %3d: Kelvin: min = %.0f, max = %.0f, avg = %.0f\n",
  74.            lat, energy/heat_capacity,
  75.            max_energy/heat_capacity,
  76.            avg_energy/heat_capacity);
  77.     return avg_energy;
  78. }
  79.  
  80. // Estimate the surface area of a strip of Lunar surface at the specified
  81. // latitude.
  82. static double lunar_surface(int lat, int degrees)
  83. {
  84.     double circumference = cos(radians(lat)) * lunar_radius * 2 * pi;
  85.     double height        = sin(radians(degrees)) * lunar_radius;
  86.     return circumference * height;
  87. }
  88.  
  89. // Calc the energy in a stripe at each latitude; average the energy over the
  90. // entire surface.
  91. int main(int argc, char **argv)
  92. {
  93.     (void) argc;
  94.     (void) argv;
  95.     const int lat_increment = 1;
  96.     double total_energy = 0.0;
  97.     double total_surface = 0.0;
  98.  
  99.     for (int lat=0; lat<=180; lat += lat_increment) {
  100.         double surface = lunar_surface(lat-90, lat_increment);
  101.         double energy = average_stable_energy(lat-90);
  102.  
  103.         total_energy += energy * surface;
  104.         total_surface += surface;
  105.     }
  106.     printf("Total surface (square kilometers) = %e\n", total_surface/1000000);
  107.     printf("Average temp = %.0fK\n", (total_energy / total_surface) / heat_capacity);
  108.     return 0;
  109. }
  110.  
  111. /* Results with parameters shown above:
  112.  
  113. Latitude: -90: Kelvin: min = 2, max = 2, avg = 2
  114. Latitude: -89: Kelvin: min = 85, max = 124, avg = 103
  115. Latitude: -88: Kelvin: min = 90, max = 156, avg = 119
  116. Latitude: -87: Kelvin: min = 92, max = 177, avg = 129
  117. Latitude: -86: Kelvin: min = 93, max = 193, avg = 136
  118. Latitude: -85: Kelvin: min = 94, max = 206, avg = 142
  119. Latitude: -84: Kelvin: min = 94, max = 216, avg = 147
  120. Latitude: -83: Kelvin: min = 95, max = 225, avg = 151
  121. Latitude: -82: Kelvin: min = 95, max = 234, avg = 155
  122. Latitude: -81: Kelvin: min = 95, max = 241, avg = 158
  123. Latitude: -80: Kelvin: min = 95, max = 247, avg = 161
  124. Latitude: -79: Kelvin: min = 96, max = 254, avg = 164
  125. Latitude: -78: Kelvin: min = 96, max = 259, avg = 167
  126. Latitude: -77: Kelvin: min = 96, max = 264, avg = 169
  127. Latitude: -76: Kelvin: min = 96, max = 269, avg = 172
  128. Latitude: -75: Kelvin: min = 96, max = 274, avg = 174
  129. Latitude: -74: Kelvin: min = 96, max = 278, avg = 176
  130. Latitude: -73: Kelvin: min = 96, max = 283, avg = 178
  131. Latitude: -72: Kelvin: min = 96, max = 287, avg = 180
  132. Latitude: -71: Kelvin: min = 96, max = 290, avg = 182
  133. Latitude: -70: Kelvin: min = 97, max = 294, avg = 183
  134. Latitude: -69: Kelvin: min = 97, max = 297, avg = 185
  135. Latitude: -68: Kelvin: min = 97, max = 301, avg = 187
  136. Latitude: -67: Kelvin: min = 97, max = 304, avg = 188
  137. Latitude: -66: Kelvin: min = 97, max = 307, avg = 190
  138. Latitude: -65: Kelvin: min = 97, max = 310, avg = 191
  139. Latitude: -64: Kelvin: min = 97, max = 313, avg = 192
  140. Latitude: -63: Kelvin: min = 97, max = 316, avg = 194
  141. Latitude: -62: Kelvin: min = 97, max = 318, avg = 195
  142. Latitude: -61: Kelvin: min = 97, max = 321, avg = 196
  143. Latitude: -60: Kelvin: min = 97, max = 323, avg = 197
  144. Latitude: -59: Kelvin: min = 97, max = 326, avg = 198
  145. Latitude: -58: Kelvin: min = 97, max = 328, avg = 199
  146. Latitude: -57: Kelvin: min = 97, max = 330, avg = 201
  147. Latitude: -56: Kelvin: min = 97, max = 333, avg = 202
  148. Latitude: -55: Kelvin: min = 97, max = 335, avg = 203
  149. Latitude: -54: Kelvin: min = 97, max = 337, avg = 204
  150. Latitude: -53: Kelvin: min = 97, max = 339, avg = 204
  151. Latitude: -52: Kelvin: min = 97, max = 341, avg = 205
  152. Latitude: -51: Kelvin: min = 97, max = 343, avg = 206
  153. Latitude: -50: Kelvin: min = 97, max = 344, avg = 207
  154. Latitude: -49: Kelvin: min = 97, max = 346, avg = 208
  155. Latitude: -48: Kelvin: min = 97, max = 348, avg = 209
  156. Latitude: -47: Kelvin: min = 97, max = 350, avg = 209
  157. Latitude: -46: Kelvin: min = 97, max = 351, avg = 210
  158. Latitude: -45: Kelvin: min = 98, max = 353, avg = 211
  159. Latitude: -44: Kelvin: min = 98, max = 354, avg = 212
  160. Latitude: -43: Kelvin: min = 98, max = 356, avg = 212
  161. Latitude: -42: Kelvin: min = 98, max = 357, avg = 213
  162. Latitude: -41: Kelvin: min = 98, max = 359, avg = 214
  163. Latitude: -40: Kelvin: min = 98, max = 360, avg = 214
  164. Latitude: -39: Kelvin: min = 98, max = 361, avg = 215
  165. Latitude: -38: Kelvin: min = 98, max = 362, avg = 215
  166. Latitude: -37: Kelvin: min = 98, max = 364, avg = 216
  167. Latitude: -36: Kelvin: min = 98, max = 365, avg = 216
  168. Latitude: -35: Kelvin: min = 98, max = 366, avg = 217
  169. Latitude: -34: Kelvin: min = 98, max = 367, avg = 218
  170. Latitude: -33: Kelvin: min = 98, max = 368, avg = 218
  171. Latitude: -32: Kelvin: min = 98, max = 369, avg = 218
  172. Latitude: -31: Kelvin: min = 98, max = 370, avg = 219
  173. Latitude: -30: Kelvin: min = 98, max = 371, avg = 219
  174. Latitude: -29: Kelvin: min = 98, max = 372, avg = 220
  175. Latitude: -28: Kelvin: min = 98, max = 373, avg = 220
  176. Latitude: -27: Kelvin: min = 98, max = 374, avg = 221
  177. Latitude: -26: Kelvin: min = 98, max = 375, avg = 221
  178. Latitude: -25: Kelvin: min = 98, max = 375, avg = 221
  179. Latitude: -24: Kelvin: min = 98, max = 376, avg = 222
  180. Latitude: -23: Kelvin: min = 98, max = 377, avg = 222
  181. Latitude: -22: Kelvin: min = 98, max = 378, avg = 222
  182. Latitude: -21: Kelvin: min = 98, max = 378, avg = 223
  183. Latitude: -20: Kelvin: min = 98, max = 379, avg = 223
  184. Latitude: -19: Kelvin: min = 98, max = 379, avg = 223
  185. Latitude: -18: Kelvin: min = 98, max = 380, avg = 223
  186. Latitude: -17: Kelvin: min = 98, max = 380, avg = 224
  187. Latitude: -16: Kelvin: min = 98, max = 381, avg = 224
  188. Latitude: -15: Kelvin: min = 98, max = 381, avg = 224
  189. Latitude: -14: Kelvin: min = 98, max = 382, avg = 224
  190. Latitude: -13: Kelvin: min = 98, max = 382, avg = 224
  191. Latitude: -12: Kelvin: min = 98, max = 383, avg = 225
  192. Latitude: -11: Kelvin: min = 98, max = 383, avg = 225
  193. Latitude: -10: Kelvin: min = 98, max = 383, avg = 225
  194. Latitude:  -9: Kelvin: min = 98, max = 384, avg = 225
  195. Latitude:  -8: Kelvin: min = 98, max = 384, avg = 225
  196. Latitude:  -7: Kelvin: min = 98, max = 384, avg = 225
  197. Latitude:  -6: Kelvin: min = 98, max = 384, avg = 225
  198. Latitude:  -5: Kelvin: min = 98, max = 384, avg = 225
  199. Latitude:  -4: Kelvin: min = 98, max = 385, avg = 226
  200. Latitude:  -3: Kelvin: min = 98, max = 385, avg = 226
  201. Latitude:  -2: Kelvin: min = 98, max = 385, avg = 226
  202. Latitude:  -1: Kelvin: min = 98, max = 385, avg = 226
  203. Latitude:   0: Kelvin: min = 98, max = 385, avg = 226
  204. Latitude:   1: Kelvin: min = 98, max = 385, avg = 226
  205. Latitude:   2: Kelvin: min = 98, max = 385, avg = 226
  206. Latitude:   3: Kelvin: min = 98, max = 385, avg = 226
  207. Latitude:   4: Kelvin: min = 98, max = 385, avg = 226
  208. Latitude:   5: Kelvin: min = 98, max = 384, avg = 225
  209. Latitude:   6: Kelvin: min = 98, max = 384, avg = 225
  210. Latitude:   7: Kelvin: min = 98, max = 384, avg = 225
  211. Latitude:   8: Kelvin: min = 98, max = 384, avg = 225
  212. Latitude:   9: Kelvin: min = 98, max = 384, avg = 225
  213. Latitude:  10: Kelvin: min = 98, max = 383, avg = 225
  214. Latitude:  11: Kelvin: min = 98, max = 383, avg = 225
  215. Latitude:  12: Kelvin: min = 98, max = 383, avg = 225
  216. Latitude:  13: Kelvin: min = 98, max = 382, avg = 224
  217. Latitude:  14: Kelvin: min = 98, max = 382, avg = 224
  218. Latitude:  15: Kelvin: min = 98, max = 381, avg = 224
  219. Latitude:  16: Kelvin: min = 98, max = 381, avg = 224
  220. Latitude:  17: Kelvin: min = 98, max = 380, avg = 224
  221. Latitude:  18: Kelvin: min = 98, max = 380, avg = 223
  222. Latitude:  19: Kelvin: min = 98, max = 379, avg = 223
  223. Latitude:  20: Kelvin: min = 98, max = 379, avg = 223
  224. Latitude:  21: Kelvin: min = 98, max = 378, avg = 223
  225. Latitude:  22: Kelvin: min = 98, max = 378, avg = 222
  226. Latitude:  23: Kelvin: min = 98, max = 377, avg = 222
  227. Latitude:  24: Kelvin: min = 98, max = 376, avg = 222
  228. Latitude:  25: Kelvin: min = 98, max = 375, avg = 221
  229. Latitude:  26: Kelvin: min = 98, max = 375, avg = 221
  230. Latitude:  27: Kelvin: min = 98, max = 374, avg = 221
  231. Latitude:  28: Kelvin: min = 98, max = 373, avg = 220
  232. Latitude:  29: Kelvin: min = 98, max = 372, avg = 220
  233. Latitude:  30: Kelvin: min = 98, max = 371, avg = 219
  234. Latitude:  31: Kelvin: min = 98, max = 370, avg = 219
  235. Latitude:  32: Kelvin: min = 98, max = 369, avg = 218
  236. Latitude:  33: Kelvin: min = 98, max = 368, avg = 218
  237. Latitude:  34: Kelvin: min = 98, max = 367, avg = 218
  238. Latitude:  35: Kelvin: min = 98, max = 366, avg = 217
  239. Latitude:  36: Kelvin: min = 98, max = 365, avg = 216
  240. Latitude:  37: Kelvin: min = 98, max = 364, avg = 216
  241. Latitude:  38: Kelvin: min = 98, max = 362, avg = 215
  242. Latitude:  39: Kelvin: min = 98, max = 361, avg = 215
  243. Latitude:  40: Kelvin: min = 98, max = 360, avg = 214
  244. Latitude:  41: Kelvin: min = 98, max = 359, avg = 214
  245. Latitude:  42: Kelvin: min = 98, max = 357, avg = 213
  246. Latitude:  43: Kelvin: min = 98, max = 356, avg = 212
  247. Latitude:  44: Kelvin: min = 98, max = 354, avg = 212
  248. Latitude:  45: Kelvin: min = 98, max = 353, avg = 211
  249. Latitude:  46: Kelvin: min = 97, max = 351, avg = 210
  250. Latitude:  47: Kelvin: min = 97, max = 350, avg = 209
  251. Latitude:  48: Kelvin: min = 97, max = 348, avg = 209
  252. Latitude:  49: Kelvin: min = 97, max = 346, avg = 208
  253. Latitude:  50: Kelvin: min = 97, max = 344, avg = 207
  254. Latitude:  51: Kelvin: min = 97, max = 343, avg = 206
  255. Latitude:  52: Kelvin: min = 97, max = 341, avg = 205
  256. Latitude:  53: Kelvin: min = 97, max = 339, avg = 204
  257. Latitude:  54: Kelvin: min = 97, max = 337, avg = 204
  258. Latitude:  55: Kelvin: min = 97, max = 335, avg = 203
  259. Latitude:  56: Kelvin: min = 97, max = 333, avg = 202
  260. Latitude:  57: Kelvin: min = 97, max = 330, avg = 201
  261. Latitude:  58: Kelvin: min = 97, max = 328, avg = 199
  262. Latitude:  59: Kelvin: min = 97, max = 326, avg = 198
  263. Latitude:  60: Kelvin: min = 97, max = 323, avg = 197
  264. Latitude:  61: Kelvin: min = 97, max = 321, avg = 196
  265. Latitude:  62: Kelvin: min = 97, max = 318, avg = 195
  266. Latitude:  63: Kelvin: min = 97, max = 316, avg = 194
  267. Latitude:  64: Kelvin: min = 97, max = 313, avg = 192
  268. Latitude:  65: Kelvin: min = 97, max = 310, avg = 191
  269. Latitude:  66: Kelvin: min = 97, max = 307, avg = 190
  270. Latitude:  67: Kelvin: min = 97, max = 304, avg = 188
  271. Latitude:  68: Kelvin: min = 97, max = 301, avg = 187
  272. Latitude:  69: Kelvin: min = 97, max = 297, avg = 185
  273. Latitude:  70: Kelvin: min = 97, max = 294, avg = 183
  274. Latitude:  71: Kelvin: min = 96, max = 290, avg = 182
  275. Latitude:  72: Kelvin: min = 96, max = 287, avg = 180
  276. Latitude:  73: Kelvin: min = 96, max = 283, avg = 178
  277. Latitude:  74: Kelvin: min = 96, max = 278, avg = 176
  278. Latitude:  75: Kelvin: min = 96, max = 274, avg = 174
  279. Latitude:  76: Kelvin: min = 96, max = 269, avg = 172
  280. Latitude:  77: Kelvin: min = 96, max = 264, avg = 169
  281. Latitude:  78: Kelvin: min = 96, max = 259, avg = 167
  282. Latitude:  79: Kelvin: min = 96, max = 254, avg = 164
  283. Latitude:  80: Kelvin: min = 95, max = 247, avg = 161
  284. Latitude:  81: Kelvin: min = 95, max = 241, avg = 158
  285. Latitude:  82: Kelvin: min = 95, max = 234, avg = 155
  286. Latitude:  83: Kelvin: min = 95, max = 225, avg = 151
  287. Latitude:  84: Kelvin: min = 94, max = 216, avg = 147
  288. Latitude:  85: Kelvin: min = 94, max = 206, avg = 142
  289. Latitude:  86: Kelvin: min = 93, max = 193, avg = 136
  290. Latitude:  87: Kelvin: min = 92, max = 177, avg = 129
  291. Latitude:  88: Kelvin: min = 90, max = 156, avg = 119
  292. Latitude:  89: Kelvin: min = 85, max = 124, avg = 103
  293. Latitude:  90: Kelvin: min = 2, max = 2, avg = 2
  294. Total surface (square kilometers) = 3.791631e+07
  295. Average temp = 213K
  296. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement