Multidip  1.0
Multi-photon matrix elements
multidip_io.F90
Go to the documentation of this file.
1 ! Copyright 2020
2 !
3 ! For a comprehensive list of the developers that contributed to these codes
4 ! see the UK-AMOR website.
5 !
6 ! This file is part of UKRmol-out (UKRmol+ suite).
7 !
8 ! UKRmol-out is free software: you can redistribute it and/or modify
9 ! it under the terms of the GNU General Public License as published by
10 ! the Free Software Foundation, either version 3 of the License, or
11 ! (at your option) any later version.
12 !
13 ! UKRmol-out is distributed in the hope that it will be useful,
14 ! but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 ! GNU General Public License for more details.
17 !
18 ! You should have received a copy of the GNU General Public License
19 ! along with UKRmol-out (in source/COPYING). Alternatively, you can also visit
20 ! <https://www.gnu.org/licenses/>.
21 !
30 
31  use, intrinsic :: iso_c_binding, only: c_double, c_int, c_f_pointer
32  use, intrinsic :: iso_fortran_env, only: input_unit, int32, int64, real64, output_unit
33 
34  ! GBTOlib
35  use blas_lapack_gbl, only: blasint
36 #ifdef WITH_MMAP
37  use file_mapping_gbl, only: file_mapping
38 #endif
39  use phys_const_gbl, only: pi, imu, to_ev
40  use precisn_gbl, only: wp, wp_bytes
41 
42  implicit none
43 
44  integer :: myproc = 1
45  integer :: nprocs = 1
46 
47  real(wp), parameter :: alpha = 1/137.03599907_wp
48 
49  character(len=1), parameter :: compt(3) = ['x', 'y', 'z']
50 
58  type kmatrix
59  integer :: mgvn, stot, nescat, nchan, nopen, ndopen, nchsq
60  real(wp), allocatable :: escat(:), kmat(:,:,:)
61  end type kmatrix
62 
63 
71  type scatakcoeffs
72  real(wp), allocatable :: rea(:, :, :), ima(:, :, :), evchl(:), escat(:)
73  integer, allocatable :: ichl(:), lvchl(:), mvchl(:)
74  integer :: mgvn, nesc, nchan, nstat
75  end type scatakcoeffs
76 
77 
90  type moleculardata
91 
92  ! inner transition dipoles storage
93 #ifdef WITH_MMAP
94  real(real64), pointer :: dipx(:,:,:), dipy(:,:,:), dipz(:,:,:)
95 #else
96  real(real64), allocatable :: dipx(:,:,:), dipy(:,:,:), dipz(:,:,:)
97 #endif
98  integer(int32), allocatable :: iidipx(:), iidipy(:), iidipz(:)
99  integer(int32), allocatable :: ifdipx(:), ifdipy(:), ifdipz(:)
100 
101 #ifdef WITH_MMAP
102  ! helper structures for file memory mapping
103  type(file_mapping) :: dipx_mmap, dipy_mmap, dipz_mmap
104 #endif
105 
106  ! other data
107  real(real64) :: rmatr
108  real(real64), allocatable :: crlv(:,:,:), eig(:,:), wamp(:,:,:), rg(:), etarg(:), gaunt(:, :, :)
109  integer(int32), allocatable :: mgvns(:), mnp1(:), nchan(:), l2p(:,:), m2p(:,:), ichl(:,:), lm_rg(:,:)
110 
111  contains
112 
113  ! class destructor
115 
116  end type moleculardata
117 
118 contains
119 
127  subroutine read_kmatrices (km, lukmt, nkset)
129  type(KMatrix), allocatable, intent(inout) :: km(:)
130  integer, intent(in) :: lukmt(:), nkset(:)
131 
132  integer :: i, k, n, ifail, u, key, nset, nrec, ninfo, ndata, ntarg, nvib, ndis, maxne, ie, gutot, ion
133  integer :: nopen, ndopen, nchsq, a, b, c, mye, nene
134  logical :: iwarn
135  real(wp) :: dE1, dE2, r, rmass, en
136  real(wp), allocatable :: kmat(:)
137  character(len=80) :: title
138 
139  do i = 1, size(km)
140 
141  u = lukmt(i)
142  nset = nkset(i)
143 
144  print '(/,A,I0,A,I0,/)', 'Reading K-matrices from unit ', u, ', set ', nset
145 
146  call getset(u, nset, 11, 'UNFORMATTED', ifail)
147 
148  read (u) key, nset, nrec, ninfo, ndata
149  read (u) title
150  read (u) km(i) % mgvn, km(i) % stot, gutot, ion, r, rmass
151  read (u) ntarg, nvib, ndis, km(i) % nchan, maxne
152 
153  print '(2x,A,I0)', 'mgvn = ', km(i) % mgvn
154  print '(2x,A,I0)', 'stot = ', km(i) % stot
155  print '(2x,A,I0)', 'ntarg = ', ntarg
156  print '(2x,A,I0)', 'nvib = ', nvib
157  print '(2x,A,I0)', 'ndis = ', ndis
158  print '(2x,A,I0)', 'nchan = ', km(i) % nchan
159  print '(2x,A,I0)', 'maxne = ', maxne
160 
161  print '(/,2x,A,/)', 'Energy ranges:'
162 
163  km(i) % nescat = 0
164  do ie = 1, maxne
165  read (u) k, n, de1, de2
166  print '(4x,I4,I8,F8.3,F8.3)', k, n, de1, de2
167  km(i) % nescat = km(i) % nescat + n
168  end do
169 
170  nene = (km(i) % nescat + nprocs - 1) / nprocs
171  allocate (km(i) % kmat(km(i) % nchan, km(i) % nchan, nene), &
172  km(i) % escat(km(i) % nescat), &
173  kmat(km(i) % nchan * (km(i) % nchan + 1)))
174 
175  iwarn = .true.
176  km(i) % kmat = 0
177  mye = 0
178  do ie = 1, km(i) % nescat
179  read (u) nopen, ndopen, nchsq, en, kmat(1:nchsq)
180  km(i) % escat(ie) = en/2 ! Ry -> a.u.
181  c = 0
182  if (mod(ie - 1, nprocs) + 1 /= myproc) cycle
183  mye = mye + 1
184  do a = 1, nopen
185  do b = 1, a
186  c = c + 1
187  km(i) % kmat(a, b, mye) = kmat(c)
188  km(i) % kmat(b, a, mye) = kmat(c)
189  end do
190  end do
191  if (iwarn .and. nopen < km(i) % nchan) then
192  print '(/,2x,A,I0,A)', 'WARNING: Unit ', u, ' contains only open-open subset of the full K-matrix.'
193  print '(11x,A)', 'Use IKTYPE = 1 in RSOLVE to save full K-matrices.'
194  print '(11x,A)', 'You may get spurious below-threshold noise.'
195  iwarn = .false.
196  end if
197  end do
198 
199  deallocate (kmat)
200 
201  end do
202 
203  end subroutine read_kmatrices
204 
205 
214  subroutine read_wfncoeffs (ak, lusct)
216  type(ScatAkCoeffs), allocatable, intent(inout) :: ak(:)
217  integer, intent(in) :: lusct(:)
218 
219  real(wp), allocatable :: ReA(:), ImA(:)
220  integer :: i, j, u, keysc, nset, nrec, ninfo, ndata, stot, gutot, nscat, ich, ie, mye, nene
221  real(wp) :: rr
222 
223  character(len=80) :: header
224 
225  do i = 1, size(ak)
226 
227  u = lusct(i)
228 
229  print '(/,A,I0,/)', 'Reading wave function coefficients from unit ', u
230 
231  open (u, status = 'old', action = 'read', form = 'unformatted')
232 
233  read (u) keysc, nset, nrec, ninfo, ndata
234  read (u) header
235  read (u) nscat, ak(i) % mgvn, stot, gutot, ak(i) % nstat, ak(i) % nchan, ak(i) % nesc
236 
237  print '(2x,A,I0)', 'mgvn = ', ak(i) % mgvn
238  print '(2x,A,I0)', 'stot = ', stot
239  print '(2x,A,I0)', 'nstat = ', ak(i) % nstat
240  print '(2x,A,I0)', 'nchan = ', ak(i) % nchan
241  print '(2x,A,I0)', 'nesc = ', ak(i) % nesc
242 
243  read (u) rr
244 
245  allocate (ak(i) % ichl(ak(i) % nchan), &
246  ak(i) % lvchl(ak(i) % nchan), &
247  ak(i) % mvchl(ak(i) % nchan), &
248  ak(i) % evchl(ak(i) % nchan))
249 
250  read (u) ak(i) % ichl, ak(i) % lvchl, ak(i) % mvchl, ak(i) % evchl
251 
252  print '(/,2x,A)', 'channel table'
253  do j = 1, ak(i) % nchan
254  print '(2x,4I6,F15.7)', j, ak(i) % ichl(j), ak(i) % lvchl(j), ak(i) % mvchl(j), ak(i) % evchl(j)
255  end do
256 
257  nene = (ak(i) % nesc + nprocs - 1) / nprocs
258  allocate (ak(i) % ReA(ak(i) % nstat, ak(i) % nchan, nene), &
259  ak(i) % ImA(ak(i) % nstat, ak(i) % nchan, nene), &
260  ak(i) % escat(ak(i) % nesc), &
261  rea(ak(i) % nstat), &
262  ima(ak(i) % nstat))
263 
264  mye = 0
265  do ie = 1, ak(i) % nesc
266  if (mod(ie - 1, nprocs) + 1 == myproc) mye = mye + 1
267  do ich = 1, ak(i) % nchan
268  read (u) ak(i) % escat(ie), j, rea
269  read (u) ak(i) % escat(ie), j, ima
270  if (mod(ie - 1, nprocs) + 1 == myproc) then
271  ak(i) % ReA(:, ich, mye) = rea
272  ak(i) % ImA(:, ich, mye) = ima
273  end if
274  end do
275  end do
276 
277  close (u)
278 
279  end do
280 
281  end subroutine read_wfncoeffs
282 
283 
291  subroutine read_molecular_data (moldat)
293  type(MolecularData), intent(inout) :: moldat
294 
295  integer(int32), allocatable :: ltarg(:), starg(:), nconat(:)
296  real(real64), allocatable :: r_points(:), cf(:, :, :), wmat2(:, :, :)
297 
298  integer(int32) :: i, j, u, s, s1, s2, ntarg, nrg, nelc, nz, lrang2, lamax, inast, nchmx, nstmx, lmaxp1, nfdm
299  integer(int32) :: lrgl, nspn, npty
300  integer(int64) :: offset, length
301  real(real64) :: bbloch, delta_r
302 
303  character(*), parameter :: filename = 'molecular_data'
304 
305  open (newunit = u, file = filename, access = 'stream', status = 'old', action = 'read')
306 
307  print '(/,A,/)', 'Reading file "molecular_data"'
308 
309  read (u) s, s1, s2
310  length = s * int(s1, int64) * int(s2, int64) * wp_bytes
311  allocate (moldat % iidipy(s), moldat % ifdipy(s))
312  read (u) moldat % iidipy, moldat % ifdipy
313  inquire (u, pos = offset)
314 #ifdef WITH_MMAP
315  call moldat % dipy_mmap % init(filename, offset - 1, length)
316  call c_f_pointer(moldat % dipy_mmap % ptr, moldat % dipy, [s1, s2, s])
317 #else
318  allocate (moldat % dipy(s1, s2, s))
319  read (u) moldat % dipy
320 #endif
321  offset = offset + length
322  print '(2x,A,*(1x,I0))', '[m = -1] iidip =', moldat % iidipy
323  print '(2x,A,*(1x,I0))', ' ifdip =', moldat % ifdipy
324 
325  read (u, pos = offset) s, s1, s2
326  length = s * int(s1, int64) * int(s2, int64) * wp_bytes
327  allocate (moldat % iidipz(s), moldat % ifdipz(s))
328  read (u) moldat % iidipz, moldat % ifdipz
329  inquire (u, pos = offset)
330 #ifdef WITH_MMAP
331  call moldat % dipz_mmap % init(filename, offset - 1, length)
332  call c_f_pointer(moldat % dipz_mmap % ptr, moldat % dipz, [s1, s2, s])
333 #else
334  allocate (moldat % dipz(s1, s2, s))
335  read (u) moldat % dipz
336 #endif
337  offset = offset + length
338  print '(2x,A,*(1x,I0))', '[m = 0] iidip =', moldat % iidipz
339  print '(2x,A,*(1x,I0))', ' ifdip =', moldat % ifdipz
340 
341  read (u, pos = offset) s, s1, s2
342  length = s * int(s1, int64) * int(s2, int64) * wp_bytes
343  allocate (moldat % iidipx(s), moldat % ifdipx(s))
344  read (u) moldat % iidipx, moldat % ifdipx
345  inquire (u, pos = offset)
346 #ifdef WITH_MMAP
347  call moldat % dipx_mmap % init(filename, offset - 1, length)
348  call c_f_pointer(moldat % dipx_mmap % ptr, moldat % dipx, [s1, s2, s])
349 #else
350  allocate (moldat % dipx(s1, s2, s))
351  read (u) moldat % dipx
352 #endif
353  offset = offset + length
354  print '(2x,A,*(1x,I0))', '[m = +1] iidip =', moldat % iidipx
355  print '(2x,A,*(1x,I0))', ' ifdip =', moldat % ifdipx
356 
357  read (u, pos = offset) ntarg
358  print '(/,2x,A,I0)', 'ntarg = ', ntarg
359  allocate (moldat % crlv(ntarg, ntarg, 3))
360  read (u) moldat % crlv
361 
362  read (u) nrg
363  allocate (moldat % rg(nrg), moldat % lm_rg(6, nrg))
364  read (u) moldat % rg, moldat % lm_rg
365 
366  read (u) nelc, nz, lrang2, lamax, ntarg, inast, nchmx, nstmx, lmaxp1
367  read (u) moldat % rmatr, bbloch
368  allocate (moldat % etarg(ntarg), ltarg(ntarg), starg(ntarg))
369  read (u) moldat % etarg, ltarg, starg
370  read (u) nfdm, delta_r
371  allocate (r_points(nfdm + 1))
372  read (u) r_points
373  print '(2x,A,*(1x,F8.3))', 'sampling radii:', r_points
374 
375  print '(/,2x,A)', 'number of inner eigenstates per symmetry'
376 
377  allocate (nconat(ntarg), moldat % l2p(nchmx, inast), moldat % m2p(nchmx, inast), moldat % eig(nstmx, inast), &
378  moldat % wamp(nchmx, nstmx, inast), cf(nchmx, nchmx, lamax), moldat % ichl(nchmx, inast), &
379  moldat % mgvns(inast), moldat % nchan(inast), moldat % mnp1(inast))
380 
381  do i = 1, inast
382 
383  read (u) lrgl, nspn, npty, moldat % nchan(i), moldat % mnp1(i)
384  moldat % mgvns(i) = lrgl - 1
385  print '(4x,I3,I8)', moldat % mgvns(i), moldat % mnp1(i)
386  read (u) nconat, moldat % l2p(:, i), moldat % m2p(:, i)
387  read (u) moldat % eig(:, i), moldat % wamp(:, :, i), cf, moldat % ichl(:, i)
388  read (u) s1, s2
389  allocate (wmat2(s1, s2, nfdm))
390  read (u) wmat2
391  deallocate (wmat2)
392 
393  end do
394 
395  do i = 1, inast
396  print '(/,2x,A,I0,A,I0,A)', 'channels in symmetry #', i, ' (IRR ', moldat % mgvns(i), '):'
397  do j = 1, moldat % nchan(i)
398  print '(2x,I3,A,I6,I3,SP,I6)', j, ':', moldat % ichl(j, i), moldat % l2p(j, i), moldat % m2p(j, i)
399  end do
400  end do
401 
402  close (u)
403 
404  call setup_angular_integrals(moldat)
405 
406  end subroutine read_molecular_data
407 
408 
415  subroutine destruct_molecular_data (moldat)
417  type(MolecularData), intent(inout) :: moldat
418 
419 #ifdef WITH_MMAP
420  call moldat % dipx_mmap % final
421  call moldat % dipy_mmap % final
422  call moldat % dipz_mmap % final
423 #endif
424  end subroutine destruct_molecular_data
425 
426 
433  subroutine setup_angular_integrals (moldat)
435  type(MolecularData), intent(inout) :: moldat
436 
437  integer :: maxl, i, l1, m1, l2, m2, l3, m3
438 
439  maxl = maxval(moldat % lm_rg)
440 
441  allocate (moldat % gaunt((maxl + 1)**2, (maxl + 1)**2, -1:1))
442 
443  moldat % gaunt = 0
444 
445  do i = 1, size(moldat % rg)
446  l1 = moldat % lm_rg(1, i); m1 = moldat % lm_rg(2, i)
447  l2 = moldat % lm_rg(3, i); m2 = moldat % lm_rg(4, i)
448  l3 = moldat % lm_rg(5, i); m3 = moldat % lm_rg(6, i)
449  if (l3 /= 1 .or. abs(m3) > 1) then
450  print '(A)', 'Unexpected layout of the angular integral storage in molecular_data'
451  stop
452  end if
453  moldat % gaunt(l1*(l1+1) + m1 + 1, l2*(l2+1) + m2 + 1, m3) = moldat % rg(i)
454  end do
455 
456  end subroutine setup_angular_integrals
457 
458 
467  subroutine get_diptrans (moldat, I, iidip, ifdip)
469  type(MolecularData), intent(in) :: moldat
470  integer, intent(in) :: I
471  integer, allocatable, intent(inout) :: iidip(:), ifdip(:)
472 
473  if (allocated(iidip)) deallocate (iidip)
474  if (allocated(ifdip)) deallocate (ifdip)
475 
476  select case (i)
477  case (1)
478  iidip = moldat % iidipx
479  ifdip = moldat % ifdipx
480  case (2)
481  iidip = moldat % iidipy
482  ifdip = moldat % ifdipy
483  case (3)
484  iidip = moldat % iidipz
485  ifdip = moldat % ifdipz
486  end select
487 
488  end subroutine get_diptrans
489 
490 
498  subroutine apply_dipole_matrix (moldat, I, s, transp, nf, nn, X, Y)
500  use multidip_params, only: rone, rzero
501  use multidip_special, only: blas_dgemm => dgemm
502 
503  type(MolecularData), intent(in) :: moldat
504  integer, intent(in) :: I, s, nf, nn
505  character(len=1), intent(in) :: transp
506  real(wp), intent(inout) :: X(:, :, :), Y(:, :, :)
507 
508  integer(blasint) :: lda, ldb, ldc, m, n, k
509 
510  ldb = size(x, 1)
511  ldc = size(y, 1)
512 
513  m = nf
514  n = size(x, 2) * size(x, 3)
515  k = nn
516 
517  select case (i)
518  case (1)
519  lda = size(moldat % dipx, 1)
520  call blas_dgemm(transp, 'N', m, n, k, rone, moldat % dipx(:,:,s), lda, x, ldb, rzero, y, ldc)
521  case (2)
522  lda = size(moldat % dipy, 1)
523  call blas_dgemm(transp, 'N', m, n, k, rone, moldat % dipy(:,:,s), lda, x, ldb, rzero, y, ldc)
524  case (3)
525  lda = size(moldat % dipz, 1)
526  call blas_dgemm(transp, 'N', m, n, k, rone, moldat % dipz(:,:,s), lda, x, ldb, rzero, y, ldc)
527  end select
528 
529  end subroutine apply_dipole_matrix
530 
531 
541  subroutine apply_boundary_amplitudes (moldat, irr, transp, X, Y)
543  use multidip_special, only: blas_dgemm => dgemm
544 
545  type(MolecularData), intent(in) :: moldat
546  integer, intent(in) :: irr
547  character(len=1), intent(in) :: transp
548  real(wp), intent(inout) :: X(:,:), Y(:,:)
549 
550  integer(blasint) :: m, n, k, lda, ldb, ldc
551  real(wp) :: alpha = 1, beta = 0
552 
553  if (transp == 'T') then
554  m = moldat % mnp1(irr)
555  n = size(x, 2)
556  k = moldat % nchan(irr)
557  else
558  m = moldat % nchan(irr)
559  n = size(x, 2)
560  k = moldat % mnp1(irr)
561  end if
562 
563  lda = size(moldat % wamp, 1)
564  ldb = size(x, 1)
565  ldc = size(y, 1)
566 
567  call blas_dgemm(transp, 'N', m, n, k, alpha, moldat % wamp(:, :, irr), lda, x, ldb, beta, y, ldc)
568 
569  end subroutine apply_boundary_amplitudes
570 
571 
579  subroutine scale_boundary_amplitudes (moldat, irr, v, vw)
581  type(MolecularData), intent(in) :: moldat
582  integer, intent(in) :: irr
583  real(wp), allocatable, intent(in) :: v(:)
584  real(wp), allocatable, intent(inout) :: vw(:, :)
585 
586  integer :: k, nstat, p, nchan
587 
588  nstat = moldat % mnp1(irr)
589  nchan = moldat % nchan(irr)
590 
591  forall (p = 1:nchan, k = 1:nstat)
592  vw(k, p) = v(k) * moldat % wamp(p, k, irr)
593  end forall
594 
595  end subroutine scale_boundary_amplitudes
596 
597 
604  subroutine write_partial_wave_moments (moldat, M, suffix)
606  type(MolecularData), intent(in) :: moldat
607 #ifdef WITH_COARRAYS
608  complex(wp), allocatable, intent(inout) :: M(:, :, :)[:]
609 #else
610  complex(wp), allocatable, intent(inout) :: M(:, :, :)
611 #endif
612  character(len=*), intent(in) :: suffix
613 
614  integer :: i, irr, mgvn, u, ichan, ichlf, lf, mf
615  character(len=100) :: filename
616 
617 #ifdef WITH_COARRAYS
618  ! gather coarray from all images to master
619  sync all
620  if (myproc /= 1) return
621  do i = 2, nprocs
622  m(:, :, :) = m(:, :, :) + m(:, :, :)[i] ! this operation may require unlimited stack
623  end do
624 #endif
625 
626  ! write to files
627  do irr = 1, size(moldat % mgvns)
628  mgvn = moldat % mgvns(irr)
629  do ichan = 1, moldat % nchan(irr)
630  if (any(m(ichan, :, mgvn) /= 0)) then
631  ichlf = moldat % ichl(ichan, irr)
632  lf = moldat % l2p(ichan, irr)
633  mf = moldat % m2p(ichan, irr)
634  write (filename, '(3(A,I0),A,SP,I0,3A)') 'pwdip-', mgvn, '-(', ichlf, ',', lf, ',', mf, ')', suffix, '.txt'
635  open (newunit = u, file = filename, action = 'write', form = 'formatted')
636  write (u, '(2E25.15)') m(ichan, :, mgvn)
637  close (u)
638  end if
639  end do
640  end do
641 
642  end subroutine write_partial_wave_moments
643 
644 
651  subroutine write_cross_section (cs)
653 #ifdef WITH_COARRAYS
654  real(wp), allocatable, intent(inout) :: cs(:, :)[:]
655 #else
656  real(wp), allocatable, intent(inout) :: cs(:, :)
657 #endif
658  integer :: u, i
659 
660 #ifdef WITH_COARRAYS
661  ! gather coarray from all images to master
662  sync all
663  if (myproc /= 1) return
664  do i = 2, nprocs
665  cs(:, :) = cs(:, :) + cs(:, :)[i] ! this operation may require unlimited stack
666  end do
667 #endif
668 
669  ! write to file
670  open (newunit = u, file = 'gen_photo_xsec.txt', action = 'write', form = 'formatted')
671  write (u, '(2E25.15)') cs
672  close (u)
673 
674  end subroutine write_cross_section
675 
676 end module multidip_io
subroutine write_cross_section(cs)
Write cross section to a file.
subroutine apply_boundary_amplitudes(moldat, irr, transp, X, Y)
Multiply by boundary amplitudes.
subroutine scale_boundary_amplitudes(moldat, irr, v, vw)
Scale boundary amplitudes matrix by a diagonal matrix.
I/O routines used by MULTIDIP.
Definition: multidip_io.F90:29
subroutine read_molecular_data(moldat)
Read RMT molecular_data file.
subroutine get_diptrans(moldat, I, iidip, ifdip)
Return dipole transition descriptors.
real(wp), parameter rzero
subroutine apply_dipole_matrix(moldat, I, s, transp, nf, nn, X, Y)
Multiply by dipole matrix.
real(wp), parameter alpha
Fine structure constant.
Definition: multidip_io.F90:47
real(wp), parameter rone
integer myproc
Definition: multidip_io.F90:44
Hard-coded parameters of MULTIDIP.
subroutine setup_angular_integrals(moldat)
Store the angular integrals in a more convenient shape.
subroutine read_kmatrices(km, lukmt, nkset)
Read K-matrix files.
subroutine read_wfncoeffs(ak, lusct)
Read wave function coefficients from file.
Special functions and objects used by MULTIDIP.
subroutine destruct_molecular_data(moldat)
Finalize the MolecularData object.
character(len=1), dimension(3), parameter compt
Definition: multidip_io.F90:49
integer nprocs
Definition: multidip_io.F90:45
subroutine write_partial_wave_moments(moldat, M, suffix)
Write partial wave moments.