private static HorizonSample[] ReadHorizon(string horizonPath)
        {
            var horizonSamples = CsvReading.ReadCsvFromFile <HorizonSample>(horizonPath, "\t")
                                 .Where(s => s.Amplitude != NullValue && s.Porosity != NullValue && s.Z != NullValue)
                                 .ToArray();

            Console.WriteLine($"Read {horizonSamples.Length} horizon samples.");
            return(horizonSamples);
        }
        private static void Crunch(CrunchOptions opts)
        {
            HorizonSample[] horizonSamples = ReadHorizon(opts.HorizonPath);
            var             wells          = CsvReading.ReadCsvFromFile <Location>(opts.WellPath)
                                             .ToArray();

            Console.WriteLine($"Read {wells.Length} well locations.");
            if (horizonSamples[0].DistanceToNearestWell == 0)
            {
                Console.WriteLine("Calculating distances...");
                foreach (var sample in horizonSamples)
                {
                    sample.DistanceToNearestWell = DistanceToNearestWell(sample, wells);
                }
            }
            else
            {
                Console.WriteLine("Skipping distance calculation because distance already in horizon file.");
            }
            Console.WriteLine("Writing output...");
            CsvReading.WriteCsvToFile(opts.OutputPath, horizonSamples);
            Console.WriteLine("Done.");
            Console.WriteLine("You're welcome.");
        }