forked from rikigigi/analisi
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathheatfluxts.cpp
119 lines (98 loc) · 3.38 KB
/
heatfluxts.cpp
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/**
*
* (c) Riccardo Bertossa, 2019
*
* Use at your own risk.
*
* If you modified the code, I could be happy if you contribute on github!
*
**/
#include "heatfluxts.h"
#include <fstream>
#include <sstream>
//TODO: anche questo dovrebbe leggere il file a blocchi!
HeatFluxTs::HeatFluxTs(std::string filename, Traiettoria *t,unsigned int skip)
: traiettoria(t),heatflux(0),skip(skip)
{
heatflux = new double [traiettoria->get_ntimesteps()*3/skip];
T = new double [traiettoria->get_ntimesteps()];
size=traiettoria->get_ntimesteps();
std::ifstream log(filename);
//trova l'inizio dei dati
std::string head_heat =
"Step Time PotEng TotEng Lx Press Temp c_flusso[1] c_flusso[2] c_flusso[3] ";
std::string tmp;
while (log.good()) {
std::getline(log,tmp);
if (tmp==head_heat)
break;
}
if (!log.good()) {
std::cerr << "Errore: impossibile trovare nel file di log \""<<filename<<"\" l'intestazione \""<<head_heat<<"\"\n";
abort();
}
unsigned int cur_ts=0;
while (log.good() && cur_ts*skip < traiettoria->get_ntimesteps()) {
int64_t step;
double time=.0, poteng=.0,toteng=.0,lx=.0,press=.0,temp=.0, j[3]={0.0,0.0,0.0};
std::getline(log,tmp);
if (tmp.find("Loop time")!=std::string::npos){
while (log.good()) {
std::getline(log,tmp);
if (tmp==head_heat)
break;
}
if (!log.good()) {
std::cerr << "Errore: impossibile trovare nel file di log \""<<filename<<"\" l'intestazione \""<<head_heat<<"\"\n";
abort();
}
std::getline(log,tmp);
}
std::stringstream sstr(tmp);
sstr >> step >> time >> poteng >> toteng >> lx >> press >> temp >>
j[0] >> j[1] >> j[2];
if (traiettoria->get_timestep_lammps(cur_ts*skip)>step){
continue;
} else if (traiettoria->get_timestep_lammps(cur_ts*skip)<step) {
std::cerr << "Errore: i frame dei file non corrispondono ( frame "<< cur_ts*skip<<", "<<traiettoria->get_timestep_lammps(cur_ts*skip) << " e "<<step <<")! (forse il file di log ha una risoluzione temporale minore della traiettoria?)\n";
abort();
break;
}
//se sono qui vuol dire che i frame corrispondono, deco leggere il dato, che è quello giusto.
for (unsigned int i=0;i<3;i++)
heatflux[cur_ts*3+i]=j[i];
T[cur_ts]=temp;
L=lx;
cur_ts++;
}
}
double * HeatFluxTs::flux(unsigned int ts) {
if (ts%skip !=0){
std::cerr << "Errore: richiesto un timestep che non è stato letto (salto ogni "<<skip<<" timesteps)\n";
abort();
}
if (ts<size)
return &heatflux[ts*3/skip];
else {
std::cerr << "Errore: richiesto un flusso di calore fuori dai limiti caricati!\n";
abort();
return 0;
}
}
double * HeatFluxTs::temp(unsigned int ts) {
if (ts%skip !=0){
std::cerr << "Errore: richiesto un timestep che non è stato letto (salto ogni "<<skip<<" timesteps)\n";
abort();
}
if (ts<size)
return &T[ts/skip];
else {
std::cerr << "Errore: richiesta una temperatura fuori dai limiti caricati!\n";
abort();
return 0;
}
}
HeatFluxTs::~HeatFluxTs() {
delete [] heatflux;
delete [] T;
}