mirror of https://gitlab.com/QEF/q-e.git
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:
parent
680e1a7277
commit
a88ae19956
|
@ -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.
|
||||
!
|
||||
|
|
|
@ -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
|
||||
!
|
||||
!----------------------------------------------------------------------------------------------------------
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue