mirror of https://gitlab.com/QEF/q-e.git
141 lines
4.1 KiB
Fortran
141 lines
4.1 KiB
Fortran
!
|
|
! Copyright (C) 2010 Quantum ESPRESSO group
|
|
! This file is distributed under the terms of the
|
|
! GNU General Public License. See the file `License'
|
|
! in the root directory of the present distribution,
|
|
! or http://www.gnu.org/copyleft/gpl.txt .
|
|
!
|
|
MODULE ev_xml
|
|
!
|
|
! This module contains routines to write the information obtained by the
|
|
! ev.x program in an xml file.
|
|
!
|
|
USE iotk_module
|
|
!
|
|
USE kinds, ONLY : DP
|
|
USE io_global, ONLY : ionode, ionode_id
|
|
USE mp_global, ONLY : intra_image_comm
|
|
USE mp, ONLY : mp_bcast
|
|
|
|
IMPLICIT NONE
|
|
!
|
|
SAVE
|
|
!
|
|
PRIVATE
|
|
!
|
|
PUBLIC :: write_evdata_xml
|
|
|
|
INTEGER :: iunout
|
|
!
|
|
|
|
CONTAINS
|
|
!-----------------------------------------------------------------------
|
|
SUBROUTINE write_evdata_xml &
|
|
(npt,fac,v0,etot,efit,istat,par,npar,emin,chisq,filout)
|
|
!-----------------------------------------------------------------------
|
|
!
|
|
USE constants, ONLY : ry_kbar, bohr_radius_angs
|
|
IMPLICIT NONE
|
|
INTEGER, INTENT(in) :: npt, istat, npar
|
|
REAL(DP), INTENT(in):: v0(npt), etot(npt), efit(npt), emin, chisq, fac
|
|
REAL(DP), INTENT(in):: par(npar)
|
|
CHARACTER(len=256), INTENT(IN) :: filout
|
|
!
|
|
REAL(DP) :: p(npt), volume(2), a0(2), alldata(6,npt)
|
|
INTEGER :: i, ierr
|
|
CHARACTER(len=256) :: filename
|
|
REAL(DP), EXTERNAL :: birch, keane
|
|
|
|
IF (filout/=' ') THEN
|
|
filename = TRIM(filout) // '.xml'
|
|
ELSE
|
|
filename = 'ev.xml'
|
|
ENDIF
|
|
|
|
IF ( ionode ) THEN
|
|
!
|
|
CALL iotk_free_unit( iunout, ierr )
|
|
!
|
|
END IF
|
|
!
|
|
CALL mp_bcast( ierr, ionode_id, intra_image_comm )
|
|
!
|
|
CALL errore( 'write_evdata_xml', 'no free units to write ', ierr )
|
|
!
|
|
IF ( ionode ) THEN
|
|
!
|
|
! ... open XML descriptor
|
|
!
|
|
ierr=0
|
|
CALL iotk_open_write( iunout, FILE = TRIM( filename ), &
|
|
BINARY = .FALSE., IERR = ierr )
|
|
ENDIF
|
|
CALL mp_bcast( ierr, ionode_id, intra_image_comm )
|
|
|
|
CALL errore( 'write_evdata_xml', 'error opening the xml file ', ierr )
|
|
|
|
IF (ionode) THEN
|
|
CALL iotk_write_begin(iunout, "EQUATIONS_OF_STATE" )
|
|
IF (istat==1) THEN
|
|
CALL iotk_write_dat(iunout, "EQUATION_TYPE", "Birch 1st order")
|
|
ELSEIF (istat==2) THEN
|
|
CALL iotk_write_dat(iunout, "EQUATION_TYPE", "Birch 2nd order")
|
|
ELSEIF (istat==3) THEN
|
|
CALL iotk_write_dat(iunout, "EQUATION_TYPE", "Keane")
|
|
ELSEIF (istat==4) THEN
|
|
CALL iotk_write_dat(iunout, "EQUATION_TYPE", "Murnaghan")
|
|
ENDIF
|
|
CALL iotk_write_dat(iunout, "CHI_SQUARE", chisq)
|
|
CALL iotk_write_end(iunout, "EQUATIONS_OF_STATE" )
|
|
|
|
IF (istat==1 .or. istat==2) THEN
|
|
DO i=1,npt
|
|
p(i)=birch(v0(i)/par(1),par(2),par(3),par(4))
|
|
ENDDO
|
|
ELSE
|
|
DO i=1,npt
|
|
p(i)=keane(v0(i)/par(1),par(2),par(3),par(4))
|
|
ENDDO
|
|
ENDIF
|
|
|
|
DO i=1,npt
|
|
alldata (1,i) = v0(i)
|
|
alldata (2,i) = etot(i)
|
|
alldata (3,i) = efit(i)
|
|
alldata (4,i) = etot(i) - efit(i)
|
|
alldata (5,i) = p(i)
|
|
alldata (6,i) = etot(i) + p(i) * v0(i) / ry_kbar
|
|
ENDDO
|
|
|
|
CALL iotk_write_begin(iunout, "EQUATIONS_PARAMETERS" )
|
|
|
|
volume(1)=par(1)
|
|
volume(2)=par(1)*bohr_radius_angs**3
|
|
CALL iotk_write_dat(iunout, "EQUILIBRIUM_VOLUME_AU_A", volume(:), COLUMNS=2 )
|
|
CALL iotk_write_dat(iunout, "BULK_MODULUS_KBAR", par(2))
|
|
CALL iotk_write_dat(iunout, "DERIVATIVE_BULK_MODULUS", par(3))
|
|
CALL iotk_write_dat(iunout, "SECOND_DERIVATIVE_BULK_MODULUS", par(4))
|
|
CALL iotk_write_dat(iunout, "MINIMUM_ENERGY_RY", emin)
|
|
CALL iotk_write_dat(iunout, "CELL_FACTOR", fac)
|
|
IF (fac /= 0.0_DP) THEN
|
|
a0(1) = (par(1)/fac)**(1d0/3d0)
|
|
a0(2) = (par(1)/fac)**(1d0/3d0) * bohr_radius_angs
|
|
CALL iotk_write_dat(iunout, "CELL_PARAMETER_AU_A", a0, COLUMNS=2 )
|
|
ENDIF
|
|
CALL iotk_write_end(iunout, "EQUATIONS_PARAMETERS" )
|
|
|
|
CALL iotk_write_begin(iunout, "FIT_CHECK" )
|
|
CALL iotk_write_dat(iunout, "NUMBER_OF_DATA", npt )
|
|
CALL iotk_write_dat(iunout, "VOL_ENE_EFIT_DELTA_P_GIBBS", &
|
|
alldata(:,:), COLUMNS=6 )
|
|
|
|
CALL iotk_write_end(iunout, "FIT_CHECK" )
|
|
CALL iotk_close_write( iunout )
|
|
ENDIF
|
|
|
|
RETURN
|
|
END SUBROUTINE write_evdata_xml
|
|
!
|
|
END MODULE ev_xml
|
|
|