! !---------------------------------------------------------! ! This module handles the reading of fields and cards ! ! in case of xml input ! ! ! ! written by Simone Ziraldo (08/2010) ! !---------------------------------------------------------! MODULE read_xml_module ! ! USE input_parameters ! USE io_global, ONLY : ionode, ionode_id, xmlinputunit => qestdin USE mp, ONLY : mp_bcast USE mp_images, ONLY : intra_image_comm USE iotk_module, ONLY : iotk_attlenx ! ! ...default and checkin of fields ! USE read_namelists_module, ONLY : control_defaults, system_defaults,& electrons_defaults, wannier_ac_defaults, ions_defaults, & cell_defaults, press_ai_defaults, wannier_defaults, control_bcast, & system_bcast, electrons_bcast, ions_bcast,cell_bcast, & press_ai_bcast, wannier_bcast, wannier_ac_bcast, control_checkin, & system_checkin, electrons_checkin, ions_checkin, cell_checkin, & wannier_checkin, wannier_ac_checkin, fixval ! ! USE read_xml_fields_module, ONLY : read_xml_fields USE read_xml_cards_module, ONLY : card_xml_atomic_species, card_xml_atomic_list, & card_xml_cell, card_xml_kpoints, card_xml_occupations, & card_xml_constraints, card_xml_plot_wannier, card_default, card_bcast ! ! IMPLICIT NONE ! SAVE ! PRIVATE ! PUBLIC :: read_xml ! CONTAINS ! ! !--------------------------------------------------------! ! This routine organizes the reading of the xml file ! ! depending on the program ! !--------------------------------------------------------! SUBROUTINE read_xml( prog, attr ) ! ! IMPLICIT NONE ! ! CHARACTER(len = 2), INTENT(IN) :: prog CHARACTER(len = *), INTENT(IN) :: attr INTEGER :: ierr ! SELECT CASE (prog) ! CASE ('PW') ! CALL read_xml_common( attr, 'PW' ) CALL read_xml_pw() ! CASE ('CP') ! CALL read_xml_common( attr, 'CP' ) CALL read_xml_cp() ! CASE default ! CALL errore('read_xml', "xml input isn't implemented for "//prog//' program', 1) ! END SELECT ! ! RETURN ! END SUBROUTINE read_xml ! ! !--------------------------------------------------------! ! Common part of the reading: setting default values, ! ! reading of cell and atomic_species cards ! !--------------------------------------------------------! SUBROUTINE read_xml_common( attr, prog ) ! ! USE iotk_module, ONLY : iotk_scan_attr ! ! IMPLICIT NONE ! ! CHARACTER (len = *), INTENT(IN) :: attr, prog ! CHARACTER (len = 256) :: dummy INTEGER :: ierr LOGICAL :: found ! ! ! ... default settings for all parameters ! CALL control_defaults( prog ) CALL system_defaults( prog ) CALL electrons_defaults( prog ) CALL ions_defaults( prog ) CALL cell_defaults( prog ) CALL wannier_defaults( prog ) CALL wannier_ac_defaults( prog ) ! ! ! ... reading the attributes of the xml root node ! IF (ionode) THEN ! CALL iotk_scan_attr( attr, 'calculation', dummy, found = found, ierr = ierr ) IF ( .not. found ) CALL errore( 'read_xml_common', 'attribute calculation of root & &node is compulsory', abs(ierr) ) ! IF ( ierr /= 0 ) CALL errore( 'read_xml_common', 'error reading calculation & &attribute of root node', 1 ) calculation = trim( dummy ) ! CALL iotk_scan_attr( attr, 'prefix', dummy, found = found, ierr = ierr ) IF ( ierr /= 0 ) CALL errore( 'read_xml_common', 'error reading prefix attribute & &of root node', abs(ierr) ) IF ( found ) prefix = trim( dummy ) ! CALL iotk_scan_attr( attr, 'title', dummy, found = found, ierr = ierr ) IF ( ierr /= 0 ) CALL errore( 'read_xml_common', 'error reading title attribute & &of root node', 1 ) IF ( found ) title = trim( dummy ) ! END IF ! ! ... bcast the read attributes ! CALL mp_bcast( calculation, ionode_id, intra_image_comm ) CALL mp_bcast( prefix, ionode_id, intra_image_comm ) CALL mp_bcast( title, ionode_id, intra_image_comm ) ! ! ... fixing some default values using the calculation variable ! CALL fixval( prog ) ! ! ... why this is compulsory? ( read autopilot.f90 ) CALL card_default( 'INIT_AUTOPILOT' ) ! ! ! ... reading CELL card ! CALL card_default( 'CELL' ) ! IF ( ionode ) THEN ! CALL card_xml_cell( ) ! END IF ! CALL card_bcast( 'CELL' ) ! ! ! ... reading ATOMIC_SPECIES card ! CALL card_default( 'ATOMIC_SPECIES' ) ! IF ( ionode ) THEN ! CALL card_xml_atomic_species( ) ! END IF ! CALL card_bcast( 'ATOMIC_SPECIES' ) ! RETURN ! END SUBROUTINE read_xml_common ! ! !--------------------------------------------------------! ! The remaining part of the reading for PW: fields and ! ! other cards ! !--------------------------------------------------------! SUBROUTINE read_xml_pw( ) ! ! USE iotk_module, ONLY : iotk_scan_begin, iotk_scan_end USE iotk_unit_interf, ONLY : iotk_rewind ! ! IMPLICIT NONE ! ! INTEGER :: ierr CHARACTER (len = iotk_attlenx) :: attr CHARACTER (len = 30) :: field, card LOGICAL :: found_al, found ! ! ! ... reading ATOMIC_LIST card ! CALL card_default( 'ATOMIC_LIST' ) ! IF ( ionode ) THEN ! CALL iotk_scan_begin( xmlinputunit, 'atomic_list', found = found_al, ierr = ierr ) IF ( ierr /= 0 ) CALL errore( 'read_xml_pw', 'error scanning begin & &of atomic_list card', abs(ierr) ) ! IF ( found_al ) THEN ! CALL iotk_scan_end( xmlinputunit, 'atomic_list', ierr = ierr ) IF ( ierr /= 0 ) CALL errore( 'read_xml_pw', 'error scanning end & &of atomic_list card', abs( ierr ) ) ! CALL card_xml_atomic_list( ) ! ELSE ! CALL errore('read_xml_pw',"card atomic_list is missing", 1 ) ! ENDIF ENDIF ! CALL mp_bcast( found_al, ionode_id, intra_image_comm) ! CALL card_bcast( 'ATOMIC_LIST' ) ! ! ... reading all the FIELDS ! ! ! ... we need to know if startingwfc and starting pot are set startingwfc = 'none' startingpot = 'none' ! IF (ionode) THEN ! CALL read_xml_fields() ! END IF ! ! ! ... some fixval that the previous call of fixval wasn't ! ... able to do ! IF ( calculation == 'nscf' .or. calculation == 'bands' ) THEN ! IF (startingpot == 'none') startingpot = 'file' IF (startingwfc == 'none') startingwfc = 'atomic+random' ! ELSE IF ( restart_mode == 'from_scratch' ) THEN ! IF (startingwfc == 'none') startingwfc = 'atomic+random' IF (startingpot == 'none') startingpot = 'atomic' ! ELSE ! IF (startingwfc == 'none') startingwfc = 'file' IF (startingpot == 'none') startingpot = 'file' ! END IF ! ! ! ! ... checkin of all the parameters inserted in the fields ! IF ( ionode ) THEN ! CALL control_checkin( 'PW' ) CALL system_checkin( 'PW' ) CALL electrons_checkin( 'PW' ) CALL ions_checkin( 'PW' ) CALL cell_checkin( 'PW' ) CALL wannier_checkin( 'PW' ) CALL wannier_ac_checkin( 'PW' ) ! END IF ! ! ! ... bcast all the field parameters ! CALL control_bcast( ) CALL system_bcast( ) CALL electrons_bcast( ) CALL ions_bcast( ) CALL cell_bcast() CALL press_ai_bcast() CALL wannier_bcast() CALL wannier_ac_bcast() ! ! ! ... second step : reading of the remaining cards ! ! ! ... reading CONSTRAINTS card ! card = 'constraints' CALL card_default( 'CONSTRAINTS' ) ! IF ( ionode ) THEN ! CALL iotk_scan_begin( xmlinputunit, trim(card), found = found, ierr = ierr ) IF ( ierr /= 0 ) GO TO 9 ! IF ( found ) THEN ! CALL card_xml_constraints( ) ! CALL iotk_scan_end( xmlinputunit, trim(card), ierr = ierr) IF ( ierr /= 0 ) GOTO 10 ! ELSE ! ! ... due to a iotk problem with gfortran compiler CALL iotk_rewind( xmlinputunit ) ! END IF ! END IF ! CALL mp_bcast ( found, ionode_id, intra_image_comm ) ! IF ( found ) CALL card_bcast( 'CONSTRAINTS' ) ! ! ! ... reading K_POINTS card ! card = 'k_points' CALL card_default( 'K_POINTS' ) ! IF ( ionode ) THEN ! CALL iotk_scan_begin( xmlinputunit, trim( card ), attr = attr, found = found,& ierr = ierr ) IF ( ierr /= 0 ) GO TO 9 ! IF ( found ) THEN ! CALL card_xml_kpoints( attr ) ! CALL iotk_scan_end( xmlinputunit, trim( card ), ierr = ierr) IF ( ierr /= 0 ) GOTO 10 ! ELSE ! CALL errore('read_xml_pw', 'K_POINTS card was not found', 1) ! END IF ! END IF ! CALL card_bcast( 'K_POINTS' ) ! ! ! ... reading OCCUPATIONS card ! card = 'occupations' CALL card_default( 'OCCUPATIONS' ) ! IF ( ionode ) THEN ! CALL iotk_scan_begin( xmlinputunit, trim( card ), found = found, ierr = ierr ) IF ( ierr /= 0 ) GO TO 9 ! IF ( found ) THEN ! CALL card_xml_occupations() ! CALL iotk_scan_end( xmlinputunit, trim( card ), ierr = ierr ) IF ( ierr /= 0 ) GOTO 10 ! ELSE ! ! ... due to a iotk problem with gfortran compiler CALL iotk_rewind( xmlinputunit ) ! END IF ! END IF ! CALL mp_bcast ( found, ionode_id, intra_image_comm ) ! IF ( found ) CALL card_bcast( 'OCCUPATIONS' ) ! RETURN ! 9 CALL errore('read_xml_pw', 'error reading begin tag of '//card//' card', ABS( ierr ) ) 10 CALL errore('read_xml_pw', 'error reading end tag of '//card//' card', ABS( ierr ) ) ! ! END SUBROUTINE read_xml_pw ! ! ! !--------------------------------------------------------! ! The rest of the reading for CP program : fileds and ! ! other cards ! !--------------------------------------------------------! SUBROUTINE read_xml_cp( ) ! ! USE iotk_module, ONLY : iotk_scan_begin, iotk_scan_end USE iotk_unit_interf, ONLY : iotk_rewind ! ! IMPLICIT NONE ! ! INTEGER :: ierr CHARACTER (len = iotk_attlenx) :: attr CHARACTER (len = 30) :: field, card LOGICAL :: found ! ! ! ... reading ATOMIC_LIST cards ! ! CALL card_default( 'ATOMIC_LIST' ) ! IF ( ionode ) THEN ! CALL card_xml_atomic_list ( ) ! END IF ! CALL card_bcast( 'ATOMIC_LIST' ) ! ! ! ... reading all the FIELDS ! IF (ionode) THEN ! CALL read_xml_fields() ! END IF ! ! ! ... checkin of all the parameters inserted in the fields ! IF ( ionode ) THEN ! CALL control_checkin( 'CP' ) CALL system_checkin( 'CP' ) CALL electrons_checkin( 'CP' ) CALL ions_checkin( 'CP' ) CALL cell_checkin( 'CP' ) CALL wannier_checkin( 'CP' ) CALL wannier_ac_checkin( 'CP' ) ! END IF ! ! ! ... bcast all the field parameters ! CALL control_bcast( ) CALL system_bcast( ) CALL electrons_bcast( ) CALL ions_bcast( ) CALL cell_bcast() CALL press_ai_bcast() CALL wannier_bcast() CALL wannier_ac_bcast() ! ! ! ... second step : reading of the remaining cards ! ! ! ... reading CONSTRAINTS card ! card = 'constraints' CALL card_default( 'CONSTRAINTS' ) ! IF ( ionode ) THEN ! CALL iotk_scan_begin( xmlinputunit, trim(card), found = found, ierr = ierr ) IF ( ierr /= 0 ) GO TO 9 ! IF ( found ) THEN ! CALL card_xml_constraints( ) ! CALL iotk_scan_end( xmlinputunit, trim(card), ierr = ierr) IF ( ierr /= 0 ) GOTO 10 ! ELSE ! ! ... due to a iotk problem with gfortran compiler CALL iotk_rewind( xmlinputunit ) ! END IF ! END IF ! CALL mp_bcast ( found, ionode_id, intra_image_comm ) ! IF ( found ) CALL card_bcast( 'CONSTRAINTS' ) ! ! ... reading OCCUPATIONS card ! card = 'occupations' CALL card_default( 'OCCUPATIONS' ) ! IF ( ionode ) THEN ! CALL iotk_scan_begin( xmlinputunit, trim( card ), found = found, ierr = ierr ) IF ( ierr /= 0 ) GO TO 9 ! IF ( found ) THEN ! CALL card_xml_occupations() ! CALL iotk_scan_end( xmlinputunit, trim( card ), ierr = ierr ) IF ( ierr /= 0 ) GOTO 10 ! ELSE ! ! ... due to a iotk problem with gfortran compiler CALL iotk_rewind( xmlinputunit ) ! END IF ! END IF ! CALL mp_bcast ( found, ionode_id, intra_image_comm ) ! IF ( found ) CALL card_bcast( 'OCCUPATIONS' ) ! card = 'plot_wannier' CALL card_default( 'PLOT_WANNIER' ) ! IF ( ionode ) THEN ! CALL iotk_scan_begin( xmlinputunit, trim( card ), found = found, ierr = ierr ) IF ( ierr /= 0 ) GO TO 9 ! IF ( found ) THEN ! CALL card_xml_plot_wannier() ! CALL iotk_scan_end( xmlinputunit, trim( card ), ierr = ierr ) IF ( ierr /= 0 ) GOTO 10 ! ELSE ! ! ... due to a iotk problem with gfortran compiler CALL iotk_rewind( xmlinputunit ) ! END IF ! END IF ! CALL mp_bcast ( found, ionode_id, intra_image_comm ) ! IF ( found ) CALL card_bcast( 'PLOT_WANNIER' ) ! ! ! ! RETURN ! 9 CALL errore('read_xml_cp', 'error reading begin tag of '//card//' card', ABS( ierr ) ) 10 CALL errore('read_xml_cp', 'error reading end tag of '//card//' card', ABS( ierr ) ) ! ! END SUBROUTINE read_xml_cp ! ! ! END MODULE read_xml_module