55 use iso_fortran_env
, only: output_unit, error_unit
59 type(
obser_vec ),
private :: tempering_acceptance
63 #if defined(TEMPERING) 108 Subroutine exchange_step(Phase,GR, udvr, udvl, Stab_nt, udvst, N_exchange_steps, Tempering_calc_det)
116 COMPLEX (Kind=Kind(0.d0)),
INTENT(INOUT) :: Phase
117 CLASS(
udv_state),
intent(inout),
allocatable,
Dimension(:) :: udvl, udvr
118 COMPLEX (Kind=Kind(0.d0)),
Dimension(:,:,:),
INTENT(INOUT),
allocatable :: GR
119 CLASS(
udv_state),
intent(inout),
allocatable,
Dimension(:, :) :: udvst
120 INTEGER,
dimension(:),
INTENT (IN),
allocatable :: Stab_nt
121 INTEGER,
INTENT(IN) :: N_exchange_steps
122 Logical,
INTENT(IN) :: Tempering_calc_det
126 Integer :: NST, NSTM, NF, nf_eff, NT, NT1, NVAR,N, N1,N2, I, NC, I_Partner, n_step, N_count, N_part
127 type(
fields) :: nsigma_old
128 Real (Kind=Kind(0.d0)) :: T0_Proposal_ratio, Weight, Weight1
129 Complex (Kind=Kind(0.d0)) :: Z_ONE = cmplx(1.d0, 0.d0, kind(0.d0)), z, ratiotot, ratiotot_p, phase_old, phase_new
130 Real (Kind=Kind(0.d0)),
allocatable :: Det_vec_old(:,:), Det_vec_new(:,:)
131 Complex (Kind=Kind(0.d0)),
allocatable :: Phase_Det_new(:), Phase_Det_old(:)
132 Complex (Kind=Kind(0.d0)) :: Ratio(2), Ratio_p(2),Phase_array(n_fl)
133 Logical :: TOGGLE, L_Test
134 Integer,
allocatable :: List_partner(:), List_masters(:)
137 Integer :: nsigma_irank, nsigma_old_irank, nsigma_irank_temp
143 Integer :: Isize, Irank, Ierr, irank_g, isize_g, igroup
144 Integer :: STATUS(mpi_status_size)
146 Character (Len=64) :: storage
149 CALL mpi_comm_size(mpi_comm_world,isize,ierr)
150 CALL mpi_comm_rank(mpi_comm_world,irank,ierr)
151 call mpi_comm_rank(group_comm, irank_g, ierr)
152 call mpi_comm_size(group_comm, isize_g, ierr)
153 igroup = irank/isize_g
156 n1 =
size(nsigma%f,1)
157 n2 =
size(nsigma%f,2)
158 nstm =
Size(udvst, 1)
159 call nsigma_old%make(n1, n2)
160 if (tempering_calc_det)
then 161 Allocate ( det_vec_old(ndim,n_fl), det_vec_new(ndim,n_fl) )
162 Allocate ( phase_det_new(n_fl), phase_det_old(n_fl) )
164 Allocate ( list_partner(0:isize-1), list_masters(isize/2) )
171 if (tempering_calc_det)
then 174 Call compute_fermion_det(phase_det_old,det_vec_old, udvl, udvst, stab_nt, storage)
176 Do nf_eff = 1,n_fl_eff
177 nf=calc_fl_map(nf_eff)
178 phase_array(nf) = phase_det_old(nf)
179 Call op_phase(phase_array(nf),op_v,nsigma,nf)
181 if (reconstruction_needed)
call ham%weight_reconstruction(phase_array)
182 phase_old=product(phase_array)
183 phase_old=phase_old**n_sun
186 nsigma_old%f = nsigma%f
187 nsigma_old%t = nsigma%t
188 nsigma_old_irank = nsigma_irank
191 Do i = 0,isize-1,2*isize_g
194 list_masters(nc) = i + n
199 Write(6,*)
'List of masters: ' 201 Write(6,*) nc, list_masters(nc)
205 DO n_count = 1,n_exchange_steps
207 If (irank == 0 )
then 209 if ( ranf_wrap() > 0.5d0 ) n_step = -isize_g
210 Do i = 0,isize-1,2*isize_g
212 list_partner(npbc_tempering(i + n ,isize)) = npbc_tempering(i + n + n_step ,isize)
213 list_partner(npbc_tempering(i + n + n_step , isize)) = npbc_tempering(i + n ,isize)
218 CALL mpi_bcast(list_partner, isize ,mpi_integer, 0,mpi_comm_world,ierr)
221 if (irank == 0 )
then 222 Write(6,*)
'Testing global : ' 224 Write(6,*) i, list_partner(i)
225 Write(11,*) i, list_partner(i)
234 n =
size(nsigma_old%f,1)*
size(nsigma_old%f,2)
235 CALL mpi_sendrecv(nsigma_old%f , n, mpi_complex16, list_partner(irank), 0, &
236 & nsigma%f , n, mpi_complex16, list_partner(irank), 0, mpi_comm_world,status,ierr)
237 CALL mpi_sendrecv(nsigma_old_irank, 1, mpi_integer, list_partner(irank), 0, &
238 & nsigma_irank , 1, mpi_integer, list_partner(irank), 0, mpi_comm_world,status,ierr)
243 if (tempering_calc_det)
then 247 Call compute_fermion_det(phase_det_new,det_vec_new, udvl, udvst, stab_nt, storage)
249 phase_array = cmplx(1.d0,0.d0,kind=kind(0.d0))
250 Do nf_eff = 1,n_fl_eff
251 nf=calc_fl_map(nf_eff)
252 phase_array(nf) = phase_det_new(nf)
253 Call op_phase(phase_array(nf),op_v,nsigma,nf)
255 if (reconstruction_needed)
call ham%weight_reconstruction(phase_array)
256 phase_new=product(phase_array)
257 phase_new=phase_new**n_sun
259 t0_proposal_ratio = 1.d0
260 ratiotot = compute_ratio_global(phase_det_old, phase_det_new, &
261 & det_vec_old, det_vec_new, nsigma_old, t0_proposal_ratio,ratio)
263 If (l_test)
Write(6,*)
'Ratio_global: Irank, Partner',irank,list_partner(irank), &
264 & ratiotot, ratio(1)*exp(ratio(2))
266 ratiotot = ham%Delta_S0_global(nsigma_old)
274 If (irank == i )
Then 275 CALL mpi_send(ratio ,2, mpi_complex16 , list_partner(i), i+1024, mpi_comm_world,ierr)
276 else if (irank == list_partner(i) )
Then 277 CALL mpi_recv(ratio_p , 2, mpi_complex16, i, i+1024, mpi_comm_world,status,ierr)
279 weight= abs(ratio(1) * ratio_p(1) * exp( ratio_p(2) + ratio(2) ) )
281 if ( weight > ranf_wrap() ) toggle =.true.
282 If (l_test)
Write(6,*)
'Master : ', list_partner(i), i, weight, toggle
289 If (irank == list_partner(i) )
Then 291 CALL mpi_send(toggle, 1, mpi_logical, i, i+1024, mpi_comm_world,ierr)
292 else if (irank == i )
Then 293 CALL mpi_recv(toggle , 1, mpi_logical, list_partner(i), i+1024 ,mpi_comm_world,status,ierr)
294 If (l_test)
Write(6,*)
'Slave : ', irank, toggle
298 If (l_test)
Write(6,*)
'Final: ', irank, list_partner(irank), toggle
299 Call global_tempering_obser(toggle)
300 Call control_upgrade_temp (toggle)
303 if (tempering_calc_det)
then 304 phase_old = phase_new
305 phase_det_old = phase_det_new
306 det_vec_old = det_vec_new
308 nsigma_old%f = nsigma%f
309 nsigma_old%t = nsigma%t
310 nsigma_old_irank = nsigma_irank
312 nsigma%f = nsigma_old%f
313 nsigma%t = nsigma_old%t
314 nsigma_irank = nsigma_old_irank
319 if (tempering_calc_det)
then 321 If (.not.toggle)
then 322 DO nf_eff = 1,n_fl_eff
323 nf=calc_fl_map(nf_eff)
325 CALL udvl(nf_eff)%reset(
'l',wf_l(nf)%P)
327 CALL udvl(nf_eff)%reset(
'l')
334 CALL wrapul(nt1,nt, udvl)
335 Do nf_eff = 1,n_fl_eff
336 udvst(nst, nf_eff) = udvl(nf_eff)
340 CALL wrapul(nt1,0, udvl)
344 phase_array = cmplx(1.d0,0.d0,kind(0.d0))
345 do nf_eff = 1,n_fl_eff
346 nf=calc_fl_map(nf_eff)
347 CALL cgr(z, nvar, gr(:,:,nf), udvr(nf_eff), udvl(nf_eff))
348 call op_phase(z,op_v,nsigma,nf)
351 if (reconstruction_needed)
call ham%weight_reconstruction(phase_array)
352 phase=product(phase_array)
362 CALL mpi_recv(nsigma_irank_temp , 1, mpi_integer, i, 0, mpi_comm_world,status,ierr)
363 If ( nsigma_irank_temp == 0)
then 366 CALL mpi_send(i , 1, mpi_integer, nsigma_irank_temp, 0, mpi_comm_world,ierr)
369 If ( nsigma_irank /= 0 )
then 370 CALL mpi_send(0 , 1, mpi_integer, nsigma_irank, 0, mpi_comm_world,ierr)
373 CALL mpi_send(nsigma_irank , 1, mpi_integer, 0, 0, mpi_comm_world,ierr)
374 CALL mpi_recv(nsigma_old_irank , 1, mpi_integer, 0, 0, mpi_comm_world,status,ierr)
377 if ( nsigma_irank /= irank )
then 378 CALL mpi_sendrecv_replace(phase, 1, mpi_complex16, nsigma_old_irank, 0, &
379 & nsigma_irank, 0, mpi_comm_world, status, ierr)
381 n_gr =
size(gr,1)*
size(gr,2)*
size(gr,3)
382 CALL mpi_sendrecv_replace(gr, n_gr, mpi_complex16, nsigma_old_irank, 0, &
383 & nsigma_irank, 0, mpi_comm_world, status, ierr)
385 do nf_eff = 1,n_fl_eff
386 CALL udvr(nf_eff)%MPI_Sendrecv(nsigma_old_irank, 0, nsigma_irank, 0, status, ierr)
388 do nf_eff = 1,n_fl_eff
389 CALL udvl(nf_eff)%MPI_Sendrecv(nsigma_old_irank, 0, nsigma_irank, 0, status, ierr)
392 do nf_eff = 1,n_fl_eff
393 CALL udvst(nst, nf_eff)%MPI_Sendrecv(nsigma_old_irank, 0, nsigma_irank, 0, status, ierr)
400 call nsigma_old%clear
402 if (tempering_calc_det)
then 403 Deallocate ( det_vec_old, det_vec_new )
404 Deallocate ( phase_det_new, phase_det_old )
406 Deallocate ( list_partner, list_masters )
408 end Subroutine exchange_step
450 Subroutine global_updates(Phase,GR, udvr, udvl, Stab_nt, udvst,N_Global)
458 COMPLEX (Kind=Kind(0.d0)),
INTENT(INOUT) :: Phase
459 class(
udv_state),
DIMENSION(:),
ALLOCATABLE,
INTENT(INOUT) :: udvl, udvr
460 COMPLEX (Kind=Kind(0.d0)),
Dimension(:,:,:),
allocatable,
INTENT(INOUT) :: GR
461 CLASS(
udv_state),
Dimension(:,:),
ALLOCATABLE,
INTENT(INOUT) :: udvst
462 INTEGER,
dimension(:),
allocatable,
INTENT(IN) :: Stab_nt
463 Integer,
INTENT(IN) :: N_Global
467 Integer :: NST, NSTM, NF, NT, NT1, NVAR,N, N1,N2, I, NC, N_part,j, nf_eff
468 Real (Kind=Kind(0.d0)) :: T0_Proposal_ratio, Weight
469 Complex (Kind=Kind(0.d0)) :: Z_ONE = cmplx(1.d0, 0.d0, kind(0.d0)), z, ratiotot, phase_old, phase_new
470 Complex (Kind=Kind(0.d0)),
allocatable :: Det_vec_test(:,:), Phase_Det_new(:), Phase_Det_old(:)
471 Real (Kind=Kind(0.d0)),
allocatable :: Det_vec_old(:,:), Det_vec_new(:,:)
472 type(
fields) :: nsigma_old
474 Complex (Kind=Kind(0.d0)) :: Ratio(2), Phase_array(n_fl)
475 Logical :: TOGGLE, L_Test
476 Real (Kind=Kind(0.d0)) :: size_clust
477 Real (Kind=Kind(0.d0)) :: ratio_2_test
478 Character (Len=64) :: storage
482 n1 =
size(nsigma%f,1)
483 n2 =
size(nsigma%f,2)
484 nstm =
Size(udvst, 1)
485 call nsigma_old%make(n1, n2)
487 Allocate ( det_vec_old(ndim,n_fl_eff), det_vec_new(ndim,n_fl_eff), det_vec_test(ndim,n_fl_eff) )
488 Allocate ( phase_det_new(n_fl_eff), phase_det_old(n_fl_eff) )
493 Call compute_fermion_det(phase_det_old,det_vec_old, udvl, udvst, stab_nt, storage)
494 phase_array = cmplx(1.d0,0.d0,kind=kind(0.d0))
495 Do nf_eff = 1,n_fl_eff
496 nf=calc_fl_map(nf_eff)
497 phase_array(nf) = phase_det_old(nf_eff)
498 Call op_phase(phase_array(nf),op_v,nsigma,nf)
500 if (reconstruction_needed)
call ham%weight_reconstruction(phase_array)
501 phase_old=product(phase_array)
502 phase_old=phase_old**n_sun
506 Do nf_eff = 1,n_fl_eff
507 nf=calc_fl_map(nf_eff)
509 CALL udvr(nf_eff)%reset(
'r',wf_r(nf)%P)
511 CALL udvr(nf_eff)%reset(
'r')
515 phase_array = cmplx(1.d0,0.d0,kind(0.d0))
516 do nf_eff = 1,n_fl_eff
517 nf=calc_fl_map(nf_eff)
518 CALL cgr(z, nvar, gr(:,:,nf), udvr(nf_eff), udvl(nf_eff))
519 call op_phase(z,op_v,nsigma,nf)
522 if (reconstruction_needed)
call ham%weight_reconstruction(phase_array)
523 phase=product(phase_array)
525 Do nf_eff = 1,n_fl_eff
526 nf=calc_fl_map(nf_eff)
527 Call det_c_lu(gr(:,:,nf),det_vec_test(:,nf_eff),ndim)
529 z = phase_det_old(nf_eff)
532 z = z*det_vec_test(i,nf_eff)/abs(det_vec_test(i,nf_eff))
533 ratio_2_test=ratio_2_test+log(abs(det_vec_test(i,nf_eff)))+det_vec_old(i,nf_eff)
535 z=z*cmplx(exp(ratio_2_test),0.d0,kind(0.d0))
536 Write(6,*)
'Testing weight: ', z
537 if(abs(ratio_2_test)>650)
write(6,*)
"Weight is about to reach double underflow!" 542 nsigma_old%f = nsigma%f
543 nsigma_old%t = nsigma%t
549 Call ham%Global_move(t0_proposal_ratio,nsigma_old,size_clust)
550 If (t0_proposal_ratio > 0.d0)
then 554 Call compute_fermion_det(phase_det_new,det_vec_new, udvl, udvst, stab_nt, storage)
556 phase_array = cmplx(1.d0,0.d0,kind=kind(0.d0))
557 Do nf_eff = 1,n_fl_eff
558 nf=calc_fl_map(nf_eff)
559 phase_array(nf) = phase_det_new(nf)
560 Call op_phase(phase_array(nf),op_v,nsigma,nf)
562 if (reconstruction_needed)
call ham%weight_reconstruction(phase_array)
563 phase_new=product(phase_array)
564 phase_new=phase_new**n_sun
566 ratiotot = compute_ratio_global(phase_det_old, phase_det_new, &
567 & det_vec_old, det_vec_new, nsigma_old, t0_proposal_ratio, ratio)
571 weight = abs(
real( phase_old * ratiotot, kind=kind(0.d0))/
real(Phase_old,kind=Kind(0.d0)) )
573 z = phase_old * ratiotot/abs(ratiotot)
574 Call control_precisionp_glob(z,phase_new)
579 if ( weight > ranf_wrap() )
Then 581 phase_old = phase_new
582 phase_det_old = phase_det_new
583 nsigma_old%t = nsigma%t
584 nsigma_old%f = nsigma%f
585 det_vec_old = det_vec_new
587 nsigma%t = nsigma_old%t
588 nsigma%f = nsigma_old%f
590 Call control_upgrade_glob(toggle,size_clust)
592 nsigma%t = nsigma_old%t
593 nsigma%f = nsigma_old%f
598 If (.not.toggle)
then 599 DO nf_eff = 1,n_fl_eff
600 nf=calc_fl_map(nf_eff)
602 CALL udvl(nf_eff)%reset(
'l',wf_l(nf)%P)
604 CALL udvl(nf_eff)%reset(
'l')
611 CALL wrapul(nt1,nt, udvl)
612 Do nf_eff = 1,n_fl_eff
613 udvst(nst, nf_eff) = udvl(nf_eff)
617 CALL wrapul(nt1,0, udvl)
621 phase_array = cmplx(1.d0,0.d0,kind(0.d0))
622 do nf_eff = 1,n_fl_eff
623 nf=calc_fl_map(nf_eff)
624 CALL cgr(z, nvar, gr(:,:,nf), udvr(nf_eff), udvl(nf_eff))
625 call op_phase(z,op_v,nsigma,nf)
628 if (reconstruction_needed)
call ham%weight_reconstruction(phase_array)
629 phase=product(phase_array)
634 call nsigma_old%clear
635 Deallocate ( det_vec_old , det_vec_new, det_vec_test )
636 Deallocate ( phase_det_new, phase_det_old )
639 End Subroutine global_updates
669 Complex (Kind=Kind(0.d0)) Function compute_ratio_global(Phase_Det_old, Phase_Det_new, &
670 & Det_vec_old, Det_vec_new, nsigma_old, T0_Proposal_ratio,Ratio)
676 Complex (Kind=Kind(0.d0)),
allocatable,
INTENT(IN) :: Phase_Det_old(:), Phase_Det_new(:)
677 REAL (Kind=Kind(0.d0)),
allocatable,
INTENT(IN) :: Det_vec_old(:,:), Det_vec_new(:,:)
678 Real (Kind=Kind(0.d0)),
INTENT(IN) :: T0_proposal_ratio
679 type(
fields),
INTENT(IN) :: nsigma_old
680 Complex (Kind=Kind(0.d0)),
INTENT(out) :: Ratio(2)
683 Integer :: Nf, i, nt, nf_eff
684 Complex (Kind=Kind(0.d0)) :: Z, Z1, Ratio_1_array(n_fl), Ratio_2_array(n_fl), g_loc
685 Real (Kind=Kind(0.d0)) :: X, Ratio_2
687 ratio = cmplx(0.d0,0.d0,kind(0.d0))
690 Do nf_eff = 1,n_fl_eff
691 nf=calc_fl_map(nf_eff)
694 ratio_2_array(nf) = ratio_2_array(nf) + det_vec_new(i,nf_eff) - det_vec_old(i,nf_eff)
697 ratio_2_array(nf) =
real(n_sun,kind(0.d0))*Ratio_2_array(nf)
700 ratio_1_array = cmplx(1.d0,0.d0,kind(0.d0))
701 Do nf_eff = 1,n_fl_eff
702 nf=calc_fl_map(nf_eff)
704 ratio_1_array(nf_eff) = ratio_1_array(nf) * phase_det_new(nf_eff)/phase_det_old(nf_eff)
706 ratio_1_array(nf) = ratio_1_array(nf)**n_sun
710 Do i = 1,
Size(op_v,1)
714 ratio(1) = ratio(1) * cmplx( nsigma%Gama(i,nt)/nsigma_old%Gama(i,nt),0.d0,kind(0.d0) )
716 Do nf_eff = 1,n_fl_eff
717 nf=calc_fl_map(nf_eff)
718 z = nsigma%Phi(i,nt) - nsigma_old%Phi(i,nt)
720 if ( op_v(i,nf)%get_g_t_alloc()) g_loc = op_v(i,nf)%g_t(nt)
722 ratio_1_array(nf) = ratio_1_array(nf) * exp(z*cmplx(
Real(N_SUN,Kind(0.d0)), 0.d0,kind(0.d0)) * g_loc * op_v(i,nf)%alpha )
726 if (reconstruction_needed)
then 727 call ham%weight_reconstruction(ratio_1_array)
728 call ham%weight_reconstruction(ratio_2_array)
730 ratio(1)=ratio(1)*product(ratio_1_array)
733 ratio(2) = sum(ratio_2_array)
734 ratio(2) = ratio(2) + log(ham%Delta_S0_global(nsigma_old)) + log(t0_proposal_ratio)
736 compute_ratio_global = ratio(1)*exp(ratio(2))
739 end Function compute_ratio_global
779 Subroutine compute_fermion_det(Phase_det,Det_Vec, udvl, udvst, Stab_nt, storage)
788 REAL (Kind=Kind(0.d0)),
Dimension(:,:),
Intent(OUT) :: Det_Vec
789 Complex (Kind=Kind(0.d0)),
Dimension(:) ,
Intent(OUT) :: Phase_det
790 CLASS(
udv_state),
DIMENSION(:) ,
ALLOCATABLE,
INTENT(INOUT) :: udvl
791 CLASS(
udv_state),
Dimension(:,:),
ALLOCATABLE,
INTENT(INOUT) :: udvst
792 INTEGER,
dimension(:),
allocatable,
INTENT(IN) :: Stab_nt
793 Character (Len=64),
Intent(IN) :: storage
797 Integer :: N_size, NCON, I, J, N_part, info, NSTM, N, nf, nst, nt, nt1, nf_eff
798 Integer,
allocatable :: ipiv(:)
799 COMPLEX (Kind=Kind(0.d0)) :: alpha,beta, Z, Z1
801 COMPLEX (Kind=Kind(0.d0)),
Dimension(:,:),
Allocatable :: TP
802 COMPLEX (Kind=Kind(0.d0)),
Dimension(:),
Allocatable :: D
806 if(udvl(1)%side .ne.
"L" .and. udvl(1)%side .ne.
"l" )
then 807 write(error_unit,*)
"Compute_Fermion_Det: calling wrong decompose" 808 CALL terminate_on_error(error_global_updates,__file__,__line__)
811 nstm =
Size(udvst, 1)
812 If (str_to_upper(storage) ==
"EMPTY" )
then 813 DO nf_eff = 1,n_fl_eff
814 nf=calc_fl_map(nf_eff)
816 CALL udvl(nf_eff)%reset(
'l',wf_l(nf)%P)
818 CALL udvl(nf_eff)%reset(
'l')
825 CALL wrapul(nt1,nt, udvl)
826 Do nf_eff = 1,n_fl_eff
827 udvst(nst, nf_eff) = udvl(nf_eff)
831 CALL wrapul(nt1,0, udvl)
835 n_part=udvst(1,1)%N_part
838 Allocate (tp(n_part,n_part), ipiv(n_part))
840 nf=calc_fl_map(nf_eff)
841 n_part=udvst(1,nf)%N_part
844 #if !defined(STABLOG) 845 det_vec(n,nf_eff)=det_vec(n,nf_eff)+log(dble(udvst(i,nf)%D(n)))
847 det_vec(n,nf_eff)=det_vec(n,nf_eff)+udvst(i,nf)%L(n)
852 #if !defined(STABLOG) 853 det_vec(n,nf_eff)=det_vec(n,nf_eff)+log(dble(udvl(nf_eff)%D(n)))
855 det_vec(n,nf_eff)=det_vec(n,nf_eff)+udvl(nf_eff)%L(n)
860 CALL zgemm(
'C',
'N',n_part,n_part,n_size,alpha,udvl(nf_eff)%U(1,1),n_size,wf_r(nf)%P(1,1),n_size,beta,tp(1,1),n_part)
863 call zgetrf(n_part, n_part, tp(1,1), n_part, ipiv, info)
866 if (ipiv(j).ne.j)
then 871 phase_det(nf_eff) = z/abs(z)
872 det_vec(1,nf) = det_vec(1,nf)+log(abs(z))
879 n_size = udvl(1)%ndim
881 alpha = cmplx(1.d0,0.d0,kind(0.d0))
882 beta = cmplx(0.d0,0.d0,kind(0.d0))
883 Allocate (tp(n_size,n_size),d(n_size))
884 CALL udvlocal%alloc(n_size)
885 Do nf_eff = 1,n_fl_eff
886 nf=calc_fl_map(nf_eff)
888 #if !defined(STABLOG) 891 tp(:,j) = tp(:,j) + udvl(nf_eff)%V(:,j)*udvl(nf_eff)%D(j)
895 if ( dble(udvl(nf_eff)%D(j)) <= 1.d0 )
then 896 tp(:,j) = tp(:,j) + udvl(nf_eff)%V(:,j)*udvl(nf_eff)%D(j)
898 tp(:,j) = tp(:,j)/udvl(nf_eff)%D(j) + udvl(nf_eff)%V(:,j)
904 if ( udvl(nf_eff)%L(j) <= 0.d0 )
then 905 tp(:,j) = tp(:,j) + udvl(nf_eff)%V(:,j)*cmplx(exp(udvl(nf_eff)%L(j)),0.d0,kind(0.d0))
907 tp(:,j) = tp(:,j)*cmplx(exp(-udvl(nf_eff)%L(j)),0.d0,kind(0.d0)) + udvl(nf_eff)%V(:,j)
913 Call udv_wrap(tp,udvlocal%U, d, udvlocal%V, ncon )
914 z = det_c(udvlocal%V, n_size)
916 CALL zgemm(
'C',
'N', n_size, n_size, n_size, alpha, udvl(nf_eff)%U(1,1), n_size, udvlocal%U(1,1), n_size, beta, tp, n_size)
917 z1 = det_c(tp, n_size)
918 phase_det(nf_eff) = z*z1/abs(z*z1)
919 #if !defined(STABLOG) 921 det_vec(:,nf_eff) = log(
real(d(:)))
922 det_vec(1,nf_eff) = log(
real(d(1))) + log(ABS(z*z1))
924 det_vec(1,nf_eff) = log(
real(d(1))*ABS(z*z1))
925 if (dble(udvl(nf_eff)%D(1)) > 1.d0) det_vec(1,nf_eff)=det_vec(1,nf_eff)+log(dble(udvl(nf_eff)%D(1)))
927 if (dble(udvl(nf_eff)%D(j))<=1.d0)
then 928 det_vec(j,nf_eff) = log(
real(d(j)))
930 det_vec(j,nf_eff) = log(
real(d(j)))+log(dble(udvl(nf_eff)%d(j)))
935 det_vec(:,nf_eff) = log(
real(d(:)))
936 det_vec(1,nf_eff) = log(
real(d(1))*ABS(z*z1))
937 if (udvl(nf_eff)%L(1) > 0.d0) det_vec(1,nf_eff)=det_vec(1,nf_eff)+udvl(nf_eff)%L(1)
939 if (udvl(nf_eff)%L(j)<=0.d0)
then 940 det_vec(j,nf_eff) = log(
real(d(j)))
942 det_vec(j,nf_eff) = log(
real(d(j)))+udvl(nf_eff)%l(J)
948 CALL udvlocal%dealloc
950 end subroutine compute_fermion_det
960 Integer function npbc_tempering(n,Isize)
962 Integer,
INTENT(IN) :: Isize,n
965 if ( npbc_tempering < 0 ) npbc_tempering = npbc_tempering + isize
966 if ( npbc_tempering > isize -1) npbc_tempering = npbc_tempering - isize
968 end function npbc_tempering
978 Subroutine global_tempering_setup
980 Character (len=64) :: Filename
982 filename =
"Acc_Temp" 983 Call obser_vec_make(tempering_acceptance,n,filename)
984 End Subroutine global_tempering_setup
994 Subroutine global_tempering_init_obs
995 Call obser_vec_init( tempering_acceptance )
996 end Subroutine global_tempering_init_obs
1006 Subroutine global_tempering_obser(toggle)
1009 Logical,
intent(in) :: toggle
1010 tempering_acceptance%N = tempering_acceptance%N + 1
1011 tempering_acceptance%Ave_sign = tempering_acceptance%Ave_sign + 1.d0
1012 if (toggle) tempering_acceptance%Obs_vec(1) = tempering_acceptance%Obs_vec(1) + cmplx(1.d0,0.d0,kind(0.d0))
1014 end Subroutine global_tempering_obser
1022 Subroutine global_tempering_pr
1024 Call print_bin_vec(tempering_acceptance,group_comm)
1025 end Subroutine global_tempering_pr
This module defines the Obser_Vec and Obser_Latt types and provides routine to initialize them and to...
Wrappers for linear algebra.
Handles global updates and parallel tempering.
This module handles the calculation of the acceptance ratio. It also monitors the precision of the co...
Handles UDV decompositions.
Handles UDV decompositions.
This module contains two version of the stabilization. To switch between the two schemes you should d...
Handles Hubbard Stratonovitch fields.
This module defines the interface between the Hamiltonians (= model and observables definition) and t...