Main nested sampling routine.
This routine performs the nested sampling calculation. Input parameters (such as the number of walkers, random walk parameters...etc.) are read from the "ns_input.txt" file. The first section of the routine generate the initial random configurations, which is followed by the main nested sampling cycle: recording and discarding the highest energy configuration, replacing it with a new one, generated from an existing walker via a series of random swaps. The routine makes use of the pair_swap subroutine to calculate energies.
46
47
48 type(run_params) :: setup
49 type(ns_params) :: nested_sampling
50
51
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
55
56 integer(array_int), dimension(:,:,:,:,:), allocatable :: ns_walkers
57
58
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
62
63
64 integer, dimension(4) :: rdm1, rdm2
65
66
69
70
71 allocate(ns_walkers(setup%n_basis, 2*setup%n_1, 2*setup%n_2, 2*setup%n_3,
nested_sampling%n_walkers))
73 walker_energies=0.0d0
74
75 write(*,'(16("-"),x,"Initialising set of walkers for NS run",x, 16("-"),/)')
76
77
79
80
81 if (i_walker == 1) then
82 n_at = setup%n_1*setup%n_2*setup%n_3*setup%n_basis*setup%n_species
83
85
86 endif
87
88
89 call initial_setup(setup, config)
90 ns_walkers(:,:,:,:,i_walker) = config
91
92
93
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)
97
98 enddo
99
100 write(*,'(/,16("-"),x,"Set of walkers successfully initialised",x, 15("-"),/)')
101
102
103 call print_particle_count(setup, ns_walkers(:,:,:,:,1), 0)
104
105 extra_steps=0
106
107
108
109
110 write(*,'(24("-"),x,"Entering main NS cycle",x, 24("-"),/)')
111 print*,
'Will do',
nested_sampling%n_iter,
'iterations, starting with', &
113
115
116
117 i_max=maxloc(walker_energies)
118 ener_limit=walker_energies(i_max(1))
119
120
121 write(35,*) i_iter, ener_limit
122
124 call xyz_writer(
nested_sampling%outfile_traj, ns_walkers(:,:,:,:,i_max(1)), setup, trajectory=.true.)
125 endif
126
127
128
130
131
133
134
135 if ((n_acc < n_at*0.05).and.(extra_steps<
nested_sampling%n_steps*100))
then
136
138 print*, i_iter, ener_limit, acc_ratio, n_acc,'n_steps increased to', &
140 else
141 print*, i_iter, ener_limit, acc_ratio, n_acc
142 endif
143
144 endif
145
146
147
148
149 call random_number(rnd)
151 ns_walkers(:,:,:,:,i_max(1)) = ns_walkers(:,:,:,:,irnd)
152 walker_energies(i_max(1)) = walker_energies(irnd)
153
154 n_acc=0
155 i_step=0
156
158
159
160 rdm1 = setup%rdm_site()
161 site1 = ns_walkers(rdm1(1), rdm1(2), rdm1(3), rdm1(4),i_max(1))
162 do
163
164 rdm2 = setup%rdm_site()
165
166
167
168
169
170
171 site2 = ns_walkers(rdm2(1), rdm2(2), rdm2(3), rdm2(4),i_max(1))
172 if (site1 /= site2) exit
173 enddo
174
175
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)
179
180
181 delta_e = e_swapped - e_unswapped
182
183 if (walker_energies(i_max(1))+delta_e < ener_limit) then
184
185 walker_energies(i_max(1))=walker_energies(i_max(1))+delta_e
186 n_acc = n_acc+1
187 else
188
189 call pair_swap(ns_walkers(:,:,:,:,i_max(1)), rdm1, rdm2)
190 endif
191
192 enddo
193 if (n_acc==0) then
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?)"
198 endif
199
200 enddo
201 print*, new_line('a'), ' All NS iterations are done, sampling finished.'
202 close(35)
203
204 write(*,'(/,26("-"),x,"Leaving NS routine",x, 26("-"))')
205