forked from rikigigi/analisi
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathchargefluxts.cpp
100 lines (76 loc) · 2.83 KB
/
chargefluxts.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
/**
*
* (c) Riccardo Bertossa, 2019
*
* Use at your own risk.
*
* If you modified the code, I could be happy if you contribute on github!
*
**/
#include "chargefluxts.h"
ChargeFluxTs::ChargeFluxTs(Traiettoria *t) :
traiettoria(t),J(0),timestep_finestra(0),calcolato(false)
{
}
ChargeFluxTs::~ChargeFluxTs() {
delete [] J;
}
void ChargeFluxTs::reset(unsigned int numeroTimestepPerBlocco) {
if (timestep_finestra!=numeroTimestepPerBlocco) {
delete [] J;
timestep_finestra=numeroTimestepPerBlocco;
J=new double [timestep_finestra*3];
calcolato=false;
}
}
void ChargeFluxTs::calcola(unsigned int timestep) {
//se ho già calcolato i dati per certi timesteps, li ricopia semplicemente senza calcolare tutto di nuovo.
int timestep_copy_tstart=0,timestep_copy_tend=0,
timestep_read_start=0, timestep_read_end=timestep_finestra,
finestra_differenza=timestep_corrente-timestep;
if (calcolato) {
if (abs(finestra_differenza)<timestep_finestra) { // si sovrappongono
if (finestra_differenza>0){
timestep_copy_tstart=0;
timestep_copy_tend=timestep_finestra-finestra_differenza;
timestep_read_end=finestra_differenza;
timestep_read_start=0;
} else {
timestep_copy_tstart=-finestra_differenza;
timestep_copy_tend=timestep_finestra;
timestep_read_start=finestra_differenza+timestep_finestra;
timestep_read_end=timestep_finestra;
}
}
}
//copia i dati già calcolati
for (int i=timestep_copy_tstart;i<timestep_copy_tend;i++) {
for (int idata=0;idata<3;idata++) {
J[(finestra_differenza+i)*3+idata]=J[i*3+idata];
}
}
for (unsigned int istep=timestep_read_start;istep<timestep_read_end;istep++){
unsigned int t=timestep+istep;
for (unsigned int i=0;i<3;i++)
J[istep*3+i]=0.0;
for (unsigned int iatom=0;iatom<traiettoria->get_natoms();iatom++) {
for (unsigned int i=0;i<3;i++){
J[istep*3+i]+=traiettoria->velocita(t,iatom)[i]
*traiettoria->get_charge(traiettoria->get_type(iatom));
}
}
for (unsigned int i=0;i<3;i++)
J[istep*3+i]/=double(traiettoria->get_natoms());
}
timestep_corrente=timestep;
calcolato=true;
}
double * ChargeFluxTs::J_z(const unsigned int & timestep) {
if (timestep >= timestep_corrente && timestep <timestep_corrente+timestep_finestra) {
return & J[(timestep-timestep_corrente)*3];
} else {
std::cerr << "Errore: richiesta la corrente di carica per un timestep fuori dall'intervallo per cui la corrente è stata calcolata!\n";
abort();
return 0;
}
}