33 use const,
only: stdout
36 use mpi_mod,
only: myrank
46 integer,
allocatable :: molpro_symmetry_map(:)
47 real(wp) :: nuclear_energy
72 character(len=*) :: filename
74 integer :: targ_sym_do,current_target_sym
75 integer :: targ_stat_do,err
77 real(wp) :: energy_val
80 integer :: actual_targ_sym
82 io = find_io(1) + myrank
84 open (io, action =
'read', status =
'old', file = filename, iostat = err)
87 write (stdout,
"('Error opening input file ',a)") filename
88 stop
"Could not open input file"
91 success = this % search_core_energy(io)
93 if (success == .false.)
then
94 stop
"Could not find core energy in molpro"
102 eof = this % search_rhf_state_energy(io, 1, 1, this % target_energies(:,1))
103 if (.not. eof) stop
"Could not find HF energy"
119 this % target_energies(:,:) = this % target_energies(:,:) - this % nuclear_energy
137 integer,
intent(in) :: target_sym
138 real(wp) :: target_energy(:)
139 integer :: num_states
141 num_states = this % num_target_per_symmetries(target_sym)
143 if (target_sym == 1)
then
144 this % ground_energy = target_energy(1)
146 this % L2_ECP_deficit = 0.1
147 print *,
'ground_energy ',this % ground_energy
148 print *,
'target_ECP_energy ',this % target_energies(1,1)
149 print *,
'L2 diff ', this % L2_ECP_deficit
159 integer,
intent(in) :: io, target_sym,number_of_energies
160 real(wp),
intent(out) :: target_energy(:)
162 character(len=line_len) :: buffer
163 character(len=line_len) :: header_line
164 character(len=4) :: sym_char, stat_char
168 write (sym_char,
'(i4)') target_sym
173 header_line =
'CI vector for state symmetry ' // trim(adjustl(sym_char))
176 read (io,
'(a)', iostat = reason) buffer
179 if (reason == 0)
then
180 if (trim(buffer(2:line_len)) == trim(header_line))
then
195 integer,
intent(in) :: io, target_sym,number_of_energies
196 real(wp),
intent(out) :: target_energy(:)
198 character(len=line_len) :: buffer
199 character(len=line_len) :: header_line
200 character(len=4) :: sym_char, stat_char
210 read (io,
'(a)', iostat = reason) buffer
211 write (stdout,
'(a)') trim(buffer(1:line_len))
213 if (reason == 0)
then
215 read (io,
'(a)', iostat = reason) buffer
217 call readf(target_energy(1))
218 write (stdout, *) buffer
231 integer,
intent(in) :: io, number_of_energies
232 real(wp),
intent(out) :: target_energy(:)
233 character(len=line_len) :: header_line
234 integer :: num_found_energies, total_energies_line, curr_en, reason
235 character(len=line_len) :: buffer
236 character(len=line_len) :: fields
238 num_found_energies = 0
241 read (io,
'(a)', iostat = reason) buffer
242 if (reason == 0)
then
245 total_energies_line = nitems - 2
249 num_found_energies = 0
250 do while (total_energies_line > 0)
251 num_found_energies = num_found_energies + 1
253 if (num_found_energies > number_of_energies)
exit
255 call readf(target_energy(num_found_energies))
257 total_energies_line = total_energies_line - 1
259 if (total_energies_line == 0)
then
260 read (io,
'(a)', iostat = reason) buffer
262 if (nitems == 0)
exit
263 total_energies_line = nitems - 2
280 integer,
intent(in) :: io
282 character(len=line_len) :: buffer
283 character(len=line_len) :: fields
286 read (io,
'(a)', iostat = reason) buffer
289 if (reason == 0)
then
295 call readf(this % nuclear_energy)
313 integer,
intent(in) :: io
315 character(len=line_len) :: buffer
316 character(len=line_len) :: fields
317 character(len=line_len) :: header_line
318 character(len=4) :: sym_char
319 integer :: target_sym, ido
320 integer :: detected_space, detected_spin
322 allocate(this % molpro_symmetry_map(this % num_target_sym))
324 do target_sym = 1, this % num_target_sym
326 write (sym_char,
'(i4)') target_sym
327 header_line =
'State symmetry ' // trim(adjustl(sym_char))
331 read (io,
'(a)', iostat = reason) buffer
333 if (reason == 0)
then
334 if (trim(buffer(2:line_len)) == trim(header_line))
then
336 read(io,
'(a)',iostat=reason) buffer
338 read(io,
'(a)',iostat=reason) buffer
340 do ido = 1, len(buffer)
341 if (buffer(ido:ido) ==
"=") buffer(ido:ido) =
" "
357 if (trim(fields) ==
'SPIN')
then
360 select case(trim(fields))
368 write (stdout, *) fields
369 stop
"Invalid MOLPRO input on spin symmetry"
372 write (stdout, *) fields
373 stop
"Invalid MOLPRO input on spin expected first"
376 if (trim(fields) ==
'SPACE')
then
378 call readi(detected_space)
380 write (stdout, *) fields
381 stop
"Invalid MOLPRO input on space expected second"
384 do ido = 1, this % num_target_sym
385 if (this % spatial_symmetry(ido) + 1 == detected_space .and. &
386 this % spin_symmetry(ido) == detected_spin)
then
387 this % molpro_symmetry_map(target_sym) = ido
389 else if (ido == this % num_target_sym)
then
390 write (stdout, *)
'Could not find molpro symmetry mapping of Spatial=', &
391 detected_space,
' and Spin=', detected_spin
392 stop
"Invalid molpro space spin assignment"
407 write (stdout, *)
' '
408 write (stdout, *)
'---------------------------------'
409 write (stdout, *)
'MOLPRO -> SCATCI symmetry mapping'
410 write (stdout, *)
'---------------------------------'
411 write (stdout, *)
' '
413 do ido = 1, this % num_target_sym
414 write (stdout, *) ido,
'----->', this % molpro_symmetry_map(ido)