ARCS6 AR6-REV.24062600
読み取り中…
検索中…
一致する文字列を見つけられません
DataStorage.hh
[詳解]
1
8//
9// Copyright (C) 2011-2020 Yuki YOKOKURA
10// This program is free software;
11// you can redistribute it and/or modify it under the terms of the FreeBSD License.
12// For details, see the License.txt file.
13
14#ifndef DATASTORAGE
15#define DATASTORAGE
16
17#include <cassert>
18#include <array>
19#include <fstream>
20
21// ARCS組込み用マクロ
22#ifdef ARCS_IN
23 // ARCSに組み込まれる場合
24 #include "ARCSassert.hh"
25 #include "ARCSeventlog.hh"
26#else
27 // ARCSに組み込まれない場合
28 #define arcs_assert(a) (assert(a))
29 #define PassedLog()
30 #define EventLog(a)
31 #define EventLogVar(a)
32#endif
33
34namespace ARCS { // ARCS名前空間
36 enum class DataStorageType {
39 };
40
43 template <size_t NumOfVar, unsigned long SmplTime, unsigned int SaveTime, unsigned int Rate>
45 public:
46
49 : Data({0}), Buff({0}), Nindex(0), Tindex(0), Mcount(0)
50 {
51 PassedLog(); // イベントログにココを通過したことを記録
52 }
53
56 PassedLog(); // イベントログにココを通過したことを記録
57 }
58
61 template<typename T1, typename... T2> // 可変長引数テンプレート
62 void SetData(const T1& u1, const T2&... u2){
63 // 再帰で順番に可変長引数を読み込んでいく
64 if(Nindex < N) Buff.at(Nindex) = (double)u1; // 配列の要素を埋める
65 ++Nindex; // 再帰カウンタをインクリメント
66 SetData(u2...); // 自分自身を呼び出す(再帰)
67 }
68 void SetData(){
69 // 再帰の最後に呼ばれる関数
70 Nindex = 0; // 可変長引数の読み込み作業が終わったので,再帰カウンタを零に戻しておく
71 ++Mcount; // 間引き用カウンタ
72 if(Mcount % Rate == 0){ // 間引き条件計算
73 // データの格納
74 if(Tindex < T){ // 設定時間の範囲内であって,
75 for(size_t n = 0; n < N; ++n){
76 Data[n][Tindex] = Buff.at(n); // データを保持
77 }
78 ++Tindex; // 時間用カウンタを進める
79 }
80 }
81 }
82
86 void SaveDataFile(const std::string& FileName, const DataStorageType FileType) const {
87 // ファイルストリーム
88 std::ofstream fout(FileName.c_str(), std::ios::out | std::ios::trunc);
89
90 // エラーチェック
91 arcs_assert(fout.bad() == false); // 致命的なエラーの場合
92 arcs_assert(fout.fail() == false); // ファイル開くのに失敗した場合
93
94 // 書式設定
95 fout.setf(std::ios::scientific); // 指数表示
96 fout.width(15); // 総桁数
97 fout.precision(14); // 小数点桁数
98
99 // 実験データの書き出し
100 PassedLog(); // イベントログにココを通過したことを記録
101 for(size_t j = 0; j < Tindex; ++j){ // 時間分だけ回す
102 for(size_t i = 0; i < N; ++i){ // 変数の数だけ回す
103 fout << Data[i][j]; // 数値の書き出し
104 if(i < N-1){ // 最後の列以外のときは,
105 if(FileType == DataStorageType::FORMAT_CSV) fout << ','; // CSVの場合はコンマで区切る
106 if(FileType == DataStorageType::FORMAT_DAT) fout << '\t'; // DATの場合はタブで区切る
107 }
108 }
109 fout << std::endl; // 改行
110 }
111 PassedLog(); // イベントログにココを通過したことを記録
112 }
113
115 void ClearCounter(void){
116 Tindex = 0;
117 Mcount = 0;
118 }
119
120 private:
121 DataStorage(const DataStorage&) = delete; // コピーコンストラクタ使用禁止
122 const DataStorage& operator=(const DataStorage&) = delete; // 代入演算子使用禁止
123
124 static constexpr size_t N = NumOfVar;
125 static constexpr size_t T = SaveTime*1e9/SmplTime/Rate;
126 std::array<std::array<double, T>, N> Data;
127 std::array<double, N> Buff;
128 size_t Nindex;
129 size_t Tindex;
130 size_t Mcount;
131 };
132}
133
134#endif
135
ARCS イベントログクラス
#define PassedLog()
イベントログ用マクロ(ファイルと行番号のみ記録版)
Definition ARCSeventlog.hh:26
ARCS用ASSERTクラス
#define arcs_assert(a)
ARCS用assertマクロ a : assert条件
Definition ARCSassert.hh:17
DataStorageType
ファイル形式の定義
Definition DataStorage.hh:36
@ FORMAT_CSV
CSVファイルとして保存
@ FORMAT_DAT
DAT(タブ区切り)ファイルとして保存
データ格納/ファイル出力クラス(テンプレート版)
Definition DataStorage.hh:44
DataStorage()
コンストラクタ
Definition DataStorage.hh:48
void ClearCounter(void)
要素数カウンタをクリア
Definition DataStorage.hh:115
~DataStorage()
デストラクタ
Definition DataStorage.hh:55
void SaveDataFile(const std::string &FileName, const DataStorageType FileType) const
CSV/DATファイルの保存
Definition DataStorage.hh:86
void SetData(const T1 &u1, const T2 &... u2)
データを格納する関数
Definition DataStorage.hh:62