Subroutine initial_wavepacket
Use Numeric_Kinds_Module
Use QuantumNumber_Module
Use CommonInfo_Module
Use APH_Module
Use Jacobi_Module
Use Gaussian_Module
Use SurfaceJacobi_Module
USe SurfaceAph_Module
Use SymGroup_Module
Implicit None
!=========================================================================================
! This routine outputs the symmetrized initial atom-diatom wave packet in APH coordinates.
! The wave packet is calculated using Jacobi mass-scaled wave functions and mapped to
! APH coordinates and symmetrized into its component irreducible representaions.
!
! Variables:
! phi = array containing the symmetrized initial wave packet
! symmat = array containing symmetrization matrix
! to_propagate = logical array containing information about the irreducible
! representaions present in the initial wave packet.
!
!=========================================================================================
! I N P U T
!=========================================================================================
! O U T P U T
!=========================================================================================
! P A R A M E T E R S
LOGICAL,PARAMETER :: debug=.true.
!=========================================================================================
! I N T E R N A L S
Character(len=2) :: j2, label2
Character(len=100) :: filename
Integer :: aphindex, ispt, irho, itheta, ichi, jchi, istat, nchir
Integer :: whichir, indexchi, ccheck, jcheck, neig, s_dim
Real(dp) :: jacobicoef, aphcoef, probamp, x, y, tol
Real(dp) :: rho_sum, theta_sum, chi_sum, norm, s_min, s_max
!=========================================================================================
! A L L O C A T A B L E
Real(dp),Allocatable :: symmat(:,:), s_vals(:),wftemp(:)
Complex(dp),Allocatable :: phi(:), resultvec(:), splitvec(:), wftemp2(:)
!=========================================================================================
tol=1.0d-12
!=========================================================================================
! Allocate
ALLOCATE(wftemp(ndim),phi(ndim))
ALLOCATE(to_propagate(nirrep))
phi=Cmplx(0.d0,0.d0,dp)
!wftemp=Cmplx(0.d0,0.d0,dp)
!========================================================================================
! Switch to initial Jacobi coordinates
Call jacobi_grid(1)
!========================================================================================
! Read in appropriate information
j2=label2(j_in)
filename='jacobi_surface_c1_'//j2//'.bin'
OPEN(UNIT=bin_unit1,FILE=TRIM(BinOutdir)//TRIM(filename),FORM='unformatted',STATUS='unknown')
READ(bin_unit1) ccheck
IF (ccheck.ne.1) STOP 'wrong channel : initital_wavepacket'
READ(bin_unit1) jcheck
IF (jcheck.ne.j_in) STOP 'wrong j value : initial_wavepacket'
READ(bin_unit1) neig
READ(bin_unit1) s_dim
IF(ALLOCATED(s_vals)) DEALLOCATE(s_vals)
ALLOCATE( s_vals(s_dim))
READ(bin_unit1) s_vals
READ(bin_unit1) s_min
READ(bin_unit1) s_max
!CLOSE(UNIT=bin_unit1,STATUS='delete')
CLOSE(bin_unit1)
!========================================================================================
! Calculate initial diatomic rotational function
IF (ntheta.eq.1) THEN
phi=Cmplx(1.d0,0.d0,dp)
ELSE
CALL rotational(j_in, l_in, ndim, wftemp, 'I', 'SF')
phi=Cmplx(wftemp,0.d0,dp)
wftemp=0.d0
ENDIF
!=========================================================================================
! Interpolate initial Diatomic Vibrational Function
Call vibrational(s_dim, s_vals, s_min, s_max, vib_eig_in, ndim, wftemp, 'I')
print*,wftemp(1000:1010)
DEALLOCATE(s_vals)
phi=phi*wftemp
DEALLOCATE(wftemp)
ALLOCATE(wftemp2(ndim))
!=========================================================================================
! Calculate gaussian wavepacket
! Keep the same for now j(initial)=0 = l(initial)
Call S_wavepacket(wftemp2)!spacket)
phi = phi*wftemp2
!==================================================
! Obtain initial energy distribution (eta)
Call eta
!==================================================
! Combine components to obtain total wave packet
IF (debug) THEN
filename="iwf/total_iwf.txt"
OPEN(UNIT=output_unit0,FILE=TRIM(outdir)//TRIM(filename),IOSTAT=istat,STATUS='replace',ACTION='write')
IF (istat.ne.0) STOP 'OPEN failed - initial_wavepacket'
filename="iwf/xy_grid.txt"
OPEN(UNIT=output_unit2,FILE=TRIM(outdir)//TRIM(filename),IOSTAT=istat,STATUS='replace',ACTION='write')
IF (istat.ne.0) STOP 'OPEN failed - initial_wavepacket'
ENDIF
Do irho=1,nrho
Do itheta=1,ntheta
Do ichi=1,nchi
ispt=aphindex(ntheta,nchi,irho,itheta,ichi,.false.)
IF (ntheta.eq.1) THEN
jacobicoef=1.d0
aphcoef=Sqrt(rho_val(irho))
norm=1.d0
ELSE
jacobicoef=1.d0/(larges(ispt)*smalls(ispt))
aphcoef=Sqrt(rho_val(irho)**5)/4.d0
norm=1.d0/Sqrt(2.d0) ! because aph coords cover config space twice
ENDIF
phi(ispt)=norm*jacobicoef*aphcoef*phi(ispt)*Sqrt(weights(itheta))
IF (debug) THEN
IF (irho.eq.ind_rho_infty) THEN
probamp=Real(phi(ispt))**2+Aimag(phi(ispt))**2
IF (probamp.lt.1.d-15) probamp=0.d0
x=TAN(0.5d0*theta_val(itheta))*COS(chi_val(ichi))
y=TAN(0.5d0*theta_val(itheta))*SIN(chi_val(ichi))
Write(output_unit0,*) real(x,sp),real(y,sp),real(probamp,sp)
Write(output_unit2,*) real(x,sp),real(y,sp)
ENDIF
ENDIF
End Do
End Do
End Do
IF (debug) THEN
CLOSE(UNIT=output_unit0,IOSTAT=istat,STATUS='keep')
IF (istat.ne.0) STOP 'CLOSE failed - initial_wavefunction'
CLOSE(UNIT=output_unit2,IOSTAT=istat,STATUS='keep')
IF (istat.ne.0) STOP 'CLOSE failed - initial_wavefunction'
ENDIF
DEALLOCATE(wftemp2)
!=========================================================================================
! Symmetrize
ALLOCATE( symmat(nchi,nchi), resultvec(nchi), splitvec(nchi) )
filename='symmat.bin'
OPEN(111,file=TRIM(BinOutdir)//TRIM(filename),form='unformatted')
READ(111) symmat
CLOSE(111)
IF (debug) THEN
filename="iwf/total_iwf_sym.txt"
OPEN(UNIT=output_unit0,FILE=TRIM(outdir)//TRIM(filename),IOSTAT=istat,STATUS='replace',ACTION='write')
IF (istat.ne.0) STOP 'OPEN failed - initial_wavepacket'
ENDIF
DO irho=1,nrho
DO itheta=1,ntheta
DO ichi=1,nchi
ispt=aphindex(ntheta,nchi,irho,itheta,ichi,.false.)
splitvec(ichi)=phi(ispt)
ENDDO
resultvec=Matmul(Transpose(symmat),splitvec)
DO ichi=1,nchi
ispt=aphindex(ntheta,nchi,irho,itheta,ichi,.false.)
phi(ispt)=resultvec(ichi)
IF (debug) THEN
IF (irho.eq.ind_rho_infty) THEN
x=TAN(0.5d0*theta_val(itheta))*COS(chi_val(ichi))
y=TAN(0.5d0*theta_val(itheta))*SIN(chi_val(ichi))
probamp=Real(phi(ispt))**2+Aimag(phi(ispt))**2
IF (probamp.lt.1.d-15) probamp=0.d0
Write(output_unit0,*) real(x,sp),real(y,sp),real(probamp,sp)
ENDIF
ENDIF
ENDDO
ENDDO
ENDDO
IF (debug) THEN
CLOSE(UNIT=output_unit0,IOSTAT=istat,STATUS='keep')
IF (istat.ne.0) STOP 'CLOSE failed - initial_wavefunction'
ENDIF
CALL normalize(ndim,nchi,phi)
!=========================================================================================
! Check which irred. reps to be propagated
to_propagate=.false.
ircount: DO whichir=1,nirrep
nchir=nchi_ir(whichir)
indexchi=indexchi_array(whichir)
DO irho=1,nrho
DO itheta=1,ntheta
DO ichi=1,nchir
ispt=aphindex(ntheta,nchi,irho,itheta,ichi+indexchi,.false.)
IF (Abs(Real(phi(ispt),dp)).gt.tol) THEN
to_propagate(whichir)=.true.
CYCLE ircount
ENDIF
ENDDO
ENDDO
ENDDO
ENDDO ircount
print*,'to_propagate =',to_propagate
!=========================================================================================
! Output symmetrized wave function to binary
filename = 'iwf_sym.bin'
OPEN(UNIT=bin_unit0,FILE=TRIM(BinOutdir)//TRIM(filename),FORM='unformatted',STATUS='unknown')
WRITE(bin_unit0) phi
CLOSE(bin_unit0,STATUS='keep')
Deallocate(phi)
End Subroutine initial_wavepacket