arldatastream.cc 3.16 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include "radixio/arldatastream.hh"

#include "radixbug/bug.hh"
#include "radixcore/stringfunctions.hh"

#include <fstream>
namespace radix
{
class ARLDataStream::PImpl
{
 public:
  std::string file;
  std::shared_ptr<std::fstream> stream;
};

void ARLDataStream::expand(const std::string& val, ARLIndexHeader& index)
{
  if (val.size() < 50)
  {
    throw std::runtime_error(
        "Incorrect size for string expandsion to ARLIndexHeader.");
  }
  index.year  = std::atoi(val.substr(0, 2).c_str());
  index.month = std::atoi(val.substr(2, 2).c_str());
  index.day   = std::atoi(val.substr(4, 2).c_str());
  index.hour  = std::atoi(val.substr(6, 2).c_str());
  index.ic    = std::atoi(val.substr(8, 2).c_str());
  index.il    = std::atoi(val.substr(10, 2).c_str());
  index.cgrid = val.substr(12, 2).c_str();
  index.kvar  = val.substr(14, 4);
  index.nexp  = std::atoi(val.substr(18, 4).c_str());
  index.prec  = float(std::atof(val.substr(22, 14).c_str()));
  index.var1  = float(std::atof(val.substr(36, 14).c_str()));
}
void ARLDataStream::expand(const std::string& val, const ARLIndexHeader& index,
                           ARLHeader& header)
{
  if (val.size() < 108)
  {
    throw std::runtime_error(
        "Incorrect size for string expansion to ARLHeader.");
  }
  header.model_id = val.substr(0, 4);
  header.icx      = std::atoi(val.substr(4, 3).c_str());
  header.mn       = std::atoi(val.substr(7, 2).c_str());
  header.pole_lat = float(std::atof(val.substr(9, 7).c_str()));
  header.pole_lon = float(std::atof(val.substr(16, 7).c_str()));
  header.ref_lat  = float(std::atof(val.substr(23, 7).c_str()));
  header.ref_lon  = float(std::atof(val.substr(30, 7).c_str()));
  header.size     = float(std::atof(val.substr(37, 7).c_str()));
  header.orient   = float(std::atof(val.substr(44, 7).c_str()));
  header.tang_lat = float(std::atof(val.substr(51, 7).c_str()));
  header.sync_xp  = float(std::atof(val.substr(58, 7).c_str()));
  header.sync_yp  = float(std::atof(val.substr(65, 7).c_str()));
  header.sync_lat = float(std::atof(val.substr(72, 7).c_str()));
  header.sync_lon = float(std::atof(val.substr(79, 7).c_str()));
  header.dummy    = float(std::atof(val.substr(86, 7).c_str()));
  header.nx       = std::atoi(val.substr(93, 3).c_str());
  header.ny       = std::atoi(val.substr(96, 3).c_str());
  header.nz       = std::atoi(val.substr(99, 3).c_str());
  header.z_flag   = std::atoi(val.substr(102, 2).c_str());
  header.lenh     = std::atoi(val.substr(104, 4).c_str());

  int knx = ordinal(index.cgrid[0]);
  int kny = ordinal(index.cgrid[1]);
  // Check for the grid domain extending beyond 3 digits
  if (knx >= 64 || kny >= 64)
  {
    header.nx = (knx - 64) * 1000 + header.nx;
    header.ny = (kny - 64) * 1000 + header.ny;
  }
}

ARLDataStream::ARLDataStream(const std::string& file)
    : p(new PImpl(), [](PImpl* impl) { delete impl; })
{
  p->file = file;
}

/**
 * @brief The ARLRecord::PImpl class
 */
class ARLRecord::PImpl
{
 public:
};
ARLRecord::ARLRecord()
    : p(new ARLRecord::PImpl(), [](ARLRecord::PImpl* impl) { delete impl; })
{
}

ARLRecord::ARLRecord(const ARLRecord& orig)
    : p(new ARLRecord::PImpl(), [](ARLRecord::PImpl* impl) { delete impl; })
{
}

}  // namespace radix