forked from rikigigi/analisi
-
Notifications
You must be signed in to change notification settings - Fork 0
/
traiettoria.h
77 lines (64 loc) · 2.59 KB
/
traiettoria.h
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
/**
*
* (c) Riccardo Bertossa, 2019
*
* Use at your own risk.
*
* If you modified the code, I could be happy if you contribute on github!
*
**/
#ifndef TRAIETTORIA_H
#define TRAIETTORIA_H
#include <string>
#include <stdio.h>
#include <iostream>
#include <vector>
#include <map>
#include "traiettoriabase.h"
struct Intestazione_timestep;
struct Chunk;
/**
* Questa classe garantisce un accesso veloce ai timestep caricati con imposta_inizio_accesso
* , che carica tutti i timestepa partendo da quello specificato in un numero pari a quello richiesto
* con la funzione imposta_dimensione_finestra_accesso in precedenza. Caricare nuovi pezzi costa nuove
* allocazioni (e deallocazioni) di memoria e tempo cpu. Il file viene letto tramite la chiamata di sistema mmap.
* Nel programma vengono allocati con new [] solo degli array dove vengono immagazzinati i dati
* della finestra (quindi consumando meno memoria che nel caricamento del file in un unico colpo)
**/
class Traiettoria : public TraiettoriaBase<Traiettoria>
{
public:
Traiettoria(std::string filename);
~Traiettoria();
double * posizioni (const int & timestep, const int & atomo);
double * velocita (const int & timestep, const int & atomo);
double * scatola (const int & timestep);
double * posizioni_cm(const int & timestep, const int & tipo);
double * velocita_cm(const int & timestep, const int & tipo);
double *scatola_last();
using TraiettoriaBase<Traiettoria>::Errori;
Traiettoria::Errori imposta_dimensione_finestra_accesso(const int & timesteps);
Traiettoria::Errori imposta_inizio_accesso(const int & timesteps);
int64_t get_timestep_lammps(unsigned int timestep);
void index_all();
// void set_calculate_center_of_mass(bool);
// bool get_calculate_center_of_mass();
private:
std::map<int,unsigned int>id_map;
size_t * timesteps; // puntatori (offset rispetto all'inizio) all'inizio di ogni timesteps
int64_t * timesteps_lammps; // timesteps secondo lammps
void allunga_timesteps(unsigned int nuova_dimensione);
size_t leggi_pezzo(const size_t & partenza,Intestazione_timestep * ×tep,Chunk * &chunk);
size_t leggi_pezzo_intestazione(const size_t & partenza, Intestazione_timestep * ×tep);
void init_buffer_tipi();
int fd;
size_t fsize,tstep_size;
char * file;
int timestep_corrente,timestep_finestra,timestep_indicizzato;
bool ok,dati_caricati,indexed_all;
bool triclinic;
bool calculate_center_of_mass;
long pagesize;
size_t allinea_offset(const size_t & offset, size_t & differenza);
};
#endif // TRAIETTORIA_H