diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 808d6e01b..69e89f4ac 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -34,12 +34,25 @@ build:cp: # - make run-tests-ph-serial # - rm -r /tmp/save +build:cmake-gnu: + tags: [docker] + image: ubuntu:latest + script: + - apt-get update + - DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends tzdata + - apt-get install --yes gfortran git cmake libopenblas0 libopenblas-dev libfftw3-3 libfftw3-dev libopenmpi3 libopenmpi-dev + - cmake --version + - mkdir build + - cd build + - cmake -DCMAKE_Fortran_COMPILER=mpif90 -DCMAKE_C_COMPILER=gcc .. && make + build:pgi: tags: [docker] image: nvcr.io/hpc/pgi-compilers:ce script: - - ./configure FC=pgf90 F90=pgf90 MPIF90=mpif90 --enable-openmp + - ./configure FC=pgf90 F90=pgf90 F77=pgfortran MPIF90=mpif90 --enable-openmp --with-cuda=yes --enable-cuda-env-check=no - apt-get install --reinstall make + - ln -s /usr/bin/cpp /bin/cpp # workaround bug in autotools - make pw cp ph #build:centos: diff --git a/.gitmodules b/.gitmodules index 6c907580e..6a8a6fdd1 100644 --- a/.gitmodules +++ b/.gitmodules @@ -7,3 +7,6 @@ [submodule "external/wannier90"] path = external/wannier90 url = https://github.com/wannier-developers/wannier90.git +[submodule "external/devxlib"] + path = external/devxlib + url = https://gitlab.com/max-centre/components/devicexlib.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 09324f1cd..64bb7ac1b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,13 +29,14 @@ set(QE_TESTS_DIR ${qe_BINARY_DIR}/tests/bin) ########################################################### # Build helpers ########################################################### +set(PROJECT_CMAKE ${CMAKE_CURRENT_SOURCE_DIR}/cmake) set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake" ${CMAKE_MODULE_PATH}) include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include") include(cmake/qeHelpers.cmake) ########################################################### # Build Type -# Ensure that a specific, default build type is set when +# Ensure that a specific, default build type is set when # none has been explicitly set by the user ########################################################### qe_ensure_build_type("Release") @@ -73,9 +74,9 @@ option(QE_ENABLE_HDF5 "enable HDF5 data collection" OFF) option(QE_ENABLE_CUDA "enable CUDA acceleration on NVIDIA GPUs" OFF) -option(QE_ENABLE_VENDOR_DEPS +option(QE_ENABLE_VENDOR_DEPS "enable fallback on vendored deps when none is found via find_package()" ON) -option(QE_ENABLE_DOC +option(QE_ENABLE_DOC "enable documentation building" OFF) # TODO change all ifdefs throughout code base to match @@ -134,16 +135,12 @@ endif() # The following targets will be defined: add_library(qe_mpi_fortran INTERFACE) add_library(QE::MPI_Fortran ALIAS qe_mpi_fortran) -add_library(qe_mpi_c INTERFACE) -add_library(QE::MPI_C ALIAS qe_mpi_c) -qe_install_targets(qe_mpi_fortran qe_mpi_c) +qe_install_targets(qe_mpi_fortran) ########################################################### if(QE_ENABLE_MPI) - find_package(MPI REQUIRED Fortran C) - target_link_libraries(qe_mpi_fortran + find_package(MPI REQUIRED Fortran) + target_link_libraries(qe_mpi_fortran INTERFACE MPI::MPI_Fortran) - target_link_libraries(qe_mpi_c - INTERFACE MPI::MPI_C) endif(QE_ENABLE_MPI) ########################################################### @@ -157,16 +154,23 @@ qe_install_targets(qe_openmp_fortran qe_openmp_c) ########################################################### if(QE_ENABLE_OPENMP) find_package(OpenMP REQUIRED Fortran C) - target_link_libraries(qe_openmp_fortran + target_link_libraries(qe_openmp_fortran INTERFACE OpenMP::OpenMP_Fortran) - target_link_libraries(qe_openmp_c + target_link_libraries(qe_openmp_c INTERFACE OpenMP::OpenMP_C) - + endif(QE_ENABLE_OPENMP) +############################################################ +## Compiler specific options +############################################################ +if(CMAKE_Fortran_COMPILER_ID MATCHES "GNU") + include(${PROJECT_CMAKE}/GNUFortranCompiler.cmake) +endif() + ############################################################ ## Vendor -## Try to found vendor specific libraries for: +## Try to found vendor specific libraries for: ## BLAS, LAPACK and FFTW ############################################################ if(QE_ENABLE_OPENMP) @@ -195,13 +199,13 @@ endif() add_library(qe_lapack INTERFACE) add_library(QE::LAPACK ALIAS qe_lapack) qe_install_targets(qe_lapack) -########################################################### +####################################################################### if(NOT VENDOR_FOUND) find_package(LAPACK) if(LAPACK_FOUND) message(STATUS "Found LAPACK: ${LAPACK_LIBRARIES}") - target_link_libraries(qe_lapack - INTERFACE + target_link_libraries(qe_lapack + INTERFACE ${LAPACK_LIBRARIES} ${LAPACK_LINKER_FLAGS}) elseif(QE_ENABLE_VENDOR_DEPS) @@ -233,8 +237,8 @@ qe_install_targets(qe_scalapack) if(QE_ENABLE_SCALAPACK) find_package(SCALAPACK REQUIRED QUIET) message(STATUS "Found SCALAPACK: ${SCALAPACK_LIBRARIES};${SCALAPACK_LINKER_FLAGS}") - target_link_libraries(qe_scalapack - INTERFACE + target_link_libraries(qe_scalapack + INTERFACE ${SCALAPACK_LIBRARIES} ${SCALAPACK_LINKER_FLAGS}) endif(QE_ENABLE_SCALAPACK) @@ -248,27 +252,24 @@ qe_install_targets(qe_elpa) ########################################################### if(QE_ENABLE_ELPA) find_package(ELPA REQUIRED) - - string(REGEX MATCH "elpa-[0-9][0-9][0-9][0-9]" CMAKE_MATCH_ELPA_VER "${ELPA_INCLUDE_DIRS}") - string(REGEX MATCH "[0-9][0-9][0-9][0-9]" CMAKE_MATCH_ONLY_VER "${CMAKE_MATCH_ELPA_VER}") - + # Check if ELPA version is compatible with QE - if(CMAKE_MATCH_ONLY_VER EQUAL "2018" OR - CMAKE_MATCH_ONLY_VER EQUAL "2017" OR - CMAKE_MATCH_ONLY_VER EQUAL "2016") - qe_add_global_compile_definitions(__ELPA_2016) - elseif(CMAKE_MATCH_ONLY_VER EQUAL "2015") - qe_add_global_compile_definitions(__ELPA_2015) - elseif(CMAKE_MATCH_ONLY_VER LESS "2015") - qe_add_global_compile_definitions(__ELPA) + if(ELPA_VERSION_STRING VERSION_GREATER_EQUAL "2018.11") + set(QE_ELPA_DEFINITIONS __ELPA) + elseif(ELPA_VERSION_STRING VERSION_GREATER_EQUAL "2016.11") + set(QE_ELPA_DEFINITIONS __ELPA_2016) + elseif(ELPA_VERSION_STRING VERSION_GREATER_EQUAL "2015") + set(QE_ELPA_DEFINITIONS __ELPA_2015) else() - message(FATAL_ERROR "ELPA ver. ${CMAKE_MATCH_ONLY_VER} is not supported.") + message(FATAL_ERROR "ELPA verion ${ELPA_VERSION_STRING} is not supported.") endif() + message(STATUS "Add ELPA flag : ${QE_ELPA_DEFINITIONS}") + qe_add_global_compile_definitions(${QE_ELPA_DEFINITIONS}) # Looking for module directory - file(GLOB_RECURSE ELPA_MODS "${ELPA_INCLUDE_DIRS}/*.mod") - list(GET ELPA_MODS 0 ELPA_MOD) - if(EXISTS ${ELPA_MOD}) + file(GLOB_RECURSE ELPA_MODS_FILES "${ELPA_INCLUDE_DIRS}/*.mod" "${ELPA_INCLUDE_DIRS}/../modules/*.mod") + if(ELPA_MODS_FILES) + list(GET ELPA_MODS_FILES 0 ELPA_MOD) get_filename_component(ELPA_MOD_DIR "${ELPA_MOD}" PATH) set(ELPA_INCLUDE_DIRS "${ELPA_MOD_DIR};${ELPA_INCLUDE_DIRS}") else() @@ -276,7 +277,7 @@ if(QE_ENABLE_ELPA) endif() # Add link libraries and include directories - target_link_libraries(qe_elpa + target_link_libraries(qe_elpa INTERFACE ${ELPA_LIBRARIES} ${ELPA_LIBRARIES_DEP} @@ -297,17 +298,23 @@ add_library(QE::HDF5_C ALIAS qe_hdf5_c) qe_install_targets(qe_hdf5_fortran qe_hdf5_c) ########################################################### if(QE_ENABLE_HDF5) + if(QE_ENABLE_MPI) + option(HDF5_PREFER_PARALLEL "Prefer parallel HDF5" ON) + endif() find_package(HDF5 REQUIRED Fortran C) - - if(NOT HDF5_Fortran_LIBRARIES OR NOT HDF5_Fortran_INCLUDE_DIRS) + if(NOT HDF5_FOUND) message(FATAL_ERROR "HDF5 Fortran interface has not been found!") endif() - if (NOT HDF5_IS_PARALLEL OR NOT QE_ENABLE_MPI) - qe_add_global_compile_definitions(__HDF5_SERIAL) - endif() - target_link_libraries(qe_hdf5_fortran - INTERFACE + if (NOT HDF5_IS_PARALLEL OR NOT QE_ENABLE_MPI) + message(STATUS "Serial HDF5 enabled!") + qe_add_global_compile_definitions(__HDF5_SERIAL) + else() + message(STATUS "Parallel HDF5 enabled!") + endif() + + target_link_libraries(qe_hdf5_fortran + INTERFACE ${HDF5_Fortran_LIBRARIES} ${HDF5_Fortran_HL_LIBRARIES}) target_include_directories(qe_hdf5_fortran @@ -317,8 +324,8 @@ if(QE_ENABLE_HDF5) INTERFACE ${HDF5_Fortran_DEFINITIONS}) - target_link_libraries(qe_hdf5_c - INTERFACE + target_link_libraries(qe_hdf5_c + INTERFACE ${HDF5_C_LIBRARIES} ${HDF5_C_HL_LIBRARIES}) target_include_directories(qe_hdf5_c @@ -402,10 +409,10 @@ write_basic_package_version_file( VERSION ${PACKAGE_VERSION} COMPATIBILITY AnyNewerVersion) -configure_file(cmake/qeConfig.cmake.in +configure_file(cmake/qeConfig.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/qeConfig.cmake @ONLY) -install(FILES +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/qeConfigVersion.cmake ${CMAKE_CURRENT_BINARY_DIR}/qeConfig.cmake DESTINATION @@ -424,8 +431,8 @@ add_custom_target(depgraph ########################################################### # Custom make targets ########################################################### -add_custom_target(pw - DEPENDS +add_custom_target(pw + DEPENDS qe_pw_exe qe_pw_tools_ibrav2cell_exe qe_pw_tools_cell2ibrav_exe @@ -435,8 +442,8 @@ add_custom_target(pw COMMENT "basic code for scf, structure optimization, MD") -add_custom_target(ph - DEPENDS +add_custom_target(ph + DEPENDS qe_phonon_ph_exe qe_phonon_dynmat_exe qe_phonon_q2r_exe @@ -451,27 +458,27 @@ add_custom_target(ph COMMENT "phonon code, Gamma-only and third-order derivatives") -add_custom_target(hp - DEPENDS +add_custom_target(hp + DEPENDS qe_hp_exe COMMENT "calculation of the Hubbard parameters from DFPT") -add_custom_target(pwcond - DEPENDS +add_custom_target(pwcond + DEPENDS qe_pwcond_exe COMMENT "ballistic conductance") -add_custom_target(neb - DEPENDS +add_custom_target(neb + DEPENDS qe_neb_exe qe_neb_pathinterpolation_exe COMMENT "code for Nudged Elastic Band method") -add_custom_target(pp - DEPENDS +add_custom_target(pp + DEPENDS qe_pp_exe qe_pp_opengrid_exe qe_pp_average_exe @@ -504,17 +511,17 @@ add_custom_target(pp COMMENT "postprocessing programs") -add_custom_target(pwall - DEPENDS - pw - ph - pp - pwcond +add_custom_target(pwall + DEPENDS + pw + ph + pp + pwcond neb COMMENT "same as \"make pw ph pp pwcond neb\"") -add_custom_target(cp +add_custom_target(cp DEPENDS qe_cpv_exe qe_cpv_manycp_exe @@ -523,7 +530,7 @@ add_custom_target(cp COMMENT "CP code: Car-Parrinello molecular dynamics") -add_custom_target(tddfpt +add_custom_target(tddfpt DEPENDS qe_tddfpt_turbolanczos_exe qe_tddfpt_turbodavidson_exe @@ -532,7 +539,7 @@ add_custom_target(tddfpt COMMENT "time dependent dft code") -add_custom_target(gwl +add_custom_target(gwl DEPENDS qe_gww_util_grap_exe qe_gww_util_abcoefftoeps_exe @@ -540,36 +547,23 @@ add_custom_target(gwl COMMENT "GW with Lanczos chains") -add_custom_target(ld1 +add_custom_target(ld1 DEPENDS qe_atomic_exe COMMENT "utilities for pseudopotential generation") -add_custom_target(upf +add_custom_target(upf DEPENDS - qe_upftools_extractcore_exe - qe_upftools_casino2upf_exe - qe_upftools_upf2upf2_exe - qe_upftools_cpmd2upf_exe - qe_upftools_fhi2upf_exe - qe_upftools_fpmd2upf_exe - qe_upftools_ncpp2upf_exe - qe_upftools_oldcp2upf_exe - qe_upftools_readupf_exe - qe_upftools_readupftofile_exe - qe_upftools_fixupf_exe - qe_upftools_rrkj2upf_exe - qe_upftools_upf2casino_exe - qe_upftools_uspp2upf_exe - qe_upftools_vdb2upf_exe - qe_upftools_virtualv2_exe - qe_upftools_interpolate_exe - qe_upftools_hgh2qelininterpol_gh2qe_exe + #Library + qe_upflib + #Executables + qe_upflib_virtual_v2_exe + qe_upflib_upfconv_exe COMMENT "utilities for pseudopotential conversion") -add_custom_target(xspectra +add_custom_target(xspectra DEPENDS qe_xspectra_exe qe_xspectra_spectracorrection_exe @@ -577,13 +571,13 @@ add_custom_target(xspectra COMMENT "X-ray core-hole spectroscopy calculations") -add_custom_target(couple +add_custom_target(couple DEPENDS qe_couple COMMENT "library interface for coupling to external codes") -add_custom_target(epw +add_custom_target(epw DEPENDS qe_epw_exe COMMENT diff --git a/CPV/src/ensemble_dft.f90 b/CPV/src/ensemble_dft.f90 index e569aeb5a..122de0887 100644 --- a/CPV/src/ensemble_dft.f90 +++ b/CPV/src/ensemble_dft.f90 @@ -185,6 +185,7 @@ CONTAINS ! CASE ('ensemble','ensemble-dft','edft') ! + CALL errore(' ensemble_initval ','ensemble-dft is broken, sorry!', 1 ) tens =.true. ninner = n_inner_ etemp = degauss_ diff --git a/Doc/release-notes b/Doc/release-notes index 9a5675529..42696b4b3 100644 --- a/Doc/release-notes +++ b/Doc/release-notes @@ -1,12 +1,16 @@ New in dev version: * Support for CMake (F. Ficarelli and D. Cesarini, CINECA, with help from Ye Luo, P. Delugas, S. Gsaenger) + * In vc-relax with Hubbard corrections, the final SCF calculation is done by + reading atomic occupations from file produced during the vc-relax + (rather then recomputing them from scratch). Fixed in dev version: * Some linkers yield "missing references to ddot_" in libbeef * FFT test in FFTXlib was not always compiling * angle1, angle2, starting_magnetization incorrectly written to xml file * Bug in Hubbard forces and stress for bands parallelization (when nproc_pool>nbnd) + * Bug in DFT+U+V when starting_ns_eigenvalue is used (courtesy of M. Cococcioni) * Crash in the calculation of Z* with ultrasoft PP when the number of bands is larger than the number of occupied bands (thanks to Sasha Fonari) * Crash in matdyn.x when ibrav=0 (thanks to Sasha Fonari) diff --git a/Doc/user_guide.tex b/Doc/user_guide.tex index 433ac18e3..f3d4bdf3d 100644 --- a/Doc/user_guide.tex +++ b/Doc/user_guide.tex @@ -622,6 +622,8 @@ The following options are available for the CUDA Fortran GPU version:\\ & CUDA Toolkit installed on the workstation \\ & or available on the compute nodes of the HPC facility.\\ & PGI compilers currently accept 7.5, 8.0 or 9.0 (default: 8.0)\\ +\texttt{--enable-cuda-env-check=[yes]}& if set, sanity checks on the CUDA environment\\ + & are performed (default: yes). \end{tabular}\\ Please remember that in order to compile the CUDA code for GPU's you need ... diff --git a/EPW/bin/allocate.py b/EPW/bin/allocate.py index 2d24d2591..99587ac85 100644 --- a/EPW/bin/allocate.py +++ b/EPW/bin/allocate.py @@ -1,13 +1,15 @@ -# -# Script to automatically add status and error message to ALLOCATE and DEALLOCATE in -# Fortran files. +# +# Script to automatically add status and error message to ALLOCATE and DEALLOCATE in +# Fortran files. # # Author: S. Ponce # Date: Sept. 2019 # +from __future__ import print_function import numpy as np + # File name file_name = 'elphel2_shuffle.f90' @@ -18,7 +20,7 @@ with open(file_name,'r') as F: #tmp = lines.split() if len(tmp_split) < 1: continue - # + # #print tmp_split[0][0:9] if tmp_split[0] == 'SUBROUTINE': for ii in np.arange(len(tmp)): @@ -28,7 +30,7 @@ with open(file_name,'r') as F: end = ii name_sub = str(tmp[start+2:end]) - + if tmp_split[0] == 'FUNCTION': for ii in np.arange(len(tmp)): if tmp[ii] == 'N' and tmp[ii+1] == ' ': @@ -47,19 +49,18 @@ with open(file_name,'r') as F: if tmp[ii] == ')': final = ii #print 'start ',start - print str(tmp[0:start-9])+'ALLOCATE('+str(tmp[start:final])+', STAT = ierr)' - print str(tmp[0:start-9])+'IF (ierr /= 0) CALL errore(\''+str(name_sub)+'\', \'Error allocating '+str(tmp[start:end])+'\', 1)' + print('{}ALLOCATE({}, STAT = ierr)'.format(tmp[0:start-9], tmp[start:final])) + print("{}IF (ierr /= 0) CALL errore('{}', 'Error allocating {}', 1)".format( + tmp[0:start-9], name_sub, tmp[start:end] + )) elif tmp_split[0][0:11] == 'DEALLOCATE(': for ii in np.arange(len(tmp)): if tmp[ii] == '(': start = ii if tmp[ii] == ')': end = ii - print str(tmp[0:start-10])+'DEALLOCATE('+str(tmp[start+1:end])+', STAT = ierr)' - print str(tmp[0:start-10])+'IF (ierr /= 0) CALL errore(\''+str(name_sub)+'\', \'Error deallocating '+str(tmp[start+1:end])+'\', 1)' + print('{}DEALLOCATE({}, STAT = ierr)'.format(tmp[0:start-10], tmp[start+1:end])) + print("{}IF (ierr /= 0) CALL errore('{}', 'Error deallocating {}', 1)".format( + tmp[0:start-10], name_sub, tmp[start+1:end])) else: - print str(lines), - - - - + print(lines, end='') diff --git a/EPW/bin/pp-xml-depreciated.py b/EPW/bin/pp-xml-depreciated.py index 471e6346a..699359594 100644 --- a/EPW/bin/pp-xml-depreciated.py +++ b/EPW/bin/pp-xml-depreciated.py @@ -1,11 +1,13 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # # Post-processing script from of PH data in format used by EPW # 14/07/2015 - Creation of the script - Samuel Ponce # 14/03/2018 - Automatically reads the number of q-points - Michael Waters -# 14/03/2018 - Detect if SOC is included in the calculation - Samuel Ponce +# 14/03/2018 - Detect if SOC is included in the calculation - Samuel Ponce # 13/11/2018 - Write dyn files in xml format for SOC case - Shunhong Zhang (USTC) -# +# +from __future__ import print_function +from builtins import input import numpy as np import os from xml.dom import minidom @@ -14,12 +16,12 @@ from xml.dom import minidom def dyn2xml(prefix): ndyn=int(os.popen('head -2 {0}.dyn0|tail -1'.format(prefix)).read()) for idyn in range(1,ndyn+1): - print '{0}.dyn{1} to {0}.dyn_q{1}.xml'.format(prefix,idyn) + print('{0}.dyn{1} to {0}.dyn_q{1}.xml'.format(prefix, idyn)) dynmat=dyn(prefix,idyn) dynmat._write_xml() def get_geom_info(): - if os.path.isfile('ph.out')==False: - print 'cannot extract geometry info from ph.out' + if not os.path.isfile('ph.out'): + print('cannot extract geometry info from ph.out') return 1 else: volm=float(os.popen('grep -a volume ph.out 2>/dev/null|tail -1').readline().split()[-2]) @@ -47,7 +49,7 @@ class dyn(object): self._at=np.zeros((3,3),float) self._bg=np.zeros((3,3),float) try: self._volm,self._at,self._bg = get_geom_info() - except: print 'warning: lattice info not found' + except Exception: print('warning: lattice info not found') for i in range(0, 4): f.readline() self._species=[]; @@ -215,7 +217,7 @@ def hasSOC(prefix): xmldoc = minidom.parse(fname) item = xmldoc.getElementsByTagName('spinorbit')[0] lSOC = item.childNodes[0].data - + return lSOC # Check if the calculation was done in sequential @@ -225,11 +227,11 @@ def isSEQ(prefix): lseq = True else: lseq = False - + return lseq - + # Enter the number of irr. q-points -user_input = raw_input('Enter the prefix used for PH calculations (e.g. diam)\n') +user_input = input('Enter the prefix used for PH calculations (e.g. diam)\n') prefix = str(user_input) # Test if SOC @@ -237,14 +239,14 @@ SOC = hasSOC(prefix) # If SOC detected, but dyn is not in XML and we want to convert it if SOC=='true': - user_input = raw_input('Calculation with SOC detected. Do you want to convert dyn in XML format [y/n]?\n') + user_input = input('Calculation with SOC detected. Do you want to convert dyn in XML format [y/n]?\n') if str(user_input) == 'y': dyn2xml(prefix) os.system('mv {0}.dyn*.xml save'.format(prefix)) -# If no SOC detected, do you want to convert into XML format +# If no SOC detected, do you want to convert into XML format if SOC=='false': - user_input = raw_input('Calculation without SOC detected. Do you want to convert to xml anyway [y/n]?\n') + user_input = input('Calculation without SOC detected. Do you want to convert to xml anyway [y/n]?\n') if str(user_input) == 'y': SOC = 'true' dyn2xml(prefix) @@ -258,7 +260,7 @@ if True: # this gets the nqpt from the outputfiles else: # Enter the number of irr. q-points - user_input = raw_input('Enter the number of irreducible q-points\n') + user_input = input('Enter the number of irreducible q-points\n') nqpt = user_input try: nqpt = int(user_input) @@ -293,7 +295,7 @@ for iqpt in np.arange(1,nqpt+1): else: os.system('cp _ph0/'+prefix+'.q_'+str(iqpt)+'/'+prefix+'.dvscf save/'+prefix+'.dvscf_q'+label) os.system('rm _ph0/'+prefix+'.q_'+str(iqpt)+'/*wfc*' ) - + else: # Case with SOC if SOC == 'true': @@ -316,4 +318,3 @@ for iqpt in np.arange(1,nqpt+1): else: os.system('cp _ph0/'+prefix+'.q_'+str(iqpt)+'/'+prefix+'.dvscf1 save/'+prefix+'.dvscf_q'+label) os.system('rm _ph0/'+prefix+'.q_'+str(iqpt)+'/*wfc*' ) - diff --git a/EPW/bin/pp.py b/EPW/bin/pp.py index c353ee554..f61d7011d 100644 --- a/EPW/bin/pp.py +++ b/EPW/bin/pp.py @@ -1,4 +1,4 @@ -#!/usr/bin/python +#!/usr/bin/env python3 # # Post-processing script from of PH data in format used by EPW # 14/07/2015 - Creation of the script - Samuel Ponce diff --git a/EPW/examples/diamond/epw/meshes/kgen.py b/EPW/examples/diamond/epw/meshes/kgen.py index 3df9050b9..179533542 100644 --- a/EPW/examples/diamond/epw/meshes/kgen.py +++ b/EPW/examples/diamond/epw/meshes/kgen.py @@ -1,15 +1,16 @@ # # 14/07/2015 Samuel Ponce # +from __future__ import print_function import numpy as np -i=0 -for ii in np.arange(0.5,0.0,-1.0/200): - print str(ii)+' 0.0 0.0 '+str(1.0/201) - i +=1 +i = 0 +for ii in np.arange(0.5, 0.0, -1.0 / 200): + print('{0} 0.0 0.0 {1}'.format(ii, 1.0 / 201)) + i += 1 -for ii in np.arange(0.0,0.5+1.0/200,1.0/200): - print str(ii)+' '+str(ii)+' 0.0 '+str(1.0/201) - i +=1 +for ii in np.arange(0.0, 0.5 + 1.0 / 200, 1.0 / 200): + print('{0} {0} 0.0 {1}'.format(ii, 1.0 / 201)) + i += 1 -print i +print(i) diff --git a/EPW/examples/diamond/phonons/pp.py b/EPW/examples/diamond/phonons/pp.py index ca36eadc8..ae85d68c6 100755 --- a/EPW/examples/diamond/phonons/pp.py +++ b/EPW/examples/diamond/phonons/pp.py @@ -1,20 +1,19 @@ # -# Post-processing script QE --> EPW +# Post-processing script QE --> EPW # 14/07/2015 - Samuel Ponce # +from builtins import input import numpy as np import os -# Enter the number of irr. q-points -user_input = raw_input('Enter the prefix used for PH calculations (e.g. diam)\n') -prefix = str(user_input) +# Enter the number of irr. q-points +prefix = input('Enter the prefix used for PH calculations (e.g. diam)\n') -# Enter the number of irr. q-points -user_input = raw_input('Enter the number of irreducible q-points\n') -nqpt = user_input +# Enter the number of irr. q-points +nqpt = input('Enter the number of irreducible q-points\n') try: - nqpt = int(user_input) + nqpt = int(nqpt) except ValueError: raise Exception('The value you enter is not an integer!') @@ -30,4 +29,3 @@ for iqpt in np.arange(1,nqpt+1): else: os.system('cp _ph0/'+prefix+'.q_'+str(iqpt)+'/'+prefix+'.dvscf1 save/'+prefix+'.dvscf_q'+label) os.system('rm _ph0/'+prefix+'.q_'+str(iqpt)+'/*wfc*' ) - diff --git a/EPW/examples/gan/phonons/pp.py b/EPW/examples/gan/phonons/pp.py index ca36eadc8..ae85d68c6 100644 --- a/EPW/examples/gan/phonons/pp.py +++ b/EPW/examples/gan/phonons/pp.py @@ -1,20 +1,19 @@ # -# Post-processing script QE --> EPW +# Post-processing script QE --> EPW # 14/07/2015 - Samuel Ponce # +from builtins import input import numpy as np import os -# Enter the number of irr. q-points -user_input = raw_input('Enter the prefix used for PH calculations (e.g. diam)\n') -prefix = str(user_input) +# Enter the number of irr. q-points +prefix = input('Enter the prefix used for PH calculations (e.g. diam)\n') -# Enter the number of irr. q-points -user_input = raw_input('Enter the number of irreducible q-points\n') -nqpt = user_input +# Enter the number of irr. q-points +nqpt = input('Enter the number of irreducible q-points\n') try: - nqpt = int(user_input) + nqpt = int(nqpt) except ValueError: raise Exception('The value you enter is not an integer!') @@ -30,4 +29,3 @@ for iqpt in np.arange(1,nqpt+1): else: os.system('cp _ph0/'+prefix+'.q_'+str(iqpt)+'/'+prefix+'.dvscf1 save/'+prefix+'.dvscf_q'+label) os.system('rm _ph0/'+prefix+'.q_'+str(iqpt)+'/*wfc*' ) - diff --git a/EPW/examples/mgb2/phonons/pp.py b/EPW/examples/mgb2/phonons/pp.py index ca36eadc8..ae85d68c6 100755 --- a/EPW/examples/mgb2/phonons/pp.py +++ b/EPW/examples/mgb2/phonons/pp.py @@ -1,20 +1,19 @@ # -# Post-processing script QE --> EPW +# Post-processing script QE --> EPW # 14/07/2015 - Samuel Ponce # +from builtins import input import numpy as np import os -# Enter the number of irr. q-points -user_input = raw_input('Enter the prefix used for PH calculations (e.g. diam)\n') -prefix = str(user_input) +# Enter the number of irr. q-points +prefix = input('Enter the prefix used for PH calculations (e.g. diam)\n') -# Enter the number of irr. q-points -user_input = raw_input('Enter the number of irreducible q-points\n') -nqpt = user_input +# Enter the number of irr. q-points +nqpt = input('Enter the number of irreducible q-points\n') try: - nqpt = int(user_input) + nqpt = int(nqpt) except ValueError: raise Exception('The value you enter is not an integer!') @@ -30,4 +29,3 @@ for iqpt in np.arange(1,nqpt+1): else: os.system('cp _ph0/'+prefix+'.q_'+str(iqpt)+'/'+prefix+'.dvscf1 save/'+prefix+'.dvscf_q'+label) os.system('rm _ph0/'+prefix+'.q_'+str(iqpt)+'/*wfc*' ) - diff --git a/EPW/examples/pb/wSOC/phonons/pp.py b/EPW/examples/pb/wSOC/phonons/pp.py index ca36eadc8..ae85d68c6 100644 --- a/EPW/examples/pb/wSOC/phonons/pp.py +++ b/EPW/examples/pb/wSOC/phonons/pp.py @@ -1,20 +1,19 @@ # -# Post-processing script QE --> EPW +# Post-processing script QE --> EPW # 14/07/2015 - Samuel Ponce # +from builtins import input import numpy as np import os -# Enter the number of irr. q-points -user_input = raw_input('Enter the prefix used for PH calculations (e.g. diam)\n') -prefix = str(user_input) +# Enter the number of irr. q-points +prefix = input('Enter the prefix used for PH calculations (e.g. diam)\n') -# Enter the number of irr. q-points -user_input = raw_input('Enter the number of irreducible q-points\n') -nqpt = user_input +# Enter the number of irr. q-points +nqpt = input('Enter the number of irreducible q-points\n') try: - nqpt = int(user_input) + nqpt = int(nqpt) except ValueError: raise Exception('The value you enter is not an integer!') @@ -30,4 +29,3 @@ for iqpt in np.arange(1,nqpt+1): else: os.system('cp _ph0/'+prefix+'.q_'+str(iqpt)+'/'+prefix+'.dvscf1 save/'+prefix+'.dvscf_q'+label) os.system('rm _ph0/'+prefix+'.q_'+str(iqpt)+'/*wfc*' ) - diff --git a/EPW/examples/pb/woSOC/phonons/pp.py b/EPW/examples/pb/woSOC/phonons/pp.py index ca36eadc8..ae85d68c6 100644 --- a/EPW/examples/pb/woSOC/phonons/pp.py +++ b/EPW/examples/pb/woSOC/phonons/pp.py @@ -1,20 +1,19 @@ # -# Post-processing script QE --> EPW +# Post-processing script QE --> EPW # 14/07/2015 - Samuel Ponce # +from builtins import input import numpy as np import os -# Enter the number of irr. q-points -user_input = raw_input('Enter the prefix used for PH calculations (e.g. diam)\n') -prefix = str(user_input) +# Enter the number of irr. q-points +prefix = input('Enter the prefix used for PH calculations (e.g. diam)\n') -# Enter the number of irr. q-points -user_input = raw_input('Enter the number of irreducible q-points\n') -nqpt = user_input +# Enter the number of irr. q-points +nqpt = input('Enter the number of irreducible q-points\n') try: - nqpt = int(user_input) + nqpt = int(nqpt) except ValueError: raise Exception('The value you enter is not an integer!') @@ -30,4 +29,3 @@ for iqpt in np.arange(1,nqpt+1): else: os.system('cp _ph0/'+prefix+'.q_'+str(iqpt)+'/'+prefix+'.dvscf1 save/'+prefix+'.dvscf_q'+label) os.system('rm _ph0/'+prefix+'.q_'+str(iqpt)+'/*wfc*' ) - diff --git a/EPW/examples/sic/phonons/pp.py b/EPW/examples/sic/phonons/pp.py index ca36eadc8..ae85d68c6 100755 --- a/EPW/examples/sic/phonons/pp.py +++ b/EPW/examples/sic/phonons/pp.py @@ -1,20 +1,19 @@ # -# Post-processing script QE --> EPW +# Post-processing script QE --> EPW # 14/07/2015 - Samuel Ponce # +from builtins import input import numpy as np import os -# Enter the number of irr. q-points -user_input = raw_input('Enter the prefix used for PH calculations (e.g. diam)\n') -prefix = str(user_input) +# Enter the number of irr. q-points +prefix = input('Enter the prefix used for PH calculations (e.g. diam)\n') -# Enter the number of irr. q-points -user_input = raw_input('Enter the number of irreducible q-points\n') -nqpt = user_input +# Enter the number of irr. q-points +nqpt = input('Enter the number of irreducible q-points\n') try: - nqpt = int(user_input) + nqpt = int(nqpt) except ValueError: raise Exception('The value you enter is not an integer!') @@ -30,4 +29,3 @@ for iqpt in np.arange(1,nqpt+1): else: os.system('cp _ph0/'+prefix+'.q_'+str(iqpt)+'/'+prefix+'.dvscf1 save/'+prefix+'.dvscf_q'+label) os.system('rm _ph0/'+prefix+'.q_'+str(iqpt)+'/*wfc*' ) - diff --git a/FFTXlib/gen_test_params.py b/FFTXlib/gen_test_params.py index 9f6ff2e2d..6ebffbbfd 100644 --- a/FFTXlib/gen_test_params.py +++ b/FFTXlib/gen_test_params.py @@ -1,3 +1,4 @@ +from __future__ import print_function import re, sys info = """ diff --git a/LAXlib/cdiaghg.f90 b/LAXlib/cdiaghg.f90 index 06a3c7ffe..96a6c7fdf 100644 --- a/LAXlib/cdiaghg.f90 +++ b/LAXlib/cdiaghg.f90 @@ -215,9 +215,12 @@ SUBROUTINE laxlib_cdiaghg_gpu( n, m, h_d, s_d, ldh, e_d, v_d, me_bgrp, root_bgrp ! USE laxlib_parallel_include ! + ! NB: the flag below can be used to decouple LAXlib from devXlib. + ! This will make devXlib an optional dependency of LAXlib when + ! the library will be decoupled from QuantumESPRESSO. #define __USE_GLOBAL_BUFFER -#if defined(__USE_GLOBAL_BUFFER) - USE gbuffers, ONLY : dev=>dev_buf, pin=>pin_buf +#if defined(__USE_GLOBAL_BUFFER) && defined(__CUDA) + USE device_fbuff_m, ONLY : dev=>dev_buf, pin=>pin_buf #define VARTYPE POINTER #else #define VARTYPE ALLOCATABLE diff --git a/LAXlib/rdiaghg.f90 b/LAXlib/rdiaghg.f90 index 02b677223..d1bb904d5 100644 --- a/LAXlib/rdiaghg.f90 +++ b/LAXlib/rdiaghg.f90 @@ -200,9 +200,12 @@ SUBROUTINE laxlib_rdiaghg_gpu( n, m, h_d, s_d, ldh, e_d, v_d, me_bgrp, root_bgrp #endif #endif ! + ! NB: the flag below can be used to decouple LAXlib from devXlib. + ! This will make devXlib an optional dependency of LAXlib when + ! the library will be decoupled from QuantumESPRESSO. #define __USE_GLOBAL_BUFFER -#if defined(__USE_GLOBAL_BUFFER) - USE gbuffers, ONLY : dev=>dev_buf, pin=>pin_buf +#if defined(__USE_GLOBAL_BUFFER) && defined(__CUDA) + USE device_fbuff_m, ONLY : dev=>dev_buf, pin=>pin_buf #define VARTYPE POINTER #else #define VARTYPE ALLOCATABLE diff --git a/Modules/autopilot.f90 b/Modules/autopilot.f90 index 9c653d6c3..cd33538cc 100644 --- a/Modules/autopilot.f90 +++ b/Modules/autopilot.f90 @@ -437,6 +437,7 @@ CONTAINS integer :: event LOGICAL, EXTERNAL :: matches + LOGICAL :: new_event ! this is a temporary local variable @@ -546,13 +547,23 @@ CONTAINS ! Heres where it get interesting ! We may have a new event , or not! :) - IF ( ((event-1) .gt. 0) .and. ( now_step .lt. event_step(event-1)) ) THEN - IF( ionode ) write(*,*) ' AutoPilot: current input_line', input_line - CALL auto_error( ' AutoPilot ','Dynamic Rule Event Out of Order!') - go to 20 + IF ((event-1) .gt. 0) THEN + IF ( now_step .lt. event_step(event-1)) THEN + IF( ionode ) write(*,*) ' AutoPilot: current input_line', input_line + CALL auto_error( ' AutoPilot ','Dynamic Rule Event Out of Order!') + go to 20 + ENDIF ENDIF - IF ( (event .eq. 0) .or. ( now_step .gt. event_step(event)) ) THEN + IF (event .eq. 0) THEN + new_event = .true. + ELSEIF ( now_step .gt. event_step(event)) THEN + new_event = .true. + ELSE + new_event = .false. + ENDIF + + IF ( new_event ) THEN ! new event event = event + 1 @@ -601,14 +612,24 @@ CONTAINS ! We may have a new event , or not! :) - IF ( ((event-1) .gt. 0) .and. ( on_step .lt. event_step(event-1)) ) THEN - IF( ionode ) write(*,*) ' AutoPilot: current input_line', input_line - CALL auto_error( ' AutoPilot ','Dynamic Rule Event Out of Order!') - go to 20 + IF ( ((event-1) .gt. 0)) THEN + IF ( on_step .lt. event_step(event-1)) THEN + IF( ionode ) write(*,*) ' AutoPilot: current input_line', input_line + CALL auto_error( ' AutoPilot ','Dynamic Rule Event Out of Order!') + go to 20 + ENDIF ENDIF - IF ( (event .eq. 0) .or. (on_step .gt. event_step(event)) ) THEN + IF (event .eq. 0) THEN + new_event = .true. + ELSEIF (on_step .gt. event_step(event)) THEN + new_event = .true. + ELSE + new_event = .false. + ENDIF + + IF (new_event) THEN ! new event event = event + 1 IF (event > max_event_step) THEN diff --git a/PHonon/Doc/INPUT_POSTAHC.html b/PHonon/Doc/INPUT_POSTAHC.html new file mode 100644 index 000000000..52bd2565f --- /dev/null +++ b/PHonon/Doc/INPUT_POSTAHC.html @@ -0,0 +1,314 @@ + + + + + +postahc.x: input description + + + + + +
+

Input File Description

+

Program: + postahc.x / PWscf / Quantum Espresso (version: 6.6) +

+
+
+

TABLE OF CONTENTS

+
+ + +

INTRODUCTION

+

&INPUT

+
+ahc_dir | nk | nbnd | nat | nq | ahc_nbnd | ahc_nbndskip | flvec | eta | temp_kelvin | efermi | amass_amu | skip_upperfan | skip_dw +
+
+
+
+

INTRODUCTION

+
+Purpose of postahc.x:
+
+- Read the electron-phonon quantities calculated by ph.x with the
+electron_phonon='ahc' option.
+
+- Calculate the phonon-induced electron self-energy in the full matrix form
+at a given temperature.
+
+    Structure of the input data:
+========================================================================
+
+&INPUT
+   ...specs of namelist variables...
+/
+   
+
+ + + +

Namelist: &INPUT +

+ + + + + + + + + + +
ahc_dirCHARACTER
Status: REQUIRED +
+Directory where the binary files are located.
+         
+ + + + + + + + + + + +
nkINTEGER
Status: REQUIRED +
+Number of k points. Must be identical to that of the preceding SCF or NSCF run.
+         
+ + + + + + + + + + + +
nbndINTEGER
Status: REQUIRED +
+Number of bands. Must be identical to nbnd of the preceding SCF or NSCF run.
+         
+ + + + + + + + + + + +
natINTEGER
Status: REQUIRED +
+Number of atoms. Must be identical to nat of the preceding pw.x and ph.x
+runs.
+         
+ + + + + + + + + + + +
nqINTEGER
Status: REQUIRED +
+Number of q points. Must be identical to that of the preceding ph.x run
+with electron_phonon='ahc'.
+         
+ + + + + + + + + + + +
ahc_nbndINTEGER
Status: REQUIRED +
+Number of bands for which the electron self-energy is to be computed. Must be
+identical to ahc_nbnd of the ph.x run with electron_phonon='ahc'.
+         
+ + + + + + + + + + + +
ahc_nbndskipINTEGER
Default: 0 +
+Number of bands to exclude when computing the self-energy. Must be identical to
+ahc_nbndskip of the ph.x run with electron_phonon='ahc'.
+         
+ + + + + + + + + + + +
flvecCHARACTER
Status: REQUIRED +
+File containing the normalized phonon displacements written by matdyn.x.
+         
+ + + + + + + + + + + +
etaREAL
Status: REQUIRED +
+Magnitude of the small imaginary component included to smooth the energy
+denominators, in Ry.
+         
+ + + + + + + + + + + +
temp_kelvinREAL
Status: REQUIRED +
+Temperature in Kelvins at which the electron self-energy is calculated.
+         
+ + + + + + + + + + + +
efermiREAL
Status: REQUIRED +
+Fermi energy of the electrons in Ry.
+         
+ + + + + + + + + + + +
amass_amu(i), i=1,natREAL
Status: REQUIRED +
+Mass for each atom in atomic mass unit. In postahc.x, amass_amu must be
+set for each atom, not for each atom type as in other programs.
+         
+ + + + + + + + + + + +
skip_upperfanLOGICAL
Default: .false. +
+If .true., skip calculation of the upper Fan self-energy.
+If .false., ahc_upfan_iq#.bin files must be present in ahc_dir.
+         
+ + + + + + + + + + + +
skip_dwLOGICAL
Default: .false. +
+If .true., skip calculation of the Debye-Waller self-energy.
+If .false., ahc_dw.bin file must be present in ahc_dir.
+         
+ +
+
+ + This file has been created by helpdoc utility on Tue Oct 06 22:11:45 CEST 2020. + + + diff --git a/PHonon/Doc/INPUT_POSTAHC.txt b/PHonon/Doc/INPUT_POSTAHC.txt new file mode 100644 index 000000000..742529169 --- /dev/null +++ b/PHonon/Doc/INPUT_POSTAHC.txt @@ -0,0 +1,153 @@ +*** FILE AUTOMATICALLY CREATED: DO NOT EDIT, CHANGES WILL BE LOST *** + +------------------------------------------------------------------------ +INPUT FILE DESCRIPTION + +Program: postahc.x / PWscf / Quantum Espresso (version: 6.6) +------------------------------------------------------------------------ + + +Purpose of postahc.x: + +- Read the electron-phonon quantities calculated by ph.x with the +electron_phonon='ahc' option. + +- Calculate the phonon-induced electron self-energy in the full matrix form +at a given temperature. + + Structure of the input data: +======================================================================== + +&INPUT + ...specs of namelist variables... +/ + + + +======================================================================== +NAMELIST: &INPUT + + +-------------------------------------------------------------------- + Variable: ahc_dir + + Type: CHARACTER + Status: REQUIRED + Description: Directory where the binary files are located. + +-------------------------------------------------------------------- + + +-------------------------------------------------------------------- + Variable: nk + + Type: INTEGER + Status: REQUIRED + Description: Number of k points. Must be identical to that of the preceding SCF or NSCF run. + +-------------------------------------------------------------------- + + +-------------------------------------------------------------------- + Variable: nbnd + + Type: INTEGER + Status: REQUIRED + Description: Number of bands. Must be identical to nbnd of the preceding SCF or NSCF run. + +-------------------------------------------------------------------- + + +-------------------------------------------------------------------- + Variable: nat + + Type: INTEGER + Status: REQUIRED + Description: Number of atoms. Must be identical to nat of the preceding pw.x and ph.x + runs. + +-------------------------------------------------------------------- + + +-------------------------------------------------------------------- + Variable: nq + + Type: INTEGER + Status: REQUIRED + Description: Number of q points. Must be identical to that of the preceding ph.x run + with electron_phonon='ahc'. + +-------------------------------------------------------------------- + + +-------------------------------------------------------------------- + Variable: ahc_nbnd + + Type: INTEGER + Status: REQUIRED + Description: Number of bands for which the electron self-energy is to be computed. Must be + identical to ahc_nbnd of the ph.x run with electron_phonon='ahc'. + +-------------------------------------------------------------------- + + +-------------------------------------------------------------------- + Variable: ahc_nbndskip + + Type: INTEGER + Default: 0 + Description: Number of bands to exclude when computing the self-energy. Must be identical to + ahc_nbndskip of the ph.x run with electron_phonon='ahc'. + +-------------------------------------------------------------------- + + +-------------------------------------------------------------------- + Variable: flvec + + Type: CHARACTER + Status: REQUIRED + Description: File containing the normalized phonon displacements written by matdyn.x. + +-------------------------------------------------------------------- + + +-------------------------------------------------------------------- + Variable: eta + + Type: REAL + Status: REQUIRED + Description: Magnitude of the small imaginary component included to smooth the energy + denominators, in Ry. + +-------------------------------------------------------------------- + + +-------------------------------------------------------------------- + Variable: temp_kelvin + + Type: REAL + Status: REQUIRED + Description: Temperature in Kelvins at which the electron self-energy is calculated. + +-------------------------------------------------------------------- + + +-------------------------------------------------------------------- + Variable: efermi + + Type: REAL + Status: REQUIRED + Description: Fermi energy of the electrons in Ry. + +-------------------------------------------------------------------- + + +-------------------------------------------------------------------- + Variable: amass_amu(i), i=1,nat + + Type: REAL + Status: REQUIRED + Description: Mass for each atom in atomic mass unit. In postahc.x, "amass_amu" must be + set for each atom, not for each atom type as in other programs. + +-------------------------------------------------------------------- + + +-------------------------------------------------------------------- + Variable: skip_upperfan + + Type: LOGICAL + Default: .false. + Description: If .true., skip calculation of the upper Fan self-energy. + If .false., ahc_upfan_iq#.bin files must be present in "ahc_dir". + +-------------------------------------------------------------------- + + +-------------------------------------------------------------------- + Variable: skip_dw + + Type: LOGICAL + Default: .false. + Description: If .true., skip calculation of the Debye-Waller self-energy. + If .false., ahc_dw.bin file must be present in "ahc_dir". + +-------------------------------------------------------------------- + +===END OF NAMELIST====================================================== + + +This file has been created by helpdoc utility on Tue Oct 06 22:11:45 CEST 2020 diff --git a/PHonon/Doc/developer_man.pdf b/PHonon/Doc/developer_man.pdf index ce1f6edc4..3160f3dad 100644 Binary files a/PHonon/Doc/developer_man.pdf and b/PHonon/Doc/developer_man.pdf differ diff --git a/PHonon/Doc/dfpt_self_energy.pdf b/PHonon/Doc/dfpt_self_energy.pdf new file mode 100644 index 000000000..2983a5d65 Binary files /dev/null and b/PHonon/Doc/dfpt_self_energy.pdf differ diff --git a/PHonon/Doc/user_guide.pdf b/PHonon/Doc/user_guide.pdf index 35f7202b7..208ac3eb9 100644 Binary files a/PHonon/Doc/user_guide.pdf and b/PHonon/Doc/user_guide.pdf differ diff --git a/PP/src/vasp_xml_module.f90 b/PP/src/vasp_xml_module.f90 index 2fec3d0db..c5490ce02 100644 --- a/PP/src/vasp_xml_module.f90 +++ b/PP/src/vasp_xml_module.f90 @@ -102,7 +102,6 @@ SUBROUTINE readxmlfile_vasp(iexch,icorr,igcx,igcc,inlc,ierr) USE klist, ONLY : nkstot, nks, xk, wk USE lsda_mod, ONLY : lsda, nspin, current_spin, isk USE wvfct, ONLY : nbnd, nbndx, et, wg - USE symm_base, ONLY : irt, d1, d2, d3, checkallsym, nsym USE extfield, ONLY : forcefield, tefield, gate, forcegate USE cellmd, ONLY : cell_factor, lmovecell USE fft_base, ONLY : dfftp @@ -916,7 +915,6 @@ END SUBROUTINE vasp_init_vars_from_schema USE constants, ONLY : e2 USE cell_base, ONLY : at, bg, alat, omega, cell_base_init USE ions_base, ONLY : nat, nsp - USE symm_base, ONLY : nsym USE gvect, ONLY : ngm_g, ecutrho USE fft_base, ONLY : dfftp USE gvecs, ONLY : ngms_g, dual @@ -1001,7 +999,6 @@ END SUBROUTINE vasp_init_vars_from_schema USE constants, ONLY : e2, ANGSTROM_AU USE cell_base, ONLY : at, alat, omega USE ions_base, ONLY : nat, nsp, ityp, tau, zv, atm - USE symm_base, ONLY : nsym USE gvect, ONLY : ngm_g, ecutrho USE fft_base, ONLY : dfftp USE gvecs, ONLY : ngms_g, dual @@ -1050,7 +1047,6 @@ END SUBROUTINE vasp_init_vars_from_schema USE constants, ONLY : e2 USE cell_base, ONLY : at, alat, omega USE ions_base, ONLY : nat, nsp, ityp, tau, atm - USE symm_base, ONLY : nsym USE gvect, ONLY : ngm_g, ecutrho USE fft_base, ONLY : dfftp USE gvecs, ONLY : ngms_g, dual diff --git a/PP/tools/sum_states.py b/PP/tools/sum_states.py index 2db5528dd..7996def57 100755 --- a/PP/tools/sum_states.py +++ b/PP/tools/sum_states.py @@ -1,4 +1,4 @@ -#! /usr/bin/python +#!/usr/bin/env python3 ###### SUM STATES ####### # Python script for summing and ploting the data from the Density Of States @@ -31,17 +31,17 @@ # ni.pdos_atm#1\(Ni\)_wfc#2\(d\) -t "Example PP/02" -xr -6 2 # # -# The procedure for obtaining the DOS files is explained +# The procedure for obtaining the DOS files is explained # i.e. in (espresso-dir)/PP/examples/example02/ -# +# # Author: Dr. Julen Larrucea # University of Bremen, # Bremen Centre for Computational Materials Science, HMI Group # julenl [at] gmail.com or larrucea [at] hmi.uni-bremen.de # -# This file is distributed under the terms of the GNU General Public +# 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, +# in the root directory of the present distribution, # or http://www.gnu.org/copyleft/gpl.txt . ####################### @@ -60,7 +60,7 @@ min_y,max_y="","" output_file_name="sum_dos.out" prt="no" -print " #### sum_states.py version "+str(version)+" #### " +print(" #### sum_states.py version {} #### ".format(version)) # Check if X11, mathplotlib and gnuplot are available @@ -89,14 +89,14 @@ if len(sys.argv)>1: if option=="t": graphtitle= sys.argv[sys.argv.index('-t')+1] if option=="xr": - min_x,max_x= float(sys.argv[sys.argv.index('-xr')+1]),float(sys.argv[sys.argv.index('-xr')+2]) + min_x,max_x= float(sys.argv[sys.argv.index('-xr')+1]),float(sys.argv[sys.argv.index('-xr')+2]) if option=="yr": - min_y,max_y= float(sys.argv[sys.argv.index('-yr')+1]),float(sys.argv[sys.argv.index('-yr')+2]) + min_y,max_y= float(sys.argv[sys.argv.index('-yr')+1]),float(sys.argv[sys.argv.index('-yr')+2]) if option=="v": - print "sum_dos.py version: "+version + print("sum_dos.py version:", version) sys.exit() if option=="h": - print ''' + print(''' -o QE output file name (for grepping Fermi E) -s Selection of atoms for summing the DOSes. "*" for all, *1*Fe*d* for first Fe atom " (def. "*") -p Print output to a file and aditionaly provide an output name (def. no output and "sum_dos.out") @@ -105,8 +105,8 @@ if len(sys.argv)>1: -yr set min and max y value for the axes in the graph -h print this help -v print version - Example: sum_states.py --s sys.pdos_atm#4\(Fe2\)_wfc#2\(d\) -t "Wustite LDA+U single Fe" -xr -9 4 - ''' + Example: sum_states.py --s sys.pdos_atm#4\(Fe2\)_wfc#2\(d\) -t "Wustite LDA+U single Fe" -xr -9 4 + ''') sys.exit() @@ -116,13 +116,13 @@ if len(os.popen('echo $DISPLAY').read()) > 1: try: from pylab import * mplplot="yes" - print "pylab imported" + print("pylab imported") except: - print "There is no mathplotlib installed. Using gnuplot." + print("There is no mathplotlib installed. Using gnuplot.") mplplot="no" prt="yes" else: - print "No X11. Trying to plot on terminal" + print("No X11. Trying to plot on terminal") graphic_plot="no" if prog_gnuplot=="no": prt="yes" @@ -132,7 +132,7 @@ else: if pwout == "": for filen in filter(os.path.isfile, os.listdir('.')): if "Program PWSCF" in linecache.getline(filen, 2): - print "Using " + filen + " as pw.x output. You can specify another one with the -o option." + print("Using " + filen + " as pw.x output. You can specify another one with the -o option.") pwout=filen # Parse Fermi energy from the pw.x output @@ -140,35 +140,32 @@ if pwout!="": try: os.popen("grep -a 'the Fermi energy is' "+pwout ).read() fermi=float(os.popen("grep -a 'the Fermi energy is' "+pwout ).read().split()[4]) - print "Fermi energy = ", fermi, "a.u." + print("Fermi energy = ", fermi, "a.u.") except: - print "WARNING: No Fermi energy found. Using 0 e.V. instead" + print("WARNING: No Fermi energy found. Using 0 e.V. instead") fermi=0 else: - print "WARNING: No pw.x output found. Using E Fermi = 0 e.V." + print("WARNING: No pw.x output found. Using E Fermi = 0 e.V.") fermi=0 -# List of all DOS files to add +# List of all DOS files to add dosfiles=[] for dfile in os.listdir('.'): if fnmatch.fnmatch(dfile, selat): - dosfiles.append(dfile) + dosfiles.append(dfile) if len(dosfiles)==0: - print "ERROR: Provide a (list of) valid DOS file(s)" + print("ERROR: Provide a (list of) valid DOS file(s)") sys.exit() -print "dosfiles list: ", -for dosfile in dosfiles: - print dosfile, -print "" +print("dosfiles list:", " ".join(dosfiles)) # Check wetter we have k-solved DOS if open(dosfiles[0],'r').readline().split()[1]=="E": ksolved="no" - print "no ksolved" + print("no ksolved") elif open(dosfiles[0],'r').readline().split()[1]=="ik": ksolved="yes" - print "ksolved" + print("ksolved") # Sum over all k-points and files mat=[] # matrix with total sum of ldos @@ -191,28 +188,28 @@ for i in range(len(dosfiles)): elif ik == k and k > 1: oldmat.append([float(line.split()[1]),float(line.split()[2]),float(line.split()[3])]) elif len(line) < 5 and k > 1: #if blank line, sum k-frame to the total - for j in range(len(oldmat)): + for j in range(len(oldmat)): mati[j]=[mati[j][0],mati[j][1]+oldmat[j][1],mati[j][2]+oldmat[j][2]] if mat == []: # if it is the first dos file, copy total matrix (mat) = the first dos files's data mat=mati[:] else: for j in range(len(mati)): # if it is not the first file, sum values - mat[j]=[mat[j][0],mat[j][1]+mati[j][1],mat[j][2]+mati[j][2]] + mat[j]=[mat[j][0],mat[j][1]+mati[j][1],mat[j][2]+mati[j][2]] -print "...ploting..." +print("...ploting...") if prt=="yes": out=open(output_file_name,"w") -x,y1,y2=[],[],[] +x,y1,y2=[],[],[] for i in mat: x.append(i[0]-fermi) y1.append(i[1]) y2.append(-i[2]) if prt=="yes": # print to a file - print>>out, i[0]-fermi, i[1], i[2] + print(i[0] - fermi, i[1], i[2], file=out) if prt=="yes": out.close() @@ -222,7 +219,7 @@ if graphic_plot=="yes": if mplplot=="yes": plot(x,y1,linewidth=1.0) plot(x,y2,linewidth=1.0) - print min(y2),max(y1) + print(min(y2), max(y1)) plt.title(graphtitle) plt.xlabel('E (eV)') plt.ylabel('States') @@ -231,15 +228,13 @@ if graphic_plot=="yes": plt.fill(x,y1,color='0.8') plt.fill(x,y2,color='0.9') if min_x and max_x: - fromx,tox=min_x,max_x + fromx, tox = min_x, max_x plt.axis([fromx, tox, min(y2), max(y1)]) - show() + show() elif mplplot=="no" and prog_gnuplot=="yes": # If no mathplotlib available, use gnuplot - os.system("echo \"plot '"+ output_file_name + "' using ($1-"+str(fermi)+"):2 w l, '' u ($1"+str(fermi)+"):3 w l\" | gnuplot -persist") + os.system("""echo "plot '{0}' using ($1-{1}):2 w l, '' u ($1-{1}):3 w l" | gnuplot -persist""".format( + output_file_name, fermi)) elif graphic_plot=="no": # If no X forwarding available, show graph in terminal if prog_gnuplot=="yes": - os.system("echo \"set terminal dumb; plot '"+ output_file_name + "' using ($1-"+str(fermi)+"):2 w l, '' u ($1-"+str(fermi)+"):3 w l\" | gnuplot -persist") - - - - + os.system("""echo "set terminal dumb; plot '{0}' using ($1-{1}):2 w l, '' u ($1-{1}):3 w l" | gnuplot -persist""".format( + output_file_name, fermi)) diff --git a/PW/src/move_ions.f90 b/PW/src/move_ions.f90 index fad57d5e9..0f5fd7d8f 100644 --- a/PW/src/move_ions.f90 +++ b/PW/src/move_ions.f90 @@ -327,6 +327,8 @@ SUBROUTINE move_ions( idone, ions_status ) ! ! ... before leaving check that the new positions still transform ! ... according to the symmetry of the system. + ! ... FIXME: should be done in all cases, not just for vc-md + ! ... FIXME 2: why not impose symmetry instead of just checking it? ! CALL checkallsym( nat, tau, ityp) ! diff --git a/PW/src/nsg_adj.f90 b/PW/src/nsg_adj.f90 index ab14a777d..f9cfdfc0d 100644 --- a/PW/src/nsg_adj.f90 +++ b/PW/src/nsg_adj.f90 @@ -15,23 +15,17 @@ SUBROUTINE nsg_adj ! USE kinds, ONLY : DP USE ions_base, ONLY : nat, ntyp => nsp, ityp - USE ldaU, ONLY : Hubbard_lmax, Hubbard_l, Hubbard_U, starting_ns, & - Hubbard_l_back, Hubbard_U_back, starting_ns_back, ldim_u, & - nsg, nsgnew - USE scf, ONLY : rho + USE ldaU, ONLY : Hubbard_lmax, Hubbard_l, starting_ns, & + nsgnew, neighood, is_hubbard USE lsda_mod, ONLY : nspin - USE noncollin_module, ONLY : noncolin, npol USE io_global, ONLY : stdout IMPLICIT NONE ! INTEGER, PARAMETER :: ldmx = 7 - INTEGER :: na, nt, is, m1, m2, majs, mins, adjs, mol(ldmx), & - nel, i, j, l, index(ldmx), viz, ldim - REAL(DP) :: totoc, delta,lambda(ldmx) + INTEGER :: na, na1, nt, is, m1, m2, i, viz, ldim + REAL(DP) :: lambda(ldmx) COMPLEX(DP) :: vet(ldmx,ldmx), f(ldmx,ldmx), temp - LOGICAL :: adjust - INTEGER, EXTERNAL :: find_viz ! IF (ALL(starting_ns == -1.d0)) RETURN ! @@ -43,20 +37,27 @@ SUBROUTINE nsg_adj ! nt = ityp(na) ! - ldim = 2*Hubbard_l(nt) + 1 - ! - viz = find_viz(na,na) - ! - IF (ldim_u(nt).GT.0) THEN + IF (is_hubbard(nt)) THEN + ! + ldim = 2*Hubbard_l(nt) + 1 ! DO is = 1, nspin ! - DO m1 = 1, ldim - DO m2 = 1, ldim - f(m1,m2) = nsgnew(na,m1,viz,m2,is) - ENDDO + DO viz = 1, neighood(na)%num_neigh + na1 = neighood(na)%neigh(viz) + IF (na1.EQ.na) THEN + f(:,:) = (0.d0, 0.d0) + DO m1 = 1, ldim + DO m2 = 1, ldim + f(m1,m2) = nsgnew(m2,m1,viz,na,is) + ENDDO + ENDDO + GO TO 7 + ENDIF ENDDO ! +7 CONTINUE + ! CALL cdiagh(ldim, f, ldmx, lambda, vet) ! DO i = 1, ldim @@ -69,8 +70,8 @@ SUBROUTINE nsg_adj DO i = 1,ldim temp = temp + CONJG(vet(m1,i))*lambda(i)*vet(m2,i) ENDDO - nsgnew(na,m1,viz,m2,is) = DBLE(temp) - nsgnew(na,m2,viz,m1,is) = nsgnew(na,m1,viz,m2,is) + nsgnew(m2,m1,viz,na,is) = DBLE(temp) + nsgnew(m1,m2,viz,na,is) = nsgnew(m2,m1,viz,na,is) ENDDO ENDDO ! @@ -80,6 +81,9 @@ SUBROUTINE nsg_adj ! ENDDO ! + ! Uncomment the line below if needed (useful for debugging purposes) + !CALL write_nsg + ! RETURN ! END SUBROUTINE nsg_adj diff --git a/PW/src/pw_restart_new.f90 b/PW/src/pw_restart_new.f90 index bb7d5bc36..3cb25563c 100644 --- a/PW/src/pw_restart_new.f90 +++ b/PW/src/pw_restart_new.f90 @@ -1168,8 +1168,8 @@ MODULE pw_restart_new time_reversal = (.NOT.magnetic_sym) .AND. (.NOT.noinv) CALL inverse_s() CALL s_axis_to_cart() - !! symmetry check - FIXME: is this needed? - IF (nat > 0) CALL checkallsym( nat, tau, ityp) + !! symmetry check - FIXME: must be done in a more consistent way + !! IF (nat > 0) CALL checkallsym( nat, tau, ityp) !! Algorithmic info do_cutoff_2D = (output_obj%boundary_conditions%assume_isolated == "2D") CALL qexsd_copy_algorithmic_info ( output_obj%algorithmic_info, & diff --git a/PW/src/run_pwscf.f90 b/PW/src/run_pwscf.f90 index 744eaa082..d802bd10b 100644 --- a/PW/src/run_pwscf.f90 +++ b/PW/src/run_pwscf.f90 @@ -1,5 +1,5 @@ ! -! Copyright (C) 2013-2017 Quantum ESPRESSO group +! Copyright (C) 2013-2020 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, @@ -33,6 +33,8 @@ SUBROUTINE run_pwscf( exit_status ) !! @endnote !! ! + USE kinds, ONLY : DP + USE mp, ONLY : mp_bcast, mp_sum USE io_global, ONLY : stdout, ionode, ionode_id USE parameters, ONLY : ntypx, npk USE upf_params, ONLY : lmaxx @@ -53,6 +55,7 @@ SUBROUTINE run_pwscf( exit_status ) USE qexsd_module, ONLY : qexsd_set_status USE funct, ONLY : dft_is_hybrid, stop_exx USE beef, ONLY : beef_energies + USE ldaU, ONLY : lda_plus_u ! USE gbuffers, ONLY : dev_buf ! @@ -233,8 +236,13 @@ SUBROUTINE run_pwscf( exit_status ) ! lbfgs=.FALSE.; lmd=.FALSE. WRITE( UNIT = stdout, FMT=9020 ) + ! CALL reset_gvectors( ) ! + ! ... read atomic occupations for DFT+U(+V) + ! + IF ( lda_plus_u ) CALL read_ns() + ! ELSE IF ( ions_status == 2 ) THEN ! ! ... check whether nonzero magnetization is real diff --git a/PW/src/write_ns.f90 b/PW/src/write_ns.f90 index 374d82cb5..e4ea699ad 100644 --- a/PW/src/write_ns.f90 +++ b/PW/src/write_ns.f90 @@ -671,3 +671,94 @@ SUBROUTINE write_nsg ! END SUBROUTINE write_nsg +!----------------------------------------------------------------------- +SUBROUTINE read_ns() + !--------------------------------------------------------------------- + ! + ! This routine was written for the final SCF after vc-relax (M. Cococcioni). + ! The occupations ns/nsg also need to be read in order to reproduce + ! the right electronic ground state. When using Hubbard corrections + ! this might be different (i.e. have different ordering of states) + ! from that simply obtained from the superposition of free ions. + ! In other words the KS Hamiltonian (and its ground state) is also + ! functional of the Hubbard interaction parameters. + ! + USE kinds, ONLY : DP + USE mp, ONLY : mp_bcast + USE mp_images, ONLY : intra_image_comm + USE io_global, ONLY : ionode, ionode_id + USE scf, ONLY : rho, v + USE ldaU, ONLY : lda_plus_u_kind, nsg, v_nsg, hub_back + USE noncollin_module, ONLY : noncolin + USE io_files, ONLY : restart_dir + ! + IMPLICIT NONE + INTEGER :: iunocc, iunocc1, ierr + CHARACTER (LEN=256) :: dirname + REAL(DP) :: eth, eth1 + ! + dirname = restart_dir() + ! + IF ( ionode ) THEN + ! + OPEN ( NEWUNIT=iunocc, FILE = TRIM(dirname) // 'occup.txt', & + FORM='formatted', STATUS='old', IOSTAT=ierr ) + IF (lda_plus_u_kind.EQ.0) THEN + READ( UNIT = iunocc, FMT = *, iostat = ierr ) rho%ns + IF (hub_back) THEN + READ( UNIT = iunocc, FMT = * , iostat = ierr) rho%nsb + ENDIF + ELSEIF (lda_plus_u_kind.EQ.1) THEN + IF (noncolin) THEN + READ( UNIT = iunocc, FMT = *, iostat = ierr ) rho%ns_nc + ELSE + READ( UNIT = iunocc, FMT = *, iostat = ierr ) rho%ns + ENDIF + ELSEIF (lda_plus_u_kind.EQ.2) THEN + READ( UNIT = iunocc, FMT = * , iostat = ierr) nsg + ENDIF + CLOSE(UNIT=iunocc,STATUS='keep') + ! + ELSE + ! + IF (lda_plus_u_kind.EQ.0) THEN + rho%ns(:,:,:,:) = 0.D0 + IF (hub_back) rho%nsb(:,:,:,:) = 0.D0 + ELSEIF (lda_plus_u_kind.EQ.1) THEN + IF (noncolin) THEN + rho%ns_nc(:,:,:,:) = 0.D0 + ELSE + rho%ns(:,:,:,:) = 0.D0 + ENDIF + ELSEIF (lda_plus_u_kind.EQ.2) THEN + nsg(:,:,:,:,:) = (0.d0, 0.d0) + ENDIF + ! + ENDIF + ! + CALL mp_bcast( ierr, ionode_id, intra_image_comm ) + ! + IF (lda_plus_u_kind.EQ.0) THEN + CALL mp_bcast(rho%ns, ionode_id, intra_image_comm) + CALL v_hubbard (rho%ns, v%ns, eth) + IF (hub_back) THEN + CALL mp_bcast(rho%nsb, ionode_id, intra_image_comm) + CALL v_hubbard_b (rho%nsb, v%nsb, eth1) + eth = eth + eth1 + ENDIF + ELSEIF (lda_plus_u_kind.EQ.1) THEN + IF (noncolin) THEN + CALL mp_bcast(rho%ns_nc, ionode_id, intra_image_comm) + CALL v_hubbard_full_nc (rho%ns_nc, v%ns_nc, eth) + ELSE + CALL mp_bcast(rho%ns, ionode_id, intra_image_comm) + CALL v_hubbard_full (rho%ns, v%ns, eth) + ENDIF + ELSEIF (lda_plus_u_kind.EQ.2) THEN + CALL mp_bcast(nsg, ionode_id, intra_image_comm) + CALL v_hubbard_extended (nsg, v_nsg, eth) + ENDIF + ! + RETURN + ! +END SUBROUTINE read_ns diff --git a/PW/tools/xsf2pwi.sh b/PW/tools/xsf2pwi.sh old mode 100644 new mode 100755 diff --git a/UtilXlib/tests/compile_and_run_tests.sh b/UtilXlib/tests/compile_and_run_tests.sh old mode 100644 new mode 100755 diff --git a/cmake/FindELPA.cmake b/cmake/FindELPA.cmake index 1e308a734..7915f66ec 100644 --- a/cmake/FindELPA.cmake +++ b/cmake/FindELPA.cmake @@ -198,6 +198,10 @@ if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT ELPA_FOUND) OR NAMES elpa.h HINTS ${ELPA_DIR} PATH_SUFFIXES "include" "include/elpa") + if(NOT ELPA_elpa.h_DIRS) + file(GLOB ELPA_elpa.h_PATH "${ELPA_DIR}/include/elpa-20*/elpa/elpa.h") + get_filename_component(ELPA_elpa.h_DIRS "${ELPA_elpa.h_PATH}" PATH) + endif() else() set(ELPA_elpa.h_DIRS "ELPA_elpa.h_DIRS-NOTFOUND") find_path(ELPA_elpa.h_DIRS @@ -210,6 +214,7 @@ if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT ELPA_FOUND) OR # If found, add path to cmake variable # ------------------------------------ if (ELPA_elpa.h_DIRS) + message(STATUS "elpa.h found in ${ELPA_elpa.h_DIRS}") set(ELPA_INCLUDE_DIRS "${ELPA_elpa.h_DIRS}") else () set(ELPA_INCLUDE_DIRS "ELPA_INCLUDE_DIRS-NOTFOUND") @@ -218,6 +223,12 @@ if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT ELPA_FOUND) OR endif() endif() + # If not defined, guess the version string + if(NOT ELPA_VERSION_STRING) + string(REGEX MATCH "elpa-20[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9][0-9]" CMAKE_MATCH_ELPA_VER "${ELPA_INCLUDE_DIRS}") + string(REGEX MATCH "20[0-9][0-9]\.[0-9][0-9]\.[0-9][0-9][0-9]" ELPA_VERSION_STRING "${CMAKE_MATCH_ELPA_VER}") + message(STATUS "ELPA version ${ELPA_VERSION_STRING}") + endif() # Looking for lib # --------------- @@ -354,7 +365,12 @@ if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT ELPA_FOUND) OR # test link unset(ELPA_WORKS CACHE) include(CheckFunctionExists) - check_function_exists(elpa_dgetrf ELPA_WORKS) + if(ELPA_VERSION_STRING AND ELPA_VERSION_STRING VERSION_LESS "2017") + set(ELPA_TEST_FUNCTION get_elpa_row_col_comms) + else() + set(ELPA_TEST_FUNCTION elpa_init) + endif() + check_function_exists(${ELPA_TEST_FUNCTION} ELPA_WORKS) mark_as_advanced(ELPA_WORKS) if(ELPA_WORKS) @@ -368,7 +384,7 @@ if( (NOT PKG_CONFIG_EXECUTABLE) OR (PKG_CONFIG_EXECUTABLE AND NOT ELPA_FOUND) OR list(REMOVE_DUPLICATES ELPA_LINKER_FLAGS) else() if(NOT ELPA_FIND_QUIETLY) - message(STATUS "Looking for elpa : test of elpa_dgetrf with + message(STATUS "Looking for elpa : test of ${ELPA_TEST_FUNCTION} with elpa, cblas, cuda and lapack libraries fails") message(STATUS "CMAKE_REQUIRED_LIBRARIES: ${CMAKE_REQUIRED_LIBRARIES}") message(STATUS "CMAKE_REQUIRED_INCLUDES: ${CMAKE_REQUIRED_INCLUDES}") @@ -413,4 +429,4 @@ else() find_package_handle_standard_args(ELPA DEFAULT_MSG ELPA_LIBRARIES ELPA_WORKS) -endif() \ No newline at end of file +endif() diff --git a/cmake/FindSCALAPACK.cmake b/cmake/FindSCALAPACK.cmake index a09901b70..7a6f2cdbc 100644 --- a/cmake/FindSCALAPACK.cmake +++ b/cmake/FindSCALAPACK.cmake @@ -400,6 +400,19 @@ if(BLAS_FOUND endif() # Then try the search libs foreach(IT ${SCALAPACK_SEARCH_LIBS}) + # First try mkl_blacs_openmpi (OpenMPI derived) + if(NOT ${_LIBRARIES}) + check_scalapack_libraries( + ${_LIBRARIES} + BLAS + ${SCALAPACK_mkl_SEARCH_SYMBOL} + "" + "${IT};mkl_blacs_openmpi_lp64" + "${_BLAS_LIBRARIES}" + "" + "${MPI_Fortran_LIBRARIES}") + endif() + # First try mkl_blacs_intelmpi (MPICH derived) if(NOT ${_LIBRARIES}) check_scalapack_libraries( ${_LIBRARIES} diff --git a/cmake/FindVENDOR.cmake b/cmake/FindVENDOR.cmake index 0173a0796..c6cce5010 100644 --- a/cmake/FindVENDOR.cmake +++ b/cmake/FindVENDOR.cmake @@ -738,6 +738,7 @@ if(NOT FFTW_INCLUDE_DIRS) list(APPEND _libdirs "${_libdir}/include") get_filename_component(_libdir ${_libdir} PATH) list(APPEND _libdirs "${_libdir}/include") + unset(_libdir) endif() endforeach() diff --git a/cmake/GNUFortranCompiler.cmake b/cmake/GNUFortranCompiler.cmake new file mode 100644 index 000000000..87cd67a58 --- /dev/null +++ b/cmake/GNUFortranCompiler.cmake @@ -0,0 +1,8 @@ +# Check compiler version +if(CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 4.9) + message(FATAL_ERROR "Requires GCC 4.9 or higher ") +endif() + +if(CMAKE_Fortran_COMPILER_VERSION VERSION_GREATER_EQUAL 10.0) + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fallow-argument-mismatch") +endif() diff --git a/dev-tools/get_device_props.py b/dev-tools/get_device_props.py index 4b26da941..dd3790a7e 100644 --- a/dev-tools/get_device_props.py +++ b/dev-tools/get_device_props.py @@ -1,20 +1,25 @@ +from __future__ import print_function import sys import subprocess as sp have_yaml = True try: import yaml -except: - have_yaml = False - -try: - from StringIO import StringIO except ImportError: - from io import BytesIO as StringIO + have_yaml = False + +try: + from io import StringIO +except ImportError: + try: + from StringIO import StringIO + except ImportError: + from io import BytesIO as StringIO + print("\n\n This is a helper tool to check the details of your GPU before configuring QE.\n\n") -print("""Remeber to load CUDA environemt and run this on the COMPUTE NODE -if you are not sure that the frontend node shares +print("""Remeber to load CUDA environemt and run this on the COMPUTE NODE +if you are not sure that the frontend node shares the same configuration as the backend nodes\n\n""") @@ -54,13 +59,11 @@ else: minor = str(5 if int(minor)>=5 else 0) if 'major' in line: _, major = line.split(':') - + if minor != "" and major != "": print("Compute capabilities for dev {}: {}.{}".format(str(devnum), major.strip(),minor.strip())) conf_cc=major.strip()+minor.strip() minor = ""; major = ""; devnum += 1 - + print("\n If all compute capabilities match, configure QE with:") print("./configure --with-cuda=$CUDA_HOME --with-cuda-cc={} --with-cuda-runtime={}\n".format(conf_cc, conf_rt)) - - diff --git a/dev-tools/mem_analyse.py b/dev-tools/mem_analyse.py index 71e27c8d1..0b3a5bb2b 100755 --- a/dev-tools/mem_analyse.py +++ b/dev-tools/mem_analyse.py @@ -1,8 +1,9 @@ +from __future__ import print_function import numpy as np #1) Run dev-tools/mem_counter inside EPW/src #2) compile UtilXlib/mem_counter.f90 with -D__DEBUG flag -#3) Run EPW +#3) Run EPW #4) grep ' allocating' epw1.out > alloc.txt #5) grep 'deallocating' epw1.out > dealloc.txt #6) Run this script after having changed the correct allocation lengths @@ -37,18 +38,18 @@ with open('dealloc.txt','r') as R: deall_found = [ False ] * dealloc_len for ii in np.arange(alloc_len): - print ii,' / ',alloc_len + print(ii, ' / ', alloc_len) name = alloc_name[ii] - + found = False for jj in np.arange(dealloc_len): if name == dealloc_name[jj]: - if (alloc_size[ii] == dealloc_size[jj] and deall_found[jj]==False ) : + if alloc_size[ii] == dealloc_size[jj] and not deall_found[jj]: # We found the corresponding all/deall pair deall_found[jj] = True found = True break - if (found == False): + if not found: with open('mem_analyse.out','a') as O: O.write('We did not find a maching pair in '+str(alloc_sub[ii])+'\n') O.write('Allocate: '+str(name)+' '+str(alloc_size[ii])+'\n') @@ -56,6 +57,3 @@ for ii in np.arange(alloc_len): # print 'We did not find a maching pair in ', alloc_sub[ii] # print 'Allocate: ',name,' ',alloc_size[ii] # print 'Deallocate: ',dealloc_name[jj],' ',dealloc_size[jj] - - - diff --git a/dev-tools/mem_counter.py b/dev-tools/mem_counter.py index 855c673b0..2b967adec 100755 --- a/dev-tools/mem_counter.py +++ b/dev-tools/mem_counter.py @@ -24,6 +24,7 @@ for file in *.bkp; do cp $file ${file%.bkp}; done """ +from __future__ import print_function import os, sys, re from shutil import copyfile diff --git a/dev-tools/src-normal.py b/dev-tools/src-normal.py index 53ea51302..b57ca7ca2 100755 --- a/dev-tools/src-normal.py +++ b/dev-tools/src-normal.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # (C) 2010 Norbert Nemec # diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt index adaf52def..48b32609e 100644 --- a/external/CMakeLists.txt +++ b/external/CMakeLists.txt @@ -4,8 +4,9 @@ if(FOX_ROOT) add_library(qe_fox INTERFACE) add_library(QE::FOX ALIAS qe_fox) - target_link_libraries(qe_fox INTERFACE "${FOX_ROOT}/lib;-lFoX_fsys;-lFoX_utils;-lFoX_common;-lFoX_wxml;-lFoX_sax;-lFoX_dom") - target_include_directories(qe_fox INTERFACE ${FOX_ROOT}/include) + qe_install_targets(qe_fox) + target_link_libraries(qe_fox INTERFACE "-L${FOX_ROOT}/lib;-lFoX_dom;-lFoX_sax;-lFoX_wxml;-lFoX_common;-lFoX_utils;-lFoX_fsys") + target_include_directories(qe_fox INTERFACE ${FOX_ROOT}/finclude) elseif(QE_ENABLE_VENDOR_DEPS) message(STATUS "Installing QE::FOX via submodule") set(fox_targets diff --git a/external/devxlib b/external/devxlib new file mode 160000 index 000000000..e5392b772 --- /dev/null +++ b/external/devxlib @@ -0,0 +1 @@ +Subproject commit e5392b772497f8597f6c3b2851e0c17da756bb64 diff --git a/install/build-mingw-cross.sh b/install/build-mingw-cross.sh old mode 100644 new mode 100755 diff --git a/install/configure b/install/configure index 3b254217e..4ee9afea0 100755 --- a/install/configure +++ b/install/configure @@ -676,6 +676,7 @@ blas_line blas_libs f90rule SET_MAKE +cuda_path cuda_extlibs cuda_libs cuda_fflags @@ -773,6 +774,7 @@ enable_shared with_cuda with_cuda_cc with_cuda_runtime +enable_cuda_env_check with_libxc with_libxc_prefix with_libxc_include @@ -1421,6 +1423,9 @@ Optional Features: --enable-debug compile Fortran with debug flags (default: no) --enable-pedantic compile Fortran with pedantic flags (default: no) --enable-shared use shared libraries if available (default: yes) + --enable-cuda-env-check=yes + The configure script will check CUDA installation + and report problems [default=yes] --enable-signals enable signal trapping (default: no) Optional Packages: @@ -4374,6 +4379,7 @@ test_ldflags="`echo $ldflags | sed 's/\$([^)]*)//g'`" NVCC=no CUDA_CFLAGS= CUDA_LDLIBS= +cuda_path= cuda_fflags= cuda_libs= cuda_extlibs= @@ -4406,6 +4412,13 @@ else fi +# Check whether --enable-cuda-env-check was given. +if test "${enable_cuda_env_check+set}" = set; then : + enableval=$enable_cuda_env_check; +else + enable_cuda_env_check=yes +fi + if test "x$with_cuda" != "xno" @@ -4627,7 +4640,7 @@ $as_echo "no" >&6; } fi - if test "x$NVCC" = "xno" + if test "x$NVCC" = "xno" && test "x$enable_cuda_env_check" = "xyes" then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find nvcc compiler. To enable CUDA, please add path to nvcc in the PATH environment variable and/or specify the path @@ -4675,7 +4688,7 @@ EOF { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_compile_nvcc" >&5 $as_echo "$ac_compile_nvcc" >&6; } - if test "x$ac_compile_nvcc" = "xno" + if test "x$ac_compile_nvcc" = "xno" && test "x$enable_cuda_env_check" = "xyes" then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: CUDA compiler has problems." >&5 $as_echo "$as_me: WARNING: CUDA compiler has problems." >&2;} @@ -4693,7 +4706,9 @@ $as_echo "$as_me: WARNING: CUDA compiler has problems." >&2;} LIBS="$CUDA_LDLIBS $LIBS" # And the header and the lib - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cuInit in -lcuda" >&5 + if test "x$enable_cuda_env_check" = "xyes" + then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cuInit in -lcuda" >&5 $as_echo_n "checking for cuInit in -lcuda... " >&6; } if ${ac_cv_lib_cuda_cuInit+:} false; then : $as_echo_n "(cached) " >&6 @@ -4743,7 +4758,7 @@ as_fn_error $? "Couldn't find libcuda See \`config.log' for more details" "$LINENO" 5; } fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cudaMalloc in -lcudart" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cudaMalloc in -lcudart" >&5 $as_echo_n "checking for cudaMalloc in -lcudart... " >&6; } if ${ac_cv_lib_cudart_cudaMalloc+:} false; then : $as_echo_n "(cached) " >&6 @@ -4793,7 +4808,7 @@ as_fn_error $? "Couldn't find libcudart See \`config.log' for more details" "$LINENO" 5; } fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cublasInit in -lcublas" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cublasInit in -lcublas" >&5 $as_echo_n "checking for cublasInit in -lcublas... " >&6; } if ${ac_cv_lib_cublas_cublasInit+:} false; then : $as_echo_n "(cached) " >&6 @@ -4843,7 +4858,7 @@ as_fn_error $? "Couldn't find libcublas See \`config.log' for more details" "$LINENO" 5; } fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cufftPlanMany in -lcufft" >&5 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cufftPlanMany in -lcufft" >&5 $as_echo_n "checking for cufftPlanMany in -lcufft... " >&6; } if ${ac_cv_lib_cufft_cufftPlanMany+:} false; then : $as_echo_n "(cached) " >&6 @@ -4893,6 +4908,7 @@ as_fn_error $? "Couldn't find libcufft See \`config.log' for more details" "$LINENO" 5; } fi + fi new_cusolver="yes" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cusolverDnZhegvdx_bufferSize in -lcusolver" >&5 @@ -4951,20 +4967,25 @@ fi $as_echo "#define HAVE_CUDA 1" >>confdefs.h try_dflags="$try_dflags -D__CUDA" + cuda_extlibs="devxlib" + cuda_libs="-Mcudalib=cufft,cublas,cusolver \$(TOPDIR)/external/devxlib/src/libdevXlib.a" + cuda_fflags="-Mcuda=cc$with_cuda_cc,cuda$with_cuda_runtime" + cuda_fflags="$cuda_fflags \$(MOD_FLAG)\$(TOPDIR)/external/devxlib/src" + cuda_fflags="$cuda_fflags \$(MOD_FLAG)\$(TOPDIR)/external/devxlib/include" + if test ${new_cusolver} != yes; then - cuda_fflags="-Mcuda=cc$with_cuda_cc,cuda$with_cuda_runtime \$(MOD_FLAG)\$(TOPDIR)/EIGENSOLVER_GPU/lib_eigsolve" - cuda_extlibs="eigensolver" - cuda_libs="-Mcudalib=cufft,cublas,cusolver \$(TOPDIR)/EIGENSOLVER_GPU/lib_eigsolve/lib_eigsolve.a" + cuda_fflags="$cuda_fflags \$(MOD_FLAG)\$(TOPDIR)/EIGENSOLVER_GPU/lib_eigsolve" + cuda_extlibs="$cuda_extlibs eigensolver" + cuda_libs="$cuda_libs \$(TOPDIR)/EIGENSOLVER_GPU/lib_eigsolve/lib_eigsolve.a" { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Using legacy custom solver." >&5 $as_echo "$as_me: WARNING: Using legacy custom solver." >&2;} else - cuda_fflags="-Mcuda=cc$with_cuda_cc,cuda$with_cuda_runtime" - cuda_libs="-Mcudalib=cufft,cublas,cusolver" try_dflags="$try_dflags -D__USE_CUSOLVER" fi ldflags="$ldflags -Mcuda=cc$with_cuda_cc,cuda$with_cuda_runtime" gpu_arch="$with_cuda_cc" gpu_runtime="$with_cuda_runtime" + cuda_path="$CUDAPATH" fi # Announcing the new variables @@ -4981,6 +5002,7 @@ fi + # Checking F90 rule... diff --git a/install/extlibs_makefile b/install/extlibs_makefile index d872889aa..ec52a06f7 100644 --- a/install/extlibs_makefile +++ b/install/extlibs_makefile @@ -21,6 +21,10 @@ EIGENSOLVER_GPU=v${EIGENSOLVER_VERSION}.tar.gz EIGENSOLVER_GPU_NAME=Eigensolver_gpu-${EIGENSOLVER_VERSION} EIGENSOLVER_GPU_URL=https://github.com/NVIDIA/Eigensolver_gpu/archive/${EIGENSOLVER_GPU} +# For DevXlib +DEVXLIB_VERSION=master +DEVXLIB_URL="https://gitlab.com/max-centre/components/devicexlib/-/archive/master/devicexlib-${DEVXLIB_VERSION}.tar.gz" + # MAIN target all: libcuda @@ -179,6 +183,32 @@ libcuda_eigensolver_clean: libcuda_eigensolver_veryclean: if test -d ../EIGENSOLVER_GPU; then (rm -R -f ../EIGENSOLVER_GPU ../${EIGENSOLVER_GPU_NAME}); fi +libcuda_devxlib : + cd ../external/devxlib; \ + if test ! -e configure; then \ + wget $(DEVXLIB_URL) -O devxlib.tar.gz || curl $(DEVXLIB_URL) -o devxlib.tar.gz ; \ + tar xzf devxlib.tar.gz --strip-components=1 -C . ; \ + rm devxlib.tar.gz ; \ + fi; \ + if test ! -f make.inc; then \ + touch make.inc; \ + $(MAKE) clean; \ + ./configure FC=$(F90) F77=$(F77) CC=$(CC) \ + --with-cuda=$(CUDA_PATH) \ + --with-cuda-cc=$(GPU_ARCH) \ + --with-cuda-runtime=$(CUDA_RUNTIME) \ + --disable-parallel \ + --enable-cuda-env-check=no; \ + fi; \ + make all + +libcuda_devxlib_clean: + cd ../external/devxlib; \ + if test -f make.inc; then ($(MAKE) clean); fi +libcuda_devxlib_veryclean: + cd ../external/devxlib; \ + if test -f make.inc; then ($(MAKE) distclean && rm make.inc); fi + ################################### # BEEF ################################### @@ -208,6 +238,6 @@ libbeef_veryclean: # cleaning ################################### -clean: lapack_clean elpa_clean iotk_clean fox_clean libcuda_eigensolver_clean libbeef_clean +clean: lapack_clean elpa_clean iotk_clean fox_clean libcuda_eigensolver_clean libcuda_devxlib_clean libbeef_clean -veryclean: lapack_veryclean elpa_veryclean iotk_veryclean fox_clean libcuda_eigensolver_veryclean libbeef_veryclean +veryclean: lapack_veryclean elpa_veryclean iotk_veryclean fox_clean libcuda_eigensolver_veryclean libcuda_devxlib_veryclean libbeef_veryclean diff --git a/install/m4/x_ac_qe_cuda.m4 b/install/m4/x_ac_qe_cuda.m4 index bce0b7ec2..b9a3ba615 100644 --- a/install/m4/x_ac_qe_cuda.m4 +++ b/install/m4/x_ac_qe_cuda.m4 @@ -33,6 +33,7 @@ AC_DEFUN([X_AC_QE_CUDA], [ NVCC=no CUDA_CFLAGS= CUDA_LDLIBS= +cuda_path= cuda_fflags= cuda_libs= cuda_extlibs= @@ -53,6 +54,10 @@ AC_ARG_WITH([cuda-runtime], [], [with_cuda_runtime=10.1]) +AC_ARG_ENABLE([cuda-env-check], + [AS_HELP_STRING([--enable-cuda-env-check=yes],[The configure script will check CUDA installation and report problems @<:@default=yes@:>@])], + [], + [enable_cuda_env_check=yes]) if test "x$with_cuda" != "xno" @@ -89,7 +94,7 @@ then # Checking for nvcc # ----------------------------------------- AC_PATH_PROG([NVCC],[nvcc],[no],[$PATH:$CUDAPATH/bin]) - if test "x$NVCC" = "xno" + if test "x$NVCC" = "xno" && test "x$enable_cuda_env_check" = "xyes" then AC_MSG_WARN([Cannot find nvcc compiler. To enable CUDA, please add path to nvcc in the PATH environment variable and/or specify the path @@ -132,7 +137,7 @@ EOF rm -f conftest.cu conftest.o AC_MSG_RESULT([$ac_compile_nvcc]) - if test "x$ac_compile_nvcc" = "xno" + if test "x$ac_compile_nvcc" = "xno" && test "x$enable_cuda_env_check" = "xyes" then AC_MSG_WARN([CUDA compiler has problems.]) fi @@ -149,10 +154,13 @@ EOF LIBS="$CUDA_LDLIBS $LIBS" # And the header and the lib - AC_CHECK_LIB([cuda], [cuInit], [], AC_MSG_FAILURE([Couldn't find libcuda])) - AC_CHECK_LIB([cudart], [cudaMalloc], [], AC_MSG_FAILURE([Couldn't find libcudart])) - AC_CHECK_LIB([cublas], [cublasInit], [], AC_MSG_FAILURE([Couldn't find libcublas])) - AC_CHECK_LIB([cufft], [cufftPlanMany], [], AC_MSG_FAILURE([Couldn't find libcufft])) + if test "x$enable_cuda_env_check" = "xyes" + then + AC_CHECK_LIB([cuda], [cuInit], [], AC_MSG_FAILURE([Couldn't find libcuda])) + AC_CHECK_LIB([cudart], [cudaMalloc], [], AC_MSG_FAILURE([Couldn't find libcudart])) + AC_CHECK_LIB([cublas], [cublasInit], [], AC_MSG_FAILURE([Couldn't find libcublas])) + AC_CHECK_LIB([cufft], [cufftPlanMany], [], AC_MSG_FAILURE([Couldn't find libcufft])) + fi new_cusolver="yes" AC_CHECK_LIB([cusolver], [cusolverDnZhegvdx_bufferSize], [], new_cusolver="no") @@ -163,19 +171,24 @@ EOF AC_DEFINE(HAVE_CUDA,1,[Define if we have CUDA]) try_dflags="$try_dflags -D__CUDA" + cuda_extlibs="devxlib" + cuda_libs="-Mcudalib=cufft,cublas,cusolver \$(TOPDIR)/external/devxlib/src/libdevXlib.a" + cuda_fflags="-Mcuda=cc$with_cuda_cc,cuda$with_cuda_runtime" + cuda_fflags="$cuda_fflags \$(MOD_FLAG)\$(TOPDIR)/external/devxlib/src" + cuda_fflags="$cuda_fflags \$(MOD_FLAG)\$(TOPDIR)/external/devxlib/include" + if test ${new_cusolver} != yes; then - cuda_fflags="-Mcuda=cc$with_cuda_cc,cuda$with_cuda_runtime \$(MOD_FLAG)\$(TOPDIR)/EIGENSOLVER_GPU/lib_eigsolve" - cuda_extlibs="eigensolver" - cuda_libs="-Mcudalib=cufft,cublas,cusolver \$(TOPDIR)/EIGENSOLVER_GPU/lib_eigsolve/lib_eigsolve.a" + cuda_fflags="$cuda_fflags \$(MOD_FLAG)\$(TOPDIR)/EIGENSOLVER_GPU/lib_eigsolve" + cuda_extlibs="$cuda_extlibs eigensolver" + cuda_libs="$cuda_libs \$(TOPDIR)/EIGENSOLVER_GPU/lib_eigsolve/lib_eigsolve.a" AC_MSG_WARN([Using legacy custom solver.]) else - cuda_fflags="-Mcuda=cc$with_cuda_cc,cuda$with_cuda_runtime" - cuda_libs="-Mcudalib=cufft,cublas,cusolver" try_dflags="$try_dflags -D__USE_CUSOLVER" fi ldflags="$ldflags -Mcuda=cc$with_cuda_cc,cuda$with_cuda_runtime" gpu_arch="$with_cuda_cc" gpu_runtime="$with_cuda_runtime" + cuda_path="$CUDAPATH" fi # Announcing the new variables @@ -190,4 +203,5 @@ AC_SUBST(gpu_runtime) AC_SUBST(cuda_fflags) AC_SUBST(cuda_libs) AC_SUBST(cuda_extlibs) +AC_SUBST(cuda_path) ]) diff --git a/install/make.inc.in b/install/make.inc.in index 27e1f4e43..99d04ac31 100644 --- a/install/make.inc.in +++ b/install/make.inc.in @@ -84,6 +84,9 @@ F90 = @f90@ CC = @cc@ F77 = @f77@ +# CUDA Toolkit path +CUDA_PATH=@cuda_path@ + # GPU architecture (Kepler: 35, Pascal: 60, Volta: 70 ) GPU_ARCH=@gpu_arch@ diff --git a/test-suite/buildbot/Cineca_farm/check_smtp.py b/test-suite/buildbot/Cineca_farm/check_smtp.py index e9b4d6c44..8ad7c7fdc 100644 --- a/test-suite/buildbot/Cineca_farm/check_smtp.py +++ b/test-suite/buildbot/Cineca_farm/check_smtp.py @@ -1,9 +1,9 @@ -#! /usr/bin/python -tt +#!/usr/bin/env python3 from __future__ import absolute_import from __future__ import division from __future__ import print_function - +from builtins import input from getpass import getpass from smtplib import SMTP @@ -14,7 +14,6 @@ name and password would allow to send e-mail through it. """ - SMTP_HOST = 'smtp.gmail.com:587' LOCAL_HOST = '' @@ -28,12 +27,12 @@ def main(): # server.ehlo() # print(server.ehlo()) - + server.starttls() print(server.ehlo(LOCAL_HOST)) - user = raw_input('user: ') + user = input('user: ') password = getpass('password: ') print(server.login(user, password)) @@ -41,17 +40,17 @@ def main(): fromaddr = 'testfarmqef@gmail.com' toaddrs = 'samuel.pon@gmail.com' msg = "\r\n".join([ - "From: testfarmqef@gmail.com", - "To: samuel.pon@gmail.com", - "Subject: Buildbot", - "", - "Why, oh why" - ]) + "From: testfarmqef@gmail.com", + "To: samuel.pon@gmail.com", + "Subject: Buildbot", + "", + "Why, oh why" + ]) - - server.sendmail(fromaddr, toaddrs, msg) + server.sendmail(fromaddr, toaddrs, msg) server.close() + if __name__ == '__main__': main() diff --git a/test-suite/epw_mob/pp.py b/test-suite/epw_mob/pp.py index cc7dd82f9..5cd57ca96 100644 --- a/test-suite/epw_mob/pp.py +++ b/test-suite/epw_mob/pp.py @@ -1,20 +1,19 @@ # -# Post-processing script QE --> EPW +# Post-processing script QE --> EPW # 14/07/2015 - Samuel Ponce # +from builtins import input import numpy as np import os -# Enter the number of irr. q-points -user_input = raw_input('Enter the prefix used for PH calculations (e.g. diam)\n') -prefix = str(user_input) +# Enter the number of irr. q-points +prefix = input('Enter the prefix used for PH calculations (e.g. diam)\n') -# Enter the number of irr. q-points -user_input = raw_input('Enter the number of irreducible q-points\n') -nqpt = user_input +# Enter the number of irr. q-points +nqpt = input('Enter the number of irreducible q-points\n') try: - nqpt = int(user_input) + nqpt = int(nqpt) except ValueError: raise Exception('The value you enter is not an integer!') @@ -30,5 +29,3 @@ for iqpt in np.arange(1,nqpt+1): else: os.system('cp _ph0/'+prefix+'.q_'+str(iqpt)+'/'+prefix+'.dvscf1 save/'+prefix+'.dvscf_q'+label) os.system('rm -f _ph0/'+prefix+'.q_'+str(iqpt)+'/*wfc*') - - diff --git a/test-suite/not_epw_comp/grid.py b/test-suite/not_epw_comp/grid.py index ae646f342..7f0916f13 100644 --- a/test-suite/not_epw_comp/grid.py +++ b/test-suite/not_epw_comp/grid.py @@ -1,11 +1,12 @@ +from __future__ import print_function import numpy as np -tot = 0 +tot = 0 -for ii in np.arange(0,1,0.25): - for jj in np.arange(0,1,0.25): - for kk in np.arange(0,1,0.25): - print ii,' ',jj,' ',kk,' ',1.0/64 +for ii in np.arange(0, 1, 0.25): + for jj in np.arange(0, 1, 0.25): + for kk in np.arange(0, 1, 0.25): + print(ii, ' ', jj, ' ', kk, ' ', 1.0 / 64) tot += 1 -print tot +print(tot) diff --git a/test-suite/not_epw_comp/pp.py b/test-suite/not_epw_comp/pp.py index 8bcaadbdb..db6322b50 100644 --- a/test-suite/not_epw_comp/pp.py +++ b/test-suite/not_epw_comp/pp.py @@ -1,20 +1,19 @@ # -# Post-processing script QE --> EPW +# Post-processing script QE --> EPW # 14/07/2015 - Samuel Ponce # +from builtins import input import numpy as np import os -# Enter the number of irr. q-points -user_input = raw_input('Enter the prefix used for PH calculations (e.g. diam)\n') -prefix = str(user_input) +# Enter the number of irr. q-points +prefix = input('Enter the prefix used for PH calculations (e.g. diam)\n') -# Enter the number of irr. q-points -user_input = raw_input('Enter the number of irreducible q-points\n') -nqpt = user_input +# Enter the number of irr. q-points +nqpt = input('Enter the number of irreducible q-points\n') try: - nqpt = int(user_input) + nqpt = int(nqpt) except ValueError: raise Exception('The value you enter is not an integer!') @@ -28,4 +27,3 @@ for iqpt in np.arange(1,nqpt+1): else: os.system('cp _ph0/'+prefix+'.q_'+str(iqpt)+'/'+prefix+'.dvscf1 save/'+prefix+'.dvscf_q'+label) os.system('rm -f _ph0/'+prefix+'.q_'+str(iqpt)+'/*wfc*') - diff --git a/test-suite/pw_lda+U/benchmark.out.git.inp=lda+U+V-user_ns.in b/test-suite/pw_lda+U/benchmark.out.git.inp=lda+U+V-user_ns.in new file mode 100644 index 000000000..f75a5dffb --- /dev/null +++ b/test-suite/pw_lda+U/benchmark.out.git.inp=lda+U+V-user_ns.in @@ -0,0 +1,889 @@ + + Program PWSCF v.6.6 starts on 7Oct2020 at 10:28:16 + + This program is part of the open-source Quantum ESPRESSO suite + for quantum simulation of materials; please cite + "P. Giannozzi et al., J. Phys.:Condens. Matter 21 395502 (2009); + "P. Giannozzi et al., J. Phys.:Condens. Matter 29 465901 (2017); + URL http://www.quantum-espresso.org", + in publications or presentations arising from this work. More details at + http://www.quantum-espresso.org/quote + + Parallel version (MPI), running on 1 processors + + MPI processes distributed on 1 nodes + Reading input from lda+U+V-user_ns.in + + Current dimensions of program PWSCF are: + Max number of different atomic species (ntypx) = 10 + Max number of k-points (npk) = 40000 + Max angular momentum in pseudopotentials (lmaxx) = 3 + + Reading Hubbard V parameters from the input... + + Message from routine volume: + axis vectors are left-handed + file O.pz-rrkjus.UPF: wavefunction(s) 2S renormalized + file Fe.pz-nd-rrkjus.UPF: wavefunction(s) 4S renormalized + file Fe.pz-nd-rrkjus.UPF: wavefunction(s) 4S renormalized + + Subspace diagonalization in iterative solution of the eigenvalue problem: + a serial algorithm will be used + + Message from routine setup: + using ibrav=0 with symmetry is DISCOURAGED, use correct ibrav instead + First shells distances (in Bohr): + shell: 1 0.000000 + shell: 2 4.095000 + shell: 3 5.791205 + shell: 4 7.092748 + shell: 5 8.190000 + shell: 6 9.156698 + shell: 7 10.030660 + + i j dist (Bohr) stan-stan stan-bac bac-bac bac-stan + 1 1 0.00000000 V = 0.0000 0.0000 0.0000 0.0000 + 1 107 21.27824417 V = 0.8000 0.0000 0.0000 0.0000 + 2 2 0.00000000 V = 0.0000 0.0000 0.0000 0.0000 + 2 3 21.27824417 V = 0.8000 0.0000 0.0000 0.0000 + 3 2 21.27824417 V = 0.8000 0.0000 0.0000 0.0000 + 3 3 0.00000000 V = 4.3000 0.0000 0.0000 0.0000 + 3 5 21.27824417 V = 0.8000 0.0000 0.0000 0.0000 + 4 4 0.00000000 V = 4.3000 0.0000 0.0000 0.0000 + + G-vector sticks info + -------------------- + sticks: dense smooth PW G-vecs: dense smooth PW + Sum 1061 539 163 17255 6111 1081 + + + + bravais-lattice index = 0 + lattice parameter (alat) = 8.1900 a.u. + unit-cell volume = 274.6766 (a.u.)^3 + number of atoms/cell = 4 + number of atomic types = 3 + number of electrons = 28.00 + number of Kohn-Sham states= 20 + kinetic-energy cutoff = 30.0000 Ry + charge density cutoff = 240.0000 Ry + convergence threshold = 1.0E-08 + mixing beta = 0.3000 + number of iterations used = 8 plain mixing + Exchange-correlation= SLA PZ NOGX NOGC + ( 1 1 0 0 0 0 0) + + celldm(1)= 8.190000 celldm(2)= 0.000000 celldm(3)= 0.000000 + celldm(4)= 0.000000 celldm(5)= 0.000000 celldm(6)= 0.000000 + + crystal axes: (cart. coord. in units of alat) + a(1) = ( 0.500000 0.500000 1.000000 ) + a(2) = ( 0.500000 1.000000 0.500000 ) + a(3) = ( 1.000000 0.500000 0.500000 ) + + reciprocal axes: (cart. coord. in units 2 pi/alat) + b(1) = ( -0.500000 -0.500000 1.500000 ) + b(2) = ( -0.500000 1.500000 -0.500000 ) + b(3) = ( 1.500000 -0.500000 -0.500000 ) + + + PseudoPot. # 1 for O read from file: + /scratch/timrov/QE_GitLab_Timrov/tmp4/q-e/test-suite/..//pseudo/O.pz-rrkjus.UPF + MD5 check sum: b574877712b4ae31214c077877edcb7d + Pseudo is Ultrasoft, Zval = 6.0 + Generated by new atomic code, or converted to UPF format + Using radial grid of 1269 points, 4 beta functions with: + l(1) = 0 + l(2) = 0 + l(3) = 1 + l(4) = 1 + Q(r) pseudized with 0 coefficients + + + PseudoPot. # 2 for Fe read from file: + /scratch/timrov/QE_GitLab_Timrov/tmp4/q-e/test-suite/..//pseudo/Fe.pz-nd-rrkjus.UPF + MD5 check sum: b5eb2b1fd79b39c9eac5f7a31bc313a7 + Pseudo is Ultrasoft + core correction, Zval = 8.0 + Generated by new atomic code, or converted to UPF format + Using radial grid of 957 points, 6 beta functions with: + l(1) = 0 + l(2) = 0 + l(3) = 1 + l(4) = 1 + l(5) = 2 + l(6) = 2 + Q(r) pseudized with 0 coefficients + + + PseudoPot. # 3 for Fe read from file: + /scratch/timrov/QE_GitLab_Timrov/tmp4/q-e/test-suite/..//pseudo/Fe.pz-nd-rrkjus.UPF + MD5 check sum: b5eb2b1fd79b39c9eac5f7a31bc313a7 + Pseudo is Ultrasoft + core correction, Zval = 8.0 + Generated by new atomic code, or converted to UPF format + Using radial grid of 957 points, 6 beta functions with: + l(1) = 0 + l(2) = 0 + l(3) = 1 + l(4) = 1 + l(5) = 2 + l(6) = 2 + Q(r) pseudized with 0 coefficients + + + atomic species valence mass pseudopotential + O1 6.00 1.00000 O ( 1.00) + Fe1 8.00 1.00000 Fe( 1.00) + Fe2 8.00 1.00000 Fe( 1.00) + + Starting magnetic structure + atomic species magnetization + O1 0.000 + Fe1 0.500 + Fe2 -0.500 + + + + 12 Sym. Ops., with inversion, found + + + + Cartesian axes + + site n. atom positions (alat units) + 1 O1 tau( 1) = ( 0.5000000 0.5000000 0.5000000 ) + 2 O1 tau( 2) = ( 1.5000000 1.5000000 1.5000000 ) + 3 Fe1 tau( 3) = ( 0.0000000 0.0000000 0.0000000 ) + 4 Fe2 tau( 4) = ( 1.0000000 1.0000000 1.0000000 ) + + number of k points= 4 Gaussian smearing, width (Ry)= 0.0100 + cart. coord. in units 2pi/alat + k( 1) = ( 0.0000000 0.0000000 0.0000000), wk = 0.1250000 + k( 2) = ( -0.7500000 0.2500000 0.2500000), wk = 0.3750000 + k( 3) = ( -0.5000000 -0.5000000 0.5000000), wk = 0.3750000 + k( 4) = ( -0.2500000 -0.2500000 -0.2500000), wk = 0.1250000 + + Dense grid: 17255 G-vectors FFT dimensions: ( 50, 50, 50) + + Smooth grid: 6111 G-vectors FFT dimensions: ( 36, 36, 36) + + Estimated max dynamical RAM per process > 88.18 MB + + Check: negative core charge= -0.000003 + Generating pointlists ... + new r_m : 0.2063 (alat units) 1.6892 (a.u.) for type 1 + new r_m : 0.2063 (alat units) 1.6892 (a.u.) for type 2 + new r_m : 0.2063 (alat units) 1.6892 (a.u.) for type 3 + + Initial potential from superposition of free atoms + + starting charge 27.99905, renormalised to 28.00000 + Number of +U iterations with fixed ns = 0 + Starting occupations: + --- enter write_nsg --- + Atom: 1 Spin: 1 + eigenvalues and eigenvectors of the occupation matrix: + 0.667 + 1.000 0.000 0.000 + 0.667 + 0.000 1.000 0.000 + 0.667 + 0.000 0.000 1.000 + occupation matrix before diagonalization: + 0.667 0.000 0.000 + 0.000 0.667 0.000 + 0.000 0.000 0.667 + Atom: 2 Spin: 1 + eigenvalues and eigenvectors of the occupation matrix: + 0.667 + 1.000 0.000 0.000 + 0.667 + 0.000 1.000 0.000 + 0.667 + 0.000 0.000 1.000 + occupation matrix before diagonalization: + 0.667 0.000 0.000 + 0.000 0.667 0.000 + 0.000 0.000 0.667 + Atom: 3 Spin: 1 + eigenvalues and eigenvectors of the occupation matrix: + 1.000 + 1.000 0.000 0.000 0.000 0.000 + 1.000 + 0.000 1.000 0.000 0.000 0.000 + 1.000 + 0.000 0.000 1.000 0.000 0.000 + 1.000 + 0.000 0.000 0.000 1.000 0.000 + 1.000 + 0.000 0.000 0.000 0.000 1.000 + occupation matrix before diagonalization: + 1.000 0.000 0.000 0.000 0.000 + 0.000 1.000 0.000 0.000 0.000 + 0.000 0.000 1.000 0.000 0.000 + 0.000 0.000 0.000 1.000 0.000 + 0.000 0.000 0.000 0.000 1.000 + Atom: 4 Spin: 1 + eigenvalues and eigenvectors of the occupation matrix: + 0.200 + 1.000 0.000 0.000 0.000 0.000 + 0.200 + 0.000 1.000 0.000 0.000 0.000 + 0.200 + 0.000 0.000 1.000 0.000 0.000 + 0.200 + 0.000 0.000 0.000 1.000 0.000 + 0.200 + 0.000 0.000 0.000 0.000 1.000 + occupation matrix before diagonalization: + 0.200 0.000 0.000 0.000 0.000 + 0.000 0.200 0.000 0.000 0.000 + 0.000 0.000 0.200 0.000 0.000 + 0.000 0.000 0.000 0.200 0.000 + 0.000 0.000 0.000 0.000 0.200 + Atom: 1 Spin: 2 + eigenvalues and eigenvectors of the occupation matrix: + 0.667 + 1.000 0.000 0.000 + 0.667 + 0.000 1.000 0.000 + 0.667 + 0.000 0.000 1.000 + occupation matrix before diagonalization: + 0.667 0.000 0.000 + 0.000 0.667 0.000 + 0.000 0.000 0.667 + Atom: 2 Spin: 2 + eigenvalues and eigenvectors of the occupation matrix: + 0.667 + 1.000 0.000 0.000 + 0.667 + 0.000 1.000 0.000 + 0.667 + 0.000 0.000 1.000 + occupation matrix before diagonalization: + 0.667 0.000 0.000 + 0.000 0.667 0.000 + 0.000 0.000 0.667 + Atom: 3 Spin: 2 + eigenvalues and eigenvectors of the occupation matrix: + 0.200 + 1.000 0.000 0.000 0.000 0.000 + 0.200 + 0.000 1.000 0.000 0.000 0.000 + 0.200 + 0.000 0.000 1.000 0.000 0.000 + 0.200 + 0.000 0.000 0.000 1.000 0.000 + 0.200 + 0.000 0.000 0.000 0.000 1.000 + occupation matrix before diagonalization: + 0.200 0.000 0.000 0.000 0.000 + 0.000 0.200 0.000 0.000 0.000 + 0.000 0.000 0.200 0.000 0.000 + 0.000 0.000 0.000 0.200 0.000 + 0.000 0.000 0.000 0.000 0.200 + Atom: 4 Spin: 2 + eigenvalues and eigenvectors of the occupation matrix: + 1.000 + 1.000 0.000 0.000 0.000 0.000 + 1.000 + 0.000 1.000 0.000 0.000 0.000 + 1.000 + 0.000 0.000 1.000 0.000 0.000 + 1.000 + 0.000 0.000 0.000 1.000 0.000 + 1.000 + 0.000 0.000 0.000 0.000 1.000 + occupation matrix before diagonalization: + 1.000 0.000 0.000 0.000 0.000 + 0.000 1.000 0.000 0.000 0.000 + 0.000 0.000 1.000 0.000 0.000 + 0.000 0.000 0.000 1.000 0.000 + 0.000 0.000 0.000 0.000 1.000 +atom 1 Tr[ns(na)]= 4.0000000 +atom 1 Mag[ns(na)]= 0.0000000 +atom 2 Tr[ns(na)]= 4.0000000 +atom 2 Mag[ns(na)]= 0.0000000 +atom 3 Tr[ns(na)]= 6.0000000 +atom 3 Mag[ns(na)]= 4.0000000 +atom 4 Tr[ns(na)]= 6.0000000 +atom 4 Mag[ns(na)]= -4.0000000 + --- exit write_nsg --- + Atomic wfc used for LDA+U Projector are orthogonalized + Starting wfcs are 20 randomized atomic wfcs + + total cpu time spent up to now is 1.2 secs + + Self-consistent Calculation + + iteration # 1 ecut= 30.00 Ry beta= 0.30 + Davidson diagonalization with overlap + ethr = 1.00E-02, avg # of iterations = 2.2 + --- enter write_nsg --- + Atom: 1 Spin: 1 + eigenvalues and eigenvectors of the occupation matrix: + 0.943 + 0.737 0.673 0.064 + 0.943 + -0.352 0.462 -0.814 + 0.957 + -0.577 0.577 0.577 + occupation matrix before diagonalization: + 0.948 -0.005 -0.005 + -0.005 0.948 0.005 + -0.005 0.005 0.948 + Atom: 2 Spin: 1 + eigenvalues and eigenvectors of the occupation matrix: + 0.943 + 0.747 0.659 0.088 + 0.943 + -0.330 0.482 -0.812 + 0.957 + -0.577 0.577 0.577 + occupation matrix before diagonalization: + 0.948 -0.005 -0.005 + -0.005 0.948 0.005 + -0.005 0.005 0.948 + Atom: 3 Spin: 1 + eigenvalues and eigenvectors of the occupation matrix: + 0.994 + 0.485 0.078 -0.153 -0.854 -0.076 + 0.994 + 0.854 -0.132 -0.001 0.485 -0.133 + 0.995 + 0.175 0.625 0.123 0.068 0.748 + 0.995 + -0.068 0.503 -0.793 0.175 -0.290 + 0.995 + -0.000 0.577 0.577 0.000 -0.577 + occupation matrix before diagonalization: + 0.994 0.000 0.000 0.000 0.000 + 0.000 0.995 0.000 0.000 -0.000 + 0.000 0.000 0.995 -0.000 -0.000 + 0.000 0.000 -0.000 0.994 -0.000 + 0.000 -0.000 -0.000 -0.000 0.995 + Atom: 4 Spin: 1 + eigenvalues and eigenvectors of the occupation matrix: + 0.077 + -0.059 0.049 -0.052 0.996 -0.003 + 0.077 + -0.996 -0.032 -0.026 -0.059 -0.058 + 0.209 + 0.000 -0.577 -0.577 -0.000 0.577 + 0.238 + -0.067 0.130 0.631 0.025 0.761 + 0.238 + -0.025 0.804 -0.514 -0.067 0.290 + occupation matrix before diagonalization: + 0.077 -0.005 -0.005 0.000 -0.009 + -0.005 0.227 -0.009 -0.008 0.009 + -0.005 -0.009 0.227 0.008 0.009 + 0.000 -0.008 0.008 0.077 -0.000 + -0.009 0.009 0.009 -0.000 0.227 + Atom: 1 Spin: 2 + eigenvalues and eigenvectors of the occupation matrix: + 0.943 + 0.722 0.691 0.031 + 0.943 + -0.381 0.435 -0.816 + 0.957 + -0.577 0.577 0.577 + occupation matrix before diagonalization: + 0.947 -0.005 -0.005 + -0.005 0.947 0.005 + -0.005 0.005 0.947 + Atom: 2 Spin: 2 + eigenvalues and eigenvectors of the occupation matrix: + 0.943 + 0.722 0.691 0.031 + 0.943 + -0.381 0.435 -0.816 + 0.957 + -0.577 0.577 0.577 + occupation matrix before diagonalization: + 0.947 -0.005 -0.005 + -0.005 0.947 0.005 + -0.005 0.005 0.947 + Atom: 3 Spin: 2 + eigenvalues and eigenvectors of the occupation matrix: + 0.077 + 0.418 -0.034 0.060 -0.905 0.025 + 0.077 + -0.905 -0.049 -0.005 -0.418 -0.054 + 0.208 + 0.000 -0.577 -0.577 -0.000 0.577 + 0.237 + -0.070 0.175 0.602 0.022 0.776 + 0.237 + -0.022 0.795 -0.549 -0.070 0.247 + occupation matrix before diagonalization: + 0.077 -0.005 -0.005 0.000 -0.010 + -0.005 0.227 -0.009 -0.008 0.009 + -0.005 -0.009 0.227 0.008 0.009 + 0.000 -0.008 0.008 0.077 -0.000 + -0.010 0.009 0.009 -0.000 0.227 + Atom: 4 Spin: 2 + eigenvalues and eigenvectors of the occupation matrix: + 0.994 + -0.496 -0.084 0.170 0.843 0.086 + 0.994 + -0.843 0.148 -0.001 -0.496 0.146 + 0.995 + -0.196 -0.608 -0.145 -0.070 -0.753 + 0.995 + -0.070 0.518 -0.785 0.196 -0.267 + 0.995 + 0.000 0.577 0.577 0.000 -0.577 + occupation matrix before diagonalization: + 0.994 0.000 0.000 0.000 0.000 + 0.000 0.995 0.000 0.000 -0.000 + 0.000 0.000 0.995 -0.000 -0.000 + 0.000 0.000 -0.000 0.994 -0.000 + 0.000 -0.000 -0.000 -0.000 0.995 +atom 1 Tr[ns(na)]= 5.6849416 +atom 1 Mag[ns(na)]= 0.0001347 +atom 2 Tr[ns(na)]= 5.6849416 +atom 2 Mag[ns(na)]= 0.0001347 +atom 3 Tr[ns(na)]= 5.8092330 +atom 3 Mag[ns(na)]= 4.1385627 +atom 4 Tr[ns(na)]= 5.8110759 +atom 4 Mag[ns(na)]= -4.1368385 + --- exit write_nsg --- + Modify starting ns matrices according to input values + + total cpu time spent up to now is 2.0 secs + + total energy = -174.06832442 Ry + estimated scf accuracy < 2.48924695 Ry + + total magnetization = 0.00 Bohr mag/cell + absolute magnetization = 8.47 Bohr mag/cell + + iteration # 2 ecut= 30.00 Ry beta= 0.30 + Davidson diagonalization with overlap + ethr = 8.89E-03, avg # of iterations = 2.0 + + total cpu time spent up to now is 2.7 secs + + total energy = -174.50798403 Ry + estimated scf accuracy < 0.20019944 Ry + + total magnetization = -0.00 Bohr mag/cell + absolute magnetization = 7.28 Bohr mag/cell + + iteration # 3 ecut= 30.00 Ry beta= 0.30 + Davidson diagonalization with overlap + ethr = 7.15E-04, avg # of iterations = 2.9 + + total cpu time spent up to now is 3.3 secs + + total energy = -174.55831585 Ry + estimated scf accuracy < 0.10640678 Ry + + total magnetization = 0.00 Bohr mag/cell + absolute magnetization = 7.38 Bohr mag/cell + + iteration # 4 ecut= 30.00 Ry beta= 0.30 + Davidson diagonalization with overlap + ethr = 3.80E-04, avg # of iterations = 2.4 + + total cpu time spent up to now is 4.0 secs + + total energy = -174.58311496 Ry + estimated scf accuracy < 0.02049251 Ry + + total magnetization = 0.00 Bohr mag/cell + absolute magnetization = 7.41 Bohr mag/cell + + iteration # 5 ecut= 30.00 Ry beta= 0.30 + Davidson diagonalization with overlap + ethr = 7.32E-05, avg # of iterations = 2.5 + + total cpu time spent up to now is 4.6 secs + + total energy = -174.58682203 Ry + estimated scf accuracy < 0.00199218 Ry + + total magnetization = 0.00 Bohr mag/cell + absolute magnetization = 7.38 Bohr mag/cell + + iteration # 6 ecut= 30.00 Ry beta= 0.30 + Davidson diagonalization with overlap + ethr = 7.11E-06, avg # of iterations = 3.5 + + total cpu time spent up to now is 5.3 secs + + total energy = -174.58738572 Ry + estimated scf accuracy < 0.00030896 Ry + + total magnetization = -0.00 Bohr mag/cell + absolute magnetization = 7.39 Bohr mag/cell + + iteration # 7 ecut= 30.00 Ry beta= 0.30 + Davidson diagonalization with overlap + ethr = 1.10E-06, avg # of iterations = 3.5 + + total cpu time spent up to now is 6.0 secs + + total energy = -174.58747147 Ry + estimated scf accuracy < 0.00004003 Ry + + total magnetization = 0.00 Bohr mag/cell + absolute magnetization = 7.39 Bohr mag/cell + + iteration # 8 ecut= 30.00 Ry beta= 0.30 + Davidson diagonalization with overlap + ethr = 1.43E-07, avg # of iterations = 4.2 + + total cpu time spent up to now is 6.8 secs + + total energy = -174.58750177 Ry + estimated scf accuracy < 0.00000464 Ry + + total magnetization = 0.00 Bohr mag/cell + absolute magnetization = 7.39 Bohr mag/cell + + iteration # 9 ecut= 30.00 Ry beta= 0.30 + Davidson diagonalization with overlap + ethr = 1.66E-08, avg # of iterations = 5.0 + + total cpu time spent up to now is 7.7 secs + + total energy = -174.58750681 Ry + estimated scf accuracy < 0.00000057 Ry + + total magnetization = 0.00 Bohr mag/cell + absolute magnetization = 7.39 Bohr mag/cell + + iteration # 10 ecut= 30.00 Ry beta= 0.30 + Davidson diagonalization with overlap + ethr = 2.05E-09, avg # of iterations = 4.5 + + total cpu time spent up to now is 8.6 secs + + total energy = -174.58750800 Ry + estimated scf accuracy < 0.00000043 Ry + + total magnetization = 0.00 Bohr mag/cell + absolute magnetization = 7.39 Bohr mag/cell + + iteration # 11 ecut= 30.00 Ry beta= 0.30 + Davidson diagonalization with overlap + ethr = 1.54E-09, avg # of iterations = 2.0 + + total cpu time spent up to now is 9.4 secs + + total energy = -174.58750864 Ry + estimated scf accuracy < 0.00000006 Ry + + total magnetization = 0.00 Bohr mag/cell + absolute magnetization = 7.39 Bohr mag/cell + + iteration # 12 ecut= 30.00 Ry beta= 0.30 + Davidson diagonalization with overlap + ethr = 2.27E-10, avg # of iterations = 2.2 + + total cpu time spent up to now is 10.1 secs + + total energy = -174.58750888 Ry + estimated scf accuracy < 0.00000001 Ry + + total magnetization = 0.00 Bohr mag/cell + absolute magnetization = 7.39 Bohr mag/cell + + iteration # 13 ecut= 30.00 Ry beta= 0.30 + Davidson diagonalization with overlap + ethr = 4.99E-11, avg # of iterations = 3.8 + + Magnetic moment per site: + atom: 1 charge: 5.8611 magn: -0.0000 constr: 0.0000 + atom: 2 charge: 5.8611 magn: -0.0000 constr: 0.0000 + atom: 3 charge: 5.6781 magn: 3.3895 constr: 0.0000 + atom: 4 charge: 5.6781 magn: -3.3894 constr: 0.0000 + + total cpu time spent up to now is 10.9 secs + + End of self-consistent calculation + --- enter write_nsg --- + Atom: 1 Spin: 1 + eigenvalues and eigenvectors of the occupation matrix: + 0.871 + 0.707 0.707 0.000 + 0.871 + -0.408 0.408 -0.816 + 0.878 + -0.577 0.577 0.577 + occupation matrix before diagonalization: + 0.873 -0.003 -0.003 + -0.003 0.873 0.003 + -0.003 0.003 0.873 + Atom: 2 Spin: 1 + eigenvalues and eigenvectors of the occupation matrix: + 0.871 + 0.707 0.707 0.000 + 0.871 + -0.408 0.408 -0.816 + 0.878 + -0.577 0.577 0.577 + occupation matrix before diagonalization: + 0.873 -0.003 -0.003 + -0.003 0.873 0.003 + -0.003 0.003 0.873 + Atom: 3 Spin: 1 + eigenvalues and eigenvectors of the occupation matrix: + 0.990 + -0.389 -0.004 0.006 0.921 0.002 + 0.990 + 0.921 -0.005 -0.001 0.389 -0.006 + 0.995 + 0.000 -0.577 -0.577 -0.000 0.577 + 0.997 + 0.008 0.408 0.408 -0.000 0.816 + 0.997 + 0.000 -0.707 0.707 -0.008 0.000 + occupation matrix before diagonalization: + 0.990 0.000 0.000 0.000 0.000 + 0.000 0.996 -0.001 0.000 0.001 + 0.000 -0.001 0.996 -0.000 0.001 + 0.000 0.000 -0.000 0.990 -0.000 + 0.000 0.001 0.001 -0.000 0.996 + Atom: 4 Spin: 1 + eigenvalues and eigenvectors of the occupation matrix: + 0.055 + -0.017 -0.609 0.772 0.081 0.164 + 0.055 + 0.081 -0.540 -0.257 0.017 -0.797 + 0.171 + -0.282 0.047 -0.066 0.956 -0.019 + 0.171 + 0.956 0.049 0.016 0.282 0.065 + 0.975 + 0.000 -0.577 -0.577 -0.000 0.577 + occupation matrix before diagonalization: + 0.170 0.004 0.004 0.000 0.008 + 0.004 0.362 0.306 0.007 -0.306 + 0.004 0.306 0.362 -0.007 -0.306 + 0.000 0.007 -0.007 0.170 -0.000 + 0.008 -0.306 -0.306 -0.000 0.362 + Atom: 1 Spin: 2 + eigenvalues and eigenvectors of the occupation matrix: + 0.871 + 0.738 0.671 0.067 + 0.871 + -0.349 0.465 -0.814 + 0.878 + -0.577 0.577 0.577 + occupation matrix before diagonalization: + 0.873 -0.003 -0.003 + -0.003 0.873 0.003 + -0.003 0.003 0.873 + Atom: 2 Spin: 2 + eigenvalues and eigenvectors of the occupation matrix: + 0.871 + 0.707 0.707 0.000 + 0.871 + -0.408 0.408 -0.816 + 0.878 + -0.577 0.577 0.577 + occupation matrix before diagonalization: + 0.873 -0.003 -0.003 + -0.003 0.873 0.003 + -0.003 0.003 0.873 + Atom: 3 Spin: 2 + eigenvalues and eigenvectors of the occupation matrix: + 0.055 + -0.030 -0.510 0.804 0.078 0.295 + 0.055 + 0.078 -0.634 -0.124 0.030 -0.758 + 0.171 + -0.237 0.049 -0.066 0.968 -0.016 + 0.171 + 0.968 0.047 0.019 0.237 0.066 + 0.974 + 0.000 -0.577 -0.577 -0.000 0.577 + occupation matrix before diagonalization: + 0.170 0.004 0.004 0.000 0.008 + 0.004 0.362 0.306 0.007 -0.306 + 0.004 0.306 0.362 -0.007 -0.306 + 0.000 0.007 -0.007 0.170 -0.000 + 0.008 -0.306 -0.306 -0.000 0.362 + Atom: 4 Spin: 2 + eigenvalues and eigenvectors of the occupation matrix: + 0.990 + -0.456 -0.003 0.006 0.890 0.003 + 0.990 + -0.890 0.005 0.000 -0.456 0.006 + 0.995 + 0.000 -0.577 -0.577 -0.000 0.577 + 0.997 + 0.008 0.425 0.391 0.000 0.816 + 0.997 + 0.000 -0.697 0.717 -0.008 0.020 + occupation matrix before diagonalization: + 0.990 0.000 0.000 0.000 0.000 + 0.000 0.996 -0.001 0.000 0.001 + 0.000 -0.001 0.996 -0.000 0.001 + 0.000 0.000 -0.000 0.990 -0.000 + 0.000 0.001 0.001 -0.000 0.996 +atom 1 Tr[ns(na)]= 5.2401524 +atom 1 Mag[ns(na)]= 0.0000095 +atom 2 Tr[ns(na)]= 5.2401524 +atom 2 Mag[ns(na)]= 0.0000095 +atom 3 Tr[ns(na)]= 6.3935720 +atom 3 Mag[ns(na)]= 3.5428346 +atom 4 Tr[ns(na)]= 6.3935709 +atom 4 Mag[ns(na)]= -3.5428541 + --- exit write_nsg --- + + ------ SPIN UP ------------ + + + k = 0.0000 0.0000 0.0000 ( 731 PWs) bands (ev): + + -8.6635 -7.4040 2.2308 3.7513 3.7513 5.3016 5.3016 6.7948 + 7.8898 7.9453 7.9453 8.3596 8.3596 9.6959 11.6106 12.8098 + 12.8098 13.9151 13.9151 15.5234 + + k =-0.7500 0.2500 0.2500 ( 764 PWs) bands (ev): + + -7.6252 -7.3369 2.8992 3.7830 4.2305 4.2352 5.3425 5.5932 + 6.2103 6.5893 7.0478 8.5879 9.0050 9.3476 12.6590 13.1993 + 13.7472 14.0789 17.3920 17.6861 + + k =-0.5000-0.5000 0.5000 ( 780 PWs) bands (ev): + + -7.5257 -7.4199 2.3433 4.2175 4.2531 4.2534 5.3403 5.5298 + 6.7162 6.7407 6.9207 8.5161 8.7315 9.6260 12.7043 13.2595 + 14.1866 14.2868 15.3331 16.6978 + + k =-0.2500-0.2500-0.2500 ( 748 PWs) bands (ev): + + -8.1123 -8.0643 3.8351 3.8387 3.8387 4.6374 5.3440 5.3440 + 7.0483 7.0483 7.6438 9.2946 9.2946 9.3598 12.7706 12.7706 + 13.6772 13.6772 14.1447 14.4302 + + ------ SPIN DOWN ---------- + + + k = 0.0000 0.0000 0.0000 ( 731 PWs) bands (ev): + + -8.6635 -7.4040 2.2228 3.7514 3.7514 5.3035 5.3035 6.7936 + 7.8898 7.9452 7.9452 8.3612 8.3612 9.7059 11.6106 12.8074 + 12.8074 13.9137 13.9137 15.5233 + + k =-0.7500 0.2500 0.2500 ( 764 PWs) bands (ev): + + -7.6252 -7.3370 2.9017 3.7847 4.2290 4.2346 5.3428 5.5981 + 6.2085 6.5887 7.0483 8.5865 9.0071 9.3411 12.6611 13.1994 + 13.7463 14.0783 17.3920 17.6860 + + k =-0.5000-0.5000 0.5000 ( 780 PWs) bands (ev): + + -7.5257 -7.4199 2.3437 4.2159 4.2531 4.2563 5.3406 5.5281 + 6.7162 6.7407 6.9215 8.5226 8.7326 9.6171 12.7059 13.2597 + 14.1854 14.2866 15.3331 16.6979 + + k =-0.2500-0.2500-0.2500 ( 748 PWs) bands (ev): + + -8.1123 -8.0643 3.8324 3.8385 3.8385 4.6280 5.3457 5.3457 + 7.0509 7.0509 7.6471 9.2940 9.2940 9.3685 12.7682 12.7682 + 13.6760 13.6760 14.1447 14.4310 + + the Fermi energy is 10.3943 ev + +! total energy = -174.58750911 Ry + estimated scf accuracy < 1.5E-10 Ry + smearing contrib. (-TS) = -0.00000000 Ry + internal energy E=F+TS = -174.58750911 Ry + + The total energy is F=E-TS. E is the sum of the following terms: + one-electron contribution = 0.55289282 Ry + hartree contribution = 28.09310460 Ry + xc contribution = -65.86422036 Ry + ewald contribution = -137.50929535 Ry + Hubbard energy = 0.14000918 Ry + + total magnetization = 0.00 Bohr mag/cell + absolute magnetization = 7.39 Bohr mag/cell + + convergence has been achieved in 13 iterations + + Forces acting on atoms (cartesian axes, Ry/au): + + atom 1 type 1 force = 0.00000305 0.00000305 0.00000305 + atom 2 type 1 force = -0.00000305 -0.00000305 -0.00000305 + atom 3 type 2 force = -0.00000000 0.00000000 0.00000000 + atom 4 type 3 force = 0.00000000 0.00000000 0.00000000 + + Total force = 0.000007 Total SCF correction = 0.000006 + SCF correction compared to forces is large: reduce conv_thr to get better values + + + Computing stress (Cartesian axis) and pressure + + total stress (Ry/bohr**3) (kbar) P= -116.64 + -0.00079290 -0.00025323 -0.00025323 -116.64 -37.25 -37.25 + -0.00025323 -0.00079290 -0.00025323 -37.25 -116.64 -37.25 + -0.00025323 -0.00025323 -0.00079290 -37.25 -37.25 -116.64 + + + Writing output data file ./pwscf.save/ + + init_run : 1.04s CPU 1.08s WALL ( 1 calls) + electrons : 8.96s CPU 9.70s WALL ( 1 calls) + forces : 0.37s CPU 0.40s WALL ( 1 calls) + stress : 0.93s CPU 0.99s WALL ( 1 calls) + + Called by init_run: + wfcinit : 0.25s CPU 0.26s WALL ( 1 calls) + potinit : 0.04s CPU 0.04s WALL ( 1 calls) + hinit0 : 0.70s CPU 0.70s WALL ( 1 calls) + + Called by electrons: + c_bands : 5.20s CPU 5.24s WALL ( 13 calls) + sum_band : 2.66s CPU 3.04s WALL ( 13 calls) + v_of_rho : 0.31s CPU 0.30s WALL ( 14 calls) + newd : 0.73s CPU 1.07s WALL ( 14 calls) + mix_rho : 0.09s CPU 0.09s WALL ( 13 calls) + + Called by c_bands: + init_us_2 : 0.09s CPU 0.10s WALL ( 256 calls) + cegterg : 4.90s CPU 4.97s WALL ( 104 calls) + + Called by *egterg: + cdiaghg : 0.14s CPU 0.15s WALL ( 430 calls) + h_psi : 4.66s CPU 4.74s WALL ( 438 calls) + s_psi : 0.06s CPU 0.07s WALL ( 478 calls) + g_psi : 0.02s CPU 0.02s WALL ( 326 calls) + + Called by h_psi: + h_psi:calbec : 0.05s CPU 0.06s WALL ( 438 calls) + vloc_psi : 4.44s CPU 4.48s WALL ( 438 calls) + add_vuspsi : 0.05s CPU 0.06s WALL ( 438 calls) + vhpsi : 0.12s CPU 0.14s WALL ( 438 calls) + + General routines + calbec : 0.28s CPU 0.30s WALL ( 4324 calls) + fft : 0.15s CPU 0.17s WALL ( 158 calls) + ffts : 0.02s CPU 0.02s WALL ( 54 calls) + fftw : 4.62s CPU 4.73s WALL ( 13004 calls) + interpolate : 0.04s CPU 0.05s WALL ( 28 calls) + davcio : 0.00s CPU 0.00s WALL ( 8 calls) + + Parallel routines + + Hubbard U routines + new_nsg : 0.03s CPU 0.03s WALL ( 13 calls) + alloc_neigh : 0.00s CPU 0.00s WALL ( 1 calls) + vhpsi : 0.12s CPU 0.14s WALL ( 438 calls) + force_hub : 0.23s CPU 0.23s WALL ( 1 calls) + stres_hub : 0.40s CPU 0.41s WALL ( 1 calls) + + PWSCF : 11.44s CPU 12.31s WALL + + + This run was terminated on: 10:28:28 7Oct2020 + +=------------------------------------------------------------------------------= + JOB DONE. +=------------------------------------------------------------------------------= diff --git a/test-suite/pw_lda+U/lda+U+V-user_ns.in b/test-suite/pw_lda+U/lda+U+V-user_ns.in new file mode 100644 index 000000000..90484eac2 --- /dev/null +++ b/test-suite/pw_lda+U/lda+U+V-user_ns.in @@ -0,0 +1,43 @@ + &control + calculation = 'scf' + tprnfor = .true. + tstress = .true. + / + &system + ibrav= 0, celldm(1)=8.19, nat= 4, ntyp= 3, + ecutwfc = 30.0, ecutrho = 240.0, nbnd=20, + starting_magnetization(1)= 0.0, + starting_magnetization(2)= 0.5, + starting_magnetization(3)=-0.5, + occupations='smearing', smearing='gauss', degauss=0.01, + nspin=2, + lda_plus_u=.true., + lda_plus_u_kind = 2, + Hubbard_V(3,3,1) = 4.3, + Hubbard_V(3,2,1) = 0.8, + Hubbard_V(4,4,1) = 4.3, + U_projection_type = 'ortho-atomic', + starting_ns_eigenvalue(3,2,2) = 1.d0 + starting_ns_eigenvalue(3,1,3) = 1.d0 + / + &electrons + mixing_mode = 'plain' + mixing_beta = 0.3 + conv_thr = 1.0d-8 + mixing_fixed_ns = 0 + / +CELL_PARAMETERS (alat) +0.50 0.50 1.00 +0.50 1.00 0.50 +1.00 0.50 0.50 +ATOMIC_SPECIES + O1 1. O.pz-rrkjus.UPF + Fe1 1. Fe.pz-nd-rrkjus.UPF + Fe2 1. Fe.pz-nd-rrkjus.UPF +ATOMIC_POSITIONS {crystal} + O1 0.25 0.25 0.25 + O1 0.75 0.75 0.75 + Fe1 0.0 0.0 0.0 + Fe2 0.5 0.5 0.5 +K_POINTS {automatic} +2 2 2 0 0 0 diff --git a/test-suite/testcode/bin/testcode.py b/test-suite/testcode/bin/testcode.py index ed474227f..93517712c 100755 --- a/test-suite/testcode/bin/testcode.py +++ b/test-suite/testcode/bin/testcode.py @@ -26,6 +26,7 @@ documentation for further details.''' # copyright: (c) 2012 James Spencer # license: modified BSD; see LICENSE for more details +from __future__ import print_function import glob import optparse import os diff --git a/test-suite/testcode/lib/testcode2/__init__.py b/test-suite/testcode/lib/testcode2/__init__.py index acf422121..b823c058b 100644 --- a/test-suite/testcode/lib/testcode2/__init__.py +++ b/test-suite/testcode/lib/testcode2/__init__.py @@ -8,6 +8,7 @@ A framework for regression testing numerical programs. :license: modified BSD; see LICENSE for more details. ''' +from __future__ import print_function import glob import os import pipes diff --git a/test-suite/testcode/lib/testcode2/config.py b/test-suite/testcode/lib/testcode2/config.py index b4d0ebfdc..4ac1cfdaa 100644 --- a/test-suite/testcode/lib/testcode2/config.py +++ b/test-suite/testcode/lib/testcode2/config.py @@ -8,6 +8,7 @@ Parse jobconfig and userconfig ini files. :license: modified BSD; see LICENSE for more details. ''' +from __future__ import print_function import copy import glob import os diff --git a/test-suite/testcode/lib/testcode2/exceptions.py b/test-suite/testcode/lib/testcode2/exceptions.py index 11652169e..ea356dc23 100644 --- a/test-suite/testcode/lib/testcode2/exceptions.py +++ b/test-suite/testcode/lib/testcode2/exceptions.py @@ -8,6 +8,7 @@ Custom exceptions. Initialise signal handler for the interrupt signal. :license: modified BSD; see LICENSE for more details. ''' +from __future__ import print_function import signal import sys diff --git a/test-suite/testcode/lib/testcode2/validation.py b/test-suite/testcode/lib/testcode2/validation.py index 08abb4d88..ad9b0c535 100644 --- a/test-suite/testcode/lib/testcode2/validation.py +++ b/test-suite/testcode/lib/testcode2/validation.py @@ -8,6 +8,7 @@ Classes and functions for comparing data. :license: modified BSD; see LICENSE for more details. ''' +from __future__ import print_function import re import sys import warnings diff --git a/upflib/CMakeLists.txt b/upflib/CMakeLists.txt index 5b731a1dc..dc2a183cb 100644 --- a/upflib/CMakeLists.txt +++ b/upflib/CMakeLists.txt @@ -45,6 +45,32 @@ target_link_libraries(qe_upflib PUBLIC QE::FOX) +############################################################## +# virtual_v2.x +############################################################## +set(sources virtual_v2.f90) +qe_add_executable(qe_upflib_virtual_v2_exe ${sources}) +set_target_properties(qe_upflib_virtual_v2_exe PROPERTIES OUTPUT_NAME virtual_v2.x) +target_link_libraries(qe_upflib_virtual_v2_exe + PRIVATE + QE::UPF +) ########################################################### +# upfconv.x +########################################################### +set(sources + upfconv.f90 + casino_pp.f90 +) +qe_add_executable(qe_upflib_upfconv_exe ${sources}) +set_target_properties(qe_upflib_upfconv_exe PROPERTIES OUTPUT_NAME upfconv.x) +target_link_libraries(qe_upflib_upfconv_exe + PRIVATE + QE::UPF +) -qe_install_targets(qe_upflib) +############################################################################ +qe_install_targets(qe_upflib + qe_upflib_virtual_v2_exe + qe_upflib_upfconv_exe +) diff --git a/upflib/fixfiles.py b/upflib/fixfiles.py index ec4f8e06b..5a708a83d 100755 --- a/upflib/fixfiles.py +++ b/upflib/fixfiles.py @@ -4,6 +4,7 @@ simple script to mark as CDATA all text contained in PP_INPUTFILE element. It avoids any issue related to the presence on XML reserved characters in that section. """ +from __future__ import print_function from subprocess import Popen, PIPE from xml.etree import cElementTree as eT import os diff --git a/upflib/read_upf_new.f90 b/upflib/read_upf_new.f90 index 191251350..d94cc4bd9 100644 --- a/upflib/read_upf_new.f90 +++ b/upflib/read_upf_new.f90 @@ -721,7 +721,9 @@ CONTAINS CALL xmlr_opentag( 'PP_GIPAW_CORE_ORBITALS') CALL get_attr ('number_of_core_orbitals', upf%gipaw_ncore_orbitals) ELSE - print *, 'FIXME! upf%gipaw_ncore_orbitals' + CALL xmlr_readtag ('number_of_core_orbitals', upf%gipaw_ncore_orbitals) + IF ( .NOT. upf%paw_as_gipaw) & + CALL xmlr_readtag( 'number_of_valence_orbitals', upf%gipaw_wfs_nchannels) END IF ALLOCATE ( upf%gipaw_core_orbital(upf%mesh,upf%gipaw_ncore_orbitals) ) ALLOCATE ( upf%gipaw_core_orbital_n(upf%gipaw_ncore_orbitals) ) @@ -778,8 +780,6 @@ CONTAINS CALL xmlr_opentag( 'PP_GIPAW_ORBITALS' ) CALL get_attr( 'number_of_valence_orbitals', & upf%gipaw_wfs_nchannels ) - ELSE - print *, 'FIXME! upf%gipaw_wfs_nchannel' END IF ALLOCATE ( upf%gipaw_wfs_el(upf%gipaw_wfs_nchannels) ) ALLOCATE ( upf%gipaw_wfs_ll(upf%gipaw_wfs_nchannels) ) diff --git a/upflib/write_upf_new.f90 b/upflib/write_upf_new.f90 index b31abf4c6..d24de6211 100644 --- a/upflib/write_upf_new.f90 +++ b/upflib/write_upf_new.f90 @@ -816,6 +816,10 @@ CONTAINS IF ( v2 ) THEN call add_attr( 'number_of_core_orbitals', upf%gipaw_ncore_orbitals ) CALL xmlw_opentag( 'PP_GIPAW_CORE_ORBITALS' ) + ELSE + CALL xmlw_writetag('number_of_core_orbitals', upf%gipaw_ncore_orbitals ) + IF ( .NOT. upf%paw_as_gipaw ) & + CALL xmlw_writetag('number_of_valence_orbitals', upf%gipaw_wfs_nchannels) END IF DO nb = 1,upf%gipaw_ncore_orbitals IF ( v2 ) THEN diff --git a/upflib/write_upf_schema.f90 b/upflib/write_upf_schema.f90 index 7e2e1a7db..4be6321b5 100644 --- a/upflib/write_upf_schema.f90 +++ b/upflib/write_upf_schema.f90 @@ -733,6 +733,14 @@ CONTAINS CALL xml_newElement(u, 'pp_gipaw') CALL xml_addAttribute(u, 'gipaw_data_format', upf%gipaw_data_format ) + CALL xml_NewElement (u, 'number_of_core_orbitals') + CALL xml_AddCharacters(u, upf%gipaw_ncore_orbitals) + CALL xml_endElement(u, 'number_of_core_orbitals') + IF ( .NOT. upf%paw_as_gipaw ) THEN + CALL xml_newElement (u, 'number_of_valence_orbitals') + CALL xml_AddCharacters(u, upf%gipaw_wfs_nchannels) + CALL xml_endElement(u, 'number_of_valence_orbitals') + END IF DO nb = 1,upf%gipaw_ncore_orbitals CALL xml_NewElement(u, 'pp_gipaw_core_orbital') CALL xml_addAttribute(u, 'size', upf%mesh)