115 subroutine initialize_table (this, nsrb, norb, symtype, nsym, positron_flag)
116 class(orbitaltable),
intent(inout) :: this
117 integer,
intent(in) :: nsrb, nsym, norb, symtype, positron_flag
119 this % total_num_spin_orbitals = nsrb
120 this % total_num_orbitals = norb
121 this % symmetry_type = symtype
122 this % num_symmetries = nsym
123 this % positron_flag = positron_flag
125 if (
allocated(this % spin_orbitals))
deallocate (this % spin_orbitals)
126 if (
allocated(this % mcon))
deallocate (this % mcon)
127 if (
allocated(this % nsrb))
deallocate (this % nsrb)
128 if (
allocated(this % mcorb))
deallocate (this % mcorb)
129 if (
allocated(this % orbital_map))
deallocate (this % orbital_map)
131 allocate(this % spin_orbitals(this % total_num_spin_orbitals))
132 allocate(this % mcon(this % total_num_spin_orbitals))
133 allocate(this % nsrb(this % total_num_spin_orbitals))
134 allocate(this % mcorb(this % total_num_orbitals))
135 allocate(this % orbital_map(this % total_num_orbitals))
155 subroutine construct_table (this, num_orbital_target_sym, num_orbital_target_sym_dinf, &
156 num_orbitals, num_elec_orbitals, num_orbitals_congen)
157 class(orbitaltable),
intent(inout) :: this
158 integer,
intent(in) :: num_orbital_target_sym(this % num_symmetries), &
159 num_orbital_target_sym_dinf(this % num_symmetries), &
160 num_orbitals(this % num_symmetries), &
161 num_elec_orbitals(this % num_symmetries), &
162 num_orbitals_congen(this % num_symmetries)
164 integer :: MN(this % total_num_spin_orbitals), MG(this % total_num_spin_orbitals), &
165 MM(this % total_num_spin_orbitals), MS(this % total_num_spin_orbitals), MPOS(this % total_num_spin_orbitals)
166 integer :: dummy_iposit = 0, dummy_lusme = 0, ido
168 if (this % positron_flag /= 0 .and. this % symmetry_type ==
symtype_d2h)
then
169 call pmkorbs(num_orbitals, num_elec_orbitals, num_orbitals_congen, this % num_symmetries, &
170 mn, mg, mm, ms, this % mcon, this % mcorb, this % total_num_orbitals, &
171 this % total_num_spin_orbitals, this % orbital_map, mpos, this % positron_flag, &
172 this % symmetry_type, dummy_lusme, stdout)
174 call mkorbs(this % num_symmetries, mn, mg, mm, ms, this % total_num_orbitals, &
175 this % total_num_spin_orbitals, this % orbital_map, mpos, this % mcon, &
176 this % mcorb, this % positron_flag, num_orbital_target_sym, &
177 num_orbital_target_sym_dinf, this % symmetry_type, dummy_lusme, stdout)
180 do ido = 1, this % total_num_spin_orbitals
181 this % spin_orbitals(ido) % orbital_number = mn(ido)
182 this % spin_orbitals(ido) % gerude = mg(ido)
183 this % spin_orbitals(ido) % m_quanta = mm(ido)
184 this % spin_orbitals(ido) % spin = ms(ido)
185 this % spin_orbitals(ido) % positron_flag = mpos(ido)
186 this % spin_orbitals(ido) % electron_idx = 0
228 subroutine evaluate_ijkl_and_coeffs (this, dtrs, coeff, symmetry_type, symbol, flag)
229 class(orbitaltable),
intent(inout) :: this
230 integer,
intent(in) :: dtrs(4), symmetry_type, flag
231 real(wp),
intent(in) :: coeff
232 class(symbolicelementvector) :: symbol
234 type(spinorbital) :: P,R
235 type(spinorbital) :: Q,S
236 integer :: KA, KB, lpositron = 0
237 integer :: NSFA, NSFB, MLA, MLB
240 if (this % positron_flag /= 0) lpositron = this % add_positron(dtrs, 1, 4)
243 p = this % spin_orbitals(dtrs(1))
244 q = this % spin_orbitals(dtrs(2))
245 r = this % spin_orbitals(dtrs(3))
246 s = this % spin_orbitals(dtrs(4))
249 if(p % spin + q % spin == 1 .or. r % spin + s % spin == 1 .or. p % positron_flag /= q % positron_flag)
then
255 ka = max(dtrs(1), dtrs(2))
256 kb = max(dtrs(3), dtrs(4))
258 if (r % m_quanta * s % m_quanta < 0) mla = 1
260 if(p % m_quanta * q % m_quanta < 0) mla = 1
266 if (p % spin + s % spin == 1 .or. q % spin + r % spin == 1 .or. p % positron_flag /= s % positron_flag)
then
272 ka = max(dtrs(1), dtrs(4))
273 kb = max(dtrs(3), dtrs(2))
275 if (q % m_quanta * r % m_quanta < 0) mlb = 1
277 if (p % m_quanta * s % m_quanta < 0) mlb = 1
283 if (nsfa == 0 .and. nsfb == 0)
return
286 if (lpositron == 1) sign = -1_wp
290 call this % evaluate_case_other(p % orbital_number, q % orbital_number, r % orbital_number, &
291 s % orbital_number, mla, 0, sign * coeff, symbol)
294 call this % evaluate_case_other(p % orbital_number, s % orbital_number, r % orbital_number, &
295 q % orbital_number, mlb, 1, sign * coeff, symbol)
297 else if (p % orbital_number == q % orbital_number .and. r % orbital_number == s % orbital_number)
then
299 call this % evaluate_case_one(p % orbital_number, r % orbital_number, nsfa, nsfb, mla, mlb, sign * coeff, symbol)
301 else if (p % orbital_number == q % orbital_number .or. r % orbital_number == s % orbital_number)
then
303 call this % evaluate_case_other(p % orbital_number, q % orbital_number, r % orbital_number, &
304 s % orbital_number, mla, 0, sign * coeff, symbol)
307 call this % evaluate_case_other(p % orbital_number, s % orbital_number, r % orbital_number, &
308 q % orbital_number, mlb, 1, sign * coeff, symbol)
310 else if (p % orbital_number == r % orbital_number .and. q % orbital_number == s % orbital_number)
then
312 call this % evaluate_case_three(p % orbital_number, r % orbital_number, nsfa, nsfb, mla, mlb, sign * coeff, symbol)
314 else if (p % orbital_number == r % orbital_number)
then
316 call this % evaluate_case_other(p % orbital_number, q % orbital_number, r % orbital_number, &
317 s % orbital_number, mla, 0, sign * coeff, symbol)
320 call this % evaluate_case_other(p % orbital_number, s % orbital_number, r % orbital_number, &
321 q % orbital_number, mlb, 1, sign * coeff, symbol)
323 else if(p % orbital_number == s % orbital_number .and. q % orbital_number == r % orbital_number)
then
325 call this % evaluate_case_two(p % orbital_number, r % orbital_number, nsfa, nsfb, mla, mlb, sign * coeff, symbol)
329 call this % evaluate_case_other(p % orbital_number, q % orbital_number, r % orbital_number, &
330 s % orbital_number, mla, 0, sign * coeff, symbol)
333 call this % evaluate_case_other(p % orbital_number, s % orbital_number, r % orbital_number, &
334 q % orbital_number, mlb, 1, sign * coeff, symbol)
341 subroutine evaluate_case_one (this, p, r, nsfa, nsfb, mla, mlb, coeff, symbol)
342 class(orbitaltable),
intent(inout) :: this
343 integer,
intent(in) :: p, r, NSFA, NSFB, MLA, MLB
344 real(wp),
intent(in) :: coeff
345 class(symbolicelementvector) :: symbol
359 call symbol % insert_ijklm_symbol(i, i, j, j, 1, coeff)
361 call symbol % insert_ijklm_symbol(i, i, j, j, 0, coeff)
367 call symbol % insert_ijklm_symbol(i, j, i, j, 1, -coeff)
369 call symbol % insert_ijklm_symbol(i, j, i, j, 0, -coeff)
376 subroutine evaluate_case_two (this, p, q, nsfa, nsfb, mla, mlb, coeff, symbol)
377 class(orbitaltable),
intent(inout) :: this
378 integer,
intent(in) :: p, q, NSFA, NSFB, MLA, MLB
379 real(wp),
intent(in) :: coeff
380 class(symbolicelementvector) :: symbol
394 call symbol % insert_ijklm_symbol(i, j, i, j, 1, coeff)
396 call symbol % insert_ijklm_symbol(i, j, i, j, 0, coeff)
402 call symbol % insert_ijklm_symbol(i, i, j, j, 1, -coeff)
404 call symbol % insert_ijklm_symbol(i, i, j, j, 0, -coeff)
411 subroutine evaluate_case_three (this, p, q, nsfa, nsfb, mla, mlb, coeff, symbol)
412 class(orbitaltable),
intent(inout) :: this
413 integer,
intent(in) :: p, q, NSFA, NSFB, MLA, MLB
414 real(wp),
intent(in) :: coeff
415 class(symbolicelementvector) :: symbol
429 call symbol % insert_ijklm_symbol(i, j, i, j, 1, coeff)
431 call symbol % insert_ijklm_symbol(i, j, i, j, 0, coeff)
437 call symbol % insert_ijklm_symbol(i, j, i, j, 1, -coeff)
439 call symbol % insert_ijklm_symbol(i, j, i, j, 0, -coeff)