48 type(run_params) :: setup
49 type(ns_params) :: nested_sampling
52 real(real64) :: e_unswapped, e_swapped, delta_e, ener_limit, rnd
53 real(real64) :: acc_ratio, rnde
54 real(real64),
dimension(:),
allocatable :: walker_energies
56 integer(array_int),
dimension(:,:,:,:,:),
allocatable :: ns_walkers
59 integer(array_int) :: site1, site2
60 integer :: i_walker, i_step, i_iter, irnd, n_at
61 integer :: n_acc, i_max(1), extra_steps
64 integer,
dimension(4) :: rdm1, rdm2
71 allocate(ns_walkers(setup%n_basis, 2*setup%n_1, 2*setup%n_2, 2*setup%n_3,
nested_sampling%n_walkers))
75 write(*,
'(16("-"),x,"Initialising set of walkers for NS run",x, 16("-"),/)')
81 if (i_walker == 1)
then
82 n_at = setup%n_1*setup%n_2*setup%n_3*setup%n_basis*setup%n_species
89 call initial_setup(setup,
config)
90 ns_walkers(:,:,:,:,i_walker) =
config
94 call random_number(rnde)
95 walker_energies(i_walker)=setup%full_energy(ns_walkers(:,:,:,:,i_walker))+rnde*1e-8
96 print*,
' Initial energy of walker ', i_walker,
'is: ', walker_energies(i_walker)
100 write(*,
'(/,16("-"),x,"Set of walkers successfully initialised",x, 15("-"),/)')
110 write(*,
'(24("-"),x,"Entering main NS cycle",x, 24("-"),/)')
111 print*,
'Will do',
nested_sampling%n_iter,
'iterations, starting with', &
117 i_max=maxloc(walker_energies)
118 ener_limit=walker_energies(i_max(1))
121 write(35,*) i_iter, ener_limit
135 if ((n_acc < n_at*0.05).and.(extra_steps<
nested_sampling%n_steps*100))
then
138 print*, i_iter, ener_limit, acc_ratio, n_acc,
'n_steps increased to', &
141 print*, i_iter, ener_limit, acc_ratio, n_acc
149 call random_number(rnd)
151 ns_walkers(:,:,:,:,i_max(1)) = ns_walkers(:,:,:,:,irnd)
152 walker_energies(i_max(1)) = walker_energies(irnd)
160 rdm1 = setup%rdm_site()
161 site1 = ns_walkers(rdm1(1), rdm1(2), rdm1(3), rdm1(4),i_max(1))
164 rdm2 = setup%rdm_site()
171 site2 = ns_walkers(rdm2(1), rdm2(2), rdm2(3), rdm2(4),i_max(1))
172 if (site1 /= site2)
exit
176 e_unswapped =
pair_energy(setup, ns_walkers(:,:,:,:,i_max(1)), rdm1, rdm2)
177 call pair_swap(ns_walkers(:,:,:,:,i_max(1)), rdm1, rdm2)
178 e_swapped =
pair_energy(setup, ns_walkers(:,:,:,:,i_max(1)), rdm1, rdm2)
181 delta_e = e_swapped - e_unswapped
183 if (walker_energies(i_max(1))+delta_e < ener_limit)
then
185 walker_energies(i_max(1))=walker_energies(i_max(1))+delta_e
189 call pair_swap(ns_walkers(:,:,:,:,i_max(1)), rdm1, rdm2)
194 write(*,*)
"WARNING! None of the attempted swaps were accepted, hence the cloned configuration", &
195 &
"remained identical to the parent."
196 write(*,*)
"Consider: increasing the number of steps, use a different strategy for swapping pair or", &
197 &
"decreasing the number of NS iterations (might have reached low enough energies?)"
201 print*, new_line(
'a'),
' All NS iterations are done, sampling finished.'
204 write(*,
'(/,26("-"),x,"Leaving NS routine",x, 26("-"))')