|
29 | 29 | """ |
30 | 30 |
|
31 | 31 | import os |
| 32 | +from pathlib import Path |
32 | 33 | import numpy as np |
33 | 34 | import warnings |
34 | 35 |
|
@@ -575,6 +576,43 @@ def __init__(self): |
575 | 576 | self.add_attribute('storm_specification_type', 0) # Type of parameterized storm |
576 | 577 | self.add_attribute("storm_file", None) # File containing data |
577 | 578 |
|
| 579 | + def read(self, path: Path=Path("surge.data"), force: bool=False): |
| 580 | + """Read surge data file""" |
| 581 | + |
| 582 | + with Path(path).open() as data_file: |
| 583 | + # Header |
| 584 | + data_file.readline() |
| 585 | + data_file.readline() |
| 586 | + data_file.readline() |
| 587 | + data_file.readline() |
| 588 | + data_file.readline() |
| 589 | + data_file.readline() |
| 590 | + |
| 591 | + self.wind_forcing = bool(data_file.readline()) |
| 592 | + self.drag_law = int(data_file.readline().split("=:")[0]) |
| 593 | + self.pressure_forcing = bool(data_file.readline().split("=:")[0]) |
| 594 | + self.rotation_override = data_file.readline().split("=:")[0] |
| 595 | + data_file.readline() |
| 596 | + |
| 597 | + self.wind_index = int(data_file.readline().split("=:")[0]) - 1 |
| 598 | + self.pressure_index = int(data_file.readline().split("=:")[0]) - 1 |
| 599 | + self.display_landfall_time = bool(data_file.readline().split("=:")[0]) |
| 600 | + data_file.readline() |
| 601 | + |
| 602 | + # AMR parameters |
| 603 | + self.wind_refine = self._parse_value(data_file.readline()) |
| 604 | + self.R_refine = self._parse_value(data_file.readline()) |
| 605 | + data_file.readline() |
| 606 | + |
| 607 | + # Storm specification |
| 608 | + self.storm_specification_type = int(data_file.readline().split("=:")[0]) |
| 609 | + line = data_file.readline().split("=:")[0] |
| 610 | + if line[0] == "'": |
| 611 | + self.storm_file = line.strip()[1:-1] |
| 612 | + else: |
| 613 | + raise IOError("Error reading storm file name.") |
| 614 | + |
| 615 | + |
578 | 616 | def write(self, out_file='surge.data', data_source="setrun.py"): |
579 | 617 | """Write out the data file to the path given""" |
580 | 618 |
|
@@ -697,21 +735,14 @@ def read(self, path="friction.data", force=False): |
697 | 735 | # Regions |
698 | 736 | self.friction_regions = [] |
699 | 737 | for n in range(num_regions): |
700 | | - lower = self._convert_line(data_file.readline()) |
701 | | - upper = self._convert_line(data_file.readline()) |
702 | | - depths = self._convert_line(data_file.readline()) |
703 | | - coeff = self._convert_line(data_file.readline()) |
| 738 | + lower = self._parse_value(data_file.readline()) |
| 739 | + upper = self._parse_value(data_file.readline()) |
| 740 | + depths = self._parse_value(data_file.readline()) |
| 741 | + coeff = self._parse_value(data_file.readline()) |
704 | 742 | self.friction_regions.append([lower, upper, depths, coeff]) |
705 | 743 | data_file.readline() |
706 | 744 | self.friction_files = [] # Is not supported |
707 | 745 |
|
708 | | - def _convert_line(self, line): |
709 | | - values = [] |
710 | | - for value in line.split("=:")[0].split(" "): |
711 | | - if len(value) > 1: |
712 | | - values.append(float(value)) |
713 | | - return values |
714 | | - |
715 | 746 |
|
716 | 747 | def write(self, out_file='friction.data', data_source='setrun.py'): |
717 | 748 |
|
@@ -911,4 +942,3 @@ def write(self,out_file='bouss.data',data_source='setrun.py'): |
911 | 942 | self.data_write('bouss_min_depth') |
912 | 943 |
|
913 | 944 | self.close_data_file() |
914 | | - |
|
0 commit comments