1 #ifndef CNTR_DIFFERENTIATION_IMPL_H 2 #define CNTR_DIFFERENTIATION_IMPL_H 26 void deriv1_timestep(
int tstp, herm_matrix<T> &dA, herm_matrix<T> &A, herm_matrix<T> &Acc,
28 int tstp2, nt = A.nt();
30 deriv1_matsubara(dA, A,
I, beta);
33 for (tstp2 = 0; tstp2 <= nt; tstp2++)
34 deriv1_element(tstp, tstp2, dA, A, Acc,
I, h);
35 deriv1_tv(tstp, dA, A,
I, h);
42 void deriv2_timestep(
int tstp, herm_matrix<T> &dA, herm_matrix<T> &A, herm_matrix<T> &Acc,
44 int tstp2, nt = A.nt();
46 deriv1_matsubara(dA, A,
I, beta);
49 for (tstp2 = 0; tstp2 <= nt; tstp2++)
50 deriv2_element(tstp, tstp2, dA, A, Acc,
I, h);
51 deriv2_tv(tstp, dA, A,
I, beta);
63 typedef std::complex<T>
cplx;
64 int tstp2, l, k =
I.get_k(), k1 = k + 1, k2 = int(k1 / 2), ntau = A.ntau();
66 double hv = beta / ntau;
70 for (tstp2 = 0; tstp2 < k1; tstp2++)
74 for (l = 0; l <= k1; l++) {
75 A.get_mat(tstp2 + l, a);
76 c -= a *
I.bd_weights(l);
83 for (l = 0; l <= k1; l++) {
84 A.get_mat(ntau - tstp2 - l, a);
85 c += a *
I.bd_weights(l);
88 dA.set_mat(ntau - tstp2, c);
93 for (tstp2 = k1; tstp2 <= ntau - k1; tstp2++)
101 for (l = 0; l <= k1; l++) {
102 A.get_mat(tstp2 - l, a);
103 c += a *
I.bd_weights(l);
106 dA.set_mat(tstp2, c);
159 template <
typename T>
160 void deriv1_element(
int tstp1,
int tstp2, herm_matrix<T> &dA, herm_matrix<T> &A,
162 typedef std::complex<T>
cplx;
163 int l, k =
I.get_k(), k1 = k + 1;
166 if ((tstp1 == -1) || (tstp2 == -1)) {
167 std::cerr <<
"deriv1_element only on real times" << std::endl;
170 if (tstp2 <= tstp1) {
174 for (l = 0; l <= k; l++)
180 Acc.get_ret(tstp2, l, a);
183 A.get_ret(l, tstp2, a);
185 c += a *
I.poly_differentiation(tstp1, l);
188 for (l = 0; l <= k1; l++) {
189 if ((tstp1 - l) < tstp2) {
190 Acc.get_ret(tstp2, tstp1 - l, a);
193 A.get_ret(tstp1 - l, tstp2, a);
195 c += a *
I.bd_weights(l);
199 dA.set_ret(tstp1, tstp2, c);
201 if (tstp2 >= tstp1) {
205 for (l = 0; l <= k; l++)
208 Acc.get_les(tstp2, l, a);
211 A.get_les(l, tstp2, a);
213 c += a *
I.poly_differentiation(tstp1, l);
216 for (l = 0; l <= k1; l++) {
220 Acc.get_les(tstp2, tstp1 - l, a);
223 A.get_les(tstp1 - l, tstp2, a);
225 c += a *
I.bd_weights(l);
229 dA.set_les(tstp1, tstp2, c);
238 template <
typename T>
239 void deriv2_element(
int tstp1,
int tstp2, herm_matrix<T> &dA, herm_matrix<T> &A,
241 typedef std::complex<T>
cplx;
242 int l, k =
I.get_k(), k1 = k + 1;
244 minusi =
cplx(0, -1);
245 if ((tstp1 == -1) || (tstp2 == -1)) {
246 std::cerr <<
"deriv2_element only on real times" << std::endl;
249 if (tstp2 <= tstp1) {
253 for (l = 0; l <= k; l++)
256 Acc.get_ret(l, tstp1, a);
259 A.get_ret(tstp1, l, a);
261 c += a *
I.poly_differentiation(tstp2, l);
264 for (l = 0; l <= k1; l++) {
265 if (tstp1 < (tstp2 - l)) {
266 Acc.get_ret(tstp2 - l, tstp1, a);
269 A.get_ret(tstp1, tstp2 - l, a);
271 c += a *
I.bd_weights(l);
275 dA.set_ret(tstp1, tstp2, c);
277 if (tstp2 >= tstp1) {
281 for (l = 0; l <= k; l++)
284 Acc.get_les(l, tstp1, a);
287 A.get_les(tstp1, l, a);
289 c += a *
I.poly_differentiation(tstp2, l);
292 for (l = 0; l <= k1; l++) {
295 if (tstp1 > tstp2 - l) {
296 Acc.get_les(tstp2 - l, tstp1, a);
299 A.get_les(tstp1, tstp2 - l, a);
301 c += a *
I.bd_weights(l);
305 dA.set_les(tstp1, tstp2, c);
313 template <
typename T>
314 void deriv1_tv(
int tstp, herm_matrix<T> &dA, herm_matrix<T> &A,
316 typedef std::complex<T>
cplx;
317 int tstp2, l, k =
I.get_k(), k1 = k + 1, ntau = A.ntau();
321 std::cerr <<
"deriv1_tv requires real time (left)" << std::endl;
325 for (tstp2 = 0; tstp2 <= ntau; tstp2++)
329 for (l = 0; l <= k; l++)
332 A.get_tv(l, tstp2, a);
333 c += a *
I.poly_differentiation(tstp, l);
336 for (l = 0; l <= k1; l++) {
338 A.get_tv(tstp - l, tstp2, a);
339 c += a *
I.bd_weights(l);
343 dA.set_tv(tstp, tstp2, c);
351 template <
typename T>
352 void deriv2_tv(
int tstp, herm_matrix<T> &dA, herm_matrix<T> &A,
354 typedef std::complex<T>
cplx;
355 int tstp2, l, k =
I.get_k(), k1 = k + 1, ntau = A.ntau();
357 double hv = beta / ntau;
359 std::cerr <<
"deriv2_tv requires real time (left)" << std::endl;
363 for (tstp2 = 0; tstp2 <= ntau; tstp2++)
367 for (l = 0; l <= k; l++)
370 A.get_tv(tstp, l, a);
371 c += a *
I.poly_differentiation(tstp2, l);
374 for (l = 0; l <= k1; l++) {
376 A.get_tv(tstp, tstp2 - l, a);
377 c += a *
I.bd_weights(l);
381 dA.set_tv(tstp, tstp2, c);
389 template <
typename T>
391 deriv1_matsubara(dA, A, integration::I<T>(SolveOrder), beta);
393 template <
typename T>
396 deriv1_element(tstp1, tstp2, dA, A, Acc, integration::I<T>(SolveOrder), h);
398 template <
typename T>
401 deriv2_element(tstp1, tstp2, dA, A, Acc, integration::I<T>(SolveOrder), h);
403 template <
typename T>
405 T h,
int SolveOrder){
406 deriv1_tv(tstp, dA, A, integration::I<T>(SolveOrder), h);
408 template <
typename T>
410 T beta,
int SolveOrder){
411 deriv2_tv(tstp, dA, A, integration::I<T>(SolveOrder), beta);
413 template <
typename T>
415 T beta, T h,
int SolveOrder){
416 deriv1_timestep(tstp, dA, A, Acc, integration::I<T>(SolveOrder), beta, h);
418 template <
typename T>
420 T beta, T h,
int SolveOrder){
421 deriv2_timestep(tstp, dA, A, Acc, integration::I<T>(SolveOrder), beta, h);
426 #endif // CNTR_DIFFERENTIATION_IMPL_H Class Integrator contains all kinds of weights for integration and differentiation of a function at ...
std::complex< double > cplx
Integrator< T > & I(int k)
Class herm_matrix for two-time contour objects with hermitian symmetry.