32INTEGER (KIND=c_int) FUNCTION s_of_k_t (NQ_IN, XA_IN, MIN_IN, N_SETS, SETS_T, &
33 DELTA_T, Q_NUM, Q_LIST, N_FREQ) bind (C,NAME='s_of_k_t_')
51INTEGER (KIND=c_int),
INTENT(IN) :: nq_in
52INTEGER (KIND=c_int),
INTENT(IN) :: xa_in
53INTEGER (KIND=c_int),
INTENT(IN) :: min_in
54INTEGER (KIND=c_int),
INTENT(IN) :: n_sets
55INTEGER (KIND=c_int),
DIMENSION(N_SETS),
INTENT(IN) :: sets_t
56INTEGER (KIND=c_int),
INTENT(IN) :: q_num
57INTEGER (KIND=c_int),
INTENT(IN) :: n_freq
59real(kind=c_double) :: delta_t
60real(kind=c_double),
DIMENSION(Q_NUM),
INTENT(IN) :: q_list
63INTEGER,
DIMENSION(:),
ALLOCATABLE :: qid
64INTEGER,
DIMENSION(:),
ALLOCATABLE :: sqw_qlist
65DOUBLE PRECISION :: factor, xfactor
66DOUBLE PRECISION,
DIMENSION (:),
ALLOCATABLE :: sqtab, sqw_tab, sqw_qval
67DOUBLE PRECISION,
DIMENSION(:,:),
ALLOCATABLE :: skt_tab
68DOUBLE PRECISION,
DIMENSION(:,:),
ALLOCATABLE :: rho_c, rho_s
69DOUBLE PRECISION,
DIMENSION(:,:),
ALLOCATABLE :: nsqt, xsqt
70DOUBLE PRECISION,
DIMENSION(:,:,:),
ALLOCATABLE :: localcorr
71DOUBLE PRECISION,
DIMENSION(:,:,:,:),
ALLOCATABLE :: sqt
74 DOUBLE PRECISION FUNCTION fqx(TA, Q)
75 INTEGER,
INTENT(IN) :: ta
76 DOUBLE PRECISION,
INTENT(IN) :: q
82 call show_error (
"Impossible to allocate memory"//char(0), &
83 "Function: s_of_k_t"//char(0),
"Table: SQT"//char(0))
89allocate(nsqt(nq_in,
ns-min_in), stat=
err)
91 call show_error (
"Impossible to allocate memory"//char(0), &
92 "Function: s_of_k_t"//char(0),
"Table: NSQT"//char(0))
98allocate(xsqt(nq_in,
ns-min_in), stat=
err)
100 call show_error (
"Impossible to allocate memory"//char(0), &
101 "Function: s_of_k_t"//char(0),
"Table: XSQT"//char(0))
110 call show_error (
"Impossible to allocate memory"//char(0), &
111 "Function: s_of_k_t"//char(0),
"Table: RHO_C"//char(0))
117 call show_error (
"Impossible to allocate memory"//char(0), &
118 "Function: s_of_k_t"//char(0),
"Table: RHO_S"//char(0))
124 call show_error (
"Impossible to allocate memory"//char(0), &
125 "Function: s_of_k_t"//char(0),
"Table: LocalCorr"//char(0))
131call fourier_trans_qvect_skt (min_in)
138if (
allocated(
modq))
deallocate(
modq)
147if (xa_in .eq. 1)
then
164 if (xa_in .eq. 1)
then
176 if (xa_in .eq. 1)
then
200if (
allocated(sqtab))
deallocate(sqtab)
201allocate(sqtab(nq_in), stat=
err)
203 call show_error (
"Impossible to allocate memory"//char(0), &
204 "Function: s_of_k_t"//char(0),
"Table: SQTAB"//char(0))
209if (
allocated(qid))
deallocate(qid)
210allocate(qid(nq_in), stat=
err)
212 call show_error (
"Impossible to allocate memory"//char(0), &
213 "Function: s_of_k_t"//char(0),
"Table: QID"//char(0))
227call save_xsk (nsq, sqtab)
229if (skt_save(nsq) .eq. 0)
then
235if (
nsp .eq. 2) pid=pid+8
237if (n_sets .eq. 1 .and. sets_t(1) .eq. -1)
then
238 pid = pid*(
ns-min_in)
243if (q_num .gt. 0)
then
244 allocate(sqw_tab(n_freq), stat=
err)
246 call show_error (
"Impossible to allocate memory"//char(0), &
247 "Function: s_of_k_t"//char(0),
"Table: SQW_TAB"//char(0))
251 allocate(sqw_qlist(q_num), stat=
err)
253 call show_error (
"Impossible to allocate memory"//char(0), &
254 "Function: s_of_k_t"//char(0),
"Table: SQW_QLIST"//char(0))
258 allocate(sqw_qval(q_num), stat=
err)
260 call show_error (
"Impossible to allocate memory"//char(0), &
261 "Function: s_of_k_t"//char(0),
"Table: SQW_QVAL"//char(0))
270 do while (sqtab(
j).lt.q_list(
i))
274 if ((sqtab(
j) - q_list(
i)) .gt. (q_list(
i) - sqtab(
j-1)))
then
278 sqw_qlist(
i) = qid(
j)
282 call recup_sqw_list (q_num, sqw_qval)
283 if (
allocated(sqw_qval))
deallocate(sqw_qval)
285 call compute_sqw (nsqt, q_num, sqw_qlist, pid, 0, 0)
292 call compute_sqw (nsqt, q_num, sqw_qlist, pid+2, 0, 0)
294 call compute_sqw (xsqt, q_num, sqw_qlist, pid+4, 0, 0)
301 call compute_sqw (xsqt, q_num, sqw_qlist, pid+6, 0, 0)
303 allocate(skt_tab(nq_in,
ns-min_in), stat=
err)
305 call show_error (
"Impossible to allocate memory"//char(0), &
306 "Function: s_of_k_t"//char(0),
"Table: SKT_TAB"//char(0))
316 skt_tab(
m,
l) = sqt(
m,
l,
j,
k)
319 call compute_sqw (skt_tab, q_num, sqw_qlist, pid,
j,
k)
330if (
allocated(sqtab))
deallocate(sqtab)
331if (
allocated(skt_tab))
deallocate(skt_tab)
332if (
allocated(sqw_tab))
deallocate(sqw_tab)
333if (
allocated(sqw_qlist))
deallocate(sqw_qlist)
334if (
allocated(sqt))
deallocate(sqt)
335if (
allocated(nsqt))
deallocate(nsqt)
336if (
allocated(xsqt))
deallocate(xsqt)
337if (
allocated(rho_c))
deallocate(rho_c)
338if (
allocated(rho_s))
deallocate(rho_s)
339if (
allocated(localcorr))
deallocate(localcorr)
348SUBROUTINE fourier_trans_qvect_skt (MIN_IN)
354 INTEGER,
INTENT(IN) :: min_in
356 INTEGER :: q, numcorr, t_n
357 DOUBLE PRECISION :: qx, qy, qz, qtr
358 DOUBLE PRECISION :: corr
362 numth = omp_get_max_threads()
375 if (
l .le. nq_in)
then
379 localcorr(:,:,:) = 0.0d0
390 rho_c(
t,
j) = rho_c(
t,
j) + cos(qtr)
391 rho_s(
t,
j) = rho_s(
t,
j) + sin(qtr)
397 numcorr =
ns-
t-min_in
401 corr = rho_c(
t+t_n,
m) * rho_c(t_n,
n) + rho_s(
t+t_n,
m) * rho_s(t_n,
n)
402 localcorr(
t+1,
m,
n) = localcorr(
t+1,
m,
n) + corr
407 localcorr(
t+1, :, :) = localcorr(
t+1, :, :) / dble(numcorr)
413 sqt(
l, :, :, :) = sqt(
l, :, :, :) + localcorr(:, :, :)
431SUBROUTINE compute_sqw (SKT_TAB, Q_NUM, Q_LIST, PIC, SPA, SPB)
437 INTEGER,
INTENT(IN) :: q_num, pic, spa, spb
438 INTEGER,
DIMENSION(Q_NUM),
INTENT(IN) :: q_list
439 DOUBLE PRECISION,
DIMENSION (NQ_IN,NS-MIN_IN),
INTENT(IN) :: skt_tab
441 INTEGER :: qid, id_q_num, freq
442 INTEGER :: shift, cid
443 DOUBLE PRECISION :: omega, max_omega, delta_omega, time_val, sqw_val
445 max_omega =
pi / delta_t
447 delta_omega = max_omega / dble(n_freq-1)
450 if (
nsp .eq. 2) shift=shift+8
455 id_q_num = q_list(qid)
458 omega = dble(freq-1) * delta_omega
459 sqw_val = 0.5d0 * skt_tab(id_q_num, 1)
461 do t = 2,
ns-min_in-1
462 time_val = dble(
t-1) * delta_t
463 sqw_val = sqw_val + skt_tab(id_q_num,
t) * cos(omega * time_val)
466 time_val = dble(
ns-min_in-1) * delta_t
467 sqw_val = sqw_val + 0.5d0 * skt_tab(id_q_num,
ns-min_in) * cos(omega * time_val)
469 sqw_val = 2.0d0 * sqw_val * delta_t /
pi
470 sqw_tab(freq) = sqw_val
475 call save_curve (n_freq, sqw_tab, cid,
idskt)
477 if (spa .gt. 0 .and. spb .gt. 0)
then
483 omega = dble(freq-1) * delta_omega
484 if (spa .eq. spb)
then
485 sqw_val = 0.5d0 * (1.0d0 + (skt_tab(id_q_num, 1) - 1.0d0)/
xi(spa))
487 sqw_val = 0.5d0 * (1.0d0 + skt_tab(id_q_num, 1)/sqrt(
xi(spa)*
xi(spb)))
490 do t = 2,
ns-min_in-1
491 time_val = dble(
t-1) * delta_t
492 if (spa .eq. spb)
then
493 sqw_val = sqw_val + (1.0d0 + (skt_tab(id_q_num,
t) - 1.0d0)/
xi(spa)) * cos(omega * time_val)
495 sqw_val = sqw_val + (1.0d0 + skt_tab(id_q_num,
t)/sqrt(
xi(spa)*
xi(spb))) * cos(omega * time_val)
499 time_val = dble(
ns-min_in-1) * delta_t
500 if (spa .eq. spb)
then
501 sqw_val = sqw_val + 0.5d0 * (1.0d0 + (skt_tab(id_q_num,
t) - 1.0d0)/
xi(spa)) * cos(omega * time_val)
503 sqw_val = sqw_val + 0.5d0 * (1.0d0 + skt_tab(id_q_num,
t)/sqrt(
xi(spa)*
xi(spb))) * cos(omega * time_val)
505 sqw_val = 2.0d0 * sqw_val * delta_t /
pi
506 sqw_tab(freq) = sqw_val
511 call save_curve (n_freq, sqw_tab, cid+2*
nsp*
nsp,
idskt)
522INTEGER FUNCTION skt_save (NSQ)
527INTEGER,
INTENT(IN) :: nsq
529INTEGER :: ndt, tps, cid
530DOUBLE PRECISION,
DIMENSION (:),
ALLOCATABLE :: sqtab
533 LOGICAL FUNCTION fzbt (NDQ, SQIJ)
535 INTEGER,
INTENT(IN) :: ndq
536 DOUBLE PRECISION,
DIMENSION(NDQ,NSP,NSP),
INTENT(IN) :: sqij
543if (
allocated(sqtab))
deallocate(sqtab)
544allocate(sqtab(nq_in), stat=err)
546 call show_error (
"Impossible to allocate memory"//char(0), &
547 "Function: SKT_SAVE"//char(0),
"Table: SQTAB"//char(0))
551if(
allocated(sij))
deallocate(sij)
552allocate(sij(nq_in,nsp,nsp), stat=err)
554 call show_error (
"Impossible to allocate memory"//char(0), &
555 "Function: SKT_SAVE"//char(0),
"Table: Sij"//char(0))
564 if (n_sets .eq. 1 .and. sets_t(1) .eq. -1)
then
573 if (ndt .eq. ns-min_in)
then
581 if (degeneracy(k) .gt. 0)
then
583 sqtab(i)= nsqt(k,tps)
586 call save_curve (nsq, sqtab, cid, idskt)
590 if (degeneracy(k) .gt. 0)
then
592 sqtab(i)= (nsqt(k,tps)-1.0)*k_point(k)
595 call save_curve (nsq, sqtab, cid + 2, idskt)
599 if (degeneracy(k) .gt. 0)
then
601 sqtab(i)= xsqt(k,tps)
604 call save_curve (nsq, sqtab, cid + 4, idskt)
608 if (degeneracy(k) .gt. 0)
then
610 sqtab(i)= (xsqt(k,tps)-1.0)*k_point(k)
613 call save_curve (nsq, sqtab, cid + 6, idskt)
623 sij(k,i,j) = sqt(k,tps,i,j)
624 if (degeneracy(k) .gt. 0)
then
629 call save_curve (nsq, sqtab, cid + l, idskt)
635 if (.not.
fzbt(nq_in, sij))
then
644 if (degeneracy(k) .gt. 0)
then
646 sqtab(m)= fzsij(k,i,j)
649 call save_curve (nsq, sqtab, cid + l, idskt)
657 if (degeneracy(j) .gt. 0)
then
662 call save_curve (nsq, sqtab, cid + l, idskt)
675if (
allocated(fzsij))
deallocate(fzsij)
676if (nsp.eq.2 .and.
allocated(btij))
deallocate(btij)
677if (
allocated(sqtab))
deallocate(sqtab)
678if(
allocated(sij))
deallocate(sij)
679if(
allocated(fzsij))
deallocate(fzsij)
680if(
allocated(btij))
deallocate(btij)