55 TYPE(
fp_type),
POINTER :: fp_env
59 CHARACTER(LEN=*),
PARAMETER :: routinen =
'fp_eval'
61 CHARACTER(LEN=default_string_length) :: tmpstr
62 INTEGER :: handle, i, icenter, iparticle, &
64 LOGICAL :: zero_weight
65 REAL(kind=
dp) :: c, dcdr, kt, r, rab(3), sf, strength
70 CALL timeset(routinen, handle)
72 cpassert(
ASSOCIATED(fp_env))
73 cpassert(fp_env%use_fp)
74 cpassert(
ASSOCIATED(subsys))
76 particles => particles_list%els
81 fp_env%restraint_energy = 0.0_dp
82 icenter = fp_env%central_atom
83 strength = fp_env%strength
84 fp_env%i1 = 0; fp_env%i2 = 0; fp_env%o1 = 0; fp_env%o2 = 0
85 fp_env%ri1 = 0.0_dp; fp_env%ri2 = 0.0_dp; fp_env%ro1 = 0.0_dp; fp_env%ro2 = 0.0_dp
86 fp_env%energy = 0.0_dp
89 DO i = 1,
SIZE(fp_env%inner_atoms)
90 iparticle = fp_env%inner_atoms(i)
91 rab = particles(iparticle)%r - particles(icenter)%r
95 IF (r > fp_env%outer_radius)
THEN
97 fp_env%restraint_energy = fp_env%restraint_energy + 0.5_dp*strength*(r - fp_env%outer_radius)**2
98 sf = strength*(r - fp_env%outer_radius)/r
99 particles(iparticle)%f = particles(iparticle)%f - sf*rab
100 particles(icenter)%f = particles(icenter)%f + sf*rab
103 IF (r > fp_env%inner_radius)
THEN
104 fp_env%i2 = fp_env%i2 + 1
106 fp_env%i1 = fp_env%i1 + 1
109 CALL smooth_count(r, fp_env%inner_radius, fp_env%smooth_width, c, dcdr)
110 fp_env%ri1 = fp_env%ri1 + c
111 fp_env%ri2 = fp_env%ri2 + (1.0_dp - c)
115 DO i = 1,
SIZE(fp_env%outer_atoms)
116 iparticle = fp_env%outer_atoms(i)
117 rab = particles(iparticle)%r - particles(icenter)%r
119 r = sqrt(sum(rab**2))
121 IF (r < fp_env%inner_radius)
THEN
123 fp_env%restraint_energy = fp_env%restraint_energy + &
124 0.5_dp*strength*(r - fp_env%inner_radius)**2
125 sf = strength*(r - fp_env%inner_radius)/r
126 particles(iparticle)%f = particles(iparticle)%f - sf*rab
127 particles(icenter)%f = particles(icenter)%f + sf*rab
130 IF (r > fp_env%outer_radius)
THEN
131 fp_env%o2 = fp_env%o2 + 1
133 fp_env%o1 = fp_env%o1 + 1
136 CALL smooth_count(r, fp_env%outer_radius, fp_env%smooth_width, c, dcdr)
137 fp_env%ro1 = fp_env%ro1 + c
138 fp_env%ro2 = fp_env%ro2 + (1.0_dp - c)
140 fp_env%energy = fp_env%energy + fp_env%restraint_energy
143 i = fp_env%i2 + fp_env%o1
145 fp_env%comb_weight = (
fac(fp_env%i2)*
fac(fp_env%o1))/
fac(i)
151 fp_env%bias_energy = 0.0_dp
152 IF (fp_env%bias)
THEN
153 kt = fp_env%temperature
154 fp_env%bias_energy = kt*(log_gamma(fp_env%ro1 + fp_env%ri2 + 1) - &
155 log_gamma(fp_env%ro1 + 1) - log_gamma(fp_env%ri2 + 1))
159 DO i = 1,
SIZE(fp_env%inner_atoms)
160 iparticle = fp_env%inner_atoms(i)
161 rab = particles(iparticle)%r - particles(icenter)%r
163 r = sqrt(sum(rab**2))
164 CALL smooth_count(r, fp_env%inner_radius, fp_env%smooth_width, c, dcdr)
165 sf = kt*(
psi(fp_env%ro1 + fp_env%ri2 + 1) -
psi(fp_env%ri2 + 1))*(-dcdr)/r
166 particles(iparticle)%f = particles(iparticle)%f - sf*rab
167 particles(icenter)%f = particles(icenter)%f + sf*rab
170 DO i = 1,
SIZE(fp_env%outer_atoms)
171 iparticle = fp_env%outer_atoms(i)
172 rab = particles(iparticle)%r - particles(icenter)%r
174 r = sqrt(sum(rab**2))
175 CALL smooth_count(r, fp_env%outer_radius, fp_env%smooth_width, c, dcdr)
176 sf = kt*(
psi(fp_env%ro1 + fp_env%ri2 + 1) -
psi(fp_env%ro1 + 1))*(dcdr)/r
177 particles(iparticle)%f = particles(iparticle)%f - sf*rab
178 particles(icenter)%f = particles(icenter)%f + sf*rab
181 fp_env%energy = fp_env%energy + fp_env%bias_energy
182 fp_env%bias_weight = exp(fp_env%bias_energy/kt)
185 IF (zero_weight)
THEN
186 fp_env%weight = 0.0_dp
188 fp_env%weight = fp_env%comb_weight*fp_env%bias_weight
194 extension=
".weights")
195 IF (output_unit > 0)
THEN
197 WRITE (output_unit,
'(T2,A15,6(1X,F16.10),4(1X,I4),4(1X,F16.10))') &
199 fp_env%weight, fp_env%comb_weight, fp_env%bias_weight, &
200 fp_env%energy, fp_env%restraint_energy, fp_env%bias_energy, &
201 fp_env%i1, fp_env%i2, fp_env%o1, fp_env%o2, &
202 fp_env%ri1, fp_env%ri2, fp_env%ro1, fp_env%ro2
208 CALL timestop(handle)
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_subsys_get(subsys, ref_count, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell)
returns information about various attributes of the given subsys
Define the data structure for the particle information.