mirror of https://gitlab.com/QEF/q-e.git
PP/chdens.f90 rewritten, different input
git-svn-id: http://qeforge.qe-forge.org/svn/q-e/trunk/espresso@206 c92efa57-630b-4861-b058-cf58834340f0
This commit is contained in:
parent
1c3a4736e8
commit
b493bc2f91
573
PP/chdens.f90
573
PP/chdens.f90
|
@ -17,16 +17,17 @@ subroutine do_chdens
|
||||||
!
|
!
|
||||||
! DESCRIPTION of the INPUT:
|
! DESCRIPTION of the INPUT:
|
||||||
!
|
!
|
||||||
!-&input Namelist &input;
|
!-&input Namelist &input; contains
|
||||||
! BELOW IS THE DESCRIPTION OF THE VARIABLES OF THE &INPUT NAMELIST
|
|
||||||
!
|
!
|
||||||
! nfile the number of data files
|
! nfile the number of data files (OPTIONAL, default: 1)
|
||||||
!
|
!
|
||||||
!----FOR i = 1, nfile:
|
!----FOR i = 1, nfile:
|
||||||
!
|
!
|
||||||
! filepp(i) file containing the 3D charge (produced by pp.x)
|
! filepp(i) file containing the 3D charge (produced by pp.x)
|
||||||
|
! (AT LEAST filepp(1) REQUIRED)
|
||||||
! weight(i) weight - The quantity to be plotted will be
|
! weight(i) weight - The quantity to be plotted will be
|
||||||
! weight(1)*rho(1) + weight(2)*rho(2) + weight(3)*rho(3) + ...
|
! weight(1)*rho(1) + weight(2)*rho(2) + weight(3)*rho(3)+...
|
||||||
|
! (OPTIONAL: default weight(1)=1.0)
|
||||||
!
|
!
|
||||||
! BEWARE: atomic coordinates are read from the first file;
|
! BEWARE: atomic coordinates are read from the first file;
|
||||||
! if their number is different for different files,
|
! if their number is different for different files,
|
||||||
|
@ -34,33 +35,75 @@ subroutine do_chdens
|
||||||
!
|
!
|
||||||
!----END_FOR
|
!----END_FOR
|
||||||
!
|
!
|
||||||
!
|
! iflag 1 if a 1D plot is required (DEFAULT)
|
||||||
! iflag 1 if a 1D plot is required
|
|
||||||
! 2 if a 2D plot is required
|
! 2 if a 2D plot is required
|
||||||
! 3 if a 3D plot is required
|
! 3 if a 3D plot is required
|
||||||
! 30 if a "fast" 3D plot is required: the 3D plot points
|
|
||||||
! are not recalculated from the Fourier components but
|
|
||||||
! directly extracted from the FFT grid of the system
|
|
||||||
! 31 if a "fast" 3D plot is required: the same as iflag=30,
|
|
||||||
! but the whole unit-cell is taken. Does not require the
|
|
||||||
! input of the e1,e2,e3,x0 and nx,ny,nz
|
|
||||||
! NOTE: works only for XCRYSDEN format (output_format=3)
|
|
||||||
! 4 if a 2D polar plot on a sphere is required
|
! 4 if a 2D polar plot on a sphere is required
|
||||||
!
|
!
|
||||||
! plot_out 0 plot the spherical average of the charge density
|
! plot_out 0 plot the spherical average of the charge density
|
||||||
! 1 plot the charge density
|
! 1 plot the charge density (DEFAULT)
|
||||||
! 2 plot the induced polarization along x
|
! 2 plot the induced polarization along x
|
||||||
! 3 plot the induced polarization along y
|
! 3 plot the induced polarization along y
|
||||||
! 4 plot the induced polarization along z
|
! 4 plot the induced polarization along z
|
||||||
!
|
!
|
||||||
! output_format (ignored on 1D plot)
|
! output_format (ignored on 1D plot)
|
||||||
! 0 format suitable for gnuplot
|
! 0 format suitable for gnuplot (1D) (DEFAULT)
|
||||||
! 1 format suitable for contour.x
|
! 1 format suitable for contour.x (2D)
|
||||||
! 2 format suitable for plotrho
|
! 2 format suitable for plotrho (2D)
|
||||||
! 3 format suitable for XCRYSDEN
|
! 3 format suitable for XCRYSDEN (1D, 2D, 3D)
|
||||||
! 4 format suitable for gOpenMol
|
! 4 format suitable for gOpenMol (3D)
|
||||||
|
! (formatted: convert to unformatted *.plt)
|
||||||
|
!
|
||||||
|
!-IF iflag = 1
|
||||||
|
! REQUIRED:
|
||||||
|
! e1 3D vector which determines the plotting line
|
||||||
|
! x0 3D vector, origin of the line
|
||||||
|
! nx number of points in the line:
|
||||||
|
! rho(i) = rho( x0 + e1 * (i-1)/(nx-1) ), i=1, nx
|
||||||
|
!
|
||||||
|
!-ELSEIF iflag = 2
|
||||||
|
! REQUIRED:
|
||||||
|
! e1, e2 3D vectors which determine the plotting plane
|
||||||
|
! (must be orthogonal)
|
||||||
|
! x0 3D vector, origin of the plane
|
||||||
|
! nx, ny number of points in the plane:
|
||||||
|
! rho(i,j) = rho( x0 + e1 * (i-1)/(nx-1)
|
||||||
|
! + e2 * (j-1)/(ny-1) ), i=1,nx ; j=1,ny
|
||||||
|
!
|
||||||
|
!-ELSEIF iflag = 3
|
||||||
|
! OPTIONAL:
|
||||||
|
! e1, e2, e3 3D vectors which determine the plotting parallelepiped
|
||||||
|
! (if present, must be orthogonal)
|
||||||
|
! x0 3D vector, origin of the parallelepiped
|
||||||
|
! nx,ny,nz number of points in the parallelepiped:
|
||||||
|
! rho(i,j,k) = rho( x0 + e1 * (i-1)/(nx-1)
|
||||||
|
! + e2 * (j-1)/(ny-1)
|
||||||
|
! + e3 * (k-1)/(nz-1) ),
|
||||||
|
! i = 1, nx ; j = 1, ny ; k = 1, nz
|
||||||
|
!
|
||||||
|
! - If output_format = 3 (XCRYSDENS), the above variables
|
||||||
|
! are ignored, the entire FFT grid is written in the
|
||||||
|
! XCRYSDENS format - works for any crystal axis
|
||||||
|
! - If e1, e2, e3, x0 are present, e1 e2 e3 are parallel
|
||||||
|
! to xyz and parallel to crystal axis, a subset of the
|
||||||
|
! FFT grid that approximately covers the parallelepiped
|
||||||
|
! defined by e1, e2, e3, x0, is written (presently only
|
||||||
|
! in gopenmol "formatted" file format) - works only
|
||||||
|
! if the crystal axis are parallel to xyz
|
||||||
|
! - Otherwise, the required 3D grid is generated from the
|
||||||
|
! Fourier components (may be VERY slow)
|
||||||
|
!
|
||||||
|
!-ELSEIF iflag = 4
|
||||||
|
! REQUIRED:
|
||||||
|
! radius Radius of the sphere (alat units), centered at (0,0,0)
|
||||||
|
! nx, ny number of points in the polar plane:
|
||||||
|
! phi(i) = 2 pi * (i - 1)/(nx-1), i=1, nx
|
||||||
|
! theta(j)= pi * (j - 1)/(ny-1), j=1, ny
|
||||||
|
!
|
||||||
|
! END IF
|
||||||
!
|
!
|
||||||
! fileout name of the file to which the plot is written
|
! fileout name of the file to which the plot is written
|
||||||
|
! (DEFAULT: standard output)
|
||||||
!
|
!
|
||||||
!----IF plot_out=2,3,4:
|
!----IF plot_out=2,3,4:
|
||||||
!
|
!
|
||||||
|
@ -70,7 +113,7 @@ subroutine do_chdens
|
||||||
! is written (in postproc format) for further processing
|
! is written (in postproc format) for further processing
|
||||||
! (macroscopic average)
|
! (macroscopic average)
|
||||||
!
|
!
|
||||||
!----IF iflag=3,30 and plot_out=1
|
!----IF iflag=3 and plot_out=1 (OPTIONAL)
|
||||||
!
|
!
|
||||||
! idpol 1 the ionic and electronic dipole moment of the charge
|
! idpol 1 the ionic and electronic dipole moment of the charge
|
||||||
! is computed.
|
! is computed.
|
||||||
|
@ -82,65 +125,21 @@ subroutine do_chdens
|
||||||
! the Bravais lattice. The 3d box must contain this cell
|
! the Bravais lattice. The 3d box must contain this cell
|
||||||
! otherwise meaningless numbers are printed.
|
! otherwise meaningless numbers are printed.
|
||||||
!
|
!
|
||||||
!----END_IF
|
|
||||||
!
|
|
||||||
!-/ END of namelist &input
|
!-/ END of namelist &input
|
||||||
!
|
|
||||||
!--------------- DESCRIPTION OF FURTHER STANDARD INPUT
|
|
||||||
!
|
|
||||||
!-IF iflag = 1 the following cards are
|
|
||||||
!
|
|
||||||
! e1 3D vector which determines the plotting line
|
|
||||||
! x0 3D vector, origin of the line
|
|
||||||
! nx number of points in the line:
|
|
||||||
! rho(i) = rho( x0 + e1 * (i-1)/(nx-1) ), i=1, nx
|
|
||||||
!
|
|
||||||
!-ELSEIF iflag = 2 the following cards are
|
|
||||||
!
|
|
||||||
! e1 3D vectors which determine the plotting plane
|
|
||||||
! e2 NB: the two axes must be orthogonal
|
|
||||||
! x0 3D vector, origin of the plane
|
|
||||||
! nx, ny number of points in the plane:
|
|
||||||
! rho(i,j) = rho( x0 + e1 * (i-1)/(nx-1)
|
|
||||||
! + e2 * (j-1)/(ny-1) ), i = 1, nx ; j = 1, ny
|
|
||||||
!
|
|
||||||
!-ELSEIF iflag = 3 or iflag = 30 the following cards are
|
|
||||||
! e1
|
|
||||||
! e2 3D vectors which determine the plotting parallelepiped
|
|
||||||
! e3 REQUIREMENT: the three axes must be orthogonal !!!
|
|
||||||
! x0 3D vector, origin of the parallelepiped
|
|
||||||
! nx,ny,nz number of points in the parallelepiped:
|
|
||||||
! rho(i,j,k) = rho( x0 + e1 * (i-1)/(nx-1)
|
|
||||||
! + e2 * (j-1)/(ny-1)
|
|
||||||
! + e3 * (k-1)/(nz-1) ),
|
|
||||||
! i = 1, nx ; j = 1, ny ; k = 1, nz
|
|
||||||
!
|
|
||||||
! IMPORTANT: all 3D vectors in a0 (alat) units
|
|
||||||
! BEWARE: iflag = 30 (fast plot)
|
|
||||||
! - works only if crystal axes are orthogonal
|
|
||||||
! - works only if e1 is along x, e2 along y, e3 along z
|
|
||||||
! - the plotting grid is fixed and determined by the FFT grid
|
|
||||||
! - nx, ny, nz are ignored
|
|
||||||
! - the parallelepiped defined by e1, e2, e3, x0 is displaced
|
|
||||||
! and stretched so as to fit the FFT grid
|
|
||||||
! BEWARE: iflag = 30 (fast plot, whole cell)
|
|
||||||
! - works for all crystal axes
|
|
||||||
! - works only for XCRYSDEN XSF output format (i.e. output_format = 3)
|
|
||||||
!
|
|
||||||
!-ELSEIF iflag = 4 the following cards are
|
|
||||||
!
|
|
||||||
! radius Radius of the sphere (alat units), centered at (0,0,0)
|
|
||||||
! nx, ny number of points in the polar plane:
|
|
||||||
! phi(i) = 2 pi * (i - 1)/(nx-1), i=1, nx
|
|
||||||
! theta(j)= pi * (j - 1)/(ny-1), j=1, ny
|
|
||||||
!
|
|
||||||
!-ENDIF
|
|
||||||
!
|
|
||||||
!EOF
|
|
||||||
|
|
||||||
#include "machine.h"
|
#include "machine.h"
|
||||||
use pwcom
|
! use pwcom
|
||||||
use io
|
use constants, only: pi, fpi
|
||||||
|
use brilz
|
||||||
|
use basis
|
||||||
|
use char
|
||||||
|
use lsda_mod, only: nspin
|
||||||
|
use gvect
|
||||||
|
use gsmooth
|
||||||
|
use pseud, only: zv
|
||||||
|
use scf, only: rho
|
||||||
|
use workspace
|
||||||
|
! use io
|
||||||
|
|
||||||
implicit none
|
implicit none
|
||||||
integer, parameter :: nfilemax = 7
|
integer, parameter :: nfilemax = 7
|
||||||
|
@ -149,13 +148,13 @@ subroutine do_chdens
|
||||||
integer :: inunit, ounit, iflag, ios, ipol, nfile, ifile, nx, ny, nz, &
|
integer :: inunit, ounit, iflag, ios, ipol, nfile, ifile, nx, ny, nz, &
|
||||||
na, ir, i, j, ig, plot_out, output_format, plot_num
|
na, ir, i, j, ig, plot_out, output_format, plot_num
|
||||||
|
|
||||||
real(kind=DP) :: e (3, 3), x0 (3), radius, m1, m2, m3, &
|
real(kind=DP) :: e1(3), e2(3), e3(3), x0 (3), radius, m1, m2, m3, &
|
||||||
weight (nfilemax), epsilon
|
weight (nfilemax), epsilon
|
||||||
|
|
||||||
character (len=80) :: fileout, filepol, filename (nfilemax)
|
character (len=80) :: fileout, filepol, filename (nfilemax)
|
||||||
|
|
||||||
real(kind=DP) :: celldms (6), gcutmsa, duals, ecuts, zvs(ntypx), ats(3,3)
|
real(kind=DP) :: celldms (6), gcutmsa, duals, ecuts, zvs(ntypx), ats(3,3)
|
||||||
real(kind=DP), allocatable :: taus (:,:)
|
real(kind=DP), allocatable :: taus (:,:), rhor(:)
|
||||||
integer :: ibravs, nrx1sa, nrx2sa, nrx3sa, nr1sa, nr2sa, nr3sa, &
|
integer :: ibravs, nrx1sa, nrx2sa, nrx3sa, nr1sa, nr2sa, nr3sa, &
|
||||||
ntyps, nats
|
ntyps, nats
|
||||||
integer :: idpol ! dipol moment flag
|
integer :: idpol ! dipol moment flag
|
||||||
|
@ -163,12 +162,12 @@ subroutine do_chdens
|
||||||
character (len=3) :: atms(ntypx)
|
character (len=3) :: atms(ntypx)
|
||||||
character (len=80) :: filepp(nfilemax)
|
character (len=80) :: filepp(nfilemax)
|
||||||
real(kind=DP) :: rhodum, dipol(0:3)
|
real(kind=DP) :: rhodum, dipol(0:3)
|
||||||
complex(kind=DP), allocatable:: vgc (:)
|
complex(kind=DP), allocatable:: rhog (:)
|
||||||
! rho or polarization in G space
|
! rho or polarization in G space
|
||||||
logical :: fast3d
|
logical :: fast3d
|
||||||
|
|
||||||
namelist /input/ &
|
namelist /input/ &
|
||||||
nfile, filepp, weight, iflag, idpol, &
|
nfile, filepp, weight, iflag, idpol, e1, e2, e3, nx, ny, nz, x0, &
|
||||||
plot_out, output_format, fileout, epsilon, filepol
|
plot_out, output_format, fileout, epsilon, filepol
|
||||||
|
|
||||||
!
|
!
|
||||||
|
@ -185,13 +184,17 @@ subroutine do_chdens
|
||||||
epsilon = 1.0d0
|
epsilon = 1.0d0
|
||||||
idpol = 0
|
idpol = 0
|
||||||
filepol = ' '
|
filepol = ' '
|
||||||
fast3d = .false.
|
e1(:) = 0.d0
|
||||||
|
e2(:) = 0.d0
|
||||||
|
e3(:) = 0.d0
|
||||||
|
x0(:) = 0.d0
|
||||||
|
nx = 0
|
||||||
|
ny = 0
|
||||||
|
nz = 0
|
||||||
!
|
!
|
||||||
! read and check input data
|
! read and check input data
|
||||||
!
|
!
|
||||||
inunit = 5
|
inunit = 5
|
||||||
|
|
||||||
!
|
!
|
||||||
! reading the namelist input
|
! reading the namelist input
|
||||||
!
|
!
|
||||||
|
@ -202,17 +205,8 @@ subroutine do_chdens
|
||||||
if (nfile.le.0.or.nfile.gt.nfilemax) &
|
if (nfile.le.0.or.nfile.gt.nfilemax) &
|
||||||
call errore ('chdens ', 'nfile is wrong ', 1)
|
call errore ('chdens ', 'nfile is wrong ', 1)
|
||||||
|
|
||||||
|
|
||||||
! check for iflag
|
|
||||||
if (iflag.eq.30) then
|
|
||||||
iflag = 3
|
|
||||||
fast3d = .true.
|
|
||||||
end if
|
|
||||||
if ((iflag.lt.1.or.iflag.gt.4) .and. iflag.ne.31) &
|
|
||||||
call errore ('chdens', 'iflag not implemented', 1)
|
|
||||||
|
|
||||||
! check for idpol
|
! check for idpol
|
||||||
if (idpol.eq.1.or.idpol.eq.2) then
|
if (idpol == 1 .or. idpol == 2) then
|
||||||
if (iflag.ne.3) then
|
if (iflag.ne.3) then
|
||||||
idpol=0
|
idpol=0
|
||||||
call errore("chdens","dipole computed only if iflag=3 or 30",-1)
|
call errore("chdens","dipole computed only if iflag=3 or 30",-1)
|
||||||
|
@ -223,74 +217,56 @@ subroutine do_chdens
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
! reading the rest of input (spanning vectors, origin, number-of points)
|
! check for iflag
|
||||||
if (iflag.lt.4) then
|
|
||||||
read (inunit, *, err = 1100, iostat = ios) (e (ipol,1), ipol = 1, 3)
|
|
||||||
if (e(1,1)**2 + e(2,1)**2 + e(3,1)**2 .lt. 1d-3) &
|
|
||||||
call errore ('chdens', 'zero vector', 1)
|
|
||||||
endif
|
|
||||||
if (iflag.eq.1) then
|
|
||||||
!
|
|
||||||
! reading for the 1D plot
|
|
||||||
!
|
|
||||||
read (inunit, *, err = 1100, iostat = ios) (x0 (ipol), ipol = 1, 3)
|
|
||||||
read (inunit, *, err = 1100, iostat = ios) nx
|
|
||||||
endif
|
|
||||||
!
|
|
||||||
if (iflag.ge.2.and.iflag.lt.4) then
|
|
||||||
!
|
|
||||||
! reading for the 2D and 3D plots
|
|
||||||
!
|
|
||||||
read (inunit, *, err = 1100, iostat = ios) (e(ipol,2), ipol=1,3)
|
|
||||||
!
|
|
||||||
! here we control that the vectors are not on the same line
|
|
||||||
!
|
|
||||||
if ( (abs(e(1,1)*e(2,2) - e(2,1)*e(1,2) ) .lt. 1e-7) .and. &
|
|
||||||
(abs(e(3,1)*e(1,2) - e(1,1)*e(3,2) ) .lt. 1e-7) .and. &
|
|
||||||
(abs(e(3,1)*e(2,2) - e(2,1)*e(3,2) ) .lt. 1e-7) ) &
|
|
||||||
call errore ('chdens', 'vectors on the same line', 1)
|
|
||||||
!
|
|
||||||
! and here that they are orthogonal
|
|
||||||
!
|
|
||||||
if (abs(e(1,1)*e(1,2) + e(2,1)*e(2,2) + e(3,1)*e(3,2)) .gt. 1e-4) &
|
|
||||||
call errore ('chdens', 'vectors are not orthogonal', 1)
|
|
||||||
!
|
|
||||||
if (iflag.eq.3) then
|
|
||||||
!
|
|
||||||
! reading for the 3D plot
|
|
||||||
!
|
|
||||||
read (inunit, *, err=1100, iostat=ios) (e(ipol,3), ipol=1,3)
|
|
||||||
|
|
||||||
!
|
if (iflag == 1) then
|
||||||
! here we control that the vectors are not on the same line
|
|
||||||
!
|
! 1D plot : check variables
|
||||||
if ( (abs(e(1,1)*e(2,3) - e(2,1)*e(1,3)) .lt. 1e-7) .and. &
|
|
||||||
(abs(e(3,1)*e(1,3) - e(1,1)*e(3,3)) .lt. 1e-7) .and. &
|
if (e1(1)**2 + e1(2)**2 + e1(3)**2 < 1d-6) &
|
||||||
(abs(e(3,1)*e(2,3) - e(2,1)*e(3,3)) .lt. 1e-7) ) &
|
call errore ('chdens', 'missing e1 vector', 1)
|
||||||
call errore ('chdens', 'vectors on the same line', 2)
|
if (nx <= 0 ) call errore ('chdens', 'wrong nx', 1)
|
||||||
!
|
|
||||||
! and here that they are orthogonal
|
else if (iflag == 2) then
|
||||||
!
|
|
||||||
if (abs(e(1,1)*e(1,3) + e(2,1)*e(2,3) + e(3,1)*e(3,3)) .gt. 1e-4 .or. &
|
! 2D plot : check variables
|
||||||
abs(e(1,2)*e(1,3) + e(2,2)*e(2,3) + e(3,2)*e(3,3)) .gt. 1e-4) &
|
|
||||||
call errore ('chdens', 'vectors are not orthogonal', 2)
|
if (e1(1)**2 + e1(2)**2 + e1(3)**2 < 1d-6 .or. &
|
||||||
endif
|
e2(1)**2 + e2(2)**2 + e2(3)**2 < 1d-6) &
|
||||||
read (inunit, *, err = 1100, iostat = ios) (x0 (ipol), ipol = &
|
call errore ('chdens', 'missing e1/e2 vectors', 1)
|
||||||
1, 3)
|
if (e1(1)*e2(1) + e1(2)*e2(2) + e1(3)*e2(3) > 1d-6) &
|
||||||
if (iflag.eq.2) then
|
call errore ('chdens', 'e1 and e2 are not orthogonal', 1)
|
||||||
read (inunit, *, err = 1100, iostat = ios) nx, ny
|
if (nx <= 0 .or. ny <= 0 ) call errore ('chdens', 'wrong nx/ny', 2)
|
||||||
elseif (iflag.eq.3) then
|
|
||||||
read (inunit, *, err = 1100, iostat = ios) nx, ny, nz
|
else if (iflag == 3) then
|
||||||
endif
|
|
||||||
endif
|
! 3D plot : check variables
|
||||||
|
|
||||||
|
if ( e1(1)*e2(1) + e1(2)*e2(2) + e1(3)*e2(3) > 1d-6 .or. &
|
||||||
|
e1(1)*e3(1) + e1(2)*e3(2) + e1(3)*e3(3) > 1d-6 .or. &
|
||||||
|
e2(1)*e3(1) + e2(2)*e3(2) + e2(3)*e3(3) > 1d-6 ) &
|
||||||
|
call errore ('chdens', 'e1, e2, e3 are not orthogonal', 1)
|
||||||
|
|
||||||
|
if (output_format < 3 .and. output_format > 4) then
|
||||||
|
|
||||||
|
call errore ('chdens', 'incompatibly iflag/output_format', 1)
|
||||||
|
|
||||||
|
endif
|
||||||
|
|
||||||
|
else if (iflag == 4) then
|
||||||
|
|
||||||
|
if (nx <= 0 .or. ny <= 0 ) call errore ('chdens', 'wrong nx/ny', 4)
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
call errore ('chdens', 'iflag not implemented', 1)
|
||||||
|
|
||||||
if (iflag.eq.4) then
|
|
||||||
read (inunit, *, err = 1100, iostat = ios) radius
|
|
||||||
read (inunit, *, err = 1100, iostat = ios) nx, ny
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
! check for plot_out
|
! check for plot_out
|
||||||
if (plot_out.lt.0.or.plot_out.gt.4) call errore ('chdens','plot_out wrong',1)
|
|
||||||
|
if (plot_out < 0 .or. plot_out > 4) call errore ('chdens','plot_out wrong',1)
|
||||||
|
|
||||||
!
|
!
|
||||||
! Read the header and allocate objects
|
! Read the header and allocate objects
|
||||||
!
|
!
|
||||||
|
@ -300,6 +276,7 @@ subroutine do_chdens
|
||||||
!
|
!
|
||||||
allocate(tau (3, nat))
|
allocate(tau (3, nat))
|
||||||
allocate(ityp(nat))
|
allocate(ityp(nat))
|
||||||
|
allocate(rhor(nrx1*nrx2*nrx3))
|
||||||
!
|
!
|
||||||
alat = celldm (1)
|
alat = celldm (1)
|
||||||
tpiba = 2.d0 * pi / alat
|
tpiba = 2.d0 * pi / alat
|
||||||
|
@ -319,18 +296,14 @@ subroutine do_chdens
|
||||||
call set_fft_dim
|
call set_fft_dim
|
||||||
|
|
||||||
call allocate_fft
|
call allocate_fft
|
||||||
|
|
||||||
rho = 0.d0
|
|
||||||
!
|
!
|
||||||
! Read first file
|
! Read first file
|
||||||
!
|
!
|
||||||
call plot_io (filepp (1), title, nrx1, nrx2, nrx3, nr1, nr2, nr3, &
|
call plot_io (filepp (1), title, nrx1, nrx2, nrx3, nr1, nr2, nr3, &
|
||||||
nat, ntyp, ibrav, celldm, at, gcutm, dual, ecutwfc, &
|
nat, ntyp, ibrav, celldm, at, gcutm, dual, ecutwfc, &
|
||||||
plot_num, atm, ityp, zv, tau, rho, -1)
|
plot_num, atm, ityp, zv, tau, rho(1,1), -1)
|
||||||
!
|
!
|
||||||
do ir = 1, nrxx
|
rhor (:) = weight (1) * rho (:,1)
|
||||||
psic (ir) = weight (1) * cmplx (rho (ir, 1),0.d0)
|
|
||||||
enddo
|
|
||||||
!
|
!
|
||||||
! Read following files (if any), verify consistency
|
! Read following files (if any), verify consistency
|
||||||
! Note that only rho is read; all other quantities are discarded
|
! Note that only rho is read; all other quantities are discarded
|
||||||
|
@ -341,7 +314,7 @@ subroutine do_chdens
|
||||||
!
|
!
|
||||||
call plot_io (filepp (ifile), title, nrx1sa, nrx2sa, nrx3sa, &
|
call plot_io (filepp (ifile), title, nrx1sa, nrx2sa, nrx3sa, &
|
||||||
nr1sa, nr2sa, nr3sa, nats, ntyps, ibravs, celldms, ats, gcutmsa, &
|
nr1sa, nr2sa, nr3sa, nats, ntyps, ibravs, celldms, ats, gcutmsa, &
|
||||||
duals, ecuts, plot_num, atms, ityps, zvs, taus, rho, - 1)
|
duals, ecuts, plot_num, atms, ityps, zvs, taus, rho(1,1), - 1)
|
||||||
!
|
!
|
||||||
deallocate (ityps)
|
deallocate (ityps)
|
||||||
deallocate (taus)
|
deallocate (taus)
|
||||||
|
@ -359,9 +332,7 @@ subroutine do_chdens
|
||||||
('chdens', 'incompatible celldm', 1)
|
('chdens', 'incompatible celldm', 1)
|
||||||
enddo
|
enddo
|
||||||
!
|
!
|
||||||
do ir = 1, nrxx
|
rhor (:) = rhor (:) + weight (ifile) * rho (:,1)
|
||||||
psic(ir) = psic(ir) + weight(ifile) * cmplx(rho(ir,1),0.d0)
|
|
||||||
enddo
|
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
!
|
!
|
||||||
|
@ -375,38 +346,32 @@ subroutine do_chdens
|
||||||
ounit = 6
|
ounit = 6
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
! ----------------------------------------------------------------
|
|
||||||
! iflag=31
|
|
||||||
! ----------------------------------------------------------------
|
|
||||||
! at this point we are ready to print the whole FFT mesh (density only)
|
|
||||||
! TODO: check the consistency of iflag=31 with plot_out
|
|
||||||
if (iflag.eq.31 .and. plot_out.eq.1) then
|
|
||||||
|
|
||||||
if (output_format .ne. 3) then
|
|
||||||
! so far iflag.eq.31 works only for XCRYSDEN's XSF format
|
|
||||||
call errore ('chdens', 'wrong output_format for iflag.eq.31; works only if output_format.eq.3', 1)
|
|
||||||
endif
|
|
||||||
|
|
||||||
call plot_whole_cell (alat, at, nat, tau, atm, ityp, &
|
|
||||||
nr1, nr2, nr3, nrx1, nrx2, nrx3, psic, output_format, ounit)
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
!
|
!
|
||||||
! At this point we start the calculations, first we normalize the vec
|
! At this point we start the calculations, first we normalize the
|
||||||
|
! vectors defining the plotting region.
|
||||||
|
! If these vectors have 0 length, replace them with crystal axis
|
||||||
!
|
!
|
||||||
if (iflag.lt.4) then
|
|
||||||
m1 = sqrt (e (1, 1) **2 + e (2, 1) **2 + e (3, 1) **2)
|
|
||||||
if (iflag.ge.2) m2 = sqrt(e(1,2)**2 + e(2,2)**2 + e(3,2)**2)
|
|
||||||
if (iflag.eq.3) m3 = sqrt(e(1,3)**2 + e(2,3)**2 + e(3,3)**2)
|
|
||||||
|
|
||||||
do ipol = 1, 3
|
m1 = sqrt (e1 (1)**2 + e1 (2)**2 + e1 (3)**2)
|
||||||
e (ipol, 1) = e (ipol, 1) / m1
|
if (m1 == 0) then
|
||||||
if (iflag.ge.2) e (ipol, 2) = e (ipol, 2) / m2
|
e1 (:) = at(:,1)
|
||||||
if (iflag.eq.3) e (ipol, 3) = e (ipol, 3) / m3
|
m1 = sqrt (e1 (1)**2 + e1 (2)**2 + e1 (3)**2)
|
||||||
enddo
|
end if
|
||||||
endif
|
if (m1 > 0) e1 (:) = e1 (:) / m1
|
||||||
|
!
|
||||||
|
m2 = sqrt (e2 (1)**2 + e2 (2)**2 + e2 (3)**2)
|
||||||
|
if (m2 == 0) then
|
||||||
|
e2 (:) = at(:,2)
|
||||||
|
m2 = sqrt (e2 (1)**2 + e2 (2)**2 + e2 (3)**2)
|
||||||
|
end if
|
||||||
|
if (m2 > 0) e2 (:) = e2 (:) / m2
|
||||||
|
!
|
||||||
|
m3 = sqrt (e3 (1)**2 + e3 (2)**2 + e3 (3)**2)
|
||||||
|
if (m3 == 0) then
|
||||||
|
e3 (:) = at(:,3)
|
||||||
|
m3 = sqrt (e3 (1)**2 + e3 (2)**2 + e3 (3)**2)
|
||||||
|
end if
|
||||||
|
if (m3 > 0) e3 (:) = e3 (:) / m3
|
||||||
!
|
!
|
||||||
! and rebuild G-vectors in reciprocal space
|
! and rebuild G-vectors in reciprocal space
|
||||||
!
|
!
|
||||||
|
@ -414,61 +379,58 @@ subroutine do_chdens
|
||||||
!
|
!
|
||||||
! here we compute the fourier component of the quantity to plot
|
! here we compute the fourier component of the quantity to plot
|
||||||
!
|
!
|
||||||
|
psic(:) = DCMPLX (rhor(:), 0.d0)
|
||||||
call cft3 (psic, nr1, nr2, nr3, nrx1, nrx2, nrx3, - 1)
|
call cft3 (psic, nr1, nr2, nr3, nrx1, nrx2, nrx3, - 1)
|
||||||
!
|
!
|
||||||
! we store the fourier components in the array vgc
|
! we store the fourier components in the array rhog
|
||||||
!
|
!
|
||||||
|
|
||||||
allocate (vgc( ngm))
|
allocate (rhog( ngm))
|
||||||
if (plot_out.le.1) then
|
if (plot_out <= 1) then
|
||||||
do ig = 1, ngm
|
do ig = 1, ngm
|
||||||
vgc (ig) = psic (nl (ig) )
|
rhog (ig) = psic (nl (ig) )
|
||||||
enddo
|
enddo
|
||||||
else
|
else
|
||||||
ipol = plot_out - 1
|
ipol = plot_out - 1
|
||||||
do ig = 2, ngm
|
rhog (1) = (epsilon - 1.d0) / fpi
|
||||||
vgc (ig) = psic (nl (ig) ) * g (ipol, ig) / gg (ig)
|
rhog (2:ngm) = psic (nl (2:ngm) ) * g (ipol, 2:ngm) / gg (2:ngm)
|
||||||
enddo
|
!
|
||||||
|
! bring the quantity back to real space
|
||||||
vgc (1) = (epsilon - 1.d0) / fpi
|
!
|
||||||
|
psic (:) = (0.d0,0.d0)
|
||||||
|
psic (nl (:) ) = rhog (:)
|
||||||
|
call cft3 (psic, nr1, nr2, nr3, nrx1, nrx2, nrx3, 1)
|
||||||
|
!
|
||||||
|
rho (:, 1) = DREAL (psic (:) )
|
||||||
|
!
|
||||||
if (filepol.ne.' ') then
|
if (filepol.ne.' ') then
|
||||||
!
|
! write to the output file
|
||||||
! bring the quantity in real space and write the output file
|
|
||||||
!
|
|
||||||
psic(:) = (0.d0,0.d0)
|
|
||||||
do ig = 1, ngm
|
|
||||||
psic (nl (ig) ) = vgc (ig)
|
|
||||||
enddo
|
|
||||||
call cft3 (psic, nr1, nr2, nr3, nrx1, nrx2, nrx3, 1)
|
|
||||||
!
|
|
||||||
do ir = 1, nrxx
|
|
||||||
rho (ir, 1) = real (psic (ir) )
|
|
||||||
enddo
|
|
||||||
call plot_io (filepol, title, nrx1, nrx2, nrx3, nr1, nr2, nr3, &
|
call plot_io (filepol, title, nrx1, nrx2, nrx3, nr1, nr2, nr3, &
|
||||||
nat, ntyp, ibrav, celldm, at, gcutm, dual, ecutwfc, &
|
nat, ntyp, ibrav, celldm, at, gcutm, dual, ecutwfc, &
|
||||||
plot_num, atm, ityp, zv, tau, rho, + 1)
|
plot_num, atm, ityp, zv, tau, rho(1,1), + 1)
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
!
|
!
|
||||||
! And now the plot
|
! And now the plot (rhog in G-space, rhor in real space)
|
||||||
!
|
!
|
||||||
if (iflag.eq.1) then
|
if (iflag == 1) then
|
||||||
|
|
||||||
call plot_1d (nx, m1, x0, e, ngm, g, vgc, alat, plot_out, ounit)
|
call plot_1d (nx, m1, x0, e1, ngm, g, rhog, alat, plot_out, ounit)
|
||||||
|
|
||||||
elseif (iflag.eq.2) then
|
elseif (iflag == 2) then
|
||||||
|
|
||||||
call plot_2d (nx, ny, m1, m2, x0, e, ngm, g, vgc, alat, &
|
call plot_2d (nx, ny, m1, m2, x0, e1, e2, ngm, g, rhog, alat, &
|
||||||
at, nat, tau, atm, ityp, output_format, ounit)
|
at, nat, tau, atm, ityp, output_format, ounit)
|
||||||
if (output_format.eq.2) then
|
if (output_format == 2) then
|
||||||
write (ounit, '(i4)') nat
|
write (ounit, '(i4)') nat
|
||||||
write (ounit, '(3f8.4,i3)') ( (tau(ipol,na), ipol=1,3), 1, na=1,nat)
|
write (ounit, '(3f8.4,i3)') ( (tau(ipol,na), ipol=1,3), 1, na=1,nat)
|
||||||
write (ounit, '(f10.6)') celldm (1)
|
write (ounit, '(f10.6)') celldm (1)
|
||||||
write (ounit, '(3(3f12.6/))') at
|
write (ounit, '(3(3f12.6/))') at
|
||||||
endif
|
endif
|
||||||
|
|
||||||
elseif (iflag.eq.3) then
|
elseif (iflag == 3) then
|
||||||
if (output_format.eq.4) then
|
|
||||||
|
if (output_format == 4) then
|
||||||
|
|
||||||
! gopenmol wants the coordinates in a separate file
|
! gopenmol wants the coordinates in a separate file
|
||||||
|
|
||||||
|
@ -484,34 +446,64 @@ subroutine do_chdens
|
||||||
end if
|
end if
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if (fast3d) then
|
! are vectors defining the plotting region aligned along xyz ?
|
||||||
call cft3 (psic, nr1, nr2, nr3, nrx1, nrx2, nrx3, + 1)
|
|
||||||
call plot_fast (celldm (1), at, nat, tau, atm, ityp, &
|
fast3d = ( e1(2) == 0.d0 .and. e1(3) == 0.d0) .and. &
|
||||||
nrx1, nrx2, nrx3, nr1, nr2, nr3, psic, &
|
( e2(1) == 0.d0 .and. e2(3) == 0.d0) .and. &
|
||||||
bg, m1, m2, m3, x0, e, output_format, ounit, dipol(0))
|
( e3(1) == 0.d0 .and. e3(2) == 0.d0)
|
||||||
|
|
||||||
|
! are crystal axis aligned along x, y, z ?
|
||||||
|
|
||||||
|
fast3d = fast3d .and. &
|
||||||
|
( at(2,1) == 0.d0 .and. at(3,1) == 0.d0) .and. &
|
||||||
|
( at(1,2) == 0.d0 .and. at(3,2) == 0.d0) .and. &
|
||||||
|
( at(1,3) == 0.d0 .and. at(2,3) == 0.d0)
|
||||||
|
|
||||||
|
if (output_format == 300) then
|
||||||
|
!
|
||||||
|
! XCRYSDEN FORMAT
|
||||||
|
!
|
||||||
|
call xsf_struct (alat, at, nat, tau, atm, ityp, ounit)
|
||||||
|
call xsf_fast_datagrid_3d &
|
||||||
|
(rhor, nr1, nr2, nr3, nrx1, nrx2, nrx3, at, alat, ounit)
|
||||||
else
|
else
|
||||||
call plot_3d (celldm (1), at, nat, tau, atm, ityp, ngm, g, vgc, &
|
!
|
||||||
nx, ny, nz, m1, m2, m3, x0, e, output_format, ounit, dipol(0))
|
! GOPENMOL FORMAT
|
||||||
|
!
|
||||||
|
if (.not.fast3d) then
|
||||||
|
|
||||||
|
call plot_fast (celldm (1), at, nat, tau, atm, ityp, &
|
||||||
|
nrx1, nrx2, nrx3, nr1, nr2, nr3, rhor, &
|
||||||
|
bg, m1, m2, m3, x0, e1, e2, e3, output_format, ounit, dipol(0))
|
||||||
|
else
|
||||||
|
call plot_3d (celldm (1), at, nat, tau, atm, ityp, ngm, g, rhog, &
|
||||||
|
nx, ny, nz, m1, m2, m3, x0, e1, e2, e3, output_format, ounit, &
|
||||||
|
dipol(0))
|
||||||
|
end if
|
||||||
end if
|
end if
|
||||||
|
|
||||||
|
! at this point we are ready to print the whole FFT mesh (density only)
|
||||||
|
|
||||||
if (idpol.eq.1.or.idpol.eq.2) &
|
if (idpol.eq.1.or.idpol.eq.2) &
|
||||||
call write_dipol(dipol(0),tau,nat,alat,zv,ntyp,ityp,idpol)
|
call write_dipol(dipol(0),tau,nat,alat,zv,ntyp,ityp,idpol)
|
||||||
|
|
||||||
elseif (iflag.eq.4) then
|
elseif (iflag == 4) then
|
||||||
radius = radius / alat
|
radius = radius / alat
|
||||||
call plot_2ds (nx, ny, radius, ngm, g, vgc, output_format, ounit)
|
call plot_2ds (nx, ny, radius, ngm, g, rhog, output_format, ounit)
|
||||||
else
|
else
|
||||||
|
|
||||||
call errore ('chdens', 'wrong iflag', 1)
|
call errore ('chdens', 'wrong iflag', 1)
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
deallocate(vgc)
|
deallocate(rhor)
|
||||||
|
deallocate(rhog)
|
||||||
return
|
return
|
||||||
1100 call errore ('chdens', 'reading input data', abs (ios) )
|
1100 call errore ('chdens', 'reading input data', abs (ios) )
|
||||||
end subroutine do_chdens
|
end subroutine do_chdens
|
||||||
!
|
!
|
||||||
!-----------------------------------------------------------------------
|
!-----------------------------------------------------------------------
|
||||||
subroutine plot_1d (nx, m1, x0, e, ngm, g, vgc, alat, plot_out, ounit)
|
subroutine plot_1d (nx, m1, x0, e, ngm, g, rhog, alat, plot_out, ounit)
|
||||||
!-----------------------------------------------------------------------
|
!-----------------------------------------------------------------------
|
||||||
!
|
!
|
||||||
use parameters, only : DP
|
use parameters, only : DP
|
||||||
|
@ -529,7 +521,7 @@ subroutine plot_1d (nx, m1, x0, e, ngm, g, vgc, alat, plot_out, ounit)
|
||||||
! lattice parameter
|
! lattice parameter
|
||||||
! G-vectors
|
! G-vectors
|
||||||
|
|
||||||
complex(kind=DP) :: vgc (ngm)
|
complex(kind=DP) :: rhog (ngm)
|
||||||
! rho or polarization in G space
|
! rho or polarization in G space
|
||||||
integer :: i, ig
|
integer :: i, ig
|
||||||
real(kind=DP) :: rhomin, rhomax, rhoint, rhoim, xi, yi, zi, deltax, arg, gr
|
real(kind=DP) :: rhomin, rhomax, rhoint, rhoim, xi, yi, zi, deltax, arg, gr
|
||||||
|
@ -560,7 +552,7 @@ subroutine plot_1d (nx, m1, x0, e, ngm, g, vgc, alat, plot_out, ounit)
|
||||||
! NB: G are in 2pi/alat units, r are in alat units
|
! NB: G are in 2pi/alat units, r are in alat units
|
||||||
!
|
!
|
||||||
arg = 2.d0 * pi * ( xi*g(1,ig) + yi*g(2,ig) + zi*g(3,ig) )
|
arg = 2.d0 * pi * ( xi*g(1,ig) + yi*g(2,ig) + zi*g(3,ig) )
|
||||||
carica(i) = carica(i) + vgc (ig) * cmplx(cos(arg),sin(arg))
|
carica(i) = carica(i) + rhog (ig) * cmplx(cos(arg),sin(arg))
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
else
|
else
|
||||||
|
@ -570,13 +562,13 @@ subroutine plot_1d (nx, m1, x0, e, ngm, g, vgc, alat, plot_out, ounit)
|
||||||
!
|
!
|
||||||
! G =0 term
|
! G =0 term
|
||||||
do i = 1, nx
|
do i = 1, nx
|
||||||
carica (i) = 4.d0 * pi * vgc (1)
|
carica (i) = 4.d0 * pi * rhog (1)
|
||||||
enddo
|
enddo
|
||||||
! G!=0 terms
|
! G!=0 terms
|
||||||
do ig = 2, ngm
|
do ig = 2, ngm
|
||||||
arg = 2.d0 * pi * ( x0(1)*g(1,ig) + x0(2)*g(2,ig) + x0(3)*g(3,ig) )
|
arg = 2.d0 * pi * ( x0(1)*g(1,ig) + x0(2)*g(2,ig) + x0(3)*g(3,ig) )
|
||||||
! This displaces the origin into x0
|
! This displaces the origin into x0
|
||||||
rho0g = vgc (ig) * cmplx(cos(arg),sin(arg))
|
rho0g = rhog (ig) * cmplx(cos(arg),sin(arg))
|
||||||
! r =0 term
|
! r =0 term
|
||||||
carica (1) = carica (1) + 4.d0 * pi * rho0g
|
carica (1) = carica (1) + 4.d0 * pi * rho0g
|
||||||
! r!=0 terms
|
! r!=0 terms
|
||||||
|
@ -627,7 +619,7 @@ subroutine plot_1d (nx, m1, x0, e, ngm, g, vgc, alat, plot_out, ounit)
|
||||||
end subroutine plot_1d
|
end subroutine plot_1d
|
||||||
!
|
!
|
||||||
!-----------------------------------------------------------------------
|
!-----------------------------------------------------------------------
|
||||||
subroutine plot_2d (nx, ny, m1, m2, x0, e, ngm, g, vgc, alat, &
|
subroutine plot_2d (nx, ny, m1, m2, x0, e1, e2, ngm, g, rhog, alat, &
|
||||||
at, nat, tau, atm, ityp, output_format, ounit)
|
at, nat, tau, atm, ityp, output_format, ounit)
|
||||||
!-----------------------------------------------------------------------
|
!-----------------------------------------------------------------------
|
||||||
!
|
!
|
||||||
|
@ -642,14 +634,15 @@ subroutine plot_2d (nx, ny, m1, m2, x0, e, ngm, g, vgc, alat, &
|
||||||
! output unit
|
! output unit
|
||||||
! output format
|
! output format
|
||||||
character(len=3) :: atm(*) ! atomic symbols
|
character(len=3) :: atm(*) ! atomic symbols
|
||||||
real(kind=DP) :: e(3,2), x0(3), m1, m2, g(3,ngm), alat, tau(3,nat), at(3,3)
|
real(kind=DP) :: e1(3), e2(3), x0(3), m1, m2, g(3,ngm), alat, &
|
||||||
|
tau(3,nat), at(3,3)
|
||||||
! vectors e1, e2 defining the plane
|
! vectors e1, e2 defining the plane
|
||||||
! origin
|
! origin
|
||||||
! modulus of e1
|
! modulus of e1
|
||||||
! modulus of e2
|
! modulus of e2
|
||||||
! G-vectors
|
! G-vectors
|
||||||
|
|
||||||
complex(kind=DP) :: vgc (ngm)
|
complex(kind=DP) :: rhog (ngm)
|
||||||
! rho or polarization in G space
|
! rho or polarization in G space
|
||||||
integer :: i, j, ig
|
integer :: i, j, ig
|
||||||
|
|
||||||
|
@ -679,16 +672,16 @@ subroutine plot_2d (nx, ny, m1, m2, x0, e, ngm, g, vgc, alat, &
|
||||||
!
|
!
|
||||||
do i = 1, nx
|
do i = 1, nx
|
||||||
eigx (i) = exp ( (0.d0, 1.d0) * 2.d0 * pi * ( (i - 1) * deltax * &
|
eigx (i) = exp ( (0.d0, 1.d0) * 2.d0 * pi * ( (i - 1) * deltax * &
|
||||||
(e(1,1) * g(1,ig) + e(2,1) * g(2,ig) + e(3,1) * g(3,ig) ) + &
|
(e1(1) * g(1,ig) + e1(2) * g(2,ig) + e1(3) * g(3,ig) ) + &
|
||||||
(x0 (1) * g(1,ig) + x0 (2) * g(2,ig) + x0 (3) * g(3,ig) ) ) )
|
(x0 (1) * g(1,ig) + x0 (2) * g(2,ig) + x0 (3) * g(3,ig) ) ) )
|
||||||
enddo
|
enddo
|
||||||
do j = 1, ny
|
do j = 1, ny
|
||||||
eigy (j) = exp ( (0.d0, 1.d0) * 2.d0 * pi * (j - 1) * deltay * &
|
eigy (j) = exp ( (0.d0, 1.d0) * 2.d0 * pi * (j - 1) * deltay * &
|
||||||
(e(1,2) * g(1,ig) + e(2,2) * g(2,ig) + e(3,2) * g(3,ig) ) )
|
(e2(1) * g(1,ig) + e2(2) * g(2,ig) + e2(3) * g(3,ig) ) )
|
||||||
enddo
|
enddo
|
||||||
do j = 1, ny
|
do j = 1, ny
|
||||||
do i = 1, nx
|
do i = 1, nx
|
||||||
carica (i, j) = carica (i, j) + vgc (ig) * eigx (i) * eigy (j)
|
carica (i, j) = carica (i, j) + rhog (ig) * eigx (i) * eigy (j)
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
|
@ -715,7 +708,7 @@ subroutine plot_2d (nx, ny, m1, m2, x0, e, ngm, g, vgc, alat, &
|
||||||
!
|
!
|
||||||
! and we print the charge on output
|
! and we print the charge on output
|
||||||
!
|
!
|
||||||
if (output_format.eq.0) then
|
if (output_format == 0) then
|
||||||
!
|
!
|
||||||
! gnuplot format
|
! gnuplot format
|
||||||
!
|
!
|
||||||
|
@ -724,13 +717,13 @@ subroutine plot_2d (nx, ny, m1, m2, x0, e, ngm, g, vgc, alat, &
|
||||||
write (ounit, '(e25.14)') ( DREAL(carica(i,j)), j = 1, ny )
|
write (ounit, '(e25.14)') ( DREAL(carica(i,j)), j = 1, ny )
|
||||||
write (ounit, * )
|
write (ounit, * )
|
||||||
enddo
|
enddo
|
||||||
elseif (output_format.eq.1) then
|
elseif (output_format == 1) then
|
||||||
!
|
!
|
||||||
! contour.x format
|
! contour.x format
|
||||||
!
|
!
|
||||||
write (ounit, '(3i5,2e25.14)') nx, ny, 1, deltax, deltay
|
write (ounit, '(3i5,2e25.14)') nx, ny, 1, deltax, deltay
|
||||||
write (ounit, '(4e25.14)') ( ( DREAL(carica(i,j)), j = 1, ny ), i = 1, nx )
|
write (ounit, '(4e25.14)') ( ( DREAL(carica(i,j)), j = 1, ny ), i = 1, nx )
|
||||||
elseif (output_format.eq.2) then
|
elseif (output_format == 2) then
|
||||||
!
|
!
|
||||||
! plotrho format
|
! plotrho format
|
||||||
!
|
!
|
||||||
|
@ -739,15 +732,15 @@ subroutine plot_2d (nx, ny, m1, m2, x0, e, ngm, g, vgc, alat, &
|
||||||
write (ounit, '(8f8.4)') (deltay * (j - 1) , j = 1, ny)
|
write (ounit, '(8f8.4)') (deltay * (j - 1) , j = 1, ny)
|
||||||
write (ounit, '(6e12.4)') ( ( DREAL(carica(i,j)), i = 1, nx ), j = 1, ny )
|
write (ounit, '(6e12.4)') ( ( DREAL(carica(i,j)), i = 1, nx ), j = 1, ny )
|
||||||
write (ounit, '(3f8.4)') x0
|
write (ounit, '(3f8.4)') x0
|
||||||
write (ounit, '(3f8.4)') (m1 * e (i, 1) , i = 1, 3)
|
write (ounit, '(3f8.4)') (m1 * e1 (i) , i = 1, 3)
|
||||||
write (ounit, '(3f8.4)') (m2 * e (i, 2) , i = 1, 3)
|
write (ounit, '(3f8.4)') (m2 * e2 (i) , i = 1, 3)
|
||||||
|
|
||||||
elseif (output_format.eq.3) then
|
elseif (output_format == 3) then
|
||||||
!
|
!
|
||||||
! XCRYSDEN's XSF format
|
! XCRYSDEN's XSF format
|
||||||
!
|
!
|
||||||
call xsf_struct (alat, at, nat, tau, atm, ityp, ounit)
|
call xsf_struct (alat, at, nat, tau, atm, ityp, ounit)
|
||||||
call xsf_datagrid_2d (carica, nx, ny, m1, m2, x0, e, alat, ounit)
|
call xsf_datagrid_2d (carica, nx, ny, m1, m2, x0, e1, e2, alat, ounit)
|
||||||
else
|
else
|
||||||
call errore('plot_2d', 'wrong output_format', 1)
|
call errore('plot_2d', 'wrong output_format', 1)
|
||||||
endif
|
endif
|
||||||
|
@ -759,7 +752,7 @@ subroutine plot_2d (nx, ny, m1, m2, x0, e, ngm, g, vgc, alat, &
|
||||||
end subroutine plot_2d
|
end subroutine plot_2d
|
||||||
!
|
!
|
||||||
!-----------------------------------------------------------------------
|
!-----------------------------------------------------------------------
|
||||||
subroutine plot_2ds (nx, ny, x0, ngm, g, vgc, output_format, ounit)
|
subroutine plot_2ds (nx, ny, x0, ngm, g, rhog, output_format, ounit)
|
||||||
!-----------------------------------------------------------------------
|
!-----------------------------------------------------------------------
|
||||||
use parameters, only : DP
|
use parameters, only : DP
|
||||||
!
|
!
|
||||||
|
@ -774,7 +767,7 @@ subroutine plot_2ds (nx, ny, x0, ngm, g, vgc, output_format, ounit)
|
||||||
! radius of the sphere
|
! radius of the sphere
|
||||||
! G-vectors
|
! G-vectors
|
||||||
|
|
||||||
complex(kind=DP) :: vgc (ngm)
|
complex(kind=DP) :: rhog (ngm)
|
||||||
! rho or polarization in G space
|
! rho or polarization in G space
|
||||||
integer :: i, j, ig
|
integer :: i, j, ig
|
||||||
|
|
||||||
|
@ -819,7 +812,7 @@ subroutine plot_2ds (nx, ny, x0, ngm, g, vgc, output_format, ounit)
|
||||||
do i = 1, nx
|
do i = 1, nx
|
||||||
eig = exp ( (0.d0,1.d0) * 2.d0 * pi * &
|
eig = exp ( (0.d0,1.d0) * 2.d0 * pi * &
|
||||||
( r(1,i,j)*g(1,ig) + r(2,i,j)*g(2,ig) + r(3,i,j)*g(3,ig) ) )
|
( r(1,i,j)*g(1,ig) + r(2,i,j)*g(2,ig) + r(3,i,j)*g(3,ig) ) )
|
||||||
carica (i, j) = carica (i, j) + vgc (ig) * eig
|
carica (i, j) = carica (i, j) + rhog (ig) * eig
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
|
@ -869,8 +862,8 @@ subroutine plot_2ds (nx, ny, x0, ngm, g, vgc, output_format, ounit)
|
||||||
end subroutine plot_2ds
|
end subroutine plot_2ds
|
||||||
!
|
!
|
||||||
!-----------------------------------------------------------------------
|
!-----------------------------------------------------------------------
|
||||||
subroutine plot_3d (alat, at, nat, tau, atm, ityp, ngm, g, vgc, &
|
subroutine plot_3d (alat, at, nat, tau, atm, ityp, ngm, g, rhog, &
|
||||||
nx, ny, nz, m1, m2, m3, x0, e, output_format, ounit, dipol)
|
nx, ny, nz, m1, m2, m3, x0, e1, e2, e3, output_format, ounit, dipol)
|
||||||
!-----------------------------------------------------------------------
|
!-----------------------------------------------------------------------
|
||||||
!
|
!
|
||||||
use parameters, only : DP
|
use parameters, only : DP
|
||||||
|
@ -884,8 +877,8 @@ subroutine plot_3d (alat, at, nat, tau, atm, ityp, ngm, g, vgc, &
|
||||||
! output unit
|
! output unit
|
||||||
character(len=3) :: atm(*)
|
character(len=3) :: atm(*)
|
||||||
|
|
||||||
real(kind=DP) :: alat, tau(3,nat), at(3,3), g(3,ngm), e(3,3), x0(3), &
|
real(kind=DP) :: alat, tau(3,nat), at(3,3), g(3,ngm), x0(3), &
|
||||||
m1, m2, m3, dipol(0:3)
|
e1(3), e2(3), e3(3), m1, m2, m3, dipol(0:3)
|
||||||
! lattice parameter
|
! lattice parameter
|
||||||
! atomic positions
|
! atomic positions
|
||||||
! lattice vectors
|
! lattice vectors
|
||||||
|
@ -894,7 +887,7 @@ subroutine plot_3d (alat, at, nat, tau, atm, ityp, ngm, g, vgc, &
|
||||||
! origin
|
! origin
|
||||||
! moduli of e1,e2,e3
|
! moduli of e1,e2,e3
|
||||||
|
|
||||||
complex(kind=DP) :: vgc (ngm)
|
complex(kind=DP) :: rhog (ngm)
|
||||||
! rho or polarization in G space
|
! rho or polarization in G space
|
||||||
integer :: i, j, k, ig
|
integer :: i, j, k, ig
|
||||||
|
|
||||||
|
@ -925,22 +918,22 @@ subroutine plot_3d (alat, at, nat, tau, atm, ityp, ngm, g, vgc, &
|
||||||
!
|
!
|
||||||
do i = 1, nx
|
do i = 1, nx
|
||||||
eigx (i) = exp( (0.d0,1.d0) * 2.d0 * pi * ( (i-1) * deltax * &
|
eigx (i) = exp( (0.d0,1.d0) * 2.d0 * pi * ( (i-1) * deltax * &
|
||||||
(e(1,1)*g(1,ig)+e(2,1)*g(2,ig)+e(3,1)*g(3,ig)) + &
|
(e1(1)*g(1,ig)+e1(2)*g(2,ig)+e1(3)*g(3,ig)) + &
|
||||||
( x0(1)*g(1,ig)+ x0(2)*g(2,ig)+ x0(3)*g(3,ig)) ) )
|
( x0(1)*g(1,ig)+ x0(2)*g(2,ig)+ x0(3)*g(3,ig)) ) )
|
||||||
enddo
|
enddo
|
||||||
do j = 1, ny
|
do j = 1, ny
|
||||||
eigy (j) = exp( (0.d0,1.d0) * 2.d0 * pi * (j-1) * deltay * &
|
eigy (j) = exp( (0.d0,1.d0) * 2.d0 * pi * (j-1) * deltay * &
|
||||||
(e(1,2)*g(1,ig)+e(2,2)*g(2,ig)+e(3,2)*g(3,ig)) )
|
(e2(1)*g(1,ig)+e2(2)*g(2,ig)+e2(3)*g(3,ig)) )
|
||||||
enddo
|
enddo
|
||||||
do k = 1, nz
|
do k = 1, nz
|
||||||
eigz (k) = exp( (0.d0,1.d0) * 2.d0 * pi * (k-1) * deltaz * &
|
eigz (k) = exp( (0.d0,1.d0) * 2.d0 * pi * (k-1) * deltaz * &
|
||||||
(e(1,3)*g(1,ig)+e(2,3)*g(2,ig)+e(3,3)*g(3,ig)) )
|
(e3(1)*g(1,ig)+e3(2)*g(2,ig)+e3(3)*g(3,ig)) )
|
||||||
enddo
|
enddo
|
||||||
do k = 1, nz
|
do k = 1, nz
|
||||||
do j = 1, ny
|
do j = 1, ny
|
||||||
do i = 1, nx
|
do i = 1, nx
|
||||||
carica (i, j, k) = carica (i, j, k) + &
|
carica (i, j, k) = carica (i, j, k) + &
|
||||||
DREAL (vgc (ig) * eigz (k) * eigy (j) * eigx (i) )
|
DREAL (rhog (ig) * eigz (k) * eigy (j) * eigx (i) )
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
|
@ -960,9 +953,9 @@ subroutine plot_3d (alat, at, nat, tau, atm, ityp, ngm, g, vgc, &
|
||||||
do j = 1, ny
|
do j = 1, ny
|
||||||
do i = 1, nx
|
do i = 1, nx
|
||||||
do ipol=1,3
|
do ipol=1,3
|
||||||
r(ipol)=x0(ipol)+(i-1)*e(ipol,1)*deltax + &
|
r(ipol)=x0(ipol)+(i-1)*e1(ipol)*deltax + &
|
||||||
(j-1)*e(ipol,2)*deltay + &
|
(j-1)*e2(ipol)*deltay + &
|
||||||
(k-1)*e(ipol,3)*deltaz
|
(k-1)*e3(ipol)*deltaz
|
||||||
enddo
|
enddo
|
||||||
fact(i,j,k)=wsweight(r,rws,nrws)
|
fact(i,j,k)=wsweight(r,rws,nrws)
|
||||||
suma=suma+fact(i,j,k)
|
suma=suma+fact(i,j,k)
|
||||||
|
@ -986,9 +979,9 @@ subroutine plot_3d (alat, at, nat, tau, atm, ityp, ngm, g, vgc, &
|
||||||
rhoabs = rhoabs + abs (carica (i, j, k) )
|
rhoabs = rhoabs + abs (carica (i, j, k) )
|
||||||
dipol(0) = dipol(0) + fact(i,j,k)*carica (i, j, k)
|
dipol(0) = dipol(0) + fact(i,j,k)*carica (i, j, k)
|
||||||
do ipol=1,3
|
do ipol=1,3
|
||||||
rijk=x0(ipol)+(i-1)*e(ipol,1)*deltax + &
|
rijk=x0(ipol)+(i-1)*e1(ipol)*deltax + &
|
||||||
(j-1)*e(ipol,2)*deltay + &
|
(j-1)*e2(ipol)*deltay + &
|
||||||
(k-1)*e(ipol,3)*deltaz
|
(k-1)*e3(ipol)*deltaz
|
||||||
dipol(ipol)=dipol(ipol)+fact(i,j,k)*rijk*carica(i,j,k)
|
dipol(ipol)=dipol(ipol)+fact(i,j,k)*rijk*carica(i,j,k)
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
|
@ -1003,7 +996,7 @@ subroutine plot_3d (alat, at, nat, tau, atm, ityp, ngm, g, vgc, &
|
||||||
print '(/5x,"Min, Max, Total, Abs charge: ",4f10.6)', rhomin, rhomax, &
|
print '(/5x,"Min, Max, Total, Abs charge: ",4f10.6)', rhomin, rhomax, &
|
||||||
rhotot, rhoabs
|
rhotot, rhoabs
|
||||||
|
|
||||||
if (output_format.eq.4) then
|
if (output_format == 4) then
|
||||||
!
|
!
|
||||||
! "gOpenMol" file
|
! "gOpenMol" file
|
||||||
!
|
!
|
||||||
|
@ -1018,7 +1011,8 @@ subroutine plot_3d (alat, at, nat, tau, atm, ityp, ngm, g, vgc, &
|
||||||
! XCRYSDEN's XSF format
|
! XCRYSDEN's XSF format
|
||||||
!
|
!
|
||||||
call xsf_struct (alat, at, nat, tau, atm, ityp, ounit)
|
call xsf_struct (alat, at, nat, tau, atm, ityp, ounit)
|
||||||
call xsf_datagrid_3d (carica, nx, ny, nz, m1, m2, m3, x0, e, alat, ounit)
|
call xsf_datagrid_3d &
|
||||||
|
(carica, nx, ny, nz, m1, m2, m3, x0, e1, e2, e3, alat, ounit)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
deallocate (carica)
|
deallocate (carica)
|
||||||
|
@ -1033,7 +1027,7 @@ end subroutine plot_3d
|
||||||
!-----------------------------------------------------------------------
|
!-----------------------------------------------------------------------
|
||||||
subroutine plot_fast (alat, at, nat, tau, atm, ityp,&
|
subroutine plot_fast (alat, at, nat, tau, atm, ityp,&
|
||||||
nrx1, nrx2, nrx3, nr1, nr2, nr3, rho, &
|
nrx1, nrx2, nrx3, nr1, nr2, nr3, rho, &
|
||||||
bg, m1, m2, m3, x0, e, output_format, ounit, dipol)
|
bg, m1, m2, m3, x0, e1, e2, e3, output_format, ounit, dipol)
|
||||||
!-----------------------------------------------------------------------
|
!-----------------------------------------------------------------------
|
||||||
!
|
!
|
||||||
use parameters, only : DP
|
use parameters, only : DP
|
||||||
|
@ -1042,8 +1036,8 @@ subroutine plot_fast (alat, at, nat, tau, atm, ityp,&
|
||||||
output_format, ounit
|
output_format, ounit
|
||||||
character(len=3) :: atm(*)
|
character(len=3) :: atm(*)
|
||||||
|
|
||||||
real(kind=DP) :: alat, tau (3, nat), at (3, 3), rho(2, nrx1,nrx2,nrx3), &
|
real(kind=DP) :: alat, tau (3, nat), at (3, 3), rho(nrx1,nrx2,nrx3), &
|
||||||
bg (3, 3), e (3, 3), x0 (3), m1, m2, m3, dipol(0:3)
|
bg (3, 3), e1(3), e2(3), e3(3), x0 (3), m1, m2, m3, dipol(0:3)
|
||||||
|
|
||||||
integer :: nx, ny, nz, nx0, ny0, nz0, nx1, ny1, nz1, i, j, k, i1, j1, k1
|
integer :: nx, ny, nz, nx0, ny0, nz0, nx1, ny1, nz1, i, j, k, i1, j1, k1
|
||||||
real(kind=DP) :: rhomin, rhomax, rhotot, rhoabs
|
real(kind=DP) :: rhomin, rhomax, rhotot, rhoabs
|
||||||
|
@ -1059,9 +1053,9 @@ subroutine plot_fast (alat, at, nat, tau, atm, ityp,&
|
||||||
ny0 = nint ( x0(1)*bg(1,2)*nr2 + x0(2)*bg(2,2)*nr2 + x0(3)*bg(3,2)*nr2 ) + 1
|
ny0 = nint ( x0(1)*bg(1,2)*nr2 + x0(2)*bg(2,2)*nr2 + x0(3)*bg(3,2)*nr2 ) + 1
|
||||||
nz0 = nint ( x0(1)*bg(1,3)*nr3 + x0(2)*bg(2,3)*nr3 + x0(3)*bg(3,3)*nr3 ) + 1
|
nz0 = nint ( x0(1)*bg(1,3)*nr3 + x0(2)*bg(2,3)*nr3 + x0(3)*bg(3,3)*nr3 ) + 1
|
||||||
!
|
!
|
||||||
if ( e(2,1) .ne. 0.d0 .or. e(3,1) .ne. 0.d0 .or. &
|
if ( e1(2) .ne. 0.d0 .or. e1(3) .ne. 0.d0 .or. &
|
||||||
e(1,2) .ne. 0.d0 .or. e(3,2) .ne. 0.d0 .or. &
|
e2(1) .ne. 0.d0 .or. e2(3) .ne. 0.d0 .or. &
|
||||||
e(1,3) .ne. 0.d0 .or. e(2,3) .ne. 0.d0 ) &
|
e3(1) .ne. 0.d0 .or. e3(2) .ne. 0.d0 ) &
|
||||||
call errore ('plot_fast','need vectors along x,y,z',1)
|
call errore ('plot_fast','need vectors along x,y,z',1)
|
||||||
|
|
||||||
! find FFT grid points closer to X0 + e1, X0 + e2, X0 + e3
|
! find FFT grid points closer to X0 + e1, X0 + e2, X0 + e3
|
||||||
|
@ -1088,7 +1082,7 @@ subroutine plot_fast (alat, at, nat, tau, atm, ityp,&
|
||||||
do i = nx0, nx1
|
do i = nx0, nx1
|
||||||
i1 = mod(i-1,nr1)+1
|
i1 = mod(i-1,nr1)+1
|
||||||
if (i1.le.0) i1 = i1 + nr1
|
if (i1.le.0) i1 = i1 + nr1
|
||||||
carica (i-nx0+1, j-ny0+1, k-nz0+1) = rho(1, i1, j1, k1)
|
carica (i-nx0+1, j-ny0+1, k-nz0+1) = rho(i1, j1, k1)
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
|
@ -1128,9 +1122,9 @@ subroutine plot_fast (alat, at, nat, tau, atm, ityp,&
|
||||||
do j = 1, ny
|
do j = 1, ny
|
||||||
do i = 1, nx
|
do i = 1, nx
|
||||||
do ipol=1,3
|
do ipol=1,3
|
||||||
r(ipol)=x0(ipol)+(i-1)*e(ipol,1)*deltax + &
|
r(ipol)=x0(ipol)+(i-1)*e1(ipol)*deltax + &
|
||||||
(j-1)*e(ipol,2)*deltay + &
|
(j-1)*e2(ipol)*deltay + &
|
||||||
(k-1)*e(ipol,3)*deltaz
|
(k-1)*e3(ipol)*deltaz
|
||||||
enddo
|
enddo
|
||||||
fact(i,j,k)=wsweight(r,rws,nrws)
|
fact(i,j,k)=wsweight(r,rws,nrws)
|
||||||
suma=suma+fact(i,j,k)
|
suma=suma+fact(i,j,k)
|
||||||
|
@ -1154,9 +1148,9 @@ subroutine plot_fast (alat, at, nat, tau, atm, ityp,&
|
||||||
rhoabs = rhoabs + abs (carica (i, j, k) )
|
rhoabs = rhoabs + abs (carica (i, j, k) )
|
||||||
dipol(0) = dipol(0) + fact(i,j,k)*carica (i, j, k)
|
dipol(0) = dipol(0) + fact(i,j,k)*carica (i, j, k)
|
||||||
do ipol=1,3
|
do ipol=1,3
|
||||||
rijk=x0(ipol)+(i-1)*e(ipol,1)*deltax + &
|
rijk=x0(ipol)+(i-1)*e1(ipol)*deltax + &
|
||||||
(j-1)*e(ipol,2)*deltay + &
|
(j-1)*e2(ipol)*deltay + &
|
||||||
(k-1)*e(ipol,3)*deltaz
|
(k-1)*e3(ipol)*deltaz
|
||||||
dipol(ipol)=dipol(ipol)+fact(i,j,k)*rijk*carica(i,j,k)
|
dipol(ipol)=dipol(ipol)+fact(i,j,k)*rijk*carica(i,j,k)
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
|
@ -1167,7 +1161,7 @@ subroutine plot_fast (alat, at, nat, tau, atm, ityp,&
|
||||||
rhoabs = rhoabs / (nx-1) / (ny-1) / (nz-1) * m1 * m2 * m3 * alat**3
|
rhoabs = rhoabs / (nx-1) / (ny-1) / (nz-1) * m1 * m2 * m3 * alat**3
|
||||||
dipol(0) = dipol(0) / suma * omega
|
dipol(0) = dipol(0) / suma * omega
|
||||||
|
|
||||||
if (omega.gt.m1*m2*m3*alat**3) &
|
if (omega > m1*m2*m3*alat**3) &
|
||||||
write(6,*) 'Warning: the box is too small to calculate dipole'
|
write(6,*) 'Warning: the box is too small to calculate dipole'
|
||||||
|
|
||||||
print '(/5x,"Min, Max, Total, Abs charge: ",4f10.6)', rhomin, &
|
print '(/5x,"Min, Max, Total, Abs charge: ",4f10.6)', rhomin, &
|
||||||
|
@ -1177,7 +1171,7 @@ subroutine plot_fast (alat, at, nat, tau, atm, ityp,&
|
||||||
dipol(ipol)=dipol(ipol) / suma *omega*alat
|
dipol(ipol)=dipol(ipol) / suma *omega*alat
|
||||||
enddo
|
enddo
|
||||||
|
|
||||||
if (output_format.eq.4) then
|
if (output_format == 4) then
|
||||||
!
|
!
|
||||||
! "gopenmol" file
|
! "gopenmol" file
|
||||||
!
|
!
|
||||||
|
@ -1188,7 +1182,8 @@ subroutine plot_fast (alat, at, nat, tau, atm, ityp,&
|
||||||
! write XSF format
|
! write XSF format
|
||||||
!
|
!
|
||||||
call xsf_struct (alat, at, nat, tau, atm, ityp, ounit)
|
call xsf_struct (alat, at, nat, tau, atm, ityp, ounit)
|
||||||
call xsf_datagrid_3d (carica, nx, ny, nz, m1, m2, m3, x0, e, alat, ounit)
|
call xsf_datagrid_3d (carica, nx, ny, nz, m1, m2, m3, x0, &
|
||||||
|
e1, e2, e3, alat, ounit)
|
||||||
endif
|
endif
|
||||||
!
|
!
|
||||||
deallocate (carica)
|
deallocate (carica)
|
||||||
|
|
27
PP/xsf.f90
27
PP/xsf.f90
|
@ -54,7 +54,7 @@ subroutine xsf_fast_datagrid_3d &
|
||||||
use parameters, only : DP
|
use parameters, only : DP
|
||||||
implicit none
|
implicit none
|
||||||
integer :: nrx1, nrx2, nrx3, nr1, nr2, nr3, ounit
|
integer :: nrx1, nrx2, nrx3, nr1, nr2, nr3, ounit
|
||||||
real(kind=DP) :: alat, at (3, 3), rho(2,nrx1,nrx2,nrx3)
|
real(kind=DP) :: alat, at (3, 3), rho(nrx1,nrx2,nrx3)
|
||||||
! --
|
! --
|
||||||
integer :: i1, i2, i3, ix, iy, iz, count, i, ii, &
|
integer :: i1, i2, i3, ix, iy, iz, count, i, ii, &
|
||||||
ind_x(10), ind_y(10),ind_z(10)
|
ind_x(10), ind_y(10),ind_z(10)
|
||||||
|
@ -94,7 +94,7 @@ subroutine xsf_fast_datagrid_3d &
|
||||||
!ind(count) = ii
|
!ind(count) = ii
|
||||||
else
|
else
|
||||||
write(ounit,'(6e13.5)') &
|
write(ounit,'(6e13.5)') &
|
||||||
(rho(1,ind_x(i),ind_y(i),ind_z(i)),i=1,6)
|
(rho(ind_x(i),ind_y(i),ind_z(i)),i=1,6)
|
||||||
count=1
|
count=1
|
||||||
!ind(count) = ii
|
!ind(count) = ii
|
||||||
endif
|
endif
|
||||||
|
@ -104,7 +104,7 @@ subroutine xsf_fast_datagrid_3d &
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
enddo
|
enddo
|
||||||
write(ounit,'(6e13.5:)') (rho(1,ind_x(i),ind_y(i),ind_z(i)),i=1,count)
|
write(ounit,'(6e13.5:)') (rho(ind_x(i),ind_y(i),ind_z(i)),i=1,count)
|
||||||
write(ounit,'(a)') 'END_DATAGRID_3D'
|
write(ounit,'(a)') 'END_DATAGRID_3D'
|
||||||
write(ounit,'(a)') 'END_BLOCK_DATAGRID_3D'
|
write(ounit,'(a)') 'END_BLOCK_DATAGRID_3D'
|
||||||
return
|
return
|
||||||
|
@ -113,11 +113,11 @@ end subroutine xsf_fast_datagrid_3d
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
subroutine xsf_datagrid_2d (rho, nx, ny, m1, m2, x0, e, alat, ounit)
|
subroutine xsf_datagrid_2d (rho, nx, ny, m1, m2, x0, e1, e2, alat, ounit)
|
||||||
use parameters, only : DP
|
use parameters, only : DP
|
||||||
implicit none
|
implicit none
|
||||||
integer :: nx, ny, ounit
|
integer :: nx, ny, ounit
|
||||||
real(kind=DP) :: m1, m2, alat, x0(3), e(3,2), rho(2, nx, ny)
|
real(kind=DP) :: m1, m2, alat, x0(3), e1(3), e2(3), rho(2, nx, ny)
|
||||||
! --
|
! --
|
||||||
integer :: ix, iy, count, i, ind_x(10), ind_y(10)
|
integer :: ix, iy, count, i, ind_x(10), ind_y(10)
|
||||||
|
|
||||||
|
@ -131,14 +131,14 @@ subroutine xsf_datagrid_2d (rho, nx, ny, m1, m2, x0, e, alat, ounit)
|
||||||
! origin
|
! origin
|
||||||
write(ounit,'(3f10.6)') (0.529177d0*alat*x0(i),i=1,3) ! in ANSTROMS
|
write(ounit,'(3f10.6)') (0.529177d0*alat*x0(i),i=1,3) ! in ANSTROMS
|
||||||
! 1st spanning (=lattice) vector
|
! 1st spanning (=lattice) vector
|
||||||
write(ounit,'(3f10.6)') (0.529177d0*alat*e(i,1)*m1,i=1,3) ! in ANSTROMS
|
write(ounit,'(3f10.6)') (0.529177d0*alat*e1(i)*m1,i=1,3) ! in ANSTROMS
|
||||||
! 2nd spanning (=lattice) vector
|
! 2nd spanning (=lattice) vector
|
||||||
write(ounit,'(3f10.6)') (0.529177d0*alat*e(i,2)*m2,i=1,3) ! in ANSTROMS
|
write(ounit,'(3f10.6)') (0.529177d0*alat*e2(i)*m2,i=1,3) ! in ANSTROMS
|
||||||
|
|
||||||
count=0
|
count=0
|
||||||
do iy=1,ny
|
do iy=1,ny
|
||||||
do ix=1,nx
|
do ix=1,nx
|
||||||
if (count.lt.6) then
|
if (count < 6) then
|
||||||
count = count + 1
|
count = count + 1
|
||||||
else
|
else
|
||||||
write(ounit,'(6e13.5)') (rho(1,ind_x(i),ind_y(i)),i=1,6)
|
write(ounit,'(6e13.5)') (rho(1,ind_x(i),ind_y(i)),i=1,6)
|
||||||
|
@ -157,11 +157,12 @@ end subroutine xsf_datagrid_2d
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
subroutine xsf_datagrid_3d (rho, nx, ny, nz, m1, m2, m3, x0, e, alat, ounit)
|
subroutine xsf_datagrid_3d &
|
||||||
|
(rho, nx, ny, nz, m1, m2, m3, x0, e1, e2, e3, alat, ounit)
|
||||||
use parameters, only : DP
|
use parameters, only : DP
|
||||||
implicit none
|
implicit none
|
||||||
integer :: nx, ny, nz, ounit
|
integer :: nx, ny, nz, ounit
|
||||||
real(kind=DP) :: m1, m2, m3, alat, x0(3), e(3,3), rho(nx, ny, nz)
|
real(kind=DP) :: m1, m2, m3, alat, x0(3), e1(3),e2(3),e3(3), rho(nx, ny, nz)
|
||||||
! --
|
! --
|
||||||
integer :: ix, iy, iz, count, i, ind_x(10), ind_y(10), ind_z(10)
|
integer :: ix, iy, iz, count, i, ind_x(10), ind_y(10), ind_z(10)
|
||||||
|
|
||||||
|
@ -175,11 +176,11 @@ subroutine xsf_datagrid_3d (rho, nx, ny, nz, m1, m2, m3, x0, e, alat, ounit)
|
||||||
! origin
|
! origin
|
||||||
write(ounit,'(3f10.6)') (0.529177d0*alat*x0(i),i=1,3) ! in ANSTROMS
|
write(ounit,'(3f10.6)') (0.529177d0*alat*x0(i),i=1,3) ! in ANSTROMS
|
||||||
! 1st spanning (=lattice) vector
|
! 1st spanning (=lattice) vector
|
||||||
write(ounit,'(3f10.6)') (0.529177d0*alat*e(i,1)*m1,i=1,3) ! in ANSTROMS
|
write(ounit,'(3f10.6)') (0.529177d0*alat*e1(i)*m1,i=1,3) ! in ANSTROMS
|
||||||
! 2nd spanning (=lattice) vector
|
! 2nd spanning (=lattice) vector
|
||||||
write(ounit,'(3f10.6)') (0.529177d0*alat*e(i,2)*m2,i=1,3) ! in ANSTROMS
|
write(ounit,'(3f10.6)') (0.529177d0*alat*e2(i)*m2,i=1,3) ! in ANSTROMS
|
||||||
! 3rd spanning (=lattice) vector
|
! 3rd spanning (=lattice) vector
|
||||||
write(ounit,'(3f10.6)') (0.529177d0*alat*e(i,3)*m3,i=1,3)
|
write(ounit,'(3f10.6)') (0.529177d0*alat*e3(i)*m3,i=1,3)
|
||||||
|
|
||||||
count=0
|
count=0
|
||||||
do iz=1,nz
|
do iz=1,nz
|
||||||
|
|
12
TODO
12
TODO
|
@ -1,8 +1,9 @@
|
||||||
TODO LIST - 24 Apr 2003
|
TODO LIST - 8 May 2003
|
||||||
|
|
||||||
INSTALLATION
|
INSTALLATION
|
||||||
|
|
||||||
- compile fftw by default for PW and CP as well
|
- compile fftw by default for PW and CP as well
|
||||||
|
(a che serve FFTW_INC_DIR ?)
|
||||||
|
|
||||||
COMMON
|
COMMON
|
||||||
|
|
||||||
|
@ -27,6 +28,8 @@ COMMON
|
||||||
|
|
||||||
PW
|
PW
|
||||||
|
|
||||||
|
- replace "use pwcom" into more "use" statement
|
||||||
|
|
||||||
- add traceback in error (error_handler module)
|
- add traceback in error (error_handler module)
|
||||||
|
|
||||||
- bfgs, md : atomic positions should be written in the same
|
- bfgs, md : atomic positions should be written in the same
|
||||||
|
@ -84,17 +87,18 @@ PH
|
||||||
|
|
||||||
DOCUMENTATION
|
DOCUMENTATION
|
||||||
|
|
||||||
- expand, update, verify, etc
|
|
||||||
|
|
||||||
- examples for many features are missing
|
- examples for many features are missing
|
||||||
examples should be quicker and easier to verify
|
examples should be quicker and easier to verify
|
||||||
|
|
||||||
- add a list of FAQ, or AAQ (Already Answered Questions)
|
- expand and update the manual; add a list of FAQ, or of already
|
||||||
|
answered questions
|
||||||
|
|
||||||
- add a developer's guide
|
- add a developer's guide
|
||||||
|
|
||||||
CPV:
|
CPV:
|
||||||
|
|
||||||
|
- Documentation close to non-existing. Document how to do empty states.
|
||||||
|
|
||||||
- find reason for differences in empty states between CP and PW
|
- find reason for differences in empty states between CP and PW
|
||||||
with ultrasoft pps and box grids. If it is a bug, it is serious.
|
with ultrasoft pps and box grids. If it is a bug, it is serious.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue