layers/craters/shaping/morphometry.cpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #include "terraingen/layers/craters/shaping/morphometry.h" | ||
| 2 | |||
| 3 | #include "terraingen/util/checks.h" | ||
| 4 | |||
| 5 | #include <cmath> | ||
| 6 | #include <stdexcept> | ||
| 7 | |||
| 8 | namespace terraingen { | ||
| 9 | |||
| 10 | 6002698 | double LunarFreshCraterDepthRatio(double diameter) { | |
| 11 | 6002698 | if (!IsPositive(diameter)) { | |
| 12 | 4 | throw std::domain_error("Diameter must be positive and finite"); | |
| 13 | } | ||
| 14 | 6002694 | if (diameter <= 10.0) { | |
| 15 | 116266 | return 0.10; | |
| 16 | } | ||
| 17 | 5886428 | if (diameter < 40.0) { | |
| 18 | 4818461 | return 0.11; | |
| 19 | } | ||
| 20 | 1067967 | if (diameter < 100.0) { | |
| 21 | 835428 | return 0.13; | |
| 22 | } | ||
| 23 | 232539 | if (diameter < 200.0) { | |
| 24 | 203942 | return 0.15; | |
| 25 | } | ||
| 26 | 28597 | if (diameter < 400.0) { | |
| 27 | 26544 | return 0.17; | |
| 28 | } | ||
| 29 | 2053 | return 0.21; | |
| 30 | } | ||
| 31 | |||
| 32 | 6002875 | CraterMorphometry LunarFreshCraterMorphometry(double diameter) { | |
| 33 | 6002875 | if (diameter >= kLunarComplexCraterDiameter && std::isfinite(diameter)) { | |
| 34 | 188 | const KilometrePowerLaw depth{1.044, 0.301}; | |
| 35 | 188 | const KilometrePowerLaw rim{0.236, 0.399}; | |
| 36 | 188 | return {depth.At(diameter) / diameter, rim.At(diameter) / diameter}; | |
| 37 | } | ||
| 38 | 6002687 | return {LunarFreshCraterDepthRatio(diameter), kLunarFreshRimHeightRatio}; | |
| 39 | } | ||
| 40 | |||
| 41 | 17 | ComplexCraterShape LunarComplexCraterShape() { | |
| 42 | 17 | ComplexCraterShape shape; | |
| 43 | 17 | shape.transitionDiameter = kLunarComplexCraterDiameter; | |
| 44 | 17 | shape.floorDiameter = {0.187, 1.249}; | |
| 45 | 17 | shape.peakHeight = {0.589e-3, 1.969}; | |
| 46 | 17 | shape.peakVolume = {0.987e-7, 5.078}; | |
| 47 | 17 | shape.peakFitMaxDiameter = 51000.0; | |
| 48 | 17 | return shape; | |
| 49 | } | ||
| 50 | |||
| 51 | 19186 | CraterMorphometry MarsFreshCraterMorphometry(double diameter) { | |
| 52 | 19186 | if (!IsPositive(diameter)) { | |
| 53 | 1 | throw std::domain_error("Diameter must be positive and finite"); | |
| 54 | } | ||
| 55 | 19185 | if (diameter >= kMarsComplexCraterDiameter) { | |
| 56 | const KilometrePowerLaw rim = | ||
| 57 | 6 | diameter > 100000.0 ? KilometrePowerLaw{0.12, 0.35} : KilometrePowerLaw{0.02, 0.84}; | |
| 58 | 6 | return {KilometrePowerLaw{0.36, 0.49}.At(diameter) / diameter, rim.At(diameter) / diameter}; | |
| 59 | } | ||
| 60 | 19179 | return {std::fmin(0.23, KilometrePowerLaw{0.21, 0.81}.At(diameter) / diameter), | |
| 61 | 19179 | std::fmin(0.03, KilometrePowerLaw{0.04, 0.31}.At(diameter) / diameter)}; | |
| 62 | } | ||
| 63 | |||
| 64 | 5 | ComplexCraterShape MarsComplexCraterShape() { | |
| 65 | 5 | ComplexCraterShape shape; | |
| 66 | 5 | shape.transitionDiameter = kMarsComplexCraterDiameter; | |
| 67 | 5 | shape.floorDiameter = {0.187, 1.249}; | |
| 68 | 5 | shape.peakHeight = {0.04, 0.51}; | |
| 69 | 5 | shape.peakDiameter = KilometrePowerLaw{0.25, 1.05}; | |
| 70 | 5 | shape.peakFitMaxDiameter = 100000.0; | |
| 71 | 5 | return shape; | |
| 72 | } | ||
| 73 | |||
| 74 | } // namespace terraingen | ||
| 75 |