Added gate_setting element to xml input schema.

Variables to select and set the gate screening method have been added to
input element of qe. Routines for reading and writing it have been
added.
This commit is contained in:
Pietro Delugas 2018-04-10 18:18:40 +02:00
parent 680e1a7277
commit a88ae19956
3 changed files with 458 additions and 7 deletions

View File

@ -71,6 +71,7 @@ MODULE qes_read_module
MODULE PROCEDURE qes_read_ekin_functional
MODULE PROCEDURE qes_read_spin_constraints
MODULE PROCEDURE qes_read_electric_field
MODULE PROCEDURE qes_read_gate_settings
MODULE PROCEDURE qes_read_atomic_constraints
MODULE PROCEDURE qes_read_atomic_constraint
MODULE PROCEDURE qes_read_inputOccupations
@ -82,6 +83,7 @@ MODULE qes_read_module
MODULE PROCEDURE qes_read_ionicPolarization
MODULE PROCEDURE qes_read_electronicPolarization
MODULE PROCEDURE qes_read_phase
MODULE PROCEDURE qes_read_gateInfo
MODULE PROCEDURE qes_read_convergence_info
MODULE PROCEDURE qes_read_scf_conv
MODULE PROCEDURE qes_read_opt_conv
@ -2147,6 +2149,26 @@ MODULE qes_read_module
obj%wyckoff_positions_ispresent = .FALSE.
END IF
!
tmp_node_list => getElementsByTagname(xml_node, "crystal_positions")
tmp_node_list_size = getLength(tmp_node_list)
!
IF (tmp_node_list_size > 1) THEN
IF (PRESENT(ierr) ) THEN
CALL infomsg("qes_read:atomic_structureType","crystal_positions: too many occurrences")
ierr = ierr + 1
ELSE
CALL errore("qes_read:atomic_structureType","crystal_positions: too many occurrences",10)
END IF
END IF
!
IF (tmp_node_list_size>0) THEN
obj%crystal_positions_ispresent = .TRUE.
tmp_node => item(tmp_node_list, 0)
CALL qes_read_atomic_positions(tmp_node, obj%crystal_positions, ierr )
ELSE
obj%crystal_positions_ispresent = .FALSE.
END IF
!
tmp_node_list => getElementsByTagname(xml_node, "cell")
tmp_node_list_size = getLength(tmp_node_list)
!
@ -6408,6 +6430,26 @@ MODULE qes_read_module
obj%dipole_correction_ispresent = .FALSE.
END IF
!
tmp_node_list => getElementsByTagname(xml_node, "gate_correction")
tmp_node_list_size = getLength(tmp_node_list)
!
IF (tmp_node_list_size > 1) THEN
IF (PRESENT(ierr) ) THEN
CALL infomsg("qes_read:electric_fieldType","gate_correction: too many occurrences")
ierr = ierr + 1
ELSE
CALL errore("qes_read:electric_fieldType","gate_correction: too many occurrences",10)
END IF
END IF
!
IF (tmp_node_list_size>0) THEN
obj%gate_correction_ispresent = .TRUE.
tmp_node => item(tmp_node_list, 0)
CALL qes_read_gate_settings(tmp_node, obj%gate_correction, ierr )
ELSE
obj%gate_correction_ispresent = .FALSE.
END IF
!
tmp_node_list => getElementsByTagname(xml_node, "electric_field_direction")
tmp_node_list_size = getLength(tmp_node_list)
!
@ -6610,6 +6652,220 @@ MODULE qes_read_module
END SUBROUTINE qes_read_electric_field
!
!
SUBROUTINE qes_read_gate_settings(xml_node, obj, ierr )
!
IMPLICIT NONE
!
TYPE(Node), INTENT(IN), POINTER :: xml_node
TYPE(gate_settings_type), INTENT(OUT) :: obj
INTEGER, OPTIONAL, INTENT(OUT) :: ierr
!
TYPE(Node), POINTER :: tmp_node
TYPE(NodeList), POINTER :: tmp_node_list
INTEGER :: tmp_node_list_size, index, iostat_
!
obj%tagname = getTagName(xml_node)
!
!
!
tmp_node_list => getElementsByTagname(xml_node, "use_gate")
tmp_node_list_size = getLength(tmp_node_list)
!
IF (tmp_node_list_size /= 1) THEN
IF (PRESENT(ierr) ) THEN
CALL infomsg("qes_read:gate_settingsType","use_gate: wrong number of occurrences")
ierr = ierr + 1
ELSE
CALL errore("qes_read:gate_settingsType","use_gate: wrong number of occurrences",10)
END IF
END IF
!
tmp_node => item(tmp_node_list, 0)
IF (ASSOCIATED(tmp_node))&
CALL extractDataContent(tmp_node, obj%use_gate, IOSTAT = iostat_ )
IF ( iostat_ /= 0 ) THEN
IF ( PRESENT (ierr ) ) THEN
CALL infomsg("qes_read:gate_settingsType","error reading use_gate")
ierr = ierr + 1
ELSE
CALL errore ("qes_read:gate_settingsType","error reading use_gate",10)
END IF
END IF
!
tmp_node_list => getElementsByTagname(xml_node, "zgate")
tmp_node_list_size = getLength(tmp_node_list)
!
IF (tmp_node_list_size > 1) THEN
IF (PRESENT(ierr) ) THEN
CALL infomsg("qes_read:gate_settingsType","zgate: too many occurrences")
ierr = ierr + 1
ELSE
CALL errore("qes_read:gate_settingsType","zgate: too many occurrences",10)
END IF
END IF
!
IF (tmp_node_list_size>0) THEN
obj%zgate_ispresent = .TRUE.
tmp_node => item(tmp_node_list, 0)
CALL extractDataContent(tmp_node, obj%zgate , IOSTAT = iostat_)
IF ( iostat_ /= 0 ) THEN
IF ( PRESENT (ierr ) ) THEN
CALL infomsg("qes_read:gate_settingsType","error reading zgate")
ierr = ierr + 1
ELSE
CALL errore ("qes_read:gate_settingsType","error reading zgate",10)
END IF
END IF
ELSE
obj%zgate_ispresent = .FALSE.
END IF
!
tmp_node_list => getElementsByTagname(xml_node, "relaxz")
tmp_node_list_size = getLength(tmp_node_list)
!
IF (tmp_node_list_size > 1) THEN
IF (PRESENT(ierr) ) THEN
CALL infomsg("qes_read:gate_settingsType","relaxz: too many occurrences")
ierr = ierr + 1
ELSE
CALL errore("qes_read:gate_settingsType","relaxz: too many occurrences",10)
END IF
END IF
!
IF (tmp_node_list_size>0) THEN
obj%relaxz_ispresent = .TRUE.
tmp_node => item(tmp_node_list, 0)
CALL extractDataContent(tmp_node, obj%relaxz , IOSTAT = iostat_)
IF ( iostat_ /= 0 ) THEN
IF ( PRESENT (ierr ) ) THEN
CALL infomsg("qes_read:gate_settingsType","error reading relaxz")
ierr = ierr + 1
ELSE
CALL errore ("qes_read:gate_settingsType","error reading relaxz",10)
END IF
END IF
ELSE
obj%relaxz_ispresent = .FALSE.
END IF
!
tmp_node_list => getElementsByTagname(xml_node, "block")
tmp_node_list_size = getLength(tmp_node_list)
!
IF (tmp_node_list_size > 1) THEN
IF (PRESENT(ierr) ) THEN
CALL infomsg("qes_read:gate_settingsType","block: too many occurrences")
ierr = ierr + 1
ELSE
CALL errore("qes_read:gate_settingsType","block: too many occurrences",10)
END IF
END IF
!
IF (tmp_node_list_size>0) THEN
obj%block_ispresent = .TRUE.
tmp_node => item(tmp_node_list, 0)
CALL extractDataContent(tmp_node, obj%block , IOSTAT = iostat_)
IF ( iostat_ /= 0 ) THEN
IF ( PRESENT (ierr ) ) THEN
CALL infomsg("qes_read:gate_settingsType","error reading block")
ierr = ierr + 1
ELSE
CALL errore ("qes_read:gate_settingsType","error reading block",10)
END IF
END IF
ELSE
obj%block_ispresent = .FALSE.
END IF
!
tmp_node_list => getElementsByTagname(xml_node, "block_1")
tmp_node_list_size = getLength(tmp_node_list)
!
IF (tmp_node_list_size > 1) THEN
IF (PRESENT(ierr) ) THEN
CALL infomsg("qes_read:gate_settingsType","block_1: too many occurrences")
ierr = ierr + 1
ELSE
CALL errore("qes_read:gate_settingsType","block_1: too many occurrences",10)
END IF
END IF
!
IF (tmp_node_list_size>0) THEN
obj%block_1_ispresent = .TRUE.
tmp_node => item(tmp_node_list, 0)
CALL extractDataContent(tmp_node, obj%block_1 , IOSTAT = iostat_)
IF ( iostat_ /= 0 ) THEN
IF ( PRESENT (ierr ) ) THEN
CALL infomsg("qes_read:gate_settingsType","error reading block_1")
ierr = ierr + 1
ELSE
CALL errore ("qes_read:gate_settingsType","error reading block_1",10)
END IF
END IF
ELSE
obj%block_1_ispresent = .FALSE.
END IF
!
tmp_node_list => getElementsByTagname(xml_node, "block_2")
tmp_node_list_size = getLength(tmp_node_list)
!
IF (tmp_node_list_size > 1) THEN
IF (PRESENT(ierr) ) THEN
CALL infomsg("qes_read:gate_settingsType","block_2: too many occurrences")
ierr = ierr + 1
ELSE
CALL errore("qes_read:gate_settingsType","block_2: too many occurrences",10)
END IF
END IF
!
IF (tmp_node_list_size>0) THEN
obj%block_2_ispresent = .TRUE.
tmp_node => item(tmp_node_list, 0)
CALL extractDataContent(tmp_node, obj%block_2 , IOSTAT = iostat_)
IF ( iostat_ /= 0 ) THEN
IF ( PRESENT (ierr ) ) THEN
CALL infomsg("qes_read:gate_settingsType","error reading block_2")
ierr = ierr + 1
ELSE
CALL errore ("qes_read:gate_settingsType","error reading block_2",10)
END IF
END IF
ELSE
obj%block_2_ispresent = .FALSE.
END IF
!
tmp_node_list => getElementsByTagname(xml_node, "block_height")
tmp_node_list_size = getLength(tmp_node_list)
!
IF (tmp_node_list_size > 1) THEN
IF (PRESENT(ierr) ) THEN
CALL infomsg("qes_read:gate_settingsType","block_height: too many occurrences")
ierr = ierr + 1
ELSE
CALL errore("qes_read:gate_settingsType","block_height: too many occurrences",10)
END IF
END IF
!
IF (tmp_node_list_size>0) THEN
obj%block_height_ispresent = .TRUE.
tmp_node => item(tmp_node_list, 0)
CALL extractDataContent(tmp_node, obj%block_height , IOSTAT = iostat_)
IF ( iostat_ /= 0 ) THEN
IF ( PRESENT (ierr ) ) THEN
CALL infomsg("qes_read:gate_settingsType","error reading block_height")
ierr = ierr + 1
ELSE
CALL errore ("qes_read:gate_settingsType","error reading block_height",10)
END IF
END IF
ELSE
obj%block_height_ispresent = .FALSE.
END IF
!
!
obj%lwrite = .TRUE.
!
END SUBROUTINE qes_read_gate_settings
!
!
SUBROUTINE qes_read_atomic_constraints(xml_node, obj, ierr )
!
IMPLICIT NONE
@ -6927,6 +7183,26 @@ MODULE qes_read_module
obj%dipoleInfo_ispresent = .FALSE.
END IF
!
tmp_node_list => getElementsByTagname(xml_node, "gateInfo")
tmp_node_list_size = getLength(tmp_node_list)
!
IF (tmp_node_list_size > 1) THEN
IF (PRESENT(ierr) ) THEN
CALL infomsg("qes_read:outputElectricFieldType","gateInfo: too many occurrences")
ierr = ierr + 1
ELSE
CALL errore("qes_read:outputElectricFieldType","gateInfo: too many occurrences",10)
END IF
END IF
!
IF (tmp_node_list_size>0) THEN
obj%gateInfo_ispresent = .TRUE.
tmp_node => item(tmp_node_list, 0)
CALL qes_read_gateInfo(tmp_node, obj%gateInfo, ierr )
ELSE
obj%gateInfo_ispresent = .FALSE.
END IF
!
!
obj%lwrite = .TRUE.
!
@ -7529,6 +7805,124 @@ MODULE qes_read_module
END SUBROUTINE qes_read_phase
!
!
SUBROUTINE qes_read_gateInfo(xml_node, obj, ierr )
!
IMPLICIT NONE
!
TYPE(Node), INTENT(IN), POINTER :: xml_node
TYPE(gateInfo_type), INTENT(OUT) :: obj
INTEGER, OPTIONAL, INTENT(OUT) :: ierr
!
TYPE(Node), POINTER :: tmp_node
TYPE(NodeList), POINTER :: tmp_node_list
INTEGER :: tmp_node_list_size, index, iostat_
!
obj%tagname = getTagName(xml_node)
!
!
!
tmp_node_list => getElementsByTagname(xml_node, "pot_prefactor")
tmp_node_list_size = getLength(tmp_node_list)
!
IF (tmp_node_list_size /= 1) THEN
IF (PRESENT(ierr) ) THEN
CALL infomsg("qes_read:gateInfoType","pot_prefactor: wrong number of occurrences")
ierr = ierr + 1
ELSE
CALL errore("qes_read:gateInfoType","pot_prefactor: wrong number of occurrences",10)
END IF
END IF
!
tmp_node => item(tmp_node_list, 0)
IF (ASSOCIATED(tmp_node))&
CALL extractDataContent(tmp_node, obj%pot_prefactor, IOSTAT = iostat_ )
IF ( iostat_ /= 0 ) THEN
IF ( PRESENT (ierr ) ) THEN
CALL infomsg("qes_read:gateInfoType","error reading pot_prefactor")
ierr = ierr + 1
ELSE
CALL errore ("qes_read:gateInfoType","error reading pot_prefactor",10)
END IF
END IF
!
tmp_node_list => getElementsByTagname(xml_node, "gate_zpos")
tmp_node_list_size = getLength(tmp_node_list)
!
IF (tmp_node_list_size /= 1) THEN
IF (PRESENT(ierr) ) THEN
CALL infomsg("qes_read:gateInfoType","gate_zpos: wrong number of occurrences")
ierr = ierr + 1
ELSE
CALL errore("qes_read:gateInfoType","gate_zpos: wrong number of occurrences",10)
END IF
END IF
!
tmp_node => item(tmp_node_list, 0)
IF (ASSOCIATED(tmp_node))&
CALL extractDataContent(tmp_node, obj%gate_zpos, IOSTAT = iostat_ )
IF ( iostat_ /= 0 ) THEN
IF ( PRESENT (ierr ) ) THEN
CALL infomsg("qes_read:gateInfoType","error reading gate_zpos")
ierr = ierr + 1
ELSE
CALL errore ("qes_read:gateInfoType","error reading gate_zpos",10)
END IF
END IF
!
tmp_node_list => getElementsByTagname(xml_node, "gate_gate_term")
tmp_node_list_size = getLength(tmp_node_list)
!
IF (tmp_node_list_size /= 1) THEN
IF (PRESENT(ierr) ) THEN
CALL infomsg("qes_read:gateInfoType","gate_gate_term: wrong number of occurrences")
ierr = ierr + 1
ELSE
CALL errore("qes_read:gateInfoType","gate_gate_term: wrong number of occurrences",10)
END IF
END IF
!
tmp_node => item(tmp_node_list, 0)
IF (ASSOCIATED(tmp_node))&
CALL extractDataContent(tmp_node, obj%gate_gate_term, IOSTAT = iostat_ )
IF ( iostat_ /= 0 ) THEN
IF ( PRESENT (ierr ) ) THEN
CALL infomsg("qes_read:gateInfoType","error reading gate_gate_term")
ierr = ierr + 1
ELSE
CALL errore ("qes_read:gateInfoType","error reading gate_gate_term",10)
END IF
END IF
!
tmp_node_list => getElementsByTagname(xml_node, "gatefieldEnergy")
tmp_node_list_size = getLength(tmp_node_list)
!
IF (tmp_node_list_size /= 1) THEN
IF (PRESENT(ierr) ) THEN
CALL infomsg("qes_read:gateInfoType","gatefieldEnergy: wrong number of occurrences")
ierr = ierr + 1
ELSE
CALL errore("qes_read:gateInfoType","gatefieldEnergy: wrong number of occurrences",10)
END IF
END IF
!
tmp_node => item(tmp_node_list, 0)
IF (ASSOCIATED(tmp_node))&
CALL extractDataContent(tmp_node, obj%gatefieldEnergy, IOSTAT = iostat_ )
IF ( iostat_ /= 0 ) THEN
IF ( PRESENT (ierr ) ) THEN
CALL infomsg("qes_read:gateInfoType","error reading gatefieldEnergy")
ierr = ierr + 1
ELSE
CALL errore ("qes_read:gateInfoType","error reading gatefieldEnergy",10)
END IF
END IF
!
!
obj%lwrite = .TRUE.
!
END SUBROUTINE qes_read_gateInfo
!
!
SUBROUTINE qes_read_convergence_info(xml_node, obj, ierr )
!
IMPLICIT NONE
@ -8611,6 +9005,34 @@ MODULE qes_read_module
obj%potentiostat_contr_ispresent = .FALSE.
END IF
!
tmp_node_list => getElementsByTagname(xml_node, "gatefield_contr")
tmp_node_list_size = getLength(tmp_node_list)
!
IF (tmp_node_list_size > 1) THEN
IF (PRESENT(ierr) ) THEN
CALL infomsg("qes_read:total_energyType","gatefield_contr: too many occurrences")
ierr = ierr + 1
ELSE
CALL errore("qes_read:total_energyType","gatefield_contr: too many occurrences",10)
END IF
END IF
!
IF (tmp_node_list_size>0) THEN
obj%gatefield_contr_ispresent = .TRUE.
tmp_node => item(tmp_node_list, 0)
CALL extractDataContent(tmp_node, obj%gatefield_contr , IOSTAT = iostat_)
IF ( iostat_ /= 0 ) THEN
IF ( PRESENT (ierr ) ) THEN
CALL infomsg("qes_read:total_energyType","error reading gatefield_contr")
ierr = ierr + 1
ELSE
CALL errore ("qes_read:total_energyType","error reading gatefield_contr",10)
END IF
END IF
ELSE
obj%gatefield_contr_ispresent = .FALSE.
END IF
!
!
obj%lwrite = .TRUE.
!

View File

@ -26,7 +26,6 @@ MODULE qexsd_input
!
USE iotk_base, ONLY : iotk_indent, iotk_maxindent
USE constants, ONLY : e2,bohr_radius_angs
USE iotk_module
USE qes_module
!
IMPLICIT NONE
@ -604,7 +603,7 @@ MODULE qexsd_input
!
!-------------------------------------------------------------------------------------------------
SUBROUTINE qexsd_init_electric_field_input (obj,tefield,dipfield,lelfield,lberry,edir,gdir,emaxpos,eopreg,eamp, &
efield,efield_cart,nberrycyc,nppstr)
efield,efield_cart,nberrycyc,nppstr, gate, zgate, relaxz, block, block_1, block_2, block_height )
!---------------------------------------------------------------------------------------------------
!
IMPLICIT NONE
@ -615,6 +614,8 @@ MODULE qexsd_input
REAL(DP),INTENT(IN),OPTIONAL :: emaxpos,eopreg,eamp
REAL(DP),INTENT(IN),OPTIONAL :: efield
REAL(DP),INTENT(IN),OPTIONAL,DIMENSION(3) :: efield_cart
LOGICAL,INTENT(IN),OPTIONAL :: gate(1), block(1),relaxz(1)
REAL(DP),INTENT(IN),OPTIONAL :: zgate(1),block_1(1), block_2(1), block_height(1)
!
CHARACTER(LEN=*),PARAMETER :: TAGNAME="electric_field",&
SAWTOOTH="sawtooth_potential",&
@ -627,6 +628,9 @@ MODULE qexsd_input
LOGICAL :: dir_ispresent=.FALSE., amp_ispresent= .FALSE.,&
nberrycyc_ispresent=.FALSE.,nppstr_ispresent=.FALSE., &
electric_field_ispresent = .FALSE.
LOGICAL :: gate_, block_
REAL(DP) :: block_1_, block_2_, block_3_
TYPE(gate_settings_type),ALLOCATABLE :: gata_settings_obj(:)
!
IF (tefield) THEN
electric_potential=SAWTOOTH
@ -664,7 +668,11 @@ MODULE qexsd_input
electric_field_direction = gdir
END IF
END IF
IF (PRESENT (gate)) THEN
ALLOCATE(gata_settings_obj(1))
CALL qes_init_gate_settings(gata_settings_obj(1), "gate_settings", gate(1), zgate, relaxz,&
block, block_1, block_2, block_height )
END IF
CALL qes_init_electric_field( obj, TAGNAME, electric_potential=electric_potential, &
dipole_correction_ispresent=dipfield, dipole_correction = dipfield, &
electric_field_direction_ispresent= dir_ispresent, &
@ -676,7 +684,12 @@ MODULE qexsd_input
electric_field_vector = efield_cart_loc, &
electric_field_vector_ispresent= electric_field_ispresent, &
n_berry_cycles_ispresent=nberrycyc_ispresent,n_berry_cycles=nberrycyc_loc,&
nk_per_string_ispresent=nppstr_ispresent,nk_per_string=nppstr_loc )
nk_per_string_ispresent=nppstr_ispresent,nk_per_string=nppstr_loc, &
gate_settings = gata_settings_obj)
IF (ALLOCATED(gata_settings_obj)) THEN
CALL qes_reset_gate_settings(gata_settings_obj(1))
DEALLOCATE ( gata_settings_obj)
END IF
END SUBROUTINE qexsd_init_electric_field_input
!
!----------------------------------------------------------------------------------------------------------

View File

@ -55,7 +55,8 @@
lberry,nppstr,nberrycyc, &
nconstr_inp, nc_fields, constr_type_inp, constr_target_inp, constr_inp, tconstr, &
constr_tol_inp, constrained_magnetization, lambda, fixed_magnetization, input_dft, &
tf_inp, ip_ibrav => ibrav
tf_inp, ip_ibrav => ibrav, &
gate, zgate, relaxz, block, block_1, block_2, block_height
!
USE fixed_occ, ONLY: f_inp
@ -91,6 +92,8 @@
CHARACTER(len=20) :: dft_shortname
CHARACTER(len=25) :: dft_longname
CHARACTER(LEN=80) :: vdw_corr_
LOGICAL,ALLOCATABLE :: gate_(:), block_(:), relaxz_(:)
REAL(DP),ALLOCATABLE :: block_1_(:), block_2_(:), block_height_(:), zgate_(:)
!
!
#if !defined(__OLDXML)
@ -332,10 +335,23 @@
!-------------------------------------------------------------------------------------------------------------------------------
! ELECTRIC FIELD
!---------------------------------------------------------------------------------------------------------------------------
IF (tefield .OR. lelfield .OR. lberry ) THEN
IF (tefield .OR. lelfield .OR. lberry .or. gate ) THEN
obj%electric_field_ispresent=.TRUE.
IF ( gate ) THEN
ALLOCATE(gate_(1), zgate_(1), block_(1), block_1_(1), block_2_(1), block_height_(1), relaxz_(1))
gate_(1) = gate
zgate_(1) = zgate
block_(1) = block
block_1_(1) = block_1
block_2_(1) = block_2
block_height_(1) = block_height
relaxz_(1) = relaxz
END IF
CALL qexsd_init_electric_field_input(obj%electric_field, tefield, dipfield, lelfield, lberry, edir, gdir, &
emaxpos, eopreg, eamp, efield, efield_cart, nberrycyc, nppstr )
emaxpos, eopreg, eamp, efield, efield_cart, nberrycyc, nppstr, &
GATE = gate_, ZGATE = zgate_, RELAXZ = relaxz_, BLOCK = block_, &
BLOCK_1 = block_1_, BLOCK_2 = block_2_, BLOCK_HEIGHT = block_height_ )
IF ( gate) DEALLOCATE ( gate_, zgate_, block_, block_1_, block_2_, block_height_, relaxz_)
ELSE
obj%electric_field_ispresent=.FALSE.
END IF