Coverage for gamdpy/calculators/calculator_hydrodynamic_correlations.py: 73%
74 statements
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-14 15:55 +0200
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-14 15:55 +0200
1import numpy as np
2import gamdpy as gp
3from numba import jit
4import math
5import cmath
7@jit(nopython=True)
8def __store__(dk, dmk, jk, jmk, sampletype, mass, pos, vel, ptypes, npart, index, nwaves, lbox):
10 I = complex(0.0, 1.0)
12 for k in range(nwaves):
13 dk[index, k], dmk[index, k] = complex(0.0, 0.0), complex(0.0, 0.0)
14 jk[index, k], jmk[index, k] = complex(0.0, 0.0), complex(0.0, 0.0)
16 kwave = 2.0*math.pi*(k+1)/lbox
18 for n in range(npart):
19 if ptypes[n] == sampletype or sampletype == -1:
20 kfac = cmath.exp(I*kwave*pos[n])
21 mkfac = cmath.exp(-I*kwave*pos[n])
23 dk[index, k] = dk[index, k] + mass[n]*kfac
24 dmk[index, k] = dmk[index, k] + mass[n]*mkfac
26 jk[index, k] = jk[index, k] + mass[n]*vel[n]*kfac
27 jmk[index, k] = jmk[index, k] + mass[n]*vel[n]*mkfac
30@jit(nopython=True)
31def __calccorr__(dacf, jacf, dk, dmk, jk, jmk, nwaves, lvec):
33 for k in range(nwaves):
34 for n in range(lvec):
35 for nn in range(lvec-n):
36 dacf[n, k] = dacf[n,k] + dk[nn,k]*dmk[nn+n, k]
37 jacf[n, k] = jacf[n,k] + jk[nn,k]*jmk[nn+n, k]
41class CalculatorHydrodynamicCorrelations:
42 """
43 Calculates the tranverse current autocorrelation function (jacf) and
44 the longitudinal density autocorrelation function (dacf).
46 Example: See hydrocorr.py
48 Initialization variables
49 - configuration: Instance of the configuration class
50 - dtsample: Time between sampling (= integrator time step * steps_per_timeblock)
51 - ptype: The particle type for which the correlations are calculated (default 0)
52 - nwaves: Number of wavevectors (default 10)
53 - lvec: Length of the time vector - sample time span then dtsample*lvec (defulat 100)
54 - verbose: Write a bit to screen (default False)
56 Output:
57 With the method read() data is written to files and returned to user
58 """
60 def __init__(self, configuration, dtsample, ptype=0, nwaves=10, lvec=100, verbose=False):
61 self.conf = configuration
62 self.ptype = ptype
63 self.nwaves = nwaves
64 self.lvec = lvec
65 self.dt = dtsample
67 self.nsample = 0
68 self.index = 0
70 self.lbox = configuration.simbox.get_lengths()[1]
72 # Storage arrays
73 self.dk = np.zeros( (lvec, nwaves), dtype=np.complex64)
74 self.dmk = np.zeros( (lvec, nwaves), dtype=np.complex64)
76 self.jk = np.zeros( (lvec, nwaves), dtype=np.complex64)
77 self.jmk = np.zeros( (lvec, nwaves), dtype=np.complex64)
79 # Correlation array - density (longitudinal)
80 self.dacf = np.zeros( (lvec, nwaves), dtype=np.complex64)
82 # Current density acf (transverse)
83 self.jacf = np.zeros( (lvec, nwaves), dtype=np.complex64)
86 if verbose:
87 print(f"Types {self.ptype}, no. wavevectors {self.nwaves}, vector length {self.lvec}")
92 def update(self):
94 __store__(self.dk, self.dmk, self.jk, self.jmk, self.ptype,
95 self.conf['m'][:], self.conf['r'][:,0], self.conf['v'][:,1],
96 self.conf.ptype[:], self.conf.N, self.index, self.nwaves, self.lbox)
98 self.index = self.index + 1
100 if self.index == self.lvec:
101 __calccorr__(self.dacf, self.jacf, self.dk, self.dmk, self.jk, self.jmk, self.nwaves, self.lvec)
103 self.nsample = self.nsample + 1
104 self.index = 0
109 def read(self, save=True, fname_dacf="dacf.dat", fname_jacf="jacf.dat"):
111 if self.nsample > 0:
113 volume = self.conf.simbox.get_volume()
116 out_dacf = np.zeros( (self.lvec, self.nwaves) )
117 out_jacf = np.zeros( (self.lvec, self.nwaves) )
119 file_dacf = open(fname_dacf, "w")
120 file_jacf = open(fname_jacf, "w")
122 for n in range(self.lvec):
124 fac = 1.0/(self.nsample*(self.lvec-n)*volume)
126 file_dacf.write("%f " % (self.dt*n))
127 file_jacf.write("%f " % (self.dt*n))
129 for k in range(self.nwaves):
130 out_dacf[n,k] = self.dacf[n, k].real*fac
131 out_jacf[n,k] = self.jacf[n, k].real*fac
132 file_dacf.write("%f " % (out_dacf[n,k]))
133 file_jacf.write("%f " % (out_jacf[n,k]))
135 file_dacf.write("\n")
136 file_jacf.write("\n")
138 file_dacf.close()
139 file_jacf.close()
141 return (out_dacf, out_jacf)
143 else:
144 return (0,0)