From 0e585ad9b46206735297567273634fecaa67da75 Mon Sep 17 00:00:00 2001 From: Olivier Parcollet Date: Tue, 23 Jul 2013 19:49:42 +0200 Subject: [PATCH] First import. triqs 1.0 alpha1 --- CMakeLists.txt | 23 + fortran/F90/CMakeLists.txt | 3 + fortran/F90/vertex.f90 | 226 +++ fortran/F90/vertex.pyf | 17 + fortran/dmftproj/CMakeLists.txt | 33 + fortran/dmftproj/SRC_templates/case.cf_f_mm2 | 14 + .../dmftproj/SRC_templates/case.cf_p_cubic | 7 + fortran/dmftproj/SRC_templates/case.indmftpr | 16 + fortran/dmftproj/SRC_templates/run_triqs | 784 +++++++++ fortran/dmftproj/SRC_templates/runsp_triqs | 975 +++++++++++ fortran/dmftproj/density.f | 1109 +++++++++++++ fortran/dmftproj/dmftproj.f | 764 +++++++++ fortran/dmftproj/modules.f | 410 +++++ fortran/dmftproj/orthogonal.f | 225 +++ fortran/dmftproj/orthogonal_wannier.f | 593 +++++++ fortran/dmftproj/outband.f | 287 ++++ fortran/dmftproj/outbwin.f | 92 ++ fortran/dmftproj/outputqmc.f | 1405 ++++++++++++++++ fortran/dmftproj/read_k_list.f | 98 ++ fortran/dmftproj/readcomline.f | 105 ++ fortran/dmftproj/rot_dens.f | 239 +++ fortran/dmftproj/rot_projectmat.f | 72 + fortran/dmftproj/set_ang_trans.f | 538 +++++++ fortran/dmftproj/set_projections.f | 724 +++++++++ fortran/dmftproj/set_rotloc.f | 368 +++++ fortran/dmftproj/setsym.f | 886 ++++++++++ fortran/dmftproj/symmetrize_mat.f | 292 ++++ fortran/dmftproj/timeinv.f | 289 ++++ python/CMakeLists.txt | 18 + python/U_matrix.py | 100 ++ python/__init__.py | 31 + python/converters/CMakeLists.txt | 6 + python/converters/__init__.py | 27 + python/converters/wien2k_converter.py | 581 +++++++ python/solver_multiband.py | 449 ++++++ python/sumk_lda.py | 1149 +++++++++++++ python/sumk_lda_tools.py | 625 ++++++++ python/symmetry.py | 176 ++ test/CMakeLists.txt | 10 + test/SrVO3.ctqmcout | 144 ++ test/SrVO3.h5 | Bin 0 -> 662272 bytes test/SrVO3.parproj | 620 +++++++ test/SrVO3.sympar | 1421 +++++++++++++++++ test/SrVO3.symqmc | 343 ++++ test/U_mat.output.h5 | Bin 0 -> 12344 bytes test/U_mat.py | 51 + test/srvo3_Gloc.output.h5 | Bin 0 -> 150842 bytes test/srvo3_Gloc.py | 64 + test/sumklda_basic.output.h5 | Bin 0 -> 11536 bytes test/sumklda_basic.py | 36 + test/wien2k_convert.output.h5 | Bin 0 -> 630112 bytes test/wien2k_convert.py | 36 + 52 files changed, 16481 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 fortran/F90/CMakeLists.txt create mode 100644 fortran/F90/vertex.f90 create mode 100644 fortran/F90/vertex.pyf create mode 100644 fortran/dmftproj/CMakeLists.txt create mode 100644 fortran/dmftproj/SRC_templates/case.cf_f_mm2 create mode 100644 fortran/dmftproj/SRC_templates/case.cf_p_cubic create mode 100644 fortran/dmftproj/SRC_templates/case.indmftpr create mode 100755 fortran/dmftproj/SRC_templates/run_triqs create mode 100755 fortran/dmftproj/SRC_templates/runsp_triqs create mode 100644 fortran/dmftproj/density.f create mode 100644 fortran/dmftproj/dmftproj.f create mode 100644 fortran/dmftproj/modules.f create mode 100644 fortran/dmftproj/orthogonal.f create mode 100644 fortran/dmftproj/orthogonal_wannier.f create mode 100644 fortran/dmftproj/outband.f create mode 100644 fortran/dmftproj/outbwin.f create mode 100644 fortran/dmftproj/outputqmc.f create mode 100644 fortran/dmftproj/read_k_list.f create mode 100644 fortran/dmftproj/readcomline.f create mode 100644 fortran/dmftproj/rot_dens.f create mode 100644 fortran/dmftproj/rot_projectmat.f create mode 100644 fortran/dmftproj/set_ang_trans.f create mode 100644 fortran/dmftproj/set_projections.f create mode 100644 fortran/dmftproj/set_rotloc.f create mode 100644 fortran/dmftproj/setsym.f create mode 100644 fortran/dmftproj/symmetrize_mat.f create mode 100644 fortran/dmftproj/timeinv.f create mode 100644 python/CMakeLists.txt create mode 100644 python/U_matrix.py create mode 100644 python/__init__.py create mode 100644 python/converters/CMakeLists.txt create mode 100644 python/converters/__init__.py create mode 100644 python/converters/wien2k_converter.py create mode 100644 python/solver_multiband.py create mode 100644 python/sumk_lda.py create mode 100644 python/sumk_lda_tools.py create mode 100644 python/symmetry.py create mode 100644 test/CMakeLists.txt create mode 100644 test/SrVO3.ctqmcout create mode 100644 test/SrVO3.h5 create mode 100644 test/SrVO3.parproj create mode 100644 test/SrVO3.sympar create mode 100644 test/SrVO3.symqmc create mode 100644 test/U_mat.output.h5 create mode 100644 test/U_mat.py create mode 100644 test/srvo3_Gloc.output.h5 create mode 100644 test/srvo3_Gloc.py create mode 100644 test/sumklda_basic.output.h5 create mode 100644 test/sumklda_basic.py create mode 100644 test/wien2k_convert.output.h5 create mode 100644 test/wien2k_convert.py diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..c6de867d --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,23 @@ +# Append triqs installed files to the cmake load path +list(APPEND CMAKE_MODULE_PATH ${TRIQS_PATH}/share/triqs/cmake) + +# start configuration +cmake_minimum_required(VERSION 2.8) +project(ctseg CXX Fortran) +set(CMAKE_BUILD_TYPE Release) +enable_testing() + +# Load TRIQS, including all predefined variables from TRIQS installation +find_package(TRIQS) + +if (NOT ${TRIQS_WITH_PYTHON_SUPPORT}) + MESSAGE(FATAL_ERROR "Wien2TRIQS require Python support in TRIQS") +endif() + +# We want to be installed in the TRIQS tree +set(CMAKE_INSTALL_PREFIX ${TRIQS_PATH}) + +add_subdirectory(fortran/dmftproj) +add_subdirectory(fortran/F90) +add_subdirectory(python) +add_subdirectory(test) diff --git a/fortran/F90/CMakeLists.txt b/fortran/F90/CMakeLists.txt new file mode 100644 index 00000000..137559c2 --- /dev/null +++ b/fortran/F90/CMakeLists.txt @@ -0,0 +1,3 @@ + +triqs_build_f2py_module( triqs_DFT vertex vertex.pyf vertex.f90) +install (FILES ${CMAKE_CURRENT_BINARY_DIR}/vertex.so DESTINATION ${TRIQS_PYTHON_LIB_DEST}/applications/dft) diff --git a/fortran/F90/vertex.f90 b/fortran/F90/vertex.f90 new file mode 100644 index 00000000..0462a549 --- /dev/null +++ b/fortran/F90/vertex.f90 @@ -0,0 +1,226 @@ +SUBROUTINE u4ind(u_out,rcl,l,N,TM) + + IMPLICIT NONE + + INTEGER,INTENT(in) :: l,N + COMPLEX*16, DIMENSION(N,N), INTENT(in) :: TM !Transformation Matrix + DOUBLE PRECISION, DIMENSION(2*l+1,2*l+1,2*l+1,2*l+1) :: uc + !double precision, dimension(N,N,N,N), intent(out) :: u_out + COMPLEX*16, DIMENSION(N,N,N,N), INTENT(out) :: u_out + DOUBLE PRECISION, DIMENSION(N,N,N,N) :: u_tmp + DOUBLE PRECISION, DIMENSION(l+1), INTENT(in) :: rcl + + INTEGER :: mmax,k,k2p1,ms1,ms2,ms3,ms4,ms5,ms6,ms7,ms8 + INTEGER :: sp,ms1sig,ms2sig,ms3sig,ms4sig + INTEGER :: xk,xm1,xm2,xm3,xm,xm4 + DOUBLE PRECISION :: cgk0,cgk1,cgk2,yor(7,7),yoi(7,7) + COMPLEX*16 :: am1,am2,am3,am4 + + !external cgk, ctormt + + !WRITE(*,*)l,N + mmax=2*l+1 + + IF ((N==mmax).OR.(N==2*mmax)) THEN + ! dimensions are fine: + uc=0.d0 + + DO k = 0, 2*l, 2 + k2p1 = k/2 + 1 + cgk0 = cgk(l,0,k,0,l,0) + DO ms1 = 1,mmax + xm1 = (ms1-l-1) + DO ms2 = 1,mmax + xm2 = (ms2-l-1) + DO ms3 = 1,mmax + xm3 = (ms3-l-1) + xm = xm1 - xm3 + DO ms4 = 1,mmax + IF ((ms1+ms2-ms3-ms4).NE.0) CYCLE + xm4 = (ms4-l-1) + cgk1 = cgk(l,xm3,k,xm,l,xm1) + cgk2 = cgk(l,xm2,k,xm,l,xm4) + uc(ms1,ms2,ms3,ms4) = uc(ms1,ms2,ms3,ms4) + rcl(k2p1)*cgk0*cgk0*cgk1*cgk2 + ENDDO + ENDDO + ENDDO + ENDDO + ENDDO + + u_tmp = 0.d0 + sp = (N/mmax)-1 + + ! Now construct the big u matrix: + ! expand in spins: + DO ms1=1,mmax + DO ms1sig =0,sp + DO ms2=1,mmax + DO ms2sig=0,sp + DO ms3 = 1,mmax + DO ms3sig = 0,sp + DO ms4 = 1,mmax + DO ms4sig = 0,sp + IF ((ms1sig==ms3sig).AND.(ms2sig==ms4sig)) THEN + u_tmp(ms1sig*mmax+ms1,ms2sig*mmax+ms2,ms3sig*mmax+ms3,ms4sig*mmax+ms4) = uc(ms1,ms2,ms3,ms4) + ENDIF + ENDDO + ENDDO + ENDDO + ENDDO + ENDDO + ENDDO + ENDDO + ENDDO + + !call ctormt() + ! Transformation: + !write(*,*)'TEST' + u_out = 0.d0 + DO ms1=1,N + DO ms2=1,N + DO ms3=1,N + DO ms4=1,N + DO ms5=1,N + am1 = CONJG(TM(ms1,ms5)) !cmplx(yor(ms1,ms5),-yoi(ms1,ms5)) + DO ms6=1,N + am2 = CONJG(TM(ms2,ms6)) !cmplx(yor(ms2,ms6),-yoi(ms2,ms6)) + DO ms7=1,N + am3 = TM(ms3,ms7) !cmplx(yor(ms3,ms7),yoi(ms3,ms7)) + DO ms8=1,N + am4 = TM(ms4,ms8) !cmplx(yor(ms4,ms8),yoi(ms4,ms8)) + u_out(ms1,ms2,ms3,ms4) = u_out(ms1,ms2,ms3,ms4) + am1*am2*am3*am4 * u_tmp(ms5,ms6,ms7,ms8) + ENDDO + ENDDO + ENDDO + ENDDO + !if (abs(u_out(ms1,ms2,ms3,ms4))>0.0001d0) then + ! write(*,*)ms1,ms2,ms3,ms4, u_out(ms1,ms2,ms3,ms4) + !endif + ENDDO + ENDDO + ENDDO + ENDDO + + ELSE + + WRITE(*,*)"N and l does not fit together: N=2l+1 or 2*(2l+1)!" + + ENDIF + + + + +CONTAINS + + + SUBROUTINE ctormt + IMPLICIT NONE + DOUBLE PRECISION :: sqtwo, sq54, sq34 + + yor=0.d0 + yoi=0.d0 + sqtwo=1.d0/SQRT(2.d0) + sq54=SQRT(5.d0)/4d0 + sq34=SQRT(3.d0)/4d0 + IF (l.EQ.0) THEN + yor(1,1)=1.d0 + ELSEIF (l.EQ.1) THEN + yor(1,1)= sqtwo + yor(1,3)=-sqtwo + yor(2,2)=1.d0 + yoi(3,1)= sqtwo + yoi(3,3)= sqtwo + ELSEIF (l.EQ.2) THEN + !yoi(1,1)= sqtwo + !yoi(1,5)=-sqtwo + !yoi(2,2)= sqtwo + !yoi(2,4)= sqtwo + !yor(3,3)=1.d0 + !yor(4,2)= sqtwo + !yor(4,4)=-sqtwo + !yor(5,1)= sqtwo + !yor(5,5)= sqtwo + ! Wien2K matrix: + yor(3,1) = -sqtwo + yor(3,5) = sqtwo + yor(5,2) = sqtwo + yor(5,4) = sqtwo + yor(1,3) = 1.d0 + yor(4,2) = sqtwo + yor(4,4) = -sqtwo + yor(2,1) = sqtwo + yor(2,5) = sqtwo + ELSEIF (l.EQ.3) THEN + yoi(1,2)=sqtwo + yoi(1,6)=-sqtwo + yor(2,1)=-sq54 + yor(2,3)=sq34 + yor(2,5)=-sq34 + yor(2,7)=sq54 + yoi(3,1)=-sq54 + yoi(3,3)=-sq34 + yoi(3,5)=-sq34 + yoi(3,7)=-sq54 + yor(4,4)=1.d0 + yor(5,1)=-sq34 + yor(5,3)=-sq54 + yor(5,5)=sq54 + yor(5,7)=sq34 + yoi(6,1)=sq34 + yoi(6,3)=-sq54 + yoi(6,5)=-sq54 + yoi(6,7)=sq34 + yor(7,2)=sqtwo + yor(7,6)=sqtwo + ENDIF + END SUBROUTINE ctormt + + + DOUBLE PRECISION FUNCTION cgk(a,al,b,be,c,ga) + IMPLICIT NONE + + INTEGER :: a,al,b,be,c,ga + + INTEGER :: z,zmin,zmax,i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13 + DOUBLE PRECISION :: fa(0:20), fac + + fa = (/1.d0, 1.d0, 2.d0, 6.d0, 24.d0, 12.d1, 72.d1, 504.d1,& + 4032.d1, 36288.d1, 36288.d2, 399168.d2, 4790016.d2,& + 62270208.d2, 871782912.d2, 1307674368.d3, 20922789888.d3,& + 355687428096.d3, 6402373705728.d3, 121645100408832.d3,243290200817664.d4/) + + + i1=0 + i2=(a+b-c) + i3=(a-al) + i4=(b+be) + i5=(c-b+al) + i6=(c-a-be) + zmin=MAX(i1,-i5,-i6) + zmax=MIN(i2, i3, i4) + cgk=0.d0 + IF (ABS(al).GT.a) RETURN + IF (ABS(be).GT.b) RETURN + IF (ABS(ga).GT.c) RETURN + IF ( zmin.GT.zmax ) RETURN + IF ( (al+be).NE.ga ) RETURN + i7=(a-b+c) + i8=(c+b-a) + i9=(c+b+a) + i10=(a+al) + i11=(b-be) + i12=(c+ga) + i13=(c-ga) + DO z=zmin,zmax + IF (MOD(z,2)==0) THEN + fac = 1.d0 + ELSE + fac=-1.d0 + ENDIF + cgk=cgk+fac/(fa(z)*fa(i2-z)*fa(i3-z)*fa(i4-z)*fa(i5+z)* fa(i6+z)) + ENDDO + cgk=cgk*SQRT(fa(i2)*fa(i7)*fa(i8)*fa(i10)*fa(i3)*fa(i4)*fa(i11)*fa(i12)*fa(i13)*(2.d0*c+1.d0)/fa(i9+1)) + + END FUNCTION cgk + +END SUBROUTINE u4ind diff --git a/fortran/F90/vertex.pyf b/fortran/F90/vertex.pyf new file mode 100644 index 00000000..bfe66ce0 --- /dev/null +++ b/fortran/F90/vertex.pyf @@ -0,0 +1,17 @@ +! -*- f90 -*- +! Note: the context of this file is case sensitive. + +python module vertex ! in + interface ! in :vertex + subroutine u4ind(u_out,rcl,l,n,tm) ! in :vertex:vertex.f90 + complex*16 dimension(n,n,n,n),intent(out),depend(n,n,n,n) :: u_out + double precision dimension(l + 1),intent(in) :: rcl + integer optional,intent(in),check((len(rcl)-1)>=l),depend(rcl) :: l=(len(rcl)-1) + integer optional,intent(in),check(shape(tm,0)==n),depend(tm) :: n=shape(tm,0) + complex*16 dimension(n,n),intent(in) :: tm + end subroutine u4ind + end interface +end python module vertex + +! This file was auto-generated with f2py (version:1). +! See http://cens.ioc.ee/projects/f2py2e/ diff --git a/fortran/dmftproj/CMakeLists.txt b/fortran/dmftproj/CMakeLists.txt new file mode 100644 index 00000000..663b10b6 --- /dev/null +++ b/fortran/dmftproj/CMakeLists.txt @@ -0,0 +1,33 @@ +# List the sources +set (SOURCES modules dmftproj readcomline set_ang_trans setsym + set_rotloc timeinv read_k_list set_projections orthogonal + rot_projectmat density symmetrize_mat rot_dens + orthogonal_wannier outputqmc outbwin outband) + +# add the extension and the path +FOREACH(f ${SOURCES} ) + set(S "${CMAKE_CURRENT_SOURCE_DIR}/${f}.f;${S}") +ENDFOREACH(f) + +# The main target and what to link with... +add_executable(dmftproj ${S}) +target_link_libraries(dmftproj ${TRIQS_LIBRARY_LAPACK} ) + +# where to install +install (TARGETS dmftproj DESTINATION bin ) + +# that is it ! + +SET( D ${CMAKE_CURRENT_SOURCE_DIR}/SRC_templates/) +SET(WIEN_SRC_TEMPL_FILES ${D}/case.cf_f_mm2 ${D}/case.cf_p_cubic ${D}/case.indmftpr ${D}/run_triqs ${D}/runsp_triqs) + +# build the fortran stuff... +message(STATUS "-----------------------------------------------------------------------------") +message(STATUS " ******** WARNING ******** ") +message(STATUS " Wien2k users : after installation of TRIQS, copy the files from ") +message(STATUS " ${CMAKE_INSTALL_PREFIX}/share/triqs/Wien2k_SRC_files/SRC_templates ") +message(STATUS " to your Wien2k installation WIENROOT/SRC_templates (Cf documentation). ") +message(STATUS " This is not handled automatically by the installation process. ") +message(STATUS "-----------------------------------------------------------------------------") +install (FILES ${WIEN_SRC_TEMPL_FILES} DESTINATION share/triqs/Wien2k_SRC_files/SRC_templates ) + diff --git a/fortran/dmftproj/SRC_templates/case.cf_f_mm2 b/fortran/dmftproj/SRC_templates/case.cf_f_mm2 new file mode 100644 index 00000000..3dea83d3 --- /dev/null +++ b/fortran/dmftproj/SRC_templates/case.cf_f_mm2 @@ -0,0 +1,14 @@ + 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. +*0. 0. 0.70710678 0. 0. 0. 0. 0. 0. 0. 0.70710678 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. A1 +*0. 0. 0. 0.70710678 0. 0. 0. 0. 0. 0. 0. -.70710678 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. A2 + 0. 0.70710678 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.70710678 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. +*0. 0. 0. 0. 0. 0.70710678 0. 0. 0. 0.70710678 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. B1 + 0.70710678 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. -.70710678 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. +*0. 0. 0. 0. 0.70710678 0. 0. 0. -.70710678 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. B2 + 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. 0. +*0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.70710678 0. 0. 0. 0. 0. 0. 0. 0.70710678 0. 0. 0. A1 +*0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.70710678 0. 0. 0. 0. 0. 0. 0. -.70710678 0. 0. A2 + 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.70710678 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.70710678 +*0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.70710678 0. 0. 0. 0.70710678 0. 0. 0. 0. B1 + 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.70710678 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. -.70710678 0. +*0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.70710678 0. 0. 0. -.70710678 0. 0. 0. 0. 0. B2 diff --git a/fortran/dmftproj/SRC_templates/case.cf_p_cubic b/fortran/dmftproj/SRC_templates/case.cf_p_cubic new file mode 100644 index 00000000..69e90cdb --- /dev/null +++ b/fortran/dmftproj/SRC_templates/case.cf_p_cubic @@ -0,0 +1,7 @@ + 0.707106781 0. 0. 0. -0.707106781 0. 0. 0. 0. 0. 0. 0. + 0. 0.707106781 0. 0. 0. 0.707106781 0. 0. 0. 0. 0. 0. +*0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0. + 0. 0. 0. 0. 0. 0. 0.707106781 0. 0. 0. -0.707106781 0. + 0. 0. 0. 0. 0. 0. 0. 0.707106781 0. 0. 0. 0.707106781 +*0. 0. 0. 0. 0. 0. 0. 0. 1. 0. 0. 0. + diff --git a/fortran/dmftproj/SRC_templates/case.indmftpr b/fortran/dmftproj/SRC_templates/case.indmftpr new file mode 100644 index 00000000..100fdd2e --- /dev/null +++ b/fortran/dmftproj/SRC_templates/case.indmftpr @@ -0,0 +1,16 @@ +3 ! Nsort +1 1 3 ! Mult(Nsort) +3 ! lmax +complex ! choice of angular harmonics +1 1 0 0 ! l included for each sort +0 0 0 0 ! If split into ireps, gives number of ireps. for a given orbital (otherwise 0) +cubic ! choice of angular harmonics +1 1 2 0 ! l included for each sort +0 0 2 0 ! If split into ireps, gives number of ireps. for a given orbital (otherwise 0) +01 ! +0 ! SO flag +complex ! choice of angular harmonics +1 1 0 0 ! l included for each sort +0 0 0 0 ! If split into ireps, gives number of ireps. for a given orbital (otherwise 0) +-0.6 0.14 ! t2g + eg + Op + diff --git a/fortran/dmftproj/SRC_templates/run_triqs b/fortran/dmftproj/SRC_templates/run_triqs new file mode 100755 index 00000000..4d9dd4a3 --- /dev/null +++ b/fortran/dmftproj/SRC_templates/run_triqs @@ -0,0 +1,784 @@ +#!/bin/csh -f +hup +unalias rm +unalias mv + +set name = $0 +set bin = $name:h #directory of WIEN-executables +if !(-d $bin) set bin = . +set name = $name:t #name of this script-file +set logfile = :log +set tmp = (:$name) #temporary files + +set scratch = # set directory for vectors and help files +if ($?SCRATCH) then #if envronment SCRATCH is set + set scratch=`echo $SCRATCH | sed -e 's/\/$//'`/ #set $scratch to that value +endif + + + +#---> functions & subroutines +alias testinput 'set errin="\!:1";if (! -e \!:1 || -z \!:1) goto \!:2' + +alias teststatus 'if ($status) goto error' +alias testerror 'if (! -z \!:1.error) goto error' +alias teststop 'if (\!:1 == $stopafter ) goto stop' +alias cleandayfile 'grep -v "\[" $dayfile >.tmp;'\ + 'mv .tmp $dayfile' +alias output 'set date = `date +"(%T)"`;'\ + 'printf "> %s\t%s " "\!:*" "$date" >> $dayfile' + +alias exec '($bin/x \!:*) >> $dayfile;'\ + 'teststatus' + +alias total_exec 'output \!:*;'\ + 'exec \!:*;'\ + 'cleandayfile;'\ + 'testerror \!:1;'\ + 'teststop \!:1' +alias TOTtoFOR 'sed "s/TOT/FOR/" \!:1 > $tmp;'\ + 'mv $tmp \!:1' +alias FORtoTOT 'sed "s/FOR/TOT/" \!:1 > $tmp;'\ + 'mv $tmp \!:1' +alias IPRINT_inc 'sed "s/0 NUMBER/1 NUMBER/g" \!:1 > .case.inc;'\ + 'mv .case.inc \!:1' + + +#---> default parameters +set ccut = 0.0000 #upper limit for charge convergence +set fcut = 0 #upper limit for force convergence +set ecut = 0.0001 #upper limit for energy convergence +unset ec_conv +set cc_conv +set fc_conv +set ec_test +unset ec_test1 +unset cc_test +unset fc_test +set iter = 40 #maximum number of iterations +set riter = 99 #restart after $riter iterations +set stopafter #stop after $stopafter +set next #set -> start cycle with $next +set qlimit = 0.05 #set -> writes E-L in new in1 when qlimit is fulfilled +set in1new = 999 +set write_all = -ef # new default: -in1ef is activated (version 10.1) +set para +set nohns +set nohns1 = 0 +set it +set readHinv +set it0 +unset vec2pratt +set itnum=0 +set itnum1=0 +set so +set complex +set complex2 +set cmplx +set cmplx2 +set broyd +set ctest=(0 0 0) +set etest=(0 0 0) +set msrcount=0 +# QDMFT +set qdmft +set hf +set diaghf +set nonself +set noibz +set newklist +set redklist +set NSLOTS = 1 +# END QDMFT + +#---> default flags +unset renorm +set in1orig +unset force #set -> force-calculation after self-consistency +unset f_not_conv +unset help #set -> help output +unset init #set -> switches initially set to total energy calc. + +#---> handling of input options +echo "> ($name) options: $argv" >> $logfile +alias sb 'shift; breaksw' #definition used in switch +while ($#argv) + switch ($1) + case -[H|h]: + set help; sb + case -so: + set complex2 = c + set cmplx2 = -c + set so = -so; sb + case -nohns: + set nohns = -nohns; shift; set nohns1 = $1;sb + case -it: + set itnum = 99; set it = -it; set it0 = -it; sb + case -it1: + set itnum = 99; set it = -it; set it0 = -it; touch .noHinv; sb + case -it2: + set itnum = 99; set it = -it; set it0 = -it; touch .fulldiag; sb + case -noHinv: + set itnum = 99; set it = -it; set it0 = -it; set readHinv = -noHinv; sb + case -vec2pratt: + set vec2pratt; sb + case -p: + set para = -p; sb + case -I: + set init; sb + case -NI: + unset broyd; sb + case -e: + shift; set stopafter = $1; sb + case -cc: + shift; set ccut = $1; set cc_test;unset cc_conv; sb + case -ec: + shift; set ecut = $1; set ec_test1;unset ec_conv; sb + case -fc: + shift; set f_not_conv; set fcut = $1; set fc_test;unset fc_conv; sb + case -ql: + shift; set qlimit = $1; sb + case -in1ef: + set in1new = -1;set write_all = -ef; sb + case -in1new: + shift; set in1new = $1;set write_all; sb + case -in1orig: + set in1orig = -in1orig; set in1new = 999; sb + case -renorm: + set renorm; set next=scf1; sb + case -i: + shift; set iter = $1; sb + case -r: + shift; set riter = $1; sb + case -s: + shift; set next = $1; sb +# QDMFT + case -qdmft: + set qdmft=-qdmft; set NSLOTS = $1; sb +# END QDMFT + case -hf: + set hf = -hf; sb + case -diaghf: + set diaghf = -diaghf; set hf = -hf; set iter = 1; sb + case -nonself: + set nonself = -nonself; set hf = -hf; set iter = 1; sb + case -noibz: + set noibz = -noibz; sb + case -newklist: + set newklist = -newklist; set hf = -hf; sb + case -redklist: + set redklist = -redklist; set hf = -hf; sb + default: + echo "ERROR: option $1 does not exist \!"; sb + endsw +end +if ($?help) goto help + +if($?cc_test) then + unset ec_test;set ec_conv +endif +if($?fc_test) then + unset ec_test;set ec_conv +endif +if($?ec_test1) then + set ec_test;unset ec_conv +endif +if(! $?ec_test) then + set ecut=0 +endif + +#---> path- and file-names +set file = `pwd` +set file = $file:t #tail of file-names +set dayfile = $file.dayfile #main output-file + +#---> starting out +printf "\nCalculating $file in `pwd`\non `hostname` with PID $$\n" > $dayfile +echo "using `cat $WIENROOT/VERSION` in $WIENROOT" >> $dayfile +printf "\n:LABEL1: Calculations in `pwd`\n:LABEL2: on `hostname` at `date`\n" >> $file.scf +echo ":LABEL3: using `cat $WIENROOT/VERSION` in $WIENROOT" >> $file.scf + +if ( "$so" == "-so" && "$hf" == "-hf") then + echo "Hartree-Fock and spin-orbit coupling not supported yet. STOP" + echo "Hartree-Fock and spin-orbit coupling not supported yet. STOP" >> $file.dayfile + exit 9 +endif + +if ( "$hf" == "-hf") then + if (-e $file.corewf) rm $file.corewf + IPRINT_inc $file.inc #modify IPRINT switch in case.inc +endif + +#---> complex +if ((-e $file.in1c) && !(-z $file.in1c)) then + set complex = c + set complex2 = c + set cmplx = -c + set cmplx2 = -c +endif + +set vresp +testinput $file.inm_vresp no_vresp +set vresp=-vresp +no_vresp: + +# set iter/riter to 999 when MSR1a/MSECa is used +set testmsr=`head -1 $file.inm | grep "MSR[12]a" | cut -c1-3` +set testmsr1=`head -1 $file.inm | grep "MSECa" | cut -c1-5` +if($testmsr1 == 'MSECa') set testmsr=MSR +if ($testmsr == 'MSR') then + if($riter == "99") set riter=999 + if($iter == "40") set iter=999 + foreach i ($file.in2*) + TOTtoFOR $i #switch FOR-label + echo changing TOT to FOR in $i + end + if (! -e $file.inM && ! -z $file.inM ) then + x pairhess + echo $file.inM and .minrestart have been created by pairhess >>$dayfile + endif +endif + +if ($next != "") goto start #start with optional program +set next = lapw0 #default start with lstart + +if !(-e $file.clmsum) then + if (-e $file.clmsum_old) then + cp $file.clmsum_old $file.clmsum + else + echo 'no' $file'.clmsum(_old) file found, which is necessary for lapw0 \!' + echo 'no' $file'.clmsum(_old) file found, which is necessary for lapw0 \!'\ + >>$dayfile + goto error + endif +endif + +if ($?broyd) then + if (-e $file.broyd1) then + echo "$file.broyd* files present \! You did not save_lapw a previous clculation." + echo "You have 60 seconds to kill this job ( ^C or kill $$ )" + echo "or the script will rm *.broyd* and continue (use -NI to avoid automatic rm)" + sleep 60 + rm *.broyd* + echo "$file.broyd* files removed \!" >> $dayfile + endif +endif + +start: #initalization of in2-files +if ($?init && $testmsr != 'MSR' ) then + foreach i ($file.in2*) + sed "1s/[A-Z]..../TOT /" $i > $tmp + mv $tmp $i + end +endif + +set icycle=1 + +set riter_save=$riter +printf "\n\n start \t(%s) " "`date`" >> $dayfile + +#goto mixer only if clmval file is present +if ($next == "scf1") then + if !(-e $file.clmval) then + set next = lapw0 + endif +endif + +echo "with $next ($iter/$riter to go)" >> $dayfile +goto $next + + +cycle: #begin of sc-cycle +nohup echo in cycle $icycle " ETEST: $etest[3] CTEST: $ctest[3]" +hup + +if ($it == '-it' ) then + set ittest=`echo "$icycle / $itnum * $itnum "| bc` + if ( $ittest == $icycle ) touch .fulldiag +endif + +lapw0: +printf "\n cycle $icycle \t(%s) \t(%s)\n\n" "`date`" "$iter/$riter to go" >> $dayfile + +testinput $file.in0_grr cont_lapw0 +total_exec lapw0 -grr $para + +cont_lapw0: +testinput $file.in0 error_input +total_exec lapw0 $para + +if ($fcut == "0") goto lapw1 +set f_exist=`grep :FHF $file.scf0` +if ($#f_exist == 0 ) then + set fcut=0 + set fc_conv + echo Force-convergence not possible. Forces not present. + echo Force-convergence not possible. Forces not present.>> $dayfile + if($?ec_test) goto lapw1 + if($?cc_test) goto lapw1 + goto error +endif +#---> test of force-convergence for all forces +if !(-e $file.scf) goto lapw1 + if(! $?ec_conv) goto lapw1 + if(! $?cc_conv) goto lapw1 +set natom=`head -2 $file.struct |tail -1 |cut -c28-30` +#set natom = `grep UNITCELL $file.output0 |awk '{print $NF}'` +set iatom = 1 +set ftest = (1 0) +grep :FOR $file.scf >test_forces.scf +while ($iatom <= $natom) #cycle over all atoms + set itest=$iatom + @ itest ++ + testinput $file.inM cont_force_test + set atest=`head -$itest $file.inM |tail -1` + set itest=`echo " $atest[1] + $atest[2] + $atest[3]"|bc` + if ( $itest == '0' ) goto skipforce + cont_force_test: + if ($iatom <= 9) then + set test = (`$bin/testconv -p :FOR00$iatom -c $fcut -f test_forces`) + else if ($iatom <= 99) then + set test = (`$bin/testconv -p :FOR0$iatom -c $fcut -f test_forces`) + else + set test = (`$bin/testconv -p :FOR$iatom -c $fcut -f test_forces`) + endif + if !($test[1]) set ftest[1] = 0 + set ftest[2] = $test[2] + set ftest = ($ftest $test[3] $test[4]) +skipforce: + @ iatom ++ +end +rm test_forces.scf +echo ":FORCE convergence:" $ftest[1-] >> $dayfile + +if ($ftest[1]) then #force convergenced + if ($nohns == '-nohns') then + set nohns + echo "NOHNS deactivated by FORCE convergence" >> $dayfile + else +# set iter = 1 + if(! $?ec_conv) goto lapw1 + if(! $?cc_conv) goto lapw1 + set fc_conv + unset f_not_conv + foreach i ($file.in2*) + TOTtoFOR $i #switch FOR-label + end + endif +else + unset fc_conv +endif + +lapw1: +testinput $file.in1$complex error_input +#generates in1-file from :EPL/EPH in case.scf2 +# if ($icycle == $in1new) rm $file.broyd1 $file.broyd2 + if ($icycle >= $in1new ) then + if (! -e $file.in1${complex}_orig ) cp $file.in1${complex} $file.in1${complex}_orig + write_in1_lapw $write_all -ql $qlimit $cmplx >> $dayfile + if($status == 0 ) cp $file.in1${complex}new $file.in1${complex} + endif +if($in1orig == '-in1orig') then + if ( -e $file.in1${complex}_orig ) mv $file.in1${complex}_orig $file.in1${complex} +# unset in1orig +endif + +set readHinv0 = $readHinv +if (-e .noHinv) then + echo " case.storeHinv files removed" + set readHinv0 = -noHinv0 + rm .noHinv +endif +if (-e .fulldiag) then + echo " full diagonalization forced" + set it0 + set readHinv0 + rm .fulldiag +endif +if ( $it0 == "-it" ) then + touch ${scratch}$file.vector.old + if( ! $?vec2pratt ) then + foreach i (${scratch}$file.vector*.old) + rm $i + end + vec2old_lapw $para >> $dayfile + else + vec2pratt_lapw $para >> $dayfile + endif +endif + +if ( $hf == "-hf" ) then + if ((-e $file.vectorhf) && !(-z $file.vectorhf)) then + mv $file.vectorhf $file.vectorhf_old + if (!(-e $file.weighhf) || (-z $file.weighhf)) mv $file.energyhf $file.tmp_energyhf + else if ((-e $file.vectorhf_old) && !(-z $file.vectorhf_old)) then + if (!(-e $file.weighhf) || (-z $file.weighhf)) mv $file.energyhf $file.tmp_energyhf + else + cp $file.kgen_fbz $file.kgen + cp $file.klist_fbz $file.klist + total_exec lapw1 $it0 $nohns $readHinv0 $cmplx + mv $file.vector $file.vectorhf_old + mv $file.energy $file.tmp_energyhf + if (-e $file.weighhf) rm $file.weighhf + endif + cp $file.kgen_ibz $file.kgen + cp $file.klist_ibz $file.klist + if (!(-e $file.vsp_old) || (-z $file.vsp_old)) then + cp $file.vsp $file.vsp_old + endif +endif + +total_exec lapw1 $it0 $para $nohns $readHinv0 $cmplx +set it0 = $it +set readHinv0 = $readHinv + +lapwso: +if ( -e $file.scfso ) rm $file.scfso +if ( "$so" == "-so" ) then + testinput $file.inso error_input + total_exec lapwso $para $cmplx +endif + +lapw2: +testinput $file.in2$complex2 error_input +if ( $hf == "-hf" ) then + if (!(-e $file.weighhf) || (-z $file.weighhf)) then + cp $file.kgen_fbz $file.kgen + cp $file.klist_fbz $file.klist + if (-e $file.vector) mv $file.vector $file.vector_save + mv $file.vectorhf_old $file.vector + if (-e $file.energy) mv $file.energy $file.energy_save + mv $file.tmp_energyhf $file.energy + total_exec lapw2 $vresp $in1orig $cmplx2 + mv $file.weigh $file.weighhf + mv $file.vector $file.vectorhf_old + if (-e $file.vector_save) mv $file.vector_save $file.vector + mv $file.energy $file.energyhf + if (-e $file.energy_save) mv $file.energy_save $file.energy + cp $file.kgen_ibz $file.kgen + cp $file.klist_ibz $file.klist + endif +endif +#QDMFT +if ( "$qdmft" == "-qdmft" ) then + total_exec lapw2 $para $vresp -almd $cmplx2 $so + dmftproj $so # please check: $so can't be here + # pytriqs call + printf "\n> ERROR: Insert a correct call of pytriqs (with mpi wrapper, if needed) in run_triqs Wien2k script\n" >> $dayfile + printf "\n> stop\n" >> $dayfile + printf "\n> ERROR: Insert a correct call of pytriqs (with mpi wrapper, if needed) in run_triqs Wien2k script\n" + exit 0 + # to call pytriqs uncomment and modify the line below to adapt it to your system + # the number of core is in NSLOTS variable + #mpprun --force-mpi=openmpi/1.3.2-i110074 /home/x_leopo/TRIQS_segment/triqs_install/bin/pytriqs $file.py + total_exec lapw2 $para $vresp -qdmft $cmplx2 $so +else + total_exec lapw2 $para $vresp $in1orig $cmplx2 $so + if ( $hf == "-hf" ) then + sed 's/:SUM/:SLSUM/g' < $file.scf2 > $file.scf2_tmp + mv $file.scf2_tmp $file.scf2 + mv $file.clmval $file.clmvalsl + if ( -e $file.scfhf_1 ) rm $file.scfhf_* + endif +endif +# END QDMFT + +rm -f $file.clmsc + +if ( $hf == "-hf" ) goto hf + +lapw1s: +testinput $file.in1${complex}s lcore +total_exec lapw1 -sc $para $nohns $readHinv $cmplx + +lapw2s: +testinput $file.in2${complex2}s error_input +total_exec lapw2 -sc $para $vresp $in1orig $cmplx2 +goto lcore + +hf: +testinput $file.inhf error_input +if (!(-e $file.corewf) || (-z $file.corewf)) then + total_exec lcore +endif +total_exec hf $diaghf $nonself $noibz $newklist $redklist $para $cmplx + +lapw2hf: +testinput $file.in2$complex2 error_input +cp $file.kgen_fbz $file.kgen +cp $file.klist_fbz $file.klist +total_exec lapw2 -hf $vresp $in1orig $cmplx2 +cp $file.kgen_ibz $file.kgen +cp $file.klist_ibz $file.klist + +lcore: +testinput $file.inc scf +total_exec lcore + +coresuper: + if ( ! -e .lcore) goto scf + total_exec dstart -lcore + rm -f $file.clmcor +endif + +scf: +if ( $hf == "-hf" ) then + foreach i ( 0 0_grr 1 so 2 1s 2s c hf 2hf ) + if (-e $file.scf$i) cat $file.scf$i >> $file.scf + end +else + foreach i ( 0 1 so 2 1s 2s c ) + if (-e $file.scf$i) cat $file.scf$i >> $file.scf + end +endif +scf1: +foreach i (clmsum vsp vns vrespsum ) + if (-e $file.$i ) \ + cp $file.$i $file.${i}_old #save last cycle +end + + +mixer: +testinput $file.inm error_input +total_exec mixer +cat $file.scfm >> $file.scf + +if($?renorm) then + unset renorm + rm $file.broy* +endif + +mixer_vresp: +testinput $file.inm_vresp energytest +total_exec mixer_vresp +grep -e "CTO " -e NEC $file.outputm_vresp | sed 's/:/:VRESP/' >> $file.scf +#total_exec int16 + +energytest: +#---> output energies +#set EF = `grep 'F E R' $file.scf2 |awk '{printf("%.5f", $NF)}'` +#set ET = `grep 'AL EN' $file.outputm |awk '{printf("%.5f", $NF)}'` +#cat << theend >> $dayfile +#EF $EF +#ET $ET +#theend +#echo $ET > $file.finM + +#---> test of energy convergence +#if ($ecut == "0") goto chargetest +set etest = (`$bin/testconv -p :ENE -c $ecut`) +teststatus +echo ":ENERGY convergence: $etest[1-3]" >> $dayfile +if (! $?ec_test) goto chargetest +if ($etest[1]) then + if ($nohns == '-nohns') then + set nohns + echo "NOHNS deactivated by ENERGY convergence" >> $dayfile + else +# set iter = 1 + set ec_conv + endif +else + unset ec_conv +endif + +chargetest: +#if ($ccut == "0.0000") goto nextiter +set ctest = (`$bin/testconv -p :DIS -c $ccut`) +teststatus +echo ":CHARGE convergence: $ctest[1-3]" >> $dayfile +if (! $?cc_test) goto nextiter +if ($ctest[1]) then + if ($nohns == '-nohns') then + set nohns + echo "NOHNS deactivated by CHARGE convergence" >> $dayfile + else +# set iter = 1 + set cc_conv + endif +else + unset cc_conv +endif + +# check F-condition for MSR1a mode +if ($testmsr == 'MSR') then + set msrtest =(`grep :FRMS $file.scf |tail -1` ) + if ($#msrtest >= 13 ) then + echo msrcount $msrcount msrtest $msrtest[13] +# Trap silly early convergene with "minimum-requests" + set etest2 = (`$bin/testconv -p :ENE -c 0.001`) + if ( $etest2[1] == '0')set msrtest[13]='F' + set ctest2 = (`$bin/testconv -p :DIS -c 0.01`) + if ( $ctest2[1] == '0')set msrtest[13]='F' +# + if ($msrtest[13] == 'T') then + #change in case.inm MSR1a/MSECa to MSR1/MSEC3, rm *.bro*, unset testmsr +@ msrcount ++ + if($msrcount == 3) then + sed "1s/MSR1a/MSR1 /" $file.inm >$file.inm_tmp + sed "1s/MSECa/MSEC3/" $file.inm_tmp >$file.inm + rm *.broy* $file.inm_tmp + set a=`grep -e GREED *scfm | tail -1 | cut -c 50-55` + set b=`echo "scale=5; if( $a/2 > 0.05) $a/2 else 0.05 " |bc -l` + echo $b > .msec + echo "MSR1a/MSECa changed to MSR1/MSEC3 in $file.inm, relaxing only electrons" >> $dayfile + set testmsr + endif + else + set msrcount=0 + endif + endif +endif + +#---> output forces +#grep 'FTOT' $file.outputm|awk '{print "FT ",$2,$4,$5,$6}'\ +# >> $dayfile +#grep 'FTOT' $file.outputm|awk '{print $4,$5,$6}' \ +# >> $file.finM + +nextiter: +@ iter -- +@ riter -- +@ nohns1 -- +@ icycle ++ + +if ($icycle == 2) set newklist + +#---> nohns +if (! $nohns1 ) then + set nohns + echo "NOHNS deactivated" >> $dayfile +endif + +#---> restart +if (! $riter && -e $file.broyd1) then + echo " restart" >> $dayfile + rm $file.broyd1 $file.broyd2 + set riter=$riter_save +endif + +foreach i ($tmp) #delete temporary files + if (-e $i) rm $i +end + +#output cycle +#printf "%s\n\n" "$iter/$riter to go" >> $dayfile +if (-e .stop) goto stop1 +if ($testmsr == 'MSR' && -e .minstop) then + sed "1s/MSR1a/MSR1 /" $file.inm >$file.inm_tmp + sed "1s/MSECa/MSEC3/" $file.inm_tmp >$file.inm + rm *.broy* $file.inm_tmp + set a=`grep -e GREED *scfm | tail -1 | cut -c 50-55` + set b=`echo "scale=5; if( $a/2 > 0.05) $a/2 else 0.05 " |bc -l` + echo $b > .msec + echo "MSR1a/MSECa changed to MSR1/MSEC3 in $file.inm, relaxing only electrons" >> $dayfile + set testmsr +endif + +echo ec cc and fc_conv $?ec_conv $?cc_conv $?fc_conv +echo ec cc and fc_conv $?ec_conv $?cc_conv $?fc_conv >> $dayfile +if($?ec_conv && $?cc_conv && $?fc_conv && ($testmsr == '') ) goto stop + +if ($iter) goto cycle #end of sc-cycle + +if ( $?f_not_conv ) then + printf "\n> FORCES NOT CONVERGED\n" >> $dayfile + printf "\n> stop\n" >> $dayfile + printf "\n> FORCES NOT CONVERGED\n" + exit 3 +endif +if ( ! $?ec_conv ) then + printf "\n> energy in SCF NOT CONVERGED\n" >> $dayfile + printf "\n> stop\n" >> $dayfile + printf "\n> energy in SCF NOT CONVERGED\n" + exit 0 +endif +if ( ! $?cc_conv ) then + printf "\n> charge in SCF NOT CONVERGED\n" >> $dayfile + printf "\n> stop\n" >> $dayfile + printf "\n> charge in SCF NOT CONVERGED\n" + exit 0 +endif + +stop: #normal exit +printf "\n> stop\n" >> $dayfile +printf "\n> stop\n" +exit 0 + +stop1: #normal exit +printf "\n> stop due to .stop file\n" >> $dayfile +rm .stop +printf "\n> stop due to .stop file\n" +exit 1 + +error_input: #error exit +printf "\n> stop error: the required input file $errin for the next step could not be found\n" >> $dayfile +printf "\n> stop error: the required input file $errin for the next step could not be found\n" +exit 9 + +error: #error exit +printf "\n> stop error\n" >> $dayfile +printf "\n> stop error\n" +exit 9 + +help: #help exit +cat << theend + +PROGRAM: $0 + +PURPOSE: running the nonmagnetic scf-cycle in WIEN + to be called within the case-subdirectory + has to be located in WIEN-executable directory + +USAGE: $name [OPTIONS] [FLAGS] + +OPTIONS: +-cc LIMIT -> charge convergence LIMIT (0.0001 e) +-ec LIMIT -> energy convergence LIMIT ($ecut Ry) +-fc LIMIT -> force convergence LIMIT (1.0 mRy/a.u.) + default is -ec 0.0001; multiple convergence tests possible +-e PROGRAM -> exit after PROGRAM ($stopafter) +-i NUMBER -> max. NUMBER ($iter) of iterations +-s PROGRAM -> start with PROGRAM ($next) +-r NUMBER -> restart after NUMBER ($riter) iterations (rm *.broyd*) +-nohns NUMBER ->do not use HNS for NUMBER iterations +-in1new N -> create "new" in1 file after N iter (write_in1 using scf2 info) +-ql LIMIT -> select LIMIT ($qlimit) as min.charge for E-L setting in new in1 +-qdmft NP -> including DMFT from Aichhorn/Georges/Biermann running on NP proc + +FLAGS: +-h/-H -> help +-I -> with initialization of in2-files to "TOT" +-NI -> does NOT remove case.broyd* (default: rm *.broyd* after 60 sec) +-p -> run k-points in parallel (needs .machine file [speed:name]) +-it -> use iterative diagonalization +-it1 -> use iterative diag. with recreating H_inv (after basis change) +-it2 -> use iterative diag. with reinitialization (after basis change) +-noHinv -> use iterative diag. without H_inv +-vec2pratt -> use vec2pratt instead of vec2old for iterative diag. +-so -> run SCF including spin-orbit coupling +-renorm-> start with mixer and renormalize density +-in1orig-> if present, use case.in1_orig file; do not modify case.in1 +-hf -> HF/hybrid-DFT calculation +-diaghf -> non-selfconsistent HF with diagonal HF only (only e_i) +-nonself -> non-selfconsistent HF/hybrid-DFT calculation (only E_x(HF)) +-newklist -> HF/hybrid-DFT calculation starting from a different k-mesh +-redklist -> HF/hybrid-DFT calculation with a reduced k-mesh for the potential + +CONTROL FILES: +.lcore runs core density superposition producing case.clmsc +.stop stop after SCF cycle +.minstop stops MSR1a minimization and changes to MSR1 +.fulldiag force full diagonalization +.noHinv remove case.storeHinv files +case.inm_vresp activates calculation of vresp files for meta-GGAs +case.in0_grr activates a second call of lapw0 (mBJ pot., or E_xc analysis) + +ENVIRONMENT VARIBLES: +SCRATCH directory where vectors and help files should go + +theend + +exit 1 + + diff --git a/fortran/dmftproj/SRC_templates/runsp_triqs b/fortran/dmftproj/SRC_templates/runsp_triqs new file mode 100755 index 00000000..57e150ac --- /dev/null +++ b/fortran/dmftproj/SRC_templates/runsp_triqs @@ -0,0 +1,975 @@ +#!/bin/csh -f +hup +unalias rm + +set name = $0 +set bin = $name:h #directory of WIEN-executables +if !(-d $bin) set bin = . +set name = $name:t #name of this script-file +set logfile = :log +set tmp = (:$name) #temporary files + +set scratch = # set directory for vectors and help files +if ($?SCRATCH) then #if envronment SCRATCH is set + set scratch=`echo $SCRATCH | sed -e 's/\/$//'`/ #set $scratch to that value +endif + +#---> functions & subroutines +alias testinput 'set errin="\!:1";if (! -e \!:1 || -z \!:1) goto \!:2' +alias teststatus 'if ($status) goto error' +alias testerror 'if ( -e \!:1.error && ! -z \!:1.error) goto error' +alias teststop 'if (\!:1 == $stopafter ) goto stop' +alias cleandayfile 'grep -v "\[" $dayfile >.tmp;'\ + 'mv .tmp $dayfile' +alias output 'set date = `date +"(%T)"`;'\ + 'printf "> %s\t%s " "\!:*" "$date" >> $dayfile' + +alias exec '($bin/x \!:*) >> $dayfile;'\ + 'teststatus' + +alias total_exec 'output \!:*;'\ + 'exec \!:*;'\ + 'cleandayfile;'\ + 'testerror \!:1;'\ + 'testerror up\!:1;'\ + 'testerror dn\!:1;'\ + 'teststop \!:1' +alias TOTtoFOR 'sed "s/TOT/FOR/" \!:1 > $tmp;'\ + 'mv $tmp \!:1' +alias FORtoTOT 'sed "s/FOR/TOT/" \!:1 > $tmp;'\ + 'mv $tmp \!:1' +alias IPRINT_inc 'sed "s/0 NUMBER/1 NUMBER/g" \!:1 > $tmp;'\ + 'mv $tmp \!:1' + +#---> default parameters +set ccut = 0.0000 #upper limit for charge convergence +set fcut = 0 #upper limit for force convergence +set ecut = 0.0001 #upper limit for energy convergence +unset ec_conv +set cc_conv +set fc_conv +set ec_test +unset ec_test1 +unset cc_test +unset fc_test +set iter = 40 #maximum number of iterations +set riter = 99 #restart after $riter iterations +set stopafter #stop after $stopafter +set next #set -> start cycle with $next +set qlimit = 0.05 #set -> writes E-L in new in1 when qlimit is fulfilled +set in1new = 999 +set write_all = -ef # new default: -in1ef is activated (version 10.1) +set para +set nohns +set nohns1 = 0 +set it +set readHinv +unset vec2pratt +set it0 +set itnum=0 +set itnum1=0 +set complex +set complex2 +set cmplx +set cmplx2 +set so +set orb +set broyd +set eece1 +unset eece +unset orbc +unset orbdu +unset dm +set ctest=(0 0 0) +set etest=(0 0 0) +set msrcount=0 +# QDMFT +set qdmft +set hf +set diaghf +set nonself +set noibz +set newklist +set redklist +set NSLOTS = 1 +# END QDMFT + +#---> default flags +unset renorm +set in1orig +unset force #set -> force-calculation after self-consistency +unset f_not_conv +unset help #set -> help output +#unset complex #set -> complex calculation +unset init #set -> switches initially set to total energy calc. +unset lcore #set -> core density superposition + +#---> handling of input options +echo "> ($name) options: $argv" >> $logfile +alias sb 'shift; breaksw' #definition used in switch +while ($#argv) + switch ($1) + case -[H|h]: + set help; sb + case -so: + set complex2 = c + set cmplx2 = -c + set so = -so; sb + case -nohns: + set nohns = -nohns; shift; set nohns1 = $1;sb + case -dm: + set dm; sb + case -orb: + set orb = -orb; sb + case -orbc: + set orbc + set orb = -orb; sb + case -eece: + set eece + set eece1 = -eece + set orbc + set orb = -orb; sb + case -orbdu: + set orbdu + set orb = -orb; sb + case -it: + set itnum = 99; set it = -it; set it0 = -it; sb + case -it1: + set itnum = 99; set it = -it; set it0 = -it; touch .noHinv; sb + case -it2: + set itnum = 99; set it = -it; set it0 = -it; touch .fulldiag; sb + case -noHinv: + set itnum = 99; set it = -it; set it0 = -it; set readHinv = -noHinv; sb + case -vec2pratt: + set vec2pratt; sb + case -p: + set para = -p; sb + case -I: + set init; sb + case -NI: + unset broyd; sb + case -e: + shift; set stopafter = $1; sb + case -cc: + shift; set ccut = $1; set cc_test;unset cc_conv; sb + case -ec: + shift; set ecut = $1; set ec_test1;unset ec_conv; sb + case -fc: + shift; set f_not_conv; set fcut = $1; set fc_test;unset fc_conv; sb + case -ql: + shift; set qlimit = $1; sb + case -in1ef: + set in1new = -1;set write_all = -ef; sb + case -in1new: + shift; set in1new = $1;set write_all; sb + case -in1orig: + set in1orig = -in1orig; set in1new = 999; sb + case -renorm: + set renorm; set next=scf1; sb + case -i: + shift; set iter = $1; sb + case -r: + shift; set riter = $1; sb + case -s: + shift; set next = $1; sb +# QDMFT + case -qdmft: + set qdmft=-qdmft; shift; set NSLOTS = $1; sb +# END QDMFT + case -hf: + set hf = -hf; sb + case -diaghf: + set diaghf = -diaghf; set hf = -hf; set iter = 1; sb + case -nonself: + set nonself = -nonself; set hf = -hf; set iter = 1; sb + case -noibz: + set noibz = -noibz; sb + case -newklist: + set newklist = -newklist; set hf = -hf; sb + case -redklist: + set redklist = -redklist; set hf = -hf; sb + default: + echo "ERROR: option $1 does not exist\!"; sb + endsw +end +if ($?help) goto help + +if($?cc_test) then + unset ec_test;set ec_conv +endif +if($?fc_test) then + unset ec_test;set ec_conv +endif +if($?ec_test1) then + set ec_test;unset ec_conv +endif +if(! $?ec_test) then + set ecut=0 +endif + +#---> path- and file-names +set file = `pwd` +set file = $file:t #tail of file-names +set dayfile = $file.dayfile #main output-file + +#---> starting out +printf "\nCalculating $file in `pwd`\non `hostname` with PID $$\n" > $dayfile +echo "using `cat $WIENROOT/VERSION` in $WIENROOT" >> $dayfile +printf "\n:LABEL1: Calculations in `pwd`\n:LABEL2: on `hostname` at `date`\n" >> $file.scf +echo ":LABEL3: using `cat $WIENROOT/VERSION` in $WIENROOT" >> $file.scf + +if ( "$so" == "-so" && "$hf" == "-hf") then + echo "Hartree-Fock and spin-orbit coupling not supported yet. STOP" + echo "Hartree-Fock and spin-orbit coupling not supported yet. STOP" >> $file.dayfile + exit 9 +endif + +if ( "$hf" == "-hf") then + if (-e $file.corewfup) rm $file.corewfup + if (-e $file.corewfdn) rm $file.corewfdn + IPRINT_inc $file.inc # modify IPRINT switch in case.inc + if ( ! -z $file.incup && -e $file.incup ) then + IPRINT_inc $file.incup + IPRINT_inc $file.incdn + endif +endif + +#---> complex +if ((-e $file.in1c) && !(-z $file.in1c)) then + set complex = c + set complex2 = c + set cmplx = -c + set cmplx2 = -c +endif + +set vresp +testinput $file.inm_vresp no_vresp +set vresp=-vresp +no_vresp: + +# set iter/riter to 999 when MSR1a/MSECa is used +set testmsr=`head -1 $file.inm | grep "MSR[12]a" | cut -c1-3` +set testmsr1=`head -1 $file.inm | grep "MSECa" | cut -c1-5` +if($testmsr1 == 'MSECa') set testmsr=MSR +if ($testmsr == 'MSR') then + if($riter == "99") set riter=999 + if($iter == "40") set iter=999 + foreach i ($file.in2*) + TOTtoFOR $i #switch FOR-label +echo changing $i + end + if (! -e $file.inM && ! -z $file.inM ) then + x pairhess + echo $file.inM and .minrestart have been created by pairhess >>$dayfile + endif +endif + +if ($next != "") goto start #start with optional program +set next = lapw0 #default start with lstart + +if !(-e $file.clmsum) then + if (-e $file.clmsum_old) then + cp $file.clmsum_old $file.clmsum + else + echo 'no' $file'.clmsum(_old) file found, which is necessary for lapw0 \!' + echo 'no' $file'.clmsum(_old) file found, which is necessary for lapw0 \!'\ + >>$dayfile + goto error + endif +endif + +if ($?broyd) then + if (-e $file.broyd1) then + echo "$file.broyd* files present \! You did not save_lapw a previous clculation." + echo "You have 60 seconds to kill this job ( ^C or kill $$ )" + echo "or the script will rm *.broyd* and continue (use -NI to avoid automatic rm)" + sleep 60 + rm *.broyd* + echo "$file.broyd* files removed \!" >> $dayfile + endif +endif + +start: #initalization of in2-files +if ($?init && $testmsr != 'MSR') then + foreach i ($file.in2*) + sed "1s/[A-Z]..../TOT /" $i > $tmp + mv $tmp $i + end +endif + +set icycle=1 + +set riter_save=$riter +printf "\n\n start \t(%s) " "`date`" >> $dayfile + +#goto mixer only if clmval file is present +if ($next == "scf1") then + if !(-e $file.clmvalup) then + set next = lapw0 + endif +endif + +echo "with $next ($iter/$riter to go)" >> $dayfile +goto $next + +cycle: #begin of sc-cycle +nohup echo in cycle $icycle " ETEST: $etest[3] CTEST: $ctest[3]" +hup + +if ($it == '-it' ) then + set ittest=`echo "$icycle / $itnum * $itnum "| bc` + if ( $ittest == $icycle ) touch .fulldiag +endif + +lapw0: +printf "\n cycle $icycle \t(%s) \t(%s)\n\n" "`date`" "$iter/$riter to go" >> $dayfile + +testinput $file.in0_grr cont_lapw0 +total_exec lapw0 -grr $para + +cont_lapw0: +testinput $file.in0 error_input + +#fix for NFS bug +touch $file.vspup $file.vspdn $file.vnsup $file.vnsdn +rm $file.vspup $file.vspdn $file.vnsup $file.vnsdn + +total_exec lapw0 $para + +if ($fcut == "0") goto orb +set f_exist=`grep :FHF $file.scf0` +if ($#f_exist == 0 ) then + set fcut=0 + set fc_conv + echo Force-convergence not possible. Forces not present. + echo Force-convergence not possible. Forces not present.>> $dayfile + if($?ec_test) goto orb + if($?cc_test) goto orb + goto error +endif + +#---> test of force-convergence for all forces +if !(-e $file.scf) goto orb + if(! $?ec_conv) goto orb + if(! $?cc_conv) goto orb +set natom=`head -2 $file.struct |tail -1 |cut -c28-30` +#set natom = `grep UNITCELL $file.output0 |awk '{print $NF}'` +set iatom = 1 +set ftest = (1 0) +grep :FOR $file.scf >test_forces.scf +while ($iatom <= $natom) #cycle over all atoms + set itest=$iatom + @ itest ++ + testinput $file.inM cont_force_test + set atest=`head -$itest $file.inM |tail -1` + set itest=`echo " $atest[1] + $atest[2] + $atest[3]"|bc` + if ( $itest == '0' ) goto skipforce + cont_force_test: + if ($iatom <= 9) then + set test = (`$bin/testconv -p :FOR00$iatom -c $fcut -f test_forces`) + else if ($iatom <= 99) then + set test = (`$bin/testconv -p :FOR0$iatom -c $fcut -f test_forces`) + else + set test = (`$bin/testconv -p :FOR$iatom -c $fcut -f test_forces`) + endif + if !($test[1]) set ftest[1] = 0 + set ftest[2] = $test[2] + set ftest = ($ftest $test[3] $test[4]) +skipforce: + @ iatom ++ +end +rm test_forces.scf +echo ":FORCE convergence:" $ftest[1-] >> $dayfile + +if ($ftest[1]) then #force convergenced + if ($nohns == '-nohns') then #force convergenced + set nohns + echo "NOHNS deactivated by FORCE convergence" >> $dayfile + else +# set iter = 1 + if(! $?ec_conv) goto orb + if(! $?cc_conv) goto orb + set fc_conv + unset f_not_conv + foreach i ($file.in2*) + TOTtoFOR $i #switch FOR-label + end + endif +else + unset fc_conv +endif + +orb: +foreach i (dmatup dmatdn dmatud ) + if (-e $file.$i"_old" ) rm $file.$i"_old" + if (-e $file.$i ) cp $file.$i $file.$i"_old" #save this cycle for next +end + +if ( -e $file.scforbup ) rm $file.scforbup +if ( -e $file.scforbdn ) rm $file.scforbdn +if ( -e $file.scforbdu ) rm $file.scforbdu +if ( -e $file.vorbdu ) rm $file.vorbdu + +if ( "$orb" != "-orb" ) goto lapw1 +if ( $?orbc ) goto lapw1 +if (! -e $file.dmatup || -z $file.dmatup ) then + set renorm + goto lapw1 +endif +testinput $file.inorb error_input +total_exec orb -up $para +total_exec orb -dn $para +if ( "$so" == "-so" && ! -z $file.dmatud && -e $file.dmatud ) then + if( $?orbdu ) then + total_exec orb -du $para +# vorbdu seems unphysical large, so we use it only with -orbdu switch) + endif +endif + +lapw1: +testinput $file.in1$complex error_input +set readHinv0 = $readHinv +if (-e .noHinv) then + echo " case.storeHinv files removed" + set readHinv0 = -noHinv0 + rm .noHinv +endif +if (-e .fulldiag) then + echo " full diagonalization forced" + set it0 + set readHinv0 + rm .fulldiag + touch ${scratch}$file.vector.old + rm ${scratch}$file.vector*.old +endif +if ( $it0 == "-it" ) then + touch ${scratch}$file.vector.old + if( ! $?vec2pratt ) then + foreach i (${scratch}$file.vector*.old) + rm $i + end + vec2old_lapw $para -up >> $dayfile + vec2old_lapw $para -dn >> $dayfile + else + vec2pratt_lapw $para -up >> $dayfile + vec2pratt_lapw $para -dn >> $dayfile + endif +endif + +if ( -e dnlapw1.error ) rm dnlapw1.error + +if ( $hf == "-hf" ) then + if ((-e $file.vectorhfup) && !(-z $file.vectorhfup) && \ + (-e $file.vectorhfdn) && !(-z $file.vectorhfdn)) then + mv $file.vectorhfup $file.vectorhfup_old + mv $file.vectorhfdn $file.vectorhfdn_old + if (!(-e $file.weighhfup) || (-z $file.weighhfup) || \ + !(-e $file.weighhfdn) || (-z $file.weighhfdn)) then + mv $file.energyhfup $file.tmp_energyhfup + mv $file.energyhfdn $file.tmp_energyhfdn + endif + else if ((-e $file.vectorhfup_old) && !(-z $file.vectorhfup_old) && \ + (-e $file.vectorhfdn_old) && !(-z $file.vectorhfdn_old)) then + if (!(-e $file.weighhfup) || (-z $file.weighhfup) || \ + !(-e $file.weighhfdn) || (-z $file.weighhfdn)) then + mv $file.energyhfup $file.tmp_energyhfup + mv $file.energyhfdn $file.tmp_energyhfdn + endif + else + cp $file.kgen_fbz $file.kgen + cp $file.klist_fbz $file.klist + total_exec lapw1 $it0 -up $nohns $readHinv0 $cmplx + total_exec lapw1 $it0 -dn $nohns $readHinv0 $cmplx + mv $file.vectorup $file.vectorhfup_old + mv $file.vectordn $file.vectorhfdn_old + mv $file.energyup $file.tmp_energyhfup + mv $file.energydn $file.tmp_energyhfdn + if (-e $file.weighhfup) rm $file.weighhfup + if (-e $file.weighhfdn) rm $file.weighhfdn + endif + cp $file.kgen_ibz $file.kgen + cp $file.klist_ibz $file.klist + if (!(-e $file.vspup_old) || (-z $file.vspup_old) || \ + !(-e $file.vspdn_old) || (-z $file.vspdn_old)) then + cp $file.vspup $file.vspup_old + cp $file.vspdn $file.vspdn_old + endif +endif + +#generates in1-file from :EPL/EPH in case.scf2 +# if ($icycle == $in1new) rm $file.broyd1 $file.broyd2 + if ($icycle >= $in1new ) then + if (! -e $file.in1${complex}_orig ) cp $file.in1${complex} $file.in1${complex}_orig + write_in1_lapw $write_all -up -ql $qlimit ${cmplx} >> $dayfile + if($status == 0 ) cp $file.in1${complex}new $file.in1${complex} + endif +if($?in1orig == '-in1orig') then + if ( -e $file.in1${complex}_orig ) mv $file.in1${complex}_orig $file.in1${complex} +# unset in1orig +endif +if ( "$so" == "-so" ) then + total_exec lapw1 $it0 -up $para $nohns $readHinv0 $cmplx +else + total_exec lapw1 $it0 -up $para $nohns $orb $readHinv0 $cmplx +endif + if ($icycle >= $in1new ) then + write_in1_lapw $write_all -dn -ql $qlimit ${cmplx}>> $dayfile + if($status == 0 ) cp $file.in1${complex}new $file.in1${complex} + endif +if ( "$so" == "-so" ) then + total_exec lapw1 $it0 -dn $para $nohns $readHinv0 $cmplx +else + total_exec lapw1 $it0 -dn $para $nohns $orb $readHinv0 $cmplx +endif +set it0 = $it +set readHinv0 = $readHinv + +lapwso: +if ( -e $file.scfso ) rm $file.scfso +if ( "$so" == "-so" ) then + testinput $file.inso error_input + total_exec lapwso -up $orb $para $cmplx +endif + +lapw2: +testinput $file.in2$complex2 error_input +if ( -e dnlapw2.error ) rm dnlapw2.error +if ( $hf == "-hf" ) then + if (!(-e $file.weighhfup) || (-z $file.weighhfup) || \ + !(-e $file.weighhfdn) || (-z $file.weighhfdn)) then + cp $file.kgen_fbz $file.kgen + cp $file.klist_fbz $file.klist + if (-e $file.vectorup) mv $file.vectorup $file.vectorup_save + if (-e $file.vectordn) mv $file.vectordn $file.vectordn_save + mv $file.vectorhfup_old $file.vectorup + mv $file.vectorhfdn_old $file.vectordn + if (-e $file.energyup) mv $file.energyup $file.energyup_save + if (-e $file.energydn) mv $file.energydn $file.energydn_save + mv $file.tmp_energyhfup $file.energyup + mv $file.tmp_energyhfdn $file.energydn + total_exec lapw2 -up $vresp $in1orig $cmplx2 + total_exec lapw2 -dn $vresp $in1orig $cmplx2 + mv $file.weighup $file.weighhfup + mv $file.weighdn $file.weighhfdn + mv $file.vectorup $file.vectorhfup_old + mv $file.vectordn $file.vectorhfdn_old + if (-e $file.vectorup_save) mv $file.vectorup_save $file.vectorup + if (-e $file.vectordn_save) mv $file.vectordn_save $file.vectordn + mv $file.energyup $file.energyhfup + mv $file.energydn $file.energyhfdn + if (-e $file.energyup_save) mv $file.energyup_save $file.energyup + if (-e $file.energydn_save) mv $file.energydn_save $file.energydn + cp $file.kgen_ibz $file.kgen + cp $file.klist_ibz $file.klist + endif +endif +#QDMFT +if ( "$qdmft" == "-qdmft" ) then + total_exec lapw2 -up $para $vresp -almd $cmplx2 $so + total_exec lapw2 -dn $para $vresp -almd $cmplx2 $so + dmftproj $so -sp + # pytriqs call + printf "\n> ERROR: Insert a correct call of pytriqs (with mpi wrapper, if needed) in runsp_triqs Wien2k script\n" >> $dayfile + printf "\n> stop\n" >> $dayfile + printf "\n> ERROR: Insert a correct call of pytriqs (with mpi wrapper, if needed) in runsp_triqs Wien2k script\n" + exit 0 + # to call pytriqs uncomment and modify the line below to adapt it to your system + # the number of core is in NSLOTS variable + #mpprun --force-mpi=openmpi/1.3.2-i110074 /home/x_leopo/TRIQS_segment/triqs_install/bin/pytriqs $file.py + total_exec lapw2 -up $para $vresp -qdmft $cmplx2 $so + total_exec lapw2 -dn $para $vresp -qdmft $cmplx2 $so +else + total_exec lapw2 -up $para $vresp $in1orig $cmplx2 $so + total_exec lapw2 -dn $para $vresp $in1orig $cmplx2 $so + if ( $hf == "-hf" ) then + sed 's/:SUM/:SLSUM/g' < $file.scf2up > $file.scf2up_tmp + mv $file.scf2up_tmp $file.scf2up + mv $file.clmvalup $file.clmvalslup + if ( -e $file.scfhfup_1 ) rm $file.scfhfup_* + sed 's/:SUM/:SLSUM/g' < $file.scf2dn > $file.scf2dn_tmp + mv $file.scf2dn_tmp $file.scf2dn + mv $file.clmvaldn $file.clmvalsldn + if ( -e $file.scfhfdn_1 ) rm $file.scfhfdn_* + endif +endif +# END QDMFT + +rm -f $file.clmscup $file.clmscdn + +if ( $hf == "-hf" ) goto hf + +lapwdm: +if ( -e $file.scfdmup ) rm $file.scfdmup +if ( -e $file.scfdmdn ) rm $file.scfdmdn +if ( ! $?dm ) then + if ( "$orb" != "-orb" ) goto lapw1s + if ( $?orbc ) goto lapw1s +endif +#if ( "$so" == "-so" ) goto lapwdmc +testinput $file.indm$complex2 error_input +if ( -e dnlapwdm.error ) rm dnlapwdm.error +total_exec lapwdm -up $para $cmplx2 $so +if ( "$so" != "-so" ) then +total_exec lapwdm -dn $para $cmplx2 $so +endif +lapw1s: +testinput $file.in1${complex}s lcore +total_exec lapw1 -sc -up $para $nohns $orb $readHinv0 $cmplx +total_exec lapw1 -sc -dn $para $nohns $orb $readHinv0 $cmplx + +lapw2s: +testinput $file.in2${complex2}s error_input +total_exec lapw2 -sc -up $para $vresp $in1orig $cmplx2 +total_exec lapw2 -sc -dn $para $vresp $in1orig $cmplx2 +goto lcore + +hf: +testinput $file.inhf error_input +if (-e dnhf.error) rm dnhf.error +if (!(-e $file.corewfup) || (-z $file.corewfup)) then + total_exec lcore -up + total_exec lcore -dn +endif +total_exec hf -up $diaghf $nonself $noibz $newklist $redklist $para $cmplx +total_exec hf -dn $diaghf $nonself $noibz $newklist $redklist $para $cmplx + +lapw2hf: +testinput $file.in2$complex2 error_input +cp $file.kgen_fbz $file.kgen +cp $file.klist_fbz $file.klist +total_exec lapw2 -up -hf $vresp $in1orig $cmplx2 +total_exec lapw2 -dn -hf $vresp $in1orig $cmplx2 +cp $file.kgen_ibz $file.kgen +cp $file.klist_ibz $file.klist + +lcore: +testinput $file.inc scf +if ( ! -z $file.incup && -e $file.incup ) then + cp $file.incup $file.inc + echo "spinpolarized $file.incup/dn used" >> $dayfile +endif +if ( -e dnlcore.error ) rm dnlcore.error +total_exec lcore -up +if ( ! -z $file.incdn && -e $file.incdn ) then + cp $file.incdn $file.inc +endif +total_exec lcore -dn + +coresuper: + if ( ! -e .lcore) goto scf + total_exec dstart -lcore -up + total_exec dstart -lcore -dn + rm $file.clmcorup $file.clmcordn + +scf: +if ( $hf == "-hf" ) then + foreach i ( 0 0_grr orbup orbdn orbdu 1up 1dn so 2up 2dn dmup dmdn 1sup 1sdn 2sup 2sdn cup cdn hfup hfdn 2hfup 2hfdn ) + if (-e $file.scf$i) then + if ("$i" != "dmdn" || "$so" != "-so") cat $file.scf$i >> $file.scf + endif + end +else + foreach i ( 0 orbup orbdn orbdu 1up 1dn so 2up 2dn dmup dmdn 1sup 1sdn 2sup 2sdn cup cdn ) + if (-e $file.scf$i) then + if ("$i" != "dmdn" || "$so" != "-so") cat $file.scf$i >> $file.scf + endif + end +endif + +if ( $?eece ) then + mv $file.scf2up $file.scf2up-tmp + mv $file.scf2dn $file.scf2dn-tmp + if( $vresp == '-vresp' ) then + mv $file.vrespvalup $file.vrespvalup-tmp + mv $file.vrespvaldn $file.vrespvaldn-tmp + mv $file.vrespcorup $file.vrespcorup-tmp + mv $file.vrespcordn $file.vrespcordn-tmp + endif + foreach i ( vorbup vorbdn vorbdu ) + if (-e $file.$i"_old" ) rm $file.$i"_old" + if (-e $file.$i ) cp $file.$i $file.$i"_old" #save last cycle + end + runeece_lapw $so $para $vresp + teststatus + foreach i (vorbup vorbdn vorbud ) + if (-e $file.$i"_unmixed" ) rm $file.$i"_unmixed" + if (-e $file.$i ) cp $file.$i $file.$i"_unmixed" #save unmixed dmat + end + mv $file.scf2up $file.scf2upeece + mv $file.scf2dn $file.scf2dneece + mv $file.scf2up-tmp $file.scf2up + mv $file.scf2dn-tmp $file.scf2dn + if( $vresp == '-vresp' ) then + mv $file.vrespvalup $file.vrespvaleeceup + mv $file.vrespvaldn $file.vrespvaleecedn + mv $file.vrespvalup-tmp $file.vrespvalup + mv $file.vrespvaldn-tmp $file.vrespvaldn + mv $file.vrespcorup-tmp $file.vrespcorup + mv $file.vrespcordn-tmp $file.vrespcordn + endif + goto scf1 +endif + +foreach i (dmatup dmatdn dmatud ) + if (-e $file.$i"_unmixed" ) rm $file.$i"_unmixed" + if (-e $file.$i ) cp $file.$i $file.$i"_unmixed" #save the unmixed dmat +end + +scf1: +foreach i (clmsum clmup clmdn vspup vspdn vnsup vnsdn ) + if (-e $file.$i ) cp $file.$i $file.$i"_old" #save last cycle +end + + +mixer: +testinput $file.inm error_input +if ( $?orbc ) then + total_exec mixer +else + total_exec mixer $eece1 $orb +endif +cat $file.scfm >> $file.scf + +if($?renorm) then + unset renorm + rm $file.broy* +endif + +mixer_vresp: +testinput $file.inm_vresp energytest +total_exec mixer_vresp +grep -e "CTO " -e NEC $file.outputm_vresp | sed 's/:/:VRESP/' >> $file.scf +#total_exec int16 + +energytest: +#---> output energies +#set EF = `grep 'F E R' $file.scf2 |awk '{printf("%.5f", $NF)}'` +#set ET = `grep 'AL EN' $file.outputm |awk '{printf("%.5f", $NF)}'` +#cat << theend >> $dayfile +#EF $EF +#ET $ET +#theend +#echo $ET > $file.finM + +#---> test of energy convergence +#if ($ecut == "0") goto chargetest +set etest = (`$bin/testconv -p :ENE -c $ecut`) +teststatus +echo ":ENERGY convergence: $etest[1-3]" >> $dayfile +if (! $?ec_test) goto chargetest +if ($etest[1]) then + if ($nohns == '-nohns') then + set nohns + echo "NOHNS deactivated by ENERGY convergence" >> $dayfile + else +# set iter = 1 + set ec_conv + endif +else + unset ec_conv +endif + +chargetest: +#if ($ccut == "0") goto nextiter +set ctest = (`$bin/testconv -p :DIS -c $ccut`) +teststatus +echo ":CHARGE convergence: $ctest[1-3]" >> $dayfile +if (! $?cc_test) goto nextiter +if ($ctest[1]) then + if ($nohns == '-nohns') then + set nohns + echo "NOHNS deactivated by CHARGE convergence" >> $dayfile + else +# set iter = 1 + set cc_conv + endif +else + unset cc_conv +endif + +# check F-condition for MSR1a mode +if ($testmsr == 'MSR') then + set msrtest =(`grep :FRMS $file.scf |tail -1` ) + if ($#msrtest >= 13 ) then + echo msrcount $msrcount msrtest $msrtest[13] +# Trap silly early convergene with "minimum-requests" + set etest2 = (`$bin/testconv -p :ENE -c 0.001`) + if ( $etest2[1] == '0')set msrtest[13]='F' + set ctest2 = (`$bin/testconv -p :DIS -c 0.01`) + if ( $ctest2[1] == '0')set msrtest[13]='F' +# + if ($msrtest[13] == 'T') then + #change in case.inm MSR1a/MSECa to MSR1/MSEC3, rm *.bro*, unset testmsr +@ msrcount ++ + if($msrcount == 3) then + sed "1s/MSR1a/MSR1 /" $file.inm >$file.inm_tmp + sed "1s/MSECa/MSEC3/" $file.inm_tmp >$file.inm + rm *.broy* $file.inm_tmp + set a=`grep -e GREED *scfm | tail -1 | cut -c 50-55` + set b=`echo "scale=5; if( $a/2 > 0.05) $a/2 else 0.05 " |bc -l` + echo $b > .msec + echo "MSR1a/MSECa changed to MSR1/MSEC3 in $file.inm, relaxing only electrons" >> $dayfile + set testmsr + endif + else + set msrcount=0 + endif + endif +endif + +#---> output forces +#grep 'FTOT' $file.outputm|awk '{print "FT ",$2,$4,$5,$6}'\ +# >> $dayfile +#grep 'FTOT' $file.outputm|awk '{print $4,$5,$6}' \ +# >> $file.finM + +nextiter: +@ iter -- +@ riter -- +@ nohns1 -- +@ icycle ++ + +if ($icycle == 2) set newklist + +#---> nohns +if (! $nohns1 ) then + set nohns + echo "NOHNS deactivated" >> $dayfile +endif + +#---> restart +if (! $riter && -e $file.broyd1) then + echo " restart" >> $dayfile + rm $file.broyd1 $file.broyd2 + set riter=$riter_save +endif + +foreach i ($tmp) #delete temporary files + if (-e $i) rm $i +end + +#output cycle +#printf "%s\n\n" "$iter/$riter to go" >> $dayfile +if (-e .stop) goto stop1 +if ($testmsr == 'MSR' && -e .minstop) then + sed "1s/MSR1a/MSR1 /" $file.inm >$file.inm_tmp + sed "1s/MSECa/MSEC3/" $file.inm_tmp >$file.inm + rm *.broy* $file.inm_tmp + set a=`grep -e GREED *scfm | tail -1 | cut -c 50-55` + set b=`echo "scale=5; if( $a/2 > 0.05) $a/2 else 0.05 " |bc -l` + echo $b > .msec + echo "MSR1a/MSECa changed to MSR1/MSEC3 in $file.inm, relaxing only electrons" >> $dayfile + set testmsr +endif + + +if($?ec_conv && $?cc_conv && $?fc_conv && ($testmsr == '')) goto stop + +if ($iter) goto cycle #end of sc-cycle + +if ( $?f_not_conv ) then + printf "\n> FORCES NOT CONVERGED\n" >> $dayfile + printf "\n> stop\n" >> $dayfile + printf "\n> FORCES NOT CONVERGED\n" + exit 3 +endif +if ( ! $?ec_conv ) then + printf "\n> energy in SCF NOT CONVERGED\n" >> $dayfile + printf "\n> stop\n" >> $dayfile + printf "\n> energy in SCF NOT CONVERGED\n" + exit 0 +endif +if ( ! $?cc_conv ) then + printf "\n> charge in SCF NOT CONVERGED\n" >> $dayfile + printf "\n> stop\n" >> $dayfile + printf "\n> charge in SCF NOT CONVERGED\n" + exit 0 +endif + +stop: #normal exit +printf "\n> stop\n" >> $dayfile +printf "\n> stop\n" +exit 0 + +stop1: #normal exit +printf "\n> stop due to .stop file\n" >> $dayfile +if (-e .stop) rm .stop +printf "\n> stop due to .stop file\n" +exit 1 + +error_input: #error exit +printf "\n> stop error: the required input file $errin for the next step could not be found\n" >> $dayfile +printf "\n> stop error: the required input file $errin for the next step could not be found\n" +exit 9 + +error: #error exit +printf "\n> stop error\n" >> $dayfile +printf "\n> stop error\n" +exit 9 + +help: #help exit +cat << theend + +PROGRAM: $0 + +PURPOSE: running the spinpolarized scf-cycle in WIEN + to be called within the case-directory + has to be located in '$WIENROOT' directory + +USAGE: $name [OPTIONS] [FLAGS] + +OPTIONS: +-cc LIMIT -> charge convergence LIMIT (0.0001 e) +-ec LIMIT -> energy convergence LIMIT ($ecut Ry) +-fc LIMIT -> force convergence LIMIT (1.0 mRy/a.u.) + default is -ec 0.0001; multiple convergence tests possible +-e PROGRAM -> exit after PROGRAM ($stopafter) +-i NUMBER -> max. NUMBER ($iter) of iterations +-s PROGRAM -> start with PROGRAM ($next) +-r NUMBER -> restart after NUMBER ($riter) iterations (rm *.broyd*) +-nohns NUMBER ->do not use HNS for NUMBER iterations +-in1new N -> create "new" in1 file after N iter (write_in1 using scf2 info) +-ql LIMIT -> select LIMIT ($qlimit) as min.charge for E-L setting in new in1 +-qdmft NP -> including DMFT from Aichhorn/Georges/Biermann running on NP proc + +FLAGS: +-h/-H -> help +-I -> with initialization of in2-files to "TOT" +-NI -> does NOT remove case.broyd* (default: rm *.broyd* after 60 sec) +-p -> run k-points in parallel (needs .machine file [speed:name]) +-it -> use iterative diagonalization +-it1 -> use iterative diag. with recreating H_inv (after basis change) +-it2 -> use iterative diag. with reinitialization (after basis change) +-noHinv -> use iterative diag. without H_inv +-vec2pratt -> use vec2pratt instead of vec2old for iterative diag. +-so -> run SCF including spin-orbit coupling +-dm -> calculate the density matrix (when -so is set, but -orb is not) +-eece -> use "ecact exchange+hybrid" methods +-orb -> use LDA+U, OP or B-ext correction +-orbc -> use LDA+U correction, but with constant V-matrix +-orbdu -> use LDA+U with crossterms up-dn (needs also -so) +-renorm-> start with mixer and renormalize density +-in1orig-> if present, use case.in1_orig file; do not modify case.in1 +-hf -> HF/hybrid-DFT calculation +-diaghf -> non-selfconsistent HF with diagonal HF only (only e_i) +-nonself -> non-selfconsistent HF/hybrid-DFT calculation (only E_x(HF)) +-newklist -> HF/hybrid-DFT calculation starting from a different k-mesh +-redklist -> HF/hybrid-DFT calculation with a reduced k-mesh for the potential + +CONTROL FILES: +.lcore runs core density superposition producing case.clmsc +.stop stop after SCF cycle +.minstop stops MSR1a minimization and changes to MSR1 +.fulldiag force full diagonalization +.noHinv remove case.storeHinv files +case.inm_vresp activates calculation of vresp files for meta-GGAs +case.in0_grr activates a second call of lapw0 (mBJ pot., or E_xc analysis) + +ENVIRONMENT VARIBLES: +SCRATCH directory where vectors and help files should go + +theend + +exit 1 + + diff --git a/fortran/dmftproj/density.f b/fortran/dmftproj/density.f new file mode 100644 index 00000000..3440a5b7 --- /dev/null +++ b/fortran/dmftproj/density.f @@ -0,0 +1,1109 @@ + +c ****************************************************************************** +c +c TRIQS: a Toolbox for Research in Interacting Quantum Systems +c +c Copyright (C) 2011 by L. Pourovskii, V. Vildosola, C. Martins, M. Aichhorn +c +c TRIQS is free software: you can redistribute it and/or modify it under the +c terms of the GNU General Public License as published by the Free Software +c Foundation, either version 3 of the License, or (at your option) any later +c version. +c +c TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +c WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +c FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +c details. +c +c You should have received a copy of the GNU General Public License along with +c TRIQS. If not, see . +c +c *****************************************************************************/ + + SUBROUTINE density(tetr,only_corr,qtot,ifprnt) +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine computes the density matrices for all the %% +C %% inlcuded orbitals and the corresponding total charge, within %% +C %% the energy window for which the projectors were previously %% +C %% defined. %% +C %% %% +C %% If tetr = .TRUE., the tetrahedron weights are used. %% +C %% = .FALSE., a simple point integration is used. %% +C %% %% +C %% If only_corr = .TRUE., the calculation is performed for the %% +C %% correlated orbitals only. %% +C %% %% +C %% If ifprnt = .TRUE., the density matrices are written in the %% +C %% file case.outdmftpr. %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definition of the variables : +C ---------------------------- + USE almblm_data + USE common_data + USE prnt + USE projections + USE reps + USE symm + IMPLICIT NONE + LOGICAL :: tetr, only_corr, ifprnt + COMPLEX(KIND=8), DIMENSION(:,:), ALLOCATABLE :: D + COMPLEX(KIND=8), DIMENSION(:,:), ALLOCATABLE :: conj_mat, mat + INTEGER :: is, is1, ik, iorb, l, nbnd, iss + INTEGER :: lm, i, icrorb, m1, m2, m, ib + INTEGER :: iatom, jatom, jorb, imu, isrt, isym + INTEGER :: istart, istart1 + INTEGER :: nbbot, nbtop + REAL(KIND=8) :: q, qtot +C + WRITE(buf,'(a)')'Evaluation of the density matrices...' + CALL printout(0) + CALL printout(0) +C +C Initialization of the variable nsp and of the table crdensmat +C nsp describes the number of block necessary to describe the complete density matrix. + nsp=ns + IF(ifSO) nsp=4 +C The only possible cases are therefore : +C nsp=1 for a computation without spin-polarized input files, without SO [block (up/up+dn/dn)] +C nsp=2 for a computation with spin-polarized input files (but without SO) [blocks up/up and dn/dn] +C nsp=4 for a computation (with spin-polarized input files) with SO [all the blocks] +C +C +C ============================================================= +C Computation of the density matrices for correlated orbitals : +C ============================================================= +C +C These computations are performed only if there are correlated orbitals in the system. + IF(ncrorb.NE.0) THEN +C crdensmat is a table of size nsp*ncrorb. +C For each correlated orbital icrorb, crdensmat(:,icrorb) is the corresponding density matrix. + IF(.NOT.ALLOCATED(crdensmat)) THEN + ALLOCATE(crdensmat(nsp,ncrorb)) + ENDIF + DO icrorb=1,ncrorb + DO is=1,nsp + IF(ALLOCATED(crdensmat(is,icrorb)%mat)) + & DEALLOCATE(crdensmat(is,icrorb)%mat) + ALLOCATE(crdensmat(is,icrorb)%mat(1,1)) + crdensmat(is,icrorb)%mat(1,1)=0.d0 + ENDDO + ENDDO +C +C Loop on the correlated orbitals icrorb +C + DO icrorb=1,ncrorb + isrt=crorb(icrorb)%sort + l=crorb(icrorb)%l +C +C ----------------------------------------------------------------------------------- +C The s-orbitals are a particular case of a "non-mixing" basis and are treated here : +C ----------------------------------------------------------------------------------- + IF (l==0) THEN +C The field mat of crdensmat has already the good size (1 scalar element). +C There's no need of a basis change since the representation of an s-orbital is Identity whatever the basis is. + DO ik=1,nk + DO iss=1,nsp +C +C Determination of the block indices : +C ------------------------------------ + IF(iss.LE.2) THEN + is=iss + is1=iss +C If iss=1 (up), is=1 and is1=1 -> Description of the up/up block +C If iss=2 (down), is=2 and is1=2 -> Description of the dn/dn block + ELSE + is=iss-2 + is1=3-is +C If iss=3, is=1 (up) and is1=2 (down) -> Description of the up/dn block +C If iss=4, is=2 (down) and is1=1 (up) -> Description of the dn/up block + ENDIF +C Only the k-points with included bands are considered for the projectors. + IF(.NOT.kp(ik,is)%included) CYCLE + IF(.NOT.kp(ik,is1)%included) CYCLE + nbnd=kp(ik,is)%nb_top-kp(ik,is)%nb_bot+1 + nbbot=kp(ik,is)%nb_bot + nbtop=kp(ik,is)%nb_top +C for the diagonal blocks, is=is1 ; thus nbtop and nbtop are the same for is and is1. +C for the off-diagonal blocks (calculated only when SO is considered), +C it was checked that nbtop(up)=nbtop(dn) and nbbot(up)=nbbot(dn) [in set_projections.f] +C thus nbtop and nbtop fit again for is and is1. +C +C Computation of the density matrix using the tetrahedron weights for the integration : +C ------------------------------------------------------------------------------------- + IF(tetr) THEN +C The field pr_crorb%mat_rep is used to perform the computation (well defined for s-orbitals) + ALLOCATE(mat(1,nbbot:nbtop),conj_mat(1,nbbot:nbtop)) + mat(1,nbbot:nbtop)= + & pr_crorb(icrorb,ik,is)%mat_rep(1,nbbot:nbtop)* + & SQRT(kp(ik,is)%tetrweight(nbbot:nbtop)) + conj_mat(1,nbbot:nbtop)=CONJG( + & pr_crorb(icrorb,ik,is1)%mat_rep(1,nbbot:nbtop))* + & SQRT(kp(ik,is1)%tetrweight(nbbot:nbtop)) +C mat = P(icrorb,ik,is)*sqrt(tetrahedron-weight(ik,is)) +C conj_mat = conjugate[ P(icrorb,ik,is1)) ]*sqrt(tetrahedron-weight(ik,is1)) + DO ib = nbbot,nbtop + crdensmat(iss,icrorb)%mat(1,1)= + = crdensmat(iss,icrorb)%mat(1,1)+ + + mat(1,ib)*conj_mat(1,ib) + ENDDO +C crdensmat = mat*transpose(conj_mat) which is a matrix of size 1 +C The summation over the k-points is done with the do loop ; +C crdensmat(iss,icrorb) is therefore the block "iss" of the density matrix for the orbital icrorb. + DEALLOCATE(conj_mat,mat) +C +C Computation of the density matrix using a simple point integration : +C -------------------------------------------------------------------- + ELSE + DO ib = nbbot, nbtop + crdensmat(iss,icrorb)%mat(1,1)= + = crdensmat(iss,icrorb)%mat(1,1)+ + + pr_crorb(icrorb,ik,is)%mat_rep(1,ib)* + * CONJG(pr_crorb(icrorb,ik,is1)%mat_rep(1,ib))* + * kp(ik,is)%weight + ENDDO +C crdensmat = P(icrorb,ik,is)*transpose(conjugate(P(icrorb,ik,is1)))*weight(ik,is) which is a matrix of size 1. +C The weight used is a geometric factor associated to k and does not depend on the variable is. +C That's why we merely multiply by the "weight" each term while summing over the k-points. + ENDIF + ENDDO ! End of the iss loop + ENDDO ! End of the ik loop +C +C ----------------------------------------------------------------------------------------------------- +C If the basis representation needs a complete spinor rotation approach (matrices of size 2*(2*l+1) ) : +C ----------------------------------------------------------------------------------------------------- + ELSEIF (reptrans(l,isrt)%ifmixing) THEN +C If this option is used, then ifSO=.TRUE. (because of the restriction in set_ang_trans.f) +C Moreover ifSP=.TRUE. (since ifSO => ifSP, in this version) +C As a result, we know that nb_bot(up)=nb_bot(dn) and nb_top(up)=nb_top(dn) +C +C The field mat of crdensmat must be resized. +C As the complete spinor rotation approach is used, only one matrix is necessary (with is=1). + DEALLOCATE(crdensmat(1,icrorb)%mat) + ALLOCATE(crdensmat(1,icrorb)%mat(1:2*(2*l+1),1:2*(2*l+1))) + crdensmat(1,icrorb)%mat(1:2*(2*l+1),1:2*(2*l+1))=0.d0 + ALLOCATE(D(1:2*(2*l+1),1:2*(2*l+1))) +C +C Computation of the density matrix using the tetrahedron weights for the integration : +C ------------------------------------------------------------------------------------- + IF(tetr) THEN + DO ik=1,nk +C Only the k-points with inlcuded bands are considered for the projectors. + IF(.NOT.kp(ik,1)%included) CYCLE + nbnd=kp(ik,1)%nb_top-kp(ik,1)%nb_bot+1 + nbbot=kp(ik,1)%nb_bot + nbtop=kp(ik,1)%nb_top +C A distinction between up and dn states is necessary in order to use the tetrahedron weight. +C As a result, we will transform the projectors back in spherical harmonics basis +C to perform the calculation and then put the resulting density matrix in the desired basis. +C + ALLOCATE(mat(1:2*(2*l+1),nbbot:nbtop)) + ALLOCATE(conj_mat(1:2*(2*l+1),nbbot:nbtop)) +C The representation of the projectors is put back in the spherical harmonics basis + mat(1:2*(2*l+1),nbbot:nbtop)=MATMUL(TRANSPOSE(CONJG( + = reptrans(l,isrt)%transmat + & (1:2*(2*l+1),1:2*(2*l+1)))),pr_crorb(icrorb,ik,1)% + & mat_rep(1:2*(2*l+1),nbbot:nbtop)) +C mat = inverse(reptrans)*pr_crorb%mat_rep = *proj_{new_i} = proj_{lm} [temporarily] + conj_mat(1:2*(2*l+1),nbbot:nbtop)=MATMUL( + & TRANSPOSE(CONJG(reptrans(l,isrt)% + & transmat(1:2*(2*l+1),1:2*(2*l+1)) )), + & pr_crorb(icrorb,ik,1)%mat_rep + & (1:2*(2*l+1),nbbot:nbtop)) +C conj_mat = inverse(reptrans)*pr_crorb%mat_rep = *proj_{new_i} = proj_{lm} [temporarily] + DO m=1,2*l+1 + mat(m,nbbot:nbtop)=mat(m,nbbot:nbtop)* + & SQRT(kp(ik,1)%tetrweight(nbbot:nbtop)) +C The first (2*l+1) lines are associated to up states. Hence a multiplication by tetrweight(up) + mat((2*l+1)+m,nbbot:nbtop)= + = mat((2*l+1)+m,nbbot:nbtop)* + & SQRT(kp(ik,2)%tetrweight(nbbot:nbtop)) +C The last (2*l+1) lines are associated to dn states. Hence a multiplication by tetrweight(dn) +C mat = P(icrorb,ik,is)*sqrt(tetrahedron-weight(ik,is)) + conj_mat(m,nbbot:nbtop)= + = CONJG(conj_mat(m,nbbot:nbtop))* + & SQRT(kp(ik,1)%tetrweight(nbbot:nbtop)) +C The first (2*l+1) lines are associated to up states. Hence a multiplication by tetrweight(up) + conj_mat((2*l+1)+m,nbbot:nbtop)= + & CONJG(conj_mat((2*l+1)+m,nbbot:nbtop))* + & SQRT(kp(ik,2)%tetrweight(nbbot:nbtop)) +C The last (2*l+1) lines are associated to dn states. Hence a multiplication by tetrweight(dn) +C conj_mat = conjugate[ P(icrorb,ik,is1))*sqrt(tetrahedron-weight(ik,is1)) ] + ENDDO + CALL zgemm('N','T',2*(2*l+1),2*(2*l+1),nbnd, + & DCMPLX(1.D0,0.D0),mat,2*(2*l+1),conj_mat,2*(2*l+1), + & DCMPLX(0.D0,0.D0),D,2*(2*l+1)) + DEALLOCATE(conj_mat,mat) +C D = mat*transpose(conj_mat) is a matrix of size 2*(2*l+1)* 2*(2*l+1) +C + crdensmat(1,icrorb)%mat(1:2*(2*l+1),1:2*(2*l+1))= + & crdensmat(1,icrorb)%mat(1:2*(2*l+1),1:2*(2*l+1)) + & +D(1:2*(2*l+1),1:2*(2*l+1)) + END DO ! End of the ik loop +C The summation over the k-points is done. +C crdensmat(icrorb) is therefore the complete density matrix in spherical harmonic basis. +C +C The density matrix is then put into the desired basis, using reptrans(l,isrt)%transmat + crdensmat(1,icrorb)%mat(1:2*(2*l+1),1:2*(2*l+1))= + = MATMUL(reptrans(l,isrt)%transmat + & (1:2*(2*l+1),1:2*(2*l+1)),crdensmat(1,icrorb)%mat + & (1:2*(2*l+1),1:2*(2*l+1)) ) + crdensmat(1,icrorb)%mat(1:2*(2*l+1),1:2*(2*l+1))= + = MATMUL(crdensmat(1,icrorb)%mat + & (1:2*(2*l+1),1:2*(2*l+1)),TRANSPOSE( CONJG( + & reptrans(l,isrt)%transmat(1:2*(2*l+1),1:2*(2*l+1))))) +C crdensmat = (reptrans)*crdensmat_l*inverse(reptrans) +C or crdensmat = crdensmat_{lm} +C crdensmat(icrorb) is now the complete density matrix in the desired basis. +C +C Computation of the density matrix using a simple point integration : +C -------------------------------------------------------------------- + ELSE +C No distinction between up and dn states is necessary because we use a +C geometric factor which depends only of the k-point. +C We can then use directly the projectors in the desired basis. + DO ik=1,nk +C Only the k-points with inlcuded bands are considered for the projectors. + IF(.NOT.kp(ik,1)%included) CYCLE + nbnd=kp(ik,1)%nb_top-kp(ik,1)%nb_bot+1 + nbbot=kp(ik,1)%nb_bot + nbtop=kp(ik,1)%nb_top + ALLOCATE(mat(1:2*(2*l+1),nbbot:nbtop)) + mat(1:2*(2*l+1),nbbot:nbtop)= + = pr_crorb(icrorb,ik,1)%mat_rep(1:2*(2*l+1), + & nbbot:nbtop) + CALL zgemm('N','C',2*(2*l+1),2*(2*l+1),nbnd, + & DCMPLX(1.D0,0.D0),mat,2*(2*l+1),mat,2*(2*l+1), + & DCMPLX(0.D0,0.D0),D,2*(2*l+1)) + DEALLOCATE(mat) +C D = P(icrorb,ik,is)*transpose(conjugate(P(icrorb,ik,is))) is a matrix of size 2*(2*l+1) * 2*(2*l+1) + crdensmat(1,icrorb)%mat(1:2*(2*l+1),1:2*(2*l+1))= + = crdensmat(1,icrorb)%mat(1:2*(2*l+1),1:2*(2*l+1)) + + +D(1:2*(2*l+1),1:2*(2*l+1))*kp(ik,1)%weight + ENDDO ! End of the ik loop +C The summation over the k-points is done in the do loop. +C The weight used is a geometric factor associated to k and does not depend on the variable is. +C That's why we merely multiply by the "weight" each term while summing over the k-points. + ENDIF + DEALLOCATE(D) +C +C ---------------------------------------------------------------------------------------------- +C If the basis representation can be reduce to the up/up block (matrices of size (2*l+1) only) : +C ---------------------------------------------------------------------------------------------- + ELSE +C The field mat of crdensmat must be resized. +C nsp matrices of size (2*l+1) are necessary to represent the whole density matrix. + DO is=1,nsp + DEALLOCATE(crdensmat(is,icrorb)%mat) + ALLOCATE(crdensmat(is,icrorb)%mat(-l:l,-l:l)) + crdensmat(is,icrorb)%mat(-l:l,-l:l)=0.d0 + ENDDO + ALLOCATE(D(-l:l,-l:l)) +C All the computations can be performed in the new basis (using the field pr_crorb%mat_rep) + DO ik=1,nk + DO iss=1,nsp +C +C Determination of the block indices : +C ------------------------------------ + IF(iss.LE.2) THEN + is=iss + is1=iss +C If iss=1 (up), is=1 and is1=1 -> Description of the up/up block +C If iss=2 (down), is=2 and is1=2 -> Description of the dn/dn block + ELSE + is=iss-2 + is1=3-is +C If iss=3, is=1 (up) and is1=2 (down) -> Description of the up/dn block +C If iss=4, is=2 (down) and is1=1 (up) -> Description of the dn/up block + ENDIF +C Only the k-points with inlcuded bands are considered for the projectors. + IF(.NOT.kp(ik,is)%included) CYCLE + IF(.NOT.kp(ik,is1)%included) CYCLE + nbnd=kp(ik,is)%nb_top-kp(ik,is)%nb_bot+1 + nbbot=kp(ik,is)%nb_bot + nbtop=kp(ik,is)%nb_top +C for the diagonal blocks, is=is1 ; thus nbtop and nbtop are the same for is and is1. +C for the off-diagonal blocks (calculated only when SO is considered), +C it was checked that nbtop(up)=nbtop(dn) and nbbot(up)=nbbot(dn) [in set_projections.f] +C thus nbtop and nbtop fit again for is and is1. +C +C Computation of the density matrix using the tetrahedron weights for the integration : +C ------------------------------------------------------------------------------------- + IF(tetr) THEN +C The representation of the projectors in the desired basis is used (field pr_crorb%mat_rep) + ALLOCATE(mat(-l:l,nbbot:nbtop)) + ALLOCATE(conj_mat(-l:l,nbbot:nbtop)) + DO m=-l,l + mat(m,nbbot:nbtop)= + = pr_crorb(icrorb,ik,is)%mat_rep(m,nbbot:nbtop)* + & SQRT(kp(ik,is)%tetrweight(nbbot:nbtop)) + conj_mat(m,nbbot:nbtop)=CONJG( + & pr_crorb(icrorb,ik,is1)%mat_rep(m,nbbot:nbtop)) + & *SQRT(kp(ik,is1)%tetrweight(nbbot:nbtop)) +C mat = P(icrorb,ik,is)*sqrt(tetrahedron-weight(ik,is)) +C conj_mat = conjugate[ P(icrorb,ik,is1))*sqrt(tetrahedron-weight(ik,is1)) ] + ENDDO + CALL zgemm('N','T',(2*l+1),(2*l+1),nbnd, + & DCMPLX(1.D0,0.D0),mat,(2*l+1),conj_mat,(2*l+1), + & DCMPLX(0.D0,0.D0),D(-l:l,-l:l),(2*l+1)) + DEALLOCATE(conj_mat,mat) +C D = mat*transpose(conj_mat) is a matrix of size (2*l+1)*(2*l+1) + crdensmat(iss,icrorb)%mat(-l:l,-l:l)= + = crdensmat(iss,icrorb)%mat(-l:l,-l:l)+D(-l:l,-l:l) +C The summation over the k-points is done. +C crdensmat(icrorb) is therefore the complete density matrix of the orbital icrorb. +C +C Computation of the density matrix using a simple point integration : +C -------------------------------------------------------------------- + ELSE + ALLOCATE(mat(-l:l,nbbot:nbtop)) + ALLOCATE(conj_mat(-l:l,nbbot:nbtop)) + mat(-l:l,nbbot:nbtop)=pr_crorb(icrorb,ik,is) + & %mat_rep(-l:l,nbbot:nbtop) + conj_mat(-l:l,nbbot:nbtop)=pr_crorb(icrorb,ik,is1) + & %mat_rep(-l:l,nbbot:nbtop) + CALL zgemm('N','C',(2*l+1),(2*l+1),nbnd, + & DCMPLX(1.D0,0.D0),mat,(2*l+1),conj_mat,(2*l+1), + & DCMPLX(0.D0,0.D0),D(-l:l,-l:l),(2*l+1)) + DEALLOCATE(mat,conj_mat) +C D = P(icrorb,ik,is)*transpose(conjugate(P(icrorb,ik,is))) is a matrix of size (2*l+1)*(2*l+1) + crdensmat(iss,icrorb)%mat(-l:l,-l:l)= + = crdensmat(iss,icrorb)%mat(-l:l,-l:l) + + +D(-l:l,-l:l)*kp(ik,is)%weight +C The weight used is a geometric factor asoociated to k and does not depend on the variable is. +C That's why we merely multiply by the "weight" each term while summing over the k-points. + ENDIF + ENDDO ! End of the iss loop + ENDDO ! End of the ik loop + DEALLOCATE(D) + ENDIF ! End of the basis if-then-else +C + ENDDO ! End of the icrorb loop +C +C +C =============================== +C Symmetrization to the full BZ : +C =============================== + CALL symmetrize_mat(crdensmat,crorb,ncrorb) +C +C +C ============================================================================ +C Application of the Rloc transformation to go back to the local coordinates : +C ============================================================================ + CALL rotdens_mat(crdensmat,crorb,ncrorb) +C +C +C ================================================================= +C Printing the density matrices and the charge in the output file : +C ================================================================= + IF(ifprnt) THEN + CALL printout(0) + WRITE(buf,'(a)') '-------------------------------------' + CALL printout(0) + WRITE(buf,'(a)') + & 'Density Matrices for the Correlated States : ' + CALL printout(0) +C The density matrices and charge are printed for all the corrrelated orbitals + DO icrorb=1,ncrorb + CALL printout(0) + isrt=crorb(icrorb)%sort + l=crorb(icrorb)%l +C Description of the correlated orbital + WRITE(buf,'(3(a,i3))') + & ' Sort = ',isrt,' Atom = ',crorb(icrorb)%atom, + & ' and Orbital l = ',l + CALL printout(0) + q=0d0 +C +C The case l=0 is a particular case of "non-mixing" basis. +C -------------------------------------------------------- + IF (l==0) THEN +C For a calculation spin-polarized with SO : + IF (nsp==4) THEN + WRITE(buf,'(2(2F12.6,2x))') + & crdensmat(1,icrorb)%mat(1,1), + & crdensmat(3,icrorb)%mat(1,1) + CALL printout(0) + WRITE(buf,'(2(2F12.6,2x))') + & crdensmat(4,icrorb)%mat(1,1), + & crdensmat(2,icrorb)%mat(1,1) + CALL printout(0) + q=q+crdensmat(1,icrorb)%mat(1,1)+ + + crdensmat(2,icrorb)%mat(1,1) +C For a calculation spin-polarized without SO : + ELSE IF (nsp==2) THEN + WRITE(buf,'(2(2F12.6,2x))') + & crdensmat(1,icrorb)%mat(1,1),DCMPLX(0.D0,0.D0) + CALL printout(0) + WRITE(buf,'(2(2F12.6,2x))') + & DCMPLX(0.D0,0.D0),crdensmat(2,icrorb)%mat(1,1) + CALL printout(0) + q=q+crdensmat(1,icrorb)%mat(1,1)+ + + crdensmat(2,icrorb)%mat(1,1) +C For a paramagnetic calculation without SO : + ELSE + WRITE(buf,'(2F12.6,2x)') crdensmat(1,icrorb)%mat(1,1) + CALL printout(0) + q=q+crdensmat(1,icrorb)%mat(1,1) + ENDIF +C +C If the basis representation needs a complete spinor rotation approach (basis with "mixing" ). +C --------------------------------------------------------------------------------------------- + ELSEIF (reptrans(l,isrt)%ifmixing) THEN +C In this case, the calculation is necessary spin-polarized with SO : + WRITE(buf,'(a,a)') 'Writing the matrix as : ', + & '[ block 1 | block 2 ] with' + CALL printout(0) + WRITE(buf,'(a,a)') ' ', + & '[ block 3 | block 4 ]' + CALL printout(0) +C Printing the different blocks + ALLOCATE(D(1,1:2*l+1)) + WRITE(buf,'(a,i2,a)') ' # For the block 1 :' + CALL printout(0) + DO m=1,2*l+1 + D(1,1:2*l+1)=crdensmat(1,icrorb)%mat(m,1:(2*l+1)) + WRITE(buf,'(7(2F12.6),x)') D(:,:) + CALL printout(0) + ENDDO + WRITE(buf,'(a,i2,a)') ' # For the block 2 :' + CALL printout(0) + DO m=1,2*l+1 + D(1,1:2*l+1)= + & crdensmat(1,icrorb)%mat(m,2*l+2:2*(2*l+1)) + WRITE(buf,'(7(2F12.6),x)') D(:,:) + CALL printout(0) + ENDDO + WRITE(buf,'(a,i2,a)') ' # For the block 3 :' + CALL printout(0) + DO m=2*l+2,2*(2*l+1) + D(1,1:2*l+1)= + & crdensmat(1,icrorb)%mat(m,1:(2*l+1)) + WRITE(buf,'(7(2F12.6),x)') D(:,:) + CALL printout(0) + ENDDO + WRITE(buf,'(a,i2,a)') ' # For the block 4 :' + CALL printout(0) + DO m=2*l+2,2*(2*l+1) + D(1,1:2*l+1)= + & crdensmat(1,icrorb)%mat(m,2*l+2:2*(2*l+1)) + WRITE(buf,'(7(2F12.6),x)') D(:,:) + CALL printout(0) + ENDDO + DEALLOCATE(D) + DO m1=1,2*(2*l+1) + q=q+crdensmat(1,icrorb)%mat(m1,m1) + ENDDO +C +C If the basis representation can be reduce to the up/up block (basis without "mixing"). +C -------------------------------------------------------------------------------------- + ELSE + IF(nsp==4) THEN + WRITE(buf,'(a,a)') 'Writing the matrix as : ', + & '[ block up/up | block up/dn ] with' + CALL printout(0) + WRITE(buf,'(a,a)') ' ', + & '[ block dn/up | block dn/dn ]' + CALL printout(0) + ELSEIF(nsp==2) THEN + WRITE(buf,'(a,a)') 'Writing the matrix as : ', + & '[ block up/up | 0 ] with' + CALL printout(0) + WRITE(buf,'(a,a)') ' ', + & '[ 0 | block dn/dn ]' + CALL printout(0) + ENDIF + DO iss=1,nsp + IF(iss.LE.2) THEN + is=iss + is1=iss +C If iss=1 (up), is=1 and is1=1 -> Description of the up/up block +C If iss=2 (down), is=2 and is1=2 -> Description of the down/down block + IF (is==1) THEN + IF ( ifSP.or.ifSO ) THEN + WRITE(buf,'(a)') ' # For the Up/Up block :' + ENDIF + CALL printout(0) + ELSE + WRITE(buf,'(a)') ' # For the Down/Down block :' + CALL printout(0) + ENDIF + ELSE + is=iss-2 + is1=3-is +C If iss=3, is=1 (up) and is1=2 (down) -> Description of the up/down block +C If iss=4, is=2 (down) and is1=1 (up) -> Description of the down/up block + IF (is==1) THEN + WRITE(buf,'(a)') ' # For the Up/Down block :' + CALL printout(0) + ELSE + WRITE(buf,'(a)') ' # For the Down/Up block :' + CALL printout(0) + ENDIF + ENDIF + ALLOCATE(D(1,-l:l)) + DO m=-l,l + D(1,-l:l)=crdensmat(iss,icrorb)%mat(m,-l:l) + WRITE(buf,'(7(2F12.6),x)') D(:,:) + CALL printout(0) + IF(is==is1) q=q+crdensmat(iss,icrorb)%mat(m,m) + ENDDO + DEALLOCATE(D) + ENDDO + ENDIF +C Displaying the charge q of the orbital + CALL printout(0) + WRITE(buf,'(a,f10.5)')'The charge of the orbital is : ',q + CALL printout(0) + ENDDO + ENDIF +C + ENDIF ! End of the if ncrorb=0 if-then-else +C The calculation is stopped here if the flag only_corr is .TRUE. + IF (.not.only_corr) THEN +C +C ========================================= +C Computation of the total charge density : +C ========================================= +C The charge is stored in the variable qtot given in argument. + qtot=0d0 + do is=1,ns + DO ik=1,nk + if (kp(ik,is)%included) then + DO ib=kp(ik,is)%nb_bot,kp(ik,is)%nb_top + IF(tetr) THEN + qtot=qtot+kp(ik,is)%tetrweight(ib) + ELSE + qtot=qtot+kp(ik,is)%weight + ENDIF + ENDDO + endif + ENDDO + if (ifSO) exit + enddo +C +C ================================================================= +C Computation of the density matrix for all the included orbitals : +C ================================================================= +C The computations are performed with the Theta projectors (pr_orb) +C +C densmat is a table of size nsp*norb. +C For each included orbital iorb, densmat(:,iorb) is the corresponding density matrix. + IF(.NOT.ALLOCATED(densmat)) THEN + ALLOCATE(densmat(nsp,norb)) + ENDIF + DO iorb=1,norb + DO is=1,nsp + IF(ALLOCATED(densmat(is,iorb)%mat)) + & DEALLOCATE(densmat(is,iorb)%mat) + ALLOCATE(densmat(is,iorb)%mat(1,1)) + densmat(is,iorb)%mat(1,1)=0.d0 + ENDDO + ENDDO +C +C Loop on the included orbitals iorb +C + DO iorb=1,norb + isrt=orb(iorb)%sort + l=orb(iorb)%l +C +C ----------------------------------------------------------------------------------- +C The s-orbitals are a particular case of a "non-mixing" basis and are treated here : +C ----------------------------------------------------------------------------------- + IF (l==0) THEN +C The field mat of densmat has already the good size (1 scalar element). +C There's no need of a basis change since the representation of an s-orbital is Identity whatever the basis is. + DO ik=1,nk + DO iss=1,nsp +C +C Determination of the block indices : +C ------------------------------------ + IF(iss.LE.2) THEN + is=iss + is1=iss +C If iss=1 (up), is=1 and is1=1 -> Description of the up/up block +C If iss=2 (down), is=2 and is1=2 -> Description of the dn/dn block + ELSE + is=iss-2 + is1=3-is +C If iss=3, is=1 (up) and is1=2 (down) -> Description of the up/dn block +C If iss=4, is=2 (down) and is1=1 (up) -> Description of the dn/up block + ENDIF +C Only the k-points with inlcuded bands are considered for the projectors. + IF(.NOT.kp(ik,is)%included) CYCLE + IF(.NOT.kp(ik,is1)%included) CYCLE + nbnd=kp(ik,is)%nb_top-kp(ik,is)%nb_bot+1 + nbbot=kp(ik,is)%nb_bot + nbtop=kp(ik,is)%nb_top +C for the diagonal blocks, is=is1 ; thus nbtop and nbtop are the same for is and is1. +C for the off-diagonal blocks (calculated only when SO is considered), +C it was checked that nbtop(up)=nbtop(dn) and nbbot(up)=nbbot(dn) [in set_projections.f] +C thus nbtop and nbtop fit again for is and is1. +C +C Computation of the density matrix using the tetrahedron weights for the integration : +C ------------------------------------------------------------------------------------- + IF(tetr) THEN +C The field pr_orb%matn_rep is used to perform the computation (well defined for s-orbitals) + DO i=1,norm_radf(iorb)%n + ALLOCATE(mat(1,nbbot:nbtop)) + ALLOCATE(conj_mat(1,nbbot:nbtop)) + mat(1,nbbot:nbtop)= + & pr_orb(iorb,ik,is)%matn_rep(1,nbbot:nbtop,i)* + & SQRT(kp(ik,is)%tetrweight(nbbot:nbtop)) + conj_mat(1,nbbot:nbtop)=CONJG( + & pr_orb(iorb,ik,is1)%matn_rep(1,nbbot:nbtop,i))* + & SQRT(kp(ik,is1)%tetrweight(nbbot:nbtop)) +C mat = Theta(iorb,ik,is)*sqrt(tetrahedron-weight(ik,is)) +C conj_mat = conjugate[ Theta(iorb,ik,is1))*sqrt(tetrahedron-weight(ik,is1)) ] + DO ib = nbbot,nbtop + densmat(iss,iorb)%mat(1,1)= + = densmat(iss,iorb)%mat(1,1) + & +mat(1,ib)*conj_mat(1,ib) + ENDDO +C densmat = mat*transpose(conj_mat) which is a matrix of size 1 + DEALLOCATE(conj_mat,mat) + ENDDO +C The summation over the k-points is done with the do loop ; +C The summation over the |phi_j> basis is done with the do loop ; +C densmat(iss,iorb) is therefore the block "iss" of the density matrix for the orbital iorb. +C +C Computation of the density matrix using a simple point integration : +C -------------------------------------------------------------------- + ELSE + DO i=1,norm_radf(iorb)%n + DO ib = nbbot,nbtop + densmat(iss,iorb)%mat(1,1)= + = densmat(iss,iorb)%mat(1,1)+ + + pr_orb(iorb,ik,is)%matn_rep(1,ib,i)* + * CONJG(pr_orb(iorb,ik,is1)%matn_rep(1,ib,i))* + * kp(ik,is)%weight + ENDDO + ENDDO +C densmat = Theta(iorb,ik,is)*transpose(conjugate(Theta(iorb,ik,is1))) which is a matrix of size 1 +C The weight used is a geometric factor associated to k and does not depend on the variable is. +C That's why we merely multiply by the "weight" each term while summing over the k-points. + ENDIF + ENDDO ! End of the iss loop + ENDDO ! End of the ik loop +C +C ----------------------------------------------------------------------------------------------------- +C If the basis representation needs a complete spinor rotation approach (matrices of size 2*(2*l+1) ) : +C ----------------------------------------------------------------------------------------------------- + ELSEIF (reptrans(l,isrt)%ifmixing) THEN +C If this option is used, then ifSO=.TRUE. (because of the restriction in set_ang_trans.f) +C Moreover ifSP=.TRUE. (since ifSO => ifSP, in this version) +C As a result, we know that nb_bot(up)=nb_bot(dn) and nb_top(up)=nb_top(dn) +C +C The field mat of densmat must be resized. +C As the complete spinor rotation approach is used, only one matrix is necessary (with is=1). + DEALLOCATE(densmat(1,iorb)%mat) + ALLOCATE(densmat(1,iorb)%mat(1:2*(2*l+1),1:2*(2*l+1))) + densmat(1,iorb)%mat(1:2*(2*l+1),1:2*(2*l+1))=0.d0 + ALLOCATE(D(1:2*(2*l+1),1:2*(2*l+1))) +C +C Computation of the density matrix using the tetrahedron weights for the integration : +C ------------------------------------------------------------------------------------- + IF(tetr) THEN + DO ik=1,nk +C Only the k-points with inlcuded bands are considered for the projectors. + IF(.NOT.kp(ik,1)%included) CYCLE + nbnd=kp(ik,1)%nb_top-kp(ik,1)%nb_bot+1 + nbbot=kp(ik,1)%nb_bot + nbtop=kp(ik,1)%nb_top +C A distinction between up and dn states is necessary in order to use the tetrahedron weight. +C As a result, we will transform the projectors back in spherical harmonics basis +C to perform the calculation and then put the resulting density matrix in the desired basis. +C +C Loop on the |phi_j> basis + DO i=1,norm_radf(iorb)%n + ALLOCATE(mat(1:2*(2*l+1),nbbot:nbtop)) + ALLOCATE(conj_mat(1:2*(2*l+1),nbbot:nbtop)) +C The representation of the projectors is put back in the spherical harmonics basis + mat(1:2*(2*l+1),nbbot:nbtop)=MATMUL( + & TRANSPOSE(CONJG(reptrans(l,isrt)% + & transmat(1:2*(2*l+1),1:2*(2*l+1)) )), + & pr_orb(iorb,ik,1)%matn_rep + & (1:2*(2*l+1),nbbot:nbtop,i) ) +C mat = inverse(reptrans)*pr_orb%mat_rep = *theta_{new_i} = theta_{lm} [temporarily] + conj_mat(1:2*(2*l+1),nbbot:nbtop)=MATMUL( + & TRANSPOSE(CONJG(reptrans(l,isrt)% + & transmat(1:2*(2*l+1),1:2*(2*l+1)) )), + & pr_orb(iorb,ik,1)%matn_rep + & (1:2*(2*l+1),nbbot:nbtop,i) ) +C conj_mat = inverse(reptrans)*pr_orb%mat_rep = *theta_{new_i} = theta_{lm} [temporarily] + DO m=1,2*l+1 + mat(m,nbbot:nbtop)=mat(m,nbbot:nbtop)* + & SQRT(kp(ik,1)%tetrweight(nbbot:nbtop)) +C The first (2*l+1) lines are associated to up states. Hence a multiplication by tetrweight(up) + mat((2*l+1)+m,nbbot:nbtop)= + = mat((2*l+1)+m,nbbot:nbtop)* + & SQRT(kp(ik,2)%tetrweight(nbbot:nbtop)) +C The last (2*l+1) lines are associated to dn states. Hence a multiplication by tetrweight(dn) +C mat = Theta(icrorb,ik,is)*sqrt(tetrahedron-weight(ik,is)) + conj_mat(m,nbbot:nbtop)=CONJG( + & conj_mat(m,nbbot:nbtop) )* + & SQRT(kp(ik,1)%tetrweight(nbbot:nbtop)) +C The first (2*l+1) lines are associated to up states. Hence a multiplication by tetrweight(up) + conj_mat((2*l+1)+m,nbbot:nbtop)= + & CONJG(conj_mat((2*l+1)+m,nbbot:nbtop))* + & SQRT(kp(ik,2)%tetrweight(nbbot:nbtop)) +C The last (2*l+1) lines are associated to dn states. Hence a multiplication by tetrweight(dn) +C conj_mat = conjugate[ Theta(icrorb,ik,is1))*sqrt(tetrahedron-weight(ik,is1)) ] + ENDDO + CALL zgemm('N','T',2*(2*l+1),2*(2*l+1),nbnd, + & DCMPLX(1.D0,0.D0),mat,2*(2*l+1),conj_mat,2*(2*l+1), + & DCMPLX(0.D0,0.D0),D,2*(2*l+1)) + DEALLOCATE(conj_mat,mat) +C D = mat*transpose(conj_mat) is a matrix of size 2*(2*l+1)* 2*(2*l+1) +C + densmat(1,iorb)%mat(1:2*(2*l+1),1:2*(2*l+1))= + & densmat(1,iorb)%mat(1:2*(2*l+1),1:2*(2*l+1)) + & +D(1:2*(2*l+1),1:2*(2*l+1)) + END DO ! End of the |phi_j> basis loop + END DO ! End of the ik loop +C The summation over the k-points is done ; +C The summation over the |phi_j> basis is done ; +C crdensmat(icrorb) is therefore the complete density matrix in spherical harmonic basis. +C +C The density matrix is then put into the desired basis, using reptrans(l,isrt)%transmat + densmat(1,iorb)%mat(1:2*(2*l+1),1:2*(2*l+1))= + = MATMUL(reptrans(l,isrt)%transmat + & (1:2*(2*l+1),1:2*(2*l+1)),densmat(1,iorb)%mat + & (1:2*(2*l+1),1:2*(2*l+1)) ) + densmat(1,iorb)%mat(1:2*(2*l+1),1:2*(2*l+1))= + = MATMUL(densmat(1,iorb)%mat + & (1:2*(2*l+1),1:2*(2*l+1)),TRANSPOSE( CONJG( + & reptrans(l,isrt)%transmat(1:2*(2*l+1),1:2*(2*l+1))))) +C densmat = (reptrans)*densmat_l*inverse(reptrans) +C or densmat = densmat_{lm} +C densmat(iorb) is now the complete density matrix in the desired basis. +C +C Computation of the density matrix using a simple point integration : +C -------------------------------------------------------------------- + ELSE +C No distinction between up and dn states is necessary because we use a +C geometric factor which depends only of the k-point. +C We can then use directly the projectors in the desired basis. + DO ik=1,nk +C Only the k-points with inlcuded bands are considered for the projectors. + IF(.NOT.kp(ik,1)%included) CYCLE +C Loop on the |phi_j> basis + DO i=1,norm_radf(iorb)%n + nbnd=kp(ik,1)%nb_top-kp(ik,1)%nb_bot+1 + nbbot=kp(ik,1)%nb_bot + nbtop=kp(ik,1)%nb_top + ALLOCATE(mat(1:2*(2*l+1),nbbot:nbtop)) + mat(1:2*(2*l+1),nbbot:nbtop)= + = pr_orb(iorb,ik,1)%matn_rep + & (1:2*(2*l+1),nbbot:nbtop,i) + CALL zgemm('N','C',2*(2*l+1),2*(2*l+1),nbnd, + & DCMPLX(1.D0,0.D0),mat,2*(2*l+1),mat, + & 2*(2*l+1),DCMPLX(0.D0,0.D0),D,2*(2*l+1)) + DEALLOCATE(mat) +C D = Theta(iorb,ik,is)*transpose(conjugate(Theta(iorb,ik,is))) is a matrix of size 2*(2*l+1) * 2*(2*l+1) + densmat(1,iorb)%mat(1:2*(2*l+1),1:2*(2*l+1))= + = densmat(1,iorb)%mat(1:2*(2*l+1),1:2*(2*l+1)) + + +D(1:2*(2*l+1),1:2*(2*l+1))*kp(ik,1)%weight + END DO ! End of the |phi_j > basis loop + ENDDO ! End of the ik loop +C The summation over the k-points is done ; +C The summation over the |phi_j> basis is done ; +C The weight used is a geometric factor associated to k and does not depend on the variable is. +C That's why we merely multiply by the "weight" each term while summing over the k-points. + ENDIF + DEALLOCATE(D) +C +C ---------------------------------------------------------------------------------------------- +C If the basis representation can be reduce to the up/up block (matrices of size (2*l+1) only) : +C ---------------------------------------------------------------------------------------------- + ELSE +C The field mat of densmat must be resized. +C nsp matrices of size (2*l+1) are necessary to represent the whole density matrix. + DO is=1,nsp + DEALLOCATE(densmat(is,iorb)%mat) + ALLOCATE(densmat(is,iorb)%mat(-l:l,-l:l)) + densmat(is,iorb)%mat(-l:l,-l:l)=0.d0 + ENDDO + ALLOCATE(D(-l:l,-l:l)) +C All the computations can be performed in the new basis (using the field pr_orb%matn_rep) + DO ik=1,nk + DO iss=1,nsp +C +C Determination of the block indices : +C ------------------------------------ + IF(iss.LE.2) THEN + is=iss + is1=iss +C If iss=1 (up), is=1 and is1=1 -> Description of the up/up block +C If iss=2 (down), is=2 and is1=2 -> Description of the dn/dn block + ELSE + is=iss-2 + is1=3-is +C If iss=3, is=1 (up) and is1=2 (down) -> Description of the up/dn block +C If iss=4, is=2 (down) and is1=1 (up) -> Description of the dn/up block + ENDIF +C Only the k-points with inlcuded bands are considered for the projectors. + IF(.NOT.kp(ik,is)%included) CYCLE + IF(.NOT.kp(ik,is1)%included) CYCLE + nbnd=kp(ik,is)%nb_top-kp(ik,is)%nb_bot+1 + nbbot=kp(ik,is)%nb_bot + nbtop=kp(ik,is)%nb_top +C for the diagonal blocks, is=is1 ; thus nbtop and nbtop are the same for is and is1. +C for the off-diagonal blocks (calculated only when SO is considered), +C it was checked that nbtop(up)=nbtop(dn) and nbbot(up)=nbbot(dn) [in set_projections.f] +C thus nbtop and nbtop fit again for is and is1. +C +C Computation of the density matrix using the tetrahedron weights for the integration : +C ------------------------------------------------------------------------------------- + IF(tetr) THEN +C The representation of the projectors in the desired basis is used (field pr_orb%mat_rep) + DO i=1,norm_radf(iorb)%n + ALLOCATE(mat(-l:l,nbbot:nbtop)) + ALLOCATE(conj_mat(-l:l,nbbot:nbtop)) + DO m=-l,l + mat(m,nbbot:nbtop)=pr_orb(iorb,ik,is)%matn_rep + & (m,nbbot:nbtop,i)*SQRT(kp(ik,is)% + & tetrweight(nbbot:nbtop)) + conj_mat(m,nbbot:nbtop)=CONJG( + = pr_orb(iorb,ik,is1)%matn_rep(m,nbbot:nbtop,i)) + & *SQRT(kp(ik,is1)%tetrweight(nbbot:nbtop)) +C mat = Theta(iorb,ik,is)*sqrt(tetrahedron-weight(ik,is)) +C conj_mat = conjugate[ Theta(iorb,ik,is1))*sqrt(tetrahedron-weight(ik,is1)) ] + ENDDO + CALL zgemm('N','T',(2*l+1),(2*l+1),nbnd, + & DCMPLX(1.D0,0.D0),mat,(2*l+1),conj_mat,(2*l+1), + & DCMPLX(0.D0,0.D0),D(-l:l,-l:l),(2*l+1)) + DEALLOCATE(conj_mat,mat) +C D = mat*transpose(conj_mat) is a matrix of size (2*l+1)*(2*l+1) + densmat(iss,iorb)%mat(-l:l,-l:l)= + = densmat(iss,iorb)%mat(-l:l,-l:l)+D(-l:l,-l:l) + ENDDO +C The summation over the |phi_j > basis is done. +C The summation over the k-points is done. +C densmat(iorb) is therefore the complete density matrix of the orbital iorb. +C +C Computation of the density matrix using a simple point integration : +C -------------------------------------------------------------------- + ELSE + DO i=1,norm_radf(iorb)%n + ALLOCATE(mat(-l:l,nbbot:nbtop)) + ALLOCATE(conj_mat(-l:l,nbbot:nbtop)) + mat(-l:l,nbbot:nbtop)= + = pr_orb(iorb,ik,is)%matn_rep(-l:l,nbbot:nbtop,i) + conj_mat(-l:l,nbbot:nbtop)= + = pr_orb(iorb,ik,is1)%matn_rep(-l:l,nbbot:nbtop,i) + CALL zgemm('N','C',(2*l+1),(2*l+1),nbnd, + & DCMPLX(1.D0,0.D0),mat,(2*l+1),conj_mat,(2*l+1), + & DCMPLX(0.D0,0.D0),D(-l:l,-l:l),(2*l+1)) + DEALLOCATE(mat,conj_mat) +C D = Theta(iorb,ik,is)*transpose(conjugate(Theta(iorb,ik,is))) is a matrix of size (2*l+1)*(2*l+1) + densmat(iss,iorb)%mat(-l:l,-l:l)= + = densmat(iss,iorb)%mat(-l:l,-l:l) + + +D(-l:l,-l:l)*kp(ik,is)%weight +C The weight used is a geometric factor asoociated to k and does not depend on the variable is. +C That's why we merely multiply by the "weight" each term while summing over the k-points and the |phi_j> basis. + ENDDO ! End of the |phi_j > basis loop + ENDIF + ENDDO ! End of the iss loop + ENDDO ! End of the ik loop + DEALLOCATE(D) +C + ENDIF ! End of the basis if-then-else +C + ENDDO ! End of the iorb loop +C +C +C =============================== +C Symmetrization to the full BZ : +C =============================== + CALL symmetrize_mat(densmat,orb,norb) +C +C +C ============================================================================ +C Application of the Rloc transformation to go back to the local coordinates : +C ============================================================================ + CALL rotdens_mat(densmat,orb,norb) +C +C +C ================================================================= +C Printing the density matrices and the charge in the output file : +C ================================================================= + IF(ifprnt) THEN + CALL printout(0) + WRITE(buf,'(a)') '-------------------------------------' + CALL printout(0) + WRITE(buf,'(a)') + & 'Density Matrices for all the States of the System : ' + CALL printout(0) +C The density matrices and charge are printed for all the included orbitals + DO iorb=1,norb + CALL printout(0) + isrt=orb(iorb)%sort + l= orb(iorb)%l +C Description of the correlated orbital + WRITE(buf,'(3(a,i3))') + & ' Sort = ',isrt,' Atom = ',orb(iorb)%atom, + & ' and Orbital l = ',l + CALL printout(0) + q=0d0 +C +C The case l=0 is a particular case of "non-mixing" basis. +C -------------------------------------------------------- + IF (l==0) THEN +C For a calculation spin-polarized with SO : + IF (nsp==4) THEN + WRITE(buf,'(2(2F12.6,2x))') + & densmat(1,iorb)%mat(1,1), + & densmat(3,iorb)%mat(1,1) + CALL printout(0) + WRITE(buf,'(2(2F12.6,2x))') + & densmat(4,iorb)%mat(1,1), + & densmat(2,iorb)%mat(1,1) + CALL printout(0) + q=q+densmat(1,iorb)%mat(1,1)+ + + densmat(2,iorb)%mat(1,1) +C For a calculation spin-polarized without SO : + ELSE IF (nsp==2) THEN + WRITE(buf,'(2(2F12.6,2x))') + & densmat(1,iorb)%mat(1,1),DCMPLX(0.D0,0.D0) + CALL printout(0) + WRITE(buf,'(2(2F12.6,2x))') + & DCMPLX(0.D0,0.D0),densmat(2,iorb)%mat(1,1) + CALL printout(0) + q=q+densmat(1,iorb)%mat(1,1)+ + + densmat(2,iorb)%mat(1,1) +C For a paramagnetic calculation without SO : + ELSE + WRITE(buf,'(2F12.6,2x)') densmat(1,iorb)%mat(1,1) + q=q+densmat(1,iorb)%mat(1,1) + CALL printout(0) + ENDIF +C +C If the basis representation needs a complete spinor rotation approach (basis with "mixing" ). +C --------------------------------------------------------------------------------------------- + ELSEIF (reptrans(l,isrt)%ifmixing) THEN +C In this case, the calculation is necessary spin-polarized with SO : + WRITE(buf,'(a,a)') 'Writing the matrix as : ', + & '[ block 1 | block 2 ] with' + CALL printout(0) + WRITE(buf,'(a,a)') ' ', + & '[ block 3 | block 4 ]' + CALL printout(0) +C Printing the different blocks + ALLOCATE(D(1,1:2*l+1)) + WRITE(buf,'(a,i2,a)') ' # For the block 1 :' + CALL printout(0) + DO m=1,2*l+1 + D(1,1:2*l+1)=densmat(1,iorb)%mat(m,1:(2*l+1)) + WRITE(buf,'(7(2F12.6),x)') D(:,:) + CALL printout(0) + ENDDO + WRITE(buf,'(a,i2,a)') ' # For the block 2 :' + CALL printout(0) + DO m=1,2*l+1 + D(1,1:2*l+1)= + & densmat(1,iorb)%mat(m,2*l+2:2*(2*l+1)) + WRITE(buf,'(7(2F12.6),x)') D(:,:) + CALL printout(0) + ENDDO + WRITE(buf,'(a,i2,a)') ' # For the block 3 :' + CALL printout(0) + DO m=2*l+2,2*(2*l+1) + D(1,1:2*l+1)= + & densmat(1,iorb)%mat(m,1:(2*l+1)) + WRITE(buf,'(7(2F12.6),x)') D(:,:) + CALL printout(0) + ENDDO + WRITE(buf,'(a,i2,a)') ' # For the block 4 :' + CALL printout(0) + DO m=2*l+2,2*(2*l+1) + D(1,1:2*l+1)= + & densmat(1,iorb)%mat(m,2*l+2:2*(2*l+1)) + WRITE(buf,'(7(2F12.6),x)') D(:,:) + CALL printout(0) + ENDDO + DEALLOCATE(D) + DO m1=1,2*(2*l+1) + q=q+densmat(1,iorb)%mat(m1,m1) + ENDDO +C +C If the basis representation can be reduce to the up/up block (basis without "mixing"). +C -------------------------------------------------------------------------------------- + ELSE + IF(nsp==4) THEN + WRITE(buf,'(a,a)') 'Writing the matrix as : ', + & '[ block up/up | block up/dn ] with' + CALL printout(0) + WRITE(buf,'(a,a)') ' ', + & '[ block dn/up | block dn/dn ]' + CALL printout(0) + ELSEIF(nsp==2) THEN + WRITE(buf,'(a,a)') 'Writing the matrix as : ', + & '[ block up/up | 0 ] with' + CALL printout(0) + WRITE(buf,'(a,a)') ' ', + & '[ 0 | block dn/dn ]' + CALL printout(0) + ENDIF + DO iss=1,nsp + IF(iss.LE.2) THEN + is=iss + is1=iss +C If iss=1 (up), is=1 and is1=1 -> Description of the up/up block +C If iss=2 (down), is=2 and is1=2 -> Description of the down/down block + IF (is==1) THEN + IF ( ifSP.or.ifSO ) THEN + WRITE(buf,'(a)') ' # For the Up/Up block :' + ENDIF + CALL printout(0) + ELSE + WRITE(buf,'(a)') ' # For the Down/Down block :' + CALL printout(0) + ENDIF + ELSE + is=iss-2 + is1=3-is +C If iss=3, is=1 (up) and is1=2 (down) -> Description of the up/down block +C If iss=4, is=2 (down) and is1=1 (up) -> Description of the down/up block + IF (is==1) THEN + WRITE(buf,'(a)') ' # For the Up/Down block :' + CALL printout(0) + ELSE + WRITE(buf,'(a)') ' # For the Down/Up block :' + CALL printout(0) + ENDIF + ENDIF + ALLOCATE(D(1,-l:l)) + DO m=-l,l + D(1,-l:l)=densmat(iss,iorb)%mat(m,-l:l) + WRITE(buf,'(7(2F12.6),x)') D(:,:) + CALL printout(0) + IF(is==is1) q=q+densmat(iss,iorb)%mat(m,m) + ENDDO + DEALLOCATE(D) + ENDDO + ENDIF +C Displaying the charge q of the orbital + CALL printout(0) + WRITE(buf,'(a,f10.5)')'The charge of the orbital is : ',q + CALL printout(0) + ENDDO + ENDIF +C +C ========================================================================== +C Printing the total charge in the output file (only if only_corr =.FALSE.): +C ========================================================================== + WRITE(buf,'(a,f11.5)')'TOTAL CHARGE = ',qtot + CALL printout(1) +C + ENDIF ! End of the .not.only_corr if-then-else + RETURN + END + + + + + + diff --git a/fortran/dmftproj/dmftproj.f b/fortran/dmftproj/dmftproj.f new file mode 100644 index 00000000..a9488709 --- /dev/null +++ b/fortran/dmftproj/dmftproj.f @@ -0,0 +1,764 @@ + +c ****************************************************************************** +c +c TRIQS: a Toolbox for Research in Interacting Quantum Systems +c +c Copyright (C) 2011 by L. Pourovskii, V. Vildosola, C. Martins, M. Aichhorn +c +c TRIQS is free software: you can redistribute it and/or modify it under the +c terms of the GNU General Public License as published by the Free Software +c Foundation, either version 3 of the License, or (at your option) any later +c version. +c +c TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +c WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +c FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +c details. +c +c You should have received a copy of the GNU General Public License along with +c TRIQS. If not, see . +c +c *****************************************************************************/ + + PROGRAM dmftproj +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This prgm computes projections to a local (correlated) set of %% +C %% orbitals from the set of eigenfunctions obtained with Wien2k. %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C ---------------------------- + USE almblm_data + USE common_data + USE file_names + USE prnt + USE symm + USE reps + IMPLICIT NONE +C + REAL(KIND=8) :: e_win, e_sum, elecn, qtot, qdum + REAL(KIND=8), DIMENSION(:,:), ALLOCATABLE :: Alm_sum, Qlm_sum + COMPLEX(KIND=8), DIMENSION(:,:,:,:), ALLOCATABLE :: occ_mat + COMPLEX(KIND=8), DIMENSION(:,:,:,:), ALLOCATABLE :: occ_mat_sym +C + COMPLEX(KIND=8) :: coff + COMPLEX(KIND=8),DIMENSION(-3:3,-3:3) :: tmpmat + INTEGER, DIMENSION(:,:), ALLOCATABLE :: lnreps + INTEGER, DIMENSION(:,:,:), ALLOCATABLE :: correps + INTEGER :: isrt, ie, l, m, isym, jatom + INTEGER :: lm, ik, ilo, ib, iatom, imu + INTEGER :: idum, i1, i2 + INTEGER :: m1, m2, lm1, lm2 + INTEGER :: is, irep, nbrep + INTEGER :: iorb, icrorb, nmaxrep + INTEGER :: paramflag, lcorr + LOGICAL :: ifcorr + REAL(KIND=8) :: fdum, rtetr + REAL(KIND=8),PARAMETER :: Elarge=1d6 +C ================================ +C Processing of the command line : +C ================================ + CALL readcomline +C ==================================================== +C Initialization of the variable ns (number of spin) : +C ==================================================== +C If the computation uses spin-polarized input files, ns=2 + ns=1 + IF(ifSP) ns=2 +C =================================== +C Opening of the input/output files : +C =================================== + CALL openfiles +C ========================================= +C Reading of the input file case.indmftpr : +C ========================================= + READ(iuinp,*)nsort +C nsort = number of sorts of atom + ALLOCATE(nmult(0:nsort)) + nmult(0)=0 + READ(iuinp,*)nmult(1:nsort) +C nmult = multiplicity for each sort of atom, table from 1 to nsort + natom=SUM(nmult(1:nsort)) +C natom = total number of atoms in the unit cell + ALLOCATE(isort(natom)) + iatom=0 + DO isrt=1,nsort + DO imu=1,nmult(isrt) + iatom=iatom+1 + isort(iatom)=isrt + ENDDO + ENDDO +C isort = table of correspondance iatom -> isort (from 1 to natom) + READ(iuinp,*)lmax +C lmax = maximal orbital number l for all the atoms + IF(ifSO) THEN + nlm=(lmax+1)*(lmax+1)*2 + ELSE + nlm=(lmax+1)*(lmax+1) + ENDIF +C nlm = maximal number of matrix elements for an l-orbital +C only doubled when SO because of the up and down independent parts... + ALLOCATE(lsort(0:lmax,nsort)) + ALLOCATE(defbasis(nsort)) + ALLOCATE(lnreps(0:lmax,nsort)) + IF(.not.ifSO) THEN +C Spin is a good quantum number and ireps are considered in orbital space only. + ALLOCATE(correps(2*lmax+1,0:lmax,nsort)) + ELSE +C Spin is not a good quantum number anymore (possibility of basis which mixes up and dn states) +C the ireps are considered in spin+orbital space. + ALLOCATE(correps(2*(2*lmax+1),0:lmax,nsort)) + ENDIF + ALLOCATE(ifSOflag(nsort)) + DO isrt=1,nsort + READ(iuinp,*) defbasis(isrt)%typebasis + IF (defbasis(isrt)%typebasis(1:8)=='fromfile') THEN + READ(iuinp,*) defbasis(isrt)%sourcefile + ELSE + defbasis(isrt)%sourcefile = 'null' + ENDIF +C defbasis = table of correspondance isort -> "basistrans" element, table from 1 to nsort +C defbasis(isrt)%typebasis = "cubic", "complex" or "fromfile" +C defbasis(isrt)%sourcefile = the name of the file to read if typebasis="fromfile" + READ(iuinp,*)lsort(0:lmax,isrt) + READ(iuinp,*)lnreps(0:lmax,isrt) +C ifcorr is a flag who states if the atomic sort isrt has correlated orbitals. + ifcorr=.FALSE. + DO l=0,lmax + IF (lsort(l,isrt)==2) THEN + ifcorr=.TRUE. +C If lnreps(l,isrt)=1, the treatment is the same as a 0 value. +C because if the number of irep is 1, this irep will be the correlated one. +C +C --------------------------------------------------------------------------------------- +C Interruption of the prgm if the number of irep is not correct. +C ------------------------- +C + IF (ifSO) THEN +C With SO, the number of ireps must not exceed 2*(2*l+1). + IF(lnreps(l,isrt).gt.(2*(2*l+1))) THEN + WRITE(buf,'(a,a,i2,a,i2,a)')' The number of ireps ', + & 'considered for l=',l,' and isrt=',isrt, + & ' is not possible.' + CALL printout(0) + WRITE(buf,'(a)')'END OF THE PRGM' + CALL printout(0) + STOP + END IF + ELSE +C Without SO, the number of ireps must not exceed (2*l+1). + IF(lnreps(l,isrt).gt.(2*l+1)) THEN + WRITE(buf,'(a,a,i2,a,i2,a)')' The number of ireps ', + & 'considered for l=',l,' and isrt=',isrt, + & ' is not possible.' + CALL printout(0) + WRITE(buf,'(a)')'END OF THE PRGM' + CALL printout(0) + STOP + END IF + ENDIF +C --------------------------------------------------------------------------------------- +C +C The description of the different ireps is considered only if there are more than 1 irep. +C that is to say if lnreps(l,isrt)=2, 3,... + IF(lnreps(l,isrt)>0) THEN + READ(iuinp,'(14i1)') correps(1:lnreps(l,isrt),l,isrt) + ENDIF + ENDIF + ENDDO +C The ifSO_flag is read only if there is a correlated orbital for the sort isrt. + IF (ifcorr) THEN + READ(iuinp,'(i1)') ifSOflag(isrt) + ENDIF + ENDDO +C lsort = index for each orbital (0 : not include / 1 : include / 2 : correlated), table from 0 to lmax, from 1 to nsort +C lnreps = number of irreducible representations for each orbital, table from 0 to lmax, from 1 to nsort (temporary variables) +C correps = index for each irreducible representations of the correlated orbital, table from 1 to lnreps(l,isrt), from 0 to lmax, from 1 to nsort (temporary variable) +C ifSOflag = table of correspondance isort -> optionSO (1 or 0). Only used for isort with correlated orbitals + READ(iuinp,*) e_bot,e_top +C e_bot, e_top : lower and upper limits of the energy window +C +C --------------------------------------------------------------------------------------- +C Interruption of the prgm if the energy window is not well-defined. +C ------------------------- +C + IF(e_bot.gt.e_top) THEN + WRITE(buf,'(a,a)')' The energy window ', + & ' is ill-defined.' + CALL printout(0) + WRITE(buf,'(a)')'END OF THE PRGM' + CALL printout(0) + STOP + END IF +C --------------------------------------------------------------------------------------- +C +C ===================================================================== +C Writing in the output file case.outdmftpr the previous informations : +C ===================================================================== + WRITE(buf,'(a,a)')'Welcome in DMFTPROJ: ', + & 'PROJECTION TO LOCALIZED BASIS' + CALL printout(1) + WRITE(buf,'(a,a)')'This prgm will build', + & ' the Wannier projectors to the' + CALL printout(0) + WRITE(buf,'(a,a)')'localized orbitals of an atom', + & ' onto which DMFT will be applied.' + CALL printout(1) + WRITE(buf,'(a)')'You are performing a computation' + CALL printout(0) +C Spin orbit option + IF(ifSO) THEN + WRITE(buf,'(a)')'in which Spin-Orbit is included.' + ELSE + WRITE(buf,'(a)')'without Spin-Orbit.' + ENDIF + CALL printout(0) +C Spin polarized option + IF(ifSP) THEN + WRITE(buf,'(a)')'using Spin-Polarized Wien2k input files.' + ELSE + WRITE(buf,'(a)')'using Paramagnetic Wien2k input files.' + ENDIF + CALL printout(0) + IF (ifSO.AND.(.not.ifSP)) THEN + WRITE(buf,'(a,a)')'You must use Spin-Polarized input files', + & ' to perform Spin-Orbit computation, with this version.' + CALL printout(0) + WRITE(buf,'(a)')'END OF THE PRGM' + CALL printout(0) + STOP + ENDIF +C Printing nsort, nmult + WRITE(buf,'(a)')'=======================================' + CALL printout(0) + WRITE(buf,'(a,i3)')'Sorts of atoms = ',nsort + CALL printout(0) + WRITE(buf,'(a,50i2)')'Equivalent sites per each sort:', + & nmult(1:nsort) + CALL printout(1) +C + norb=0 + ncrorb=0 + ALLOCATE(notinclude(1:nsort)) + DO isrt=1,nsort + WRITE(buf,'(a)')'-------------------------------------' + CALL printout(0) + WRITE(buf,'(a,i2,a)')'For the sort ',isrt,' :' + CALL printout(0) + notinclude(isrt)=.TRUE. +C Printing the name of the included orbitals for each sort + DO l=0,lmax + IF(lsort(l,isrt).NE.0) THEN + WRITE(buf,'(a,i2,a)')'The orbital l=',l,' is included.' + CALL printout(0) + norb=norb+nmult(isrt) + notinclude(isrt)=.FALSE. + ENDIF + ENDDO +C The variable notinclude(isrt) is a boolean which precises whether the sort isrt +C is considered in the pbm. (whether there is at least one lsort(l,isrt) not 0.) + IF (notinclude(isrt)) THEN + WRITE(buf,'(a)')'No orbital is included.' + CALL printout(0) + CALL printout(0) + cycle +C If no orbital of isrt is included, they can't be correlated orbitals. + END IF + CALL printout(0) +C Determination of the total number of correlated orbitals for each sort + DO l=0,lmax + IF(lsort(l,isrt)==2) THEN + ncrorb=ncrorb+nmult(isrt) + ENDIF ! End of the lsort=2 if-then-else + ENDDO ! End of the l loop + ENDDO ! End of the isrt loop +C norb = total number of included orbitals in the system +C ncrorb = total number of correlated orbitals in the system +C +C --------------------------------------------------------------------------------------- +C Interruption of the prgm if no orbital is included. +C ------------------------- +C + IF (norb==0) THEN + WRITE(buf,'(a,a)')'You must include at least one orbital.' + CALL printout(0) + WRITE(buf,'(a)')'END OF THE PRGM' + CALL printout(0) + STOP + ENDIF +C --------------------------------------------------------------------------------------- +C +C =========================================================================================== +C Initialization of the "orbital-type" tables orb and crorb, tables of size norb and ncrorb : +C =========================================================================================== + ALLOCATE(orb(norb),crorb(ncrorb)) + iorb=0 + icrorb=0 + DO isrt=1,nsort + IF (notinclude(isrt)) cycle + DO l=0,lmax + IF(lsort(l,isrt).NE.0) THEN +C ------------------------------- +C For all the included orbitals : +C ------------------------------- + DO imu=1,nmult(isrt) + iatom=SUM(nmult(0:isrt-1))+imu + iorb=iorb+1 + orb(iorb)%atom=iatom +C the field orb%atom = number of the atom when classified in the order (isort,imult) + orb(iorb)%sort=isrt +C the field orb%sort = sort of the associated atom + orb(iorb)%l=l +C the field orb%l = the orbital number l + IF(imu==1) THEN + orb(iorb)%first=.TRUE. + ELSE + orb(iorb)%first=.FALSE. + ENDIF +C the field orb%first = boolean (if first_atom of the sort isort or not) + IF(lnreps(l,isrt).NE.0) THEN + orb(iorb)%ifsplit=.TRUE. + ELSE + orb(iorb)%ifsplit=.FALSE. + ENDIF +C the field orb%ifsplit = boolean (if ireps are used or not) + ENDDO +C + IF(lsort(l,isrt)==2) THEN +C --------------------------------- +C For all the correlated orbitals : +C --------------------------------- + DO imu=1,nmult(isrt) + iatom=SUM(nmult(0:isrt-1))+imu + icrorb=icrorb+1 + crorb(icrorb)%atom=iatom +C the field crorb%atom = number of the atom when classified in the order (isort,imult) + crorb(icrorb)%sort=isrt +C the field crorb%sort = sort of the associated atom + crorb(icrorb)%l=l +C the field crorb%l = the orbital number l + IF(imu==1) THEN + crorb(icrorb)%first=.TRUE. + ELSE + crorb(icrorb)%first=.FALSE. + ENDIF +C the field orb%first = boolean (if first_atom of the sort isort or not) + IF(lnreps(l,isrt).NE.0) THEN + crorb(icrorb)%ifsplit=.TRUE. + ALLOCATE(crorb(icrorb)%correp(lnreps(l,isrt))) + crorb(icrorb)%correp=.FALSE. + DO irep=1,lnreps(l,isrt) + IF(correps(irep,l,isrt)==1) + & crorb(icrorb)%correp(irep)=.TRUE. + ENDDO +C the field crorb%correp is defined only when crorb%ifsplit= true +C the field orb%correp = boolean table of size lnreps(l,isrt) : True if the ireps is correlated, False otherwise + ELSE + crorb(icrorb)%ifsplit=.FALSE. + ENDIF +C the field orb%ifsplit = boolean (if ireps are used or not) + IF (ifSOflag(isrt)==1) THEN + crorb(icrorb)%ifSOat=1 + ELSE + crorb(icrorb)%ifSOat=0 + ENDIF +C the field crorb%ifSOflag = boolean (if SO are used or not) + ENDDO + ENDIF ! End of the lsort=2 if-then-else + ENDIF ! End of the lsort>0 if-then-else + ENDDO ! End of the l loop + ENDDO ! End of the isrt loop +C +C Printing the size of the Energy window + CALL printout(0) + WRITE(buf,'(2(a,f10.5),a)') + & 'The Eigenstates are projected in an energy window from ', + & e_bot,' Ry to ',e_top,' Ry around the Fermi level.' + CALL printout(1) +C +C ======================================================================================= +C Reading of the transformation matrices from the complex to the required angular basis : +C ======================================================================================= + CALL set_ang_trans +C +C ====================================================================================== +C Comparing data about correlated ireps and the description of transformation matrices : +C ====================================================================================== +C + CALL printout(0) + CALL printout(0) + WRITE(buf,'(a)')'=======================================' + CALL printout(0) + WRITE(buf,'(a)')'Precisions about correlated orbitals.' + CALL printout(0) + CALL printout(0) + DO isrt=1,nsort + IF (notinclude(isrt)) cycle + WRITE(buf,'(a)')'-------------------------------------' + CALL printout(0) + WRITE(buf,'(a,i2,a)')'For the sort ',isrt,' :' + CALL printout(0) + lcorr=0 + DO l=0,lmax +C Only correlated orbital l of isrt are considered here. + IF (lsort(l,isrt)==2) THEN + lcorr=lcorr+1 +C If the whole orbital is correlated (lnreps=0 in this case) + IF (lnreps(l,isrt)==0) THEN + WRITE(buf,'(a,i2,a)')'The whole orbital l=',l, + & ' is included as correlated.' + CALL printout(0) +C If only one particular irep of the orbital is correlated + ELSE +C +C For a computation without spin-orbit or a computation with SO and with a basis which mixes up and dn states. +C ------------------------------------------------------------------------------------------------------------ + IF ((.not.ifSO).OR. + & (ifSO.AND.(l.NE.0).AND.reptrans(l,isrt)%ifmixing)) + & THEN +C without SO, the case l=0 can not occur since lnreps(0,isrt)=0. +C +C --------------------------------------------------------------------------------------- +C Interruption of the prgm if the data about ireps are conflicting. +C ------------------------- +C + IF (lnreps(l,isrt).NE.reptrans(l,isrt)%nreps) THEN + WRITE(buf,'(a,a,i2,a)') + & 'The number of ireps considered ', + & 'for the orbital l= ', l ,' is wrong.' + CALL printout(0) + WRITE(buf,'(a)')'END OF THE PRGM' + CALL printout(0) + STOP +C --------------------------------------------------------------------------------------- +C +C Writing in the output file case.outdmftpr the irep considered as correlated. + ELSE + nbrep=0 + DO irep=1,lnreps(l,isrt) + IF (correps(irep,l,isrt)==1) THEN + WRITE(buf,'(a,i2,a,i2,a)') + & 'The irep ',irep,' of orbital l= ', l, + & ' is considered as correlated.' + CALL printout(0) + nbrep=nbrep+1 + ENDIF + ENDDO +C --------------------------------------------------------------------------------------- +C Printing a Warning if more than one irep for one value of l is considered. +C ------------------- +C + IF (nbrep.gt.1) THEN + CALL printout(0) + WRITE(buf,'(a,a)') 'WARNING : ', + & 'more than 1 irep is included as correlated.' + CALL printout(0) + WRITE(buf,'(a,a,a)') ' ', + & 'The calculation may not be correct ', + & 'in this case.' + CALL printout(1) + ENDIF + ENDIF ! End of the data-conflict if-then-else +C +C For a computation with spin-orbit with basis which doesn't mix up and dn states. +C -------------------------------------------------------------------------------- + ELSE + WRITE(buf,'(a,i2,a)')'The whole orbital l=',l, + & ' is included as correlated.' + CALL printout(0) + WRITE(buf,'(a,a)')'because this computation ', + & 'includes Spin-Orbit coupling.' + CALL printout(0) + ENDIF ! End of the ifSo if-then-else + ENDIF ! End of the lnreps=0 if-then-else + ENDIF ! End of the lsort=2 if-then-else +C In the case of no correlated orbitals are considered for the atomic sort isrt : + ENDDO ! End of the l loop + IF (lcorr==0) THEN + WRITE(buf,'(a,a)')'No orbital is included as correlated.' + CALL printout(0) + ENDIF ! End of the lcorr=0 if-then-else + ENDDO ! End of the isrt loop + CALL printout(0) + DEALLOCATE(lnreps,correps) +C lnreps and correps can not be used anymore... +C +C ================================== +C Setting of the symmetry matrices : +C ================================== + CALL setsym +C +C ========================================================================================= +C Reading of the Wien2k informations in the case.almblm file (generated by x lapw2 -almd) : +C ========================================================================================= +C + CALL printout(0) + CALL printout(0) + WRITE(buf,'(a)')'=======================================' + CALL printout(0) + CALL printout(0) + WRITE(buf,'(a,a)')'Reading of the file ',almblm_file + CALL printout(0) +C Reading of the klist_band file if the computation if band oriented (option -band) + IF(ifBAND) CALL read_k_list + DO is=1,ns +C If the computation is spin-polarized, there are two differents file (up and down) + IF(is==2) THEN + CLOSE(iualmblm) + OPEN(iualmblm,file=almblm_file_sp2,status='old') + WRITE(buf,'(a,a)')'Reading of the file ',almblm_file_sp2 + CALL printout(0) + ENDIF +C ------------------------------------------------------------- +C Reading of the general informations in the case.almblm file : +C ------------------------------------------------------------- + READ(iualmblm,*)elecn + READ(iualmblm,*)nk + READ(iualmblm,*)nloat +C elecn = total number of semicore+valence electrons in the system +C nk = total number of k_points +C nloat = maximal number of LO (local orbitals in LAPW expansion) + IF(ifBAND) THEN + IF (is==1) READ(iuinp,*)eferm + READ(iualmblm,*) + ELSE + READ(iualmblm,*)eferm + ENDIF +C eferm = fermi level (if the computation is band-oriented, it is read in case.indmftpr) + IF(is==1) THEN + ALLOCATE(kp(nk,ns),u_dot_norm(0:lmax,nsort,ns)) + ALLOCATE(ovl_LO_u(nloat,0:lmax,nsort,ns)) + ALLOCATE(ovl_LO_udot(nloat,0:lmax,nsort,ns)) + ALLOCATE(nLO(0:lmax,nsort)) + ENDIF + nLO=0 + DO isrt=1,nsort +C Beginning of the loop on the sort of atoms (isort) + + DO l=0,lmax + READ(iualmblm,*)u_dot_norm(l,isrt,is) + READ(iualmblm,*)nLO(l,isrt) +C +C --------------------------------------------------------------------------------------- +C Interruption of the prgm if nLO is more than 1. +C ------------------------- +C + IF (nLO(l,isrt) > 1) THEN + WRITE(buf,'(a,a)')'The current version of DMFTproj ', + & ' cannot be used with more than 1 LO orbital by atom. ' + CALL printout(0) + WRITE(buf,'(a,i2,a,i2)') + & ' This is not the case for the orbital l= ',l, + & ' of the atomic sort ',isrt + CALL printout(0) + WRITE(buf,'(a)')'END OF THE PRGM' + CALL printout(0) + STOP + END IF +C --------------------------------------------------------------------------------------- +C +C It is assumed in the following that nLO is 0 or 1. + DO ilo=1,nLO(l,isrt) + READ(iualmblm,*)ovl_LO_u(ilo,l,isrt,is), + & ovl_LO_udot(ilo,l,isrt,is) + ENDDO + ENDDO +C kp = table of "kp_data" elements. It ranges from 1 to nk and from 1 to ns. +C u_dot_norm(isort,l) = norm for the orbital +C nLO(isort,l) = number of LO (local orbitals) for each orbital of each sort (its value is assumed to be 0 or 1) +C ovl_LO_u(isort, l) = overlap element for the LO orbitals +C ovl_LO_udot(isort, l) = overlap element for the LO orbitals +C These informations are relative to the basis set for the atomic eigenstates (LAPW-APW expansion) +C +C -------------------------------------------------------------- +C For each kpoints and isrt, the "kp_data" elements are filled : +C -------------------------------------------------------------- + DO ik=1,nk + READ(iualmblm,'()') + READ(iualmblm,'()') + READ(iualmblm,*)idum,kp(ik,is)%nbmin,kp(ik,is)%nbmax +C idum = useless variable in case.almblm +C kp(ik,is)%nbmin = index of the lowest band +C kp(ik,is)%nbmzx = index of the uppest band + IF(.NOT.ALLOCATED(kp(ik,is)%Alm)) THEN + ALLOCATE(kp(ik,is)%eband(kp(ik,is) + & %nbmin:kp(ik,is)%nbmax)) + ALLOCATE(kp(ik,is)%Alm(nlm,natom, + & kp(ik,is)%nbmin:kp(ik,is)%nbmax)) + ALLOCATE(kp(ik,is)%Blm(nlm,natom, + & kp(ik,is)%nbmin:kp(ik,is)%nbmax)) + ALLOCATE(kp(ik,is)%Clm(nloat,nlm,natom, + & kp(ik,is)%nbmin:kp(ik,is)%nbmax)) + ALLOCATE(kp(ik,is)%tetrweight(kp(ik,is)%nbmin: + & kp(ik,is)%nbmax)) + ENDIF + DO ib=kp(ik,is)%nbmin,kp(ik,is)%nbmax + READ(iualmblm,*)rtetr,kp(ik,is)%eband(ib) + kp(ik,is)%tetrweight(ib)=CMPLX(rtetr,0d0) + ENDDO +C rtetr = tetrahedron weights of the band ib at this kpoint +C the field kp(ik,is)%eband(ib) = eigenvalues of the ib band at this kpoint +C the field kp(ik,is)%tetrweight(ib) = the tetrahedron weights are set as complex number to avoid problems with SQRT(tetrweight) + kp(ik,is)%weight=REAL(kp(ik,is)%tetrweight + & (kp(ik,is)%nbmin)) +C the field kp(ik,is)%weight = value of the tetrahedron weight of the lowest band (fully occupied) at this kpoint -> "a geometric factor" + kp(ik,is)%eband=kp(ik,is)%eband-eferm +C the eigenvalues kp(ik,is)%eband are shifted with respect to the fermi level. +C +C Reading of the Alm, Blm and Clm coefficient + DO imu=1,nmult(isrt) + iatom=SUM(nmult(0:isrt-1))+imu + READ(iualmblm,'()') + READ(iualmblm,*)idum + DO ib=kp(ik,is)%nbmin,kp(ik,is)%nbmax + lm=0 + DO l=0,lmax + DO m=-l,l + lm=lm+1 + READ(iualmblm,*)kp(ik,is)%Alm(lm,iatom,ib), + & kp(ik,is)%Blm(lm,iatom,ib) + DO ilo=1,nLO(l,isrt) + READ(iualmblm,*)kp(ik,is)%Clm(ilo,lm,iatom,ib) + ENDDO + ENDDO ! End of the m loop + ENDDO ! End of the l loop + ENDDO ! End of the ib loop + ENDDO ! End of the imu loop +C the field kp(ik,is)%Alm = coefficient A_(lm,ib,iatom)(ik,is) as defined in equation (2.34) of my thesis (equation (??) of the tutorial) +C the field kp(ik,is)%Blm = coefficient B_(lm,ib,iatom)(ik,is) as defined in equation (2.34) of my thesis (equation (??) of the tutorial) +C the field kp(ik,is)%Clm = coefficient C_(ilo,lm,ib,iatom)(ik,is) as defined in equation (2.34) of my thesis (equation (??) of the tutorial) +C Their explicit expression depends of the representation (LAPW or APW). They enable to compute the projectors. +C These values are given for all the orbitals (even those which are not included in the study) + ENDDO ! End of the loop on kp + ENDDO ! End of the loop on isort + ENDDO ! End of the loop on ns (spin) +C End of reading the case.almblm.file +C Printing in the file case.outdmftpr the fermi level (in Rydberg) + CALL printout(0) + WRITE(buf,'(a,f10.5,a)')'The value of the Fermi Energy is ', + & eferm,' Ry.' + CALL printout(0) + WRITE(buf,'(a,a)')'All the considered energies are now given ', + & 'with respect to this value. (E_Fermi is now 0 Ry)' + CALL printout(1) +C +C +C ============================================================== +C Computation of the density matrices up to the Fermi level Ef : +C ============================================================== +C + WRITE(buf,'(a)')'=======================================' + CALL printout(0) + WRITE(buf,'(a,a)')'Computation of the Occupancies ', + & 'and Density Matrices up to E_Fermi' + CALL printout(1) +C ---------------------------------------- +C Setting up the projections for all bands +C ---------------------------------------- + CALL set_projections(-Elarge,Elarge) + + +C Elarge is an energy variable equal to 1.d6 Rydberg (very large !!!) +C +C --------------------------------------------------------- +C Computation of the density matrices and the total charges +C --------------------------------------------------------- +C + IF(.NOT.ifBAND) CALL density(.TRUE.,.FALSE.,qdum,.TRUE.) +C For the integration, tetrahedron weights are used. +C The computation is performed for all the included orbitals +C and the density matrices are printed in the file case.outdmftpr +C qdum is the total charge density. (unused variable) +C +C The calculation of Wannier projectors is performed only if correlated orbitals are included. + IF(ncrorb.NE.0) THEN +C +C ===================================================================== +C Computation of the charge below the lower limit e_bot of the window : +C ===================================================================== +C + WRITE(buf,'(a)')'=======================================' + CALL printout(0) + WRITE(buf,'(a,a,f10.5,a)')'Computation of the total ', + & 'Charge below the lower limit of the energy window :', + & e_bot,' Ry' + CALL printout(1) +C +C ---------------------------------------- +C Setting up the projections for all bands +C ---------------------------------------- + CALL set_projections(-Elarge,e_bot) +C +C --------------------------------------------------------- +C Computation of the density matrices and the total charges +C --------------------------------------------------------- +C + IF(.NOT.ifBAND) CALL density(.FAlSE.,.FALSE.,qtot,.FALSE.) +C A simple point integration is used. +C The computation is performed for all the included orbitals. +C qtot is the total charge density below e_bot. +C Nothing will be printed in the file case.outdmftpr apart from the total charge qtot. +C +C +C ============================================================ +C Computation of the Wannier projectors in the energy window : +C ============================================================ +C + WRITE(buf,'(a)')'=======================================' + CALL printout(0) + WRITE(buf,'(a,a,a,f10.5,a,f10.5,a)')'Computation of the ', + & 'Occupancies and Density Matrices in the desired ', + & 'energy window [ ',e_bot,'; ',e_top,']' + CALL printout(1) +C +C ---------------------------------------- +C Setting up the projections for all bands +C ---------------------------------------- + CALL set_projections(e_bot,e_top) +C +C ------------------------------------------------------------------------------ +C Orthonormalization of the projectors for correlated orbitals P(icrorb,ik,is) : +C ------------------------------------------------------------------------------ + IF(ifSO) THEN +C In this case, up and dn states must be orthogonalized together +C because the spin is not a good quantum number anymore. + CALL orthogonal_wannier_SO + ELSE +C In this case, up and dn states can be orthogonalized separately + CALL orthogonal_wannier + ENDIF +C +C --------------------------------------------------------- +C Computation of the density matrices and the total charges +C --------------------------------------------------------- +C Tetrahedron weights are used, the computation are done for correlated orbitals only and are printed in the outputfile. + IF(.NOT.ifBAND) CALL density(.TRUE.,.TRUE.,qdum,.TRUE.) +C For the integration, tetrahedron weights are used. +C The computation is performed for the correlated orbitals only +C and the density matrices are printed in the file case.outdmftpr +C qdum is the total charge density in the energy window. (unused variable) +C +C +C Writing the output files for DMFT computations : +C ------------------------------------------------ + IF(.NOT.ifBAND) THEN + CALL outqmc(elecn,qtot) + ELSE + CALL outband + ENDIF + CALL outbwin + ENDIF +C End of the prgm + CALL printout(0) + WRITE(buf,'(a)')'END OF THE PRGM' + CALL printout(0) +C + END + + + + + + diff --git a/fortran/dmftproj/modules.f b/fortran/dmftproj/modules.f new file mode 100644 index 00000000..544193bd --- /dev/null +++ b/fortran/dmftproj/modules.f @@ -0,0 +1,410 @@ + +c ****************************************************************************** +c +c TRIQS: a Toolbox for Research in Interacting Quantum Systems +c +c Copyright (C) 2011 by L. Pourovskii, V. Vildosola, C. Martins, M. Aichhorn +c +c TRIQS is free software: you can redistribute it and/or modify it under the +c terms of the GNU General Public License as published by the Free Software +c Foundation, either version 3 of the License, or (at your option) any later +c version. +c +c TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +c WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +c FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +c details. +c +c You should have received a copy of the GNU General Public License along with +c TRIQS. If not, see . +c +c *****************************************************************************/ + +C-------------------- +C MODULE almblm_data +C-------------------- + MODULE almblm_data + INTEGER :: nk, nloat + INTEGER, DIMENSION(:,:), ALLOCATABLE :: nLO + REAL(KIND=8), DIMENSION(:,:,:), ALLOCATABLE :: u_dot_norm + REAL(KIND=8), DIMENSION(:,:,:,:), ALLOCATABLE :: ovl_LO_u + REAL(KIND=8), DIMENSION(:,:,:,:), ALLOCATABLE :: ovl_LO_udot + TYPE kp_data + LOGICAL :: included + INTEGER :: nb_bot, nb_top + INTEGER :: nbmin,nbmax + REAL(KIND=8) :: weight + COMPLEX(KIND=8), DIMENSION(:), ALLOCATABLE :: tetrweight + REAL(KIND=8),DIMENSION(:), ALLOCATABLE :: eband + COMPLEX(KIND=8),DIMENSION(:,:,:), ALLOCATABLE :: Alm, Blm + COMPLEX(KIND=8),DIMENSION(:,:,:,:), ALLOCATABLE :: Clm + ENDTYPE + TYPE(kp_data), DIMENSION(:,:), ALLOCATABLE :: kp + ENDMODULE almblm_data +C +C-------------- +C MODULE bands +C-------------- + MODULE bands + INTEGER :: nlab, nkband + TYPE label + CHARACTER(len=20) :: kname + INTEGER :: pos + ENDTYPE + TYPE(label), DIMENSION(:), ALLOCATABLE :: labels + ENDMODULE +C +C-------------------- +C MODULE common_data +C-------------------- + MODULE common_data +C 11/03/10 : Modification of the fullpath for myDMFTproj-2 +C CHARACTER(len=*), PARAMETER :: wien_path= +C & '/workpmc/martins/DMFTprojectors/newDMFTproj' + CHARACTER(len=250) :: wien_path + INTEGER :: natom, nsort, lmax, nlm, ns, nsp + INTEGER, DIMENSION(:), ALLOCATABLE :: isort + INTEGER, DIMENSION(:), ALLOCATABLE :: nmult + INTEGER, DIMENSION(:,:), ALLOCATABLE :: lsort + INTEGER, DIMENSION(:), ALLOCATABLE :: ifSOflag + INTEGER, DIMENSION(:), ALLOCATABLE :: timeflag + LOGICAL :: ifSO, ifSP, ifBAND + LOGICAL, DIMENSION(:), ALLOCATABLE :: notinclude + REAL(KIND=8) :: eferm + REAL(KIND=8) :: e_bot, e_top + REAL(KIND=8), PARAMETER :: PI=3.1415926535898d0 +C New type structure basistrans + TYPE deftrans + CHARACTER(len=8) :: typebasis +C The size of typebasis is limited to 8 characters ! + CHARACTER(len=25) :: sourcefile +C The size of sourcefile is limited to 25 characters ! + ENDTYPE + TYPE(deftrans), DIMENSION(:), ALLOCATABLE :: defbasis +C Type structure orbital + TYPE orbital + INTEGER :: atom + INTEGER :: sort + INTEGER :: l + LOGICAL :: first + LOGICAL :: ifsplit + INTEGER :: ifSOat + LOGICAL,DIMENSION(:), ALLOCATABLE :: correp + ENDTYPE + TYPE(orbital), DIMENSION(:), ALLOCATABLE :: orb, crorb + INTEGER :: norb, ncrorb + ENDMODULE common_data +C +C------------------ +C MODULE factorial +C------------------ + MODULE factorial + REAL(KIND=8), DIMENSION(:), ALLOCATABLE :: fac + INTEGER :: nfctrl + CONTAINS + SUBROUTINE setfact(n) +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine sets the factorial array %% +C %% FAC(I+1) = I! for I=0,...,N-1 %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C ---------------------------- + IMPLICIT NONE + INTEGER :: n, i +C + nfctrl=n + ALLOCATE(fac(nfctrl)) +C I! = FAC(I+1) + fac(1)=1.0d00 + DO i=1,nfctrl-1 + fac(i+1)=i*fac(i) + ENDDO + RETURN + END SUBROUTINE setfact + END MODULE factorial +C +C------------------- +C MODULE file_names +C------------------- + MODULE file_names + INTEGER :: iudef, iuinp, iusym, iualmblm, iumatfile, iuradwf + INTEGER :: iuklist + INTEGER :: ouproj, ouprn, ouctqmc, oupartial,ousymqmc, ousympar + INTEGER :: ouband, oubwinup, oubwindn, oubwin + INTEGER :: outw2kpath + CHARACTER(len=25) :: jobname + CHARACTER(len=35) :: inp_file, sym_file, almblm_file + CHARACTER(len=35) :: almblm_file_sp2 + CHARACTER(len=35) :: radwf_file, radwf_file_sp2 + CHARACTER(len=35) :: prn_file, ctqmc_file, partial_file + CHARACTER(len=35) :: klist_file + CHARACTER(len=35) :: symqmc_file, sympar_file, outband_file + CHARACTER(len=35) :: oubwin_file, oubwinup_file, oubwindn_file + CHARACTER(len=8), PARAMETER :: inp_ext='indmftpr' + CHARACTER(len=7), PARAMETER :: sym_ext='dmftsym' + CHARACTER(len=6), PARAMETER :: almblm_ext='almblm' + CHARACTER(len=8), PARAMETER :: almblmup_ext='almblmup' + CHARACTER(len=8), PARAMETER :: almblmdn_ext='almblmdn' + CHARACTER(len=9), PARAMETER :: prn_ext='outdmftpr' + CHARACTER(len=8), PARAMETER :: ctqmc_ext='ctqmcout' + CHARACTER(len=7), PARAMETER :: partial_ext='parproj' + CHARACTER(len=6), PARAMETER :: symqmc_ext='symqmc' + CHARACTER(len=6), PARAMETER :: sympar_ext='sympar' + CHARACTER(len=7), PARAMETER :: radwfup_ext='radwfup' + CHARACTER(len=7), PARAMETER :: radwfdn_ext='radwfdn' + CHARACTER(len=10), PARAMETER :: klist_ext='klist_band' + CHARACTER(len=7), PARAMETER :: outband_ext='outband' + CHARACTER(len=6), PARAMETER :: oubwin_ext='oubwin' + CHARACTER(len=8), PARAMETER :: oubwinup_ext='oubwinup' + CHARACTER(len=8), PARAMETER :: oubwindn_ext='oubwindn' + CONTAINS + SUBROUTINE set_file_name(filename,exten) +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine sets the file name %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C ---------------------------- + IMPLICIT NONE + CHARACTER(len=*) :: filename, exten + INTEGER :: i1, i2, i + i1=LEN_TRIM(jobname) + i2=LEN(exten) + i=i1+i2+1 + IF(LEN(filename) < i) THEN + WRITE(*,'(i3,3a)') + & i,' characters required for the $case.',exten, + & ' filename, too long' + STOP + ENDIF + filename=' ' + filename(1:i)=jobname(1:i1)//'.'//exten(1:i2) + END SUBROUTINE set_file_name +C + SUBROUTINE openfiles +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine opens the input and output units for dmftproj %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C ---------------------------- + USE common_data, ONLY: ifSP, ifSO, ifBAND, wien_path + IMPLICIT NONE + CHARACTER(len=120) :: buf + INTEGER :: i1, i2 +C initialize input/output channels + CALL setchannels +C Get working directory name: + CALL system('pwd > dir_name.tmp') + OPEN(outw2kpath,file='dir_name.tmp',status='old') + READ(outw2kpath,'(a)')buf + CLOSE(outw2kpath,status='delete') + i1=INDEX(buf,'/',.TRUE.) + i2=LEN_TRIM(buf) + jobname(1:i2-i1)=buf(i1+1:i2) + jobname(i2-i1+1:)=' ' +C Construct file names + CALL set_file_name(inp_file,inp_ext) + CALL set_file_name(sym_file,sym_ext) + IF(.NOT.ifSP) THEN + CALL set_file_name(almblm_file,almblm_ext) + ELSE + CALL set_file_name(almblm_file,almblmup_ext) + CALL set_file_name(almblm_file_sp2,almblmdn_ext) + ENDIF + CALL set_file_name(prn_file,prn_ext) + CALL set_file_name(ctqmc_file,ctqmc_ext) + CALL set_file_name(partial_file,partial_ext) + CALL set_file_name(symqmc_file,symqmc_ext) + CALL set_file_name(sympar_file,sympar_ext) + IF(ifSP.AND.ifSO) THEN + CALL set_file_name(radwf_file,radwfup_ext) + CALL set_file_name(radwf_file_sp2,radwfdn_ext) + ENDIF + IF(ifBAND) THEN + CALL set_file_name(klist_file,klist_ext) + CALL set_file_name(outband_file,outband_ext) + ENDIF + IF(ifSP) THEN + CALL set_file_name(oubwinup_file,oubwinup_ext) + CALL set_file_name(oubwindn_file,oubwindn_ext) + ELSE + CALL set_file_name(oubwin_file,oubwin_ext) + ENDIF +C Open units + OPEN(iuinp,file=inp_file,status='old') + OPEN(iusym,file=sym_file,status='old') + OPEN(iualmblm,file=almblm_file,status='old') + OPEN(ouprn,file=prn_file) + OPEN(ouctqmc,file=ctqmc_file) + OPEN(oupartial,file=partial_file) + OPEN(ousymqmc,file=symqmc_file) + OPEN(ousympar,file=sympar_file) + IF(ifBAND) THEN + OPEN(iuklist,file=klist_file,status='old') + OPEN(ouband,file=outband_file) + ENDIF + IF(ifSP) THEN + OPEN(oubwinup,file=oubwinup_file) + OPEN(oubwindn,file=oubwindn_file) + ELSE + OPEN(oubwin,file=oubwin_file) + ENDIF +C +C Set path to Wien2k + CALL system('echo $WIENROOT > path_wienroot.tmp') + OPEN(outw2kpath,file='path_wienroot.tmp',status='old') + READ(outw2kpath,'(a)')wien_path + CLOSE(outw2kpath,status='delete') +C + RETURN + END SUBROUTINE +C + SUBROUTINE setchannels +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine opens the input and output channels %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C ---------------------------- + USE common_data, ONLY: ifSP + IMPLICIT NONE +C Channels +C input + iudef=5 ! def-file + iuinp=7 ! input data + iusym=8 ! symmetries + iualmblm=9 ! almblm matrices from Wien + iumatfile=15 !transformation matrices between different angular basises + iuradwf=16 !radial mesh and wave functions + iuklist=20 !bands +C output + ouprn=10 ! print-out file + ouproj=11 ! projection matrices and other data for DMFT run + ouctqmc=12 ! output for ctqmc + oupartial=13 ! output for partial charges projectors for ctqmc + ousymqmc=14 ! output for permutations and rotation matrices + ousympar=19 ! output for permutations and rotation matrices + ! for partial charges analisis + ouband=21 ! bands + IF(ifSP) THEN + oubwinup=22 ! included bands information for lapw2(up) + oubwindn=23 ! included bands information for lapw2(dn) + ELSE + oubwin=22 ! included bands information for lapw2 + ENDIF +C + RETURN + END SUBROUTINE +C +C + ENDMODULE file_names +C + MODULE prnt + CHARACTER(len=250) :: buf + CONTAINS + SUBROUTINE printout(newline) +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine prints the string in buf to the screen %% +C %% and to the output file and renitializes buf %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C ---------------------------- + USE file_names + IMPLICIT NONE + INTEGER :: newline, i + i=LEN_TRIM(buf) + WRITE(ouprn,'(a)')buf(1:i) + WRITE(*,'(a)')buf(1:i) + buf=' ' + IF(newline==1) THEN + WRITE(ouprn,'(/)') + WRITE(*,'(/)') + ENDIF + RETURN + END subroutine + ENDMODULE prnt +C +C-------------------- +C MODULE projections +C-------------------- + MODULE projections + TYPE proj_mat + COMPLEX(KIND=8), DIMENSION(:,:), ALLOCATABLE :: mat + COMPLEX(KIND=8), DIMENSION(:,:), ALLOCATABLE :: mat_rep + ENDTYPE + TYPE(proj_mat), DIMENSION(:,:,:), ALLOCATABLE :: pr_crorb +C + TYPE proj_mat_n + COMPLEX(KIND=8), DIMENSION(:,:,:), ALLOCATABLE :: matn + COMPLEX(KIND=8), DIMENSION(:,:,:), ALLOCATABLE :: matn_rep + ENDTYPE + TYPE(proj_mat_n), DIMENSION(:,:,:), ALLOCATABLE :: pr_orb +C + TYPE ortfunc + INTEGER :: n + REAL(KIND=8), DIMENSION(:,:,:), ALLOCATABLE :: s12 + ENDTYPE + TYPE(ortfunc), DIMENSION(:), ALLOCATABLE :: norm_radf + ENDMODULE projections +C +C------------- +C MODULE reps +C------------- + MODULE reps + TYPE ang_bas + INTEGER :: nreps + INTEGER, DIMENSION(:), ALLOCATABLE :: dreps + LOGICAL :: ifmixing + COMPLEX(KIND=8),DIMENSION(:,:), ALLOCATABLE :: transmat + ENDTYPE + TYPE(ang_bas), DIMENSION(:,:), ALLOCATABLE :: reptrans + ENDMODULE +C +C------------- +C MODULE symm +C------------- + MODULE symm + TYPE matrix + COMPLEX(KIND=8),DIMENSION(:,:),ALLOCATABLE :: mat + ENDTYPE + TYPE symop + LOGICAL :: timeinv + INTEGER, DIMENSION(:), ALLOCATABLE :: perm + INTEGER :: iprop + REAL(KIND=8) :: a, b, g + REAL(KIND=8) :: phase + REAL(KIND=8) :: krotm(3,3) + COMPLEX(KIND=8),DIMENSION(:,:,:),ALLOCATABLE ::rotl + TYPE(matrix),DIMENSION(:,:),ALLOCATABLE ::rotrep + ENDTYPE + TYPE symoploc + LOGICAL :: timeinv + INTEGER :: iprop + INTEGER :: srotnum + REAL(KIND=8) :: a, b, g + REAL(KIND=8) :: phase + REAL(KIND=8) :: krotm(3,3) + COMPLEX(KIND=8),DIMENSION(:,:,:),ALLOCATABLE ::rotl + TYPE(matrix),DIMENSION(:),ALLOCATABLE ::rotrep + ENDTYPE + INTEGER :: nsym + INTEGER :: lsym, nlmsym + TYPE(symop), DIMENSION(:), ALLOCATABLE :: srot + TYPE(symoploc), DIMENSION(:), ALLOCATABLE :: rotloc + TYPE(matrix), DIMENSION(:,:), ALLOCATABLE :: densmat + TYPE(matrix), DIMENSION(:,:), ALLOCATABLE :: crdensmat + END MODULE symm + diff --git a/fortran/dmftproj/orthogonal.f b/fortran/dmftproj/orthogonal.f new file mode 100644 index 00000000..7d248586 --- /dev/null +++ b/fortran/dmftproj/orthogonal.f @@ -0,0 +1,225 @@ + +c ****************************************************************************** +c +c TRIQS: a Toolbox for Research in Interacting Quantum Systems +c +c Copyright (C) 2011 by L. Pourovskii, V. Vildosola, C. Martins, M. Aichhorn +c +c TRIQS is free software: you can redistribute it and/or modify it under the +c terms of the GNU General Public License as published by the Free Software +c Foundation, either version 3 of the License, or (at your option) any later +c version. +c +c TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +c WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +c FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +c details. +c +c You should have received a copy of the GNU General Public License along with +c TRIQS. If not, see . +c +c *****************************************************************************/ + + SUBROUTINE orthogonal_h(s1,ndim,inv) +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine computes : %% +C %% - if inv = .FALSE. the square root of the Hermitian matrix s1 %% +C %% - if inv = .TRUE. the inverse of the square root of the %% +C %% Hermitian matrix s1 %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C ---------------------------- + USE prnt + IMPLICIT NONE + INTEGER :: ndim, INFO, lm, lm1 + COMPLEX(KIND=8), DIMENSION(ndim) :: WORK + COMPLEX(KIND=8), DIMENSION(ndim,ndim) :: s1 + INTEGER, DIMENSION(ndim,ndim) :: IPIV + LOGICAL :: inv +C +C Calculation of S1^(1/2) or S1^(-1/2): +C ------------------------------------- + CALL sqrtm(s1,ndim,inv) +C The resulting matrix is stored in s1. + RETURN + END + + SUBROUTINE orthogonal_r(s2,ndim,inv) +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine computes : %% +C %% - if inv = .FALSE. the square root of s1 %% +C %% - if inv = .TRUE. the inverse of the square root of s2 %% +C %% where s2 is a real symmetric matrix. %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C ---------------------------- + USE prnt + IMPLICIT NONE + INTEGER :: ndim, INFO, lm, lm1 + COMPLEX(KIND=8), DIMENSION(ndim) :: WORK + COMPLEX(KIND=8), DIMENSION(ndim,ndim) :: s1 + REAL(KIND=8), DIMENSION(ndim,ndim) :: s2 + INTEGER, DIMENSION(ndim,ndim) :: IPIV + LOGICAL :: inv +C +C Calculation of S2^(1/2) or S2^(-1/2): +C ------------------------------------- + s1=s2 + CALL sqrtm(s1,ndim,inv) + s2=REAL(s1) +C The resulting matrix is stored in s2. + RETURN + END + + + SUBROUTINE sqrtm(cmat,m,inv) +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine calculates the square root of a positively %% +C %% defined Hermitian matrix A=cmat using the decomposition %% +C %% A=Z*D*Z^H %% +C %% where D is a diagonal matrix of eigenvalues of A, %% +C %% Z is matrix of orthonormal eigenvectors of A, %% +C %% Z^H is its Hermitian conjugate. %% +C %% Then A^(1/2)=Z*D^(1/2)*Z^H. %% +C %% Correction: the matrix A is allowed to be negatively defined. %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C ---------------------------- + IMPLICIT NONE + INTEGER :: m + COMPLEX(KIND=8), DIMENSION(m,m):: cmat, D, D1 + LOGICAL :: inv +C Calculation of Z*D^(1/2): +C ------------------------- + CALL sqrt_eigenvec(cmat,D1,m,inv) + WRITE(95,*) cmat + WRITE(95,*) ' ' + WRITE(95,*) D1 + WRITE(95,*) ' ' +C Calculation of A^(1/2)=Z*D^(1/2)*Z^H: +C ------------------------------------- + D=CONJG(cmat) + call ZGEMM('N','T',m,m,m,DCMPLX(1.D0,0.D0),D1, + & m,D,m,DCMPLX(0.D0,0.D0),cmat,m) +C The resulting matrix is stored in cmat. + RETURN + END + + + SUBROUTINE sqrt_eigenvec(cmat,D1,m,inv) +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine computes : %% +C %% - if inv = .FALSE. Z*D^(1/2) %% +C %% - if inv = .TRUE. Z*D^(-1/2) %% +C %% where Z is a matrix of orthonormal eigenvectors of cmat and %% +C %% D is the diagonal matrix of cmat's eigenvalues. %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C ---------------------------- + USE prnt + IMPLICIT NONE + LOGICAL :: inv, ifwrite + INTEGER :: m, INFO, i, j + INTEGER, PARAMETER :: nwork=40 +C + COMPLEX(KIND=8), allocatable, DIMENSION(:) :: WORK + COMPLEX(KIND=8), DIMENSION(m,m) :: cmat, D1 + REAL(KIND=8), DIMENSION(m) :: W + COMPLEX(KIND=8), DIMENSION(m) :: W_comp + REAL(KIND=8), allocatable, DIMENSION(:) :: RWORK +C +C Finding the eigenvalues and the eigenvectors of cmat : +C ------------------------------------------------------ + ALLOCATE(rwork(3*m-2)) + ALLOCATE(work(2*m-1)) + CALL ZHEEV('V', 'U', m, cmat, m, W, WORK,2*m-1,RWORK,INFO) + IF (info.ne.0) THEN + WRITE(buf,'(a)') + & 'The subroutine zheev ends with info = ',info + CALL printout(0) + WRITE(buf,'(a)')'In sqrt_eigenvec, a pbm occurs in zheev.' + CALL printout(0) + WRITE(buf,'(a)')'END OF THE PRGM' + CALL printout(0) + STOP + ENDIF +C W contains the eigenvalues of cmat. + W_comp=CMPLX(W,0d0) +C +C Checking of the validity of the computation : +C --------------------------------------------- + ifwrite=.FALSE. + DO j=1,m +C The warning is written only once in the file case.outdmftpr + IF (ifwrite) EXIT +C Checking if the eigenvalues are not negative. + IF (W(j).lt.0.d0) THEN + WRITE(buf,'(a,i2,a,a)') + & 'WARNING : An eigenvalue (',j,') of the ', + & 'overlap matrix is negative.' + CALL printout(0) + WRITE(buf,'(a,a)')' The result ', + & 'of the calculation may thus be wrong.' + CALL printout(1) + ifwrite=.TRUE. + ENDIF + IF (ABS(W(j)).lt.1.d-12) THEN + WRITE(buf,'(a,i2,a,a)') + & 'WARNING : An eigenvalue (',j,') of the ', + & 'overlap matrix is almost zero.' + CALL printout(0) + WRITE(buf,'(a,a)')' The result ', + & 'of the calculation may thus be wrong.' + CALL printout(1) + ifwrite=.TRUE. + ENDIF + ENDDO +C +C Calculation of Z*D^(1/2) : +C -------------------------- +C The result is stored in D1. + IF(.NOT.inv) THEN + DO i=1,m + DO j=1,m + D1(i,j)=cmat(i,j)*SQRT(W_comp(j)) + ENDDO + ENDDO + ELSE +C Calculation of Z*D^(-1/2) : +C --------------------------- +C The result is stored in D1. + DO i=1,m + DO j=1,m + IF (ABS(W(j))==0.d0) THEN + WRITE(buf,'(a,i2,a)') + & 'An eigenvalue (',j,') of the ', + & 'overlap matrix has the value 0.' + CALL printout(0) + WRITE(buf,'(a)') + & 'The calculation can not be performed further.' + CALL printout(0) + CALL printout(0) + WRITE(buf,'(a)')'END OF THE PRGM' + CALL printout(0) + STOP + ENDIF + D1(i,j)=cmat(i,j)/SQRT(W_comp(j)) + ENDDO + ENDDO + ENDIF +C The resulting matrix is stored in D1 and cmat is now Z. + RETURN + END + diff --git a/fortran/dmftproj/orthogonal_wannier.f b/fortran/dmftproj/orthogonal_wannier.f new file mode 100644 index 00000000..171c7541 --- /dev/null +++ b/fortran/dmftproj/orthogonal_wannier.f @@ -0,0 +1,593 @@ + +c ****************************************************************************** +c +c TRIQS: a Toolbox for Research in Interacting Quantum Systems +c +c Copyright (C) 2011 by L. Pourovskii, V. Vildosola, C. Martins, M. Aichhorn +c +c TRIQS is free software: you can redistribute it and/or modify it under the +c terms of the GNU General Public License as published by the Free Software +c Foundation, either version 3 of the License, or (at your option) any later +c version. +c +c TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +c WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +c FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +c details. +c +c You should have received a copy of the GNU General Public License along with +c TRIQS. If not, see . +c +c *****************************************************************************/ + + SUBROUTINE orthogonal_wannier +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine orthonormalizes the Wannier-like functions %% +C %% obtained with the projectors P(icrorb,ik,is), in order to %% +C %% get a set of "true" Wannier orbitals. %% +C %% %% +C %% Only the correlated orbitals are treated here. %% +C %% %% +C %% THIS VERSION CAN NOT BE USED WITH SPIN-ORBIT %% +C %% (since the calculation is made independently for up/dn states) %% +C %% THIS VERSION CAN BE USED WITH SPIN-POLARIZED INPUT FILES. %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C ---------------------------- + USE almblm_data + USE common_data + USE prnt + USE projections + USE reps + IMPLICIT NONE + COMPLEX(KIND=8), DIMENSION(:,:), ALLOCATABLE :: Dmat, D_orth, D + INTEGER :: is, ik, l, nbnd, ndim, isrt, nbbot, nbtop + INTEGER :: icrorb, ind1, ind2, ib, iatom + INTEGER :: m1, m2, irep +C + WRITE(buf,'(a)')'Orthonormalization of the projectors...' + CALL printout(0) + CALL printout(0) +C + IF(ncrorb==0) RETURN +C +C ===================================== +C Creation of the overlap matrix Dmat : +C ===================================== +C +C ----------------------------------------------------------- +C Determination of the dimension ndim of the overlap matrix : +C ----------------------------------------------------------- + ndim=0 +C Loop on the correlated orbitals + DO icrorb=1,ncrorb + isrt=crorb(icrorb)%sort + l=crorb(icrorb)%l +C Since this subroutine is used only in the case without SO, +C the correlated ireps can be considered if there are any. (ifsplit=.TRUE.) + IF(crorb(icrorb)%ifsplit) THEN +C the value of l can not be 0 here, because ifsplit is necessary .FALSE. +C for s-orbital (restriction in dmftproj.f) + DO irep=1,reptrans(l,isrt)%nreps + IF(crorb(icrorb)%correp(irep)) + & ndim=ndim+reptrans(l,isrt)%dreps(irep) +C The dimension of the irep is added to ndim. + ENDDO + ELSE +C If no particular irep is considered (ifsplit=.FALSE.), +C The whole matrix of the representation is considered. + ndim=ndim+2*l+1 + ENDIF + ENDDO +C ------------------ +C Creation of Dmat : +C ------------------ + ALLOCATE(Dmat(1:ndim,1:ndim)) +C +C ===================================================================== +C Computation of the orthonormalized Wannier functions and projectors : +C ===================================================================== +C The computation is performed for each k_point and each spin-value independently +C because they are good quantum numbers. + DO ik=1,nk + DO is=1,ns +C Only the k-points with inlcuded bands are considered for the projectors. + IF(.NOT.kp(ik,is)%included) CYCLE + nbnd=kp(ik,is)%nb_top-kp(ik,is)%nb_bot+1 + nbbot=kp(ik,is)%nb_bot + nbtop=kp(ik,is)%nb_top + ALLOCATE(D(1:ndim,1:nbnd)) +C +C -------------------------------- +C Initialization of the D matrix : +C -------------------------------- +C This D matrix of size ndim*nbnd is the complete "projector matrix" +C which enables to go from the Wannier-like basis |u_orb> to the Bloch states |ik,ib>. + ind1=0 + DO icrorb=1,ncrorb + isrt=crorb(icrorb)%sort + l=crorb(icrorb)%l +C If l=0, there only possible irep is the whole matrix itself. + IF (l==0) THEN + D(ind1+1,1:nbnd)=pr_crorb(icrorb,ik,is)% + & mat_rep(1,nbbot:nbtop) + ind1=ind1+1 + ELSE +C the projectors of the correlated ireps are considered if there are any. (ifsplit=.TRUE.) + IF(crorb(icrorb)%ifsplit) THEN +C the value of l can not be 0 here, because ifsplit is necessary .FALSE. +C for s-orbital (restriction in dmftproj.f) + m1=-l-1 + DO irep=1,reptrans(l,isrt)%nreps + IF(crorb(icrorb)%correp(irep)) THEN + m2=m1+reptrans(l,isrt)%dreps(irep) + ind2=ind1+reptrans(l,isrt)%dreps(irep) +C Since there is no SO, prcrorb%matrep is of size 2*l+1, from -l to l +C (the basis which mix up/dn states are not possible here.) +C The states range from m1+1 to m2 in the irep. +C The corresponding projector is stored from the line (ind1+1) to the line ind2, in the D matrix. + D(ind1+1:ind2,1:nbnd)=pr_crorb(icrorb,ik,is)% + & mat_rep(m1+1:m2,nbbot:nbtop) + ind1=ind2 + ENDIF + m1=m1+reptrans(l,isrt)%dreps(irep) + ENDDO + ELSE +C The projectors of the whole correlated representation is considered. (ifsplit=.FALSE.) + ind2=ind1+2*l+1 +C Since there is no SO, prcrorb%matrep is of size 2*l+1, from -l to l. +C (the basis which mix up/dn states are not possible here.) +C The corresponding projection matrix is stored from the line (ind1+1) to the line ind2, in the D matrix. + D(ind1+1:ind2,1:nbnd)=pr_crorb(icrorb,ik,is)% + & mat_rep(-l:l,nbbot:nbtop) + ind1=ind2 + ENDIF ! End of the ifsplit if-then-else + ENDIF ! End of the l=0 if-then-else + ENDDO ! End of the icrorb loop +C +C ---------------------------------------- +C Computation of the overlap matrix Dmat : +C ---------------------------------------- +C The overlap matrix is stored in Dmat = D*transpose(conjugate(D)) + CALL ZGEMM('N','C',ndim,ndim,nbnd,DCMPLX(1.D0,0.D0), + & D,ndim,D,ndim,DCMPLX(0.D0,0.D0),Dmat,ndim) +C +C ------------------------------------------- +C Computation of the matrix S = Dmat^{-1/2} : +C ------------------------------------------- + CALL orthogonal_h(Dmat,ndim,.TRUE.) +C This matrix is stored in Dmat. +C +C ----------------------------------------------- +C Computation of the orthonormalized projectors : +C ----------------------------------------------- +C The calculation performed is the following : P=O^(-1/2)*P_tilde. +C Its value is stored in the matrix D_orth (of size ndim*nbnd) + + ALLOCATE(D_orth(1:ndim,1:nbnd)) + CALL ZGEMM('N','N',ndim,nbnd,ndim,DCMPLX(1.D0,0.D0), + & Dmat,ndim,D,ndim,DCMPLX(0.D0,0.D0),D_orth,ndim) + DEALLOCATE(D) +C +C -------------------------------------------------------------------------------- +C Storing the value of the orthonormalized projectors in the pr_crorb structures : +C -------------------------------------------------------------------------------- + ind1=0 + DO icrorb=1,ncrorb + isrt=crorb(icrorb)%sort + l=crorb(icrorb)%l +C If l=0, there only possible irep is the whole matrix itself. + IF (l==0) THEN + pr_crorb(icrorb,ik,is)%mat_rep + & (1,nbbot:nbtop)=D_orth(ind1+1,1:nbnd) + ind1=ind1+1 + ELSE +C the projectors of the correlated ireps are considered if there are any. (ifsplit=.TRUE.) + IF(crorb(icrorb)%ifsplit) THEN +C the value of l can not be 0 here, because ifsplit is necessary .FALSE. +C for s-orbital (restriction in dmftproj.f) + m1=-l-1 + DO irep=1,reptrans(l,isrt)%nreps + IF(crorb(icrorb)%correp(irep)) THEN + m2=m1+reptrans(l,isrt)%dreps(irep) + ind2=ind1+reptrans(l,isrt)%dreps(irep) +C prcrorb%matrep is of size 2*l+1, from -l to l (the basis which mix up/dn states are not possible here.) +C In the D_orth matrix, the corresponding part of the projection matrix ranges from the line (ind1+1) to the line ind2. +C The projector associated to the ireps is stored in the prcrorb%matrep from m1+1 to m2. + pr_crorb(icrorb,ik,is)% + & mat_rep(m1+1:m2,nbbot:nbtop)= + & D_orth(ind1+1:ind2,1:nbnd) + ind1=ind2 + ENDIF + m1=m1+reptrans(l,isrt)%dreps(irep) + ENDDO + ELSE +C The projectors of the whole correlated representation is considered. (ifsplit=.FALSE.) + ind2=ind1+2*l+1 +C Since there is no SO, prcrorb%matrep is of size 2*l+1, from -l to l. +C (the basis which mix up/dn states are not possible here.) +C In the D_orth matrix, the projection matrix ranges from the line (ind1+1) to the line ind2. +C The projector is stored in the pr_crorb%matrep (from -l to l). + pr_crorb(icrorb,ik,is)%mat_rep + & (-l:l,nbbot:nbtop)=D_orth(ind1+1:ind2,1:nbnd) + ind1=ind2 + ENDIF ! End of the ifsplit if-then-else + ENDIF ! End of the l=0 if-then-else + ENDDO ! End of the icrorb loop +C prcrorb%matrep contains now the orthonormalized projectors. + DEALLOCATE(D_orth) + ENDDO ! End of the loop on is + ENDDO ! End of the loop on ik + DEALLOCATE(Dmat) +C +C ============================================================================= +C Printing the projectors with k-points 1 and nk in the file fort.18 for test : +C ============================================================================= + DO icrorb=1,ncrorb + iatom=crorb(icrorb)%atom + isrt=crorb(icrorb)%sort + l=crorb(icrorb)%l + WRITE(18,'()') + WRITE(18,'(a)') 'apres othonormalizsation' + WRITE(18,'(a,i4)') 'icrorb = ', icrorb + WRITE(18,'(a,i4,a,i4)') 'isrt = ', isrt, ' l = ', l + IF (l==0) THEN + WRITE(18,'(a,i4)') 'ik = ', 1 + DO ib = kp(1,1)%nb_bot,kp(1,1)%nb_top + WRITE(18,*) pr_crorb(icrorb,1,1)%mat_rep(:,ib) + IF (ifSP) + & WRITE(18,*) pr_crorb(icrorb,1,2)%mat_rep(:,ib) + WRITE(18,'()') + ENDDO + WRITE(18,'(a,i4)') 'ik = ', nk + DO ib = kp(nk,1)%nb_bot,kp(nk,1)%nb_top + WRITE(18,*) pr_crorb(icrorb,nk,1)%mat_rep(:,ib) + IF (ifSP) + & WRITE(18,*) pr_crorb(icrorb,nk,2)%mat_rep(:,ib) + WRITE(18,'()') + ENDDO + ELSEIF (reptrans(l,isrt)%ifmixing) THEN + WRITE(18,'(a,i4)') 'ik = ', 1 + DO ib = kp(1,1)%nb_bot,kp(1,1)%nb_top + WRITE(18,*) pr_crorb(icrorb,1,1)%mat_rep(:,ib) + WRITE(18,'()') + ENDDO + WRITE(18,'(a,i4)') 'ik = ', nk + DO ib = kp(nk,1)%nb_bot,kp(nk,1)%nb_top + WRITE(18,*) pr_crorb(icrorb,nk,1)%mat_rep(:,ib) + WRITE(18,'()') + ENDDO + ELSE + WRITE(18,'(a,i4)') 'ik = ', 1 + DO ib = kp(1,1)%nb_bot,kp(1,1)%nb_top + WRITE(18,*) pr_crorb(icrorb,1,1)%mat_rep(:,ib) + IF (ifSP) + & WRITE(18,*) pr_crorb(icrorb,1,2)%mat_rep(:,ib) + WRITE(18,'()') + ENDDO + WRITE(18,'(a,i4)') 'ik = ', nk + DO ib = kp(nk,1)%nb_bot,kp(nk,1)%nb_top + WRITE(18,*) pr_crorb(icrorb,nk,1)%mat_rep(:,ib) + IF (ifSP) + & WRITE(18,*) pr_crorb(icrorb,nk,2)%mat_rep(:,ib) + WRITE(18,'()') + ENDDO + ENDIF + ENDDO +C + RETURN + END + + + + SUBROUTINE orthogonal_wannier_SO +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine orthonormalizes the Wannier-like functions %% +C %% obtained with the projectors P(icrorb,ik,is), in order to %% +C %% get a set of "true" Wannier orbitals. %% +C %% %% +C %% Only the correlated orbitals are treated here. %% +C %% %% +C %% THIS VERSION MUST BE USED WITH SPIN-ORBIT %% +C %% (since the calculation for up/dn states is made simultaneously) %% +C %% THIS VERSION CAN NOT BE USED WITHOUT SPIN-POLARIZED INPUT FILES.%% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C ---------------------------- + USE almblm_data + USE common_data + USE prnt + USE projections + USE reps + IMPLICIT NONE + COMPLEX(KIND=8), DIMENSION(:,:), ALLOCATABLE :: Dmat, D_orth, D + INTEGER :: is, ik, l, nbnd, ndim, isrt, nbbot, nbtop + INTEGER :: icrorb, ind1, ind2, iatom, ib + INTEGER :: m1, m2, irep +C + WRITE(buf,'(a)')'Orthonormalization of the projectors...' + CALL printout(0) + CALL printout(0) +C --------------------------------------------------------------------------------------- +C Interruption of the prgm if there is no dn part of pr_crorb. +C ------------------------- +C + IF(.not.ifSP) THEN + WRITE(buf,'(a,a,i2,a)')'The projectors on ', + & 'the dn states are required for isrt = ',isrt, + & ' but there is no spin-polarized input files.' + CALL printout(0) + WRITE(buf,'(a)')'END OF THE PRGM' + CALL printout(0) + STOP + ENDIF +C --------------------------------------------------------------------------------------- +C +C ===================================== +C Creation of the overlap matrix Dmat : +C ===================================== +C +C ----------------------------------------------------------- +C Determination of the dimension ndim of the overlap matrix : +C ----------------------------------------------------------- + ndim=0 +C Loop on the correlated orbitals + DO icrorb=1,ncrorb + isrt=crorb(icrorb)%sort + l=crorb(icrorb)%l +C The case l=0 is a particular case of "non-mixing" basis. +C -------------------------------------------------------- + IF (l==0) THEN +C Since this subroutine is used only in the case with SO, +C the only irep possible for s-orbital is the matrix itself. + ndim=ndim+2 +C If the basis representation needs a complete spinor rotation approach (basis with "mixing" ). +C --------------------------------------------------------------------------------------------- + ELSEIF (reptrans(l,isrt)%ifmixing) THEN +C the projectors of the correlated ireps are considered if there are any. (ifsplit=.TRUE.) + IF(crorb(icrorb)%ifsplit) THEN + DO irep=1,reptrans(l,isrt)%nreps + IF(crorb(icrorb)%correp(irep)) THEN + ndim=ndim+reptrans(l,isrt)%dreps(irep) + ENDIF +C The dimension of the irep is added to ndim. + ENDDO + ELSE +C If no particular irep is considered (ifsplit=.FALSE.), +C The whole matrix of the representation is considered. + ndim=ndim+2*(2*l+1) + ENDIF +C If the basis representation can be reduce to the up/up block (basis without "mixing"). +C -------------------------------------------------------------------------------------- + ELSE +C Since this subroutine is used only in the case with SO, +C the only irep possible for this orbital is the matrix itself. + ndim=ndim+2*(2*l+1) + ENDIF + ENDDO +C ------------------ +C Creation of Dmat : +C ------------------ + ALLOCATE(Dmat(1:ndim,1:ndim)) +C +C ===================================================================== +C Computation of the orthonormalized Wannier functions and projectors : +C ===================================================================== +C The computation is performed for each k_point independently +C because they are still good quantum numbers. + DO ik=1,nk +C Only the k-points with inlcuded bands are considered for the projectors. + IF(.NOT.kp(ik,1)%included) CYCLE + nbnd=kp(ik,1)%nb_top-kp(ik,1)%nb_bot+1 + nbbot=kp(ik,1)%nb_bot + nbtop=kp(ik,1)%nb_top +C it was checked that nbtop(up)=nbtop(dn) and nbbot(up)=nbbot(dn) +C for a computation with SO [in set_projections.f] + ALLOCATE(D(1:ndim,1:nbnd)) +C +C -------------------------------- +C Initialization of the D matrix : +C -------------------------------- +C This D matrix of size ndim*nbnd is the complete "projector matrix" +C which enables to go from the Wannier-like basis |u_orb> to the Bloch states |ik,ib>. + ind1=0 + DO icrorb=1,ncrorb + isrt=crorb(icrorb)%sort + l=crorb(icrorb)%l +C The case l=0 is a particular case of "non-mixing" basis. +C -------------------------------------------------------- + IF (l==0) THEN +C the only irep possible for s-orbital is the matrix itself. + DO is=1,ns +C D(ind1,1:nbnd)= +C Bug correction 8.11.2012 + D(ind1+1,1:nbnd)= + & pr_crorb(icrorb,ik,is)%mat_rep(1,nbbot:nbtop) + ind1=ind1+1 + ENDDO +C If the basis representation needs a complete spinor rotation approach (basis with "mixing" ). +C --------------------------------------------------------------------------------------------- + ELSEIF (reptrans(l,isrt)%ifmixing) THEN +C In this case, the projection matrix is stored in prcrorb%matrep with is=1. +C the projectors of the correlated ireps are considered if there are any. (ifsplit=.TRUE.) + IF (crorb(icrorb)%ifsplit) THEN + m1=0 + DO irep=1,reptrans(l,isrt)%nreps + IF (crorb(icrorb)%correp(irep)) THEN + m2=m1+reptrans(l,isrt)%dreps(irep) + ind2=ind1+reptrans(l,isrt)%dreps(irep) +C The states range from m1+1 to m2 in the irep. +C The corresponding projector is stored from the line (ind1+1) to the line ind2, in the D matrix. + D(ind1+1:ind2,1:nbnd)=pr_crorb(icrorb,ik,1)% + & mat_rep(m1+1:m2,nbbot:nbtop) + ind1=ind2 + ENDIF + m1=m1+reptrans(l,isrt)%dreps(irep) + ENDDO + ELSE +C The projectors of the whole correlated representation is considered. (ifsplit=.FALSE.) + ind2=ind1+2*(2*l+1) +C The corresponding projection matrix is stored from the line (ind1+1) to the line ind2, in the D matrix. + D(ind1+1:ind2,1:nbnd)=pr_crorb(icrorb,ik,1)% + & mat_rep(1:2*(2*l+1),nbbot:nbtop) + ind1=ind2 + ENDIF ! End of the ifsplit if-then-else +C If the basis representation can be reduce to the up/up block (basis without "mixing"). +C -------------------------------------------------------------------------------------- + ELSE +C the only irep possible for such an orbital is the matrix itself. + DO is=1,ns + ind2=ind1+2*l+1 + D(ind1+1:ind2,1:nbnd)= + & pr_crorb(icrorb,ik,is)%mat_rep(-l:l,nbbot:nbtop) + ind1=ind2 + ENDDO + ENDIF ! End of the ifmixing if-then-else + ENDDO ! End of the icrorb loop +C +C ---------------------------------------- +C Computation of the overlap matrix Dmat : +C ---------------------------------------- +C The overlap matrix is stored in Dmat = D*transpose(conjugate(D)) + CALL ZGEMM('N','C',ndim,ndim,nbnd,DCMPLX(1.D0,0.D0), + & D,ndim,D,ndim,DCMPLX(0.D0,0.D0),Dmat,ndim) +C +C ------------------------------------------- +C Computation of the matrix S = Dmat^{-1/2} : +C ------------------------------------------- + CALL orthogonal_h(Dmat,ndim,.TRUE.) +C This matrix is stored in Dmat. +C +C ----------------------------------------------- +C Computation of the orthonormalized projectors : +C ----------------------------------------------- +C The calculation performed is the following : P=O^(-1/2)*P_tilde. +C Its value is stored in the matrix D_orth (of size ndim*nbnd) + ALLOCATE(D_orth(1:ndim,1:nbnd)) + CALL ZGEMM('N','N',ndim,nbnd,ndim,DCMPLX(1.D0,0.D0), + & Dmat,ndim,D,ndim,DCMPLX(0.D0,0.D0),D_orth,ndim) + DEALLOCATE(D) +C +C -------------------------------------------------------------------------------- +C Storing the value of the orthonormalized projectors in the pr_crorb structures : +C -------------------------------------------------------------------------------- + ind1=0 + DO icrorb=1,ncrorb + isrt=crorb(icrorb)%sort + l=crorb(icrorb)%l +C The case l=0 is a particular case of "non-mixing" basis. +C -------------------------------------------------------- + IF (l==0) THEN +C the only irep possible for s-orbital is the matrix itself. + DO is=1,ns + pr_crorb(icrorb,ik,is)%mat_rep(1,nbbot:nbtop)= + & D_orth(ind1+1,1:nbnd) + ind1=ind1+1 + ENDDO +C If the basis representation needs a complete spinor rotation approach (basis with "mixing" ). +C --------------------------------------------------------------------------------------------- + ELSEIF (reptrans(l,isrt)%ifmixing) THEN +C the projectors of the correlated ireps are considered if there are any. (ifsplit=.TRUE.) + IF(crorb(icrorb)%ifsplit) THEN + m1=0 + DO irep=1,reptrans(l,isrt)%nreps + IF (crorb(icrorb)%correp(irep)) THEN + m2=m1+reptrans(l,isrt)%dreps(irep) + ind2=ind1+reptrans(l,isrt)%dreps(irep) +C In the D_orth matrix, the corresponding part of the projection matrix ranges from the line (ind1+1) to the line ind2. +C The projector associated to the ireps is stored in the prcrorb%matrep from m1+1 to m2. + pr_crorb(icrorb,ik,1)%mat_rep(m1+1:m2,nbbot:nbtop) + & =D_orth(ind1+1:ind2,1:nbnd) + ind1=ind2 + ENDIF + m1=m1+reptrans(l,isrt)%dreps(irep) + ENDDO + ELSE +C The projectors of the whole correlated representation is considered. (ifsplit=.FALSE.) + ind2=ind1+2*(2*l+1) +C The corresponding projection matrix is stored from the line (ind1+1) to the line ind2, in the D matrix. + pr_crorb(icrorb,ik,1)%mat_rep(1:2*(2*l+1),nbbot:nbtop) + & =D_orth(ind1+1:ind2,1:nbnd) + ind1=ind2 + ENDIF ! End of the ifsplit if-then-else +C If the basis representation can be reduce to the up/up block (basis without "mixing"). +C -------------------------------------------------------------------------------------- + ELSE +C the only irep possible for this orbital is the matrix itself. + DO is=1,ns + ind2=ind1+2*l+1 + pr_crorb(icrorb,ik,is)%mat_rep(-l:l,nbbot:nbtop) + & =D_orth(ind1+1:ind2,1:nbnd) + ind1=ind2 + ENDDO + ENDIF ! End of the ifmixing if-then-else + ENDDO ! End of the icrorb loop + DEALLOCATE(D_orth) + ENDDO ! End of the loop on ik + DEALLOCATE(Dmat) +C +C ============================================================================= +C Printing the projectors with k-points 1 and nk in the file fort.18 for test : +C ============================================================================= + DO icrorb=1,ncrorb + iatom=crorb(icrorb)%atom + isrt=crorb(icrorb)%sort + l=crorb(icrorb)%l + WRITE(18,'()') + WRITE(18,'(a)') 'apres othonormalizsation' + WRITE(18,'(a,i4)') 'icrorb = ', icrorb + WRITE(18,'(a,i4,a,i4)') 'isrt = ', isrt, ' l = ', l + IF (l==0) THEN + WRITE(18,'(a,i4)') 'ik = ', 1 + DO ib = kp(1,1)%nb_bot,kp(1,1)%nb_top + WRITE(18,*) pr_crorb(icrorb,1,1)%mat_rep(:,ib) + IF (ifSP) + & WRITE(18,*) pr_crorb(icrorb,1,2)%mat_rep(:,ib) + WRITE(18,'()') + ENDDO + WRITE(18,'(a,i4)') 'ik = ', nk + DO ib = kp(nk,1)%nb_bot,kp(nk,1)%nb_top + WRITE(18,*) pr_crorb(icrorb,nk,1)%mat_rep(:,ib) + IF (ifSP) + & WRITE(18,*) pr_crorb(icrorb,nk,2)%mat_rep(:,ib) + WRITE(18,'()') + ENDDO + ELSEIF (reptrans(l,isrt)%ifmixing) THEN + WRITE(18,'(a,i4)') 'ik = ', 1 + DO ib = kp(1,1)%nb_bot,kp(1,1)%nb_top + WRITE(18,*) pr_crorb(icrorb,1,1)%mat_rep(:,ib) + WRITE(18,'()') + ENDDO + WRITE(18,'(a,i4)') 'ik = ', nk + DO ib = kp(nk,1)%nb_bot,kp(nk,1)%nb_top + WRITE(18,*) pr_crorb(icrorb,nk,1)%mat_rep(:,ib) + WRITE(18,'()') + ENDDO + ELSE + WRITE(18,'(a,i4)') 'ik = ', 1 + DO ib = kp(1,1)%nb_bot,kp(1,1)%nb_top + WRITE(18,*) pr_crorb(icrorb,1,1)%mat_rep(:,ib) + IF (ifSP) + & WRITE(18,*) pr_crorb(icrorb,1,2)%mat_rep(:,ib) + WRITE(18,'()') + ENDDO + WRITE(18,'(a,i4)') 'ik = ', nk + DO ib = kp(nk,1)%nb_bot,kp(nk,1)%nb_top + WRITE(18,*) pr_crorb(icrorb,nk,1)%mat_rep(:,ib) + IF (ifSP) + & WRITE(18,*) pr_crorb(icrorb,nk,2)%mat_rep(:,ib) + WRITE(18,'()') + ENDDO + ENDIF + ENDDO +C + RETURN + END + + diff --git a/fortran/dmftproj/outband.f b/fortran/dmftproj/outband.f new file mode 100644 index 00000000..625992e5 --- /dev/null +++ b/fortran/dmftproj/outband.f @@ -0,0 +1,287 @@ + +c ****************************************************************************** +c +c TRIQS: a Toolbox for Research in Interacting Quantum Systems +c +c Copyright (C) 2011 by L. Pourovskii, V. Vildosola, C. Martins, M. Aichhorn +c +c TRIQS is free software: you can redistribute it and/or modify it under the +c terms of the GNU General Public License as published by the Free Software +c Foundation, either version 3 of the License, or (at your option) any later +c version. +c +c TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +c WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +c FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +c details. +c +c You should have received a copy of the GNU General Public License along with +c TRIQS. If not, see . +c +c *****************************************************************************/ + + SUBROUTINE outband +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine creates the output file case.outband, with all %% +C %% the informations necessary for the computation of the spectral %% +C %% function of the system. %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definition of the variables : +C ----------------------------- + USE almblm_data + USE bands + USE common_data + USE file_names + USE prnt + USE projections + USE reps + IMPLICIT NONE +C + INTEGER :: iorb, icrorb, irep, isrt + INTEGER :: l, m, is, i1, i2, i + INTEGER :: ik, il, ib, ir, n + INTEGER :: ind1, ind2, iatom +C + WRITE(buf,'(a)')'Writing the file case.outband...' + CALL printout(0) +C +C ====================================== +C Informations about the chosen k-path : +C ====================================== +C +C Number of k-points along the chosen k-path + WRITE(ouband,'(i6)') nkband +C Description of the number of bands in the energy window at each k_point +C + DO is=1,ns +C If SO is considered, the number of up and dn bands are the same. + IF ((ifSP.AND.ifSO).and.(is.eq.2)) cycle + DO ik=1,nk + WRITE(ouband,'(i6)') + & ABS(kp(ik,is)%nb_top-kp(ik,is)%nb_bot+1) + ENDDO ! End of the ik loop + ENDDO ! End of the is loop +C for each k-point, the number of band included in the energy window is written. +C =========================================================== +C Description of the projectors for the correlated orbitals : +C =========================================================== + DO ik=1,nk + DO icrorb=1,ncrorb + l=crorb(icrorb)%l + isrt=crorb(icrorb)%sort +C +C The case l=0 is a particular case of "non-mixing" basis. +C -------------------------------------------------------- + IF (l==0) THEN +C For the s-orbitals, the only irep possible is the matrix itself. + DO is=1,ns + WRITE(ouband,*) + & REAL(pr_crorb(icrorb,ik,is)%mat_rep(1, + & kp(ik,is)%nb_bot:kp(ik,is)%nb_top)) + ENDDO + DO is=1,ns + WRITE(ouband,*) + & AIMAG(pr_crorb(icrorb,ik,is)%mat_rep(1, + & kp(ik,is)%nb_bot:kp(ik,is)%nb_top)) + ENDDO +C +C If the basis representation needs a complete spinor rotation approach (basis with "mixing" ). +C --------------------------------------------------------------------------------------------- + ELSEIF (reptrans(l,isrt)%ifmixing) THEN +C In this case, the SO is necessary considered, spinor rotation matrices are used. + IF(crorb(icrorb)%ifsplit) THEN +C If only 1 irep is correlated + ind1=1 + DO irep=1,reptrans(l,isrt)%nreps + IF(crorb(icrorb)%correp(irep)) THEN + ind2=ind1+reptrans(l,isrt)%dreps(irep)-1 + DO m=ind1,ind2 + WRITE(ouband,*) + & REAL(pr_crorb(icrorb,ik,1)%mat_rep(m, + & kp(ik,1)%nb_bot:kp(ik,1)%nb_top)) + ENDDO + DO m=ind1,ind2 + WRITE(ouband,*) + & AIMAG(pr_crorb(icrorb,ik,1)%mat_rep(m, + & kp(ik,1)%nb_bot:kp(ik,1)%nb_top)) + ENDDO + ENDIF + ind1=ind1+reptrans(l,isrt)%dreps(irep) + ENDDO + ELSE +C If no particular irep is correlated + DO m=1,2*(2*l+1) + WRITE(ouband,*) + & REAL(pr_crorb(icrorb,ik,1)%mat_rep(m, + & kp(ik,1)%nb_bot:kp(ik,1)%nb_top)) + ENDDO + DO m=1,2*(2*l+1) + WRITE(ouband,*) + & AIMAG(pr_crorb(icrorb,ik,1)%mat_rep(m, + & kp(ik,1)%nb_bot:kp(ik,1)%nb_top)) + ENDDO + ENDIF +C +C If the basis representation can be reduce to the up/up block (basis without "mixing"). +C -------------------------------------------------------------------------------------- + ELSE + IF ((.not.(ifSP.AND.ifSO)).AND.crorb(icrorb)%ifsplit) THEN +C If only 1 irep is correlated (case without SO) + ind1=-l + DO irep=1,reptrans(l,isrt)%nreps + IF(crorb(icrorb)%correp(irep)) THEN + ind2=ind1+reptrans(l,isrt)%dreps(irep)-1 + DO is=1,ns + DO m=ind1,ind2 + WRITE(ouband,*) + & REAL(pr_crorb(icrorb,ik,is)%mat_rep(m, + & kp(ik,is)%nb_bot:kp(ik,is)%nb_top)) + ENDDO + ENDDO + DO is=1,ns + DO m=ind1,ind2 + WRITE(ouband,*) + & AIMAG(pr_crorb(icrorb,ik,is)%mat_rep(m, + & kp(ik,is)%nb_bot:kp(ik,is)%nb_top)) + ENDDO + ENDDO + ENDIF + ind1=ind1+reptrans(l,isrt)%dreps(irep) + ENDDO + ELSE +C If no particular irep is correlated (case with and without SO) + DO is=1,ns + DO m=-l,l + WRITE(ouband,*) + & REAL(pr_crorb(icrorb,ik,is)%mat_rep(m, + & kp(ik,is)%nb_bot:kp(ik,is)%nb_top)) + ENDDO + ENDDO + DO is=1,ns + DO m=-l,l + WRITE(ouband,*) + & AIMAG(pr_crorb(icrorb,ik,is)%mat_rep(m, + & kp(ik,is)%nb_bot:kp(ik,is)%nb_top)) + ENDDO + ENDDO + END IF ! End of the ifsplit if-then-else + END IF ! End of the ifmixing if-then-else + END DO ! End of the icrorb loop + END DO ! End of the ik loop +C for each k-point and each correlated orbital, the corresponding projector is described by : +C - the real part of the "correlated" submatrix +C - the imaginary part of the "correlated" submatrix +C +C ====================================================== +C Description of the Hamiltonian H(k) at each k_point : +C ====================================================== + DO is=1,ns + DO ik=1,nk +C If SO is considered, the numbers of up and dn bands are the same. + IF (ifSO.and.is.eq.2) cycle + DO ib=kp(ik,is)%nb_bot,kp(ik,is)%nb_top + WRITE(ouband,*) kp(ik,is)%eband(ib) + ENDDO + ENDDO ! End of the ik loop + ENDDO ! End of the is loop +C for each spin value is and each k-point, +C - the energies of the band with spin is at point k +C +C ================================================================ +C Description of the size of the basis for each included orbital : +C ================================================================ + DO iorb=1,norb + WRITE(ouband,'(3(i6))') norm_radf(iorb)%n + ENDDO +C There is not more than 1 LO for each orbital (hence n < 4 ) +C +C ==================================== +C Description of the Theta projector : +C ==================================== + DO iorb=1,norb + l=orb(iorb)%l + isrt=orb(iorb)%sort +C +C The case l=0 is a particular case of "non-mixing" basis. +C -------------------------------------------------------- + IF (l==0) THEN + DO ik=1,nk + DO ir=1,norm_radf(iorb)%n + DO is=1,ns + WRITE(ouband,*) + & REAL(pr_orb(iorb,ik,is)%matn_rep(1, + & kp(ik,is)%nb_bot:kp(ik,is)%nb_top,ir)) + ENDDO + DO is=1,ns + WRITE(ouband,*) + & AIMAG(pr_orb(iorb,ik,is)%matn_rep(1, + & kp(ik,is)%nb_bot:kp(ik,is)%nb_top,ir)) + ENDDO + ENDDO ! End of the ir loop + ENDDO ! End of the ik loop +C +C If the basis representation needs a complete spinor rotation approach (basis with "mixing" ). +C --------------------------------------------------------------------------------------------- + ELSEIF (reptrans(l,isrt)%ifmixing) THEN +C In this case, the calculation is necessary spin-polarized with SO, spinor rotation matrices are used. + DO ik=1,nk + DO ir=1,norm_radf(iorb)%n + DO m=1,2*(2*l+1) + WRITE(ouband,*) + & REAL(pr_orb(iorb,ik,1)%matn_rep(m, + & kp(ik,1)%nb_bot:kp(ik,1)%nb_top,ir)) + ENDDO + DO m=1,2*(2*l+1) + WRITE(ouband,*) + & AIMAG(pr_orb(iorb,ik,1)%matn_rep(m, + & kp(ik,1)%nb_bot:kp(ik,1)%nb_top,ir)) + ENDDO + ENDDO ! End of the ir loop + ENDDO ! End of the ik loop +C +C If the basis representation can be reduce to the up/up block (basis without "mixing"). +C -------------------------------------------------------------------------------------- + ELSE + DO ik=1,nk + DO ir=1,norm_radf(iorb)%n + DO is=1,ns + DO m=-l,l + WRITE(ouband,*) + & REAL(pr_orb(iorb,ik,is)%matn_rep(m, + & kp(ik,is)%nb_bot:kp(ik,is)%nb_top,ir)) + ENDDO + ENDDO ! End of the is loop + DO is=1,ns + DO m=-l,l + WRITE(ouband,*) + & AIMAG(pr_orb(iorb,ik,is)%matn_rep(m, + & kp(ik,is)%nb_bot:kp(ik,is)%nb_top,ir)) + ENDDO + ENDDO ! End of the is loop + ENDDO ! End of the ir loop + ENDDO ! End of the ik loop + ENDIF ! End of the ifmixing if-then-else + ENDDO ! End of the iorb loop +C for each included orbital, for each k-point and each |phi_j> elmt, +C the corresponding Thetaprojector is described by : +C - the real part of the matrix +C - the imaginary part of the matrix +C +C ============================= +C Description of the k-labels : +C ============================= + DO i=1,nlab + WRITE(ouband,'(2i6,a)') i,labels(i)%pos,labels(i)%kname + ENDDO +C for each label, are written : +C - the number of the corresponding k-point in the k-path +C - the name associated to this label +C + RETURN + END + + + diff --git a/fortran/dmftproj/outbwin.f b/fortran/dmftproj/outbwin.f new file mode 100644 index 00000000..25d1f03c --- /dev/null +++ b/fortran/dmftproj/outbwin.f @@ -0,0 +1,92 @@ + +c ****************************************************************************** +c +c TRIQS: a Toolbox for Research in Interacting Quantum Systems +c +c Copyright (C) 2011 by L. Pourovskii, V. Vildosola, C. Martins, M. Aichhorn +c +c TRIQS is free software: you can redistribute it and/or modify it under the +c terms of the GNU General Public License as published by the Free Software +c Foundation, either version 3 of the License, or (at your option) any later +c version. +c +c TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +c WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +c FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +c details. +c +c You should have received a copy of the GNU General Public License along with +c TRIQS. If not, see . +c +c *****************************************************************************/ + + SUBROUTINE outbwin +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine creates the output file case.oubwin %% +C %% which contains all the informations for the charge density %% +C %% self-consistency. %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definition of the variables : +C ---------------------------- + USE almblm_data + USE common_data + USE file_names + USE prnt + IMPLICIT NONE + INTEGER :: is, ik, ou +C + WRITE(buf,'(a)')'Writing the file case.outbwin...' + CALL printout(0) +C + DO is=1,ns +C ==================================== +C Definition of the file case.oubwin : +C ==================================== +C If the computations is spin-polarized, the output file is divided +C in two files : case.oubwinup and case.oubwindn + IF(ifSP.AND.is==1) THEN + ou=oubwinup + ELSEIF(ifSP.AND.is==2) THEN + ou=oubwindn + ELSE + ou=oubwin + ENDIF +C ======================================= +C General informations about the system : +C ======================================= +C +C Number of k-points in the I-BZ + WRITE(ou,'(i6)') nk +C Definition of the Spin-orbit flag ifSO + IF(ifSO) THEN + WRITE(ou,'(i6)') 1 + ELSE + WRITE(ou,'(i6)') 0 + ENDIF +C ==================================================== +C Description of the main properties of each k-point : +C ==================================================== + DO ik=1,nk +C Description of the if-included flag + IF(kp(ik,is)%included) THEN + WRITE(ou,'(i6)') 1 + ELSE + WRITE(ou,'(i6)') 0 + ENDIF + IF(kp(ik,is)%included) THEN +C Range of bands included at each k-point + WRITE(ou,'(2(i6))') kp(ik,is)%nb_bot,kp(ik,is)%nb_top +C Weight associated to each k-point (for the simple point integration) + WRITE(ou,*) kp(ik,is)%weight + ENDIF + ENDDO ! End of the ik loop + ENDDO ! End of the is loop +C + RETURN + END + + + diff --git a/fortran/dmftproj/outputqmc.f b/fortran/dmftproj/outputqmc.f new file mode 100644 index 00000000..f0df75d1 --- /dev/null +++ b/fortran/dmftproj/outputqmc.f @@ -0,0 +1,1405 @@ + +c ****************************************************************************** +c +c TRIQS: a Toolbox for Research in Interacting Quantum Systems +c +c Copyright (C) 2011 by L. Pourovskii, V. Vildosola, C. Martins, M. Aichhorn +c +c TRIQS is free software: you can redistribute it and/or modify it under the +c terms of the GNU General Public License as published by the Free Software +c Foundation, either version 3 of the License, or (at your option) any later +c version. +c +c TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +c WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +c FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +c details. +c +c You should have received a copy of the GNU General Public License along with +c TRIQS. If not, see . +c +c *****************************************************************************/ + + SUBROUTINE outqmc(elecn,qbbot) +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine creates the output files : %% +C %% - case.ctqmcout, with all the informations necessary for a %% +C %% CTQMC computation. %% +C %% - case.symqmc, describing all the symmetries of the system %% +c %% (necessary for CTQMC computation too). %% +C %% - case.parproj which gives the partial charge projectors for %% +C %% orbitals and for all atoms. %% +C %% - case.sympar which contains the symmetry matrices for all %% +C %% the included orbitals (for partial charge analysis) %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definition of the variables : +C ----------------------------- + USE almblm_data + USE common_data + USE file_names + USE prnt + USE reps + USE symm + USE projections + IMPLICIT NONE +C + INTEGER :: iorb, icrorb, irep, isrt + INTEGER :: l, m, is, i1, i2, isym + INTEGER :: ik, il, ib, ir, n + INTEGER :: ind1, ind2, iatom + INTEGER :: timeinvflag + REAL(KIND=8) :: qbbot, elecn, factor + COMPLEX(KIND=8) :: ephase + COMPLEX(KIND=8),DIMENSION(:,:), ALLOCATABLE :: hk + COMPLEX(KIND=8), DIMENSION(:,:), ALLOCATABLE :: spinrot + COMPLEX(KIND=8), DIMENSION(:,:), ALLOCATABLE :: densprint + COMPLEX(KIND=8), DIMENSION(:,:), ALLOCATABLE :: time_op +C +C +C ======================================= +C Writing the file case.ctqmcout : +C ======================================= +C + WRITE(buf,'(a)')'Writing the file case.ctqmcout...' + CALL printout(0) +C +C Definition of 1 electron-Volt + WRITE(ouctqmc,'(a)') '13.605698' +C +C --------------------------------------- +C General informations about the system : +C --------------------------------------- +C +C Number of k-points in the I-BZ + WRITE(ouctqmc,'(i6)') nk +C Definition of the spin-polarized flag ifSP + IF (ifSP) THEN + WRITE(ouctqmc,'(i6)') 1 + ELSE + WRITE(ouctqmc,'(i6)') 0 + ENDIF +C Definition of the Spin-orbit flag ifSO + IF (ifSO) THEN + WRITE(ouctqmc,'(i6)') 1 + ELSE + WRITE(ouctqmc,'(i6)') 0 + ENDIF +C The only possible combinations are : +C - (0,0) which stands for a paramagnetic computation without SO. +C - (1,0) which stands for computation without SO using spin-polarized input files. +C - (1,1) which stands for computation with SO using spin-polarized input files. +C +C Writing the total charge below the lower limit of the energy window (variable "qbbot") + WRITE(ouctqmc,*) qbbot +C Writing the total number of electrons (valence band+semicore) (variable "elecn"). +C It is also the charge upto the Fermi level. + WRITE(ouctqmc,*) elecn +C +C ------------------------------------------ +C Description of all the included orbitals : +C ------------------------------------------ +C +C Definition of the number of included orbitals "norb" + WRITE(ouctqmc,'(i6)') norb +C Description of each orbital "iorb" + DO iorb=1,norb + IF (ifSO) THEN + WRITE(ouctqmc,'(4(i6,x))') orb(iorb)%atom, orb(iorb)%sort, + & orb(iorb)%l, 2*(2*orb(iorb)%l+1) + ELSE + WRITE(ouctqmc,'(4(i6,x))') orb(iorb)%atom, orb(iorb)%sort, + & orb(iorb)%l, 2*orb(iorb)%l+1 + ENDIF + ENDDO +C an orbital "iorb" is described by : +C - the associated atom +C - the corresponding atomic sort +C - the considered orbital number l +C - the size of the corresponding matrices : 2*l+1 without SO ; 2*(2*l+1) with SO +C +C ---------------------------------------- +C Description of the correlated orbitals : +C ---------------------------------------- +C +C Definition of the number of correlated orbitals "ncrorb" + WRITE(ouctqmc,'(i6)') ncrorb +C Description of each correlated orbital "icrorb" + DO icrorb=1,ncrorb + l=crorb(icrorb)%l + isrt=crorb(icrorb)%sort +C +C The case l=0 is a particular case of "non-mixing" basis. +C -------------------------------------------------------- + IF (l==0) THEN +C For the s-orbitals, the only irep possible is the matrix itself. + IF (ifSP.AND.ifSO) THEN +C If SO is taken into account, spinor rotation matrix is considered. +C The spin is not a good quantum number, so the whole representation is used. + WRITE(ouctqmc,'(6(i6,x))') crorb(icrorb)%atom, isrt, 0, + & 2, crorb(icrorb)%ifSOat, 1 + ELSE +C Without SO, only the rotation matrix in orbital space is necessary. + WRITE(ouctqmc,'(6(i6,x))') crorb(icrorb)%atom, isrt, 0, + & 1, crorb(icrorb)%ifSOat, 1 + ENDIF +C +C If the basis representation needs a complete spinor rotation approach (basis with "mixing" ). +C --------------------------------------------------------------------------------------------- + ELSEIF(reptrans(l,isrt)%ifmixing) THEN +C In this case, the SO is necessary considered, spinor rotation matrices are used. + IF (crorb(icrorb)%ifsplit) THEN +C If only an irep is correlated + DO irep=1,reptrans(l,isrt)%nreps + IF (crorb(icrorb)%correp(irep)) THEN + WRITE(ouctqmc,'(6(i6,x))') crorb(icrorb)%atom, + & isrt, l, reptrans(l,isrt)%dreps(irep), + & crorb(icrorb)%ifSOat, irep + ENDIF + ENDDO + ELSE +C If no particular irep is correlated + WRITE(ouctqmc,'(6(i6,x))') crorb(icrorb)%atom, isrt, l, + & 2*(2*l+1), crorb(icrorb)%ifSOat, 1 + ENDIF +C +C If the basis representation can be reduce to the up/up block (basis without "mixing"). +C -------------------------------------------------------------------------------------- + ELSE + IF (ifSP.AND.ifSO) THEN +C If SO is taken into account, spinor rotation matrices are considered. +C The spin is not a good quantum number, so the whole representation is used. + WRITE(ouctqmc,'(6(i6,x))') crorb(icrorb)%atom, isrt, l, + & 2*(2*l+1), crorb(icrorb)%ifSOat, 1 + ELSE +C Without SO, only the rotation matrix in orbital space is necessary. + IF (crorb(icrorb)%ifsplit) THEN +C If only an irep is correlated + DO irep=1,reptrans(l,isrt)%nreps + IF (crorb(icrorb)%correp(irep)) THEN + WRITE(ouctqmc,'(6(i6,x))') crorb(icrorb)%atom, + & isrt, l, reptrans(l,isrt)%dreps(irep), + & crorb(icrorb)%ifSOat, irep + ENDIF + ENDDO + ELSE +C If no particular irep is correlated + WRITE(ouctqmc,'(6(i6,x))') crorb(icrorb)%atom, isrt, l, + & (2*l+1), crorb(icrorb)%ifSOat, 1 + END IF ! End of the ifsplit if-then-else + END IF ! End of the ifSO if-then-else + END IF ! End of the ifmixing if-then-else + END DO ! End of the icrorb loop +C an orbital "iorb" is described by : +C - the associated atom +C - the corresponding atomic sort +C - the considered orbital number l +C - the size of the "correlated" submatrix (can be the whole matrix) +C - the flag ifSOat which states that SO is considered for this orbital +C - the number of the irep +C +C ------------------------------------------------------------------------------------------------ +C Description of the global to local coordinates transformation Rloc for each correlated orbital : +C ------------------------------------------------------------------------------------------------ +C Description of each transformation Rloc + DO icrorb=1,ncrorb + l=crorb(icrorb)%l + isrt=crorb(icrorb)%sort + iatom=crorb(icrorb)%atom +C +C The case l=0 is a particular case of "non-mixing" basis. +C -------------------------------------------------------- + IF(l==0) THEN +C For the s-orbitals, the only irep possible is the matrix itself. + IF (ifSP.AND.ifSO) THEN +C If SO is taken into account, spinor rotation matrix must be considered. + ALLOCATE(spinrot(1:2,1:2)) + spinrot(:,:)=0.d0 +C The spinor-rotation matrix is directly calculated from the Euler angles a,b and c. + IF (rotloc(iatom)%timeinv) THEN + factor=(rotloc(iatom)%a+rotloc(iatom)%g)/2.d0 + spinrot(2,1)=EXP(CMPLX(0.d0,factor))* + & DCOS(rotloc(iatom)%b/2.d0) + spinrot(1,2)=-CONJG(spinrot(2,1)) +C Up/dn and Dn/up terms + factor=-(rotloc(iatom)%a-rotloc(iatom)%g)/2.d0 + spinrot(2,2)=-EXP(CMPLX(0.d0,factor))* + & DSIN(rotloc(iatom)%b/2.d0) + spinrot(1,1)=CONJG(spinrot(2,2)) + ELSE + factor=(rotloc(iatom)%a+rotloc(iatom)%g)/2.d0 + spinrot(1,1)=EXP(CMPLX(0.d0,factor))* + & DCOS(rotloc(iatom)%b/2.d0) + spinrot(2,2)=CONJG(spinrot(1,1)) +C Up/dn and Dn/up terms + factor=-(rotloc(iatom)%a-rotloc(iatom)%g)/2.d0 + spinrot(1,2)=EXP(CMPLX(0.d0,factor))* + & DSIN(rotloc(iatom)%b/2.d0) + spinrot(2,1)=-CONJG(spinrot(1,2)) + ENDIF +C Printing the transformation informations + DO m=1,2 + WRITE(ouctqmc,*) REAL(spinrot(m,1:2)) + ENDDO + DO m=1,2 + WRITE(ouctqmc,*) AIMAG(spinrot(m,1:2)) + ENDDO + DEALLOCATE(spinrot) +C Without SO, only the rotation matrix in orbital space is necessary. + ELSE +C In this case, the Rloc matrix is merely identity. + WRITE(ouctqmc,*) 1.d0 + WRITE(ouctqmc,*) 0.d0 + ENDIF +C Printing the time inversion flag if the calculation is spin-polarized (ifSP=1) + IF (ifSP) THEN + timeinvflag=0 + IF (rotloc(iatom)%timeinv) timeinvflag=1 + WRITE(ouctqmc,'(i6)') timeinvflag + ENDIF +C +C If the basis representation needs a complete spinor rotation approach (basis with "mixing" ). +C --------------------------------------------------------------------------------------------- + ELSEIF (reptrans(l,isrt)%ifmixing) THEN +C In this case, the calculation is necessary spin-polarized with SO, spinor rotation matrices are used. + IF(crorb(icrorb)%ifsplit) THEN +C If only an irep is correlated + ind1=1 + DO irep=1,reptrans(l,isrt)%nreps + IF(crorb(icrorb)%correp(irep)) THEN + ind2=ind1+reptrans(l,isrt)%dreps(irep)-1 + DO m=ind1,ind2 + WRITE(ouctqmc,*) REAL(rotloc(iatom)% + & rotrep(l)%mat(m,ind1:ind2)) + ENDDO + DO m=ind1,ind2 + WRITE(ouctqmc,*)AIMAG(rotloc(iatom)% + & rotrep(l)%mat(m,ind1:ind2)) + ENDDO + ENDIF + ind1=ind1+reptrans(l,isrt)%dreps(irep) + ENDDO + ELSE +C If no particular irep is correlated + DO m=1,2*(2*l+1) + WRITE(ouctqmc,*) REAL(rotloc(iatom)% + & rotrep(l)%mat(m,1:2*(2*l+1))) + ENDDO + DO m=1,2*(2*l+1) + WRITE(ouctqmc,*) AIMAG(rotloc(iatom)% + & rotrep(l)%mat(m,1:2*(2*l+1))) + ENDDO + ENDIF +C Printing if the transformation included a time-reversal operation. + timeinvflag =0 + IF (rotloc(iatom)%timeinv) timeinvflag=1 + WRITE(ouctqmc,'(i6)') timeinvflag +C +C If the basis representation can be reduce to the up/up block (basis without "mixing"). +C -------------------------------------------------------------------------------------- + ELSE + IF (ifSP.AND.ifSO) THEN +C If SO is taken into account, spinor rotation matrices are considered. +C The spin is not a good quantum number, so the whole representation is used. + DO m=1,2*(2*l+1) + WRITE(ouctqmc,*) REAL(rotloc(iatom)% + & rotrep(l)%mat(m,1:2*(2*l+1))) + ENDDO + DO m=1,2*(2*l+1) + WRITE(ouctqmc,*) AIMAG(rotloc(iatom)% + & rotrep(l)%mat(m,1:2*(2*l+1))) + ENDDO + ELSE +C The calculation is either spin-polarized without SO or paramagnetic. +C The spin is a good quantum number and irep are possible. + IF(crorb(icrorb)%ifsplit) THEN +C If only an irep is correlated + ind1=-l + DO irep=1,reptrans(l,isrt)%nreps + IF(crorb(icrorb)%correp(irep)) THEN + ind2=ind1+reptrans(l,isrt)%dreps(irep)-1 + DO m=ind1,ind2 + WRITE(ouctqmc,*) REAL(rotloc(iatom)% + & rotrep(l)%mat(m,ind1:ind2)) + ENDDO + DO m=ind1,ind2 + WRITE(ouctqmc,*) AIMAG(rotloc(iatom)% + & rotrep(l)%mat(m,ind1:ind2)) + ENDDO + ENDIF + ind1=ind1+reptrans(l,isrt)%dreps(irep) + ENDDO + ELSE +C If no particular irep is correlated + DO m=-l,l + WRITE(ouctqmc,*) REAL(rotloc(iatom)% + & rotrep(l)%mat(m,-l:l)) + ENDDO + DO m=-l,l + WRITE(ouctqmc,*) AIMAG(rotloc(iatom)% + & rotrep(l)%mat(m,-l:l)) + ENDDO + END IF ! End of the ifsplit if-then-else + END IF ! End of the ifSO if-then-else +C Printing if the transformation included a time-reversal operation. + IF (ifSP) THEN + timeinvflag =0 + IF (rotloc(iatom)%timeinv) timeinvflag=1 + WRITE(ouctqmc,'(i6)') timeinvflag + END IF + END IF ! End of the ifmixing if-then-else + END DO ! End of the icrorb loop +C for each correlated orbital icrorb, the transformation Rloc is described by : +C - the real part of the submatrix associated to "icrorb" +C - the imaginary part of the submatrix associated to "icrorb" +C - a flag which states if a time reversal operation is included in the transformation (if SP only ) +C +C ------------------------------------------------------------------------------------------------------------- +C Description of the transformation from complex harmonics to the basis associated to each correlated orbital : +C ------------------------------------------------------------------------------------------------------------- +C + DO icrorb=1,ncrorb + l=crorb(icrorb)%l + isrt=crorb(icrorb)%sort +C The transformation is printed only for the first (representative) atom of each sort. + IF (crorb(icrorb)%first) THEN +C +C The case l=0 is a particular case of "non-mixing" basis. +C -------------------------------------------------------- + IF (l==0) THEN +C For the s-orbitals, the only basis considered is the complex basis. + IF (ifSP.AND.ifSO) THEN +C If SO is taken into account, orbital+spin space is considered. + ALLOCATE(spinrot(1:2,1:2)) + spinrot(:,:)=0.d0 + spinrot(1,1)=1.d0 + spinrot(2,2)=1.d0 +C Printing the number of irep in the considered basis and the size of each irep +C in the considered basis (in this case, it's 1 and 2.) + WRITE(ouctqmc,*) 1, 2 +C Printing the transformation matrix + DO m=1,2 + WRITE(ouctqmc,*) REAL(spinrot(m,1:2)) + ENDDO + DO m=1,2 + WRITE(ouctqmc,*) AIMAG(spinrot(m,1:2)) + ENDDO +C + DEALLOCATE(spinrot) + ELSE +C Without SO, only the matrix in orbital space is necessary. +C Printing the number of irep in the considered basis and the size of each irep +C in the considered basis (in this case, it's 1 and 1.) + WRITE(ouctqmc,'(2(i6,x))') 1, 1 +C Printing the transformation matrix + WRITE(ouctqmc,*) 1.d0 + WRITE(ouctqmc,*) 0.d0 + ENDIF +C +C If the basis representation needs a complete spinor rotation approach (basis with "mixing" ). +C --------------------------------------------------------------------------------------------- + ELSEIF (reptrans(l,isrt)%ifmixing) THEN +C In this case, the SO is necessary considered, spinor rotation matrices are used. + IF (crorb(icrorb)%ifsplit) THEN + WRITE(ouctqmc,'(15(i6,x))') reptrans(l,isrt)%nreps, + & reptrans(l,isrt)%dreps(1:reptrans(l,isrt)%nreps) + ELSE + WRITE(ouctqmc,'(2(i6,x))') 1, 2*(2*l+1) + ENDIF + DO m=1,2*(2*l+1) + WRITE(ouctqmc,*) REAL(reptrans(l,isrt)% + & transmat(m,1:2*(2*l+1)) ) + ENDDO + DO m=1,2*(2*l+1) + WRITE(ouctqmc,*) AIMAG(reptrans(l,isrt)% + & transmat(m,1:2*(2*l+1)) ) + ENDDO +C +C If the basis representation can be reduce to the up/up block (basis without "mixing"). +C -------------------------------------------------------------------------------------- + ELSE + IF (ifSP.AND.ifSO) THEN +C If SO is taken into account, orbital+spin space is considered. + ALLOCATE(spinrot(1:2*(2*l+1),1:2*(2*l+1))) + spinrot(:,:)=0.d0 + spinrot(1:2*l+1,1:2*l+1)= + & reptrans(l,isrt)%transmat(-l:l,-l:l) + spinrot(2*l+2:2*(2*l+1),2*l+2:2*(2*l+1))= + & reptrans(l,isrt)%transmat(-l:l,-l:l) +C Printing the number of irep in the considered basis and the size of each irep +C in the considered basis (in this case, it's 1 and 2*(2*l+1).) + WRITE(ouctqmc,*) 1, 2*(2*l+1) +C Printing the transformation matrix + DO m=1,2*(2*l+1) + WRITE(ouctqmc,*) REAL(spinrot(m,1:2*(2*l+1)) ) + ENDDO + DO m=1,2*(2*l+1) + WRITE(ouctqmc,*) AIMAG(spinrot(m,1:2*(2*l+1)) ) + ENDDO +C + DEALLOCATE(spinrot) +C Without SO, only the rotation matrix in orbital space is necessary. + ELSE + IF (crorb(icrorb)%ifsplit) THEN + WRITE(ouctqmc,'(8(i6,x))') reptrans(l,isrt)%nreps, + & reptrans(l,isrt)%dreps(1:reptrans(l,isrt)%nreps) + ELSE + WRITE(ouctqmc,'(2(i6,x))') 1, 2*l+1 + ENDIF + DO m=-l,l + WRITE(ouctqmc,*) REAL(reptrans(l,isrt)% + & transmat(m,-l:l) ) + ENDDO + DO m=-l,l + WRITE(ouctqmc,*) AIMAG(reptrans(l,isrt)% + & transmat(m,-l:l) ) + END DO + END IF ! End of the ifSO if-then-else + END IF ! End of the ifmixing if-then-else + END IF ! End of the iffirst if-then-else + END DO ! End of the icrorb loop +C for each correlated orbital icrorb, the basis transformation is described by : +C - the number of irep in the new basis +C - the dimension of each irep in the new basis +C - the real part of the basis transformation +C - the imaginary part of the basis transformation +C +C ------------------------------------------------------------------------- +C Description of the number of bands in the energy window at each k_point : +C ------------------------------------------------------------------------- +C + DO is=1,ns +C If SO is considered, the number of up and dn bands are the same. + IF ((ifSP.AND.ifSO).and.(is.eq.2)) cycle +C Printing the number of included bands in the window for each k_point + DO ik=1,nk + WRITE(ouctqmc,'(i6)') + & ABS(kp(ik,is)%nb_top-kp(ik,is)%nb_bot+1) + ENDDO + ENDDO +C +C ----------------------------------------------------------- +C Description of the projectors for the correlated orbitals : +C ----------------------------------------------------------- + DO ik=1,nk + DO icrorb=1,ncrorb + l=crorb(icrorb)%l + isrt=crorb(icrorb)%sort +C +C The case l=0 is a particular case of "non-mixing" basis. +C -------------------------------------------------------- + IF (l==0) THEN +C For the s-orbitals, the only irep possible is the matrix itself. +C if the calculation is spin-polarized, up and dn projectors are written the one above the other (orbital+spin-space of size 2) + DO is=1,ns + WRITE(ouctqmc,*) + & REAL(pr_crorb(icrorb,ik,is)%mat_rep(1, + & kp(ik,is)%nb_bot:kp(ik,is)%nb_top)) + ENDDO + DO is=1,ns + WRITE(ouctqmc,*) + & AIMAG(pr_crorb(icrorb,ik,is)%mat_rep(1, + & kp(ik,is)%nb_bot:kp(ik,is)%nb_top)) + ENDDO +C +C If the basis representation needs a complete spinor rotation approach (basis with "mixing" ). +C --------------------------------------------------------------------------------------------- + ELSEIF (reptrans(l,isrt)%ifmixing) THEN +C In this case, the calculation is necessary spin-polarized with SO, spinor rotation matrices are used. + IF(crorb(icrorb)%ifsplit) THEN +C If only 1 irep is correlated + ind1=1 + DO irep=1,reptrans(l,isrt)%nreps + IF(crorb(icrorb)%correp(irep)) THEN + ind2=ind1+reptrans(l,isrt)%dreps(irep)-1 + DO m=ind1,ind2 + WRITE(ouctqmc,*) + & REAL(pr_crorb(icrorb,ik,1)%mat_rep(m, + & kp(ik,1)%nb_bot:kp(ik,1)%nb_top)) + ENDDO + DO m=ind1,ind2 + WRITE(ouctqmc,*) + & AIMAG(pr_crorb(icrorb,ik,1)%mat_rep(m, + & kp(ik,1)%nb_bot:kp(ik,1)%nb_top)) + ENDDO + ENDIF + ind1=ind1+reptrans(l,isrt)%dreps(irep) + ENDDO + ELSE +C If no particular irep is correlated + DO m=1,2*(2*l+1) + WRITE(ouctqmc,*) + & REAL(pr_crorb(icrorb,ik,1)%mat_rep(m, + & kp(ik,1)%nb_bot:kp(ik,1)%nb_top)) + ENDDO + DO m=1,2*(2*l+1) + WRITE(ouctqmc,*) + & AIMAG(pr_crorb(icrorb,ik,1)%mat_rep(m, + & kp(ik,1)%nb_bot:kp(ik,1)%nb_top)) + ENDDO + ENDIF +C +C If the basis representation can be reduce to the up/up block (basis without "mixing"). +C -------------------------------------------------------------------------------------- + ELSE + IF ((.not.(ifSP.AND.ifSO)).AND.crorb(icrorb)%ifsplit) THEN +C If only 1 irep is correlated (case without SO) + ind1=-l + DO irep=1,reptrans(l,isrt)%nreps + IF(crorb(icrorb)%correp(irep)) THEN + ind2=ind1+reptrans(l,isrt)%dreps(irep)-1 + DO is=1,ns + DO m=ind1,ind2 + WRITE(ouctqmc,*) + & REAL(pr_crorb(icrorb,ik,is)%mat_rep(m, + & kp(ik,is)%nb_bot:kp(ik,is)%nb_top)) + ENDDO + ENDDO + DO is=1,ns + DO m=ind1,ind2 + WRITE(ouctqmc,*) + & AIMAG(pr_crorb(icrorb,ik,is)%mat_rep(m, + & kp(ik,is)%nb_bot:kp(ik,is)%nb_top)) + ENDDO + ENDDO + ENDIF + ind1=ind1+reptrans(l,isrt)%dreps(irep) + ENDDO + ELSE +C If no particular irep is correlated (case with and without SO) + DO is=1,ns + DO m=-l,l + WRITE(ouctqmc,*) + & REAL(pr_crorb(icrorb,ik,is)%mat_rep(m, + & kp(ik,is)%nb_bot:kp(ik,is)%nb_top)) + ENDDO + ENDDO + DO is=1,ns + DO m=-l,l + WRITE(ouctqmc,*) + & AIMAG(pr_crorb(icrorb,ik,is)%mat_rep(m, + & kp(ik,is)%nb_bot:kp(ik,is)%nb_top)) + ENDDO + ENDDO + END IF ! End of the ifsplit if-then-else + END IF ! End of the ifmixing if-then-else + END DO ! End of the icrorb loop + END DO ! End of the ik loop +C for each k-point and each correlated orbital, the corresponding projector is described by : +C - the real part of the "correlated" submatrix +C - the imaginary part of the "correlated" submatrix +C +C ---------------------------------------------------------------------------- +C Description of the weight of each k_point for the simple point integration : +C ---------------------------------------------------------------------------- + DO ik=1,nk + WRITE(ouctqmc,*) kp(ik,1)%weight +C This is a geometrical factor independent of the spin value. + ENDDO +C +C ----------------------------------------------------- +C Description of the Hamiltonian H(k) at each k_point : +C ----------------------------------------------------- + DO is=1,ns + DO ik=1,nk +C If the calculation is spin-polarized with SO, the numbers for up and dn bands are the same. + IF ((ifSP.AND.ifSO).AND.(is.eq.2)) cycle + DO ib=kp(ik,is)%nb_bot,kp(ik,is)%nb_top + WRITE(ouctqmc,*) kp(ik,is)%eband(ib) + ENDDO + ENDDO + ENDDO +C for each spin value is and each k-point, +C - the energies of the band with spin is at point k +C +C +C ====================================== +C Writing the file case.symqmc : +C ====================================== +C + WRITE(buf,'(a)')'Writing the file case.symqmc...' + CALL printout(0) +C +C ---------------------------------------------------------- +C Description of the general informations about the system : +C ---------------------------------------------------------- + WRITE(ousymqmc,'(2(i6,x))') nsym, natom +C nysm is the total number of symmetries in the system +C natom is the total number of atom in the unit cell +C +C ------------------------------------------------------------------- +C Description of the permutation matrix associated to each symmetry : +C ------------------------------------------------------------------- + DO isym=1,nsym + WRITE(ousymqmc,'(100(i6,x))') srot(isym)%perm(1:natom) + ENDDO +C +C ------------------------------------------------------------ +C Description of the time-reversal property for each symmetry : +C ------------------------------------------------------------ + IF (ifSP) THEN + ALLOCATE(timeflag(nsym)) + timeflag=0 + DO isym=1,nsym + IF (srot(isym)%timeinv) timeflag(isym)= 1 + ENDDO + WRITE(ousymqmc,'(100(i6,x))') timeflag(1:nsym) + DEALLOCATE(timeflag) +C When the calculation is spin-polarized (with SO), a flag which states +C if a time reversal operation is included in the transformation isym is written. + ENDIF +C +C ----------------------------------------------------------------------------------------- +C Description of the representation matrices of each symmetry for each correlated orbital : +C ----------------------------------------------------------------------------------------- + DO isym=1,nsym + DO icrorb=1,ncrorb + isrt=crorb(icrorb)%sort + l=crorb(icrorb)%l +C +C The case l=0 is a particular case of "non-mixing" basis. +C -------------------------------------------------------- + IF(l==0) THEN +C For the s-orbitals, the only irep possible is the matrix itself. + IF (ifSP.AND.ifSO) THEN +C If SO is taken into account, spinor rotation matrix is considered. + ALLOCATE(spinrot(1:2,1:2)) + spinrot(:,:)=0.d0 + IF (srot(isym)%timeinv) THEN +C In this case, the Euler angle Beta is Pi. The spinor rotation matrix is block-diagonal, +C since the time-reversal operator is included in the definition of the transformation. +C + factor=srot(isym)%phase/2.d0 +C We remind that the field phase is (g-a) if beta=Pi. +C Up/up and Dn/dn terms + spinrot(1,1)=EXP(CMPLX(0.d0,factor)) + spinrot(2,2)=CONJG(spinrot(1,1)) +C spinrot(1,1) = -exp(+i(alpha-gamma)/2) ; spinrot(2,2) = -exp(-i(alpha-gamma)/2) +C in good agreement with Wien conventions for the definition of this phase factor. + ELSE +C In this case, the Euler angle Beta is 0. The spinor rotation matrix is block-diagonal, +C No time-reversal treatment was applied to the transformation. +C + factor=srot(isym)%phase/2.d0 +C We remind that the field phase is (a+g) if beta=0. +C Up/up and Dn/dn terms + spinrot(1,1)=EXP(CMPLX(0.d0,factor)) + spinrot(2,2)=CONJG(spinrot(1,1)) +C the field phase is 2pi-(alpha+gamma) in this case. +C spinrot(1,1) = -exp(-i(alpha+gamma)/2) ; spinrot(2,2) = -exp(i(alpha-gamma)/2) +C in good agreement with Wien conventions for the definition of this phase factor. + END IF +C Printing the transformation informations + DO m=1,2 + WRITE(ousymqmc,*) REAL(spinrot(m,1:2)) + ENDDO + DO m=1,2 + WRITE(ousymqmc,*) AIMAG(spinrot(m,1:2)) + ENDDO +C + DEALLOCATE(spinrot) +C Without SO, only the rotation matrix in orbital space is necessary. + ELSE +C In this case, the Rloc matrix is merely identity. + WRITE(ousymqmc,*) 1.d0 + WRITE(ousymqmc,*) 0.d0 + ENDIF +C +C If the basis representation needs a complete spinor rotation approach (basis with "mixing" ). +C --------------------------------------------------------------------------------------------- + ELSEIF (reptrans(l,isrt)%ifmixing) THEN +C In this case, the SO is necessary considered, spinor rotation matrices are used. + IF(crorb(icrorb)%ifsplit) THEN +C If only an irep is correlated + ind1=1 + DO irep=1,reptrans(l,isrt)%nreps + IF(crorb(icrorb)%correp(irep)) THEN + ind2=ind1+reptrans(l,isrt)%dreps(irep)-1 + DO m=ind1,ind2 + WRITE(ousymqmc,*) REAL(srot(isym)% + & rotrep(l,isrt)%mat(m,ind1:ind2)) + ENDDO + DO m=ind1,ind2 + WRITE(ousymqmc,*)AIMAG(srot(isym)% + & rotrep(l,isrt)%mat(m,ind1:ind2)) + ENDDO + ENDIF + ind1=ind1+reptrans(l,isrt)%dreps(irep) + ENDDO + ELSE +C If no particular irep is correlated + DO m=1,2*(2*l+1) + WRITE(ousymqmc,*) REAL(srot(isym)% + & rotrep(l,isrt)%mat(m,1:2*(2*l+1))) + ENDDO + DO m=1,2*(2*l+1) + WRITE(ousymqmc,*) AIMAG(srot(isym)% + & rotrep(l,isrt)%mat(m,1:2*(2*l+1))) + ENDDO + ENDIF +C +C If the basis representation can be reduce to the up/up block (basis without "mixing"). +C -------------------------------------------------------------------------------------- + ELSE + IF (ifSP.AND.ifSO) THEN +C If the calculation is spin-polarized with SO, spinor rotation matrices are considered. +C The spin is not a good quantum number, so the whole representation is used. + ALLOCATE(spinrot(1:2*(2*l+1),1:2*(2*l+1))) + spinrot(:,:)=0.d0 + IF (srot(isym)%timeinv) THEN +C In this case, the Euler angle Beta is Pi. The spinor rotation matrix is block-diagonal, +C since the time-reversal operator is included in the definition of the transformation. +C + factor=srot(isym)%phase/2.d0 +C We remind that the field phase is (g-a) in this case. +C Up/up block : + ephase=EXP(CMPLX(0.d0,factor)) +C As a result, ephase = -exp(i(alpha-gamma)/2) + spinrot(1:2*l+1,1:2*l+1)= + = ephase*srot(isym)%rotrep(l,isrt)%mat(-l:l,-l:l) +C Dn/dn block : + ephase=CONJG(ephase) +C Now, ephase = -exp(-i(alpha-gamma)/2) + spinrot(2*l+2:2*(2*l+1),2*l+2:2*(2*l+1))= + = ephase*srot(isym)%rotrep(l,isrt)%mat(-l:l,-l:l) + ELSE +C In this case, the Euler angle Beta is 0. The spinor rotation matrix is block-diagonal, +C No time-reversal treatment was applied to the transformation. +C + factor=srot(isym)%phase/2.d0 +C We remind that the field phase is (a+g) in this case. +C Up/up block : + ephase=EXP(CMPLX(0.d0,factor)) +C As a result, ephase = -exp(-i(alpha+gamma)/2) + spinrot(1:2*l+1,1:2*l+1)= + = ephase*srot(isym)%rotrep(l,isrt)%mat(-l:l,-l:l) +C Dn/dn block : + ephase=CONJG(ephase) +C Now, ephase = -exp(i(alpha+gamma)/2) + spinrot(2*l+2:2*(2*l+1),2*l+2:2*(2*l+1))= + = ephase*srot(isym)%rotrep(l,isrt)%mat(-l:l,-l:l) + END IF +C Printing the transformation informations + DO m=1,2*(2*l+1) + WRITE(ousymqmc,*) REAL(spinrot(m,1:2*(2*l+1)) ) + ENDDO + DO m=1,2*(2*l+1) + WRITE(ousymqmc,*) AIMAG(spinrot(m,1:2*(2*l+1)) ) + ENDDO +C + DEALLOCATE(spinrot) +C In the other cases (spin-polarized without SO or paramagnetic), only the rotation matrix in orbital space is necessary. + ELSE + IF(crorb(icrorb)%ifsplit) THEN +C If only an irep is correlated + ind1=-l + DO irep=1,reptrans(l,isrt)%nreps + IF(crorb(icrorb)%correp(irep)) THEN + ind2=ind1+reptrans(l,isrt)%dreps(irep)-1 + DO m=ind1,ind2 + WRITE(ousymqmc,*) REAL(srot(isym)% + & rotrep(l,isrt)%mat(m,ind1:ind2)) + ENDDO + DO m=ind1,ind2 + WRITE(ousymqmc,*) AIMAG(srot(isym)% + & rotrep(l,isrt)%mat(m,ind1:ind2)) + ENDDO + ENDIF + ind1=ind1+reptrans(l,isrt)%dreps(irep) + ENDDO + ELSE +C If no particular irep is correlated + DO m=-l,l + WRITE(ousymqmc,*) REAL(srot(isym)% + & rotrep(l,isrt)%mat(m,-l:l)) + ENDDO + DO m=-l,l + WRITE(ousymqmc,*) AIMAG(srot(isym)% + & rotrep(l,isrt)%mat(m,-l:l)) + ENDDO + END IF ! End of the ifsplit if-then-else + END IF ! End of the ifSO if-then-else + END IF ! End of the ifmixing if-then-else + END DO ! End of the icrorb loop + END DO ! End of the isym loop +C for each symmetry and each correlated orbital icrorb, is described : +C - the real part of the submatrix associated to "isym" for the "icrorb" +C - the imaginary part of the submatrix associated to "isym" for the "icrorb" +C +C ----------------------------------------------------------------------- +C Description of the time reversal operator for each correlated orbital : +C ----------------------------------------------------------------------- +C This description occurs only if the computation is paramagnetic. (ifSP=0) + IF (.not.ifSP) THEN + DO icrorb=1,ncrorb + l=crorb(icrorb)%l + isrt=crorb(icrorb)%sort +C +C The case l=0 is a particular case of "non-mixing" basis. +C -------------------------------------------------------- + IF (l==0) THEN +C For the s-orbitals, the only basis considered is the complex basis. + WRITE(ousymqmc,*) 1.d0 + WRITE(ousymqmc,*) 0.d0 +C +C If the basis representation can be reduce to the up/up block (basis without "mixing"). +C -------------------------------------------------------------------------------------- + ELSE +C Calculation of the time-reversal operator + ALLOCATE(time_op(-l:l,-l:l)) + time_op(:,:)=0.d0 + DO m=-l,l + time_op(m,m)=1.d0 + ENDDO +C time_op is Identity. + CALL timeinv_op(time_op,(2*l+1),l,isrt) +C time_op is now the time-reversal operator in the desired basis ({new_i}) +C + IF(crorb(icrorb)%ifsplit) THEN +C If only an irep is correlated + ind1=-l + DO irep=1,reptrans(l,isrt)%nreps + IF(crorb(icrorb)%correp(irep)) THEN + ind2=ind1+reptrans(l,isrt)%dreps(irep)-1 + DO m=ind1,ind2 + WRITE(ousymqmc,*) REAL(time_op(m,ind1:ind2)) + ENDDO + DO m=ind1,ind2 + WRITE(ousymqmc,*) AIMAG(time_op(m,ind1:ind2)) + ENDDO + ENDIF + ind1=ind1+reptrans(l,isrt)%dreps(irep) + ENDDO + ELSE +C If no particular irep is correlated + DO m=-l,l + WRITE(ousymqmc,*) REAL(time_op(m,-l:l)) + ENDDO + DO m=-l,l + WRITE(ousymqmc,*) AIMAG(time_op(m,-l:l)) + ENDDO + END IF ! End of the ifsplit if-then-else + DEALLOCATE(time_op) + END IF ! End of the l if-then-else + END DO ! End of the icrorb loop + END IF ! End of the ifsp if-then-else +C for each correlated orbital icrorb, the time-reversal operator is described by : +C - its real part +C - its imaginary part +C +C +C =============================== +C Writing the file case.parproj : +C =============================== +C + WRITE(buf,'(a)')'Writing the file case.parproj...' + CALL printout(0) +C +C ---------------------------------------------------------------- +C Description of the size of the basis for each included orbital : +C ---------------------------------------------------------------- + DO iorb=1,norb + WRITE(oupartial,'(3(i6))') norm_radf(iorb)%n + ENDDO +C There is not more than 1 LO for each orbital (hence n < 4 ) +C +C The following descriptions are made for each included orbital. + DO iorb=1,norb + l=orb(iorb)%l + isrt=orb(iorb)%sort +C ------------------------------------ +C Description of the Theta projector : +C ------------------------------------ +C +C The case l=0 is a particular case of "non-mixing" basis. +C -------------------------------------------------------- + IF (l==0) THEN + DO ik=1,nk + DO ir=1,norm_radf(iorb)%n + DO is=1,ns + WRITE(oupartial,*) + & REAL(pr_orb(iorb,ik,is)%matn_rep(1, + & kp(ik,is)%nb_bot:kp(ik,is)%nb_top,ir)) + ENDDO + DO is=1,ns + WRITE(oupartial,*) + & AIMAG(pr_orb(iorb,ik,is)%matn_rep(1, + & kp(ik,is)%nb_bot:kp(ik,is)%nb_top,ir)) + ENDDO + ENDDO ! End of the ir loop + ENDDO ! End of the ik loop +C +C If the basis representation needs a complete spinor rotation approach (basis with "mixing" ). +C --------------------------------------------------------------------------------------------- + ELSEIF (reptrans(l,isrt)%ifmixing) THEN +C In this case, the calculation is necessary spin-polarized with SO, spinor rotation matrices are used. + DO ik=1,nk + DO ir=1,norm_radf(iorb)%n + DO m=1,2*(2*l+1) + WRITE(oupartial,*) + & REAL(pr_orb(iorb,ik,1)%matn_rep(m, + & kp(ik,1)%nb_bot:kp(ik,1)%nb_top,ir)) + ENDDO + DO m=1,2*(2*l+1) + WRITE(oupartial,*) + & AIMAG(pr_orb(iorb,ik,1)%matn_rep(m, + & kp(ik,1)%nb_bot:kp(ik,1)%nb_top,ir)) + ENDDO + ENDDO ! End of the ir loop + ENDDO ! End of the ik loop +C +C If the basis representation can be reduce to the up/up block (basis without "mixing"). +C -------------------------------------------------------------------------------------- + ELSE + DO ik=1,nk + DO ir=1,norm_radf(iorb)%n + DO is=1,ns + DO m=-l,l + WRITE(oupartial,*) + & REAL(pr_orb(iorb,ik,is)%matn_rep(m, + & kp(ik,is)%nb_bot:kp(ik,is)%nb_top,ir)) + ENDDO + ENDDO ! End of the is loop + DO is=1,ns + DO m=-l,l + WRITE(oupartial,*) + & AIMAG(pr_orb(iorb,ik,is)%matn_rep(m, + & kp(ik,is)%nb_bot:kp(ik,is)%nb_top,ir)) + ENDDO + ENDDO ! End of the is loop + ENDDO ! End of the ir loop + ENDDO ! End of the ik loop + ENDIF ! End of the ifmixing if-then-else +C for each included orbital, for each k-point and each |phi_j> elmt, +C the corresponding Thetaprojector is described by : +C - the real part of the matrix +C - the imaginary part of the matrix +C +C ------------------------------------------------------------------------------- +C Description of the density matrices below the lower limit e_bot of the window : +C ------------------------------------------------------------------------------- +C +C The case l=0 is a particular case of "non-mixing" basis. +C -------------------------------------------------------- + IF (l==0) THEN +C With SO, the density matrix is printed for the complete spin+orbital subspace. +C (in this case, this means a matrix of size 2) + IF (ifSP.AND.ifSO) THEN + ALLOCATE(densprint(2,2)) + densprint(1,1)=densmat(1,iorb)%mat(1,1) + densprint(2,2)=densmat(2,iorb)%mat(1,1) + densprint(1,2)=densmat(3,iorb)%mat(1,1) + densprint(2,1)=densmat(4,iorb)%mat(1,1) + DO m=1,2 + WRITE(oupartial,*) REAL(densprint(m,1:2)) + ENDDO + DO m=1,2 + WRITE(oupartial,*) AIMAG(densprint(m,1:2)) + ENDDO + DEALLOCATE(densprint) +C In the other cases the density matrix is printed for each spin subspace independently. +C (in this case, this means two matrices of size 1) + ELSE + DO is=1,ns + WRITE(oupartial,*) REAL(densmat(is,iorb)%mat(1,1)) + ENDDO + DO is=1,ns + WRITE(oupartial,*) AIMAG(densmat(is,iorb)%mat(1,1)) + ENDDO + ENDIF ! End of the ifSO if-then-else +C +C If the basis representation needs a complete spinor rotation approach (basis with "mixing" ). +C --------------------------------------------------------------------------------------------- + ELSEIF (reptrans(l,isrt)%ifmixing) THEN +C In this case, the calculation is necessary spin-polarized with SO, spinor rotation matrices are used. +C As a result, the density matrix is printed for the complete spin+orbital subspace. +C (this means a matrix of size 2*(2*l+1)) + DO m=1,2*(2*l+1) + WRITE(oupartial,*) + & REAL(densmat(1,iorb)%mat(m,1:2*(2*l+1))) + ENDDO + DO m=1,2*(2*l+1) + WRITE(oupartial,*) + & AIMAG(densmat(1,iorb)%mat(m,1:2*(2*l+1))) + ENDDO +C +C If the basis representation can be reduce to the up/up block (basis without "mixing"). +C -------------------------------------------------------------------------------------- + ELSE +C With SO, the density matrix is printed for the complete spin+orbital subspace. +C (this means a matrix of size 2*(2*l+1)) + IF (ifSP.AND.ifSO) THEN + ALLOCATE(densprint(1:2*(2*l+1),1:2*(2*l+1))) + densprint(1:2*l+1,1:2*l+1)= + & densmat(1,iorb)%mat(-l:l,-l:l) + densprint(2*l+2:2*(2*l+1),2*l+2:2*(2*l+1))= + & densmat(2,iorb)%mat(-l:l,-l:l) + densprint(1:2*l+1,2*l+2:2*(2*l+1))= + & densmat(3,iorb)%mat(-l:l,-l:l) + densprint(2*l+2:2*(2*l+1),1:2*l+1)= + & densmat(4,iorb)%mat(-l:l,-l:l) + DO m=1,2*(2*l+1) + WRITE(oupartial,*) REAL(densprint(m,1:2*(2*l+1))) + ENDDO + DO m=1,2*(2*l+1) + WRITE(oupartial,*) AIMAG(densprint(m,1:2*(2*l+1))) + ENDDO + DEALLOCATE(densprint) +C In the other cases, the density matrix is printed for each spin subspace independently. +C (this means two matrices of size 2*l+1) + ELSE + DO is=1,ns + DO m=-l,l + WRITE(oupartial,*) + & REAL(densmat(is,iorb)%mat(m,-l:l)) + ENDDO + ENDDO + DO is=1,ns + DO m=-l,l + WRITE(oupartial,*) + & AIMAG(densmat(is,iorb)%mat(m,-l:l)) + ENDDO + ENDDO + ENDIF ! End of the ifSO if-then-else + ENDIF ! End of the ifmixing if-then-else +C for each included orbital, the corresponding density matrix is described by : +C - the real part of the matrix +C - the imaginary part of the matrix +C +C -------------------------------------------------------------------- +C Description of the global to local coordinates transformation Rloc : +C -------------------------------------------------------------------- +C Description of each transformation Rloc + iatom=orb(iorb)%atom +C +C The case l=0 is a particular case of "non-mixing" basis. +C -------------------------------------------------------- + IF(l==0) THEN +C For the s-orbitals, the only irep possible is the matrix itself. + IF (ifSP.AND.ifSO) THEN +C If SO is taken into account, spinor rotation matrix must be considered. + ALLOCATE(spinrot(1:2,1:2)) + spinrot(:,:)=0.d0 +C The spinor-rotation matrix is directly calculated from the Euler angles a,b and c. + IF (rotloc(iatom)%timeinv) THEN + factor=(rotloc(iatom)%a+rotloc(iatom)%g)/2.d0 + spinrot(2,1)=EXP(CMPLX(0.d0,factor))* + & DCOS(rotloc(iatom)%b/2.d0) + spinrot(1,2)=-CONJG(spinrot(2,1)) +C Up/dn and Dn/up terms + factor=-(rotloc(iatom)%a-rotloc(iatom)%g)/2.d0 + spinrot(2,2)=-EXP(CMPLX(0.d0,factor))* + & DSIN(rotloc(iatom)%b/2.d0) + spinrot(1,1)=CONJG(spinrot(2,2)) + ELSE + factor=(rotloc(iatom)%a+rotloc(iatom)%g)/2.d0 + spinrot(1,1)=EXP(CMPLX(0.d0,factor))* + & DCOS(rotloc(iatom)%b/2.d0) + spinrot(2,2)=CONJG(spinrot(1,1)) +C Up/dn and Dn/up terms + factor=-(rotloc(iatom)%a-rotloc(iatom)%g)/2.d0 + spinrot(1,2)=EXP(CMPLX(0.d0,factor))* + & DSIN(rotloc(iatom)%b/2.d0) + spinrot(2,1)=-CONJG(spinrot(1,2)) + ENDIF +C Printing the transformation informations + DO m=1,2 + WRITE(oupartial,*) REAL(spinrot(m,1:2)) + ENDDO + DO m=1,2 + WRITE(oupartial,*) AIMAG(spinrot(m,1:2)) + ENDDO + DEALLOCATE(spinrot) +C Without SO, only the rotation matrix in orbital space is necessary. + ELSE +C In this case, the Rloc matrix is merely identity. + WRITE(oupartial,*) 1.d0 + WRITE(oupartial,*) 0.d0 + ENDIF +C Printing the time inversion flag if the calculation is spin-polarized (ifSP=1) + IF (ifSP) THEN + timeinvflag=0 + IF (rotloc(iatom)%timeinv) timeinvflag=1 + WRITE(oupartial,'(i6)') timeinvflag + ENDIF +C +C If the basis representation needs a complete spinor rotation approach (basis with "mixing" ). +C --------------------------------------------------------------------------------------------- + ELSEIF (reptrans(l,isrt)%ifmixing) THEN +C In this case, the calculation is necessary spin-polarized with SO, spinor rotation matrices are used. + DO m=1,2*(2*l+1) + WRITE(oupartial,*) REAL(rotloc(iatom)% + & rotrep(l)%mat(m,1:2*(2*l+1))) + ENDDO + DO m=1,2*(2*l+1) + WRITE(oupartial,*) AIMAG(rotloc(iatom)% + & rotrep(l)%mat(m,1:2*(2*l+1))) + ENDDO +C Printing if the transforamtion included a time-reversal operation. + timeinvflag =0 + IF (rotloc(iatom)%timeinv) timeinvflag=1 + WRITE(oupartial,'(i6)') timeinvflag +C +C If the basis representation can be reduce to the up/up block (basis without "mixing"). +C -------------------------------------------------------------------------------------- + ELSE + IF (ifSP.AND.ifSO) THEN +C If SO is taken into account, spinor rotation matrices are considered. +C The spin is not a good quantum number, so the whole representation is used. + DO m=1,2*(2*l+1) + WRITE(oupartial,*) REAL(rotloc(iatom)% + & rotrep(l)%mat(m,1:2*(2*l+1))) + ENDDO + DO m=1,2*(2*l+1) + WRITE(oupartial,*) AIMAG(rotloc(iatom)% + & rotrep(l)%mat(m,1:2*(2*l+1))) + ENDDO + ELSE +C The calculation is either spin-polarized without SO or paramagnetic. +C The spin is a good quantum number and irep are possible. + DO m=-l,l + WRITE(oupartial,*) REAL(rotloc(iatom)% + & rotrep(l)%mat(m,-l:l)) + ENDDO + DO m=-l,l + WRITE(oupartial,*) AIMAG(rotloc(iatom)% + & rotrep(l)%mat(m,-l:l)) + ENDDO + END IF ! End of the ifSO if-then-else +C Printing if the transformation included a time-reversal operation. + IF (ifSP) THEN + timeinvflag =0 + IF (rotloc(iatom)%timeinv) timeinvflag=1 + WRITE(oupartial,'(i6)') timeinvflag + END IF + END IF ! End of the ifmixing if-then-else +C for each included orbital iorb, the transformation Rloc is described by : +C - the real part of the submatrix associated to "iorb" +C - the imaginary part of the submatrix associated to "iorb" +C - a flag which states if a time reversal operation is included in the transformation (if SP only ) +C + END DO ! End of the iorb loop +C +C +C ============================== +C Writing the file case.sympar : +C ============================== +C + WRITE(buf,'(a)')'Writing the file case.sympar...' + CALL printout(0) +C +C ---------------------------------------------------------- +C Description of the general informations about the system : +C ---------------------------------------------------------- + WRITE(ousympar,'(2(i6,x))') nsym, natom +C nysm is the total number of symmetries of the system +C natom is the total number of atom in the unit cell +C +C ------------------------------------------------------------------- +C Description of the permutation matrix associated to each symmetry : +C ------------------------------------------------------------------- + DO is=1,nsym + WRITE(ousympar,'(100(i6,x))') srot(is)%perm + ENDDO +C +C ------------------------------------------------------------ +C Description of the time-reversal property for each symmetry : +C ------------------------------------------------------------ + IF (ifSP) THEN + ALLOCATE(timeflag(nsym)) + timeflag=0 + DO isym=1,nsym + IF (srot(isym)%timeinv) timeflag(isym)= 1 + ENDDO + WRITE(ousympar,'(100(i6,x))') timeflag(1:nsym) + DEALLOCATE(timeflag) +C When the calculation is spin-polarized (with SO), a flag which states +C if a time reversal operation is included in the transformation isym is written. + ENDIF +C +C ------------------------------------------------------------------------------------------- +C Description of the representation matrices of each symmetry for all the included orbitals : +C ------------------------------------------------------------------------------------------- + DO isym=1,nsym + DO iorb=1,norb + isrt=orb(iorb)%sort + l=orb(iorb)%l +C +C The case l=0 is a particular case of "non-mixing" basis. +C -------------------------------------------------------- + IF(l==0) THEN +C For the s-orbitals, the only irep possible is the matrix itself. + IF (ifSP.AND.ifSO) THEN +C If SO is taken into account, spinor rotation matrix is considered. + ALLOCATE(spinrot(1:2,1:2)) + spinrot(:,:)=0.d0 + IF (srot(isym)%timeinv) THEN +C In this case, the Euler angle Beta is Pi. The spinor rotation matrix is block-diagonal, +C since the time-reversal operator is included in the definition of the transformation. +C + factor=srot(isym)%phase/2.d0 +C We remind that the field phase is (g-a) if beta=Pi. +C Up/up and Dn/dn terms + spinrot(1,1)=EXP(CMPLX(0.d0,factor)) + spinrot(2,2)=CONJG(spinrot(1,1)) +C spinrot(1,1) = -exp(i(alpha-gamma)/2) ; spinrot(2,2) = -exp(-i(alpha-gamma)/2) +C in good agreement with Wien conventions for the definition of this phase factor. + ELSE +C In this case, the Euler angle Beta is 0. The spinor rotation matrix is block-diagonal, +C No time-reversal treatment was applied to the transformation. +C + factor=srot(isym)%phase/2.d0 +C We remind that the field phase is (a+g) if beta=0. +C Up/up and Dn/dn terms + spinrot(1,1)=EXP(CMPLX(0.d0,factor)) + spinrot(2,2)=CONJG(spinrot(1,1)) +C spinrot(1,1) = -exp(-i(alpha+gamma)/2) ; spinrot(2,2) = -exp(i(alpha-gamma)/2) +C in good agreement with Wien conventions for the definition of this phase factor. + END IF +C Printing the transformation informations + DO m=1,2 + WRITE(ousympar,*) REAL(spinrot(m,1:2)) + ENDDO + DO m=1,2 + WRITE(ousympar,*) AIMAG(spinrot(m,1:2)) + ENDDO +C + DEALLOCATE(spinrot) +C Without SO, only the rotation matrix in orbital space is necessary. + ELSE +C In this case, the Rloc matrix is merely identity. + WRITE(ousympar,*) 1.d0 + WRITE(ousympar,*) 0.d0 + ENDIF +C +C If the basis representation needs a complete spinor rotation approach (basis with "mixing" ). +C --------------------------------------------------------------------------------------------- + ELSEIF (reptrans(l,isrt)%ifmixing) THEN +C In this case, the SO is necessary considered, spinor rotation matrices are used. + DO m=1,2*(2*l+1) + WRITE(ousympar,*) REAL(srot(isym)% + & rotrep(l,isrt)%mat(m,1:2*(2*l+1))) + ENDDO + DO m=1,2*(2*l+1) + WRITE(ousympar,*) AIMAG(srot(isym)% + & rotrep(l,isrt)%mat(m,1:2*(2*l+1))) + ENDDO +C +C If the basis representation can be reduce to the up/up block (basis without "mixing"). +C -------------------------------------------------------------------------------------- + ELSE + IF (ifSP.AND.ifSO) THEN +C If the calculation is spin-polarized with SO, spinor rotation matrices are considered. +C The spin is not a good quantum number, so the whole representation is used. + ALLOCATE(spinrot(1:2*(2*l+1),1:2*(2*l+1))) + spinrot(:,:)=0.d0 + IF (srot(isym)%timeinv) THEN +C In this case, the Euler angle Beta is Pi. The spinor rotation matrix is block-diagonal, +C since the time-reversal operator is included in the definition of the transformation. +C + factor=srot(isym)%phase/2.d0 +C We remind that the field phase is (g-a) in this case. +C Up/up block : + ephase=EXP(CMPLX(0.d0,factor)) +C AS a result, ephase = -exp(i(alpha-gamma)/2) + spinrot(1:2*l+1,1:2*l+1)= + = ephase*srot(isym)%rotrep(l,isrt)%mat(-l:l,-l:l) +C Dn/dn block : + ephase=CONJG(ephase) +C Now, ephase = -exp(-i(alpha-gamma)/2) + spinrot(2*l+2:2*(2*l+1),2*l+2:2*(2*l+1))= + = ephase*srot(isym)%rotrep(l,isrt)%mat(-l:l,-l:l) + ELSE +C In this case, the Euler angle Beta is 0. The spinor rotation matrix is block-diagonal, +C No time-reversal treatment was applied to the transformation. +C + factor=srot(isym)%phase/2.d0 +C We remind that the field phase is 2pi-(alpha+gamma) in this case. +C Up/up block : + ephase=EXP(CMPLX(0.d0,factor)) +C As a result, ephase = -exp(-i(alpha+gamma)/2) + spinrot(1:2*l+1,1:2*l+1)= + = ephase*srot(isym)%rotrep(l,isrt)%mat(-l:l,-l:l) +C Dn/dn block : + ephase=CONJG(ephase) +C Now, ephase = -exp(i(alpha+gamma)/2) + spinrot(2*l+2:2*(2*l+1),2*l+2:2*(2*l+1))= + = ephase*srot(isym)%rotrep(l,isrt)%mat(-l:l,-l:l) + END IF +C Printing the transformation informations + DO m=1,2*(2*l+1) + WRITE(ousympar,*) REAL(spinrot(m,1:2*(2*l+1)) ) + ENDDO + DO m=1,2*(2*l+1) + WRITE(ousympar,*) AIMAG(spinrot(m,1:2*(2*l+1)) ) + ENDDO +C + DEALLOCATE(spinrot) +C In the other cases (spin-polarized without SO or paramagnetic), only the rotation matrix in orbital space is necessary. + ELSE + DO m=-l,l + WRITE(ousympar,*) REAL(srot(isym)% + & rotrep(l,isrt)%mat(m,-l:l)) + ENDDO + DO m=-l,l + WRITE(ousympar,*) AIMAG(srot(isym)% + & rotrep(l,isrt)%mat(m,-l:l)) + ENDDO + END IF ! End of the ifSO if-then-else + END IF ! End of the ifmixing if-then-else + END DO ! End of the iorb loop + END DO ! End of the isym loop +C for each symmetry and each included orbital iorb, is described : +C - the real part of the matrix associated to "isym" for the "iorb" +C - the imaginary part of the matrix associated to "isym" for the "iorb" +C +C --------------------------------------------------------------------- +C Description of the time reversal operator for each included orbital : +C --------------------------------------------------------------------- +C This description occurs only if the computation is paramagnetic (ifSP=0) + IF (.not.ifSP) THEN + DO iorb=1,norb + l=orb(iorb)%l + isrt=orb(iorb)%sort +C +C The case l=0 is a particular case of "non-mixing" basis. +C -------------------------------------------------------- + IF (l==0) THEN +C For the s-orbitals, the only basis considered is the complex basis. + WRITE(ousympar,*) 1.d0 + WRITE(ousympar,*) 0.d0 +C +C If the basis representation can be reduce to the up/up block (basis without "mixing"). +C -------------------------------------------------------------------------------------- + ELSE +C Calculation of the time-reversal operator + ALLOCATE(time_op(-l:l,-l:l)) + time_op(:,:)=0.d0 + DO m=-l,l + time_op(m,m)=1.d0 + ENDDO +C time_op is Identity. + CALL timeinv_op(time_op,(2*l+1),l,isrt) +C time_op is now the time-reversal operator in the desired basis ({new_i}) +C + DO m=-l,l + WRITE(ousympar,*) REAL(time_op(m,-l:l)) + ENDDO + DO m=-l,l + WRITE(ousympar,*) AIMAG(time_op(m,-l:l)) + ENDDO + DEALLOCATE(time_op) + END IF ! End of the l if-then-else + END DO ! End of the icrorb loop + END IF ! End of the ifsp if-then-else +C for each included orbital iorb, the time-reversal operator is described by : +C - its real part +C - its imaginary part +C + RETURN + END + + + diff --git a/fortran/dmftproj/read_k_list.f b/fortran/dmftproj/read_k_list.f new file mode 100644 index 00000000..4cda7076 --- /dev/null +++ b/fortran/dmftproj/read_k_list.f @@ -0,0 +1,98 @@ + +c ****************************************************************************** +c +c TRIQS: a Toolbox for Research in Interacting Quantum Systems +c +c Copyright (C) 2011 by L. Pourovskii, V. Vildosola, C. Martins, M. Aichhorn +c +c TRIQS is free software: you can redistribute it and/or modify it under the +c terms of the GNU General Public License as published by the Free Software +c Foundation, either version 3 of the License, or (at your option) any later +c version. +c +c TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +c WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +c FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +c details. +c +c You should have received a copy of the GNU General Public License along with +c TRIQS. If not, see . +c +c *****************************************************************************/ + + SUBROUTINE read_k_list +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine reads the labels of high-symmetry points %% +C %% along the k-path chosen for plotting the k-resolved spectral %% +C %% function. %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C --------------------------- + USE bands + USE file_names + IMPLICIT NONE + CHARACTER(len=100) :: buf + INTEGER :: ilab, pos, i +C +C ======================================================================== +C Determination of the total number of labels and the number of k-points : +C ======================================================================== + buf=' ' + nlab=0 + pos=0 +C nlab will count the number of labels met. +C pos will count the number of lines +C (which is also the number of k-points along the k-path) + DO WHILE (buf(1:3).NE.'END') + READ(iuklist,'(a)') buf + pos=pos+1 + IF(buf(1:1).NE.' ') THEN + nlab=nlab+1 + ENDIF + ENDDO +C pos is now the number of line of the file. +C nlab is the number of labels, includind the label 'END' +C +C nkband = number of k-points along the k-path. + nkband=pos-1 +C The label 'END' must not be taken into account + nlab=nlab-1 +C The last line of the file case.klist_band contains "END". +C So the while loop can have an end too. +C +C ============================= +C Determination of the labels : +C ============================= + ALLOCATE(labels(nlab)) +C The file case.klist_band is read again. + REWIND(iuklist) + ilab=0 + DO pos=1,nkband + READ(iuklist,'(a)') buf + IF(buf(1:1).NE.' ') THEN + ilab=ilab+1 + labels(ilab)%pos=pos +C labels(ilab)%pos is the number of the corresponding k-point + i=INDEX(buf,' ') +C determination of the size of buf +C (index is a function which finds the index of ' ' in buf) + labels(ilab)%kname=' ' + labels(ilab)%kname(1:i)=buf(1:i) +C labels(ilab)%kname is the corresponding label + ENDIF + ENDDO +C ====================================== +C Printing the labels read for testing : +C ====================================== + WRITE(*,*) nkband + WRITE(*,*)'nlab = ', nlab + DO i=1,nlab + WRITE(*,*) i, labels(i)%pos, labels(i)%kname + ENDDO +C + RETURN + END + diff --git a/fortran/dmftproj/readcomline.f b/fortran/dmftproj/readcomline.f new file mode 100644 index 00000000..60f0675e --- /dev/null +++ b/fortran/dmftproj/readcomline.f @@ -0,0 +1,105 @@ + +c ****************************************************************************** +c +c TRIQS: a Toolbox for Research in Interacting Quantum Systems +c +c Copyright (C) 2011 by L. Pourovskii, V. Vildosola, C. Martins, M. Aichhorn +c +c TRIQS is free software: you can redistribute it and/or modify it under the +c terms of the GNU General Public License as published by the Free Software +c Foundation, either version 3 of the License, or (at your option) any later +c version. +c +c TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +c WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +c FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +c details. +c +c You should have received a copy of the GNU General Public License along with +c TRIQS. If not, see . +c +c *****************************************************************************/ + + SUBROUTINE readcomline +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine reads and process the command line options %% +C %% (Only -so, -sp and -band are the possible ones). %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C ---------------------------- + USE common_data + USE prnt + IMPLICIT NONE + CHARACTER(len=100) :: buf1 + CHARACTER(len=100), DIMENSION(:), ALLOCATABLE :: flags + INTEGER :: i1, iargc, iarg + LOGICAL :: ifError +C Process the command line : +C --------------------------- + iarg=iargc() + ALLOCATE(flags(iarg)) + ifSP=.FALSE. + ifSO=.FALSE. + ifBAND=.FALSE. + ifError=.FALSE. + DO i1=1,iarg + CALL getarg(i1,buf1) + READ(buf1,*)flags(i1) + flags(i1)=ADJUSTL(flags(i1)) + CALL makelowcase(flags(i1)) + SELECT CASE(flags(i1)(1:5)) + CASE('-sp ') + ifSP=.TRUE. + CASE('-so ') + ifSO=.TRUE. + CASE('-band') + ifBAND=.TRUE. + CASE DEFAULT + ifError=.TRUE. + EXIT + END SELECT + ENDDO +C --------------------------------------------------------------------------------------- +C Interruption of the prgm if the options are not recognized. +C ------------------------- +C + IF (ifError) THEN + WRITE(6,'(a,a,a)')'Command line option: ',flags(i1)(1:5), + & ' is not recognized.' + WRITE(6,'(a)')'END OF THE PRGM' + STOP + ENDIF +C --------------------------------------------------------------------------------------- + DEALLOCATE(flags) +C + RETURN + END + + SUBROUTINE makelowcase(string) +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine modifies the input string into low case %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C ---------------------------- + IMPLICIT NONE + CHARACTER*26 :: upperabc + CHARACTER*26 :: lowabc + CHARACTER* (*) string + INTEGER :: i,k + PARAMETER(upperabc='ABCDEFHGIJKLMNOPQRSTUVWXYZ') + PARAMETER(lowabc='abcdefhgijklmnopqrstuvwxyz') + DO i=1,len(string) + DO k=1,26 + IF(string(i:i)==upperabc(k:k)) string(i:i)=lowabc(k:k) + ENDDO + ENDDO + RETURN + END + + diff --git a/fortran/dmftproj/rot_dens.f b/fortran/dmftproj/rot_dens.f new file mode 100644 index 00000000..32e6261e --- /dev/null +++ b/fortran/dmftproj/rot_dens.f @@ -0,0 +1,239 @@ + +c ****************************************************************************** +c +c TRIQS: a Toolbox for Research in Interacting Quantum Systems +c +c Copyright (C) 2011 by L. Pourovskii, V. Vildosola, C. Martins, M. Aichhorn +c +c TRIQS is free software: you can redistribute it and/or modify it under the +c terms of the GNU General Public License as published by the Free Software +c Foundation, either version 3 of the License, or (at your option) any later +c version. +c +c TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +c WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +c FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +c details. +c +c You should have received a copy of the GNU General Public License along with +c TRIQS. If not, see . +c +c *****************************************************************************/ + + SUBROUTINE rotdens_mat(Dmat,orbit,norbit) +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine applies to each density matrix in Dmat %% +C %% the transformation to go from the global coordinates to the %% +C %% local coordinates associated to the considered orbital. %% +C %% %% +C %% This version can be used for SO computations. %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definition of the variables : +C ---------------------------- + USE common_data + USE projections + USE symm + USE reps + IMPLICIT NONE + INTEGER :: norbit + TYPE(matrix), DIMENSION(nsp,norbit) :: Dmat + COMPLEX(KIND=8),DIMENSION(:,:), ALLOCATABLE :: rot_dmat + COMPLEX(KIND=8),DIMENSION(:,:), ALLOCATABLE :: tmp_mat + COMPLEX(KIND=8):: ephase + REAL(KIND=8):: factor + TYPE(orbital), DIMENSION(norbit) :: orbit + INTEGER :: iatom, isrt, iorb, is, is1, l, i, m +C +C + DO iorb=1,norbit + l=orbit(iorb)%l + isrt=orbit(iorb)%sort + iatom=orbit(iorb)%atom +C + IF(ifSP.AND.ifSO) THEN +C In this case, the complete spinor rotation approach (matrices of size 2*(2*l+1) ) is used for rotloc. + IF (l==0) THEN +C ------------------------------------------------------------------------------------------------------------ +C For the s orbital, the spinor rotation matrix will be constructed directly from the Euler angles a,b and c : +C ------------------------------------------------------------------------------------------------------------ +C Up/dn and Dn/up terms + ALLOCATE(tmp_mat(1:2,1:2)) + ALLOCATE(rot_dmat(1:2,1:2)) + IF (rotloc(iatom)%timeinv) THEN + factor=(rotloc(iatom)%a+rotloc(iatom)%g)/2.d0 + tmp_mat(2,1)=EXP(CMPLX(0.d0,factor))* + & DCOS(rotloc(iatom)%b/2.d0) + tmp_mat(1,2)=-CONJG(tmp_mat(2,1)) +C Up/dn and Dn/up terms + factor=-(rotloc(iatom)%a-rotloc(iatom)%g)/2.d0 + tmp_mat(2,2)=-EXP(CMPLX(0.d0,factor))* + & DSIN(rotloc(iatom)%b/2.d0) + tmp_mat(1,1)=CONJG(tmp_mat(2,2)) +C definition of the total density matrix + rot_dmat(1,1)=Dmat(1,iorb)%mat(1,1) + rot_dmat(2,2)=Dmat(2,iorb)%mat(1,1) + rot_dmat(1,2)=Dmat(3,iorb)%mat(1,1) + rot_dmat(2,1)=Dmat(4,iorb)%mat(1,1) +C going to the local basis + rot_dmat(1:2,1:2)=CONJG(MATMUl( + & rot_dmat(1:2,1:2),tmp_mat(1:2,1:2))) + rot_dmat(1:2,1:2)=MATMUl( + & TRANSPOSE(tmp_mat(1:2,1:2)), + & rot_dmat(1:2,1:2)) + ELSE + factor=(rotloc(iatom)%a+rotloc(iatom)%g)/2.d0 + tmp_mat(1,1)=EXP(CMPLX(0.d0,factor))* + & DCOS(rotloc(iatom)%b/2.d0) + tmp_mat(2,2)=CONJG(tmp_mat(1,1)) +C Up/dn and Dn/up terms + factor=-(rotloc(iatom)%a-rotloc(iatom)%g)/2.d0 + tmp_mat(1,2)=EXP(CMPLX(0.d0,factor))* + & DSIN(rotloc(iatom)%b/2.d0) + tmp_mat(2,1)=-CONJG(tmp_mat(1,2)) +C definition of the total density matrix + rot_dmat(1,1)=Dmat(1,iorb)%mat(1,1) + rot_dmat(2,2)=Dmat(2,iorb)%mat(1,1) + rot_dmat(1,2)=Dmat(3,iorb)%mat(1,1) + rot_dmat(2,1)=Dmat(4,iorb)%mat(1,1) +C going to the local basis + rot_dmat(1:2,1:2)=MATMUl( + & TRANSPOSE(CONJG(tmp_mat(1:2,1:2))), + & rot_dmat(1:2,1:2)) + rot_dmat(1:2,1:2)=MATMUl( + & rot_dmat(1:2,1:2),tmp_mat(1:2,1:2)) + ENDIF + DEALLOCATE(tmp_mat) +C storing in Dmat + Dmat(1,iorb)%mat(1,1)=rot_dmat(1,1) + Dmat(2,iorb)%mat(1,1)=rot_dmat(2,2) + Dmat(3,iorb)%mat(1,1)=rot_dmat(1,2) + Dmat(4,iorb)%mat(1,1)=rot_dmat(2,1) + DEALLOCATE(rot_dmat) + ELSE +C ----------------------------------------------------------------------------------------------------- +C If the basis representation needs a complete spinor rotation approach (matrices of size 2*(2*l+1) ) : +C ----------------------------------------------------------------------------------------------------- + IF (reptrans(l,isrt)%ifmixing) THEN +C We use the complete spin-space representation, so no trick on indices is necessary. +C +C Application of the operation inverse(Rloc).Dmat.(Rloc) : +C ------------------------------------------------------- + IF (rotloc(iatom)%timeinv) THEN +C In this case, the operators is antiunitary [ inverse(R)=transpose(R) ] + Dmat(1,iorb)%mat(:,:)=CONJG( + = MATMUL(Dmat(1,iorb)%mat(:,:), + & rotloc(iatom)%rotrep(l)%mat(:,:) )) + Dmat(1,iorb)%mat(:,:)= + = MATMUL(TRANSPOSE( rotloc(iatom)% + & rotrep(l)%mat(:,:) ),Dmat(1,iorb)%mat(:,:) ) +C Dmat_{local} = inverse(Rloc) Dmat_{global}* Rloc* +C Dmat_{local} = transpose(Rloc) Dmat_{global}* Rloc* + ELSE +C In this case, all the operators are unitary [ inverse(R)=transpose(conjugate(R)) ] + Dmat(1,iorb)%mat(:,:)= + = MATMUL(Dmat(1,iorb)%mat(:,:), + & rotloc(iatom)%rotrep(l)%mat(:,:) ) + Dmat(1,iorb)%mat(:,:)= + = MATMUL(TRANSPOSE(CONJG( rotloc(iatom)% + & rotrep(l)%mat(:,:) )),Dmat(1,iorb)%mat(:,:) ) +C Dmat_{local} = Dmat_{global} +C Dmat_{local} = inverse(Rloc) Dmat_{global} Rloc + ENDIF +C + ELSE +C ---------------------------------------------------------------------------------------------- +C If the basis representation can be reduce to the up/up block (matrices of size (2*l+1) only) : +C ---------------------------------------------------------------------------------------------- +C definition of the total density matrix + ALLOCATE(rot_dmat(1:2*(2*l+1),1:2*(2*l+1))) + rot_dmat(1:(2*l+1),1:(2*l+1))= + & Dmat(1,iorb)%mat(-l:l,-l:l) + rot_dmat(2*l+2:2*(2*l+1),2*l+2:2*(2*l+1))= + & Dmat(2,iorb)%mat(-l:l,-l:l) + rot_dmat(1:(2*l+1),2*l+2:2*(2*l+1))= + & Dmat(3,iorb)%mat(-l:l,-l:l) + rot_dmat(2*l+2:2*(2*l+1),1:(2*l+1))= + & Dmat(4,iorb)%mat(-l:l,-l:l) + IF (rotloc(iatom)%timeinv) THEN +C In this case, the operator is antiunitary [ inverse(R)=transpose(R) ] + rot_dmat(1:2*(2*l+1),1:2*(2*l+1))=CONJG( + = MATMUL(rot_dmat(1:2*(2*l+1),1:2*(2*l+1)), + & rotloc(iatom)%rotrep(l) + & %mat(1:2*(2*l+1),1:2*(2*l+1)) )) + rot_dmat(1:2*(2*l+1),1:2*(2*l+1))= + = MATMUL(TRANSPOSE( rotloc(iatom)% + & rotrep(l)%mat(1:2*(2*l+1),1:2*(2*l+1)) ), + & rot_dmat(1:2*(2*l+1),1:2*(2*l+1)) ) +C Dmat_{local} = inverse(Rloc) Dmat_{global}* Rloc* +C Dmat_{local} = transpose(Rloc) Dmat_{global}* Rloc* + ELSE +C In this case, all the operators are unitary [ inverse(R)=transpose(conjugate(R)) ] + rot_dmat(1:2*(2*l+1),1:2*(2*l+1))= + = MATMUL(rot_dmat(1:2*(2*l+1),1:2*(2*l+1)), + & rotloc(iatom)%rotrep(l) + & %mat(1:2*(2*l+1),1:2*(2*l+1)) ) + rot_dmat(1:2*(2*l+1),1:2*(2*l+1))= + = MATMUL(TRANSPOSE(CONJG( rotloc(iatom)% + & rotrep(l)%mat(1:2*(2*l+1),1:2*(2*l+1)) )), + & rot_dmat(1:2*(2*l+1),1:2*(2*l+1)) ) +C Dmat_{local} = Dmat_{global} +C Dmat_{local} = inverse(Rloc) Dmat_{global} Rloc + ENDIF +C storing in dmat again + Dmat(1,iorb)%mat(-l:l,-l:l)= + & rot_dmat(1:(2*l+1),1:(2*l+1)) + Dmat(2,iorb)%mat(-l:l,-l:l)= + & rot_dmat(2*l+2:2*(2*l+1),2*l+2:2*(2*l+1)) + Dmat(3,iorb)%mat(-l:l,-l:l)= + & rot_dmat(1:(2*l+1),2*l+2:2*(2*l+1)) + Dmat(4,iorb)%mat(-l:l,-l:l)= + & rot_dmat(2*l+2:2*(2*l+1),1:(2*l+1)) + DEALLOCATE(rot_dmat) + ENDIF ! End of the if mixing if-then-else + ENDIF ! End of the if "l=0" if-then-else + ELSE +C ------------------------------------------------------------------------------ +C The s-orbitals are a particular case of a "non-mixing" basis and is invariant. +C ------------------------------------------------------------------------------ + IF(l==0) CYCLE +C ---------------------------------------------------------------------------------------------- +C If the basis representation can be reduce to the up/up block (matrices of size (2*l+1) only) : +C ---------------------------------------------------------------------------------------------- + ALLOCATE(rot_dmat(-l:l,-l:l)) + DO is=1,nsp + rot_dmat=0.d0 +C +C Application of the operation inverse(Rloc).Dmat.(Rloc) : +C ------------------------------------------------------- +C In this case, (either a paramagnetic calculation or a spin-polarized one +C but the symmetry operation does not change the magntization direction) +C all the operators are unitary [ inverse(R)=transpose(conjugate(R)) ] + rot_dmat(-l:l,-l:l)= + = MATMUL(Dmat(is,iorb)%mat(-l:l,-l:l), + & rotloc(iatom)%rotrep(l)%mat(-l:l,-l:l) ) + rot_dmat(-l:l,-l:l)= + = MATMUL(TRANSPOSE(CONJG( rotloc(iatom)% + & rotrep(l)%mat(-l:l,-l:l) )), + & rot_dmat(-l:l,-l:l) ) +C rotmat_{local} = rotmat_{global} +C rotmat_{local} = inverse(Rloc) rotmat_{global} Rloc +C +C Storing the new value in Dmat : +C ------------------------------- + Dmat(is,iorb)%mat(-l:l,-l:l)=rot_dmat(-l:l,-l:l) + ENDDO + DEALLOCATE(rot_dmat) +C + ENDIF ! End of the ifSO-ifSP if-then-else + ENDDO ! End of the iorb loop +C + RETURN + END + + + + + diff --git a/fortran/dmftproj/rot_projectmat.f b/fortran/dmftproj/rot_projectmat.f new file mode 100644 index 00000000..df3294ca --- /dev/null +++ b/fortran/dmftproj/rot_projectmat.f @@ -0,0 +1,72 @@ + +c ****************************************************************************** +c +c TRIQS: a Toolbox for Research in Interacting Quantum Systems +c +c Copyright (C) 2011 by L. Pourovskii, V. Vildosola, C. Martins, M. Aichhorn +c +c TRIQS is free software: you can redistribute it and/or modify it under the +c terms of the GNU General Public License as published by the Free Software +c Foundation, either version 3 of the License, or (at your option) any later +c version. +c +c TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +c WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +c FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +c details. +c +c You should have received a copy of the GNU General Public License along with +c TRIQS. If not, see . +c +c *****************************************************************************/ + + SUBROUTINE rot_projectmat(mat,l,bottom,top,jatom,isrt) +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine makes the transformation from local to global %% +C %% frame coordinates for the matrices mat in agreement with %% +C %% the atom j considered. %% +C %% %% +C %% mat SHOULD BE IN THE COMPLEX SPHERICAL HARMONICS BASIS. %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C ---------------------------- + USE almblm_data, ONLY : nk + USE common_data + USE symm + IMPLICIT NONE + INTEGER,INTENT(IN) :: l, bottom, top, jatom, isrt + COMPLEX(KIND=8), DIMENSION(-l:l,bottom:top) :: mat + COMPLEX(KIND=8), DIMENSION(-l:l,bottom:top) :: mattmp + COMPLEX(KIND=8), DIMENSION(1:2*l+1,1:2*l+1) :: rot_dmat + INTEGER :: is, ik, isym, lm, lms, ind1, ind2, m +C + DO m=-l,l + mattmp(m,bottom:top)= mat(m,bottom:top) + END DO +C mat is the projector in the local frame (spherical harmonic basis). +C +C The subroutine lapw2 has actually made the computation in the local frame +C BUT with considering the up and the dn elements in the global frame (no rotation in spin-space), +C That's why we have to make the computation only in the spin-space to put entirely the matrix mat in the global frame. +C Moreover, no time-reversal symmetry should be taken into account, since the true "rotloc" matrix is considered in lapw2 (-alm). +C +C The transformation is thus simply achieved by performing the multiplication by rotloc = +C (use of the subroutine dmat) + rot_dmat=0.d0 + CALL dmat(l,rotloc(jatom)%a,rotloc(jatom)%b, + & rotloc(jatom)%g, + & REAL(rotloc(jatom)%iprop,KIND=8),rot_dmat,2*l+1) +C Performing the rotation + mattmp(-l:l,bottom:top)= + = MATMUL(rot_dmat(1:2*l+1,1:2*l+1), + & mattmp(-l:l,bottom:top)) +C The variable mattmp is then the projector in the global frame (spherical harmonic basis). +C The resulting matrix is stored in mat. + mat(-l:l,bottom:top)=mattmp(-l:l,bottom:top) +C + RETURN + END + diff --git a/fortran/dmftproj/set_ang_trans.f b/fortran/dmftproj/set_ang_trans.f new file mode 100644 index 00000000..e6b2493d --- /dev/null +++ b/fortran/dmftproj/set_ang_trans.f @@ -0,0 +1,538 @@ + +c ****************************************************************************** +c +c TRIQS: a Toolbox for Research in Interacting Quantum Systems +c +c Copyright (C) 2011 by L. Pourovskii, V. Vildosola, C. Martins, M. Aichhorn +c +c TRIQS is free software: you can redistribute it and/or modify it under the +c terms of the GNU General Public License as published by the Free Software +c Foundation, either version 3 of the License, or (at your option) any later +c version. +c +c TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +c WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +c FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +c details. +c +c You should have received a copy of the GNU General Public License along with +c TRIQS. If not, see . +c +c *****************************************************************************/ + + SUBROUTINE set_ang_trans +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine sets up the matrices for transformation between %% +C %% the default complex spherical harmonics used in Wien2k and an %% +C %% angular basis chosen, for each orbital of each atom. %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C ---------------------------- + USE common_data + USE file_names + USE reps + USE prnt + IMPLICIT NONE + CHARACTER(len=150) :: fullpath + CHARACTER(len=250) :: buf1 + CHARACTER(len=25) :: basis_file + CHARACTER(len=1) :: repsign + INTEGER, DIMENSION(2*(2*lmax+1)) :: degrep + REAL(KIND=8), DIMENSION(:), ALLOCATABLE :: rtrans,itrans + INTEGER :: m, l, m1, irep, isrt, ind, ind1, ind2 + COMPLEX(KIND=8),DIMENSION(:,:), ALLOCATABLE :: tempmat + LOGICAL :: flag +C +C + WRITE(buf,'(a)')'=======================================' + CALL printout(0) + WRITE(buf,'(a)')'Basis representation for each sort.' + CALL printout(0) + CALL printout(0) +C ================================= +C Creation of the reptrans matrix : +C ================================= +C +C For the s-electrons : no transformation is necessary (it's always the scalar 1) + ALLOCATE(reptrans(1:lmax,1:nsort)) +C Definition of the size of reptrans (size lmax*nsort) +C Each element of this table is an "ang_bas" element, which will be defined below. + DO isrt=1,nsort +C ----------------------------------------------- +C Case of a representation in the complex basis : +C ----------------------------------------------- + IF (defbasis(isrt)%typebasis(1:7)=='complex') THEN + DO l=1,lmax + IF (lsort(l,isrt)==0) THEN +C The considered orbital is not included, all the fields are set up to default value. + reptrans(l,isrt)%nreps=1 + ALLOCATE(reptrans(l,isrt)%dreps(1)) + ALLOCATE(reptrans(l,isrt)%transmat(1,1)) + reptrans(l,isrt)%transmat=0d0 + reptrans(l,isrt)%dreps(1)=0 + reptrans(l,isrt)%ifmixing=.FALSE. + ELSE +C The considered orbital is included. + reptrans(l,isrt)%nreps=1 + ALLOCATE(reptrans(l,isrt)%dreps(1)) + ALLOCATE(reptrans(l,isrt)%transmat(-l:l,-l:l)) + reptrans(l,isrt)%transmat=0d0 + reptrans(l,isrt)%dreps(1)=2*l+1 + reptrans(l,isrt)%ifmixing=.FALSE. + DO m=-l,l + reptrans(l,isrt)%transmat(m,m)=1d0 + ENDDO +C In this case, the transformation matrix is just the Identity (hence 1 irep). +C Spin up and Spin down states are not mixed in the basis representation. + ENDIF + ENDDO +C --------------------------------------------- +C Case of a representation in the cubic basis : +C --------------------------------------------- + ELSEIF (defbasis(isrt)%typebasis(1:5)=='cubic') THEN + DO l=1,lmax + IF (lsort(l,isrt)==0) THEN +C The considered orbital is not included, all the fields are set up to default value. + reptrans(l,isrt)%nreps=1 + ALLOCATE(reptrans(l,isrt)%dreps(1)) + ALLOCATE(reptrans(l,isrt)%transmat(1,1)) + reptrans(l,isrt)%transmat=0d0 + reptrans(l,isrt)%dreps(1)=0 + reptrans(l,isrt)%ifmixing=.FALSE. + ELSE +C The considered orbital is included. +C The cubic basis is described in the format transpose(P) where P is the usual matrix +C of the eigenvectors of a matrix D ( D.P=Delta.P with Delta diagonal or P=). +C In other words, each line of the file describes the coefficient of the "new basis vector" +C in the basis { |l,-l,up>,...|l,l,up>,|l,-l,dn>,...|l,l,dn> }. +C The transformation matrices are stored in the directory SRC_templates, the variable "fullpath" +C must be updated if this prgm is copied. + ALLOCATE(reptrans(l,isrt)%transmat(-l:l,-l:l)) + ALLOCATE(rtrans(-l:l)) + ALLOCATE(itrans(-l:l)) +C write(*,*)fullpath + IF (l==1) CALL + & set_harm_file(fullpath,'case.cf_p_cubic') +C standard cubic representation of p electrons : px,py,pz + IF (l==2) CALL + & set_harm_file(fullpath,'case.cf_d_eg_t2g') +C standard cubic representation of d-electrons : dz2, dx2-y2, dxy, dxz,dyz (Wien-convention for the phase) + IF (l==3) CALL + & set_harm_file(fullpath,'case.cf_f_mm2') +C mm2 representation of the f electrons (standard definition with complex coefficients) +C +C Reading of the file + OPEN(iumatfile,file=fullpath,status='old') + ind=-l + irep=0 + DO m=-l,l + READ(iumatfile,'(a)')buf1 + READ(buf1(1:1),'(a)')repsign + IF(repsign=='*') THEN +C Finding the different ireps in the new basis (a "*" means the end of an irep) + irep=irep+1 + degrep(irep)=m-ind+1 + ind=m+1 + ENDIF + READ(buf1(2:250),*)(rtrans(m1),itrans(m1),m1=-l,l) +C The line of the file is stored in the column of reptrans, which is temporarly "P". + reptrans(l,isrt)%transmat(-l:l,m)= + & CMPLX(rtrans(-l:l),itrans(-l:l)) + ENDDO + reptrans(l,isrt)%transmat(-l:l,-l:l)= + = TRANSPOSE(CONJG(reptrans(l,isrt)%transmat(-l:l,-l:l))) +C reptrans%transmat = inverse(P) = , the transformation matrix from complex basis to the cubic one. +C ( inverse(P) is the decomposition of the complex basis in the new basis...) + reptrans(l,isrt)%nreps=irep + ALLOCATE(reptrans(l,isrt)%dreps(irep)) + reptrans(l,isrt)%dreps(1:irep)=degrep(1:irep) + reptrans(l,isrt)%ifmixing=.FALSE. +C reptrans%nreps = the total number of ireps in the cubic basis +C reptrans%dreps = table of the size of the different ireps +C reptrans%ifmixing = .FALSE. because Spin up and Spin down states are not mixed in the basis representation. + CLOSE(iumatfile) + DEALLOCATE(rtrans) + DEALLOCATE(itrans) + ENDIF + ENDDO +C --------------------------------------------------------- +C Case of a representation defined in an added input file : +C --------------------------------------------------------- + ELSEIF (defbasis(isrt)%typebasis(1:8)=='fromfile') THEN + basis_file=defbasis(isrt)%sourcefile + OPEN(iumatfile,file=basis_file,status='old') + DO l=1,lmax + IF (lsort(l,isrt)==0) THEN +C The considered orbital is not included, all the fields are set up to default value. + reptrans(l,isrt)%nreps=1 + ALLOCATE(reptrans(l,isrt)%dreps(1)) + ALLOCATE(reptrans(l,isrt)%transmat(1,1)) + reptrans(l,isrt)%transmat=0d0 + reptrans(l,isrt)%dreps(1)=0 + ELSE +C The considered orbital is included. +C The new basis is described in the format transpose(P) where P is the usual matrix +C of the eigenvectors of a matrix D ( D.P=Delta.P with Delta diagonal or P=). +C In other words, each line of the file describes the coefficient of the "new basis vector" +C in the basis { |l,-l,up>,...|l,l,up>,|l,-l,dn>,...|l,l,dn> }. +C The transformation matrices are stored in the directory SRC_templates, the variable "fullpath" +C must be updated if this prgm is copied. + ind=1 + irep=0 + ALLOCATE(tempmat(1:2*(2*l+1),1:2*(2*l+1))) + ALLOCATE(rtrans(1:2*(2*l+1))) + ALLOCATE(itrans(1:2*(2*l+1))) +C +C Reading of the file + DO m=1,2*(2*l+1) + READ(iumatfile,'(a)')buf1 + READ(buf1(1:1),'(a)')repsign + IF(repsign=='*') THEN +C Finding the different ireps in the new basis (a "*" means the end of an irep) + irep=irep+1 + degrep(irep)=m-ind+1 + ind=m+1 + ENDIF + READ(buf1(2:250),*)(rtrans(m1),itrans(m1), + & m1=1,2*(2*l+1)) + tempmat(1:2*(2*l+1),m)= + = CMPLX(rtrans(1:2*(2*l+1)),itrans(1:2*(2*l+1))) +C The lines of the read matrix are stored in the column of tempmat, which is then P. + ENDDO +C +C Determination if the basis mixes Spin up and Spin down states + flag=.TRUE. + ind1=1 + ind2=1 +C The "do while" loop stops when flag=FALSE or i=2*(l+1) + DO WHILE (flag.AND.(ind1.lt.2*(l+1))) + flag=flag.AND. + & (tempmat((2*l+1)+ind1,(2*l+1)+ind2)==tempmat(ind1,ind2)) + flag=flag.AND.(tempmat((2*l+1)+ind1,ind2)==0.d0) + flag=flag.AND.(tempmat(ind1,(2*l+1)+ind2)==0.d0) + IF (ind2==(2*l+1)) THEN + ind1=ind1+1 + ind2=1 + ELSE + ind2=ind2+1 + END IF + ENDDO + IF (flag) THEN +C If flag=TRUE (then i=2*l+2), the tempmat matrix is block diagonal in spin with +C the condition block up/up = block down/down. +C The Spin up and Spin down states are not mixed in the basis representation. + reptrans(l,isrt)%ifmixing=.FALSE. +C reptrans%ifmixing = .FALSE. because Spin up and Spin down states are not mixed in the basis representation. +C +C --------------------------------------------------------------------------------------- +C Interruption of the prgm if the basis description is not correct. +C ------------------------- +C + IF (SUM(degrep(1:irep/2)).ne.(2*l+1)) THEN + WRITE(buf,'(a,a,i2,a,i2,a)')'The basis description ', + & 'for isrt = ',isrt,' and l = ',l,' is not recognized.' + CALL printout(0) + WRITE(buf,'(a,a)')'Check the structure of the file ', + & defbasis(isrt)%sourcefile + CALL printout(0) + WRITE(buf,'(a)')'END OF THE PRGM' + CALL printout(0) + STOP + END IF +C --------------------------------------------------------------------------------------- +C + ALLOCATE(reptrans(l,isrt)%transmat(-l:l,-l:l)) + reptrans(l,isrt)%transmat(-l:l,-l:l)= + = tempmat(1:(2*l+1),1:(2*l+1)) + reptrans(l,isrt)%transmat(-l:l,-l:l)= + = TRANSPOSE(CONJG(reptrans(l,isrt)%transmat(-l:l,-l:l))) +C The up/up block is enough to describe the transformation (as for cubic or complex bases) +C reptrans%transmat = inverse(P) = +C inverse(P) is indeed the decomposition of the complex basis in the new basis. + reptrans(l,isrt)%nreps=irep/2 + ALLOCATE(reptrans(l,isrt)%dreps(reptrans(l,isrt)%nreps)) + reptrans(l,isrt)%dreps(1:reptrans(l,isrt)%nreps)= + = degrep(1:reptrans(l,isrt)%nreps) +C reptrans%nreps = the number of ireps in the desired basis for up spin +C reptrans%dreps = table of the size of the different ireps for up spin + ELSE +C If flag=FALSE, either the tempmat matrix either mixes Spin up and Spin down states +C or the representation basis for Spin up and Spin down states differ. +C In this case, it is not possible to reduce the description only to the up/up block. +C The whole tempmat matrix is necessary. +C +C --------------------------------------------------------------------------------------- +C Interruption of the prgm if the basis description is not correct. +C ------------------------- +C + IF (SUM(degrep(1:irep)).ne.(2*(2*l+1))) THEN + WRITE(buf,'(a,a,i2,a,i2,a)')'The basis description ', + & 'for isrt = ',isrt,' and l = ',l,' is not recognized.' + CALL printout(0) + WRITE(buf,'(a,a)')'Check the structure of the file ', + & defbasis(isrt)%sourcefile + CALL printout(0) + WRITE(buf,'(a)')'END OF THE PRGM' + CALL printout(0) + STOP + END IF +C --------------------------------------------------------------------------------------- +C + reptrans(l,isrt)%ifmixing=.TRUE. +C reptrans%ifmixing = .TRUE. because Spin up and Spin down states are mixed in the basis representation. + ALLOCATE(reptrans(l,isrt)%transmat + & (1:2*(2*l+1),1:2*(2*l+1))) + reptrans(l,isrt)%transmat(1:2*(2*l+1),1:2*(2*l+1))= + = tempmat(1:2*(2*l+1),1:2*(2*l+1)) + reptrans(l,isrt)%transmat(1:2*(2*l+1),1:2*(2*l+1))= + = TRANSPOSE(CONJG(reptrans(l,isrt)%transmat + & (1:2*(2*l+1),1:2*(2*l+1)))) +C In this case, reptrans%transmat is a square matrix which ranges from 1 to 2*(2*l+1). +C reptrans%transmat = inverse(P) = +C inverse(P) is indeed the decomposition of the complex basis in the new basis. + reptrans(l,isrt)%nreps=irep + ALLOCATE(reptrans(l,isrt)%dreps(irep)) + reptrans(l,isrt)%dreps(1:irep)=degrep(1:irep) +C reptrans%nreps = the total number of ireps in the desired basis +C reptrans%dreps = table of the size of the different ireps +C +C Restriction for simplicity in the following (and for physical reasons) : +C a basis with ifmixing=.TRUE. is allowed only if the computation includes SO. + IF (.not.ifSO) THEN + WRITE(buf,'(a,a,i2,a,i2,a)')'The basis description ', + & 'for isrt = ',isrt,' and l = ',l, + & ' mixes up and down states.' + CALL printout(0) + WRITE(buf,'(a,a)')'This option can not ', + & 'be used in a computation without Spin-Orbit.' + CALL printout(0) + WRITE(buf,'(a,a)')'Modify the structure of the file ', + & defbasis(isrt)%sourcefile + CALL printout(0) + WRITE(buf,'(a)')'END OF THE PRGM' + CALL printout(0) + STOP + END IF + END IF + DEALLOCATE(tempmat) + DEALLOCATE(rtrans) + DEALLOCATE(itrans) + ENDIF + ENDDO + CLOSE(iumatfile) +C ---------------------------------------------- +C Case of a wrong definition in the input file : +C ---------------------------------------------- + ELSE +C +C --------------------------------------------------------------------------------------- +C Interruption of the prgm if the file has not the expected structure. +C ------------------------- +C + WRITE(buf,'(a,i2,a)')'The basis description for isrt = ', + & isrt,' is not recognized.' + CALL printout(0) + WRITE(buf,'(a)')'END OF THE PRGM' + CALL printout(0) + STOP + ENDIF +C --------------------------------------------------------------------------------------- +C + ENDDO +C +C +C =============================================== +C Printing the basis representation information : +C =============================================== +C + DO isrt=1,nsort + IF (notinclude(isrt)) cycle + CALL printout(0) + WRITE(buf,'(a)')'-------------------------------------' + CALL printout(0) + WRITE(buf,'(a,i2,a)')'For the sort ',isrt,' :' + CALL printout(0) + IF (defbasis(isrt)%typebasis(1:7)=='complex') THEN +C ----------------------------------------------- +C Case of a representation in the complex basis : +C ----------------------------------------------- + WRITE(buf,'(a,i2,a)')'The atomic sort', isrt, + & ' is studied in the complex basis representation.' + CALL printout(0) + CALL printout(0) + ELSEIF (defbasis(isrt)%typebasis(1:5)=='cubic') THEN +C --------------------------------------------- +C Case of a representation in the cubic basis : +C --------------------------------------------- + WRITE(buf,'(a,i2,a)')'The atomic sort', isrt, + & ' is studied in the cubic basis representation.' + CALL printout(0) + CALL printout(0) + DO l=0,lmax +C The considered orbital is not included. + IF (lsort(l,isrt)==0) cycle +C Case of the s-electrons + IF (l==0) THEN + WRITE(buf,'(a,a,(F12.6))')'The basis for s-orbital ', + & 'is still',1.d0 + CALL printout(0) + ELSE +C Case of the other orbitals + WRITE(buf,'(a,i2,a,a,a)')'The basis for orbital l=',l, + & ' has the following properties :' + CALL printout(0) + WRITE(buf,'(a,i2)')' - number of ireps : ', + & reptrans(l,isrt)%nreps + CALL printout(0) + WRITE(buf,'(a,14(i2,x))')' - degree of each ireps : ', + & reptrans(l,isrt)%dreps(1:reptrans(l,isrt)%nreps) + CALL printout(0) + WRITE(buf,'(a,a,a)')'The transformation matrix is block', + & ' diagonal in the spin-space. The up/up and down/down', + & ' blocks are the same and defined as :' + CALL printout(0) +C The transformation matrix "P = " is displayed. + DO m=-l,l + WRITE(buf,'(7(2F12.6),x)') + & CONJG(reptrans(l,isrt)%transmat(-l:l,m)) + CALL printout(0) + ENDDO + CALL printout(0) + ENDIF + ENDDO + CALL printout(0) + ELSE +C --------------------------------------------------------- +C Case of a representation defined in an added input file : +C --------------------------------------------------------- + WRITE(buf,'(a,i2,a,a,a)')'The atomic sort', isrt, + & ' is studied in the basis representation', + & ' defined in the file ', + & defbasis(isrt)%sourcefile + CALL printout(0) + CALL printout(0) + DO l=0,lmax +C The considered orbital is not included. + IF (lsort(l,isrt)==0) cycle +C Case of the s-electrons + IF (l==0) THEN + WRITE(buf,'(a,a,(F12.6))')'The basis for s-orbital ', + & 'is still',1.d0 + CALL printout(0) + CALL printout(0) + ELSE +C Case of the other orbitals + WRITE(buf,'(a,i2,a)')'The basis for orbital l=',l, + & ' has the following properties :' + CALL printout(0) + WRITE(buf,'(a,i2)')' - number of ireps : ', + & reptrans(l,isrt)%nreps + CALL printout(0) + WRITE(buf,'(a,14(i2,x))')' - degree of each ireps : ', + & reptrans(l,isrt)%dreps(1:reptrans(l,isrt)%nreps) + CALL printout(0) + IF (reptrans(l,isrt)%ifmixing) THEN +C If the whole matrix description is necessary. + WRITE(buf,'(a,a)')'The transformation matrix mixes', + & ' up and down states in the spin-space' + CALL printout(0) + WRITE(buf,'(a,a)') ' and is defined as : ', + & '[ block 1 | block 2 ] with' + CALL printout(0) + WRITE(buf,'(a,a)') ' ', + & '[ block 3 | block 4 ]' + CALL printout(0) +C The transformation matrix "P = " is displayed. + WRITE(buf,'(a,i2,a)') 'For the block 1 :' + CALL printout(0) + DO m=1,2*l+1 + WRITE(buf,'(7(2F12.6),x)') + & CONJG(reptrans(l,isrt)%transmat(1:(2*l+1),m)) + CALL printout(0) + ENDDO + WRITE(buf,'(a,i2,a)') 'For the block 2 :' + CALL printout(0) + DO m=1,2*l+1 + WRITE(buf,'(7(2F12.6),x)') + & CONJG(reptrans(l,isrt)%transmat(2*l+2:2*(2*l+1),m)) + CALL printout(0) + ENDDO + WRITE(buf,'(a,i2,a)') 'For the block 3 :' + CALL printout(0) + DO m=2*l+2,2*(2*l+1) + WRITE(buf,'(7(2F12.6),x)') + & CONJG(reptrans(l,isrt)%transmat(1:(2*l+1),m)) + CALL printout(0) + ENDDO + WRITE(buf,'(a,i2,a)') 'For the block 4 :' + CALL printout(0) + DO m=2*l+2,2*(2*l+1) + WRITE(buf,'(7(2F12.6),x)') + & CONJG(reptrans(l,isrt)% + & transmat(2*l+2:2*(2*l+1),m)) + CALL printout(0) + ENDDO + ELSE +C If the matrix description can be reduced to its up/up block. + WRITE(buf,'(a,a,a)')'The transformation matrix is block', + & ' diagonal in the spin-space. The up/up and down/down', + & ' blocks are the same and defined as :' + CALL printout(0) +C The transformation matrix "P = " is displayed. + DO m=-l,l + WRITE(buf,'(7(2F12.6),x)') + & CONJG(reptrans(l,isrt)%transmat(-l:l,m)) + CALL printout(0) + ENDDO + ENDIF ! End of the ifmixing if-then-else + CALL printout(0) + ENDIF ! End of the l if-then-else + ENDDO ! End of the l loop + CALL printout(0) + ENDIF ! End of the basis description if-then-else + ENDDO ! End of the isrt loop +C + RETURN + END + + + SUBROUTINE set_harm_file(fullpath,filename) +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine sets the fullpath variable %% +C %% Be careful, wien_path is defined in modules.f !!! %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C ---------------------------- + USE common_data, ONLY : wien_path + USE prnt + IMPLICIT NONE + CHARACTER(len=*) :: filename, fullpath + CHARACTER(len=*), PARAMETER :: dir='SRC_templates' + INTEGER :: i1, i2, i, i3 +C + i1=LEN_TRIM(wien_path) + i2=LEN(dir) + i3=LEN(filename) + i=i1+i2+i3+2 + IF(LEN(fullpath) < i) THEN + WRITE(buf,'(a)') + & 'Characters required for the basis transformation ', + & ' filename is too long.' + CALL printout(0) + WRITE(buf,'(a)')'END OF THE PRGM' + CALL printout(0) + STOP + STOP + ENDIF + fullpath=' ' + fullpath(1:i)=wien_path(1:i1)//'/'//dir//'/'//filename(1:i3) + END SUBROUTINE set_harm_file + + + diff --git a/fortran/dmftproj/set_projections.f b/fortran/dmftproj/set_projections.f new file mode 100644 index 00000000..0b5771a8 --- /dev/null +++ b/fortran/dmftproj/set_projections.f @@ -0,0 +1,724 @@ + +c ****************************************************************************** +c +c TRIQS: a Toolbox for Research in Interacting Quantum Systems +c +c Copyright (C) 2011 by L. Pourovskii, V. Vildosola, C. Martins, M. Aichhorn +c +c TRIQS is free software: you can redistribute it and/or modify it under the +c terms of the GNU General Public License as published by the Free Software +c Foundation, either version 3 of the License, or (at your option) any later +c version. +c +c TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +c WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +c FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +c details. +c +c You should have received a copy of the GNU General Public License along with +c TRIQS. If not, see . +c +c *****************************************************************************/ + + SUBROUTINE set_projections(e1,e2) +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine sets up the projection matrices in the energy %% +C %% window [e1,e2].Two types of projection can be defined : %% +C %% - The projectors for the correlated orbital %% +C %% only. (orb = iatom,is,m) %% +C %% (They are stored in the table pr_crorb) %% +C %% - The Theta projectors for all the orbitals %% +C %% (They are stored in the table pr_orb) %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C ---------------------------- +C + USE almblm_data + USE common_data + USE prnt + USE projections + USE reps + USE symm + IMPLICIT NONE +C + REAL(KIND=8) :: e1, e2 + INTEGER :: iorb, icrorb, ik, is, ib, m, l, lm, nbbot, nbtop + INTEGER :: isrt, n, ilo, iatom, i, imu, jatom, jorb,isym, jcrorb + LOGICAL :: included,param + COMPLEX(KIND=8), DIMENSION(:), ALLOCATABLE :: coeff + COMPLEX(KIND=8), DIMENSION(:,:), ALLOCATABLE :: tmp_mat + COMPLEX(KIND=8), DIMENSION(:,:), ALLOCATABLE :: tmp_matbis + COMPLEX(KIND=8), DIMENSION(:,:,:), ALLOCATABLE :: tmp_matn +C +C +C + WRITE(buf,'(a)')'Creation of the projectors...' + CALL printout(0) +C +C +C ====================================================================== +C Selection of the bands which lie in the chosen energy window [e1;e2] : +C ====================================================================== +C + kp(:,:)%included=.FALSE. +C the field kp%included = boolean which is .TRUE. when there is at least one band +C at this k-point whose energy eignevalue is in the energy window. + DO is=1,ns + DO ik=1,nk + included=.FALSE. + DO ib=kp(ik,is)%nbmin,kp(ik,is)%nbmax + IF(.NOT.included.AND.kp(ik,is)%eband(ib) > e1.AND. + & kp(ik,is)%eband(ib).LE.e2) THEN +C If the energy eigenvalue E of the band ib at the k-point ik is such that e1 < E =< e2, +C then all the band with ib1>ib must be "included" in the computation and kp%nb_bot is initialized at the value ib. + included=.TRUE. + kp(ik,is)%nb_bot=ib + ELSEIF(included.AND.kp(ik,is)%eband(ib) > e2) THEN +C If the energy eigenvalue E of the current band ib at the k-point ik is such that E > e2 and all the previous +C band are "included", then the field kp%included = .TRUE. and kp%nb_top = ib-1 (the index of the previous band) + kp(ik,is)%nb_top=ib-1 + kp(ik,is)%included=.TRUE. + EXIT +C The loop on the band ib is stopped, since all the bands after ib have an energy > that of ib. + ELSEIF(ib==kp(ik,is)%nbmax.AND.kp(ik,is)%eband(ib) + & > e1.AND.kp(ik,is)%eband(ib).LE.e2) THEN +C If the energy eigenvalue E of the last band ib=kp%nbmax at the k-point ik is such that e1 < E =< e2 and all the +C previous bands are "included", then the band ib must be "included" and kp%nb_bot is initialized at the value kp%nbmax. + kp(ik,is)%nb_top=ib + kp(ik,is)%included=.TRUE. + ENDIF +C If the eigenvalues of the bands at the k-point ik are < e1 and included=.FALSE. +C of if the eigenvalues of the bands at the k-point ik are in the energy window [e1,e2] and included=.TRUE., +C nothing is done... + ENDDO ! End of the ib loop +C If all the eigenvalues of the bands at the k-point ik are not in the window, +C then kp%included remains at the value .FALSE. and the field kp%nb_top and kp%nb_bot are set to 0. + IF (.not.kp(ik,is)%included) THEN + kp(ik,is)%nb_bot=0 + kp(ik,is)%nb_top=0 + ENDIF + ENDDO ! End of the ik loop + ENDDO ! End of the is loop +C --------------------------------------------------------------------------------------- +C Checking of the input files if spin-polarized inputs and SO is taken into account: +C There should not be any difference between up and dn limits for each k-point. +C Printing a Warning if this is not the case. +C ------------------- +C + IF (ifSP.AND.ifSO) THEN + param=.TRUE. + DO ik=1,nk + param=param.AND.(kp(ik,1)%included.eqv.kp(ik,2)%included) + param=param.AND.(kp(ik,1)%nb_bot==kp(ik,2)%nb_bot) + param=param.AND.(kp(ik,1)%nb_top==kp(ik,2)%nb_top) + IF (.not.param) EXIT +C For a valid compoutation, the same k-points must be included for up and dn states, +C and the upper and lower limits must be the same in both case. + ENDDO + IF (.not.param) THEN + WRITE(buf,'(a,a)')'A Spin-orbit computation for this', + & ' compound is not possible with these input files.' + CALL printout(0) + WRITE(buf,'(a)')'END OF THE PRGM' + CALL printout(0) + STOP + ENDIF + ENDIF +C --------------------------------------------------------------------------------------- +C +C +C ================================================================== +C Orthonormalization of the radial wave functions for each orbital : +C ================================================================== +C +C This step is essential for setting the Theta projectors. + IF(.NOT.ALLOCATED(norm_radf)) THEN + ALLOCATE(norm_radf(norb)) +C norm_radf is a table of "ortfunc" elements, its size ranges from 1 to norb. + DO iorb=1,norb + l=orb(iorb)%l + isrt=orb(iorb)%sort + norm_radf(iorb)%n=nLO(l,isrt)+2 + n=norm_radf(iorb)%n + ALLOCATE(norm_radf(iorb)%s12(n,n,ns)) +C norm_radf%n = size of the matrix s12 +C norm_radf%s12 = matrix of size n*n (one for spin up, one for spin down, if necessary) + DO is=1,ns + norm_radf(iorb)%s12(1:n,1:n,is)=0d0 + norm_radf(iorb)%s12(1,1,is)=1d0 + norm_radf(iorb)%s12(2,2,is)=u_dot_norm(l,isrt,is) +C Initialization of the matrix norm_radf%s12 for each orbital (l,isrt). +C We remind tha it is assumed that nLO has the value 0 or 1 only !! + DO ilo=1,nLO(l,isrt) + norm_radf(iorb)%s12(2+ilo,2+ilo,is)=1d0 + norm_radf(iorb)%s12(2+ilo,1,is)= + = ovl_LO_u(ilo,l,isrt,is) + norm_radf(iorb)%s12(1,2+ilo,is)= + = ovl_LO_u(ilo,l,isrt,is) + norm_radf(iorb)%s12(2+ilo,2,is)= + = ovl_LO_udot(ilo,l,isrt,is) + norm_radf(iorb)%s12(2,2+ilo,is)= + = ovl_LO_udot(ilo,l,isrt,is) + ENDDO +C Computation of the square root of norm_radf: + CALL orthogonal_r(norm_radf(iorb)% + & s12(1:n,1:n,is),n,.FALSE.) +C the field norm_radf%s12 is finally the C matrix described in the tutorial (or in equation (3.63) in my thesis) + ENDDO + ENDDO + ENDIF +C +C ===================================== +C Creation of the projection matrices : +C ===================================== +C + IF(.NOT.ALLOCATED(pr_orb)) THEN + ALLOCATE(pr_crorb(ncrorb,nk,ns)) + ALLOCATE(pr_orb(norb,nk,ns)) + ENDIF +C pr_crorb = table of "proj_mat" elements for the correlated orbitals (size from 1 to ncrorb, from 1 to nk, from 1 to ns) +C pr_orb = table of "proj_mat_n" elements for all the orbitals (size from 1 to norb, from 1 to nk, from 1 to ns) + DO is=1,ns + DO ik=1,nk +C Only the k-points with inlcuded bands are considered for the projectors. + IF(.NOT.kp(ik,is)%included) CYCLE +C ------------------------------------------------ +C Wannier Projectors for the correlated orbitals : +C ------------------------------------------------ + DO icrorb=1,ncrorb + l=crorb(icrorb)%l + iatom=crorb(icrorb)%atom + isrt=crorb(icrorb)%sort +C Case of l=0 : +C ------------- + IF (l==0) THEN + IF(ALLOCATED(pr_crorb(icrorb,ik,is)%mat)) THEN + DEALLOCATE(pr_crorb(icrorb,ik,is)%mat) + ENDIF + ALLOCATE(pr_crorb(icrorb,ik,is)% + % mat(1,kp(ik,is)%nb_bot:kp(ik,is)%nb_top)) +C pr_crorb%mat = the projection matrix with 1 line and (nb_top-nb_bot) columns + DO ib=kp(ik,is)%nb_bot,kp(ik,is)%nb_top + pr_crorb(icrorb,ik,is)%mat(1,ib)= + = kp(ik,is)%Alm(1,iatom,ib) + DO ilo=1,nLO(l,isrt) + pr_crorb(icrorb,ik,is)%mat(1,ib)= + = pr_crorb(icrorb,ik,is)%mat(1,ib)+ + + kp(ik,is)%Clm(ilo,1,iatom,ib)* + * ovl_LO_u(ilo,l,isrt,is) + ENDDO ! End of the ilo loop + ENDDO ! End of the ib loop +C prcrorb(icrorb,ik,is)%mat(1,ib)= = Alm+Clm*ovl_LO_u +C +C Case of any other l : +C --------------------- + ELSE + lm=l*l +C Since the correlated orbital is the l orbital, the elements range from l*l+1 to (l+1)^2 +C the sum from 0 to (l-1) of m (from -l to l) is l^2. + IF(ALLOCATED(pr_crorb(icrorb,ik,is)%mat)) THEN + DEALLOCATE(pr_crorb(icrorb,ik,is)%mat) + ENDIF + ALLOCATE(pr_crorb(icrorb,ik,is)% + % mat(-l:l,kp(ik,is)%nb_bot:kp(ik,is)%nb_top)) +C pr_crorb%mat = the projection matrix with (2*l+1) lines and (nb_top-nb_bot) columns + DO m=-l,l + lm=lm+1 + DO ib=kp(ik,is)%nb_bot,kp(ik,is)%nb_top + pr_crorb(icrorb,ik,is)%mat(m,ib)= + = kp(ik,is)%Alm(lm,iatom,ib) + DO ilo=1,nLO(l,isrt) + pr_crorb(icrorb,ik,is)%mat(m,ib)= + = pr_crorb(icrorb,ik,is)%mat(m,ib)+ + + kp(ik,is)%Clm(ilo,lm,iatom,ib)* + * ovl_LO_u(ilo,l,isrt,is) + ENDDO ! End of the ilo loop + ENDDO ! End of the ib loop + ENDDO ! End of the m loop +C prcrorb(icrorb,ik,is)%mat(m,ib)= = Alm+Clm*ovl_LO_u + ENDIF ! End of the if l=0 if-then-else + ENDDO ! End of the icrorb loop +C +C --------------------------------------- +C Theta Projectors for all the orbitals : +C --------------------------------------- + DO iorb=1,norb + l=orb(iorb)%l + n=norm_radf(iorb)%n + iatom=orb(iorb)%atom +C Case of l=0 : +C ------------- + IF (l==0) THEN + IF(ALLOCATED(pr_orb(iorb,ik,is)%matn)) THEN + DEALLOCATE(pr_orb(iorb,ik,is)%matn) + ENDIF + ALLOCATE(pr_orb(iorb,ik,is)% + % matn(1,kp(ik,is)%nb_bot:kp(ik,is)%nb_top,n)) + ALLOCATE(coeff(1:n)) +C pr_orb%matn = the projection matrix with 1 line and (nb_top-nb_bot) columns for the n (size of s12) coefficients +C coeff = table of size n which will contain the decomposition of the Bloch state |psi_ik,ib,is> +C as in equation 22 of the tutorial (Alm, Blm, and Clm ) + DO ib=kp(ik,is)%nb_bot,kp(ik,is)%nb_top + coeff(1)=kp(ik,is)%Alm(1,iatom,ib) + coeff(2)=kp(ik,is)%Blm(1,iatom,ib) + coeff(3:n)=kp(ik,is)%Clm(1:n-2,1,iatom,ib) + coeff=MATMUL(coeff,norm_radf(iorb)%s12(1:n,1:n,is)) +C coeff = coefficients c_(j,lm) of the decomposition of the state |psi> in the orthogonalized basis |phi_j> +C as defined in the tutorial (equation 25) + pr_orb(iorb,ik,is)%matn(1,ib,1:n)=coeff(1:n) + ENDDO + DEALLOCATE(coeff) +C pr_orb(iorb,ik,is)%matn(m,ib,1:n) is then the Theta projector as defined in equation 26 of the tutorial. +C +C Case of any other l : +C --------------------- + ELSE + lm=l*l +C As the orbital is the l orbital, the elements range from l*l+1 to (l+1)^2 +C the sum from 0 to (l-1) of m (from -l to l) is l^2. + IF(ALLOCATED(pr_orb(iorb,ik,is)%matn)) THEN + DEALLOCATE(pr_orb(iorb,ik,is)%matn) + ENDIF + ALLOCATE(pr_orb(iorb,ik,is)% + % matn(-l:l,kp(ik,is)%nb_bot:kp(ik,is)%nb_top,n)) + ALLOCATE(coeff(1:n)) +C pr_orb%matn = the projection matrix with (2*l+1) lines and (nb_top-nb_bot) columns for the n (size of s12) coefficients +C coeff = table of size n which will contain the decomposition of the Bloch state |psi_ik,ib,is> +C as in equation 22 of the tutorial (Alm, Blm, and Clm ) + DO m=-l,l + lm=lm+1 + DO ib=kp(ik,is)%nb_bot,kp(ik,is)%nb_top + coeff(1)=kp(ik,is)%Alm(lm,iatom,ib) + coeff(2)=kp(ik,is)%Blm(lm,iatom,ib) + coeff(3:n)=kp(ik,is)%Clm(1:n-2,lm,iatom,ib) + coeff=MATMUL(coeff, + & norm_radf(iorb)%s12(1:n,1:n,is)) +C coeff = coefficients c_(j,lm) of the decomposition of the state |psi> in the orthogonalized basis |phi_j> +C as defined in the tutorial (equation 25) + pr_orb(iorb,ik,is)%matn(m,ib,1:n)=coeff(1:n) + ENDDO + ENDDO ! End of the m loop + DEALLOCATE(coeff) +C pr_orb(iorb,ik,is)%matn(m,ib,1:n) is then the Theta projector as defined in equation 26 of the tutorial. + ENDIF ! End of the if l=0 if-then-else + ENDDO ! End of the iorb loop +C + ENDDO ! End of the loop on ik + ENDDO ! End of the loop on is +C +C +C ========================================================================== +C Multiplication of the projection matrices by the local rotation matrices : +C ========================================================================== +C +C ------------------------------------------------ +C Wannier Projectors for the correlated orbitals : +C ------------------------------------------------ +C + DO jcrorb=1,ncrorb + jatom=crorb(jcrorb)%atom + isrt=crorb(jcrorb)%sort + l=crorb(jcrorb)%l +C +C The case l=0 is a particular case of "non-mixing" basis. +C -------------------------------------------------------- + IF (l==0) THEN +C For the s orbital, no multiplication is needed, since the matrix representation of any rotation +C (and thus Rloc) is always 1. + DO ik=1,nk + DO is=1,ns +C Only the k-points with inlcuded bands are considered for the projectors. + IF(.NOT.kp(ik,is)%included) CYCLE + nbtop=kp(ik,is)%nb_top + nbbot=kp(ik,is)%nb_bot + IF(ALLOCATED(pr_crorb(jcrorb,ik,is)%mat_rep)) THEN + DEALLOCATE(pr_crorb(jcrorb,ik,is)%mat_rep) + ENDIF + ALLOCATE(pr_crorb(jcrorb,ik,is) + & %mat_rep(1,nbbot:nbtop)) + pr_crorb(jcrorb,ik,is)%mat_rep(1,nbbot:nbtop)= + = pr_crorb(jcrorb,ik,is)%mat(1,nbbot:nbtop) +C As a result, prcrorb%matrep = prcrorb%mat + ENDDO + ENDDO +C +C If the basis representation needs a complete spinor rotation approach (matrices of size 2*(2*l+1) ) +C --------------------------------------------------------------------------------------------------- + ELSEIF (reptrans(l,isrt)%ifmixing) THEN +C If this option is used, then ifSO=.TRUE. (because of the restriction in set_ang_trans.f) +C Moreover ifSP=.TRUE. (since ifSO => ifSP in this version) +C As a result, we know that nb_bot(up)=nb_bot(dn) and nb_top(up)=nb_top(dn) + DO ik=1,nk +C Only the k-points with inlcuded bands are considered for the projectors. + IF(.NOT.kp(ik,1)%included) CYCLE + nbbot=kp(ik,1)%nb_bot + nbtop=kp(ik,1)%nb_top +C In this case, the projection matrix will be stored in prcrorb%matrep with is=1. + IF(ALLOCATED(pr_crorb(jcrorb,ik,1)%mat_rep)) THEN + DEALLOCATE(pr_crorb(jcrorb,ik,1)%mat_rep) + ENDIF + ALLOCATE(pr_crorb(jcrorb,ik,1)% + % mat_rep(1:2*(2*l+1),nbbot:nbtop)) +C The element prcrorb%matrep for is=2 is set to 0, since all the matrix will be stored in the matrix matrep for is=1 + IF(.not.ALLOCATED(pr_crorb(jcrorb,ik,2)%mat_rep)) THEN + ALLOCATE(pr_crorb(jcrorb,ik,2)%mat_rep(1,1)) + pr_crorb(jcrorb,ik,2)%mat_rep(1,1)=0.d0 + ENDIF +C Creation of a matrix tmp_mat which "concatenates" up and dn parts of pr_crorb. + ALLOCATE(tmp_mat(1:2*(2*l+1),nbbot:nbtop)) + tmp_mat(1:(2*l+1),nbbot:nbtop)= + = pr_crorb(jcrorb,ik,1)%mat(-l:l,nbbot:nbtop) +C The first (2l+1) lines are the spin-up part of the projection matrix prcrorb%mat. +C +C --------------------------------------------------------------------------------------- +C Interruption of the prgm if there is no dn part of pr_orb. +C ------------------------- +C + IF(.not.ifSP) THEN + WRITE(buf,'(a,a,i2,a)')'The projectors on ', + & 'the dn states are required for isrt = ',isrt, + & ' but there is no spin-polarized input files.' + CALL printout(0) + WRITE(buf,'(a)')'END OF THE PRGM' + CALL printout(0) + STOP + ENDIF +C --------------------------------------------------------------------------------------- +C +C The last (2l+1) lines are the spin-dn part of the projection matrix prcrorb%mat. + tmp_mat((2*l+2):2*(2*l+1),nbbot:nbtop)= + = pr_crorb(jcrorb,ik,2)%mat(-l:l,nbbot:nbtop) +C +C Multiplication by the local rotation matrix ; Up and dn parts are treated independently +C since in lapw2 (-alm) the coefficients Alm, Blm and Clm were calculated in the local frame +C but without taking into account the spinor-rotation matrix. + ALLOCATE(tmp_matbis(1:(2*l+1),nbbot:nbtop)) + tmp_matbis(1:(2*l+1),nbbot:nbtop)= + = tmp_mat(1:(2*l+1),nbbot:nbtop) + CALL rot_projectmat(tmp_matbis, + & l,nbbot,nbtop,jatom,isrt) + tmp_mat(1:(2*l+1),nbbot:nbtop)= + = tmp_matbis(1:(2*l+1),nbbot:nbtop) + tmp_matbis(1:(2*l+1),nbbot:nbtop)= + = tmp_mat(2*l+2:2*(2*l+1),nbbot:nbtop) + CALL rot_projectmat(tmp_matbis, + & l,nbbot,nbtop,jatom,isrt) + tmp_mat(2*l+2:2*(2*l+1),nbbot:nbtop)= + = tmp_matbis(1:(2*l+1),nbbot:nbtop) + DEALLOCATE(tmp_matbis) +C +C Putting pr_crorb in the desired basis associated to (l,isrt) +C + pr_crorb(jcrorb,ik,1)%mat_rep(1:2*(2*l+1),nbbot:nbtop)= + = MATMUL(reptrans(l,isrt)%transmat + & (1:2*(2*l+1),1:2*(2*l+1)), + & tmp_mat(1:2*(2*l+1),nbbot:nbtop)) +C pr_crorb%mat_rep = proj_{new_i} = reptrans*proj_{lm} = *proj_{lm} + DEALLOCATE(tmp_mat) + ENDDO ! End of the ik loop +C +C If the basis representation can be reduce to the up/up block (matrices of size (2*l+1) only) +C -------------------------------------------------------------------------------------------- + ELSE + DO ik=1,nk + DO is=1,ns +C Only the k-points with inlcuded bands are considered for the projectors. + IF(.NOT.kp(ik,is)%included) CYCLE +C In this case, nb_top(up) and nb_bot(up) can differ from nb_top(dn) and nb_bot(dn) + nbbot=kp(ik,is)%nb_bot + nbtop=kp(ik,is)%nb_top + IF(ALLOCATED(pr_crorb(jcrorb,ik,is)%mat_rep)) THEN + DEALLOCATE(pr_crorb(jcrorb,ik,is)%mat_rep) + ENDIF + ALLOCATE(pr_crorb(jcrorb,ik,is) + & %mat_rep(-l:l,nbbot:nbtop)) + pr_crorb(jcrorb,ik,is)%mat_rep(-l:l,nbbot:nbtop)= + = pr_crorb(jcrorb,ik,is)%mat(-l:l,nbbot:nbtop) +C +C Multiplication by the local rotation matrix +C since in lapw2 (-alm) the coefficients Alm, Blm and Clm were calculated in the local frame + CALL rot_projectmat(pr_crorb(jcrorb,ik,is) + & %mat_rep(-l:l,nbbot:nbtop),l,nbbot,nbtop,jatom,isrt) +C +C Putting pr_crorb in the desired basis associated to (l,isrt) + pr_crorb(jcrorb,ik,is)%mat_rep(-l:l,nbbot:nbtop)= + = MATMUL(reptrans(l,isrt)%transmat(-l:l,-l:l), + & pr_crorb(jcrorb,ik,is)%mat_rep(-l:l,nbbot:nbtop)) +C pr_crorb%mat_rep = proj_{new_i} = reptrans*proj_{lm} = *proj_{lm} + ENDDO ! End of the is loop + ENDDO ! End of the ik loop + ENDIF ! End of the if mixing if-then-else + ENDDO ! End of the jcrorb loop +C +C --------------------------------------- +C Theta Projectors for all the orbitals : +C --------------------------------------- +C + DO jorb=1,norb + jatom=orb(jorb)%atom + isrt=orb(jorb)%sort + n=norm_radf(jorb)%n + l=orb(jorb)%l +C +C The case l=0 is a particular case of "non-mixing" basis. +C -------------------------------------------------------- + IF (l==0) THEN +C For the s orbital, no multiplication is needed, since the matrix representation of any rotation +C (and therefore Rloc) is always 1. + DO ik=1,nk + DO is=1,ns +C Only the k-points with inlcuded bands are considered for the projectors. + IF(.NOT.kp(ik,is)%included) CYCLE + nbtop=kp(ik,is)%nb_top + nbbot=kp(ik,is)%nb_bot + IF(ALLOCATED(pr_orb(jorb,ik,is)%matn_rep)) THEN + DEALLOCATE(pr_orb(jorb,ik,is)%matn_rep) + ENDIF + ALLOCATE(pr_orb(jorb,ik,is)%matn_rep + & (1,nbbot:nbtop,1:n)) + pr_orb(jorb,ik,is)%matn_rep(1,nbbot:nbtop,1:n)= + = pr_orb(jorb,ik,is)%matn(1,nbbot:nbtop,1:n) +C As a result, prorb%matnrep = prorb%matn + ENDDO + ENDDO +C +C If the basis representation needs a complete spinor rotation approach (matrices of size 2*(2*l+1) ) +C --------------------------------------------------------------------------------------------------- + ELSEIF (reptrans(l,isrt)%ifmixing) THEN +C If this option is used, then ifSO=.TRUE. (restriction in set_ang_trans.f) +C Moreover ifSP=.TRUE. (since ifSO => ifSP) +C As a result, we know that nb_bot(up)=nb_bot(dn) and nb_top(up)=nb_top(dn) + DO ik=1,nk +C Only the k-points with inlcuded bands are considered for the projectors. + IF(.NOT.kp(ik,1)%included) CYCLE + nbbot=kp(ik,1)%nb_bot + nbtop=kp(ik,1)%nb_top +C In this case, the projection matrix will be stored in prorb%matnrep with is=1. + IF(ALLOCATED(pr_orb(jorb,ik,1)%matn_rep)) THEN + DEALLOCATE(pr_orb(jorb,ik,1)%matn_rep) + ENDIF + ALLOCATE(pr_orb(jorb,ik,1)% + % matn_rep(1:2*(2*l+1),nbbot:nbtop,1:n)) +C The element prorb%matnrep for is=2 is set to 0, since all the matrix will be stored in the matrix matnrep for is=1 + IF(.not.ALLOCATED(pr_orb(jorb,ik,2)%matn_rep)) THEN + ALLOCATE(pr_orb(jorb,ik,2)%matn_rep(1,1,1)) + pr_orb(jorb,ik,2)%matn_rep(1,1,1)=0.d0 + ENDIF +C Creation of a matrix tmp_matn which "concatenates" up and dn parts of pr_orb + ALLOCATE(tmp_matn(1:2*(2*l+1),nbbot:nbtop,1:n)) + tmp_matn(1:(2*l+1),nbbot:nbtop,1:n)= + = pr_orb(jorb,ik,1)%matn(-l:l,nbbot:nbtop,1:n) +C The first (2l+1) lines are the spin-up part of the projection matrix prorb%matn. +C +C --------------------------------------------------------------------------------------- +C Interruption of the prgm if there is no dn part of pr_orb. +C ------------------------- +C + IF(.not.ifSP) THEN + WRITE(buf,'(a,a,i2,a)')'The projectors on ', + & 'the down states are required for isrt = ',isrt, + & ' but there is no spin-polarized input files.' + CALL printout(0) + WRITE(buf,'(a)')'END OF THE PRGM' + CALL printout(0) + STOP + ENDIF +C --------------------------------------------------------------------------------------- +C +C The last (2l+1) lines are the spin-dn part of the projection matrix prorb%matn. + tmp_matn(2*l+2:2*(2*l+1),nbbot:nbtop,1:n)= + = pr_orb(jorb,ik,2)%matn(-l:l,nbbot:nbtop,1:n) +C + DO i=1,n +C Multiplication by the local rotation matrix ; Up and dn parts are treated independently +C since in lapw2 (-alm) the coefficients Alm, Blm and Clm were calculated in the local frame +C but without taking into account the spinor-rotation matrix. + ALLOCATE(tmp_matbis(1:(2*l+1),nbbot:nbtop)) + tmp_matbis(1:(2*l+1),nbbot:nbtop)= + = tmp_matn(1:(2*l+1),nbbot:nbtop,i) + CALL rot_projectmat(tmp_matbis, + & l,nbbot,nbtop,jatom,isrt) + tmp_matn(1:(2*l+1),nbbot:nbtop,i)= + = tmp_matbis(1:(2*l+1),nbbot:nbtop) + tmp_matbis(1:(2*l+1),nbbot:nbtop)= + = tmp_matn(2*l+2:2*(2*l+1),nbbot:nbtop,i) + CALL rot_projectmat(tmp_matbis, + & l,nbbot,nbtop,jatom,isrt) + tmp_matn(2*l+2:2*(2*l+1),nbbot:nbtop,i)= + = tmp_matbis(1:(2*l+1),nbbot:nbtop) + DEALLOCATE(tmp_matbis) +C Putting pr_orb in the desired basis associated to (l,isrt) + pr_orb(jorb,ik,1)%matn_rep + & (1:2*(2*l+1),nbbot:nbtop,i)= + = MATMUL(reptrans(l,isrt)% + & transmat(1:2*(2*l+1),1:2*(2*l+1)), + & tmp_matn(1:2*(2*l+1),nbbot:nbtop,i)) +C pr_orb%matn_rep = proj_{new_i} = reptrans*proj_{lm} = *proj_{lm} + ENDDO ! End of the i-loop + DEALLOCATE(tmp_matn) + ENDDO ! End of the ik loop +C +C If the basis representation can be reduce to the up/up block (matrices of size (2*l+1) only) +C -------------------------------------------------------------------------------------------- + ELSE + DO ik=1,nk + DO is=1,ns +C Only the k-points with inlcuded bands are considered for the projectors. + IF(.NOT.kp(ik,is)%included) CYCLE +C In this case, nb_top(up) and nb_bot(up) can differ from nb_top(dn) and nb_bot(dn) + nbbot=kp(ik,is)%nb_bot + nbtop=kp(ik,is)%nb_top + IF(ALLOCATED(pr_orb(jorb,ik,is)%matn_rep)) THEN + DEALLOCATE(pr_orb(jorb,ik,is)%matn_rep) + ENDIF + ALLOCATE(pr_orb(jorb,ik,is)% + & matn_rep(-l:l,nbbot:nbtop,1:n)) + pr_orb(jorb,ik,is)%matn_rep(-l:l,nbbot:nbtop,1:n)= + = pr_orb(jorb,ik,is)%matn(-l:l,nbbot:nbtop,1:n) +C + DO i=1,n +C Multiplication by the local rotation matrix +C since in lapw2 (-alm) the coefficients Alm, Blm and Clm were calculated in the local frame + CALL rot_projectmat(pr_orb(jorb,ik,is) + & %matn_rep(-l:l,nbbot:nbtop,i), + & l,nbbot,nbtop,jatom,isrt) +C Putting pr_orb in the desired basis associated to (l,isrt) + pr_orb(jorb,ik,is)%matn_rep(-l:l,nbbot:nbtop,i)= + = MATMUL(reptrans(l,isrt)%transmat(-l:l,-l:l), + & pr_orb(jorb,ik,is)%matn_rep(-l:l,nbbot:nbtop,i)) +C pr_orb%matn_rep = proj_{new_i} = reptrans*proj_{lm} = *proj_{lm} + ENDDO ! End of the i loop + ENDDO ! End of the is loop + ENDDO ! End of the ik loop + ENDIF ! End of the if mixing if-then-else + ENDDO ! End of the jorb loop +C +C +C ============================================================================= +C Printing the projectors with k-points 1 and nk in the file fort.18 for test : +C ============================================================================= + DO icrorb=1,ncrorb + iatom=crorb(icrorb)%atom + isrt=crorb(icrorb)%sort + l=crorb(icrorb)%l + WRITE(18,'()') + WRITE(18,'(a,i4)') 'icrorb = ', icrorb + WRITE(18,'(a,i4,a,i4)') 'isrt = ', isrt, ' l = ', l + IF (l==0) THEN + WRITE(18,'(a,i4)') 'ik = ', 1 + DO ib = kp(1,1)%nb_bot,kp(1,1)%nb_top + WRITE(18,*) pr_crorb(icrorb,1,1)%mat_rep(:,ib) + IF (ifSP) + & WRITE(18,*) pr_crorb(icrorb,1,2)%mat_rep(:,ib) + WRITE(18,'()') + ENDDO + WRITE(18,'(a,i4)') 'ik = ', nk + DO ib = kp(nk,1)%nb_bot,kp(nk,1)%nb_top + WRITE(18,*) pr_crorb(icrorb,nk,1)%mat_rep(:,ib) + IF (ifSP) + & WRITE(18,*) pr_crorb(icrorb,nk,2)%mat_rep(:,ib) + WRITE(18,'()') + ENDDO + ELSEIF (reptrans(l,isrt)%ifmixing) THEN + WRITE(18,'(a,i4)') 'ik = ', 1 + DO ib = kp(1,1)%nb_bot,kp(1,1)%nb_top + WRITE(18,*) pr_crorb(icrorb,1,1)%mat_rep(:,ib) + WRITE(18,'()') + ENDDO + WRITE(18,'(a,i4)') 'ik = ', nk + DO ib = kp(nk,1)%nb_bot,kp(nk,1)%nb_top + WRITE(18,*) pr_crorb(icrorb,nk,1)%mat_rep(:,ib) + WRITE(18,'()') + ENDDO + ELSE + WRITE(18,'(a,i4)') 'ik = ', 1 + DO ib = kp(1,1)%nb_bot,kp(1,1)%nb_top + WRITE(18,*) pr_crorb(icrorb,1,1)%mat_rep(:,ib) + IF (ifSP) + & WRITE(18,*) pr_crorb(icrorb,1,2)%mat_rep(:,ib) + WRITE(18,'()') + ENDDO + WRITE(18,'(a,i4)') 'ik = ', nk + DO ib = kp(nk,1)%nb_bot,kp(nk,1)%nb_top + WRITE(18,*) pr_crorb(icrorb,nk,1)%mat_rep(:,ib) + IF (ifSP) + & WRITE(18,*) pr_crorb(icrorb,nk,2)%mat_rep(:,ib) + WRITE(18,'()') + ENDDO + ENDIF + ENDDO +C + DO iorb=1,norb + iatom=orb(iorb)%atom + isrt=orb(iorb)%sort + l=orb(iorb)%l + n=norm_radf(iorb)%n + WRITE(18,'()') + WRITE(18,'(a,i4)') 'iorb = ', iorb + WRITE(18,'(a,i4,a,i4)') 'isrt = ', isrt, ' l = ', l + IF (l==0) THEN + WRITE(18,'(a,i4)') 'ik = ', 1 + DO i=1,n + WRITE(18,'(i4)') i + DO ib = kp(1,1)%nb_bot,kp(1,1)%nb_top + WRITE(18,*) pr_orb(iorb,1,1)%matn_rep(:,ib,i) + IF (ifSP) + & WRITE(18,*) pr_orb(iorb,1,2)%matn_rep(:,ib,i) + WRITE(18,'()') + ENDDO + ENDDO + WRITE(18,'(a,i4)') 'ik = ', nk + DO i=1,n + WRITE(18,'(i4)') i + DO ib = kp(nk,1)%nb_bot,kp(nk,1)%nb_top + WRITE(18,*) pr_orb(iorb,nk,1)%matn_rep(:,ib,i) + IF (ifSP) + & WRITE(18,*) pr_orb(iorb,nk,2)%matn_rep(:,ib,i) + WRITE(18,'()') + ENDDO + ENDDO + ELSEIF(reptrans(l,isrt)%ifmixing) THEN + DO i=1,n + WRITE(18,'(i4)') i + DO ib = kp(1,1)%nb_bot,kp(1,1)%nb_top + WRITE(18,*) pr_orb(iorb,1,1)%matn_rep(:,ib,i) + WRITE(18,'()') + ENDDO + ENDDO + WRITE(18,'(a,i4)') 'ik = ', nk + DO i=1,n + WRITE(18,'(i4)') i + DO ib = kp(nk,1)%nb_bot,kp(nk,1)%nb_top + WRITE(18,*) pr_orb(iorb,nk,1)%matn_rep(:,ib,i) + WRITE(18,'()') + ENDDO + ENDDO + ELSE + DO i=1,n + WRITE(18,'(i4)') i + DO ib = kp(1,1)%nb_bot,kp(1,1)%nb_top + WRITE(18,*) pr_orb(iorb,1,1)%matn_rep(:,ib,i) + IF (ifSP) + & WRITE(18,*) pr_orb(iorb,1,2)%matn_rep(:,ib,i) + WRITE(18,'()') + ENDDO + ENDDO + WRITE(18,'(a,i4)') 'ik = ', nk + DO i=1,n + WRITE(18,'(i4)') i + DO ib = kp(nk,1)%nb_bot,kp(nk,1)%nb_top + WRITE(18,*) pr_orb(iorb,nk,1)%matn_rep(:,ib,i) + IF (ifSP) + & WRITE(18,*) pr_orb(iorb,nk,2)%matn_rep(:,ib,i) + WRITE(18,'()') + ENDDO + ENDDO + ENDIF + ENDDO +C + RETURN + END + diff --git a/fortran/dmftproj/set_rotloc.f b/fortran/dmftproj/set_rotloc.f new file mode 100644 index 00000000..d2cbec16 --- /dev/null +++ b/fortran/dmftproj/set_rotloc.f @@ -0,0 +1,368 @@ + +c ****************************************************************************** +c +c TRIQS: a Toolbox for Research in Interacting Quantum Systems +c +c Copyright (C) 2011 by L. Pourovskii, V. Vildosola, C. Martins, M. Aichhorn +c +c TRIQS is free software: you can redistribute it and/or modify it under the +c terms of the GNU General Public License as published by the Free Software +c Foundation, either version 3 of the License, or (at your option) any later +c version. +c +c TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +c WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +c FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +c details. +c +c You should have received a copy of the GNU General Public License along with +c TRIQS. If not, see . +c +c *****************************************************************************/ + + SUBROUTINE set_rotloc +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine sets up the Global->local coordinates %% +C %% rotational matrices for each atom of the system. %% +C %% These matrices will be used to create the projectors. %% +C %% (They are the SR matrices defined in the tutorial file.) %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C ---------------------------- + USE common_data + USE reps + USE symm + USE prnt + IMPLICIT NONE + COMPLEX(KIND=8), DIMENSION(:,:), ALLOCATABLE :: tmp_rot, spinrot + REAL(KIND=8) :: alpha, beta, gama, factor + INTEGER :: iatom, jatom, imu, isrt + INTEGER :: is, is1, isym, l, lm + INTEGER :: ind1, ind2, inof1, inof2 + COMPLEX(KIND=8) :: ephase +C +C ==================================================== +C Multiplication by an S matrix for equivalent sites : +C ==================================================== +C Up to now, rotloc is the rotloc matrix (from Global to local coordinates rotation : (rotloc)_ij = ) +C The matrix S to go from the representative atom of the sort to another one must be introduced. That's what is done here-after. + DO isrt=1,nsort + iatom=SUM(nmult(0:isrt-1))+1 + DO imu=1,nmult(isrt) + jatom=iatom+imu-1 + DO isym=1,nsym +C If the symmetry operation isym transforms the representative atom iatom in the jatom, +C the matrix rotloc is multiplied by the corresponding srot matrix, for each orbital number l. +C if R[isym](iatom) = jatom, rotloc is multiplied by R[isym] and Rloc is finally R[isym] X rotloc = + IF(srot(isym)%perm(iatom)==jatom) THEN + WRITE(17,*) ' For jatom = ',jatom, ', isym =', isym + rotloc(jatom)%srotnum=isym +C Calculation of krotm and iprop. + rotloc(jatom)%krotm(1:3,1:3)= + = MATMUL(srot(isym)%krotm(1:3,1:3), + & rotloc(jatom)%krotm(1:3,1:3)) + rotloc(jatom)%iprop=rotloc(jatom)%iprop* + * srot(isym)%iprop +C Evaluation of the Euler angles of the final operation Rloc + CALL euler(TRANSPOSE(rotloc(jatom)%krotm(1:3,1:3)), + & alpha,beta,gama) +C According to Wien convention, euler takes in argument the transpose +C of the matrix rotloc(jatom)%krotm to give a,b anc c of rotloc(jatom). + rotloc(jatom)%a=alpha + rotloc(jatom)%b=beta + rotloc(jatom)%g=gama +C +C ============================================================================================================= +C Calculation of the rotational matrices and evaluation of the fields timeinv and phase for the Rloc matrices : +C ============================================================================================================= + IF(ifSP.AND.ifSO) THEN +C No time reversal operation is applied to rotloc (alone). If a time reversal operation must be applied, +C it comes from the symmetry operation R[isym]. That is why the field timeinv is the same as the one from srot. + rotloc(jatom)%timeinv=srot(isym)%timeinv + rotloc(jatom)%phase=0.d0 + DO l=1,lmax + ALLOCATE(tmp_rot(1:2*(2*l+1),1:2*(2*l+1))) + tmp_rot=0.d0 +C Whatever the value of beta (0 or Pi), the spinor rotation matrix of isym is block-diagonal. +C because the time-reversal operation have been applied if necessary. + factor=srot(isym)%phase/2.d0 + ephase=EXP(CMPLX(0.d0,factor)) +C We remind that the field phase is (g-a) if beta=Pi. As a result, ephase = exp(+i(g-a)/2) = -exp(+i(alpha-gamma)/2) +C We remind that the field phase is (a+g) if beta=0. As a result, ephase = exp(+i(a+g)/2)=-exp(-i(alpha+gamma)/2) +C in good agreement with Wien conventions for the definition of this phase factor. +C Up/up block : + tmp_rot(1:2*l+1,1:2*l+1)=ephase* + & srot(isym)%rotl(-l:l,-l:l,l) +C Dn/dn block : + ephase=CONJG(ephase) +C now, ephase = exp(+i(a-g)/2) = -exp(-i(alpha-gamma)/2) if beta=Pi +C now, ephase = exp(-i(a+g)/2) = -exp(+i(alpha+gamma)/2) if beta=0 + tmp_rot(2*l+2:2*(2*l+1),2*l+2:2*(2*l+1))= + & ephase*srot(isym)%rotl(-l:l,-l:l,l) + IF (rotloc(jatom)%timeinv) THEN +C In this case, the time reversal operator was applied to srot. + rotloc(jatom)%rotl(1:2*(2*l+1),1:2*(2*l+1),l)= + & MATMUL(tmp_rot(1:2*(2*l+1),1:2*(2*l+1)),CONJG( + & rotloc(jatom)%rotl(1:2*(2*l+1),1:2*(2*l+1),l))) +C rotloc(jatom)%rotl now contains D(Rloc) = D(R[isym])*transpose[D(rotloc)]. + ELSE +C In this case, no time reversal operator was applied to srot. + rotloc(jatom)%rotl(1:2*(2*l+1),1:2*(2*l+1),l)= + & MATMUL(tmp_rot(1:2*(2*l+1),1:2*(2*l+1)), + & rotloc(jatom)%rotl(1:2*(2*l+1),1:2*(2*l+1),l)) +C rotloc(jatom)%rotl now contains D(Rloc) = D(R[isym])*D(rotloc). + ENDIF + DEALLOCATE(tmp_rot) + ENDDO + ELSE +C Calculation of the rotational matrices associated to Rloc + ALLOCATE(tmp_rot(1:2*lmax+1,1:2*lmax+1)) + DO l=1,lmax +C Use of the subroutine dmat to compute the rotational matrix +C associated to the Rloc operation in a (2*l+1) space : + tmp_rot=0.d0 + CALL dmat(l,rotloc(jatom)%a,rotloc(jatom)%b, + & rotloc(jatom)%g, + & REAL(rotloc(jatom)%iprop,KIND=8),tmp_rot,2*lmax+1) + rotloc(jatom)%rotl(-l:l,-l:l,l)= + = tmp_rot(1:2*l+1,1:2*l+1) +C rotloc(jatom)%rotl = table of the rotational matrices of the symmetry operation +C for the different l orbital (from 1 to lmax), in the usual complex basis : dmat = D(R[isym])_l +C rotloc(jatom)%rotl = D(Rloc[jatom])_{lm} + ENDDO + DEALLOCATE(tmp_rot) + ENDIF ! End of the "ifSO-ifSP" if-then-else +C + EXIT +C Only one symmetry operation is necessary to be applied to R to get the complete rotloc matrix. +C This EXIT enables to leave the loop as soon as a symmetry operation which transforms the representative atom in jatom is found. + ENDIF ! End of the "perm" if-then-else + ENDDO ! End of the isym loop +C +C +C =========================================================== +C Computation of the rotational matrices in each sort basis : +C =========================================================== + ALLOCATE(rotloc(jatom)%rotrep(lmax)) +C +C Initialization of the rotloc(jatom)%rotrep field = D(Rloc)_{new_i} +C This field is a table of size lmax which contains the rotloc matrices +C in the representation basis associated to each included orbital of the jatom. + DO l=1,lmax + ALLOCATE(rotloc(jatom)%rotrep(l)%mat(1,1)) + rotloc(jatom)%rotrep(l)%mat(1,1)=0.d0 + ENDDO +C +C Computation of the elements 'mat' in rotloc(jatom)%rotrep(l) + DO l=1,lmax +C The considered orbital is not included, hence no computation + IF (lsort(l,isrt)==0) cycle +C The considered orbital is included + IF (ifSP.AND.ifSO) THEN +C In this case, the basis representation needs a complete spinor rotation approach (matrices of size 2*(2*l+1) ) +C -------------------------------------------------------------------------------------------------------------- + DEALLOCATE(rotloc(jatom)%rotrep(l)%mat) + ALLOCATE(rotloc(jatom)%rotrep(l)%mat + & (1:2*(2*l+1),1:2*(2*l+1))) + ALLOCATE(tmp_rot(1:2*(2*l+1),1:2*(2*l+1))) +C Computation of rotloc(jatom)%rotrep(l)%mat + IF (reptrans(l,isrt)%ifmixing) THEN +C In this case, the basis representation requires a complete spinor rotation approach too. + IF(rotloc(jatom)%timeinv) THEN + tmp_rot(1:2*(2*l+1),1:2*(2*l+1))=MATMUL( + & reptrans(l,isrt)%transmat(1:2*(2*l+1),1:2*(2*l+1)), + & rotloc(jatom)%rotl(1:2*(2*l+1),1:2*(2*l+1),l)) + rotloc(jatom)%rotrep(l)%mat(1:2*(2*l+1),1:2*(2*l+1))= + = MATMUL(tmp_rot(1:2*(2*l+1),1:2*(2*l+1)), + & TRANSPOSE(reptrans(l,isrt)%transmat + & (1:2*(2*l+1),1:2*(2*l+1)))) +C Since the operation is antilinear, the field rotloc(jatom)%rotrep(l)%mat = (reptrans)*spinrot(l)*conjugate(inverse(reptrans)) +C rotloc(jatom)%rotrep(l)%mat = D(Rloc)_{new_i} = D(Rloc)_{lm} []^* +C which is exactly the expression of the spinor rotation matrix in the new basis. + ELSE + tmp_rot(1:2*(2*l+1),1:2*(2*l+1))=MATMUL( + & reptrans(l,isrt)%transmat(1:2*(2*l+1),1:2*(2*l+1)), + & rotloc(jatom)%rotl(1:2*(2*l+1),1:2*(2*l+1),l)) + rotloc(jatom)%rotrep(l)%mat(1:2*(2*l+1),1:2*(2*l+1))= + = MATMUL(tmp_rot(1:2*(2*l+1),1:2*(2*l+1)), + & TRANSPOSE(CONJG(reptrans(l,isrt)%transmat + & (1:2*(2*l+1),1:2*(2*l+1))))) +C Since the operation is linear, the field rotloc(jatom)%rotrep(l)%mat = (reptrans)*spinrot(l)*inverse(reptrans) +C rotloc(jatom)%rotrep(l)%mat = D(Rloc)_{new_i} = D(Rloc)_{lm} +C which is exactly the expression of the spinor rotation matrix in the new basis. + ENDIF + ELSE +C In this case, the basis representation is reduced to the up/up block and must be extended. + ALLOCATE(spinrot(1:2*(2*l+1),1:2*(2*l+1))) + spinrot(1:2*(2*l+1),1:2*(2*l+1))=0.d0 + spinrot(1:2*l+1,1:2*l+1)= + & reptrans(l,isrt)%transmat(-l:l,-l:l) + spinrot(2*l+2:2*(2*l+1),2*l+2:2*(2*l+1))= + & reptrans(l,isrt)%transmat(-l:l,-l:l) + IF(rotloc(jatom)%timeinv) THEN + tmp_rot(1:2*(2*l+1),1:2*(2*l+1))=MATMUL( + & spinrot(1:2*(2*l+1),1:2*(2*l+1)), + & rotloc(jatom)%rotl(1:2*(2*l+1),1:2*(2*l+1),l)) + rotloc(jatom)%rotrep(l)%mat(1:2*(2*l+1),1:2*(2*l+1))= + = MATMUL(tmp_rot(1:2*(2*l+1),1:2*(2*l+1)), + & TRANSPOSE(spinrot(1:2*(2*l+1),1:2*(2*l+1)))) +C Since the operation is antilinear, the field rotloc(jatom)%rotrep(l)%mat = (reptrans)*spinrot(l)*conjugate(inverse(reptrans)) +C rotloc(jatom)%rotrep(l)%mat = D(Rloc)_{new_i} = D(Rloc)_{lm} []^* +C which is exactly the expression of the spinor rotation matrix in the new basis. + ELSE + tmp_rot(1:2*(2*l+1),1:2*(2*l+1))=MATMUL( + & spinrot(1:2*(2*l+1),1:2*(2*l+1)), + & rotloc(jatom)%rotl(1:2*(2*l+1),1:2*(2*l+1),l)) + rotloc(jatom)%rotrep(l)%mat(1:2*(2*l+1),1:2*(2*l+1))= + = MATMUL(tmp_rot(1:2*(2*l+1),1:2*(2*l+1)), + & TRANSPOSE(CONJG(spinrot(1:2*(2*l+1),1:2*(2*l+1))))) +C Since the operation is linear, the field rotloc(jatom)%rotrep(l)%mat = (reptrans)*spinrot(l)*inverse(reptrans) +C rotloc(jatom)%rotrep(l)%mat = D(Rloc)_{new_i} = D(Rloc)_{lm} +C which is exactly the expression of the spinor rotation matrix in the new basis. + ENDIF + DEALLOCATE(spinrot) + ENDIF ! End of the if mixing if-then-else + DEALLOCATE(tmp_rot) +C + ELSE +C If the basis representation can be reduce to the up/up block (matrices of size (2*l+1) only) +C -------------------------------------------------------------------------------------------- + DEALLOCATE(rotloc(jatom)%rotrep(l)%mat) + ALLOCATE(rotloc(jatom)%rotrep(l)%mat(-l:l,-l:l)) + ALLOCATE(tmp_rot(-l:l,-l:l)) +C Computation of rotloc(jatom)%rotrep(l)%mat + tmp_rot(-l:l,-l:l)=MATMUL( + & reptrans(l,isrt)%transmat(-l:l,-l:l), + & rotloc(jatom)%rotl(-l:l,-l:l,l)) + rotloc(jatom)%rotrep(l)%mat(-l:l,-l:l)= + = MATMUL(tmp_rot(-l:l,-l:l), + & TRANSPOSE(CONJG(reptrans(l,isrt)%transmat(-l:l,-l:l)))) +C the field rotloc(jatom)%rotrep(l)%mat = (reptrans)*rotl*inverse(reptrans) +C rotloc(jatom)%rotrep(l)%mat = D(Rloc)_{new_i} = D(Rloc)_{lm} +C which is exactly the expression of the rotation matrix for the up/up block in the new basis. + DEALLOCATE(tmp_rot) + ENDIF + ENDDO ! End of the l loop + ENDDO ! End of the jatom loop + ENDDO ! End of the isrt loop +C + RETURN + END + + + SUBROUTINE euler(Rot,a,b,c) +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine calculates the Euler angles a, b and c of Rot. %% +C %% The result are stored in a,b,c. (same as in SRC_lapwdm/euler.f) %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C + IMPLICIT NONE + REAL(KIND=8) :: a,aa,b,bb,c,cc,zero,pi,y_norm,dot + REAL(KIND=8), DIMENSION(3,3) :: Rot, Rot_temp + REAL(KIND=8), DIMENSION(3) :: z,zz,y,yy,yyy,pom,x,xx + INTEGER :: i,j +C Definition of the constants + zero=0d0 + pi=ACOS(-1d0) +C Definition of Rot_temp=Id + DO i=1,3 + DO j=1,3 + Rot_temp(i,j)=0 + IF (i.EQ.j) Rot_temp(i,i)=1 + ENDDO + ENDDO +C Initialization of y=e_y, z=e_z, yyy and zz + DO j=1,3 + y(j)=Rot_temp(j,2) + yyy(j)=Rot(j,2) + z(j)=Rot_temp(j,3) + zz(j)=Rot(j,3) + ENDDO +C Calculation of yy + CALL vecprod(z,zz,yy) + y_norm=DSQRT(dot(yy,yy)) + IF (y_norm.lt.1d-10) THEN +C If yy=0, this implies that b is zero or pi + IF (ABS(dot(y,yyy)).gt.1d0) THEN + aa=dot(y,yyy)/ABS(dot(y,yyy)) + a=ACOS(aa) + ELSE + a=ACOS(dot(y,yyy)) + ENDIF +C + IF (dot(z,zz).gt.zero) THEN + c=zero + b=zero + IF (yyy(1).gt.zero) a=2*pi-a + ELSE + c=a + a=zero + b=pi + IF (yyy(1).lt.zero) c=2*pi-c + ENDIF + ELSE +C If yy is not 0, then b belongs to ]0,pi[ + DO j=1,3 + yy(j)=yy(j)/y_norm + ENDDO +C + aa=dot(y,yy) + bb=dot(z,zz) + cc=dot(yy,yyy) + IF (ABS(aa).gt.1d0) aa=aa/ABS(aa) + IF (ABS(bb).gt.1d0) bb=bb/ABS(bb) + IF (ABS(cc).gt.1d0) cc=cc/ABS(cc) + b=ACOS(bb) + a=ACOS(aa) + c=ACOS(cc) + IF (yy(1).gt.zero) a=2*pi-a + CALL vecprod(yy,yyy,pom) + IF (dot(pom,zz).lt.zero) c=2*pi-c + ENDIF +C + END + + + SUBROUTINE vecprod(a,b,c) +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine calculates the vector product of a and b. %% +C %% The result is stored in c. (same as in SRC_lapwdm/euler.f) %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C + IMPLICIT NONE + REAL(KIND=8), DIMENSION(3) :: a,b,c +C + c(1)=a(2)*b(3)-a(3)*b(2) + c(2)=a(3)*b(1)-a(1)*b(3) + c(3)=a(1)*b(2)-a(2)*b(1) +C + END + + REAL(KIND=8) FUNCTION dot(a,b) +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This function calculates the scalar product of a and b. %% +C %% The result is stored in dot. (same as in SRC_lapwdm/euler.f) %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C + IMPLICIT NONE + REAL(KIND=8) :: a,b + INTEGER :: i + dimension a(3),b(3) + dot=0 + DO i=1,3 + dot=dot+a(i)*b(i) + ENDDO +C + END + + + diff --git a/fortran/dmftproj/setsym.f b/fortran/dmftproj/setsym.f new file mode 100644 index 00000000..877a2007 --- /dev/null +++ b/fortran/dmftproj/setsym.f @@ -0,0 +1,886 @@ + +c ****************************************************************************** +c +c TRIQS: a Toolbox for Research in Interacting Quantum Systems +c +c Copyright (C) 2011 by L. Pourovskii, V. Vildosola, C. Martins, M. Aichhorn +c +c TRIQS is free software: you can redistribute it and/or modify it under the +c terms of the GNU General Public License as published by the Free Software +c Foundation, either version 3 of the License, or (at your option) any later +c version. +c +c TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +c WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +c FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +c details. +c +c You should have received a copy of the GNU General Public License along with +c TRIQS. If not, see . +c +c *****************************************************************************/ + + SUBROUTINE setsym +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine sets up the symmetry matrices of the structure %% +C %% and the local rotation matrices for each atom of the system. %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C ---------------------------- + USE common_data + USE factorial + USE file_names + USE prnt + USE reps + USE symm + IMPLICIT NONE +C + COMPLEX(KIND=8), DIMENSION(:,:), ALLOCATABLE :: tmp_rot, spinrot + COMPLEX(KIND=8), DIMENSION(:,:),ALLOCATABLE :: tmat + COMPLEX(KIND=8), DIMENSION(:,:,:),ALLOCATABLE :: tmp_dmat + REAL(KIND=8) :: factor + INTEGER :: l, isym, mmax, nrefl, i, m, isrt, lms + INTEGER :: lm, is, is1 + INTEGER :: iatom, imu, iatomref + REAL(KIND=8) :: det + REAL(KIND=8), DIMENSION(:),ALLOCATABLE :: bufreal + COMPLEX(KIND=8), DIMENSION(:),ALLOCATABLE :: bufcomp + COMPLEX(KIND=8), DIMENSION(:,:),ALLOCATABLE :: tmpcomp + COMPLEX(KIND=8), DIMENSION(1:2,1:2) :: spmt + +C +C + WRITE(buf,'(a)')'=======================================' + CALL printout(0) + WRITE(buf,'(a)')'Symmetry operations of the system' + CALL printout(1) +C +C =========================================== +C Reading of the symmetry file case.dmftsym : +C =========================================== + CALL setfact(170) + READ(iusym,*)nsym + WRITE(buf,'(a,i4)')'Number of Symmetries = ',nsym + CALL printout(0) + CALL printout(0) +C nsym = total number of symmetry operations for the structure + lsym=lmax + nlmsym=2*lsym+1 +C lsym = maximal orbital number for the symmetry +C nlmsym = maximal size of the representation for the symmetry + ALLOCATE(srot(nsym)) + DO isym=1,nsym + ALLOCATE(srot(isym)%perm(natom)) + READ(iusym,*)srot(isym)%perm + ENDDO +C srot = table of symop elements from to 1 to nsym. +C the field srot(isym)%perm = the table of permutation for the isym symmetry (table from 1 to natom) +C srot(isym)%perm(iatom) = R[isym](iatom) = image by R[isym] fo iatom + WRITE(buf,'(a)')'Properties of the symmetry operations :' + CALL printout(0) + WRITE(buf,'(a)') ' alpha, beta, gamma are their Euler angles.' + CALL printout(0) + WRITE(buf,'(a)') ' iprop is the value of their determinant.' + CALL printout(0) + CALL printout(0) + WRITE(buf,'(a)')' SYM.OP. alpha beta gamma iprop' + CALL printout(0) + DO isym=1,nsym + READ(iusym,'()') + READ(iusym,'()') + READ(iusym,'(3(f6.1),i3)') srot(isym)%a, srot(isym)%b, + & srot(isym)%g, srot(isym)%iprop +C Printing the matrices parameters in the file case.outdmftpr + WRITE(buf,'(i5,3F10.1,5x,i3)')isym, + & srot(isym)%a,srot(isym)%b,srot(isym)%g,srot(isym)%iprop + CALL printout(0) + srot(isym)%a=srot(isym)%a/180d0*Pi + srot(isym)%b=srot(isym)%b/180d0*Pi + srot(isym)%g=srot(isym)%g/180d0*Pi +C the field srot(isym)%a is linked to the Euler precession angle (alpha) +C the field srot(isym)%b is linked to the Euler nutation angle (beta) +C the field srot(isym)%c is linked to the Euler intrinsic rotation angle (gamma) +C They are read in case.dmftsym in degree and are then transformed into radians +C the field sort(isym)% iprop = value of the transformation determinant (1 or -1), +C determines if there is an inversion in the transformation + READ(iusym,*)(srot(isym)%krotm(1:3,i),i=1,3) + srot(isym)%krotm(1:3,1:3)= + & TRANSPOSE(srot(isym)%krotm(1:3,1:3)) +C the field srot(isym)%krotm = 3x3 matrices of rotation associated to the transformation (R[isym]). +C (without the global inversion). The matrix was multiplied by the value of iprop before being written in case.dmftsym. +C This reading line was chosen to be consistent with the writing line in rotmat_dmft (in SRC_lapw2) + ENDDO +C +C ============================================================= +C Determination of the properties for each symmetry operation : +C ============================================================= +C +C Creation of the rotational matrices for each orbital : +C ------------------------------------------------------ + DO isym=1,nsym + ALLOCATE(srot(isym)%rotl(-lsym:lsym,-lsym:lsym,lsym)) + srot(isym)%rotl=0.d0 + ALLOCATE(tmat(1:2*lsym+1,1:2*lsym+1)) + DO l=1,lsym +C Use of the subroutine dmat to compute the the rotational matrix +C associated to the isym symmetry operation in a (2*l+1) space : + CALL dmat(l,srot(isym)%a,srot(isym)%b,srot(isym)%g, + & REAL(srot(isym)%iprop,KIND=8),tmat,2*lsym+1) + srot(isym)%rotl(-l:l,-l:l,l)=tmat(1:2*l+1,1:2*l+1) +C srot(isym)%rotl = table of the rotationnal matrices of the symmetry operation +C for the different l orbital (from 1 to lsym), in the usual complex basis : dmat = D(R[isym])_l +C srot(isym)%rotl = D(R[isym])_{lm} + ENDDO + DEALLOCATE(tmat) +C +C +C Determination of the fields timeinv and phase (if SP+SO computations): +C ---------------------------------------------------------------------- +C If the calculation is spin-polarized with spin-orbit, the magnetic spacegroup of the +C system is of type III (black-and-white type). The operation must then be classified +C according to their keeping the z-axis invariant or not. +C +C srot(isym)%timeinv = boolean indicating if a time reversal operation is required + IF(ifSP.AND.ifSO) THEN + det=srot(isym)%krotm(1,1)*srot(isym)%krotm(2,2)- + - srot(isym)%krotm(1,2)*srot(isym)%krotm(2,1) +C the value of det is cos(srot(isym)%b) even if the rotation is improper. + IF(det < 0.0d0) THEN + srot(isym)%timeinv=.TRUE. +C The direction of the magnetic moment is changed to its opposite ( srot(isym)%b=pi ), +C A time reversal operation is required. + srot(isym)%phase=srot(isym)%g-srot(isym)%a +C In this case, we define a phase factor for the off-diagonal term (up/dn term) +C which is srot(isym)%phase= g-a = 2pi+(alpha-gamma) + ELSE + srot(isym)%timeinv=.FALSE. +C The direction of the magnetic moment is unchanged ( srot(isym)%b=0 ), +C no time reversal operation is required. + srot(isym)%phase=srot(isym)%a+srot(isym)%g +C In this case, we define a phase factor for the off-diagonal term (up/dn term) +C which is srot(isym)%phase= a+g = 2pi-(alpha+gamma) + ENDIF + ELSE +C If the calculation is either spin-polarized without spin-orbit, or paramagnetic +C the magnetic spacegroup of the system is of type I (ordinary type). The operation +C are thus merely applied. + srot(isym)%timeinv=.FALSE. + srot(isym)%phase=0.d0 + ENDIF ! End of the ifSP if-then-else +C +C +C Computation of the rotational matrices in each sort basis : +C ----------------------------------------------------------- + ALLOCATE(srot(isym)%rotrep(lsym,nsort)) +C +C Initialization of the srot(isym)%rotrep field +C This field is a table of size (lsym*nsort) which contains the rotation matrices +C of isym in the representation basis associated to each included orbital of each atom. +C srot(isym)%rotrep = D(R[isym])_{new_i} + DO isrt=1,nsort + DO l=1,lsym + ALLOCATE(srot(isym)%rotrep(l,isrt)%mat(1,1)) + srot(isym)%rotrep(l,isrt)%mat(1,1)=0.d0 + ENDDO + ENDDO +C +C Computation of the elements 'mat' in srot(isym)%rotrep(l,isrt) + DO isrt=1,nsort + IF (notinclude(isrt)) cycle + DO l=1,lsym +C The considered orbital is not included, hence no computation + IF (lsort(l,isrt)==0) cycle +C The considered orbital is included + IF (reptrans(l,isrt)%ifmixing) THEN +C If the basis representation needs a complete spinor rotation approach (matrices of size 2*(2*l+1) ) +C If this option is used, then ifSO=.TRUE. (because of the restriction in set_ang_trans.f) +C Moreover ifSP=.TRUE. (since ifSO => ifSP in this version) + DEALLOCATE(srot(isym)%rotrep(l,isrt)%mat) + ALLOCATE(srot(isym)%rotrep(l,isrt)%mat + & (1:2*(2*l+1),1:2*(2*l+1))) + ALLOCATE(tmp_rot(1:2*(2*l+1),1:2*(2*l+1))) + ALLOCATE(spinrot(1:2*(2*l+1),1:2*(2*l+1))) + spinrot=0.d0 +C Computation of the full spinor rotation matrix associated to isym. + CALL spinrotmat(spinrot,isym,l) +C Computation of srot(isym)%rotrep(l,isrt)%mat + tmp_rot(1:2*(2*l+1),1:2*(2*l+1))=MATMUL( + & reptrans(l,isrt)%transmat(1:2*(2*l+1),1:2*(2*l+1)), + & spinrot(1:2*(2*l+1),1:2*(2*l+1))) + srot(isym)%rotrep(l,isrt)%mat(1:2*(2*l+1),1:2*(2*l+1))= + = MATMUL(tmp_rot(1:2*(2*l+1),1:2*(2*l+1)), + & TRANSPOSE(CONJG(reptrans(l,isrt)%transmat + & (1:2*(2*l+1),1:2*(2*l+1))))) +C the field srot(isym)%rotrep(l,isrt)%mat = (reptrans)*spinrot(l)*inverse(reptrans) +C or srot(isym)%rotrep = D(R[isym])_{new_i} = D(R[isym])_{lm} +C which is exactly the expression of the spinor rotation matrix in the new basis. + DEALLOCATE(tmp_rot) + DEALLOCATE(spinrot) + ELSE +C If the basis representation can be reduce to the up/up block (matrices of size (2*l+1) only) + DEALLOCATE(srot(isym)%rotrep(l,isrt)%mat) + ALLOCATE(srot(isym)%rotrep(l,isrt)%mat(-l:l,-l:l)) + ALLOCATE(tmp_rot(-l:l,-l:l)) +C Computation of srot(isym)%rotrep(l,isrt)%mat + tmp_rot(-l:l,-l:l)=MATMUL( + & reptrans(l,isrt)%transmat(-l:l,-l:l), + & srot(isym)%rotl(-l:l,-l:l,l)) + srot(isym)%rotrep(l,isrt)%mat(-l:l,-l:l)= + = MATMUL(tmp_rot(-l:l,-l:l), + & TRANSPOSE(CONJG(reptrans(l,isrt)%transmat(-l:l,-l:l)))) +C the field srot(isym)%rotrep(l,isrt)%mat = (reptrans)*rotl*inverse(reptrans) +C or srot(isym)%rotrep = D(R[isym])_{new_i} = D(R[isym])_{lm} +C which is exactly the expression of the rotation matrix for the up/up block in the new basis. + DEALLOCATE(tmp_rot) + ENDIF + ENDDO ! End of the l loop + ENDDO ! End of the isrt loop + ENDDO ! End of the isym loop +C +C +C ============================================================= +C Printing the matrix parameters in the file fort.17 for test : +C ============================================================= + DO isym=1,nsym + WRITE(17,'()') + WRITE(17,'(a,i3)')' Sym. op.: ',isym + DO i =1,3 + ALLOCATE(bufreal(3)) + bufreal(1:3)=srot(isym)%krotm(i,1:3) + WRITE(17,'(3f10.4)') bufreal + DEALLOCATE(bufreal) + ENDDO + WRITE(17,'(a,3f8.1,i4)')'a, b, g, iprop =', + & srot(isym)%a*180d0/Pi,srot(isym)%b*180d0/Pi, + & srot(isym)%g*180d0/Pi,srot(isym)%iprop +C Printing the data relative to SP option + IF (ifSP) THEN + WRITE(17,*)'If DIR. magn. mom. is inverted :' + & ,srot(isym)%timeinv + WRITE(17,*)'phase = ',srot(isym)%phase + ENDIF +C Printing the rotational matrices for each orbital number l. + WRITE(17,'()') + DO l=1,lsym + WRITE(17,'(a,a,i2)')'Rotation matrix ', + & 'D(R[isym])_{lm} for l = ',l + DO m=-l,l + ALLOCATE(bufcomp(-l:l)) + bufcomp(-l:l)=srot(isym)%rotl(m,-l:l,l) + WRITE(17,'(7(2f7.3,x))') bufcomp + DEALLOCATE(bufcomp) + ENDDO + ENDDO +C Printing the matrices rotrep(l,isrt)%mat + WRITE(17,'()') + DO isrt=1,nsort + IF (notinclude(isrt)) cycle + DO l=1,lsym + IF (lsort(l,isrt)==0) cycle + WRITE(17,'(a,i2,a,i2)')'Representation for isrt = ', + & isrt,' and l= ',l + IF (reptrans(l,isrt)%ifmixing) THEN + DO m=1,2*(2*l+1) + ALLOCATE(bufcomp(1:2*(2*l+1))) + bufcomp(1:2*(2*l+1))= + & srot(isym)%rotrep(l,isrt)%mat(m,1:2*(2*l+1)) + WRITE(17,'(7(2f7.3,x))') bufcomp + DEALLOCATE(bufcomp) + ENDDO + ELSE + DO m=-l,l + ALLOCATE(bufcomp(-l:l)) + bufcomp(-l:l)= + & srot(isym)%rotrep(l,isrt)%mat(m,-l:l) + WRITE(17,'(7(2f7.3,x))') bufcomp + DEALLOCATE(bufcomp) + ENDDO + ENDIF + ENDDO + ENDDO + ENDDO +C +C +C ================================================================================= +C Applying time-reversal operator if the system is spin-polarized with Spin Orbit : +C ================================================================================= +C +C If the calculation is spin-polarized with spin-orbit, the magnetic spacegroup of the compound +C is of type III (black-and-white). The symmetry operations which reverse the z-axis must be +C multiplied by the time-reversal operator. +C If spin-orbit is not taken into account, all the field timeinv are .FALSE. and no time-reversal +C is applied, since the magnetic spacegroup of the compound is of type I (ordinary). + IF (ifSP) THEN +C The modification of srot(isym)%rotl is done for each isym + DO isym=1,nsym + DO l=1,lsym + IF (srot(isym)%timeinv) THEN +C The field srot(isym)%rotl is multiplied by the time-reversal operator in the complex basis. + ALLOCATE(tmpcomp(-l:l,-l:l)) + tmpcomp(-l:l,-l:l)= + & srot(isym)%rotl(-l:l,-l:l,l) + CALL timeinv_op(tmpcomp,(2*l+1),l,0) + srot(isym)%rotl(-l:l,-l:l,l)=tmpcomp(-l:l,-l:l) + DEALLOCATE(tmpcomp) +C The field srot(isym)%phase must not be modified. + END IF + END DO + END DO +C +C The other modification are done for each (isrt,l) included. + DO isrt=1,nsort + IF (notinclude(isrt)) cycle + DO l=1,lsym +C The considered orbital is not included, hence no computation + IF (lsort(l,isrt)==0) cycle +C If the basis representation needs a complete spinor rotation approach (matrices of size 2*(2*l+1) ) + IF (reptrans(l,isrt)%ifmixing) THEN + DO isym=1,nsym + IF (srot(isym)%timeinv) THEN +C The field srot(isym)%rotrep(l,isrt)%mat is multiplied by the time-reversal operator in the corresponding basis of isrt. + CALL timeinv_op(srot(isym)%rotrep(l,isrt)%mat, + & 2*(2*l+1),l,isrt) + END IF + END DO ! End of the isym loop +C If the basis representation can be reduce to the up/up block (matrices of size (2*l+1) only) + ELSE + DO isym=1,nsym + IF (srot(isym)%timeinv) THEN +C The field srot(isym)%rotrep(l,isrt)%mat is multiplied by the time-reversal operator in the corresponding basis of isrt. + CALL timeinv_op(srot(isym)%rotrep(l,isrt)%mat, + & (2*l+1),l,isrt) + END IF + END DO ! End of the isym loop + END IF ! End of the ifmixing if-then-else + END DO ! End of the l loop + END DO ! End of the isrt loop + END IF ! End of the ifSP if-then-else +C +C +C ====================================================================== +C Printing the time-reversal modification in the file fort.17 for test : +C ====================================================================== + IF (ifSP.AND.ifSO) THEN + WRITE(17,'()') + WRITE(17,'(a)') '---With time-reversal operation---' + WRITE(17,'()') +C Printing the srot(isym) operations if necessary : + DO isym=1,nsym + IF (srot(isym)%timeinv) THEN + WRITE(17,'()') + WRITE(17,'(a,i3)')' Sym. op.: ',isym +C Printing the new rotational matrices for each orbital number l. + WRITE(17,'()') + DO l=1,lsym + WRITE(17,'(a,a,i2)')'T*Rotation matrix ', + & 'D(T.R[isym])_{lm} for l = ',l + DO m=-l,l + ALLOCATE(bufcomp(-l:l)) + bufcomp(-l:l)=srot(isym)%rotl(m,-l:l,l) + WRITE(17,'(7(2f7.3,x))') bufcomp + DEALLOCATE(bufcomp) + ENDDO + ENDDO +C Printing the new matrices rotrep(l,isrt)%mat + WRITE(17,'()') + DO isrt=1,nsort + IF (notinclude(isrt)) cycle + DO l=1,lsym + IF (lsort(l,isrt)==0) cycle + WRITE(17,'(a,i2,a,i2)') + & 'Representation for isrt = ',isrt,' and l= ',l + IF (reptrans(l,isrt)%ifmixing) THEN + DO m=1,2*(2*l+1) + ALLOCATE(bufcomp(1:2*(2*l+1))) + bufcomp(1:2*(2*l+1))= + & srot(isym)%rotrep(l,isrt)%mat(m,1:2*(2*l+1)) + WRITE(17,'(7(2f7.3,x))') bufcomp + DEALLOCATE(bufcomp) + ENDDO + ELSE + DO m=-l,l + ALLOCATE(bufcomp(-l:l)) + bufcomp(-l:l)= + & srot(isym)%rotrep(l,isrt)%mat(m,-l:l) + WRITE(17,'(7(2f7.3,x))') bufcomp + DEALLOCATE(bufcomp) + END DO + END IF + END DO + END DO + END IF + ENDDO + END IF +C +C +C ============================================================ +C Creation of the global->local coordinate rotation matrices : +C ============================================================ + ALLOCATE(rotloc(natom)) + CALL printout(1) + WRITE(buf,'(a)')'-------------------------------------' + CALL printout(0) + WRITE(buf,'(a)')'Global-to-local-coordinates rotations' + CALL printout(1) + WRITE(buf,'(a)')'Properties of the symmetry operations :' + CALL printout(0) + WRITE(buf,'(a)') ' alpha, beta, gamma are their Euler angles.' + CALL printout(0) + WRITE(buf,'(a)') ' iprop is the value of their determinant.' + CALL printout(0) + CALL printout(0) + WRITE(buf,'(a)')' SORT alpha beta gamma iprop' + CALL printout(0) + READ(iusym,'()') + DO isrt=1,nsort +C Reading the data for the representative atom in case.dmftsym and printing them in case.outdmftpr : +C -------------------------------------------------------------------------------------------------- + iatomref=SUM(nmult(0:isrt-1))+1 + READ(iusym,'()') + DO i=1,3 + ALLOCATE(bufreal(3)) + READ(iusym,*) bufreal + rotloc(iatomref)%krotm(i,1:3)=bufreal(1:3) + DEALLOCATE(bufreal) + ENDDO +C the field rotloc(iatomref)%krotm = 3x3 matrices of rotation associated to the transformation Rloc +C Rloc = . The matrix was not multiplied by the value of iprop before being +C written in case.dmftsym (cf. SRC_lapw2/rotmat_dmft.f). +C rotloc(iatomref)%krotm can thus be either a proper or an improper rotation (with inversion). +C This reading line was chosen to be consistent with the writing line in rotmat_dmft (in SRC_lapw2) + READ(iusym,*)rotloc(iatomref)%a,rotloc(iatomref)%b, + & rotloc(iatomref)%g, rotloc(iatomref)%iprop + WRITE(buf,'(i5,3F10.1,5x,i3)')isrt, + & rotloc(iatomref)%a, rotloc(iatomref)%b, + & rotloc(iatomref)%g, rotloc(iatomref)%iprop + CALL printout(0) + rotloc(iatomref)%a=rotloc(iatomref)%a/180d0*Pi + rotloc(iatomref)%b=rotloc(iatomref)%b/180d0*Pi + rotloc(iatomref)%g=rotloc(iatomref)%g/180d0*Pi +C the field rotloc%a is linked to the Euler precession angle (alpha) +C the field rotloc%b is linked to the Euler nutation angle (beta) +C the field rotloc%c is linked to the Euler intrinsic rotation angle (gamma) +C They are read in case.dmftsym and printed in case.outdmftpr in degree and are then transformed into radians +C the field rotloc%iprop = value of the transformation determinant (should be 1 in almost all the cases), +C determines if there is an inversion in the transformation from global to local basis. + rotloc(iatomref)%krotm(1:3,1:3)=rotloc(iatomref)%iprop* + & rotloc(iatomref)%krotm(1:3,1:3) +C Now, the field rotloc(iatomref)%krotm described only the proper rotation associated to the transformation. +C +C Use of the subroutine dmat to compute the rotational matrix +C associated to the rotloc(iatomref) operation in a (2*l+1) orbital space : + ALLOCATE(tmat(1:2*lsym+1,1:2*lsym+1)) + ALLOCATE(tmp_dmat(1:2*lsym+1,1:2*lsym+1,1:lsym)) + DO l=1,lsym + tmat=0.d0 + CALL dmat(l,rotloc(iatomref)%a,rotloc(iatomref)%b, + & rotloc(iatomref)%g,REAL(rotloc(iatomref)%iprop,KIND=8), + & tmat,2*lsym+1) + tmp_dmat(1:2*l+1,1:2*l+1,l)=tmat(1:2*l+1,1:2*l+1) +C tmp_dmat = D(Rloc)_{lm} + ENDDO + DEALLOCATE(tmat) +C +C +C Storing the rotloc matrix and initializing the other fields for all equivalent atoms : +C -------------------------------------------------------------------------------------- +C All the equivalent atoms will have the same rotloc description. These data +C will be correctly redifined in the subroutine set_rotloc, where the action of the +C symmetry operation which transforms the representative atom in the considered one +C will be added. + DO imu=1,nmult(isrt) + iatom=SUM(nmult(0:isrt-1))+imu + IF(ifSP.AND.ifSO) THEN +C In this case, we have to consider the spinor rotation matrix associated to rotloc +C (the value of the Euler angle beta can be anything between 0 and Pi) + ALLOCATE(rotloc(iatom)%rotl(1:2*(2*lsym+1), + & 1:2*(2*lsym+1),lsym)) + rotloc(iatom)%rotl=0.d0 + DO l=1,lsym +C For each orbital (from l=0 to lsym) +C Calculation of the representation matrix of rotloc in the spin-space +C in agreement with Wien conventions used for the definition of spmt (in SRC_lapwdm/sym.f) +C Up/up and Dn/dn terms + factor=(rotloc(iatomref)%a+rotloc(iatomref)%g)/2.d0 + spmt(1,1)=EXP(CMPLX(0.d0,factor)) + & *DCOS(rotloc(iatomref)%b/2.d0) + spmt(2,2)=CONJG(spmt(1,1)) +C Up/dn and Dn/up terms + factor=-(rotloc(iatomref)%a-rotloc(iatomref)%g)/2.d0 + spmt(1,2)=EXP(CMPLX(0.d0,factor)) + & *DSIN(rotloc(iatomref)%b/2.d0) + spmt(2,1)=-CONJG(spmt(1,2)) +C Up/up block : + rotloc(iatom)%rotl(1:2*l+1,1:2*l+1,l)= + & spmt(1,1)*tmp_dmat(1:2*l+1,1:2*l+1,l) +C Dn/dn block : + rotloc(iatom)%rotl(2*l+2:2*(2*l+1),2*l+2:2*(2*l+1),l)= + & spmt(2,2)*tmp_dmat(1:2*l+1,1:2*l+1,l) +C Up/dn block : + rotloc(iatom)%rotl(1:2*l+1,2*l+2:2*(2*l+1),l)= + & spmt(1,2)*tmp_dmat(1:2*l+1,1:2*l+1,l) +C Dn/up block : + rotloc(iatom)%rotl(2*l+2:2*(2*l+1),1:2*l+1,l)= + & spmt(2,1)*tmp_dmat(1:2*l+1,1:2*l+1,l) +C The fields rotloc(iatom)%rotl now contain D(rotloc)_{lm}xD(rotloc)_{1/2} + ENDDO + ELSE +C In this case, we can consider the spatial rotation matrix only +C since each spin space is independent (paramagnetic or spin-polarized without SO computation) + ALLOCATE(rotloc(iatom)%rotl(-lsym:lsym,-lsym:lsym,lsym)) + rotloc(iatom)%rotl=0.d0 + DO l=1,lsym + rotloc(iatom)%rotl(-l:l,-l:l,l)= + = tmp_dmat(1:2*l+1,1:2*l+1,l) +C The fields rotloc(iatom)%rotl now contain D(rotloc)_{lm} + ENDDO + ENDIF +C The fields rotloc(iatom)%a,b and c will now contain the parameters linked to +C the Euler angles of the local rotation rotloc. + IF(imu.gt.1) THEN + rotloc(iatom)%a=rotloc(iatomref)%a + rotloc(iatom)%b=rotloc(iatomref)%b + rotloc(iatom)%g=rotloc(iatomref)%g + rotloc(iatom)%iprop=rotloc(iatomref)%iprop + rotloc(iatom)%krotm(1:3,1:3)= + = rotloc(iatomref)%krotm(1:3,1:3) + ENDIF +C The fields rotloc%phase, timeinv and srotnum are initialized to their +C default value. + rotloc(iatom)%phase=0.d0 + rotloc(iatom)%timeinv=.FALSE. + rotloc(iatom)%srotnum=0 +C the field rotloc(iatom)%srotnum and timeinv will be recalculated in set_rotloc. + ENDDO + DEALLOCATE(tmp_dmat) + ENDDO ! End of the isrt loop +C +C +C ==================================================================== +C Printing the rotloc matrix parameters in the file fort.17 for test : +C ==================================================================== + DO isrt=1,nsort + IF (notinclude(isrt)) cycle + DO imu=1,nmult(isrt) + iatom=SUM(nmult(0:isrt-1))+imu + WRITE(17,'()') + WRITE(17,'(2(a,i3))')' SORT ',isrt,' IMU= ',imu + DO i=1,3 + ALLOCATE(bufreal(3)) + bufreal(1:3)=rotloc(iatom)%krotm(i,1:3) + WRITE(17,'(3f10.4)') bufreal + DEALLOCATE(bufreal) + ENDDO + WRITE(17,'(a,3f8.1,i4)')'a, b, g, iprop ==', + & rotloc(iatom)%a*180d0/Pi,rotloc(iatom)%b*180d0/Pi, + & rotloc(iatom)%g*180d0/Pi,rotloc(iatom)%iprop +C Printing the data relative to SP option + IF (ifSP) THEN + WRITE(17,*)'If DIR. magn. mom. is inverted :' + & ,rotloc(iatom)%timeinv + WRITE(17,*)'phase = ',rotloc(iatom)%phase + ENDIF +C Printing the rotloc matrices for each orbital number l. + WRITE(17,'()') + DO l=1,lsym + WRITE(17,'(a,a,i2)')'Rotation matrix ', + & 'D(R[isym])_{lm} for l = ',l + IF(ifSP.AND.ifSO) THEN + DO m=1,2*(2*l+1) + ALLOCATE(bufcomp(1:2*(2*l+1))) + bufcomp(1:2*(2*l+1))=rotloc(iatom)%rotl(m,1:2*(2*l+1),l) + WRITE(17,'(7(2f7.3,x))') bufcomp + DEALLOCATE(bufcomp) + ENDDO + ELSE + DO m=-l,l + ALLOCATE(bufcomp(-l:l)) + bufcomp(-l:l)=rotloc(iatom)%rotl(m,-l:l,l) + WRITE(17,'(7(2f7.3,x))') bufcomp + DEALLOCATE(bufcomp) + ENDDO + ENDIF + ENDDO + ENDDO + ENDDO +C +C +C ================================================================================== +C Computation of the true local rotation matrices for each non representative atom : +C ================================================================================== + CALL set_rotloc +C +C +C ==================================================================== +C Printing the rotloc matrix parameters in the file fort.17 for test : +C ==================================================================== + DO isrt=1,nsort + IF (notinclude(isrt)) cycle + DO imu=1,nmult(isrt) + iatom=SUM(nmult(0:isrt-1))+imu + WRITE(17,'()') + WRITE(17,'(2(a,i3))')' SORT ',isrt,' IMU= ',imu + DO i=1,3 + ALLOCATE(bufreal(3)) + bufreal(1:3)=rotloc(iatom)%krotm(i,1:3) + WRITE(17,'(3f10.4)') bufreal + DEALLOCATE(bufreal) + ENDDO + WRITE(17,'(a,3f8.1,i4)')'a, b, g, iprop ==', + & rotloc(iatom)%a*180d0/Pi,rotloc(iatom)%b*180d0/Pi, + & rotloc(iatom)%g*180d0/Pi,rotloc(iatom)%iprop +C Printing the data relative to SP option + IF (ifSP) THEN + WRITE(17,*)'If DIR. magn. mom. is inverted :' + & ,rotloc(iatom)%timeinv + WRITE(17,*)'phase = ',rotloc(iatom)%phase + ENDIF +C Printing the rotloc matrices for each orbital number l. + WRITE(17,'()') + DO l=1,lsym + WRITE(17,'(a,a,i2)')'Rotation matrix ', + & 'D(R[isym])_{lm} for l = ',l + IF(ifSP.AND.ifSO) THEN + DO m=1,2*(2*l+1) + ALLOCATE(bufcomp(1:2*(2*l+1))) + bufcomp(1:2*(2*l+1))=rotloc(iatom)%rotl(m,1:2*(2*l+1),l) + WRITE(17,'(7(2f7.3,x))') bufcomp + DEALLOCATE(bufcomp) + ENDDO + ELSE + DO m=-l,l + ALLOCATE(bufcomp(-l:l)) + bufcomp(-l:l)=rotloc(iatom)%rotl(m,-l:l,l) + WRITE(17,'(7(2f7.3,x))') bufcomp + DEALLOCATE(bufcomp) + ENDDO + ENDIF + ENDDO +C Printing the matrices rotrep(l)%mat + WRITE(17,'()') + DO l=1,lsym + IF (lsort(l,isrt)==0) cycle + WRITE(17,'(a,i2)')'Representation for l= ',l + IF (ifSP.AND.ifSO) THEN + DO m=1,2*(2*l+1) + ALLOCATE(bufcomp(1:2*(2*l+1))) + bufcomp(1:2*(2*l+1))= + & rotloc(iatom)%rotrep(l)%mat(m,1:2*(2*l+1)) + WRITE(17,'(7(2f7.3,x))') bufcomp + DEALLOCATE(bufcomp) + ENDDO + ELSE + DO m=-l,l + ALLOCATE(bufcomp(-l:l)) + bufcomp(-l:l)= + & rotloc(iatom)%rotrep(l)%mat(m,-l:l) + WRITE(17,'(7(2f7.3,x))') bufcomp + DEALLOCATE(bufcomp) + ENDDO + ENDIF + ENDDO + ENDDO + ENDDO +C + RETURN + END + + + + + Subroutine dmat(l,a,b,c,det,DD,length) +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine computes the inverse of the matrix of the %% +C %% representation of size (2*l+1) associated to the rotation %% +C %% described by (a,b,c) angles in Euler description and with %% +C %% determinant det. %% +C %% The obtained matrix is put in the variable DD. %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C ---------------------------- + IMPLICIT REAL*8 (A-H,O-Z) + INTEGER l,m,n,ifac,length + COMPLEX*16 izero,imag, dd + dimension DD(length,length) + imag=(0d0,1d0) + izero=(0d0,0d0) + pi=acos(-1d0) + + do m=-l,l + do n=-l,l + call d_matrix(l,m,n,b,dm) + if (det.lt.-0.5) then + dd(l+m+1,n+l+1)=(-1)**l*cdexp(imag*n*a) + & *cdexp(imag*m*c)*dm + else + dd(l+m+1,n+l+1)=cdexp(imag*n*a) + & *cdexp(imag*m*c)*dm + end if + 3 format(2I3,2f10.6) + end do + end do + do j=1,2*l+1 + end do + 5 format(7(2f6.3,1X)) + + end + + + Subroutine d_matrix(l,m,n,b,dm) +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine is called by the subroutine dmat to compute the %% +C %% the value of the coefficient dm. %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C ---------------------------- + IMPLICIT REAL*8 (A-H,O-Z) + INTEGER l,m,n,t + + sum=0d0 + + f1=dfloat(ifac(l+m)*ifac(l-m))/ + & dfloat(ifac(l+n)*ifac(l-n)) + + do t=0,2*l + if ((l-m-t).ge.0.AND.(l-n-t).ge.0.AND.(t+n+m).ge.0) then +C general factor + f2=dfloat(ifac(l+n)*ifac(l-n))/dfloat(ifac(l-m-t) + & *ifac(m+n+t)*ifac(l-n-t)*ifac(t)) +C factor with sin(b/2) + if ((2*l-m-n-2*t).eq.0) then + f3=1. + else + f3=(sin(b/2))**(2*l-m-n-2*t) + end if +C factor with cos(b/2) + if ((2*t+n+m).eq.0) then + f4=1. + else + f4=(cos(b/2))**(2*t+n+m) + end if +! write(12,*)f1,f2,f3,f4 + sum=sum+(-1)**(l-m-t)*f2*f3*f4 + end if + end do + + dm=sqrt(f1)*sum + end + + + Integer Function ifac(n) +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine computes the factorial of the number n %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C ---------------------------- + if (n.eq.0) then + ifac=1 + else + ifac=1 + do j=1,n + ifac=ifac*j + end do + end if + end + + + SUBROUTINE spinrotmat(spinrot,isym,l) +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine sets up the complete spinor rotation matrix %% +C %% associated to the symmetry operation isym for the orbital l. %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definition of the variables : +C ----------------------------- + USE common_data + USE symm + IMPLICIT NONE + INTEGER :: l,isym + COMPLEX(KIND=8) :: ephase, det + REAL(KIND=8) :: factor + COMPLEX(KIND=8), DIMENSION(1:2*(2*l+1),1:2*(2*l+1)) :: spinrot + COMPLEX(KIND=8), DIMENSION(1:2,1:2) :: spmt +C + spinrot=0.d0 +C For a computation with spin polarized inputs : + IF (ifSP) THEN + IF (srot(isym)%timeinv) THEN +C In this case, the Euler angle Beta is Pi. The spinor rotation matrix is block-antidiagonal and +C the time reversal operation will be applied to keep the direction of the magnetization. +C Up/dn block : + factor=srot(isym)%phase/2.d0 +C We remind that the field phase is (g-a) in this case. +C as a result, ephase = exp(+i(g-a)/2) = -exp(+i(alpha-gamma)/2) +C in good agreement with Wien conventions for the definition of this phase factor. + ephase=EXP(CMPLX(0.d0,factor)) + spinrot(1:2*l+1,2*l+2:2*(2*l+1))= + = ephase*srot(isym)%rotl(-l:l,-l:l,l) +C Dn/up block : + ephase=-CONJG(ephase) +C now, ephase = -exp(+i(a-g)/2) = exp(-i(alpha-gamma)/2) + spinrot(2*l+2:2*(2*l+1),1:2*l+1)= + = ephase*srot(isym)%rotl(-l:l,-l:l,l) + ELSE +C In this case, the Euler angle Beta is 0. The spinor rotation matrix is block-diagonal and +C no time reversal operation will be applied. +C Up/up block : + factor=srot(isym)%phase/2.d0 +C We remind that the field phase is (a+g) in this case. +C as a result, ephase = exp(+i(a+g)/2)=-exp(-i(alpha+gamma)/2) +C in good agreement with Wien conventions for the definition of this phase factor. + ephase=EXP(CMPLX(0.d0,factor)) + spinrot(1:2*l+1,1:2*l+1)= + = ephase*srot(isym)%rotl(-l:l,-l:l,l) +C Dn/dn block : + ephase=CONJG(ephase) +C now, ephase = exp(-i(a+g)/2) = -exp(+i(alpha+gamma)/2) + spinrot(2*l+2:2*(2*l+1),2*l+2:2*(2*l+1))= + = ephase*srot(isym)%rotl(-l:l,-l:l,l) + ENDIF + ELSE +C For a computation with paramagnetic treatment input files. (not used in this version) +C +C In this case, there is no restriction on the value of the Euler angle beta. +C The general definition of a spinor rotation matrix is used. +C +C Calculation of the representation matrix of isym in the spin-space +C in agreement with Wien conventions used for the definition of spmt (in SRC_lapwdm/sym.f) +C Up/up and Dn/dn terms + factor=(srot(isym)%a+srot(isym)%g)/2.d0 + spmt(1,1)=EXP(CMPLX(0.d0,factor))*DCOS(srot(isym)%b/2.d0) + spmt(2,2)=CONJG(spmt(1,1)) +C Up/dn and Dn/up terms + factor=-(srot(isym)%a-srot(isym)%g)/2.d0 + spmt(1,2)=EXP(CMPLX(0.d0,factor))*DSIN(srot(isym)%b/2.d0) + spmt(2,1)=-CONJG(spmt(1,2)) +C Up/up block : + spinrot(1:2*l+1,1:2*l+1)= + & spmt(1,1)*srot(isym)%rotl(-l:l,-l:l,l) +C Dn/dn block : + spinrot(2*l+2:2*(2*l+1),2*l+2:2*(2*l+1))= + & spmt(2,2)*srot(isym)%rotl(-l:l,-l:l,l) +C Up/dn block : + spinrot(1:2*l+1,2*l+2:2*(2*l+1))= + & spmt(1,2)*srot(isym)%rotl(-l:l,-l:l,l) +C Dn/up block : + spinrot(2*l+2:2*(2*l+1),1:2*l+1)= + & spmt(2,1)*srot(isym)%rotl(-l:l,-l:l,l) + ENDIF +C + RETURN + END + diff --git a/fortran/dmftproj/symmetrize_mat.f b/fortran/dmftproj/symmetrize_mat.f new file mode 100644 index 00000000..694f75e5 --- /dev/null +++ b/fortran/dmftproj/symmetrize_mat.f @@ -0,0 +1,292 @@ + +c ****************************************************************************** +c +c TRIQS: a Toolbox for Research in Interacting Quantum Systems +c +c Copyright (C) 2011 by L. Pourovskii, V. Vildosola, C. Martins, M. Aichhorn +c +c TRIQS is free software: you can redistribute it and/or modify it under the +c terms of the GNU General Public License as published by the Free Software +c Foundation, either version 3 of the License, or (at your option) any later +c version. +c +c TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +c WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +c FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +c details. +c +c You should have received a copy of the GNU General Public License along with +c TRIQS. If not, see . +c +c *****************************************************************************/ + + SUBROUTINE symmetrize_mat(Dmat,orbit,norbit) +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine applies the symmetry operations to the %% +C %% density matrices stored in Dmat and puts the resulting %% +C %% density matrices into the local coordinate system. %% +C %% %% +C %% This version can be used for SO computations. %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definition of the variables : +C ---------------------------- + USE common_data + USE projections + USE symm + USE reps + IMPLICIT NONE + INTEGER :: norbit + TYPE(matrix), DIMENSION(nsp,norbit) :: Dmat + COMPLEX(KIND=8),DIMENSION(:,:,:,:), ALLOCATABLE :: sym_dmat + COMPLEX(KIND=8),DIMENSION(:,:), ALLOCATABLE :: tmp_mat + COMPLEX(KIND=8):: ephase + TYPE(orbital), DIMENSION(norbit) :: orbit + INTEGER :: isym, iorb, iatom, jorb, is, is1, l, i, m + INTEGER :: isrt, jatom, imult, asym +C +C ========================================= +C Computation of the symmetrized matrices : +C ========================================= +C + iorb=1 +C Initialization of the iorb index. + DO WHILE (iorb.lt.(norbit+1)) +C The use of the while-loop was motivated by the idea of studying +C all the orbitals iorb associated to a same atomic sort isrt together. +C At the end, the index iorb is incremented by nmult(isrt) so that the +C following studied orbitals are associated to another atomic sort. + l=orbit(iorb)%l + isrt=orbit(iorb)%sort +C +C ----------------------------------------------------------------------------------- +C The s-orbitals are a particular case of a "non-mixing" basis and are treated here : +C ----------------------------------------------------------------------------------- + IF (l==0) THEN +C The table sym_dmat will store the symmetrized value of the density matrices of Dmat +C associated to a same atomic sort isrt. + ALLOCATE(sym_dmat(1,1,nsp,1:nmult(isrt))) + sym_dmat=0.d0 +C Its size is nmult(isrt) because symmetry operations can transform the representants +C of a same atomic sort one into another. +C +C Loop on the representants of the atomic sort isrt + DO imult=0,nmult(isrt)-1 + iatom=orbit(iorb+imult)%atom +C Loop on the symmetry operations of the system + DO isym=1,nsym + DO is=1,nsp + ALLOCATE(tmp_mat(1,1)) +C If the calculation uses spin-polarized input files, the application of the symmetry operation +C depends on the field srot%timeinv. + IF(ifSP.AND.srot(isym)%timeinv) THEN +C In this case (spin-polarized computation), the symmetry operation is block-diagonal in spin-space but +C the time reversal operator is included. + tmp_mat(1,1)=CONJG(Dmat(is,iorb+imult)%mat(1,1)) +C because of the antiunitarity of the operator, the conjugate of Dmat must be use + ELSE + tmp_mat(1,1)=Dmat(is,iorb+imult)%mat(1,1) + ENDIF +C +C Definition of the index where the transformed Dmat will be stored. [jorb = R[isym](iorb)] + jorb=srot(isym)%perm(iatom)-iatom+(imult+1) +C +C Computation of the phase factors in the case of a SO computation : +C ------------------------------------------------------------------ +C For up/up and dn/dn blocks, no phase factor is needed. + ephase=1.d0 +C For the up/dn block, initialisation of the phase factor + IF(is==3) THEN + ephase=EXP(CMPLX(0d0,srot(isym)%phase)) +C if srot%timeinv = .TRUE. , phase= g-a = 2pi+(alpha-gamma) and ephase = exp(+i(g-a)) = exp(+i(alpha-gamma)) +C if srot%timeinv = .FALSE., phase= a+g = 2pi-(alpha+gamma) and ephase = exp(+i(a+g)) = exp(-i(alpha+gamma)) + ENDIF +C For the dn/up block, initialisation of the phase factor + IF(is==4) THEN + ephase=EXP(CMPLX(0d0,-srot(isym)%phase)) +C if srot%timeinv = .TRUE. , phase= g-a = 2pi+(alpha-gamma) and ephase = exp(-i(g-a)) = exp(-i(alpha-gamma)) +C if srot%timeinv = .FALSE., phase= a+g = 2pi-(alpha+gamma) and ephase = exp(-i(a+g)) = exp(+i(alpha+gamma)) + ENDIF +C +C Application of the symmetry operation which changes iorb in jorb=R[isym](iorb) : +C -------------------------------------------------------------------------------- +C That's why the result is stored in the jorb section of sym_dmat. + sym_dmat(1,1,is,jorb)= + = sym_dmat(1,1,is,jorb)+tmp_mat(1,1)*ephase + DEALLOCATE(tmp_mat) + ENDDO ! End of the is loop + ENDDO ! End of the isym loop + ENDDO ! End of the imult loop +C +C Renormalization of the symmetrized density matrices : +C ----------------------------------------------------- + IF (nsym.gt.0) THEN + DO imult=0,nmult(isrt)-1 + DO is=1,nsp + Dmat(is,iorb+imult)%mat(1,1)= + & sym_dmat(1,1,is,imult+1)/nsym + ENDDO + ENDDO + ENDIF + DEALLOCATE(sym_dmat) +C Incrementation of the iorb index (for the while loop) + iorb=iorb+nmult(isrt) +C +C ----------------------------------------------------------------------------------------------------- +C If the basis representation needs a complete spinor rotation approach (matrices of size 2*(2*l+1) ) : +C ----------------------------------------------------------------------------------------------------- + ELSEIF (reptrans(l,isrt)%ifmixing) THEN +C The table sym_dmat will store the symmetrized value of the density matrices of Dmat +C associated to a same atomic sort isrt. + ALLOCATE(sym_dmat(1:2*(2*l+1),1:2*(2*l+1),1,1:nmult(isrt))) + sym_dmat=0.d0 +C Its size is nmult(isrt) because symmetry operations can transform the representants +C of a same atomic sort one into another. +C +C Loop on the representants of the atomic sort isrt + DO imult=0,nmult(isrt)-1 + iatom=orbit(iorb+imult)%atom +C Loop on the symmetry operations of the system + DO isym=1,nsym + ALLOCATE(tmp_mat(1:2*(2*l+1),1:2*(2*l+1))) +C We use the complete spin-space representation, so no trick on indices is necessary. + tmp_mat(1:2*(2*l+1),1:2*(2*l+1))= + & Dmat(1,iorb+imult)%mat(1:2*(2*l+1),1:2*(2*l+1)) +C If the calculation is spin-polarized, the symmetry operator is antiunitary. + IF(ifSP.AND.srot(isym)%timeinv) THEN + tmp_mat(1:2*(2*l+1),1:2*(2*l+1))= + & CONJG(tmp_mat(1:2*(2*l+1),1:2*(2*l+1))) + ENDIF +C Definition of the index where the transformed Dmat will be stored. [jorb = R[isym](iorb)] + jorb=srot(isym)%perm(iatom)-iatom+(imult+1) +C Application of the symmetry operation : +C --------------------------------------- +C The transformation is : srot%rotrep.tmpmat(iorb).inverse(sort%rotrep) = Dmat(jorb) +C or in other words, if R is a simple symmetry D(R[isym]) tmpmat(iorb) D(inverse(R[isym])) = Dmat(R[isym](iorb)) +C if R is multiplied by Theta D(R[isym]) tmpmat(iorb)* D(inverse(R[isym]))* = Dmat(R[isym](iorb)) + tmp_mat(1:2*(2*l+1),1:2*(2*l+1))= + = MATMUL(tmp_mat(1:2*(2*l+1),1:2*(2*l+1)), + & TRANSPOSE(CONJG(srot(isym)%rotrep(l,isrt) + % %mat(1:2*(2*l+1),1:2*(2*l+1)) )) ) + sym_dmat(1:2*(2*l+1),1:2*(2*l+1),1,jorb)= + = sym_dmat(1:2*(2*l+1),1:2*(2*l+1),1,jorb)+ + + MATMUL( srot(isym)%rotrep(l,isrt) + % %mat(1:2*(2*l+1),1:2*(2*l+1)) , + & tmp_mat(1:2*(2*l+1),1:2*(2*l+1))) + DEALLOCATE(tmp_mat) + ENDDO ! End of the isym loop + ENDDO ! End of the imult loop +C Renormalization of the symmetrized density matrices : +C ----------------------------------------------------- + IF (nsym.gt.0) THEN + DO imult=0,nmult(isrt)-1 + Dmat(1,iorb+imult)%mat(1:2*(2*l+1),1:2*(2*l+1))= + = sym_dmat(1:2*(2*l+1),1:2*(2*l+1),1,imult+1)/nsym + ENDDO + ENDIF + DEALLOCATE(sym_dmat) +C Incrementation of the iorb index (for the while loop) + iorb=iorb+nmult(isrt) +C +C ---------------------------------------------------------------------------------------------- +C If the basis representation can be reduce to the up/up block (matrices of size (2*l+1) only) : +C ---------------------------------------------------------------------------------------------- + ELSE +C The table sym_dmat will store the symmetrized value of the density matrices of Dmat +C associated to a same atomic sort isrt. + ALLOCATE(sym_dmat(-l:l,-l:l,nsp,1:nmult(isrt))) + sym_dmat=0.d0 +C Its size is nmult(isrt) because symmetry operations can transform the representants +C of a same atomic sort one into another. +C +C Loop on the representants of the atomic sort isrt + DO imult=0,nmult(isrt)-1 + iatom=orbit(iorb+imult)%atom +C Loop on the symmetry operations of the system + asym=0 + DO isym=1,nsym + DO is=1,nsp + ALLOCATE(tmp_mat(-l:l,-l:l)) +C If the calculation uses spin-polarized input files, the application of the symmetry operation +C depends on the field srot%timeinv. + IF(ifSP.AND.srot(isym)%timeinv) THEN +C In this case (spin-polarized computation), the symmetry operation is block-diagonal in spin-space but +C the time reversal operatot is included. + tmp_mat(-l:l,-l:l)=CONJG( + & Dmat(is,iorb+imult)%mat(-l:l,-l:l)) +C because of antiunitarity of the operator, the conjugate of Dmat must be use + ELSE + tmp_mat(-l:l,-l:l)= + & Dmat(is,iorb+imult)%mat(-l:l,-l:l) + ENDIF +C +C Definition of the index where the transformed Dmat will be stored. [jorb = R[isym](iorb)] + jorb=srot(isym)%perm(iatom)-iatom+(imult+1) +C +C Computation of the phase factors in the case of a SO computation : +C ------------------------------------------------------------------ +C For up/up and dn/dn blocks, no phase factor is needed. + ephase=1.d0 +C For the up/dn block, initialisation of the phase factor + IF(is==3) THEN + ephase=EXP(CMPLX(0d0,srot(isym)%phase)) +C if srot%timeinv = .TRUE. , phase= g-a = 2pi+(alpha-gamma) and ephase = exp(+i(g-a)) = exp(+i(alpha-gamma)) +C if srot%timeinv = .FALSE., phase= a+g = 2pi-(alpha+gamma) and ephase = exp(+i(a+g)) = exp(-i(alpha+gamma)) + ENDIF +C For the dn/up block, initialisation of the phase factor + IF(is==4) THEN + ephase=EXP(CMPLX(0d0,-srot(isym)%phase)) +C if srot%timeinv = .TRUE. , phase= g-a = 2pi+(alpha-gamma) and ephase = exp(-i(g-a)) = exp(-i(alpha-gamma)) +C if srot%timeinv = .FALSE., phase= a+g = 2pi-(alpha+gamma) and ephase = exp(-i(a+g)) = exp(+i(alpha+gamma)) + ENDIF +C +C Application of the symmetry operation which changes iorb in jorb : +C ------------------------------------------------------------------ +C The transformation is : srot%rotrep.tmpmat(iorb).inverse(sort%rotrep) = Dmat(jorb) +C or in other words, if R is a simple symmetry D(R[isym]) tmpmat(iorb) D(inverse(R[isym])) = Dmat(R[isym](iorb)) +C if R is multiplied by T D(R[isym]) tmpmat(iorb)* D(inverse(R[isym]))* = Dmat(R[isym](iorb)) + tmp_mat(-l:l,-l:l)= + = MATMUL(tmp_mat(-l:l,-l:l), + & TRANSPOSE(CONJG( srot(isym) + & %rotrep(l,isrt)%mat(-l:l,-l:l) )) ) + sym_dmat(-l:l,-l:l,is,jorb)= + = sym_dmat(-l:l,-l:l,is,jorb)+ + + MATMUL(srot(isym)%rotrep(l,isrt)%mat(-l:l,-l:l), + & tmp_mat(-l:l,-l:l) )*ephase + DEALLOCATE(tmp_mat) + ENDDO ! End of the is loop + ENDDO ! End of the isym loop + ENDDO ! End of the imult loop +C +C Renormalization of the symmetrized density matrices : +C ----------------------------------------------------- + IF (nsym.gt.0) THEN + DO imult=0,nmult(isrt)-1 + DO is=1,nsp + Dmat(is,iorb+imult)%mat(-l:l,-l:l)= + = sym_dmat(-l:l,-l:l,is,imult+1)/(nsym-asym) + ENDDO + ENDDO + ENDIF + DEALLOCATE(sym_dmat) +C Incrementation of the iorb index (for the while loop) + iorb=iorb+nmult(isrt) + ENDIF ! End of the type basis if-then-else +C + ENDDO ! End of the while(iorb) loop +C +C +C ============================================================= +C Application of the time reversal operation if paramagnetism : +C ============================================================= +C If the system is paramagnetic, the magnetic group of the system +C is a type II Shubnikov group and time-reveral symmetry must be added +C to achieve the complete symmetrization. + IF (.not.ifSP) THEN + CALL add_timeinv(Dmat,orbit,norbit) + END IF +C + RETURN + END diff --git a/fortran/dmftproj/timeinv.f b/fortran/dmftproj/timeinv.f new file mode 100644 index 00000000..481df409 --- /dev/null +++ b/fortran/dmftproj/timeinv.f @@ -0,0 +1,289 @@ + +c ****************************************************************************** +c +c TRIQS: a Toolbox for Research in Interacting Quantum Systems +c +c Copyright (C) 2011 by L. Pourovskii, V. Vildosola, C. Martins, M. Aichhorn +c +c TRIQS is free software: you can redistribute it and/or modify it under the +c terms of the GNU General Public License as published by the Free Software +c Foundation, either version 3 of the License, or (at your option) any later +c version. +c +c TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +c WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +c FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +c details. +c +c You should have received a copy of the GNU General Public License along with +c TRIQS. If not, see . +c +c *****************************************************************************/ + + SUBROUTINE timeinv_op(mat,lm,l,isrt) +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine applies the time reversal operation to the %% +C %% matrix mat which is associated to the l orbital of the atomic %% +C %% isrt. (matrix size = lm) The matrix mat is assumed to already %% +C %% be in the desired basis associated to isrt. %% +C %% The calculation done is : %% +C %% reptrans*T*conjg((inv(reptrans))*conjg(mat) %% +C %% %% +C %% If isrt=0, the matrix mat is assumed to be in the spherical %% +C %% harmonics basis and no spin is considered. (lm = 2*l+1) %% +C %% The calculation done is then : T*conjg(mat) %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C ---------------------------- + USE common_data + USE reps + IMPLICIT NONE + INTEGER :: lm,l,isrt + COMPLEX(KIND=8), DIMENSION(1:lm,1:lm) :: mat + COMPLEX(KIND=8), DIMENSION(:,:), ALLOCATABLE :: tinv + COMPLEX(KIND=8), DIMENSION(:,:), ALLOCATABLE :: tmp_tinv + COMPLEX(KIND=8), DIMENSION(-l:l,-l:l) :: tmat + INTEGER :: m,n +C +C Definition of the complex conjugation operator in the spherical harmonic basis : +C -------------------------------------------------------------------------------- +C + tmat = CMPLX(0.d0,0.d0) + DO m=-l,l + tmat(m,-m)=(-1)**m + END DO +C +C +C Calculation of the Time-reversal operator in the desired representation basis : +C ------------------------------------------------------------------------------- +C + IF (isrt==0) THEN +C The case isrt=0 is a "default case" : +C mat is in the spherical harmonic basis (without spinor representation) + ALLOCATE(tinv(1:2*l+1,1:2*l+1)) + tinv(1:2*l+1,1:2*l+1)=tmat(-l:l,-l:l) + ELSE +C If the basis representation needs a complete spinor rotation approach (matrices of size 2*(2*l+1) ) + IF (reptrans(l,isrt)%ifmixing) THEN + ALLOCATE(tinv(1:2*(2*l+1),1:2*(2*l+1))) + ALLOCATE(tmp_tinv(1:2*(2*l+1),1:2*(2*l+1))) + tinv = CMPLX(0.d0,0.d0) + tmp_tinv = CMPLX(0.d0,0.d0) +C Definition of the time-reversal operator as a spinor-operator (multiplication by -i.sigma_y) + tinv(1:2*l+1,2*l+2:2*(2*l+1))=-tmat(-l:l,-l:l) + tinv(2*l+2:2*(2*l+1),1:2*l+1)=tmat(-l:l,-l:l) +C The time reversal operator is put in the desired basis. + tmp_tinv(1:2*(2*l+1),1:2*(2*l+1))=MATMUL( + & reptrans(l,isrt)%transmat(1:2*(2*l+1),1:2*(2*l+1)), + & tinv(1:2*(2*l+1),1:2*(2*l+1))) + tinv(1:2*(2*l+1),1:2*(2*l+1))=MATMUL( + & tmp_tinv(1:2*(2*l+1),1:2*(2*l+1)), + & TRANSPOSE(reptrans(l,isrt)%transmat + & (1:2*(2*l+1),1:2*(2*l+1)) ) ) +C the result tinv = (reptrans)*tinv*transpose(reptrans) +C or tinv_{new_i} = tinv_{lm} ()* +C which is exactly the expression of the spinor operator in the new basis. + DEALLOCATE(tmp_tinv) +C If the basis representation can be reduce to the up/up block (matrices of size (2*l+1) only) + ELSE + ALLOCATE(tinv(1:2*l+1,1:2*l+1)) + ALLOCATE(tmp_tinv(-l:l,-l:l)) + tinv = CMPLX(0.d0,0.d0) + tmp_tinv = CMPLX(0.d0,0.d0) +C The time reversal operator is put in the desired basis. + tmp_tinv(-l:l,-l:l)=MATMUL( + & reptrans(l,isrt)%transmat(-l:l,-l:l), + & tmat(-l:l,-l:l) ) + tinv(1:2*l+1,1:2*l+1)=MATMUL( + & tmp_tinv(-l:l,-l:l),TRANSPOSE( + & reptrans(l,isrt)%transmat(-l:l,-l:l)) ) + DEALLOCATE(tmp_tinv) + END IF +C the result tinv = (reptrans)*tinv*transpose(reptrans) +C or tinv_{new_i} = tinv_{lm} ()* +C which is exactly the expression of the operator in the new basis. + END IF +C +C +C Multiplication of the matrix mat by the time reversal operator : +C ---------------------------------------------------------------- +C + mat(1:lm,1:lm) = MATMUL( + & tinv(1:lm,1:lm),CONJG(mat(1:lm,1:lm)) ) + DEALLOCATE(tinv) +C The multiplication is the product of tinv and (mat)* +C + RETURN + END + + + + SUBROUTINE add_timeinv(Dmat,orbit,norbit) +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +C %% %% +C %% This subroutine calculates for each density matrix in Dmat %% +C %% its image by the time-reversal operator and adds it to the %% +C %% former one to get a time-symmetrized result. %% +C %% %% +C %% This operation is done only if the computation is paramagnetic %% +C %% %% +C %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +C Definiton of the variables : +C ---------------------------- + USE common_data + USE projections + USE symm + USE reps + IMPLICIT NONE + INTEGER :: norbit + TYPE(matrix), DIMENSION(nsp,norbit) :: Dmat + COMPLEX(KIND=8),DIMENSION(:,:,:), ALLOCATABLE :: rot_dmat + COMPLEX(KIND=8),DIMENSION(:,:), ALLOCATABLE :: time_op + COMPLEX(KIND=8),DIMENSION(:,:,:), ALLOCATABLE :: tmp_mat + COMPLEX(KIND=8):: ephase + TYPE(orbital), DIMENSION(norbit) :: orbit + INTEGER :: isym, iorb, iatom, jorb, is, is1, l, i + INTEGER :: isrt, jatom, imult, m +C +C + DO iorb=1,norbit + l=orbit(iorb)%l + isrt=orbit(iorb)%sort + iatom=orbit(iorb)%atom +C ----------------------------------------------------------------------------------- +C The s-orbitals are a particular case of a "non-mixing" basis and are treated here : +C ----------------------------------------------------------------------------------- + IF(l==0) THEN + IF (nsp==1) THEN + Dmat(1,iorb)%mat(1,1) = + & ( Dmat(1,iorb)%mat(1,1)+ + & CONJG(Dmat(1,iorb)%mat(1,1)) )/2.d0 + ELSE + ALLOCATE(tmp_mat(1,1,nsp)) + tmp_mat=0.d0 +C Application of the time-reversal operation +C ------------------------------------------ + DO is=1,nsp + is1=is+(-1)**(is+1) +C the time reversal operation transforms up/up -1- in dn/dn -2- and up/dn -3- in dn/up -4- (and vice versa) + tmp_mat(1,1,is)=CONJG(Dmat(is1,iorb)%mat(1,1) ) + IF (is.gt.2) tmp_mat(1,1,is)=-tmp_mat(1,1,is) +C Off diagonal blocks are multiplied by (-1). + ENDDO +C Symmetrization of Dmat : +C ------------------------ + DO is=1,nsp + Dmat(is,iorb)%mat(1,1) = (Dmat(is,iorb)%mat(1,1)+ + & tmp_mat(1,1,is) )/2.d0 + ENDDO + DEALLOCATE(tmp_mat) + ENDIF +C ----------------------------------------------------------------------------------------------------- +C If the basis representation needs a complete spinor rotation approach (matrices of size 2*(2*l+1) ) : +C ----------------------------------------------------------------------------------------------------- + ELSEIF (reptrans(l,isrt)%ifmixing) THEN +C Calculation of the time-reversal operator : +C ------------------------------------------- + ALLOCATE(time_op(1:2*(2*l+1),1:2*(2*l+1))) + time_op(:,:)=0.d0 + DO m=1,2*(2*l+1) + time_op(m,m)=1.d0 + ENDDO +C time_op is Identity. + CALL timeinv_op(time_op,2*(2*l+1),l,isrt) +C time_op is now the time-reversal operator in the desired basis ({new_i}) +C +C Application of the time-reversal operation +C ------------------------------------------ + ALLOCATE(tmp_mat(1:2*(2*l+1),1:2*(2*l+1),1)) + tmp_mat(1:2*(2*l+1),1:2*(2*l+1),1)= + = MATMUL(Dmat(1,iorb)%mat(1:2*(2*l+1),1:2*(2*l+1)), + & TRANSPOSE(time_op(1:2*(2*l+1),1:2*(2*l+1)) ) ) + tmp_mat(1:2*(2*l+1),1:2*(2*l+1),1)= + = MATMUL(time_op(1:2*(2*l+1),1:2*(2*l+1)), + & CONJG(tmp_mat(1:2*(2*l+1),1:2*(2*l+1),1) ) ) +C The operation performed is : time_op.conjugate(Dmat).transpose(conjugate(time_op)) +C or in other words, D(T)_{new_i} . Dmat* . D(inverse(T))*_{new_i} +C +C Symmetrization of Dmat : +C ------------------------ + Dmat(1,iorb)%mat(1:2*(2*l+1),1:2*(2*l+1)) = + & ( Dmat(1,iorb)%mat(1:2*(2*l+1),1:2*(2*l+1)) + + & tmp_mat(1:2*(2*l+1),1:2*(2*l+1),1) )/2.d0 + DEALLOCATE(tmp_mat) + DEALLOCATE(time_op) +C ---------------------------------------------------------------------------------------------- +C If the basis representation can be reduce to the up/up block (matrices of size (2*l+1) only) : +C ---------------------------------------------------------------------------------------------- + ELSE +C Calculation of the time-reversal operator : +C ------------------------------------------- + ALLOCATE(time_op(-l:l,-l:l)) + time_op(:,:)=0.d0 + DO m=-l,l + time_op(m,m)=1.d0 + ENDDO +C time_op is Identity. + CALL timeinv_op(time_op,(2*l+1),l,isrt) +C time_op is now the time-reversal operator in the desired basis ({new_i}) +C + IF (nsp==1) THEN +C Application of the time-reversal operation and symmetrization : +C --------------------------------------------------------------- + ALLOCATE(tmp_mat(-l:l,-l:l,1)) + tmp_mat(-l:l,-l:l,1)= + = MATMUL( Dmat(1,iorb)%mat(-l:l,-l:l), + & TRANSPOSE(time_op(-l:l,-l:l) ) ) + tmp_mat(-l:l,-l:l,1)= + = MATMUL(time_op(-l:l,-l:l), + & CONJG(tmp_mat(-l:l,-l:l,1)) ) +C The operation performed is : time_op.conjugate(Dmat).transpose(conjugate(time_op)) +C or in other words, D(T)_{new_i} . Dmat* . D(inverse(T))*_{new_i} + Dmat(1,iorb)%mat(-l:l,-l:l) = + & ( Dmat(1,iorb)%mat(-l:l,-l:l) + + & tmp_mat(-l:l,-l:l,1) )/2.d0 + DEALLOCATE(tmp_mat) + ELSE +C Application of the time-reversal operation +C ------------------------------------------ + ALLOCATE(tmp_mat(-l:l,-l:l,nsp)) + DO is=1,nsp + is1=is+(-1)**(is+1) +C the time reversal operation transforms up/up -1- in dn/dn -2- and up/dn -3- in dn/up -4 (and vice versa) + tmp_mat(-l:l,-l:l,is)= + = MATMUL( Dmat(is1,iorb)%mat(-l:l,-l:l), + & TRANSPOSE( time_op(-l:l,-l:l) ) ) + tmp_mat(-l:l,-l:l,is)= + = MATMUL( time_op(-l:l,-l:l), + & CONJG( tmp_mat(-l:l,-l:l,is) ) ) +C The operation performed is : time_op.conjugate(Dmat).transpose(conjugate(time_op)) +C or in other words, D(T)_{new_i} . Dmat* . D(inverse(T))*_{new_i} + IF (is.gt.2) THEN + tmp_mat(-l:l,-l:l,is)=-tmp_mat(-l:l,-l:l,is) + ENDIF +C Off diagonal terms are multiplied by (-1). + ENDDO +C Symmetrization of Dmat : +C ------------------------ + DO is=1,nsp + Dmat(is,iorb)%mat(-l:l,-l:l) = + & (Dmat(is,iorb)%mat(-l:l,-l:l)+ + & tmp_mat(-l:l,-l:l,is) )/2.d0 + ENDDO + DEALLOCATE(tmp_mat) + ENDIF + DEALLOCATE(time_op) +C + ENDIF ! End of the type basis if-then-else + ENDDO ! End of the iorb loop +C + RETURN + END + + + + diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt new file mode 100644 index 00000000..9bf196ca --- /dev/null +++ b/python/CMakeLists.txt @@ -0,0 +1,18 @@ + +triqs_make_target_to_copy_all_py_files_from_python_dir_to_build_dir() + +execute_process(COMMAND ln -fs ${CMAKE_BINARY_DIR}/fortran/F90/vertex.so ${CMAKE_CURRENT_BINARY_DIR} ) + +add_subdirectory(converters) + +#installation +SET(PYTHON_SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/__init__.py + ${CMAKE_CURRENT_SOURCE_DIR}/solver_multiband.py + ${CMAKE_CURRENT_SOURCE_DIR}/sumk_lda.py + ${CMAKE_CURRENT_SOURCE_DIR}/sumk_lda_tools.py + ${CMAKE_CURRENT_SOURCE_DIR}/symmetry.py + ${CMAKE_CURRENT_SOURCE_DIR}/U_matrix.py + ) +install (FILES ${PYTHON_SOURCES} DESTINATION ${TRIQS_PYTHON_LIB_DEST}/applications/dft) + diff --git a/python/U_matrix.py b/python/U_matrix.py new file mode 100644 index 00000000..a2500c34 --- /dev/null +++ b/python/U_matrix.py @@ -0,0 +1,100 @@ + +################################################################################ +# +# TRIQS: a Toolbox for Research in Interacting Quantum Systems +# +# Copyright (C) 2011 by M. Aichhorn, L. Pourovskii, V. Vildosola +# +# TRIQS is free software: you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation, either version 3 of the License, or (at your option) any later +# version. +# +# TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# TRIQS. If not, see . +# +################################################################################ + +# calculates the four index U matrix + +import numpy +from types import * +from math import sqrt +import copy +from vertex import u4ind +#from pytriqs.applications.dft.vertex import u4ind + +class Umatrix: + """calculates, stores, and manipulates the four index U matrix""" + + def __init__(self, l, U_interact=0, J_hund=0): + + self.l = l + self.U_av = U_interact + self.J = J_hund + + self.N = 2*l+1 # multiplicity + + #self.Ucmplx = numpy.zeros([self.N,self.N,self.N,self.N],numpy.float_) + #self.Ucubic = numpy.zeros([self.N,self.N,self.N,self.N],numpy.float_) + + + def __call__(self, T = None, rcl = None): + """calculates the four index matrix. Slater parameters can be provided in rcl, + and a transformation matrix from complex harmonics to a specified other representation (e.g. cubic). + If T is not given, use standard complex harmonics.""" + + if rcl is None: rcl = self.get_rcl(self.U_av,self.J,self.l) + + if (T is None): + TM = numpy.identity(self.N,numpy.complex_) + else: + TM = T + self.Nmat = len(TM) + + self.Ufull = u4ind(rcl,TM) + + + + def reduce_matrix(self): + """Reduces the four-index matrix to two-index matrices.""" + + if (self.N==self.Nmat): + self.U = numpy.zeros([self.N,self.N],numpy.float_) # matrix for same spin + self.Up = numpy.zeros([self.N,self.N],numpy.float_) # matrix for opposite spin + + for m in range(self.N): + for mp in range(self.N): + self.U[m,mp] = self.Ufull[m,mp,m,mp].real - self.Ufull[m,mp,mp,m].real + self.Up[m,mp] = self.Ufull[m,mp,m,mp].real + else: + self.U = numpy.zeros([self.Nmat,self.Nmat],numpy.float_) # matrix + for m in range(self.Nmat): + for mp in range(self.Nmat): + self.U[m,mp] = self.Ufull[m,mp,m,mp].real - self.Ufull[m,mp,mp,m].real + + + + + + def get_rcl(self, U_int, J_hund, l): + + #rcl = numpy.array([0.0, 0.0, 0.0, 0.0],numpy.float_) + xx = l+1 + rcl = numpy.zeros([xx],numpy.float_) + if(l==2): + rcl[0] = U_int + rcl[1] = J_hund * 14.0 / (1.0 + 0.63) + rcl[2] = 0.630 * rcl[1] + elif(l==3): + rcl[0] = U_int + rcl[1] = 6435.0 * J_hund / (286.0 + 195.0 * 451.0 / 675.0 + 250.0 * 1001.0 / 2025.0) + rcl[2] = 451.0 * rcl[1] / 675.0 + rcl[3] = 1001.0 * rcl[1] / 2025.0 + + return rcl diff --git a/python/__init__.py b/python/__init__.py new file mode 100644 index 00000000..97fb2d7b --- /dev/null +++ b/python/__init__.py @@ -0,0 +1,31 @@ + +################################################################################ +# +# TRIQS: a Toolbox for Research in Interacting Quantum Systems +# +# Copyright (C) 2011 by M. Aichhorn, L. Pourovskii, V. Vildosola +# +# TRIQS is free software: you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation, either version 3 of the License, or (at your option) any later +# version. +# +# TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# TRIQS. If not, see . +# +################################################################################ + +from sumk_lda import SumkLDA +from symmetry import Symmetry +from sumk_lda_tools import SumkLDATools +from U_matrix import Umatrix +from converters import * + +__all__ =['SumkLDA','Symmetry','SumkLDATools','Umatrix','Wien2kConverter'] + + diff --git a/python/converters/CMakeLists.txt b/python/converters/CMakeLists.txt new file mode 100644 index 00000000..96aeb02f --- /dev/null +++ b/python/converters/CMakeLists.txt @@ -0,0 +1,6 @@ +SET(PYTHON_SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/__init__.py + ${CMAKE_CURRENT_SOURCE_DIR}/wien2k_converter.py + ) + +install (FILES ${PYTHON_SOURCES} DESTINATION ${TRIQS_PYTHON_LIB_DEST}/applications/dft/converters) diff --git a/python/converters/__init__.py b/python/converters/__init__.py new file mode 100644 index 00000000..80868cac --- /dev/null +++ b/python/converters/__init__.py @@ -0,0 +1,27 @@ + +################################################################################ +# +# TRIQS: a Toolbox for Research in Interacting Quantum Systems +# +# Copyright (C) 2011 by M. Aichhorn, L. Pourovskii, V. Vildosola +# +# TRIQS is free software: you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation, either version 3 of the License, or (at your option) any later +# version. +# +# TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# TRIQS. If not, see . +# +################################################################################ + +from wien2k_converter import Wien2kConverter + +__all__ =['Wien2kConverter'] + + diff --git a/python/converters/wien2k_converter.py b/python/converters/wien2k_converter.py new file mode 100644 index 00000000..3c92b1f4 --- /dev/null +++ b/python/converters/wien2k_converter.py @@ -0,0 +1,581 @@ + +################################################################################ +# +# TRIQS: a Toolbox for Research in Interacting Quantum Systems +# +# Copyright (C) 2011 by M. Aichhorn, L. Pourovskii, V. Vildosola +# +# TRIQS is free software: you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation, either version 3 of the License, or (at your option) any later +# version. +# +# TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# TRIQS. If not, see . +# +################################################################################ + +from types import * +import numpy +from pytriqs.archive import * +import pytriqs.utility.mpi as mpi +import string + + +def read_fortran_file (filename): + """ Returns a generator that yields all numbers in the Fortran file as float, one by one""" + import os.path + if not(os.path.exists(filename)) : raise IOError, "File %s does not exists"%filename + for line in open(filename,'r') : + for x in line.replace('D','E').split() : + yield string.atof(x) + + + +class Wien2kConverter: + """ + Conversion from Wien2k output to an hdf5 file, that can be used as input for the SumkLDA class. + """ + + def __init__(self, filename, lda_subgrp = 'SumK_LDA', symm_subgrp = 'SymmCorr', repacking = False): + """ + Init of the class. Variable filename gives the root of all filenames, e.g. case.ctqmcout, case.h5, and so + on. + """ + + assert type(filename)==StringType,"LDA_file must be a filename" + self.hdf_file = filename+'.h5' + self.lda_file = filename+'.ctqmcout' + self.symm_file = filename+'.symqmc' + self.parproj_file = filename+'.parproj' + self.symmpar_file = filename+'.sympar' + self.band_file = filename+'.outband' + self.lda_subgrp = lda_subgrp + self.symm_subgrp = symm_subgrp + + # Checks if h5 file is there and repacks it if wanted: + import os.path + if (os.path.exists(self.hdf_file) and repacking): + self.__repack() + + + + def convert_dmft_input(self): + """ + Reads the input files, and stores the data in the HDFfile + """ + + + if not (mpi.is_master_node()): return # do it only on master: + mpi.report("Reading input from %s..."%self.lda_file) + + # Read and write only on Master!!! + # R is a generator : each R.Next() will return the next number in the file + R = read_fortran_file(self.lda_file) + try: + energy_unit = R.next() # read the energy convertion factor + n_k = int(R.next()) # read the number of k points + k_dep_projection = 1 + SP = int(R.next()) # flag for spin-polarised calculation + SO = int(R.next()) # flag for spin-orbit calculation + charge_below = R.next() # total charge below energy window + density_required = R.next() # total density required, for setting the chemical potential + symm_op = 1 # Use symmetry groups for the k-sum + + # the information on the non-correlated shells is not important here, maybe skip: + n_shells = int(R.next()) # number of shells (e.g. Fe d, As p, O p) in the unit cell, + # corresponds to index R in formulas + shells = [ [ int(R.next()) for i in range(4) ] for icrsh in range(n_shells) ] # reads iatom, sort, l, dim + #shells = numpy.array(shells) + + n_corr_shells = int(R.next()) # number of corr. shells (e.g. Fe d, Ce f) in the unit cell, + # corresponds to index R in formulas + # now read the information about the shells: + corr_shells = [ [ int(R.next()) for i in range(6) ] for icrsh in range(n_corr_shells) ] # reads iatom, sort, l, dim, SO flag, irep + + self.inequiv_shells(corr_shells) # determine the number of inequivalent correlated shells, has to be known for further reading... + #corr_shells = numpy.array(corr_shells) + + use_rotations = 1 + rot_mat = [numpy.identity(corr_shells[icrsh][3],numpy.complex_) for icrsh in xrange(n_corr_shells)] + + # read the matrices + rot_mat_time_inv = [0 for i in range(n_corr_shells)] + + for icrsh in xrange(n_corr_shells): + for i in xrange(corr_shells[icrsh][3]): # read real part: + for j in xrange(corr_shells[icrsh][3]): + rot_mat[icrsh][i,j] = R.next() + for i in xrange(corr_shells[icrsh][3]): # read imaginary part: + for j in xrange(corr_shells[icrsh][3]): + rot_mat[icrsh][i,j] += 1j * R.next() + + if (SP==1): # read time inversion flag: + rot_mat_time_inv[icrsh] = int(R.next()) + + + + # Read here the infos for the transformation of the basis: + n_reps = [1 for i in range(self.n_inequiv_corr_shells)] + dim_reps = [0 for i in range(self.n_inequiv_corr_shells)] + T = [] + for icrsh in range(self.n_inequiv_corr_shells): + n_reps[icrsh] = int(R.next()) # number of representatives ("subsets"), e.g. t2g and eg + dim_reps[icrsh] = [int(R.next()) for i in range(n_reps[icrsh])] # dimensions of the subsets + + # The transformation matrix: + # it is of dimension 2l+1, if no SO, and 2*(2l+1) with SO!! + #T = [] + #for ish in xrange(self.n_inequiv_corr_shells): + ll = 2*corr_shells[self.invshellmap[icrsh]][2]+1 + lmax = ll * (corr_shells[self.invshellmap[icrsh]][4] + 1) + T.append(numpy.zeros([lmax,lmax],numpy.complex_)) + + # now read it from file: + for i in xrange(lmax): + for j in xrange(lmax): + T[icrsh][i,j] = R.next() + for i in xrange(lmax): + for j in xrange(lmax): + T[icrsh][i,j] += 1j * R.next() + + + # Spin blocks to be read: + n_spin_blocs = SP + 1 - SO + + + # read the list of n_orbitals for all k points + n_orbitals = numpy.zeros([n_k,n_spin_blocs],numpy.int) + #n_orbitals = [ [0 for isp in range(n_spin_blocs)] for ik in xrange(n_k)] + for isp in range(n_spin_blocs): + for ik in xrange(n_k): + #n_orbitals[ik][isp] = int(R.next()) + n_orbitals[ik,isp] = int(R.next()) + #print n_orbitals + + + # Initialise the projectors: + #proj_mat = [ [ [numpy.zeros([corr_shells[icrsh][3], n_orbitals[ik][isp]], numpy.complex_) + # for icrsh in range (n_corr_shells)] + # for isp in range(n_spin_blocs)] + # for ik in range(n_k) ] + proj_mat = numpy.zeros([n_k,n_spin_blocs,n_corr_shells,max(numpy.array(corr_shells)[:,3]),max(n_orbitals)],numpy.complex_) + + + # Read the projectors from the file: + for ik in xrange(n_k): + for icrsh in range(n_corr_shells): + no = corr_shells[icrsh][3] + # first Real part for BOTH spins, due to conventions in dmftproj: + for isp in range(n_spin_blocs): + for i in xrange(no): + for j in xrange(n_orbitals[ik][isp]): + #proj_mat[ik][isp][icrsh][i,j] = R.next() + proj_mat[ik,isp,icrsh,i,j] = R.next() + # now Imag part: + for isp in range(n_spin_blocs): + for i in xrange(no): + for j in xrange(n_orbitals[ik][isp]): + #proj_mat[ik][isp][icrsh][i,j] += 1j * R.next() + proj_mat[ik,isp,icrsh,i,j] += 1j * R.next() + + + # now define the arrays for weights and hopping ... + bz_weights = numpy.ones([n_k],numpy.float_)/ float(n_k) # w(k_index), default normalisation + #hopping = [ [numpy.zeros([n_orbitals[ik][isp],n_orbitals[ik][isp]],numpy.complex_) + # for isp in range(n_spin_blocs)] for ik in xrange(n_k) ] + hopping = numpy.zeros([n_k,n_spin_blocs,max(n_orbitals),max(n_orbitals)],numpy.complex_) + + # weights in the file + for ik in xrange(n_k) : bz_weights[ik] = R.next() + + # if the sum over spins is in the weights, take it out again!! + sm = sum(bz_weights) + bz_weights[:] /= sm + + # Grab the H + # we use now the convention of a DIAGONAL Hamiltonian!!!! + for isp in range(n_spin_blocs): + for ik in xrange(n_k) : + no = n_orbitals[ik][isp] + for i in xrange(no): + #hopping[ik][isp][i,i] = R.next() * energy_unit + hopping[ik,isp,i,i] = R.next() * energy_unit + + #keep some things that we need for reading parproj: + self.n_shells = n_shells + self.shells = shells + self.n_corr_shells = n_corr_shells + self.corr_shells = corr_shells + self.n_spin_blocs = n_spin_blocs + self.n_orbitals = n_orbitals + self.n_k = n_k + self.SO = SO + self.SP = SP + self.energy_unit = energy_unit + except StopIteration : # a more explicit error if the file is corrupted. + raise "SumkLDA : reading file HMLT_file failed!" + + R.close() + + #print proj_mat[0] + + #----------------------------------------- + # Store the input into HDF5: + ar = HDFArchive(self.hdf_file,'a') + if not (self.lda_subgrp in ar): ar.create_group(self.lda_subgrp) + # The subgroup containing the data. If it does not exist, it is created. + # If it exists, the data is overwritten!!! + + ar[self.lda_subgrp]['energy_unit'] = energy_unit + ar[self.lda_subgrp]['n_k'] = n_k + ar[self.lda_subgrp]['k_dep_projection'] = k_dep_projection + ar[self.lda_subgrp]['SP'] = SP + ar[self.lda_subgrp]['SO'] = SO + ar[self.lda_subgrp]['charge_below'] = charge_below + ar[self.lda_subgrp]['density_required'] = density_required + ar[self.lda_subgrp]['symm_op'] = symm_op + ar[self.lda_subgrp]['n_shells'] = n_shells + ar[self.lda_subgrp]['shells'] = shells + ar[self.lda_subgrp]['n_corr_shells'] = n_corr_shells + ar[self.lda_subgrp]['corr_shells'] = corr_shells + ar[self.lda_subgrp]['use_rotations'] = use_rotations + ar[self.lda_subgrp]['rot_mat'] = rot_mat + ar[self.lda_subgrp]['rot_mat_time_inv'] = rot_mat_time_inv + ar[self.lda_subgrp]['n_reps'] = n_reps + ar[self.lda_subgrp]['dim_reps'] = dim_reps + ar[self.lda_subgrp]['T'] = T + ar[self.lda_subgrp]['n_orbitals'] = n_orbitals + ar[self.lda_subgrp]['proj_mat'] = proj_mat + ar[self.lda_subgrp]['bz_weights'] = bz_weights + ar[self.lda_subgrp]['hopping'] = hopping + + del ar + + # Symmetries are used, + # Now do the symmetries for correlated orbitals: + self.read_symmetry_input(orbits=corr_shells,symm_file=self.symm_file,symm_subgrp=self.symm_subgrp,SO=SO,SP=SP) + + + def convert_parproj_input(self, par_proj_subgrp='SumK_LDA_ParProj', symm_par_subgrp='SymmPar'): + """ + Reads the input for the partial charges projectors from case.parproj, and stores it in the symm_par_subgrp + group in the HDF5. + """ + + if not (mpi.is_master_node()): return + + self.par_proj_subgrp = par_proj_subgrp + self.symm_par_subgrp = symm_par_subgrp + + mpi.report("Reading parproj input from %s..."%self.parproj_file) + + dens_mat_below = [ [numpy.zeros([self.shells[ish][3],self.shells[ish][3]],numpy.complex_) for ish in range(self.n_shells)] + for isp in range(self.n_spin_blocs) ] + + R = read_fortran_file(self.parproj_file) + #try: + + n_parproj = [int(R.next()) for i in range(self.n_shells)] + n_parproj = numpy.array(n_parproj) + + # Initialise P, here a double list of matrices: + #proj_mat_pc = [ [ [ [numpy.zeros([self.shells[ish][3], self.n_orbitals[ik][isp]], numpy.complex_) + # for ir in range(n_parproj[ish])] + # for ish in range (self.n_shells) ] + # for isp in range(self.n_spin_blocs) ] + # for ik in range(self.n_k) ] + + proj_mat_pc = numpy.zeros([self.n_k,self.n_spin_blocs,self.n_shells,max(n_parproj),max(numpy.array(self.shells)[:,3]),max(self.n_orbitals)],numpy.complex_) + + rot_mat_all = [numpy.identity(self.shells[ish][3],numpy.complex_) for ish in xrange(self.n_shells)] + rot_mat_all_time_inv = [0 for i in range(self.n_shells)] + + for ish in range(self.n_shells): + #print ish + # read first the projectors for this orbital: + for ik in xrange(self.n_k): + for ir in range(n_parproj[ish]): + for isp in range(self.n_spin_blocs): + + for i in xrange(self.shells[ish][3]): # read real part: + for j in xrange(self.n_orbitals[ik][isp]): + proj_mat_pc[ik,isp,ish,ir,i,j] = R.next() + + for isp in range(self.n_spin_blocs): + for i in xrange(self.shells[ish][3]): # read imaginary part: + for j in xrange(self.n_orbitals[ik][isp]): + proj_mat_pc[ik,isp,ish,ir,i,j] += 1j * R.next() + + + # now read the Density Matrix for this orbital below the energy window: + for isp in range(self.n_spin_blocs): + for i in xrange(self.shells[ish][3]): # read real part: + for j in xrange(self.shells[ish][3]): + dens_mat_below[isp][ish][i,j] = R.next() + for isp in range(self.n_spin_blocs): + for i in xrange(self.shells[ish][3]): # read imaginary part: + for j in xrange(self.shells[ish][3]): + dens_mat_below[isp][ish][i,j] += 1j * R.next() + if (self.SP==0): dens_mat_below[isp][ish] /= 2.0 + + # Global -> local rotation matrix for this shell: + for i in xrange(self.shells[ish][3]): # read real part: + for j in xrange(self.shells[ish][3]): + rot_mat_all[ish][i,j] = R.next() + for i in xrange(self.shells[ish][3]): # read imaginary part: + for j in xrange(self.shells[ish][3]): + rot_mat_all[ish][i,j] += 1j * R.next() + + #print Dens_Mat_below[0][ish],Dens_Mat_below[1][ish] + + if (self.SP): + rot_mat_all_time_inv[ish] = int(R.next()) + + #except StopIteration : # a more explicit error if the file is corrupted. + # raise "Wien2kConverter: reading file for Projectors failed!" + R.close() + + #----------------------------------------- + # Store the input into HDF5: + ar = HDFArchive(self.hdf_file,'a') + if not (self.par_proj_subgrp in ar): ar.create_group(self.par_proj_subgrp) + # The subgroup containing the data. If it does not exist, it is created. + # If it exists, the data is overwritten!!! + thingstowrite = ['dens_mat_below','n_parproj','proj_mat_pc','rot_mat_all','rot_mat_all_time_inv'] + for it in thingstowrite: exec "ar['%s']['%s'] = %s"%(self.par_proj_subgrp,it,it) + del ar + + # Symmetries are used, + # Now do the symmetries for all orbitals: + self.read_symmetry_input(orbits=self.shells,symm_file=self.symmpar_file,symm_subgrp=self.symm_par_subgrp,SO=self.SO,SP=self.SP) + + + def convert_bands_input(self, bands_subgrp = 'SumK_LDA_Bands'): + """ + Converts the input for momentum resolved spectral functions, and stores it in bands_subgrp in the + HDF5. + """ + + if not (mpi.is_master_node()): return + + self.bands_subgrp = bands_subgrp + mpi.report("Reading bands input from %s..."%self.band_file) + + R = read_fortran_file(self.band_file) + try: + n_k = int(R.next()) + + # read the list of n_orbitals for all k points + n_orbitals = numpy.zeros([n_k,self.n_spin_blocs],numpy.int) + for isp in range(self.n_spin_blocs): + for ik in xrange(n_k): + n_orbitals[ik,isp] = int(R.next()) + + # Initialise the projectors: + #proj_mat = [ [ [numpy.zeros([self.corr_shells[icrsh][3], n_orbitals[ik][isp]], numpy.complex_) + # for icrsh in range (self.n_corr_shells)] + # for isp in range(self.n_spin_blocs)] + # for ik in range(n_k) ] + proj_mat = numpy.zeros([n_k,self.n_spin_blocs,self.n_corr_shells,max(numpy.array(self.corr_shells)[:,3]),max(n_orbitals)],numpy.complex_) + + # Read the projectors from the file: + for ik in xrange(n_k): + for icrsh in range(self.n_corr_shells): + no = self.corr_shells[icrsh][3] + # first Real part for BOTH spins, due to conventions in dmftproj: + for isp in range(self.n_spin_blocs): + for i in xrange(no): + for j in xrange(n_orbitals[ik,isp]): + proj_mat[ik,isp,icrsh,i,j] = R.next() + # now Imag part: + for isp in range(self.n_spin_blocs): + for i in xrange(no): + for j in xrange(n_orbitals[ik,isp]): + proj_mat[ik,isp,icrsh,i,j] += 1j * R.next() + + #hopping = [ [numpy.zeros([n_orbitals[ik][isp],n_orbitals[ik][isp]],numpy.complex_) + # for isp in range(self.n_spin_blocs)] for ik in xrange(n_k) ] + hopping = numpy.zeros([n_k,self.n_spin_blocs,max(n_orbitals),max(n_orbitals)],numpy.complex_) + + # Grab the H + # we use now the convention of a DIAGONAL Hamiltonian!!!! + for isp in range(self.n_spin_blocs): + for ik in xrange(n_k) : + no = n_orbitals[ik,isp] + for i in xrange(no): + hopping[ik,isp,i,i] = R.next() * self.energy_unit + + # now read the partial projectors: + n_parproj = [int(R.next()) for i in range(self.n_shells)] + n_parproj = numpy.array(n_parproj) + + # Initialise P, here a double list of matrices: + #proj_mat_pc = [ [ [ [numpy.zeros([self.shells[ish][3], n_orbitals[ik][isp]], numpy.complex_) + # for ir in range(n_parproj[ish])] + # for ish in range (self.n_shells) ] + # for isp in range(self.n_spin_blocs) ] + # for ik in range(n_k) ] + proj_mat_pc = numpy.zeros([n_k,self.n_spin_blocs,self.n_shells,max(n_parproj),max(numpy.array(self.shells)[:,3]),max(n_orbitals)],numpy.complex_) + + + for ish in range(self.n_shells): + + for ik in xrange(n_k): + for ir in range(n_parproj[ish]): + for isp in range(self.n_spin_blocs): + + for i in xrange(self.shells[ish][3]): # read real part: + for j in xrange(n_orbitals[ik,isp]): + proj_mat_pc[ik,isp,ish,ir,i,j] = R.next() + + for i in xrange(self.shells[ish][3]): # read imaginary part: + for j in xrange(n_orbitals[ik,isp]): + proj_mat_pc[ik,isp,ish,ir,i,j] += 1j * R.next() + + except StopIteration : # a more explicit error if the file is corrupted. + raise "SumkLDA : reading file HMLT_file failed!" + + R.close() + # reading done! + + #----------------------------------------- + # Store the input into HDF5: + ar = HDFArchive(self.hdf_file,'a') + if not (self.bands_subgrp in ar): ar.create_group(self.bands_subgrp) + # The subgroup containing the data. If it does not exist, it is created. + # If it exists, the data is overwritten!!! + thingstowrite = ['n_k','n_orbitals','proj_mat','hopping','n_parproj','proj_mat_pc'] + for it in thingstowrite: exec "ar['%s']['%s'] = %s"%(self.bands_subgrp,it,it) + + #ar[self.bands_subgrp]['n_k'] = n_k + #ar[self.bands_subgrp]['n_orbitals'] = n_orbitals + #ar[self.bands_subgrp]['proj_mat'] = proj_mat + #self.proj_mat = proj_mat + #self.n_orbitals = n_orbitals + #self.n_k = n_k + #self.hopping = hopping + del ar + + + + + + def read_symmetry_input(self, orbits, symm_file, symm_subgrp, SO, SP): + """ + Reads input for the symmetrisations from symm_file, which is case.sympar or case.symqmc. + """ + + if not (mpi.is_master_node()): return + + mpi.report("Reading symmetry input from %s..."%symm_file) + + n_orbits = len(orbits) + R=read_fortran_file(symm_file) + + try: + n_s = int(R.next()) # Number of symmetry operations + n_atoms = int(R.next()) # number of atoms involved + perm = [ [int(R.next()) for i in xrange(n_atoms)] for j in xrange(n_s) ] # list of permutations of the atoms + if SP: + time_inv = [ int(R.next()) for j in xrange(n_s) ] # timeinversion for SO xoupling + else: + time_inv = [ 0 for j in xrange(n_s) ] + + # Now read matrices: + mat = [] + for in_s in xrange(n_s): + + mat.append( [ numpy.zeros([orbits[orb][3], orbits[orb][3]],numpy.complex_) for orb in xrange(n_orbits) ] ) + for orb in range(n_orbits): + for i in xrange(orbits[orb][3]): + for j in xrange(orbits[orb][3]): + mat[in_s][orb][i,j] = R.next() # real part + for i in xrange(orbits[orb][3]): + for j in xrange(orbits[orb][3]): + mat[in_s][orb][i,j] += 1j * R.next() # imaginary part + + # determine the inequivalent shells: + #SHOULD BE FINALLY REMOVED, PUT IT FOR ALL ORBITALS!!!!! + #self.inequiv_shells(orbits) + mat_tinv = [numpy.identity(orbits[orb][3],numpy.complex_) + for orb in range(n_orbits)] + + if ((SO==0) and (SP==0)): + # here we need an additional time inversion operation, so read it: + for orb in range(n_orbits): + for i in xrange(orbits[orb][3]): + for j in xrange(orbits[orb][3]): + mat_tinv[orb][i,j] = R.next() # real part + for i in xrange(orbits[orb][3]): + for j in xrange(orbits[orb][3]): + mat_tinv[orb][i,j] += 1j * R.next() # imaginary part + + + + except StopIteration : # a more explicit error if the file is corrupted. + raise "Symmetry : reading file failed!" + + R.close() + + # Save it to the HDF: + ar=HDFArchive(self.hdf_file,'a') + if not (symm_subgrp in ar): ar.create_group(symm_subgrp) + thingstowrite = ['n_s','n_atoms','perm','orbits','SO','SP','time_inv','mat','mat_tinv'] + for it in thingstowrite: exec "ar['%s']['%s'] = %s"%(symm_subgrp,it,it) + del ar + + + + def __repack(self): + """Calls the h5repack routine, in order to reduce the file size of the hdf5 archive. + Should only be used BEFORE the first invokation of HDFArchive in the program, otherwise + the hdf5 linking is broken!!!""" + + import subprocess + + if not (mpi.is_master_node()): return + + mpi.report("Repacking the file %s"%self.hdf_file) + + retcode = subprocess.call(["h5repack","-i%s"%self.hdf_file, "-otemphgfrt.h5"]) + if (retcode!=0): + mpi.report("h5repack failed!") + else: + subprocess.call(["mv","-f","temphgfrt.h5","%s"%self.hdf_file]) + + + + def inequiv_shells(self,lst): + """ + The number of inequivalent shells is calculated from lst, and a mapping is given as + map(i_corr_shells) = i_inequiv_corr_shells + invmap(i_inequiv_corr_shells) = i_corr_shells + in order to put the Self energies to all equivalent shells, and for extracting Gloc + """ + + tmp = [] + self.shellmap = [0 for i in range(len(lst))] + self.invshellmap = [0] + self.n_inequiv_corr_shells = 1 + tmp.append( lst[0][1:3] ) + + if (len(lst)>1): + for i in range(len(lst)-1): + + fnd = False + for j in range(self.n_inequiv_corr_shells): + if (tmp[j]==lst[i+1][1:3]): + fnd = True + self.shellmap[i+1] = j + if (fnd==False): + self.shellmap[i+1] = self.n_inequiv_corr_shells + self.n_inequiv_corr_shells += 1 + tmp.append( lst[i+1][1:3] ) + self.invshellmap.append(i+1) + diff --git a/python/solver_multiband.py b/python/solver_multiband.py new file mode 100644 index 00000000..6eee0c8c --- /dev/null +++ b/python/solver_multiband.py @@ -0,0 +1,449 @@ + +################################################################################ +# +# TRIQS: a Toolbox for Research in Interacting Quantum Systems +# +# Copyright (C) 2011 by M. Aichhorn, L. Pourovskii, V. Vildosola +# +# TRIQS is free software: you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation, either version 3 of the License, or (at your option) any later +# version. +# +# TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# TRIQS. If not, see . +# +################################################################################ + + +#from pytriqs.applications.dft.U_matrix import * +from U_matrix import * +#from pytriqs.applications.impurity_solvers.operators import * +from pytriqs.operators import * +from pytriqs.applications.impurity_solvers.ctqmc_hyb import Solver +import pytriqs.utility.mpi as mpi +from types import * +import numpy + +def sum_list(L): + """ Can sum any list""" + return reduce(lambda x, y: x+y, L) if len(L)>0 else [] + +######################################### +# +# Solver for the Multi-Band problem +# +######################################### + + +class SolverMultiBand(Solver): + """ + This is a general solver for a multiband local Hamiltonian. + Calling arguments: + beta = inverse temperature + n_orb = Number of local orbitals + U_interact = Average Coulomb interaction + J_hund = Hund coupling + use_spinflip = true/false + use_pairhop = true/false + use_matrix: Use the interaction matrix calculated from the Slater integrals + is use_matrix, you need also: + l: angular momentum of the orbital, l=2 is d + T: Transformation matrix for U vertex. If not present, use standard complex harmonics + + """ + + def __init__(self, beta, n_orb, gf_struct = False, map = False): + + self.n_orb = n_orb + + # either get or construct gf_struct + if (gf_struct): + assert map, "give also the mapping!" + self.map = map + else: + # standard gf_struct and map + gf_struct = [ ('%s'%(ud),[n for n in range(n_orb)]) for ud in ['up','down'] ] + self.map = {'up' : ['up' for v in range(n_orb)], 'down' : ['down' for v in range(n_orb)]} + + # now initialize the solver with the stuff given above: + Solver.__init__(self, beta = beta, gf_struct = gf_struct) + + + def solve(self, U_interact=None, J_hund=None, use_spinflip=False, + use_matrix = True, l=2, T=None, dim_reps=None, irep=None, deg_orbs = [], sl_int = None, **params): + + self.use_spinflip = use_spinflip + self.U, self.Up, self.U4ind, self.offset = set_U_matrix(U_interact,J_hund,self.n_orb,l,use_matrix,T,sl_int,use_spinflip,dim_reps,irep) + + # define mapping of indices: + self.map_ind={} + for nm in self.map: + bl_names = self.map[nm] + block = [] + for a,al in self.gf_struct: + if a in bl_names: block.append(al) + + self.map_ind[nm] = range(self.n_orb) + i = 0 + for al in block: + cnt = 0 + for a in range(len(al)): + self.map_ind[nm][i] = cnt + i = i+1 + cnt = cnt+1 + + # set the Hamiltonian + if (use_spinflip==False): + Hamiltonian = self.__set_hamiltonian_density() + else: + if (use_matrix): + #Hamiltonian = self.__set_full_hamiltonian_slater() + Hamiltonian = self.__set_spinflip_hamiltonian_slater() + else: + Hamiltonian = self.__set_full_hamiltonian_kanamori(J_hund = J_hund) + + # set the Quantum numbers + Quantum_Numbers = self.__set_quantum_numbers(self.gf_struct) + + # Determine if there are only blocs of size 1: + self.blocssizeone = True + for ib in self.gf_struct: + if (len(ib[1])>1): self.blocssizeone = False + + nc = params.pop("n_cycles",10000) + if ((self.blocssizeone) and (self.use_spinflip==False)): + use_seg = True + else: + use_seg = False + #gm = self.set_global_moves(deg_orbs) + + Solver.solve(self,H_local = Hamiltonian, quantum_numbers = Quantum_Numbers, n_cycles = nc, use_segment_picture = use_seg, **params) + + + def set_global_moves(self, deg_orbs, factor=0.05): + # Sets some global moves given orbital degeneracies: + + strbl = '' + strind = '' + inddone = [] + + for orbs in deg_orbs: + ln = len(orbs) + orbsorted = sorted(orbs) + for ii in range(ln): + if (strbl!=''): strbl += ',' + bl1 = orbsorted[ii] + bl2 = orbsorted[(ii+1)%ln] + ind1 = [ll for ll in self.Sigma[bl1].indices ] + ind2 = [ll for ll in self.Sigma[bl2].indices ] + + strbl += "'" + bl1 + "':'" + bl2 + "'" + for kk, ind in enumerate(ind1): + if not (ind in inddone): + if (strind!=''): strind += ',' + strind += '%s:%s'%(ind1[kk],ind2[kk]) + inddone.append(ind) + + + if len(deg_orbs)>0: + str = 'Global_Moves = [ (%s, lambda (a,alpha,dag) : ({ '%factor + strbl + ' }[a], {' + strind + '}[alpha], dag) )]' + exec str + return Global_Moves + else: + return [] + + + def __set_hamiltonian_density(self): + # density-density Hamiltonian: + + spinblocs = [v for v in self.map] + #print spinblocs + Hamiltonian = N(self.map[spinblocs[0]][0],0) # initialize it + + for sp1 in spinblocs: + for sp2 in spinblocs: + for i in range(self.n_orb): + for j in range(self.n_orb): + if (sp1==sp2): + Hamiltonian += 0.5 * self.U[self.offset+i,self.offset+j] * N(self.map[sp1][i],self.map_ind[sp1][i]) * N(self.map[sp2][j],self.map_ind[sp2][j]) + else: + Hamiltonian += 0.5 * self.Up[self.offset+i,self.offset+j] * N(self.map[sp1][i],self.map_ind[sp1][i]) * N(self.map[sp2][j],self.map_ind[sp2][j]) + + Hamiltonian -= N(self.map[spinblocs[0]][0],0) # substract the initializing value + + return Hamiltonian + + + def __set_full_hamiltonian_slater(self): + + spinblocs = [v for v in self.map] + Hamiltonian = N(self.map[spinblocs[0]][0],0) # initialize it + #print "Starting..." + # use the full 4-index U-matrix: + #for sp1 in spinblocs: + # for sp2 in spinblocs: + for m1 in range(self.n_orb): + for m2 in range(self.n_orb): + for m3 in range(self.n_orb): + for m4 in range(self.n_orb): + if (abs(self.U4ind[self.offset+m1,self.offset+m2,self.offset+m3,self.offset+m4])>0.00001): + for sp1 in spinblocs: + for sp2 in spinblocs: + #print sp1,sp2,m1,m2,m3,m4 + Hamiltonian += 0.5 * self.U4ind[self.offset+m1,self.offset+m2,self.offset+m3,self.offset+m4] * \ + Cdag(self.map[sp1][m1],self.map_ind[sp1][m1]) * Cdag(self.map[sp2][m2],self.map_ind[sp2][m2]) * C(self.map[sp2][m4],self.map_ind[sp2][m4]) * C(self.map[sp1][m3],self.map_ind[sp1][m3]) + #print "end..." + Hamiltonian -= N(self.map[spinblocs[0]][0],0) # substract the initializing value + + return Hamiltonian + + + def __set_spinflip_hamiltonian_slater(self): + """Takes only spin-flip and pair-hopping terms""" + + spinblocs = [v for v in self.map] + Hamiltonian = N(self.map[spinblocs[0]][0],0) # initialize it + #print "Starting..." + # use the full 4-index U-matrix: + #for sp1 in spinblocs: + # for sp2 in spinblocs: + for m1 in range(self.n_orb): + for m2 in range(self.n_orb): + for m3 in range(self.n_orb): + for m4 in range(self.n_orb): + if ((abs(self.U4ind[self.offset+m1,self.offset+m2,self.offset+m3,self.offset+m4])>0.00001) and + ( ((m1==m2)and(m3==m4)) or ((m1==m3)and(m2==m4)) or ((m1==m4)and(m2==m3)) ) ): + for sp1 in spinblocs: + for sp2 in spinblocs: + #print sp1,sp2,m1,m2,m3,m4 + Hamiltonian += 0.5 * self.U4ind[self.offset+m1,self.offset+m2,self.offset+m3,self.offset+m4] * \ + Cdag(self.map[sp1][m1],self.map_ind[sp1][m1]) * Cdag(self.map[sp2][m2],self.map_ind[sp2][m2]) * C(self.map[sp2][m4],self.map_ind[sp2][m4]) * C(self.map[sp1][m3],self.map_ind[sp1][m3]) + #print "end..." + Hamiltonian -= N(self.map[spinblocs[0]][0],0) # substract the initializing value + + return Hamiltonian + + + + def __set_full_hamiltonian_kanamori(self,J_hund): + + spinblocs = [v for v in self.map] + assert len(spinblocs)==2,"spinflips in Kanamori representation only implemented for up/down structure!" + + Hamiltonian = N(self.map[spinblocs[0]][0],0) # initialize it + + # density terms: + for sp1 in spinblocs: + for sp2 in spinblocs: + for i in range(self.n_orb): + for j in range(self.n_orb): + if (sp1==sp2): + Hamiltonian += 0.5 * self.U[self.offset+i,self.offset+j] * N(self.map[sp1][i],self.map_ind[sp1][i]) * N(self.map[sp2][j],self.map_ind[sp2][j]) + else: + Hamiltonian += 0.5 * self.Up[self.offset+i,self.offset+j] * N(self.map[sp1][i],self.map_ind[sp1][i]) * N(self.map[sp2][j],self.map_ind[sp2][j]) + + # spinflip term: + sp1 = spinblocs[0] + sp2 = spinblocs[1] + for i in range(self.n_orb-1): + for j in range(i+1,self.n_orb): + Hamiltonian -= J_hund * ( Cdag(self.map[sp1][i],self.map_ind[sp1][i]) * C(self.map[sp2][i],self.map_ind[sp2][i]) * Cdag(self.map[sp2][j],self.map_ind[sp2][j]) * C(self.map[sp1][j],self.map_ind[sp1][j]) ) # first term + Hamiltonian -= J_hund * ( Cdag(self.map[sp2][i],self.map_ind[sp2][i]) * C(self.map[sp1][i],self.map_ind[sp1][i]) * Cdag(self.map[sp1][j],self.map_ind[sp1][j]) * C(self.map[sp2][j],self.map_ind[sp2][j]) ) # second term + + # pairhop terms: + for i in range(self.n_orb-1): + for j in range(i+1,self.n_orb): + Hamiltonian -= J_hund * ( Cdag(self.map[sp1][i],self.map_ind[sp1][i]) * Cdag(self.map[sp2][i],self.map_ind[sp2][i]) * C(self.map[sp1][j],self.map_ind[sp1][j]) * C(self.map[sp2][j],self.map_ind[sp2][j]) ) # first term + Hamiltonian -= J_hund * ( Cdag(self.map[sp2][j],self.map_ind[sp2][j]) * Cdag(self.map[sp1][j],self.map_ind[sp1][j]) * C(self.map[sp2][i],self.map_ind[sp2][i]) * C(self.map[sp1][i],self.map_ind[sp1][i]) ) # second term + + Hamiltonian -= N(self.map[spinblocs[0]][0],0) # substract the initializing value + + return Hamiltonian + + + def __set_quantum_numbers(self,gf_struct): + + QN = {} + spinblocs = [v for v in self.map] + + # Define the quantum numbers: + if (self.use_spinflip) : + Ntot = sum_list( [ N(self.map[s][i],self.map_ind[s][i]) for s in spinblocs for i in range(self.n_orb) ] ) + QN['NtotQN'] = Ntot + #QN['Ntot'] = sum_list( [ N(self.map[s][i],i) for s in spinblocs for i in range(self.n_orb) ] ) + if (len(spinblocs)==2): + # Assuming up/down structure: + Sz = sum_list( [ N(self.map[spinblocs[0]][i],self.map_ind[spinblocs[0]][i])-N(self.map[spinblocs[1]][i],self.map_ind[spinblocs[1]][i]) for i in range(self.n_orb) ] ) + QN['SzQN'] = Sz + # new quantum number: works only if there are only spin-flip and pair hopping, not any more complicated things + for i in range(self.n_orb): + QN['Sz2_%s'%i] = (N(self.map[spinblocs[0]][i],self.map_ind[spinblocs[0]][i])-N(self.map[spinblocs[1]][i],self.map_ind[spinblocs[1]][i])) * (N(self.map[spinblocs[0]][i],self.map_ind[spinblocs[0]][i])-N(self.map[spinblocs[1]][i],self.map_ind[spinblocs[1]][i])) + + else : + for ibl in range(len(gf_struct)): + QN['N%s'%gf_struct[ibl][0]] = sum_list( [ N(gf_struct[ibl][0],gf_struct[ibl][1][i]) for i in range(len(gf_struct[ibl][1])) ] ) + + return QN + + + def fit_tails(self): + """Fits the tails using the constant value for the Re Sigma calculated from F=Sigma*G. + Works only for blocks of size one.""" + + #if (len(self.gf_struct)==2*self.n_orb): + if (self.blocssizeone): + spinblocs = [v for v in self.map] + mpi.report("Fitting tails manually") + + known_coeff = numpy.zeros([1,1,2],numpy.float_) + msh = [x.imag for x in self.G[self.map[spinblocs[0]][0]].mesh ] + fit_start = msh[self.fitting_Frequency_Start] + fit_stop = msh[self.N_Frequencies_Accumulated] + + # Fit the tail of G just to get the density + for n,g in self.G: + g.fitTail([[[0,0,1]]],7,fit_start,2*fit_stop) + densmat = self.G.density() + + for sig1 in spinblocs: + for i in range(self.n_orb): + + coeff = 0.0 + + for sig2 in spinblocs: + for j in range(self.n_orb): + if (sig1==sig2): + coeff += self.U[self.offset+i,self.offset+j] * densmat[self.map[sig1][j]][0,0].real + else: + coeff += self.Up[self.offset+i,self.offset+j] * densmat[self.map[sig2][j]][0,0].real + + known_coeff[0,0,1] = coeff + self.Sigma[self.map[sig1][i]].fitTail(fixed_coef = known_coeff, order_max = 3, fit_start = fit_start, fit_stop = fit_stop) + + else: + + for n,sig in self.Sigma: + + known_coeff = numpy.zeros([sig.N1,sig.N2,1],numpy.float_) + msh = [x.imag for x in sig.mesh] + fit_start = msh[self.fitting_Frequency_Start] + fit_stop = msh[self.N_Frequencies_Accumulated] + + sig.fitTail(fixed_coef = known_coeff, order_max = 3, fit_start = fit_start, fit_stop = fit_stop) + + + + +class SolverMultiBandOld(SolverMultiBand): + """ + Old MultiBand Solver construct + """ + + def __init__(self, Beta, Norb, U_interact=None, J_Hund=None, GFStruct=False, map=False, use_spinflip=False, + useMatrix = True, l=2, T=None, dimreps=None, irep=None, deg_orbs = [], Sl_Int = None): + + SolverMultiBand.__init__(self, beta=Beta, n_orb=Norb, gf_struct=GFStruct, map=map) + self.U_interact = U_interact + self.J_Hund = J_Hund + self.use_spinflip = use_spinflip + self.useMatrix = useMatrix + self.l = l + self.T = T + self.dimreps = dimreps + self.irep = irep + self.deg_orbs = deg_orbs + self.Sl_Int = Sl_Int + self.gen_keys = copy.deepcopy(self.__dict__) + + msg = """ +********************************************************************************** + Warning: You are using the old constructor for the solver. Beware that this will + be deprecated in future versions. Please check the documentation. +********************************************************************************** +""" + mpi.report(msg) + + + def Solve(self): + + params = copy.deepcopy(self.__dict__) + for i in self.gen_keys: self.params.pop(i) + self.params.pop("gen_keys") + self.solve(self, U_interact=self.U_interact, J_hund=self.J_Hund, use_spinflip=self.use_spinflip, + use_matrix = self.useMatrix, l=self.l, T=self.T, dim_reps=self.dimreps, irep=self.irep, + deg_orbs = self.deg_orbs, sl_int = self.Sl_Int, **params) + + + + + +def set_U_matrix(U_interact,J_hund,n_orb,l,use_matrix=True,T=None,sl_int=None,use_spinflip=False,dim_reps=None,irep=None): + """ Set up the interaction vertex""" + + offset = 0 + U4ind = None + U = None + Up = None + if (use_matrix): + if not (sl_int is None): + Umat = Umatrix(l=l) + assert len(sl_int)==(l+1),"sl_int has the wrong length" + if (type(sl_int)==ListType): + Rcl = numpy.array(sl_int) + else: + Rcl = sl_int + Umat(T=T,Rcl=Rcl) + else: + if ((U_interact==None)and(J_hund==None)): + mpi.report("Give U,J or Slater integrals!!!") + assert 0 + Umat = Umatrix(U_interact=U_interact, J_hund=J_hund, l=l) + Umat(T=T) + + Umat.reduce_matrix() + if (Umat.N==Umat.Nmat): + # Transformation T is of size 2l+1 + U = Umat.U + Up = Umat.Up + else: + # Transformation is of size 2(2l+1) + U = Umat.U + # now we have the reduced matrices U and Up, we need it for tail fitting anyways + + if (use_spinflip): + #Take the 4index Umatrix + # check for imaginary matrix elements: + if (abs(Umat.Ufull.imag)>0.0001).any(): + mpi.report("WARNING: complex interaction matrix!! Ignoring imaginary part for the moment!") + mpi.report("If you want to change this, look into Wien2k/solver_multiband.py") + U4ind = Umat.Ufull.real + + # this will be changed for arbitrary irep: + # use only one subgroup of orbitals? + if not (irep is None): + #print irep, dim_reps + assert not (dim_reps is None), "Dimensions of the representatives are missing!" + assert n_orb==dim_reps[irep-1],"Dimensions of dimrep and n_orb do not fit!" + for ii in range(irep-1): + offset += dim_reps[ii] + else: + if ((U_interact==None)and(J_hund==None)): + mpi.report("For Kanamori representation, give U and J!!") + assert 0 + U = numpy.zeros([n_orb,n_orb],numpy.float_) + Up = numpy.zeros([n_orb,n_orb],numpy.float_) + for i in range(n_orb): + for j in range(n_orb): + if (i==j): + Up[i,i] = U_interact + 2.0*J_hund + else: + Up[i,j] = U_interact + U[i,j] = U_interact - J_hund + + return U, Up, U4ind, offset diff --git a/python/sumk_lda.py b/python/sumk_lda.py new file mode 100644 index 00000000..8401e478 --- /dev/null +++ b/python/sumk_lda.py @@ -0,0 +1,1149 @@ + +################################################################################ +# +# TRIQS: a Toolbox for Research in Interacting Quantum Systems +# +# Copyright (C) 2011 by M. Aichhorn, L. Pourovskii, V. Vildosola +# +# TRIQS is free software: you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation, either version 3 of the License, or (at your option) any later +# version. +# +# TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# TRIQS. If not, see . +# +################################################################################ + +from types import * +#from pytriqs.applications.dft.symmetry import * +from symmetry import * +import numpy +import pytriqs.utility.dichotomy as dichotomy +from pytriqs.gf.local import * +#from pytriqs.applications.impurity_solvers.operators import * +from pytriqs.operators import * +from pytriqs.archive import * +import pytriqs.utility.mpi as mpi + +from math import cos,sin + +import string, pickle + +class SumkLDA: + """This class provides a general SumK method for combining ab-initio code and pytriqs.""" + + + def __init__(self, hdf_file, mu = 0.0, h_field = 0.0, use_lda_blocks = False, lda_data = 'SumK_LDA', symm_corr_data = 'SymmCorr', + par_proj_data = 'SumK_LDA_ParProj', symm_par_data = 'SymmPar', bands_data = 'SumK_LDA_Bands'): + """ + Initialises the class from data previously stored into an HDF5 + """ + + if not (type(hdf_file)==StringType): + mpi.report("Give a string for the HDF5 filename to read the input!") + else: + self.hdf_file = hdf_file + self.lda_data = lda_data + self.par_proj_data = par_proj_data + self.bands_data = bands_data + self.symm_par_data = symm_par_data + self.symm_corr_data = symm_corr_data + self.block_names = [ ['up','down'], ['ud'] ] + self.n_spin_blocks_gf = [2,1] + self.Gupf = None + self.h_field = h_field + + # read input from HDF: + things_to_read = ['energy_unit','n_k','k_dep_projection','SP','SO','charge_below','density_required', + 'symm_op','n_shells','shells','n_corr_shells','corr_shells','use_rotations','rot_mat', + 'rot_mat_time_inv','n_reps','dim_reps','T','n_orbitals','proj_mat','bz_weights','hopping'] + optional_things = ['gf_struct_solver','map_inv','map','chemical_potential','dc_imp','dc_energ','deg_shells'] + + #ar=HDFArchive(self.hdf_file,'a') + #del ar + + self.retval = self.read_input_from_hdf(subgrp=self.lda_data,things_to_read=things_to_read,optional_things=optional_things) + + #ar=HDFArchive(self.hdf_file,'a') + #del ar + + if (self.SO) and (abs(self.h_field)>0.000001): + self.h_field=0.0 + mpi.report("For SO, the external magnetic field is not implemented, setting it to 0!!") + + + self.inequiv_shells(self.corr_shells) # determine the number of inequivalent correlated shells + + # field to convert block_names to indices + self.names_to_ind = [{}, {}] + for ibl in range(2): + for inm in range(self.n_spin_blocks_gf[ibl]): + self.names_to_ind[ibl][self.block_names[ibl][inm]] = inm * self.SP #(self.Nspinblocs-1) + + # GF structure used for the local things in the k sums + self.gf_struct_corr = [ [ (al, range( self.corr_shells[i][3])) for al in self.block_names[self.corr_shells[i][4]] ] + for i in xrange(self.n_corr_shells) ] + + if not (self.retval['gf_struct_solver']): + # No gf_struct was stored in HDF, so first set a standard one: + self.gf_struct_solver = [ [ (al, range( self.corr_shells[self.invshellmap[i]][3]) ) + for al in self.block_names[self.corr_shells[self.invshellmap[i]][4]] ] + for i in xrange(self.n_inequiv_corr_shells) ] + self.map = [ {} for i in xrange(self.n_inequiv_corr_shells) ] + self.map_inv = [ {} for i in xrange(self.n_inequiv_corr_shells) ] + for i in xrange(self.n_inequiv_corr_shells): + for al in self.block_names[self.corr_shells[self.invshellmap[i]][4]]: + self.map[i][al] = [al for j in range( self.corr_shells[self.invshellmap[i]][3] ) ] + self.map_inv[i][al] = al + + if not (self.retval['dc_imp']): + # init the double counting: + self.__init_dc() + + if not (self.retval['chemical_potential']): + self.chemical_potential = mu + + if not (self.retval['deg_shells']): + self.deg_shells = [ [] for i in range(self.n_inequiv_corr_shells)] + + if self.symm_op: + #mpi.report("Do the init for symm:") + self.Symm_corr = Symmetry(hdf_file,subgroup=self.symm_corr_data) + + # determine the smallest blocs, if wanted: + if (use_lda_blocks): dm=self.analyse_BS() + + + # now save things again to HDF5: + if (mpi.is_master_node()): + ar=HDFArchive(self.hdf_file,'a') + ar[self.lda_data]['h_field'] = self.h_field + del ar + self.save() + + + + + + + def read_input_from_hdf(self, subgrp, things_to_read, optional_things=[]): + """ + Reads data from the HDF file + """ + + retval = True + # init variables on all nodes: + for it in things_to_read: exec "self.%s = 0"%it + for it in optional_things: exec "self.%s = 0"%it + + if (mpi.is_master_node()): + ar=HDFArchive(self.hdf_file,'a') + if (subgrp in ar): + # first read the necessary things: + for it in things_to_read: + if (it in ar[subgrp]): + exec "self.%s = ar['%s']['%s']"%(it,subgrp,it) + else: + mpi.report("Loading %s failed!"%it) + retval = False + + if ((retval) and (len(optional_things)>0)): + # if necessary things worked, now read optional things: + retval = {} + for it in optional_things: + if (it in ar[subgrp]): + exec "self.%s = ar['%s']['%s']"%(it,subgrp,it) + retval['%s'%it] = True + else: + retval['%s'%it] = False + else: + mpi.report("Loading failed: No %s subgroup in HDF5!"%subgrp) + retval = False + + del ar + + # now do the broadcasting: + for it in things_to_read: exec "self.%s = mpi.bcast(self.%s)"%(it,it) + for it in optional_things: exec "self.%s = mpi.bcast(self.%s)"%(it,it) + + + retval = mpi.bcast(retval) + + return retval + + + + def save(self): + """Saves some quantities into an HDF5 arxiv""" + + if not (mpi.is_master_node()): return # do nothing on nodes + + ar=HDFArchive(self.hdf_file,'a') + ar[self.lda_data]['chemical_potential'] = self.chemical_potential + ar[self.lda_data]['dc_energ'] = self.dc_energ + ar[self.lda_data]['dc_imp'] = self.dc_imp + del ar + + + def load(self): + """Loads some quantities from an HDF5 arxiv""" + + things_to_read=['chemical_potential','dc_imp','dc_energ'] + + retval = self.read_input_from_hdf(subgrp=self.lda_data,things_to_read=things_to_read) + return retval + + + def downfold(self,ik,icrsh,sig,gf_to_downfold,gf_inp): + """Downfolding a block of the Greens function""" + + gf_downfolded = gf_inp.copy() + isp = self.names_to_ind[self.SO][sig] # get spin index for proj. matrices + dim = self.corr_shells[icrsh][3] + n_orb = self.n_orbitals[ik,isp] + + gf_downfolded.from_L_G_R(self.proj_mat[ik,isp,icrsh,0:dim,0:n_orb],gf_to_downfold,self.proj_mat[ik,isp,icrsh,0:dim,0:n_orb].conjugate().transpose()) # downfolding G + + return gf_downfolded + + + def upfold(self,ik,icrsh,sig,gf_to_upfold,gf_inp): + """Upfolding a block of the Greens function""" + + gf_upfolded = gf_inp.copy() + + isp = self.names_to_ind[self.SO][sig] # get spin index for proj. matrices + dim = self.corr_shells[icrsh][3] + n_orb = self.n_orbitals[ik,isp] + + gf_upfolded.from_L_G_R(self.proj_mat[ik,isp,icrsh,0:dim,0:n_orb].conjugate().transpose(),gf_to_upfold,self.proj_mat[ik,isp,icrsh,0:dim,0:n_orb]) + + return gf_upfolded + + + def rotloc(self,icrsh,gf_to_rotate,direction): + """Local <-> Global rotation of a GF block. + direction: 'toLocal' / 'toGlobal' """ + + assert ((direction=='toLocal')or(direction=='toGlobal')),"Give direction 'toLocal' or 'toGlobal' in rotloc!" + + gf_rotated = gf_to_rotate.copy() + if (direction=='toGlobal'): + #if (self.rot_mat_time_inv[icrsh]==1): gf_rotated <<= gf_rotated.transpose() + #gf_rotated.from_L_G_R(self.rot_mat[icrsh].transpose(),gf_rotated,self.rot_mat[icrsh].conjugate()) + if ((self.rot_mat_time_inv[icrsh]==1) and (self.SO)): + gf_rotated <<= gf_rotated.transpose() + gf_rotated.from_L_G_R(self.rot_mat[icrsh].conjugate(),gf_rotated,self.rot_mat[icrsh].transpose()) + else: + gf_rotated.from_L_G_R(self.rot_mat[icrsh],gf_rotated,self.rot_mat[icrsh].conjugate().transpose()) + + elif (direction=='toLocal'): + if ((self.rot_mat_time_inv[icrsh]==1)and(self.SO)): + gf_rotated <<= gf_rotated.transpose() + gf_rotated.from_L_G_R(self.rot_mat[icrsh].transpose(),gf_rotated,self.rot_mat[icrsh].conjugate()) + else: + gf_rotated.from_L_G_R(self.rot_mat[icrsh].conjugate().transpose(),gf_rotated,self.rot_mat[icrsh]) + + return gf_rotated + + + def lattice_gf_matsubara(self,ik,mu,beta=40,with_Sigma=True): + """Calculates the lattice Green function from the LDA hopping and the self energy at k-point number ik + and chemical potential mu.""" + + ntoi = self.names_to_ind[self.SO] + bln = self.block_names[self.SO] + + if (not hasattr(self,"Sigma_imp")): with_Sigma=False + + if (with_Sigma): + stmp = self.add_dc() + beta = self.Sigma_imp[0].mesh.beta #override beta if Sigma is present + + if (self.Gupf is None): + # first setting up of Gupf + BS = [ range(self.n_orbitals[ik,ntoi[ib]]) for ib in bln ] + gf_struct = [ (bln[ib], BS[ib]) for ib in range(self.n_spin_blocks_gf[self.SO]) ] + a_list = [a for a,al in gf_struct] + if (with_Sigma): #take the mesh from Sigma if necessary + glist = lambda : [ GfImFreq(indices = al, mesh = self.Sigma_imp[0].mesh) for a,al in gf_struct] + else: + glist = lambda : [ GfImFreq(indices = al, beta = beta) for a,al in gf_struct] + self.Gupf = BlockGf(name_list = a_list, block_list = glist(),make_copies=False) + self.Gupf.zero() + self.Gupf_id = self.Gupf.copy() + self.Gupf_id <<= iOmega_n + + GFsize = [ gf.N1 for sig,gf in self.Gupf] + unchangedsize = all( [ self.n_orbitals[ik,ntoi[bln[ib]]]==GFsize[ib] + for ib in range(self.n_spin_blocks_gf[self.SO]) ] ) + + if ((not unchangedsize)or(self.Gupf.mesh.beta!=beta)): + BS = [ range(self.n_orbitals[ik,ntoi[ib]]) for ib in bln ] + gf_struct = [ (bln[ib], BS[ib]) for ib in range(self.n_spin_blocks_gf[self.SO]) ] + a_list = [a for a,al in gf_struct] + if (with_Sigma): + glist = lambda : [ GfImFreq(indices = al, mesh = self.Sigma_imp[0].mesh) for a,al in gf_struct] + else: + glist = lambda : [ GfImFreq(indices = al, beta = beta) for a,al in gf_struct] + self.Gupf = BlockGf(name_list = a_list, block_list = glist(),make_copies=False) + self.Gupf.zero() + self.Gupf_id = self.Gupf.copy() + self.Gupf_id <<= iOmega_n + + + idmat = [numpy.identity(self.n_orbitals[ik,ntoi[bl]],numpy.complex_) for bl in bln] + #for ibl in range(self.n_spin_blocks_gf[self.SO]): mupat[ibl] *= mu + + self.Gupf <<= self.Gupf_id + M = copy.deepcopy(idmat) + for ibl in range(self.n_spin_blocks_gf[self.SO]): + ind = ntoi[bln[ibl]] + n_orb = self.n_orbitals[ik,ind] + M[ibl] = self.hopping[ik,ind,0:n_orb,0:n_orb] - (idmat[ibl]*mu) - (idmat[ibl] * self.h_field * (1-2*ibl)) + self.Gupf -= M + + if (with_Sigma): + for icrsh in xrange(self.n_corr_shells): + for sig,gf in self.Gupf: gf -= self.upfold(ik,icrsh,sig,stmp[icrsh][sig],gf) + + self.Gupf.invert() + + return self.Gupf + + + def check_projectors(self): + + dens_mat = [numpy.zeros([self.corr_shells[ish][3],self.corr_shells[ish][3]],numpy.complex_) + for ish in range(self.n_corr_shells)] + + for ik in range(self.n_k): + + for ish in range(self.n_corr_shells): + dim = self.corr_shells[ish][3] + n_orb = self.n_orbitals[ik,0] + dens_mat[ish][:,:] += numpy.dot(self.proj_mat[ik,0,ish,0:dim,0:n_orb],self.proj_mat[ik,0,ish,0:dim,0:n_orb].transpose().conjugate()) * self.bz_weights[ik] + + if (self.symm_op!=0): dens_mat = self.Symm_corr.symmetrize(dens_mat) + + # Rotate to local coordinate system: + if (self.use_rotations): + for icrsh in xrange(self.n_corr_shells): + if (self.rot_mat_time_inv[icrsh]==1): dens_mat[icrsh] = dens_mat[icrsh].conjugate() + dens_mat[icrsh] = numpy.dot( numpy.dot(self.rot_mat[icrsh].conjugate().transpose(),dens_mat[icrsh]) , + self.rot_mat[icrsh] ) + + + return dens_mat + + + + def simple_point_dens_mat(self): + + + ntoi = self.names_to_ind[self.SO] + bln = self.block_names[self.SO] + + MMat = [numpy.zeros( [self.n_orbitals[0,ntoi[bl]],self.n_orbitals[0,ntoi[bl]]], numpy.complex_) for bl in bln] + + dens_mat = [ {} for icrsh in xrange(self.n_corr_shells)] + for icrsh in xrange(self.n_corr_shells): + for bl in self.block_names[self.corr_shells[icrsh][4]]: + dens_mat[icrsh][bl] = numpy.zeros([self.corr_shells[icrsh][3],self.corr_shells[icrsh][3]], numpy.complex_) + + ikarray=numpy.array(range(self.n_k)) + + for ik in mpi.slice_array(ikarray): + + unchangedsize = all( [ self.n_orbitals[ik,ntoi[bln[ib]]]==len(MMat[ib]) + for ib in range(self.n_spin_blocks_gf[self.SO]) ] ) + + if (not unchangedsize): + MMat = [numpy.zeros( [self.n_orbitals[ik,ntoi[bl]],self.n_orbitals[ik,ntoi[bl]]], numpy.complex_) for bl in bln] + + for ibl,bl in enumerate(bln): + ind = ntoi[bl] + for inu in range(self.n_orbitals[ik,ind]): + if ( (self.hopping[ik,ind,inu,inu]-self.h_field*(1-2*ibl)) < 0.0): + MMat[ibl][inu,inu] = 1.0 + else: + MMat[ibl][inu,inu] = 0.0 + + + for icrsh in range(self.n_corr_shells): + for ibn,bn in enumerate(self.block_names[self.corr_shells[icrsh][4]]): + isp = self.names_to_ind[self.corr_shells[icrsh][4]][bn] + dim = self.corr_shells[icrsh][3] + n_orb = self.n_orbitals[ik,isp] + + #print ik, bn, isp + dens_mat[icrsh][bn] += self.bz_weights[ik] * numpy.dot( numpy.dot(self.proj_mat[ik,isp,icrsh,0:dim,0:n_orb],MMat[ibn]) , + self.proj_mat[ik,isp,icrsh,0:dim,0:n_orb].transpose().conjugate() ) + + # get data from nodes: + for icrsh in range(self.n_corr_shells): + for sig in dens_mat[icrsh]: + dens_mat[icrsh][sig] = mpi.all_reduce(mpi.world,dens_mat[icrsh][sig],lambda x,y : x+y) + mpi.barrier() + + + if (self.symm_op!=0): dens_mat = self.Symm_corr.symmetrize(dens_mat) + + # Rotate to local coordinate system: + if (self.use_rotations): + for icrsh in xrange(self.n_corr_shells): + for bn in dens_mat[icrsh]: + if (self.rot_mat_time_inv[icrsh]==1): dens_mat[icrsh][bn] = dens_mat[icrsh][bn].conjugate() + dens_mat[icrsh][bn] = numpy.dot( numpy.dot(self.rot_mat[icrsh].conjugate().transpose(),dens_mat[icrsh][bn]) , + self.rot_mat[icrsh]) + + + return dens_mat + + + def density_gf(self,beta): + """Calculates the density without setting up Gloc. It is useful for Hubbard I, and very fast.""" + + dens_mat = [ {} for icrsh in xrange(self.n_corr_shells)] + for icrsh in xrange(self.n_corr_shells): + for bl in self.block_names[self.corr_shells[icrsh][4]]: + dens_mat[icrsh][bl] = numpy.zeros([self.corr_shells[icrsh][3],self.corr_shells[icrsh][3]], numpy.complex_) + + ikarray=numpy.array(range(self.n_k)) + + for ik in mpi.slice_array(ikarray): + + Gupf = self.lattice_gf_matsubara(ik=ik, beta=beta, mu=self.chemical_potential) + Gupf *= self.bz_weights[ik] + dm = Gupf.density() + MMat = [dm[bl] for bl in self.block_names[self.SO]] + + for icrsh in range(self.n_corr_shells): + for ibn,bn in enumerate(self.block_names[self.corr_shells[icrsh][4]]): + isp = self.names_to_ind[self.corr_shells[icrsh][4]][bn] + dim = self.corr_shells[icrsh][3] + n_orb = self.n_orbitals[ik,isp] + #print ik, bn, isp + dens_mat[icrsh][bn] += numpy.dot( numpy.dot(self.proj_mat[ik,isp,icrsh,0:dim,0:n_orb],MMat[ibn]), + self.proj_mat[ik,isp,icrsh,0:dim,0:n_orb].transpose().conjugate() ) + + # get data from nodes: + for icrsh in range(self.n_corr_shells): + for sig in dens_mat[icrsh]: + dens_mat[icrsh][sig] = mpi.all_reduce(mpi.world,dens_mat[icrsh][sig],lambda x,y : x+y) + mpi.barrier() + + + if (self.symm_op!=0): dens_mat = self.Symm_corr.symmetrize(dens_mat) + + # Rotate to local coordinate system: + if (self.use_rotations): + for icrsh in xrange(self.n_corr_shells): + for bn in dens_mat[icrsh]: + if (self.rot_mat_time_inv[icrsh]==1): dens_mat[icrsh][bn] = dens_mat[icrsh][bn].conjugate() + dens_mat[icrsh][bn] = numpy.dot( numpy.dot(self.rot_mat[icrsh].conjugate().transpose(),dens_mat[icrsh][bn]) , + self.rot_mat[icrsh] ) + + return dens_mat + + + + def analyse_BS(self, threshold = 0.00001, include_shells = None, dm = None): + """ Determines the Greens function block structure from the simple point integration""" + + if (dm==None): dm = self.simple_point_dens_mat() + + dens_mat = [dm[self.invshellmap[ish]] for ish in xrange(self.n_inequiv_corr_shells) ] + + if include_shells is None: include_shells=range(self.n_inequiv_corr_shells) + for ish in include_shells: + + #self.gf_struct_solver.append([]) + self.gf_struct_solver[ish] = [] + gf_struct_temp = [] + + a_list = [a for a,al in self.gf_struct_corr[self.invshellmap[ish]] ] + for a in a_list: + + dm = dens_mat[ish][a] + dmbool = (abs(dm) > threshold) # gives an index list of entries larger that threshold + + offdiag = [] + for i in xrange(len(dmbool)): + for j in xrange(i,len(dmbool)): + if ((dmbool[i,j])&(i!=j)): offdiag.append([i,j]) + + NBlocs = len(dmbool) + blocs = [ [i] for i in range(NBlocs) ] + + for i in range(len(offdiag)): + if (offdiag[i][0]!=offdiag[i][1]): + for j in range(len(blocs[offdiag[i][1]])): blocs[offdiag[i][0]].append(blocs[offdiag[i][1]][j]) + del blocs[offdiag[i][1]] + for j in range(i+1,len(offdiag)): + if (offdiag[j][0]==offdiag[i][1]): offdiag[j][0]=offdiag[i][0] + if (offdiag[j][1]==offdiag[i][1]): offdiag[j][1]=offdiag[i][0] + if (offdiag[j][0]>offdiag[i][1]): offdiag[j][0] -= 1 + if (offdiag[j][1]>offdiag[i][1]): offdiag[j][1] -= 1 + offdiag[j].sort() + NBlocs-=1 + + for i in range(NBlocs): + blocs[i].sort() + self.gf_struct_solver[ish].append( ('%s%s'%(a,i),range(len(blocs[i]))) ) + gf_struct_temp.append( ('%s%s'%(a,i),blocs[i]) ) + + + # map is the mapping of the blocs from the SK blocs to the CTQMC blocs: + self.map[ish][a] = range(len(dmbool)) + for ibl in range(NBlocs): + for j in range(len(blocs[ibl])): + self.map[ish][a][blocs[ibl][j]] = '%s%s'%(a,ibl) + self.map_inv[ish]['%s%s'%(a,ibl)] = a + + + # now calculate degeneracies of orbitals: + dm = {} + for bl in gf_struct_temp: + bln = bl[0] + ind = bl[1] + # get dm for the blocks: + dm[bln] = numpy.zeros([len(ind),len(ind)],numpy.complex_) + for i in range(len(ind)): + for j in range(len(ind)): + dm[bln][i,j] = dens_mat[ish][self.map_inv[ish][bln]][ind[i],ind[j]] + + for bl in gf_struct_temp: + for bl2 in gf_struct_temp: + if (dm[bl[0]].shape==dm[bl2[0]].shape) : + if ( ( (abs(dm[bl[0]]-dm[bl2[0]])=0)): + self.deg_shells[ish][ind2].append(bl[0]) + elif ((ind1>=0)and(ind2<0)): + self.deg_shells[ish][ind1].append(bl2[0]) + elif ((ind1<0)and(ind2<0)): + self.deg_shells[ish].append([bl[0],bl2[0]]) + + if (mpi.is_master_node()): + ar=HDFArchive(self.hdf_file,'a') + ar[self.lda_data]['gf_struct_solver'] = self.gf_struct_solver + ar[self.lda_data]['map'] = self.map + ar[self.lda_data]['map_inv'] = self.map_inv + try: + ar[self.lda_data]['deg_shells'] = self.deg_shells + except: + mpi.report("deg_shells not stored, degeneracies not found") + del ar + + return dens_mat + + + def symm_deg_gf(self,gf_to_symm,orb): + """Symmetrises a GF for the given degenerate shells self.deg_shells""" + + for degsh in self.deg_shells[orb]: + #loop over degenerate shells: + ss = gf_to_symm[degsh[0]].copy() + ss.zero() + Ndeg = len(degsh) + for bl in degsh: ss += gf_to_symm[bl] / (1.0*Ndeg) + for bl in degsh: gf_to_symm[bl] <<= ss + + + def eff_atomic_levels(self): + """Calculates the effective atomic levels needed as input for the Hubbard I Solver.""" + + # define matrices for inequivalent shells: + eff_atlevels = [ {} for ish in range(self.n_inequiv_corr_shells) ] + for ish in range(self.n_inequiv_corr_shells): + for bn in self.block_names[self.corr_shells[self.invshellmap[ish]][4]]: + eff_atlevels[ish][bn] = numpy.identity(self.corr_shells[self.invshellmap[ish]][3], numpy.complex_) + + # Chemical Potential: + for ish in xrange(self.n_inequiv_corr_shells): + for ii in eff_atlevels[ish]: eff_atlevels[ish][ii] *= -self.chemical_potential + + # double counting term: + #if hasattr(self,"dc_imp"): + for ish in xrange(self.n_inequiv_corr_shells): + for ii in eff_atlevels[ish]: + eff_atlevels[ish][ii] -= self.dc_imp[self.invshellmap[ish]][ii] + + # sum over k: + if not hasattr(self,"Hsumk"): + # calculate the sum over k. Does not depend on mu, so do it only once: + self.Hsumk = [ {} for ish in range(self.n_corr_shells) ] + for icrsh in range(self.n_corr_shells): + for bn in self.block_names[self.corr_shells[icrsh][4]]: + dim = self.corr_shells[icrsh][3] #*(1+self.corr_shells[icrsh][4]) + self.Hsumk[icrsh][bn] = numpy.zeros([dim,dim],numpy.complex_) + + for icrsh in range(self.n_corr_shells): + dim = self.corr_shells[icrsh][3] + for ibn, bn in enumerate(self.block_names[self.corr_shells[icrsh][4]]): + isp = self.names_to_ind[self.corr_shells[icrsh][4]][bn] + for ik in xrange(self.n_k): + n_orb = self.n_orbitals[ik,isp] + MMat = numpy.identity(n_orb, numpy.complex_) + MMat = self.hopping[ik,isp,0:n_orb,0:n_orb] - (1-2*ibn) * self.h_field * MMat + self.Hsumk[icrsh][bn] += self.bz_weights[ik] * numpy.dot( numpy.dot(self.proj_mat[ik,isp,icrsh,0:dim,0:n_orb],MMat), #self.hopping[ik][isp]) , + self.proj_mat[ik,isp,icrsh,0:dim,0:n_orb].conjugate().transpose() ) + + # symmetrisation: + if (self.symm_op!=0): self.Hsumk = self.Symm_corr.symmetrize(self.Hsumk) + + # Rotate to local coordinate system: + if (self.use_rotations): + for icrsh in xrange(self.n_corr_shells): + for bn in self.Hsumk[icrsh]: + + if (self.rot_mat_time_inv[icrsh]==1): self.Hsumk[icrsh][bn] = self.Hsumk[icrsh][bn].conjugate() + #if (self.corr_shells[icrsh][4]==0): self.Hsumk[icrsh][bn] = self.Hsumk[icrsh][bn].conjugate() + + self.Hsumk[icrsh][bn] = numpy.dot( numpy.dot(self.rot_mat[icrsh].conjugate().transpose(),self.Hsumk[icrsh][bn]) , + self.rot_mat[icrsh] ) + + # add to matrix: + for ish in xrange(self.n_inequiv_corr_shells): + for bn in eff_atlevels[ish]: + eff_atlevels[ish][bn] += self.Hsumk[self.invshellmap[ish]][bn] + + + return eff_atlevels + + + + def __init_dc(self): + + # construct the density matrix dm_imp and double counting arrays + #self.dm_imp = [ {} for i in xrange(self.n_corr_shells)] + self.dc_imp = [ {} for i in xrange(self.n_corr_shells)] + for i in xrange(self.n_corr_shells): + l = self.corr_shells[i][3] + for j in xrange(len(self.gf_struct_corr[i])): + self.dc_imp[i]['%s'%self.gf_struct_corr[i][j][0]] = numpy.zeros([l,l],numpy.float_) + self.dc_energ = [0.0 for i in xrange(self.n_corr_shells)] + + + + def set_lichtenstein_dc(self,Sigma_imp): + """Sets a double counting term according to Lichtenstein et al. PRL2001""" + + assert 0,"Lichtenstein DC not supported any more!" + + + + + def set_dc(self,dens_mat,U_interact,J_hund,orb=0,use_dc_formula=0,use_val=None): + """Sets the double counting term for inequiv orbital orb + use_dc_formula=0: LDA+U FLL double counting, use_dc_formula=1: Held's formula. + use_dc_formula=2: AMF + Be sure that you use the correct interaction Hamiltonian!""" + + + #if (not hasattr(self,"dc_imp")): self.__init_dc() + + + dm = [ {} for i in xrange(self.n_corr_shells)] + for i in xrange(self.n_corr_shells): + l = self.corr_shells[i][3] #*(1+self.corr_shells[i][4]) + for j in xrange(len(self.gf_struct_corr[i])): + dm[i]['%s'%self.gf_struct_corr[i][j][0]] = numpy.zeros([l,l],numpy.float_) + + + for icrsh in xrange(self.n_corr_shells): + + iorb = self.shellmap[icrsh] # iorb is the index of the inequivalent shell corresponding to icrsh + + if (iorb==orb): + # do this orbital + Ncr = {} + l = self.corr_shells[icrsh][3] #*(1+self.corr_shells[icrsh][4]) + + for j in xrange(len(self.gf_struct_corr[icrsh])): + self.dc_imp[icrsh]['%s'%self.gf_struct_corr[icrsh][j][0]] = numpy.identity(l,numpy.float_) + blname = self.gf_struct_corr[icrsh][j][0] + Ncr[blname] = 0.0 + for bl in self.map[iorb][blname]: + Ncr[blname] += dens_mat[bl].real.trace() + + + M = self.corr_shells[icrsh][3] + + Ncrtot = 0.0 + a_list = [a for a,al in self.gf_struct_corr[icrsh]] + for bl in a_list: + Ncrtot += Ncr[bl] + + # average the densities if there is no SP: + if (self.SP==0): + for bl in a_list: + Ncr[bl] = Ncrtot / len(a_list) + # correction for SO: we have only one block in this case, but in DC we need N/2 + elif (self.SP==1 and self.SO==1): + for bl in a_list: + Ncr[bl] = Ncrtot / 2.0 + + if (use_val is None): + + if (use_dc_formula==0): + self.dc_energ[icrsh] = U_interact / 2.0 * Ncrtot * (Ncrtot-1.0) + for bl in a_list: + Uav = U_interact*(Ncrtot-0.5) - J_hund*(Ncr[bl] - 0.5) + self.dc_imp[icrsh][bl] *= Uav + self.dc_energ[icrsh] -= J_hund / 2.0 * (Ncr[bl]) * (Ncr[bl]-1.0) + mpi.report("DC for shell %(icrsh)i and block %(bl)s = %(Uav)f"%locals()) + elif (use_dc_formula==1): + self.dc_energ[icrsh] = (U_interact + J_hund * (2.0-(M-1)) / (2*M-1) ) / 2.0 * Ncrtot * (Ncrtot-1.0) + for bl in a_list: + # Held's formula, with U_interact the interorbital onsite interaction + Uav = (U_interact + J_hund * (2.0-(M-1)) / (2*M-1) ) * (Ncrtot-0.5) + self.dc_imp[icrsh][bl] *= Uav + mpi.report("DC for shell %(icrsh)i and block %(bl)s = %(Uav)f"%locals()) + elif (use_dc_formula==2): + self.dc_energ[icrsh] = 0.5 * U_interact * Ncrtot * Ncrtot + for bl in a_list: + # AMF + Uav = U_interact*(Ncrtot - Ncr[bl]/M) - J_hund * (Ncr[bl] - Ncr[bl]/M) + self.dc_imp[icrsh][bl] *= Uav + self.dc_energ[icrsh] -= (U_interact + (M-1)*J_hund)/M * 0.5 * Ncr[bl] * Ncr[bl] + mpi.report("DC for shell %(icrsh)i and block %(bl)s = %(Uav)f"%locals()) + + # output: + mpi.report("DC energy for shell %s = %s"%(icrsh,self.dc_energ[icrsh])) + + else: + + a_list = [a for a,al in self.gf_struct_corr[icrsh]] + for bl in a_list: + self.dc_imp[icrsh][bl] *= use_val + + self.dc_energ[icrsh] = use_val * Ncrtot + + # output: + mpi.report("DC for shell %(icrsh)i = %(use_val)f"%locals()) + mpi.report("DC energy = %s"%self.dc_energ[icrsh]) + + + + + + def find_dc(self,orb,guess,dens_mat,dens_req=None,precision=0.01): + """searches for DC in order to fulfill charge neutrality. + If dens_req is given, then DC is set such that the LOCAL charge of orbital + orb coincides with dens_req.""" + + mu = self.chemical_potential + + def F(dc): + self.set_dc(dens_mat=dens_mat,U_interact=0,J_hund=0,orb=orb,use_val=dc) + if (dens_req is None): + return self.total_density(mu=mu) + else: + return self.extract_G_loc()[orb].total_density() + + + if (dens_req is None): + Dens_rel = self.density_required - self.charge_below + else: + Dens_rel = dens_req + + dcnew = dichotomy.dichotomy(function = F, + x_init = guess, y_value = Dens_rel, + precision_on_y = precision, delta_x=0.5, + max_loops = 100, x_name="Double-Counting", y_name= "Total Density", + verbosity = 3)[0] + + return dcnew + + + + + + def put_Sigma(self, Sigma_imp): + """Puts the impurity self energies for inequivalent atoms into the class, respects the multiplicity of the atoms.""" + + assert isinstance(Sigma_imp,list), "Sigma_imp has to be a list of Sigmas for the correlated shells, even if it is of length 1!" + assert len(Sigma_imp)==self.n_inequiv_corr_shells, "give exactly one Sigma for each inequivalent corr. shell!" + + + # init self.Sigma_imp: + if type(Sigma_imp[0]) == GfReFreq: + # Real frequency Sigma: + self.Sigma_imp = [ BlockGf( name_block_generator = [ (a,GfReFreq(indices = al, mesh = Sigma_imp[0].mesh)) for a,al in self.gf_struct_corr[i] ], + make_copies = False) for i in xrange(self.n_corr_shells) ] + else: + # Imaginary frequency Sigma: + self.Sigma_imp = [ BlockGf( name_block_generator = [ (a,GfImFreq(indices = al, mesh = Sigma_imp[0].mesh)) for a,al in self.gf_struct_corr[i] ], + make_copies = False) for i in xrange(self.n_corr_shells) ] + + # transform the CTQMC blocks to the full matrix: + for icrsh in xrange(self.n_corr_shells): + s = self.shellmap[icrsh] # s is the index of the inequivalent shell corresponding to icrsh + + # setting up the index map: + map_ind={} + cnt = {} + for blname in self.map[s]: + cnt[blname] = 0 + + for a,al in self.gf_struct_solver[s]: + blname = self.map_inv[s][a] + map_ind[a] = range(len(al)) + for i in al: + map_ind[a][i] = cnt[blname] + cnt[blname]+=1 + + + for ibl in range(len(self.gf_struct_solver[s])): + for i in range(len(self.gf_struct_solver[s][ibl][1])): + for j in range(len(self.gf_struct_solver[s][ibl][1])): + bl = self.gf_struct_solver[s][ibl][0] + ind1 = self.gf_struct_solver[s][ibl][1][i] + ind2 = self.gf_struct_solver[s][ibl][1][j] + ind1_imp = map_ind[bl][ind1] + ind2_imp = map_ind[bl][ind2] + self.Sigma_imp[icrsh][self.map_inv[s][bl]][ind1_imp,ind2_imp] <<= Sigma_imp[s][bl][ind1,ind2] + + # rotation from local to global coordinate system: + if (self.use_rotations): + for icrsh in xrange(self.n_corr_shells): + for sig,gf in self.Sigma_imp[icrsh]: self.Sigma_imp[icrsh][sig] <<= self.rotloc(icrsh,gf,direction='toGlobal') + + + + def add_dc(self): + """Substracts the double counting term from the impurity self energy.""" + + # Be careful: Sigma_imp is already in the global coordinate system!! + sres = [s.copy() for s in self.Sigma_imp] + for icrsh in xrange(self.n_corr_shells): + for bl,gf in sres[icrsh]: + dccont = numpy.dot(self.rot_mat[icrsh],numpy.dot(self.dc_imp[icrsh][bl],self.rot_mat[icrsh].conjugate().transpose())) + sres[icrsh][bl] -= dccont + + return sres + + + + def set_mu(self,mu): + """Sets a new chemical potential""" + self.chemical_potential = mu + #print "Chemical potential in SumK set to ",mu + + + + def sorts_of_atoms(self,lst): + """ + This routine should determine the number of sorts in the double list lst + """ + sortlst = [ lst[i][1] for i in xrange(len(lst)) ] + sortlst.sort() + sorts = 1 + for i in xrange(len(sortlst)-1): + if sortlst[i+1]>sortlst[i]: sorts += 1 + + return sorts + + + + def number_of_atoms(self,lst): + """ + This routine should determine the number of atoms in the double list lst + """ + atomlst = [ lst[i][0] for i in xrange(len(lst)) ] + atomlst.sort() + atoms = 1 + for i in xrange(len(atomlst)-1): + if atomlst[i+1]>atomlst[i]: atoms += 1 + + return atoms + + + + def inequiv_shells(self,lst): + """ + The number of inequivalent shells is calculated from lst, and a mapping is given as + map(i_corr_shells) = i_inequiv_corr_shells + invmap(i_inequiv_corr_shells) = i_corr_shells + in order to put the Self energies to all equivalent shells, and for extracting Gloc + """ + + tmp = [] + self.shellmap = [0 for i in range(len(lst))] + self.invshellmap = [0] + self.n_inequiv_corr_shells = 1 + tmp.append( lst[0][1:3] ) + + if (len(lst)>1): + for i in range(len(lst)-1): + + fnd = False + for j in range(self.n_inequiv_corr_shells): + if (tmp[j]==lst[i+1][1:3]): + fnd = True + self.shellmap[i+1] = j + if (fnd==False): + self.shellmap[i+1] = self.n_inequiv_corr_shells + self.n_inequiv_corr_shells += 1 + tmp.append( lst[i+1][1:3] ) + self.invshellmap.append(i+1) + + + + def total_density(self, mu): + """ + Calculates the total charge for the energy window for a given mu. Since in general n_orbitals depends on k, + the calculation is done in the following order: + G_aa'(k,iw) -> n(k) = Tr G_aa'(k,iw) -> sum_k n_k + + mu: chemical potential + + The calculation is done in the global coordinate system, if distinction is made between local/global! + """ + + dens = 0.0 + ikarray=numpy.array(range(self.n_k)) + + for ik in mpi.slice_array(ikarray): + + S = self.lattice_gf_matsubara(ik=ik,mu=mu) + dens += self.bz_weights[ik] * S.total_density() + + # collect data from mpi: + dens = mpi.all_reduce(mpi.world,dens,lambda x,y : x+y) + mpi.barrier() + + return dens + + + def find_mu(self, precision = 0.01): + """Searches for mu in order to give the desired charge + A desired precision can be specified in precision.""" + + F = lambda mu : self.total_density(mu = mu) + + Dens_rel = self.density_required - self.charge_below + + + self.chemical_potential = dichotomy.dichotomy(function = F, + x_init = self.chemical_potential, y_value = Dens_rel, + precision_on_y = precision, delta_x=0.5, + max_loops = 100, x_name="chemical_potential", y_name= "Total Density", + verbosity = 3)[0] + + return self.chemical_potential + + + + def find_mu_nonint(self, dens_req, orb = None, beta = 40, precision = 0.01): + + def F(mu): + #gnonint = self.nonint_G(beta=beta,mu=mu) + gnonint = self.extract_G_loc(mu=mu,with_Sigma=False) + + if (orb is None): + dens = 0.0 + for ish in range(self.n_inequiv_corr_shells): + dens += gnonint[ish].total_density() + else: + dens = gnonint[orb].total_density() + + return dens + + + self.chemical_potential = dichotomy.dichotomy(function = F, + x_init = self.chemical_potential, y_value = dens_req, + precision_on_y = precision, delta_x=0.5, + max_loops = 100, x_name="chemical_potential", y_name= "Local Density", + verbosity = 3)[0] + + return self.chemical_potential + + + + def extract_G_loc(self, mu=None, with_Sigma = True): + """ + extracts the local downfolded Green function at the chemical potential of the class. + At the end, the local G is rotated from the gloabl coordinate system to the local system. + if with_Sigma = False: Sigma is not included => non-interacting local GF + """ + + if (mu is None): mu = self.chemical_potential + + Gloc = [ self.Sigma_imp[icrsh].copy() for icrsh in xrange(self.n_corr_shells) ] # this list will be returned + for icrsh in xrange(self.n_corr_shells): Gloc[icrsh].zero() # initialize to zero + beta = Gloc[0].mesh.beta + + ikarray=numpy.array(range(self.n_k)) + + for ik in mpi.slice_array(ikarray): + + S = self.lattice_gf_matsubara(ik=ik,mu=mu,with_Sigma = with_Sigma, beta = beta) + S *= self.bz_weights[ik] + + + for icrsh in xrange(self.n_corr_shells): + tmp = Gloc[icrsh].copy() # init temporary storage + for sig,gf in tmp: tmp[sig] <<= self.downfold(ik,icrsh,sig,S[sig],gf) + Gloc[icrsh] += tmp + + #collect data from mpi: + for icrsh in xrange(self.n_corr_shells): + Gloc[icrsh] <<= mpi.all_reduce(mpi.world,Gloc[icrsh],lambda x,y : x+y) + mpi.barrier() + + + # Gloc[:] is now the sum over k projected to the local orbitals. + # here comes the symmetrisation, if needed: + if (self.symm_op!=0): Gloc = self.Symm_corr.symmetrize(Gloc) + + # Gloc is rotated to the local coordinate system: + if (self.use_rotations): + for icrsh in xrange(self.n_corr_shells): + for sig,gf in Gloc[icrsh]: Gloc[icrsh][sig] <<= self.rotloc(icrsh,gf,direction='toLocal') + + # transform to CTQMC blocks: + Glocret = [ BlockGf( name_block_generator = [ (a,GfImFreq(indices = al, mesh = Gloc[0].mesh)) for a,al in self.gf_struct_solver[i] ], + make_copies = False) for i in xrange(self.n_inequiv_corr_shells) ] + for ish in xrange(self.n_inequiv_corr_shells): + + # setting up the index map: + map_ind={} + cnt = {} + for blname in self.map[ish]: + cnt[blname] = 0 + + for a,al in self.gf_struct_solver[ish]: + blname = self.map_inv[ish][a] + map_ind[a] = range(len(al)) + for i in al: + map_ind[a][i] = cnt[blname] + cnt[blname]+=1 + + + for ibl in range(len(self.gf_struct_solver[ish])): + for i in range(len(self.gf_struct_solver[ish][ibl][1])): + for j in range(len(self.gf_struct_solver[ish][ibl][1])): + bl = self.gf_struct_solver[ish][ibl][0] + ind1 = self.gf_struct_solver[ish][ibl][1][i] + ind2 = self.gf_struct_solver[ish][ibl][1][j] + ind1_imp = map_ind[bl][ind1] + ind2_imp = map_ind[bl][ind2] + Glocret[ish][bl][ind1,ind2] <<= Gloc[self.invshellmap[ish]][self.map_inv[ish][bl]][ind1_imp,ind2_imp] + + + # return only the inequivalent shells: + return Glocret + + + def calc_density_correction(self,filename = 'dens_mat.dat'): + """ Calculates the density correction in order to feed it back to the DFT calculations.""" + + + assert (type(filename)==StringType), "filename has to be a string!" + + ntoi = self.names_to_ind[self.SO] + bln = self.block_names[self.SO] + + # Set up deltaN: + deltaN = {} + for ib in bln: + deltaN[ib] = [ numpy.zeros( [self.n_orbitals[ik,ntoi[ib]],self.n_orbitals[ik,ntoi[ib]]], numpy.complex_) for ik in range(self.n_k)] + + ikarray=numpy.array(range(self.n_k)) + + dens = {} + for ib in bln: + dens[ib] = 0.0 + + for ik in mpi.slice_array(ikarray): + + S = self.lattice_gf_matsubara(ik=ik,mu=self.chemical_potential) + for sig,g in S: + deltaN[sig][ik] = S[sig].density() + dens[sig] += self.bz_weights[ik] * S[sig].total_density() + + + + #put mpi Barrier: + for sig in deltaN: + for ik in range(self.n_k): + deltaN[sig][ik] = mpi.all_reduce(mpi.world,deltaN[sig][ik],lambda x,y : x+y) + dens[sig] = mpi.all_reduce(mpi.world,dens[sig],lambda x,y : x+y) + mpi.barrier() + + + # now save to file: + if (mpi.is_master_node()): + if (self.SP==0): + f=open(filename,'w') + else: + f=open(filename+'up','w') + f1=open(filename+'dn','w') + # write chemical potential (in Rydberg): + f.write("%.14f\n"%(self.chemical_potential/self.energy_unit)) + if (self.SP!=0): f1.write("%.14f\n"%(self.chemical_potential/self.energy_unit)) + # write beta in ryderg-1 + f.write("%.14f\n"%(S.mesh.beta*self.energy_unit)) + if (self.SP!=0): f1.write("%.14f\n"%(S.mesh.beta*self.energy_unit)) + if (self.SP==0): + for ik in range(self.n_k): + f.write("%s\n"%self.n_orbitals[ik,0]) + for inu in range(self.n_orbitals[ik,0]): + for imu in range(self.n_orbitals[ik,0]): + valre = (deltaN['up'][ik][inu,imu].real + deltaN['down'][ik][inu,imu].real) / 2.0 + valim = (deltaN['up'][ik][inu,imu].imag + deltaN['down'][ik][inu,imu].imag) / 2.0 + f.write("%.14f %.14f "%(valre,valim)) + f.write("\n") + f.write("\n") + f.close() + elif ((self.SP==1)and(self.SO==0)): + for ik in range(self.n_k): + f.write("%s\n"%self.n_orbitals[ik,0]) + for inu in range(self.n_orbitals[ik,0]): + for imu in range(self.n_orbitals[ik,0]): + f.write("%.14f %.14f "%(deltaN['up'][ik][inu,imu].real,deltaN['up'][ik][inu,imu].imag)) + f.write("\n") + f.write("\n") + f.close() + for ik in range(self.n_k): + f1.write("%s\n"%self.n_orbitals[ik,1]) + for inu in range(self.n_orbitals[ik,1]): + for imu in range(self.n_orbitals[ik,1]): + f1.write("%.14f %.14f "%(deltaN['down'][ik][inu,imu].real,deltaN['down'][ik][inu,imu].imag)) + f1.write("\n") + f1.write("\n") + f1.close() + else: + for ik in range(self.n_k): + f.write("%s\n"%self.n_orbitals[ik,0]) + for inu in range(self.n_orbitals[ik,0]): + for imu in range(self.n_orbitals[ik,0]): + f.write("%.14f %.14f "%(deltaN['ud'][ik][inu,imu].real,deltaN['ud'][ik][inu,imu].imag)) + f.write("\n") + f.write("\n") + f.close() + for ik in range(self.n_k): + f1.write("%s\n"%self.n_orbitals[ik,0]) + for inu in range(self.n_orbitals[ik,0]): + for imu in range(self.n_orbitals[ik,0]): + f1.write("%.14f %.14f "%(deltaN['ud'][ik][inu,imu].real,deltaN['ud'][ik][inu,imu].imag)) + f1.write("\n") + f1.write("\n") + f1.close() + + + return deltaN, dens diff --git a/python/sumk_lda_tools.py b/python/sumk_lda_tools.py new file mode 100644 index 00000000..ccf5fb38 --- /dev/null +++ b/python/sumk_lda_tools.py @@ -0,0 +1,625 @@ + +################################################################################ +# +# TRIQS: a Toolbox for Research in Interacting Quantum Systems +# +# Copyright (C) 2011 by M. Aichhorn, L. Pourovskii, V. Vildosola +# +# TRIQS is free software: you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation, either version 3 of the License, or (at your option) any later +# version. +# +# TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# TRIQS. If not, see . +# +################################################################################ + +from types import * +import numpy +import pytriqs.utility.dichotomy as dichotomy +from pytriqs.gf.local import * +#from pytriqs.applications.impurity_solvers.operators import * +from pytriqs.operators import * +import pytriqs.utility.mpi as mpi +from datetime import datetime + +#from pytriqs.applications.dft.symmetry import * +#from pytriqs.applications.dft.sumk_lda import SumkLDA +from symmetry import * +from sumk_lda import SumkLDA + +import string + + +def read_fortran_file (filename): + """ Returns a generator that yields all numbers in the Fortran file as float, one by one""" + import os.path + if not(os.path.exists(filename)) : raise IOError, "File %s does not exists"%filename + for line in open(filename,'r') : + for x in line.replace('D','E').split() : + yield string.atof(x) + + +class SumkLDATools(SumkLDA): + """Extends the SumkLDA class with some tools for analysing the data.""" + + + def __init__(self, hdf_file, mu = 0.0, h_field = 0.0, use_lda_blocks = False, lda_data = 'SumK_LDA', symm_corr_data = 'SymmCorr', + par_proj_data = 'SumK_LDA_ParProj', symm_par_data = 'SymmPar', bands_data = 'SumK_LDA_Bands'): + + self.Gupf_refreq = None + SumkLDA.__init__(self,hdf_file=hdf_file,mu=mu,h_field=h_field,use_lda_blocks=use_lda_blocks,lda_data=lda_data, + symm_corr_data=symm_corr_data,par_proj_data=par_proj_data,symm_par_data=symm_par_data, + bands_data=bands_data) + + + def downfold_pc(self,ik,ir,ish,sig,gf_to_downfold,gf_inp): + """Downfolding a block of the Greens function""" + + gf_downfolded = gf_inp.copy() + isp = self.names_to_ind[self.SO][sig] # get spin index for proj. matrices + dim = self.shells[ish][3] + n_orb = self.n_orbitals[ik,isp] + L=self.proj_mat_pc[ik,isp,ish,ir,0:dim,0:n_orb] + R=self.proj_mat_pc[ik,isp,ish,ir,0:dim,0:n_orb].conjugate().transpose() + gf_downfolded.from_L_G_R(L,gf_to_downfold,R) + + return gf_downfolded + + + def rotloc_all(self,ish,gf_to_rotate,direction): + """Local <-> Global rotation of a GF block. + direction: 'toLocal' / 'toGlobal' """ + + assert ((direction=='toLocal')or(direction=='toGlobal')),"Give direction 'toLocal' or 'toGlobal' in rotloc!" + + + gf_rotated = gf_to_rotate.copy() + if (direction=='toGlobal'): + if ((self.rot_mat_all_time_inv[ish]==1) and (self.SO)): + gf_rotated <<= gf_rotated.transpose() + gf_rotated.from_L_G_R(self.rot_mat_all[ish].conjugate(),gf_rotated,self.rot_mat_all[ish].transpose()) + else: + gf_rotated.from_L_G_R(self.rot_mat_all[ish],gf_rotated,self.rot_mat_all[ish].conjugate().transpose()) + + elif (direction=='toLocal'): + if ((self.rot_mat_all_time_inv[ish]==1)and(self.SO)): + gf_rotated <<= gf_rotated.transpose() + gf_rotated.from_L_G_R(self.rot_mat_all[ish].transpose(),gf_rotated,self.rot_mat_all[ish].conjugate()) + else: + gf_rotated.from_L_G_R(self.rot_mat_all[ish].conjugate().transpose(),gf_rotated,self.rot_mat_all[ish]) + + + return gf_rotated + + + def lattice_gf_realfreq(self, ik, mu, broadening, mesh=None, beta=40, with_Sigma=True): + """Calculates the lattice Green function on the real frequency axis. If self energy is + present and with_Sigma=True, the mesh is taken from Sigma. Otherwise, the mesh has to be given.""" + + ntoi = self.names_to_ind[self.SO] + bln = self.blocnames[self.SO] + + if (not hasattr(self,"Sigma_imp")): with_Sigma=False + if (with_Sigma): + assert type(self.Sigma_imp[0]) == GfReFreq, "Real frequency Sigma needed for lattice_gf_realfreq!" + beta = self.Sigma_imp[0].mesh.beta + stmp = self.add_dc() + else: + assert (not (mesh is None)),"Without Sigma, give the mesh for lattice_gf_realfreq!" + + if (self.Gupf_refreq is None): + # first setting up of Gupf_refreq + BS = [ range(self.n_orbitals[ik,ntoi[ib]]) for ib in bln ] + gf_struct = [ (bln[ib], BS[ib]) for ib in range(self.n_spin_blocks_gf[self.SO]) ] + a_list = [a for a,al in gf_struct] + if (with_Sigma): + glist = lambda : [ GfReFreq(indices = al, mesh =self.Sigma_imp[0].mesh) for a,al in gf_struct] + else: + glist = lambda : [ GfReFreq(indices = al, beta = beta, mesh_array = mesh) for a,al in gf_struct] + self.Gupf_refreq = BlockGf(name_list = a_list, block_list = glist(),make_copies=False) + self.Gupf_refreq.zero() + + GFsize = [ gf.N1 for sig,gf in self.Gupf_refreq] + unchangedsize = all( [ self.n_orbitals[ik,ntoi[bln[ib]]]==GFsize[ib] + for ib in range(self.n_spin_blocks_gf[self.SO]) ] ) + + if (not unchangedsize): + BS = [ range(self.n_orbitals[ik,ntoi[ib]]) for ib in bln ] + gf_struct = [ (bln[ib], BS[ib]) for ib in range(self.n_spin_blocks_gf[self.SO]) ] + a_list = [a for a,al in gf_struct] + if (with_Sigma): + glist = lambda : [ GfReFreq(indices = al, mesh =self.Sigma_imp[0].mesh) for a,al in gf_struct] + else: + glist = lambda : [ GfReFreq(indices = al, beta = beta, mesh_array = mesh) for a,al in gf_struct] + self.Gupf_refreq = BlockGf(name_list = a_list, block_list = glist(),make_copies=False) + self.Gupf_refreq.zero() + + idmat = [numpy.identity(self.n_orbitals[ik,ntoi[bl]],numpy.complex_) for bl in bln] + + self.Gupf_refreq <<= Omega + 1j*broadening + M = copy.deepcopy(idmat) + for ibl in range(self.n_spin_blocks_gf[self.SO]): + ind = ntoi[bln[ibl]] + n_orb = self.n_orbitals[ik,ind] + M[ibl] = self.hopping[ik,ind,0:n_orb,0:n_orb] - (idmat[ibl]*mu) - (idmat[ibl] * self.h_field * (1-2*ibl)) + self.Gupf_refreq -= M + + if (with_Sigma): + tmp = self.Gupf_refreq.copy() # init temporary storage + for icrsh in xrange(self.n_corr_shells): + for sig,gf in tmp: tmp[sig] <<= self.upfold(ik,icrsh,sig,stmp[icrsh][sig],gf) + self.Gupf_refreq -= tmp # adding to the upfolded GF + + self.Gupf_refreq.invert() + + return self.Gupf_refreq + + + + def check_input_dos(self, om_min, om_max, n_om, beta=10, broadening=0.01): + + + delta_om = (om_max-om_min)/(n_om-1) + mesh = numpy.zeros([n_om],numpy.float_) + + DOS = {} + for bn in self.block_names[self.SO]: + DOS[bn] = numpy.zeros([n_om],numpy.float_) + + DOSproj = [ {} for icrsh in range(self.n_inequiv_corr_shells) ] + DOSproj_orb = [ {} for icrsh in range(self.n_inequiv_corr_shells) ] + for icrsh in range(self.n_inequiv_corr_shells): + for bn in self.block_names[self.corr_shells[self.invshellmap[icrsh]][4]]: + dl = self.corr_shells[self.invshellmap[icrsh]][3] + DOSproj[icrsh][bn] = numpy.zeros([n_om],numpy.float_) + DOSproj_orb[icrsh][bn] = numpy.zeros([dl,dl,n_om],numpy.float_) + + + for i in range(n_om): mesh[i] = om_min + delta_om * i + + # init: + Gloc = [] + for icrsh in range(self.n_corr_shells): + b_list = [a for a,al in self.gf_struct_corr[icrsh]] + glist = lambda : [ GfReFreq(indices = al, beta = beta, mesh_array = mesh) for a,al in self.gf_struct_corr[icrsh]] + Gloc.append(BlockGf(name_list = b_list, block_list = glist(),make_copies=False)) + for icrsh in xrange(self.n_corr_shells): Gloc[icrsh].zero() # initialize to zero + + for ik in xrange(self.n_k): + + Gupf=self.lattice_gf_realfreq(ik=ik,mu=self.chemical_potential,broadening=broadening,beta=beta,mesh=mesh,with_Sigma=False) + Gupf *= self.bz_weights[ik] + + # non-projected DOS + for iom in range(n_om): + for sig,gf in Gupf: + asd = gf.data[iom,:,:].imag.trace()/(-3.1415926535) + DOS[sig][iom] += asd + + for icrsh in xrange(self.n_corr_shells): + tmp = Gloc[icrsh].copy() + for sig,gf in tmp: tmp[sig] <<= self.downfold(ik,icrsh,sig,Gupf[sig],gf) # downfolding G + Gloc[icrsh] += tmp + + + + if (self.symm_op!=0): Gloc = self.Symm_corr.symmetrize(Gloc) + + if (self.use_rotations): + for icrsh in xrange(self.n_corr_shells): + for sig,gf in Gloc[icrsh]: Gloc[icrsh][sig] <<= self.rotloc(icrsh,gf,direction='toLocal') + + # Gloc can now also be used to look at orbitally resolved quantities + for ish in range(self.n_inequiv_corr_shells): + for sig,gf in Gloc[self.invshellmap[ish]]: # loop over spins + for iom in range(n_om): DOSproj[ish][sig][iom] += gf.data[iom,:,:].imag.trace()/(-3.1415926535) + + DOSproj_orb[ish][sig][:,:,:] += gf.data[:,:,:].imag/(-3.1415926535) + + # output: + if (mpi.is_master_node()): + for bn in self.block_names[self.SO]: + f=open('DOS%s.dat'%bn, 'w') + for i in range(n_om): f.write("%s %s\n"%(mesh[i],DOS[bn][i])) + f.close() + + for ish in range(self.n_inequiv_corr_shells): + f=open('DOS%s_proj%s.dat'%(bn,ish),'w') + for i in range(n_om): f.write("%s %s\n"%(mesh[i],DOSproj[ish][bn][i])) + f.close() + + for i in range(self.corr_shells[self.invshellmap[ish]][3]): + for j in range(i,self.corr_shells[self.invshellmap[ish]][3]): + Fname = 'DOS'+bn+'_proj'+str(ish)+'_'+str(i)+'_'+str(j)+'.dat' + f=open(Fname,'w') + for iom in range(n_om): f.write("%s %s\n"%(mesh[iom],DOSproj_orb[ish][bn][i,j,iom])) + f.close() + + + + + def read_par_proj_input_from_hdf(self): + """ + Reads the data for the partial projectors from the HDF file + """ + + thingstoread = ['dens_mat_below','n_parproj','proj_mat_pc','rot_mat_all','rot_mat_all_time_inv'] + retval = self.read_input_from_hdf(subgrp=self.par_proj_data,things_to_read = thingstoread) + return retval + + + + def dos_partial(self,broadening=0.01): + """calculates the orbitally-resolved DOS""" + + assert hasattr(self,"Sigma_imp"), "Set Sigma First!!" + + #thingstoread = ['Dens_Mat_below','N_parproj','Proj_Mat_pc','rotmat_all'] + #retval = self.read_input_from_HDF(SubGrp=self.par_proj_data, thingstoread=thingstoread) + retval = self.read_par_proj_input_from_hdf() + if not retval: return retval + if self.symm_op: self.Symm_par = Symmetry(self.hdf_file,subgroup=self.symm_par_data) + + mu = self.chemical_potential + + gf_struct_proj = [ [ (al, range(self.shells[i][3])) for al in self.block_names[self.SO] ] for i in xrange(self.n_shells) ] + Gproj = [BlockGf(name_block_generator = [ (a,GfReFreq(indices = al, mesh = self.Sigma_imp[0].mesh)) for a,al in gf_struct_proj[ish] ], make_copies = False ) + for ish in xrange(self.n_shells)] + for ish in range(self.n_shells): Gproj[ish].zero() + + Msh = [x for x in self.Sigma_imp[0].mesh] + n_om = len(Msh) + + DOS = {} + for bn in self.block_names[self.SO]: + DOS[bn] = numpy.zeros([n_om],numpy.float_) + + DOSproj = [ {} for ish in range(self.n_shells) ] + DOSproj_orb = [ {} for ish in range(self.n_shells) ] + for ish in range(self.n_shells): + for bn in self.block_names[self.SO]: + dl = self.shells[ish][3] + DOSproj[ish][bn] = numpy.zeros([n_om],numpy.float_) + DOSproj_orb[ish][bn] = numpy.zeros([dl,dl,n_om],numpy.float_) + + ikarray=numpy.array(range(self.n_k)) + + for ik in mpi.slice_array(ikarray): + + S = self.lattice_gf_realfreq(ik=ik,mu=mu,broadening=broadening) + S *= self.bz_weights[ik] + + # non-projected DOS + for iom in range(n_om): + for sig,gf in S: DOS[sig][iom] += gf.data[iom,:,:].imag.trace()/(-3.1415926535) + + #projected DOS: + for ish in xrange(self.n_shells): + tmp = Gproj[ish].copy() + for ir in xrange(self.n_parproj[ish]): + for sig,gf in tmp: tmp[sig] <<= self.downfold_pc(ik,ir,ish,sig,S[sig],gf) + Gproj[ish] += tmp + + # collect data from mpi: + for sig in DOS: + DOS[sig] = mpi.all_reduce(mpi.world,DOS[sig],lambda x,y : x+y) + for ish in xrange(self.n_shells): + Gproj[ish] <<= mpi.all_reduce(mpi.world,Gproj[ish],lambda x,y : x+y) + mpi.barrier() + + if (self.symm_op!=0): Gproj = self.Symm_par.symmetrize(Gproj) + + # rotation to local coord. system: + if (self.use_rotations): + for ish in xrange(self.n_shells): + for sig,gf in Gproj[ish]: Gproj[ish][sig] <<= self.rotloc_all(ish,gf,direction='toLocal') + + for ish in range(self.n_shells): + for sig,gf in Gproj[ish]: + for iom in range(n_om): DOSproj[ish][sig][iom] += gf.data[iom,:,:].imag.trace()/(-3.1415926535) + DOSproj_orb[ish][sig][:,:,:] += gf.data[:,:,:].imag / (-3.1415926535) + + + if (mpi.is_master_node()): + # output to files + for bn in self.block_names[self.SO]: + f=open('./DOScorr%s.dat'%bn, 'w') + for i in range(n_om): f.write("%s %s\n"%(Msh[i],DOS[bn][i])) + f.close() + + # partial + for ish in range(self.n_shells): + f=open('DOScorr%s_proj%s.dat'%(bn,ish),'w') + for i in range(n_om): f.write("%s %s\n"%(Msh[i],DOSproj[ish][bn][i])) + f.close() + + for i in range(self.shells[ish][3]): + for j in range(i,self.shells[ish][3]): + Fname = './DOScorr'+bn+'_proj'+str(ish)+'_'+str(i)+'_'+str(j)+'.dat' + f=open(Fname,'w') + for iom in range(n_om): f.write("%s %s\n"%(Msh[iom],DOSproj_orb[ish][bn][i,j,iom])) + f.close() + + + + + def spaghettis(self,broadening,shift=0.0,plot_range=None, ishell=None, invert_Akw=False, fermi_surface=False): + """ Calculates the correlated band structure with a real-frequency self energy. + ATTENTION: Many things from the original input file are are overwritten!!!""" + + assert hasattr(self,"Sigma_imp"), "Set Sigma First!!" + thingstoread = ['n_k','n_orbitals','proj_mat','hopping','n_parproj','proj_mat_pc'] + retval = self.read_input_from_hdf(subgrp=self.bands_data,things_to_read=thingstoread) + if not retval: return retval + + if fermi_surface: ishell=None + + # print hamiltonian for checks: + if ((self.SP==1)and(self.SO==0)): + f1=open('hamup.dat','w') + f2=open('hamdn.dat','w') + + for ik in xrange(self.n_k): + for i in xrange(self.n_orbitals[ik,0]): + f1.write('%s %s\n'%(ik,self.hopping[ik,0,i,i].real)) + for i in xrange(self.n_orbitals[ik,1]): + f2.write('%s %s\n'%(ik,self.hopping[ik,1,i,i].real)) + f1.write('\n') + f2.write('\n') + f1.close() + f2.close() + else: + f=open('ham.dat','w') + for ik in xrange(self.n_k): + for i in xrange(self.n_orbitals[ik,0]): + f.write('%s %s\n'%(ik,self.hopping[ik,0,i,i].real)) + f.write('\n') + f.close() + + + #========================================= + # calculate A(k,w): + + mu = self.chemical_potential + bln = self.block_names[self.SO] + + # init DOS: + M = [x for x in self.Sigma_imp[0].mesh] + n_om = len(M) + + if plot_range is None: + om_minplot = M[0]-0.001 + om_maxplot = M[n_om-1] + 0.001 + else: + om_minplot = plot_range[0] + om_maxplot = plot_range[1] + + if (ishell is None): + Akw = {} + for ibn in bln: Akw[ibn] = numpy.zeros([self.n_k, n_om ],numpy.float_) + else: + Akw = {} + for ibn in bln: Akw[ibn] = numpy.zeros([self.shells[ishell][3],self.n_k, n_om ],numpy.float_) + + if fermi_surface: + om_minplot = -2.0*broadening + om_maxplot = 2.0*broadening + Akw = {} + for ibn in bln: Akw[ibn] = numpy.zeros([self.n_k,1],numpy.float_) + + if not (ishell is None): + GFStruct_proj = [ (al, range(self.shells[ishell][3])) for al in bln ] + Gproj = BlockGf(name_block_generator = [ (a,GfReFreq(indices = al, mesh = self.Sigma_imp[0].mesh)) for a,al in GFStruct_proj ], make_copies = False) + Gproj.zero() + + for ik in xrange(self.n_k): + + S = self.lattice_gf_realfreq(ik=ik,mu=mu,broadening=broadening) + if (ishell is None): + # non-projected A(k,w) + for iom in range(n_om): + if (M[iom]>om_minplot) and (M[iom]om_minplot) and (M[iom]om_minplot) and (M[iom]0.0001): + f.write('%s %s\n'%(M[iom],Akw[ibn][ik,iom])) + else: + f.write('%s %s %s\n'%(ik,M[iom],Akw[ibn][ik,iom])) + + f.write('\n') + + f.close() + + else: + for ibn in bln: + for ish in range(self.shells[ishell][3]): + + if (invert_Akw): + maxAkw=Akw[ibn][ish,:,:].max() + minAkw=Akw[ibn][ish,:,:].min() + + f=open('Akw_'+ibn+'_proj'+str(ish)+'.dat','w') + + for ik in range(self.n_k): + for iom in range(n_om): + if (M[iom]>om_minplot) and (M[iom]0.0001): + f.write('%s %s\n'%(M[iom],Akw[ibn][ish,ik,iom])) + else: + f.write('%s %s %s\n'%(ik,M[iom],Akw[ibn][ish,ik,iom])) + + f.write('\n') + + f.close() + + + def constr_Sigma_ME(self, filename, beta, n_om, orb = 0): + """Uses Data from files to construct a GF object on the real axis.""" + + + #first get the mesh out of one of the files: + if (len(self.gf_struct_solver[orb][0][1])==1): + Fname = filename+'_'+self.gf_struct_solver[orb][0][0]+'.dat' + else: + Fname = filename+'_'+self.gf_struct_solver[orb][0][0]+'/'+str(self.gf_struct_solver[orb][0][1][0])+'_'+str(self.gf_struct_solver[orb][0][1][0])+'.dat' + + R = read_fortran_file(Fname) + mesh = numpy.zeros([n_om],numpy.float_) + try: + for i in xrange(n_om): + mesh[i] = R.next() + sk = R.next() + sk = R.next() + + except StopIteration : # a more explicit error if the file is corrupted. + raise "SumkLDA.read_Sigma_ME : reading file failed!" + R.close() + + # now initialize the GF with the mesh + a_list = [a for a,al in self.gf_struct_solver[orb]] + glist = lambda : [ GfReFreq(indices = al, beta = beta, mesh_array = mesh) for a,al in self.gf_struct_solver[orb] ] + SigmaME = BlockGf(name_list = a_list, block_list = glist(),make_copies=False) + SigmaME.load(filename) + + return SigmaME + + + + + def partial_charges(self,beta=40): + """Calculates the orbitally-resolved density matrix for all the orbitals considered in the input. + The theta-projectors are used, hence case.parproj data is necessary""" + + + #thingstoread = ['Dens_Mat_below','N_parproj','Proj_Mat_pc','rotmat_all'] + #retval = self.read_input_from_HDF(SubGrp=self.par_proj_data,thingstoread=thingstoread) + retval = self.read_par_proj_input_from_hdf() + if not retval: return retval + if self.symm_op: self.Symm_par = Symmetry(self.hdf_file,subgroup=self.symm_par_data) + + # Density matrix in the window + bln = self.block_names[self.SO] + ntoi = self.names_to_ind[self.SO] + self.dens_mat_window = [ [numpy.zeros([self.shells[ish][3],self.shells[ish][3]],numpy.complex_) for ish in range(self.n_shells)] + for isp in range(len(bln)) ] # init the density matrix + + mu = self.chemical_potential + GFStruct_proj = [ [ (al, range(self.shells[i][3])) for al in bln ] for i in xrange(self.n_shells) ] + if hasattr(self,"Sigma_imp"): + Gproj = [BlockGf(name_block_generator = [ (a,GfImFreq(indices = al, mesh = self.Sigma_imp[0].mesh)) for a,al in GFStruct_proj[ish] ], make_copies = False) + for ish in xrange(self.n_shells)] + beta = self.Sigma_imp[0].mesh.beta + else: + Gproj = [BlockGf(name_block_generator = [ (a,GfImFreq(indices = al, beta = beta)) for a,al in GFStruct_proj[ish] ], make_copies = False) + for ish in xrange(self.n_shells)] + + for ish in xrange(self.n_shells): Gproj[ish].zero() + + ikarray=numpy.array(range(self.n_k)) + #print mpi.rank, mpi.slice_array(ikarray) + #print "K-Sum starts on node",mpi.rank," at ",datetime.now() + + for ik in mpi.slice_array(ikarray): + #print mpi.rank, ik, datetime.now() + S = self.lattice_gf_matsubara(ik=ik,mu=mu,beta=beta) + S *= self.bz_weights[ik] + + for ish in xrange(self.n_shells): + tmp = Gproj[ish].copy() + for ir in xrange(self.n_parproj[ish]): + for sig,gf in tmp: tmp[sig] <<= self.downfold_pc(ik,ir,ish,sig,S[sig],gf) + Gproj[ish] += tmp + + #print "K-Sum done on node",mpi.rank," at ",datetime.now() + #collect data from mpi: + for ish in xrange(self.n_shells): + Gproj[ish] <<= mpi.all_reduce(mpi.world,Gproj[ish],lambda x,y : x+y) + mpi.barrier() + + #print "Data collected on node",mpi.rank," at ",datetime.now() + + # Symmetrisation: + if (self.symm_op!=0): Gproj = self.Symm_par.symmetrize(Gproj) + #print "Symmetrisation done on node",mpi.rank," at ",datetime.now() + + for ish in xrange(self.n_shells): + + # Rotation to local: + if (self.use_rotations): + for sig,gf in Gproj[ish]: Gproj[ish][sig] <<= self.rotloc_all(ish,gf,direction='toLocal') + + isp = 0 + for sig,gf in Gproj[ish]: #dmg.append(Gproj[ish].density()[sig]) + self.dens_mat_window[isp][ish] = Gproj[ish].density()[sig] + isp+=1 + + # add Density matrices to get the total: + dens_mat = [ [ self.dens_mat_below[ntoi[bln[isp]]][ish]+self.dens_mat_window[isp][ish] for ish in range(self.n_shells)] + for isp in range(len(bln)) ] + + return dens_mat + + + diff --git a/python/symmetry.py b/python/symmetry.py new file mode 100644 index 00000000..81639a24 --- /dev/null +++ b/python/symmetry.py @@ -0,0 +1,176 @@ + +################################################################################ +# +# TRIQS: a Toolbox for Research in Interacting Quantum Systems +# +# Copyright (C) 2011 by M. Aichhorn, L. Pourovskii, V. Vildosola +# +# TRIQS is free software: you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation, either version 3 of the License, or (at your option) any later +# version. +# +# TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# TRIQS. If not, see . +# +################################################################################ + + +import copy,numpy +import string +from types import * +from pytriqs.gf.local import * +from pytriqs.archive import * +import pytriqs.utility.mpi as mpi + + +class Symmetry: + """This class provides the routines for applying symmetry operations for the k sums. + It contains the permutations of the atoms in the unti cell, and the corresponding + rotational matrices for each symmetry operation.""" + + def __init__(self, hdf_file, subgroup = None): + """Initialises the class. + Reads the permutations and rotation matrizes from the file, and constructs the mapping for + the given orbitals. For each orbit a matrix is read!!! + SO: Flag for SO coupled calculations. + SP: Spin polarisation yes/no + """ + + assert type(hdf_file)==StringType,"hdf_file must be a filename"; self.hdf_file = hdf_file + thingstoread = ['n_s','n_atoms','perm','orbits','SO','SP','time_inv','mat','mat_tinv'] + for it in thingstoread: exec "self.%s = 0"%it + + if (mpi.is_master_node()): + #Read the stuff on master: + ar = HDFArchive(hdf_file,'a') + if (subgroup is None): + ar2 = ar + else: + ar2 = ar[subgroup] + + for it in thingstoread: exec "self.%s = ar2['%s']"%(it,it) + del ar2 + del ar + + #broadcasting + for it in thingstoread: exec "self.%s = mpi.bcast(self.%s)"%(it,it) + + # now define the mapping of orbitals: + # self.map[iorb]=jorb gives the permutation of the orbitals as given in the list, when the + # permutation of the atoms is done: + self.n_orbits = len(self.orbits) + + self.map = [ [0 for iorb in range(self.n_orbits)] for in_s in range(self.n_s) ] + for in_s in range(self.n_s): + for iorb in range(self.n_orbits): + + srch = copy.deepcopy(self.orbits[iorb]) + srch[0] = self.perm[in_s][self.orbits[iorb][0]-1] + self.map[in_s][iorb] = self.orbits.index(srch) + + + + def symmetrize(self,obj): + + assert isinstance(obj,list),"obj has to be a list of objects!" + assert len(obj)==self.n_orbits,"obj has to be a list of the same length as defined in the init" + + if (isinstance(obj[0],BlockGf)): + symm_obj = [ obj[i].copy() for i in range(len(obj)) ] # here the result is stored, it is a BlockGf! + for iorb in range(self.n_orbits): symm_obj[iorb].zero() # set to zero + else: + # if not a BlockGf, we assume it is a matrix (density matrix), has to be complex since self.mat is complex! + #symm_obj = [ numpy.zeros([self.orbits[iorb][3],self.orbits[iorb][3]],numpy.complex_) for iorb in range(self.n_orbits) ] + symm_obj = [ copy.deepcopy(obj[i]) for i in range(len(obj)) ] + + for iorb in range(self.n_orbits): + if (type(symm_obj[iorb])==DictType): + for ii in symm_obj[iorb]: symm_obj[iorb][ii] *= 0.0 + else: + symm_obj[iorb] *= 0.0 + + + for in_s in range(self.n_s): + + for iorb in range(self.n_orbits): + + l = self.orbits[iorb][2] # s, p, d, or f + dim = self.orbits[iorb][3] + jorb = self.map[in_s][iorb] + + + if (isinstance(obj[0],BlockGf)): + + #if l==0: + # symm_obj[jorb] += obj[iorb] + #else: + + tmp = obj[iorb].copy() + if (self.time_inv[in_s]): tmp <<= tmp.transpose() + for sig,gf in tmp: tmp[sig].from_L_G_R(self.mat[in_s][iorb],tmp[sig],self.mat[in_s][iorb].conjugate().transpose()) + tmp *= 1.0/self.n_s + symm_obj[jorb] += tmp + + else: + + if (type(obj[iorb])==DictType): + + for ii in obj[iorb]: + #if (l==0): + # symm_obj[jorb][ii] += obj[iorb][ii]/self.n_s + #else: + if (self.time_inv[in_s]==0): + symm_obj[jorb][ii] += numpy.dot(numpy.dot(self.mat[in_s][iorb],obj[iorb][ii]), + self.mat[in_s][iorb].conjugate().transpose()) / self.n_s + else: + symm_obj[jorb][ii] += numpy.dot(numpy.dot(self.mat[in_s][iorb],obj[iorb][ii].conjugate()), + self.mat[in_s][iorb].conjugate().transpose()) / self.n_s + + + + else: + #if (l==0): + # symm_obj[jorb] += obj[iorb]/self.n_s + #else: + if (self.time_inv[in_s]==0): + symm_obj[jorb] += numpy.dot(numpy.dot(self.mat[in_s][iorb],obj[iorb]),self.mat[in_s][iorb].conjugate().transpose()) / self.n_s + else: + symm_obj[jorb] += numpy.dot(numpy.dot(self.mat[in_s][iorb],obj[iorb].conjugate()), + self.mat[in_s][iorb].conjugate().transpose()) / self.n_s + + +# This does not what it is supposed to do, check how this should work: +# if ((self.SO==0) and (self.SP==0)): +# # add time inv: + #mpi.report("Add time inversion") +# for iorb in range(self.n_orbits): +# if (isinstance(symm_obj[0],BlockGf)): +# tmp = symm_obj[iorb].copy() +# tmp <<= tmp.transpose() +# for sig,gf in tmp: tmp[sig].from_L_G_R(self.mat_tinv[iorb],tmp[sig],self.mat_tinv[iorb].transpose().conjugate()) +# symm_obj[iorb] += tmp +# symm_obj[iorb] /= 2.0 +# +# else: +# if (type(symm_obj[iorb])==DictType): +# for ii in symm_obj[iorb]: +# symm_obj[iorb][ii] += numpy.dot(numpy.dot(self.mat_tinv[iorb],symm_obj[iorb][ii].conjugate()), +# self.mat_tinv[iorb].transpose().conjugate()) +# symm_obj[iorb][ii] /= 2.0 +# else: +# symm_obj[iorb] += numpy.dot(numpy.dot(self.mat_tinv[iorb],symm_obj[iorb].conjugate()), +# self.mat_tinv[iorb].transpose().conjugate()) +# symm_obj[iorb] /= 2.0 + + + return symm_obj + + + + diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 00000000..cfdb6f13 --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,10 @@ +# load triqs helper to set up tests +find_package(TriqsTest) + +FILE(COPY SrVO3.h5 SrVO3.ctqmcout SrVO3.symqmc SrVO3.sympar SrVO3.parproj DESTINATION ${CMAKE_CURRENT_BINARY_DIR}) +triqs_add_test_hdf(wien2k_convert " -p 1.e-6" ) +triqs_add_test_hdf(sumklda_basic " -d 1.e-6" ) +triqs_add_test_hdf(srvo3_Gloc " -d 1.e-6" ) +triqs_add_test_hdf(U_mat " -d 1.e-6" ) + + diff --git a/test/SrVO3.ctqmcout b/test/SrVO3.ctqmcout new file mode 100644 index 00000000..2abfb7dd --- /dev/null +++ b/test/SrVO3.ctqmcout @@ -0,0 +1,144 @@ +13.605698 + 10 + 0 + 0 + 40.000000558793545 + 40.999999999899998 + 4 + 2 2 2 5 + 3 3 1 3 + 4 3 1 3 + 5 3 1 3 + 1 + 2 2 2 3 0 2 + 0.99999996577145822 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 2.44921262381177494E-016 + 0.0000000000000000 2.44921262381177494E-016 0.0000000000000000 + 2 2 3 + 0.0000000000000000 0.0000000000000000 1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.70710676908493042 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.70710676908493042 + -0.70710676908493042 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.70710676908493042 + 0.0000000000000000 0.70710676908493042 0.0000000000000000 -0.70710676908493042 0.0000000000000000 + 0.0000000000000000 0.70710676908493042 0.0000000000000000 0.70710676908493042 0.0000000000000000 + -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 + -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 + -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 + -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 + -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 -0.0000000000000000 + 5 + 4 + 4 + 3 + 3 + 3 + 3 + 3 + 3 + 3 + -0.46708618649548778 0.19645730518187726 -0.63056665528388278 6.83053983665041654E-003 -9.08691151343342385E-003 + 0.33935797752807517 -0.32538794744732463 -0.35267852306925346 -3.23618480665549069E-003 -7.59881871370310900E-003 + 0.46708618649568096 0.64431539484614131 -0.14514631059489275 1.12847661308980683E-002 1.37196526338472175E-003 + -0.33935797752757074 0.14273458662350322 -0.45813349010965299 4.96267764149193984E-003 -6.60202761075715308E-003 + -0.46708618649618328 0.44785808966386337 0.48542034468820755 4.45422629424984794E-003 1.04588767768159212E-002 + 0.33935797752771030 0.46812253407111870 -0.10545496703983014 8.19886244814681947E-003 9.96791102947829641E-004 + 0.99826715704840852 5.88445536524223808E-002 -3.49963547724430057E-013 -4.08006961549745029E-015 + -5.73331637397004314E-017 -2.22963225794033998E-016 6.67419027347909574E-016 -5.52608570410996464E-017 + -4.16093832710137529E-002 0.70588146512886052 0.70589348533334861 -4.14051797814691258E-002 + -2.37410433123357658E-016 -1.15179437842109803E-016 5.46535311198398768E-017 1.62250970413085672E-018 + 4.16093832710091732E-002 -0.70588146512038852 0.70589348534182028 -4.14051797814873335E-002 + -4.60501593104564975E-017 2.25474017253259800E-016 -2.24885400355293418E-016 -1.23616057093388723E-017 + -0.80901699302050045 5.28329945561139539E-015 -1.00485967602252993E-014 3.28854063015805595E-016 + -2.41765092694703728E-015 0.41562693759835523 0.41562693091774439 -1.14174156173996546E-015 + -1.07540656458753083E-014 -0.57206140619004631 0.57206139701899683 1.67465711372787897E-014 + 0.58778524906798113 -3.70392842145962037E-015 7.30564534122176327E-015 -3.94624875618954910E-016 + -3.46340437064908524E-015 0.57206140619033075 0.57206139701871328 -1.53174293258064799E-015 + 7.90499832123160669E-015 0.41562693759814934 -0.41562693091795117 -1.20899404781238648E-014 + -0.57178804263232708 -0.57206141562539525 -1.76831731114629846E-002 + -0.41542832776788530 0.41562694478460188 -1.28475772191668849E-002 + 2.50077774151022392E-002 3.10030734639631734E-014 -0.80863039610344722 + 0.41542832776748106 0.41562694478500528 1.28475772191862844E-002 + -0.57178804263288330 0.57206141562483992 -1.76831731114364156E-002 + -1.81692137263105395E-002 -2.24502870808414751E-014 0.58750436871445022 + -0.30901699755010820 8.30685616456098959E-015 1.13094225530553555E-014 + 2.77559360298106587E-014 0.94947206837583287 5.48754814934267268E-002 + 1.06369999682261657E-014 -1.78301216293698939E-002 0.30850216700265437 + 0.95105652571985522 -2.58598085453039374E-014 -3.45268162554044509E-014 + 9.10854694143261225E-015 0.30850217616971171 1.78301247853450730E-002 + -3.30338201117143659E-014 5.48754717811704498E-002 -0.94947204014807729 + -1.48156062447880746E-003 0.30901343690548655 4.10927180414781041E-015 + 0.95104556712349397 4.55977474133240947E-003 -5.97388470915485219E-015 + -1.75496203951254199E-015 4.25836636595950224E-015 -0.30901699312287373 + -4.55977474133809502E-003 0.95104556712349708 1.29149252058973871E-014 + -0.30901343690548577 -1.48156062447705691E-003 2.19628991981426472E-015 + -6.18552465852348384E-015 1.28342536232335992E-014 -0.95105651199665908 + 0.17841104221945517 0.24977702070023830 3.56713339103273616E-002 + 0.54909272726567093 -0.47944397783425541 0.61085117483420970 + -0.17841104221968385 9.39962289969131642E-002 0.23414891216298114 + -0.54909272726562619 -0.76873462425507377 -0.10978507707937714 + 0.17841104221946952 -0.15578079170319165 0.19847757825293733 + 0.54909272726632985 -0.28929064642040853 -0.72063625191271308 + -0.30901699537826771 -2.11675140892306026E-014 3.44721631930676906E-015 + -5.37370006947479601E-014 0.67249851215815792 -0.67249852437822588 + -1.26814506226421840E-014 0.21850801238703932 0.21850801635742351 + -0.95105651898278010 -6.54767957184185343E-014 1.05752817797426024E-014 + 1.75281540921277077E-014 -0.21850801238656717 0.21850801635789530 + -3.87720729467512397E-014 0.67249851215961043 0.67249852437677304 + 7.19230203862877421E-002 0.80581361060730794 1.37190868566293966E-015 + 0.58545785368647119 -5.22551326903864244E-002 8.46043775456040912E-015 + -1.17881563119053437E-014 -3.96851412450703462E-016 0.80901698213359652 + 5.22551326903867436E-002 0.58545785368647141 1.07178199520420086E-015 + -0.80581361060730761 7.19230203862874784E-002 -1.18435083685779214E-014 + -8.70172955532340337E-015 -2.00759389631078690E-016 0.58778523914547964 + -0.76240262055144414 0.60075375721974744 -0.24049351322467949 + 8.00999090849681899E-017 -5.62259099552636245E-017 2.83358748161481193E-017 + -0.38253927615517225 -0.11866388983419603 0.91628737085512313 + -2.63580298927137477E-017 -1.00122764526663028E-016 1.81720663439987169E-017 + 0.52192519475061538 0.79057812199445354 0.32028157400755408 + -7.72358669497583500E-019 -1.16991835722606990E-018 -4.73961120967276270E-019 + 0.12800000607967377 + 0.38400000333786011 + 0.19200000166893005 + 0.38400000333786011 + 0.38400000333786011 + 9.60000008344650269E-002 + 0.12800000607967377 + 0.19200000166893005 + 9.60000008344650269E-002 + 1.60000007599592209E-002 + -4.74549500865790730E-002 + -4.11531615285409824E-002 + -4.11531615285409824E-002 + 0.12907948625126198 + 0.12907948625126198 + -3.93779894118470031E-002 + 2.74007323726870311E-002 + 2.82756371285759478E-002 + 0.12939984622214795 + -3.65958535778190264E-002 + 6.68520221825620320E-002 + 6.85164156244559841E-002 + 0.12896064023265197 + 2.57618807855359844E-002 + 3.43283643776219893E-002 + 5.13251111589240194E-002 + 3.17279643821369861E-002 + 6.86994690914339845E-002 + 7.79247028501099948E-002 + 6.95685007827629986E-002 + 6.95685007827629986E-002 + 9.40738009384869400E-002 + 5.71698495686069341E-002 + 6.18165727833269729E-002 + 6.18165727833269729E-002 + 6.56165915190369819E-002 + 8.52776906906369536E-002 + 8.74546342278249567E-002 + 9.18198298086789766E-002 + 9.18198298086789766E-002 + 0.10357757356761899 + 0.11030741646618503 + 0.11030741646618503 + 0.11030741646622499 diff --git a/test/SrVO3.h5 b/test/SrVO3.h5 new file mode 100644 index 0000000000000000000000000000000000000000..9e3a236359f5c183be8b8c27cd7806f26d0197ad GIT binary patch literal 662272 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 literal 0 HcmV?d00001 diff --git a/test/SrVO3.parproj b/test/SrVO3.parproj new file mode 100644 index 00000000..b19cd6cf --- /dev/null +++ b/test/SrVO3.parproj @@ -0,0 +1,620 @@ + 2 + 2 + 2 + 2 + 1.12192725451350996E-014 6.61073466263034214E-003 -2.12183957288695213E-002 -0.31091873505993201 0.41362631664894800 + 1.04360964314764715E-014 -2.12183953657400642E-002 -6.61073454948429839E-003 0.41362630957003543 0.31091872973878382 + -0.38765847172758239 0.16202659294907901 -0.52005481134111453 5.63343316101602709E-003 -7.49435767526351881E-003 + 0.28165036505177354 -0.26836111012912139 -0.29086879434858337 -2.66901756537143379E-003 -6.26706502707642232E-003 + 0.38765847172774071 0.53139397445624725 -0.11970826008758886 9.30702071233161302E-003 1.13151739033028140E-003 + -1.54083428710300797E-014 -9.09889570516930583E-003 2.92046163733298385E-002 0.42794292907813802 -0.56930778859766096 + -1.46549439250520663E-014 2.92046158735241451E-002 9.09889554943746348E-003 -0.56930777885437389 -0.42794292175420651 + -0.28165036505135904 0.11771921000947748 -0.37784193593421012 4.09292873793165590E-003 -5.44496952829737202E-003 + -0.38765847172815388 0.36936738150683501 0.40034655125287377 3.67358755131741172E-003 8.62587506559191024E-003 + 0.28165036505147351 0.38608032013884064 -8.69731415851523193E-002 6.76194630330257795E-003 8.22095498780636702E-004 + 4.26769777578522545E-016 3.77981355810454124E-004 -1.21320222260026659E-003 -3.73225730009532353E-002 4.96515541119442530E-002 + 2.94902990916057206E-016 -1.21320220183724920E-003 -3.77981349341560344E-004 4.96515532621950098E-002 3.73225723622038347E-002 + -2.07657547403230780E-002 9.04791573770536914E-003 -2.90409865834865000E-002 6.68904153342864127E-004 -8.89867125843057244E-004 + 1.50872035787772939E-002 -1.49858650828965916E-002 -1.62427428729717063E-002 -3.16914544739255719E-004 -7.44140497865150921E-004 + 2.07657547403318037E-002 2.96741900011138690E-002 -6.68476841156730346E-003 1.10509961364398113E-003 1.34354426570527648E-004 + -5.87398220320796958E-016 -5.20246717040900647E-004 1.66982964559507377E-003 5.13701159509106706E-002 -6.83395030618155486E-002 + -4.11996825544491685E-016 1.66982961701722709E-003 5.20246708137233130E-004 -6.83395018922359626E-002 -5.13701150717472618E-002 + -1.50872035787543157E-002 6.57369541368531263E-003 -2.10995112959769457E-002 4.85987302766416329E-004 -6.46526295505302218E-004 + -2.07657547403547089E-002 2.06262742633910832E-002 2.23562181718840423E-002 4.36195460301456680E-004 1.02422155241345186E-003 + 1.50872035787606544E-002 2.15595604965945660E-002 -4.85676842297969036E-003 8.02901847505403383E-004 9.76142023598206769E-005 + 4.38558201034523900E-017 5.01022241662824700E-017 4.05146406197567194E-017 1.02071487715999598E-017 + 0.0000000000000000 0.0000000000000000 8.62167273785022528E-017 3.41993018601457798E-016 + 0.83570562902110612 4.82982532177768861E-002 -2.86896737200228569E-013 -3.44504753214828034E-015 + -5.89805981832114412E-017 0.0000000000000000 7.21644966006351751E-016 -5.55111512312578270E-017 + -3.46259351716538405E-002 0.57584904099953071 0.57088641994100753 -3.34861496013032708E-002 + -2.57998102479547915E-002 1.02827532877326107E-002 -7.80009446007697982E-014 -1.78747719386812387E-014 + 1.01734485776558272E-014 4.21735882978209737E-013 7.22791578786721456E-002 0.88157167326580477 + -2.00225103946549423E-016 -6.99661828217457239E-017 6.93889390390722838E-017 0.0000000000000000 + 3.46259351716506972E-002 -0.57584904099268142 0.57088641994792111 -3.34861496013182727E-002 + -6.24500451351650554E-017 0.0000000000000000 0.0000000000000000 -2.08166817117216851E-017 + -6.33608870479360267E-018 1.64479862787327824E-017 1.48328853860066325E-017 3.73695695015249611E-018 + 0.0000000000000000 0.0000000000000000 4.98280720033578408E-017 4.18555804828206514E-017 + 4.72039233350999149E-002 3.90414630826862834E-003 -2.33335588244030838E-014 -5.08178996989620493E-016 + -1.08420217248550443E-018 -3.46944695195361419E-018 3.46944695195361419E-018 -5.20417042793042128E-018 + -1.95576235435646843E-003 4.65484343086274427E-002 4.63309671677722690E-002 -3.98015727584843070E-003 + -1.49208288743942603E-003 8.45966747000719390E-004 -7.25322352371600908E-015 -2.61998300409755365E-015 + 8.02038957998634593E-017 3.44487697891673635E-014 5.96195185599895493E-003 0.10592900356543820 + -7.41701108731754904E-018 -3.30662688923062122E-018 1.64798730217796674E-017 0.0000000000000000 + 1.95576235435593934E-003 -4.65484343080733165E-002 4.63309671683329594E-002 -3.98015727584998501E-003 + -1.08420217248550443E-018 -3.46944695195361419E-018 -2.77555756156289135E-017 -2.29850860566926940E-017 + 1.38656832596730697E-002 -3.38337557135760494E-015 -6.70493115624216766E-015 7.72216159242709066E-017 + -4.99600361081320443E-016 9.13122747886696336E-015 -6.39440728057347999E-015 0.52033860917403696 + -0.68281754277829076 6.70515996073356992E-015 -7.38671007488757673E-015 2.77555756156289135E-016 + -3.66995869541228752E-015 0.34177439239247137 0.33930610124645921 -9.71375128464644466E-016 + -7.98079506433822847E-015 -0.47041209754485619 0.46701478623514603 1.37257029986602042E-014 + 1.90844758280409692E-002 -4.63960397717473802E-015 -9.26450064325020046E-015 9.75430937990790438E-017 + -1.11022302462515654E-015 1.25685951276451106E-014 -8.73088059253134132E-015 0.71618465988796653 + 0.49609598180560627 -4.77046600177331782E-015 5.36711575423840322E-015 -3.33066907387546962E-016 + -5.17875142453636804E-015 0.47041209754508645 0.46701478623491077 -1.30474647432824904E-015 + 5.87998080721498534E-015 0.34177439239230462 -0.33930610124663074 -9.90917586670443632E-015 + 8.15812744693330725E-004 -7.12042724006876118E-016 -1.74575577399174521E-015 3.03010406606225961E-016 + 6.93889390390722838E-018 1.15401986210711216E-015 -8.76974067259100996E-016 6.24370406492669588E-002 + -3.92553044254847563E-002 2.33392024193263174E-016 -6.31775550728609874E-016 -4.57966997657877073E-016 + -2.19243516814775052E-017 3.26125716232898641E-002 3.25868728146177372E-002 -1.23573618568327792E-016 + -6.75668656365534830E-016 -4.48873550519190215E-002 4.48519836754704693E-002 9.54705859584339764E-016 + 1.12286993954185824E-003 -9.76153219244981137E-016 -2.41017865184983730E-015 4.17167815606711277E-016 + 1.21430643318376497E-017 1.58837211262422452E-015 -1.21181871112166680E-015 8.59372160033720495E-002 + 2.85206474226156331E-002 -1.69319449328971503E-016 4.62591992038069604E-016 2.22044604925031308E-016 + -3.48796504023506168E-017 4.48873550519407610E-002 4.48519836754481191E-002 -1.71408567691551422E-016 + 4.97284158593512979E-016 3.26125716232740087E-002 -3.25868728146337175E-002 -6.87627393646340688E-016 + 1.61323597853321003E-002 7.01333942218092341E-003 1.01608814684605898E-002 + -2.79420663159793137E-002 4.04915333400110433E-003 -1.75991626518636132E-002 + -0.46943247729306226 -0.46960202192573863 -1.13755925423107054E-002 + -0.34106265696638938 0.34118583827977700 -8.26485171410307196E-003 + 2.54089624599350972E-002 2.88657986402540701E-014 -0.67791724006563969 + 2.22042884631573900E-002 9.65303363702076263E-003 1.39852536335692799E-002 + -3.84589551059224821E-002 5.57318147342938941E-003 -2.42231694355196508E-002 + 0.34106265696605775 0.34118583828010790 8.26485171411840171E-003 + -0.46943247729351906 0.46960202192528255 -1.13755925422902582E-002 + -1.84606917214297783E-002 -2.11775041947248610E-014 0.49253570244774048 + 1.31597929556344687E-003 5.93973436698259070E-004 9.24106558550324866E-004 + -2.27934296261714936E-003 3.42930717699606313E-004 -1.60059948362375223E-003 + -3.76634711142005557E-002 -3.91578409108100309E-002 -1.01994345770417658E-003 + -2.73641128525740490E-002 2.84498360359687341E-002 -7.41032280194699883E-004 + 2.03869403823715538E-003 2.65759636519646847E-015 -6.07835774850491173E-002 + 1.81129015409427978E-003 8.17534319356023041E-004 1.27192359065154644E-003 + -3.13724652045142653E-003 4.72003651273126060E-004 -2.20303624465065196E-003 + 2.73641128525452179E-002 2.84498360359944150E-002 7.41032280195465221E-004 + -3.76634711142402462E-002 3.91578409107747050E-002 -1.01994345770325262E-003 + -1.48119788441640823E-003 -1.93248195223816310E-015 4.41618529752342698E-002 + 2.50183733195353114E-002 5.12716962291341332E-015 -9.16009753726071989E-016 + -2.78635800559031283E-002 -2.77760005298557899E-015 -2.54804072536051984E-015 + -0.25516531095992645 7.05351834078361871E-015 9.24712014948801768E-015 + 2.23013934819102222E-014 0.78508897164047187 4.25859031543667915E-002 + 9.05850415656971646E-015 -1.60152254032029373E-002 0.26142131879933317 + 8.12896226224197466E-003 1.59468967401852701E-015 -2.21492125352624190E-016 + -9.05342597108665936E-003 -9.70779256150601460E-016 -9.12003918640951924E-016 + 0.78531807651267882 -2.19072995549732822E-014 -2.82818535581966809E-014 + 7.33416960899934009E-015 0.25509087028988320 1.38369987228253999E-002 + -2.81871220709504228E-014 4.92897955465944060E-002 -0.80457208878039466 + 2.09521755935312146E-003 1.95071562794472258E-015 2.78135724042629284E-017 + -2.33396039423676080E-003 3.02414801719625602E-016 -3.44162469583541548E-016 + -2.10326056562136730E-002 7.19854738876179965E-016 6.02536352999948676E-016 + 2.40769243920226030E-015 7.54534326753910911E-002 4.23907570996588136E-003 + 1.00453393158769761E-015 -1.53921363715101706E-003 2.60225424008792769E-002 + 6.80777454031507192E-004 6.37607039234237397E-016 8.68613907343628788E-018 + -7.58349703545685427E-004 9.82097437030617104E-017 -1.12930819606734392E-016 + 6.47317040669934535E-002 -2.22971284847583078E-015 -1.84564422621464205E-015 + 7.93262906293459792E-016 2.45163064643986045E-002 1.37735919422533187E-003 + -3.08136797268765954E-015 4.73721246356812765E-003 -8.00891502126776234E-002 + 1.10888144558322605E-014 4.99232797086386184E-015 1.04208491056554194E-014 + -1.64578637176782117E-014 -6.66133814775093924E-015 -2.48014175064181655E-014 + -1.23035111670592679E-003 0.25661793442132258 3.86651493571252647E-015 + 0.78978879177487649 3.78663137520820082E-003 -5.46784839627889596E-015 + -1.44328993201270350E-015 3.19709536622525548E-015 -0.26632298856281256 + -3.56552443356260273E-015 -1.55930211481793202E-015 -3.41722516033444606E-015 + 5.39021952072893384E-015 2.66453525910037570E-015 8.13586111393910537E-015 + -3.78663137521277789E-003 0.78978879177487926 1.21551379697344064E-014 + -0.25661793442132186 -1.23035111670452470E-003 2.10942374678779743E-015 + -4.74620343027254421E-015 9.64007519643761412E-015 -0.81965787708755611 + 2.96468037622837458E-015 6.41448801955727705E-016 1.74612622719173991E-015 + -2.68448457907410898E-015 -9.83588210878849623E-016 -3.33986538948440408E-015 + -1.18644473567049464E-004 2.47460251986617100E-002 6.73482511653182856E-016 + 7.61604342408613855E-002 3.65150142479693529E-004 -6.47051856539349046E-016 + 6.93889390390722838E-018 -4.21212544010618473E-017 -2.81169662282370059E-002 + -9.60934541438567721E-016 -2.07059796679228235E-016 -5.66986646549486291E-016 + 8.70776974831732886E-016 2.35922392732845765E-016 1.08628897279541059E-015 + -3.65150142481637287E-004 7.61604342408660345E-002 2.07860329480731411E-015 + -2.47460251986602077E-002 -1.18644473566424679E-004 2.35922392732845765E-016 + -1.59594559789866253E-016 -1.27068494615301120E-016 -8.65351239355447166E-002 + 6.48361767119616621E-015 -2.85555318175357911E-002 -4.07809296304074368E-003 + -1.08385522779030907E-014 -4.07809289324570501E-003 2.85555313288339205E-002 + 0.15072177669527320 0.20796328367520334 2.96998006953149082E-002 + 0.46387393064009752 -0.39918301407066803 0.50859208665089817 + -0.15072177669546352 7.82608599481372791E-002 0.19495138706466059 + 2.00625217625967697E-015 -9.27825472782249812E-003 -1.32505272731767393E-003 + -3.60822483003175876E-015 -1.32505270464039482E-003 9.27825456903350748E-003 + -0.46387393064005866 -0.64004517423870588 -9.14065876194578852E-002 + 0.15072177669528516 -0.12970242372695423 0.16525158636958581 + 0.46387393064064497 -0.24086216016769291 -0.59999867426961684 + 6.93245607662720090E-016 -2.70800641183694020E-003 -3.86737741833876832E-004 + -1.51875040321769461E-015 -3.86737735214946060E-004 2.70800636549285972E-003 + 1.38404184898647496E-002 1.94551447964928653E-002 2.77844200544907077E-003 + 4.25964280647588706E-002 -3.73439156778900688E-002 4.75792288971765842E-002 + -1.38404184898824716E-002 7.32137103858686300E-003 1.82378706307781274E-002 + 2.25249152622060020E-016 -8.79884622158535351E-004 -1.25658709802360533E-004 + -4.89192020225459601E-016 -1.25658707651667145E-004 8.79884607100430739E-004 + -4.25964280647551791E-002 -5.98767787563698750E-002 -8.55116520529155752E-003 + 1.38404184898658095E-002 -1.21337737578957362E-002 1.54594286253511397E-002 + 4.25964280648093857E-002 -2.25328630784483487E-002 -5.61303941023996167E-002 + -2.25471023417728698E-002 -1.20323679784540392E-015 -5.63962776351218616E-018 + 3.13638004456606723E-015 -3.10086930611804109E-015 -5.77517452996175711E-015 + -0.25809045768868732 -1.79825830132884581E-014 3.14964962349297934E-015 + -4.42579200543063407E-014 0.57002522289177071 -0.56617703023692956 + -1.07368564495382163E-014 0.18521242235144922 0.18396206876229104 + 7.32599764694656739E-003 4.39544999587100910E-016 -3.63392704316965123E-019 + -1.27675647831893002E-015 1.00701647833182521E-015 1.77839952217441931E-015 + -0.79432075239618971 -5.56224350767323085E-014 9.66060773360039847E-015 + 1.44384279449892882E-014 -0.18521242235105181 0.18396206876269133 + -3.28313297857399991E-014 0.57002522289299284 0.56617703023569743 + -2.17045470729172957E-003 -1.32734703584162609E-016 -1.39018318217815842E-016 + -3.98986399474665632E-017 -5.31127456443959083E-017 -4.31566417438699871E-016 + -2.45088316485976496E-002 -1.49693813473881108E-015 1.94648193694425881E-016 + -5.10438769602399561E-015 5.83056552055562574E-002 -5.83723788026307977E-002 + -1.04638951207051939E-015 1.89446558088305836E-002 1.89663356196768072E-002 + 7.05223485324816190E-004 4.30446776835130279E-017 4.53616424898868208E-017 + 1.38777878078144568E-017 1.72573772088727439E-017 1.39300129313490486E-016 + -7.54304275578944750E-002 -4.60574070430158638E-015 6.02180501672679329E-016 + 1.65827823627175473E-015 -1.89446558087896406E-002 1.89663356197179687E-002 + -3.20494159125598931E-015 5.83056552056815808E-002 5.83723788025042739E-002 + -5.88715134610011246E-016 3.46228286711041296E-015 -1.63443903984480105E-015 + 3.15719672627778891E-016 3.77475828372553224E-015 2.81807723123217306E-015 + 6.05867336011169377E-002 0.67880373065265420 8.22900075458416348E-016 + 0.49317977506331839 -4.40188382884854693E-002 6.88338275267597055E-015 + -1.04360964314764715E-014 -6.66133814775093924E-016 0.69386707443556817 + 8.23772368050386913E-016 -4.68088723461457117E-015 2.26058592550034199E-015 + -4.09394740330526474E-016 -5.27355936696949357E-015 -3.89151333882548254E-015 + 4.40188382884859064E-002 0.49317977506331839 6.39346064969465703E-016 + -0.67880373065265420 6.05867336011164867E-002 -9.76996261670137756E-015 + -7.60502771868232230E-015 -3.95516952522712018E-016 0.50412393471233163 + -3.53089262582016655E-016 7.78866127290165149E-016 -4.19813202229787951E-016 + 4.20670442924375720E-017 2.70616862252381907E-016 7.04981432017994359E-016 + 6.34533375078095811E-003 7.10920686139553948E-002 3.59975954041923670E-016 + 5.16514099981528890E-002 -4.61015471242496450E-003 9.71445146547011973E-016 + -9.61036805691151130E-016 3.14852310889790488E-016 7.57264512500950837E-002 + 4.84826329869395993E-016 -1.07133136093573334E-015 5.78572944320415573E-016 + -5.76795555762288359E-017 -5.30825383648902971E-016 -9.68335574006863446E-016 + 4.61015471242552308E-003 5.16514099981528890E-002 2.59349335896442881E-016 + -7.10920686139553948E-002 6.34533375078019570E-003 -1.20736753927985774E-015 + -7.28583859910258980E-016 2.31585584042903747E-016 5.50184859926274930E-002 + -8.71195572540541111E-031 -3.24969884813390093E-031 -1.16010963677714894E-030 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -0.65037657163083196 0.51248009710711162 -0.20515583553134853 + 0.0000000000000000 6.93889390390722838E-018 0.0000000000000000 + -0.32632965343165832 -0.10122763454160452 0.78164977771764110 + -4.16779314099982603E-015 -3.14947355565427692E-015 -4.09534183218605394E-015 + -2.72285557082974741E-015 -9.87490886795515299E-016 -3.06374604643844848E-015 + 2.68852339823548375E-017 -1.29547973506905880E-017 3.99859782958334687E-017 + 0.44523445966664904 0.67441201634012471 0.27321998435537126 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -1.74198715827041609E-031 -2.47376728670618130E-031 -5.05347189241515802E-031 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -7.26241597714078896E-002 5.72259796484475489E-002 -2.29086821813164129E-002 + -6.93889390390722838E-018 8.67361737988403547E-018 0.0000000000000000 + -3.64395304547060483E-002 -1.13035620053111002E-002 8.72827540510988514E-002 + -5.88529434125788411E-016 -8.17727565077062364E-016 -1.68536697768549449E-015 + -8.35867871562259447E-016 -4.26884282982102447E-016 -1.08805949604943179E-015 + 7.47562799363042497E-018 -3.78115859630573455E-018 1.53626994728239038E-017 + 4.97170100292624456E-002 7.53080725273167773E-002 3.05090506978301854E-002 + 0.0000000000000000 0.0000000000000000 -6.93889390390722838E-018 + 0.41817867075133863 -2.89120564485163549E-019 -2.69094067099371175E-058 1.15011257050450273E-016 -4.25949569859629402E-036 + -2.89120564485163597E-019 0.41817861349675745 -8.64049795617284125E-036 -1.22297992498118223E-016 6.26211089345960796E-036 + -8.07282199988879703E-058 -8.71250211458908545E-036 0.23694791318277272 1.13650710051734720E-035 1.16551721574012134E-018 + 1.15020292068090411E-016 -1.22803953459989879E-016 1.13650710051734720E-035 0.23694791318277281 1.00919019337563083E-035 + -4.18692902289996420E-036 6.22610882546187290E-036 1.16551721574012134E-018 1.00919019337563083E-035 0.23694791318277281 + 0.0000000000000000 -5.49348095123475589E-043 8.31944424306175295E-017 -1.57059059526142817E-036 -1.05434138351877840E-016 + 1.64804428269766238E-042 3.62511435074819255E-042 -3.22999699855629360E-015 -4.32024897948764843E-037 -1.33320713453179212E-016 + -8.30498821483749372E-017 3.23006927869370371E-015 6.76169999827390752E-052 -4.35849228583720016E-017 -2.03886359996511426E-036 + 1.58859163548163833E-036 5.40031122260795479E-037 4.35849228583720016E-017 3.38808232136927840E-051 5.58364061494068534E-017 + 1.05253437999074584E-016 1.33465273727999671E-016 2.03886359996511426E-036 -5.58364061494068410E-017 2.58482446071429651E-051 + 1.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -4.89842524762354989E-016 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -4.89842524762354989E-016 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 2.44921262381177494E-016 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 2.44921262381177494E-016 0.0000000000000000 + -2.07797077872564455E-002 2.05410266584096432E-002 -8.64578310216322643E-002 -0.10457207919524197 -3.24952655729267709E-002 + 5.66597153129049652E-002 -7.73878777470444479E-002 -6.66463941706798429E-002 2.00801732266639096E-002 -1.78841754458678101E-002 + -8.95083138632063596E-002 5.99190081241931655E-002 -9.53285933442331174E-002 7.49659361434691501E-002 -1.06676160102681904E-002 + 8.73628745130652917E-002 -5.63283894381524791E-002 7.21425624304153773E-002 -0.11280137917334043 6.58243221882444797E-004 + 7.79854079928449656E-002 -0.10651527610617767 -9.17308922690443646E-002 2.76379875705640848E-002 -2.46154559074702045E-002 + -7.23393667751476288E-003 -2.12924746508222351E-003 5.99330054994748063E-002 0.13431150104935075 3.07014256740454732E-002 + -2.70315510644238567E-004 5.25280061682239108E-004 -3.40274195212106507E-003 -1.06846153157256762E-002 -3.07967256492031310E-003 + 2.16713503149908128E-003 -3.10930199855847557E-003 -2.67424807090518813E-003 1.81115727513137177E-003 -1.60942109020046601E-003 + -3.94800855063443500E-003 2.71036090590835894E-003 -3.89497979934590090E-003 8.01254126850473036E-003 -8.06532912748049013E-004 + 4.06335104259474608E-003 -2.67916827650575579E-003 2.98980618561361716E-003 -1.18965267626283296E-002 -1.52607456171693597E-004 + 2.98280554897820951E-003 -4.27958715998135245E-003 -3.68078678499440988E-003 2.49284418913072120E-003 -2.21517814474706930E-003 + -9.98559289560734973E-004 3.28337565257673727E-004 2.31229889567622412E-003 1.38379021487897609E-002 2.97610093972906081E-003 + -9.83675599390266761E-003 4.29526763736691741E-002 -2.09045606335887986E-002 0.13361696819317317 + 1.48139085889470098E-003 3.27612204520540407E-002 -4.41770541624951496E-002 -9.30071322510488303E-003 + 9.29847088731313859E-002 -2.68397187849785460E-002 3.59620051436917165E-002 -0.11526521181750425 + -0.14465590240777693 -1.34568302243756755E-002 -3.24095581760059925E-002 1.21929119585056176E-002 + 4.81333067976499884E-004 1.06447658005582209E-002 -1.43539950231005003E-002 -3.02198491718699835E-003 + -0.11124718326787206 -3.61337540670073135E-002 -1.39324908910119297E-002 -6.86738104093583962E-002 + -1.18474463532241767E-003 3.11546698964290918E-003 -1.70454629511681633E-003 1.37978720662982959E-002 + 6.43064657801538982E-005 1.93393885073834745E-003 -2.62997010606225634E-003 -8.45390491388064037E-004 + 4.56205784628266331E-003 -2.14499730942053872E-003 2.61642737351435980E-003 -1.21422027308622556E-002 + -6.13077528602718608E-003 -6.38785044216270189E-004 -2.10522541620601243E-003 1.66640749430961273E-003 + 2.08944373610029169E-005 6.28374824934529877E-004 -8.54529089349943816E-004 -2.74684022105704719E-004 + -4.26352596636372407E-003 -2.34801350908543129E-003 -7.01255962085883203E-004 -6.76203374271877079E-003 + 9.09736185598007119E-002 6.48005954451136290E-015 -3.92047505570758403E-016 0.11058997393287555 + -7.32747196252603317E-015 -1.42146021515280746E-002 -1.64837071121163511E-002 -3.85282084014448856E-015 + -8.61100727208410563E-003 -3.65939917257307457E-015 2.60381993744118745E-015 -0.13041179765476915 + 0.11056452320210131 2.60316941613769615E-015 3.86127761708987549E-015 -6.96557614872087838E-002 + 2.10942374678779743E-015 4.61860421469256245E-003 5.35588110947372679E-003 1.28716481917479086E-015 + 0.14292152958579168 5.93730793696511938E-015 2.92496062093139386E-015 8.65046096828617217E-003 + 4.52848747532721106E-003 2.12666256133031695E-016 2.54191199339226515E-016 1.16452530364722605E-002 + 3.30681662608078852E-016 -9.78143338557296241E-004 -1.14655056517422868E-003 -1.96240593219876303E-016 + -1.11778030109720432E-003 -2.04643160056638962E-016 -3.76489204395591415E-016 -1.34307927650927222E-002 + 4.33124684473911326E-003 -5.61481200075930609E-017 -2.87828571740589290E-016 -6.82151370830913484E-003 + -1.07119174641567838E-016 3.17818036951975210E-004 3.72536861956560949E-004 6.48352899146331652E-017 + 6.16583045848140276E-003 8.03529335083319474E-017 -8.30769914667017773E-017 1.32618748947837465E-003 + 8.74601389463915968E-002 1.27162586379921949E-002 2.43680424053171162E-003 + 5.93863232581116687E-002 -5.53475385811665610E-002 2.08649552273506185E-002 + -6.01717765203201027E-002 1.27162586379238780E-002 7.15076456374988054E-003 + 1.80082133128973455E-002 3.91366198527594369E-002 1.55195806088568068E-002 + -1.92957861189678032E-002 1.79835054284242339E-002 -6.77943491659489632E-003 + 6.59767304581252434E-002 3.91366198527816345E-002 1.39879220519925976E-002 + 6.34201471112452557E-003 7.83648978218010354E-004 1.34647443155688036E-004 + 3.51233851737402930E-003 -3.41083358190284345E-003 1.39843485103202333E-003 + -4.72807464387209504E-003 7.83648978213096533E-004 5.07941540326711251E-004 + 6.85153345288747116E-004 2.41182355526396242E-003 1.04948806864004754E-003 + -1.14122796598407905E-003 1.10824701313112458E-003 -4.54379027736117474E-004 + 4.28204342162174199E-003 2.41182355526555836E-003 9.28197463784893916E-004 + 9.07799005162825551E-002 2.17187379192296248E-015 -1.34072440649557478E-015 + 2.06085148946044683E-015 -2.94666473661206914E-002 -4.17109128898674256E-003 + 2.49556078829755654E-002 -1.16573417585641437E-015 8.79721642754738298E-016 + -3.25629916771322941E-003 -1.92901250528620949E-015 1.31969088434935600E-015 + -2.79637424327461304E-015 4.05573609017660791E-002 5.74101466966779259E-003 + 8.73430676465513089E-002 2.66106581214842208E-015 -1.71607519861005642E-015 + 6.05681964141315237E-003 -2.24646690138996519E-016 -1.82457673102154327E-016 + -2.13804668414141474E-016 -2.09745616400605368E-003 -3.08140380813099032E-004 + 1.00649735709771085E-003 -1.19262238973405488E-017 2.73124079776254636E-016 + -9.09686194889612739E-004 6.07153216591882483E-017 3.45481022262505988E-016 + 2.94902990916057206E-016 2.88690081319395182E-003 4.24118859413101740E-004 + 6.04148625852415390E-003 -2.31585584042903747E-016 -2.82163615389352529E-016 + -2.27090105550003629E-004 4.73648481504733709E-002 -2.16370174009247789E-015 + 9.13440330319037486E-018 -2.08166817117216851E-017 -4.55335373460501719E-018 + -2.27090105549971049E-004 4.73648481504733432E-002 -2.16370174009247867E-015 + 4.08700850940135751E-015 2.60896989776049359E-015 4.96037486572978596E-015 + 6.69840106341425545E-002 3.21153907156119232E-004 6.99730726515255170E-016 + -4.06619182768963583E-015 -2.62496187980465479E-015 -4.96520442668410788E-015 + -1.62935033321088020E-005 3.39838369140103586E-003 1.38419107489534012E-017 + 2.55126323712995262E-018 -1.73472347597680709E-018 1.27462229859215202E-018 + -1.62935033321119495E-005 3.39838369140103933E-003 1.38419107489534474E-017 + 8.25945214999457278E-016 1.76309907970982616E-016 5.40322998952743292E-016 + 4.80604030652744853E-003 2.30424933922251649E-005 2.34537855237281228E-016 + -8.22909448916497865E-016 -1.79914880194496918E-016 -5.38520410811171122E-016 + -4.97681909375340473E-002 -4.82602650487707896E-002 -1.46021088389601678E-002 + -0.13306352760101450 0.11808066001021725 -0.16555133387992260 + -1.13752772521286127E-002 -4.35373620716415638E-002 -2.83714117859083098E-003 + -8.78528157666330078E-002 -0.14049474072151610 -2.49249114707128933E-002 + 4.32349609821794864E-002 -3.83667321945202339E-002 5.37908891334768491E-002 + -0.10032742962390717 -0.14202930492284091 -2.87475811907503889E-002 + -3.70753929738527411E-003 -3.40982281634516233E-003 -1.12762486019539303E-003 + -9.09477845258517548E-003 8.23454020777469181E-003 -1.15496522113857115E-002 + -4.71564531820597380E-004 -2.99331262005517488E-003 -9.00788819465864546E-005 + -5.90526354743614503E-003 -9.78574606013009676E-003 -1.70529381481935444E-003 + 2.95507265691450065E-003 -2.67556430726921275E-003 3.75270949420835817E-003 + -6.95669548698683859E-003 -9.92107842680614235E-003 -2.04241293944664544E-003 + -0.16549551573140581 -7.44196371194050244E-015 3.06352165857504133E-015 + 5.63438184997266944E-015 -7.05599611135910298E-002 7.31096210246516415E-002 + -0.14791088193959218 -1.02591546369268372E-014 2.96637714392034013E-015 + -0.10174995154926955 -8.34055047249648851E-015 2.08860706507607574E-015 + -7.74380559676046687E-015 9.71174553254823270E-002 -0.10062676115457860 + -0.12595312373213546 -4.46864767411625508E-015 2.21350715534640585E-015 + -1.18811414602991612E-002 -1.36739577993871819E-015 2.76688394418300732E-016 + 4.97865637605343636E-016 -5.38578883027934514E-003 5.62696066361230082E-003 + -1.03469397124761608E-002 -3.16587034365767295E-016 1.67400815431761885E-016 + -7.01899914832604388E-003 1.11455983331509856E-016 8.19656842399041352E-017 + -6.87817858224804013E-016 7.41290255340920114E-003 -7.74484711259303387E-003 + -9.13064674764198225E-003 -1.33443603389515886E-015 2.33753988387874756E-016 + 1.26488672483826697E-002 0.14171581411306849 3.09586375006299123E-015 + 6.93889390390722838E-018 -7.07767178198537295E-016 -1.70750765047714769E-017 + 1.26488672483826940E-002 0.14171581411306849 3.09586375006299202E-015 + -9.15933995315754146E-016 1.32706345912225743E-016 -1.99695422954461413E-015 + 0.20041642632144666 -1.78881996113155681E-002 1.42050566637746718E-015 + 9.15933995315754146E-016 -1.22298005056364900E-016 1.98246554668165074E-015 + 9.91996630582853275E-004 1.11141659833950916E-002 2.43359219856367378E-016 + -8.67361737988403547E-019 5.20417042793042128E-018 -1.27462229859222444E-018 + 9.91996630582853058E-004 1.11141659833950916E-002 2.43359219856367378E-016 + 5.11743425413158093E-017 -2.74194729421584071E-016 -6.11955931208841114E-018 + 1.57178042681822179E-002 -1.40289508879840432E-003 1.68499356284896464E-016 + -5.11743425413158093E-017 2.77013655070046383E-016 4.31697117051619789E-018 + -0.14977258725759401 0.11801696649264197 -4.72445066732259389E-002 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -0.14977258725759401 0.11801696649264198 -4.72445066732259389E-002 + -2.08166817117216851E-016 -4.57966997657877073E-016 6.03683769639928869E-016 + -0.14500107148885677 -0.21963813193500981 -8.89805126794487311E-002 + 2.08166817117216851E-016 4.57966997657877073E-016 -5.75928194024299955E-016 + -1.25726996218183448E-002 9.90696560137734397E-003 -3.96595266236427543E-003 + -1.73472347597680709E-018 0.0000000000000000 1.73472347597680709E-018 + -1.25726996218183448E-002 9.90696560137734744E-003 -3.96595266236427543E-003 + 2.03830008427274834E-016 -8.67361737988403547E-019 1.55257751099924235E-016 + -1.21721534631411919E-002 -1.84375813283295040E-002 -7.46949277300029517E-003 + -2.05564731903251641E-016 8.67361737988403547E-019 -1.55257751099924235E-016 + 1.2482676900126699 5.55111512312578270E-017 1.11022302462515654E-016 + -5.55111512312578270E-017 1.2546793328920534 5.55111512312578270E-017 + 1.11022302462515654E-016 -5.55111512312578270E-017 1.2482676900126699 + -7.66646708341677054E-019 -4.06572133302594693E-017 -3.60835050726154072E-017 + 4.05166614337302473E-017 0.0000000000000000 4.05166614337302411E-017 + 3.60835050726154072E-017 -4.06572133302594755E-017 7.66646708341677825E-019 + -0.50000000000000011 -0.70710678118654757 -0.49999999999999989 + 0.70710678118654757 -2.22044604925031308E-016 -0.70710678118654757 + -0.49999999999999989 0.70710678118654757 -0.50000000000000011 + -1.22460635382237750E-016 -8.65927457071935541E-017 0.0000000000000000 + 8.65927457071935541E-017 0.0000000000000000 8.65927457071935541E-017 + 0.0000000000000000 -8.65927457071935541E-017 1.22460635382237750E-016 + -7.23393667748174068E-003 -3.22883468892037825E-002 5.05367341458976826E-002 -6.68203298548044194E-002 -0.12048734527179344 + 5.66597153128270623E-002 0.10154733296234247 -1.08979193606268676E-002 1.15988203030693345E-002 -2.42595229913602495E-002 + -8.73628745130365508E-002 -5.38501056846820564E-003 -9.13697894924953014E-002 -3.07179510424373525E-002 -0.10854027782948107 + 8.95083138631868058E-002 -4.82898478244610935E-003 0.11249226262082226 1.05875234170278304E-002 7.49772896356132590E-002 + 7.79854079927378430E-002 0.13976791356999854 -1.49996992223005651E-002 1.59644066683986632E-002 -3.33903690636822015E-002 + -2.07797077872818141E-002 3.22002810376368007E-002 -8.28253114829508585E-002 6.02781852261610601E-002 9.14210173740812038E-002 + -9.98559289559889512E-004 -1.58357726347470740E-003 1.71662890291182256E-003 -6.70474266049944818E-003 -1.24655982022292729E-002 + 2.16713503149542708E-003 4.07800717161719076E-003 -4.34993300214066118E-004 1.04264973150577684E-003 -2.18710046825328942E-003 + -4.06335104259296104E-003 -5.06914181742375508E-004 -3.98245171894527020E-003 -3.45293084332606425E-003 -1.13854251848937733E-002 + 3.94800855063283471E-003 1.84656332040936035E-005 4.74516415922476148E-003 1.45212325220534714E-003 7.92102587921776624E-003 + 2.98280554897317838E-003 5.61289547881033482E-003 -5.98716928473685310E-004 1.43508427466320070E-003 -3.01028561582804277E-003 + -2.70315510644548703E-004 1.50036526931015537E-003 -3.09894756241104212E-003 5.92785835477908571E-003 9.40775652734730100E-003 + -0.11124718326789813 -3.61337540668439650E-002 1.39324908914463079E-002 6.86738104093560509E-002 + 1.48139085888879599E-003 3.27612204525930886E-002 4.41770541621010204E-002 9.30071322510593601E-003 + 0.14465590240778986 1.34568302239894463E-002 -3.24095581761701390E-002 1.21929119585050105E-002 + -9.29847088731175081E-002 2.68397187854108391E-002 3.59620051433731241E-002 -0.11526521181750028 + 4.81333067974334949E-004 1.06447658007333777E-002 1.43539950229724812E-002 3.02198491718731754E-003 + -9.83675599387604654E-003 4.29526763739229017E-002 2.09045606330756778E-002 -0.13361696819316862 + -4.26352596636396866E-003 -2.34801350907664491E-003 7.01255962113849331E-004 6.76203374271841604E-003 + 6.43064657801489109E-005 1.93393885076870056E-003 2.62997010603967761E-003 8.45390491387986082E-004 + 6.13077528602741766E-003 6.38785044190189597E-004 -2.10522541621358710E-003 1.66640749430960731E-003 + -4.56205784628272402E-003 2.14499730945281455E-003 2.61642737348875354E-003 -1.21422027308617664E-002 + 2.08944373610050853E-005 6.28374824944392322E-004 8.54529089342605393E-004 2.74684022105676313E-004 + -1.18474463532232139E-003 3.11546698966385510E-003 1.70454629507966549E-003 -1.37978720662976905E-002 + 0.14292152958578991 4.02152269818323305E-015 1.70956998557514339E-015 -8.65046096828107729E-003 + -2.18228213277882332E-015 -1.42146021515185232E-002 1.64837071121287267E-002 1.77982628635220408E-015 + -0.11056452320209906 -2.95119831350554307E-015 8.64325971905444135E-016 -6.96557614872116565E-002 + 8.61100727208556280E-003 4.36282954208166984E-016 3.86843335142827982E-015 -0.13041179765476693 + 6.80011602582908381E-016 4.61860421468946424E-003 -5.35588110947775396E-003 -5.79397640976253570E-016 + 9.09736185598006702E-002 2.72785266597352916E-015 4.13731549020468492E-015 -0.11058997393287072 + 6.16583045848150338E-003 -1.95969542676754926E-016 3.23281982780865285E-016 -1.32618748947850671E-003 + 4.26308294221300343E-016 -9.78143338557119300E-004 1.14655056517537555E-003 -2.71592644207618861E-016 + -4.33124684473912280E-003 -9.37021727570597207E-017 1.38235776991901815E-018 -6.82151370830896657E-003 + 1.11778030109732727E-003 -4.30645102911242361E-016 4.46257614195033625E-016 -1.34307927650926164E-002 + -1.39211558947138769E-016 3.17818036951914604E-004 -3.72536861956934348E-004 8.71698546678345565E-017 + 4.52848747532736979E-003 -4.61328024392582137E-016 5.48823139712162344E-016 -1.16452530364722570E-002 + 0.16735768665965786 0.19249437142024067 7.14582922943898455E-003 + -1.04414994163611052E-003 -3.74636467818307423E-003 -0.21237417108479634 + -0.17612074529228414 -0.19434382010184931 7.63364973426352428E-004 + 6.92864145419245930E-002 6.56916827382872798E-002 -1.11341042163357745E-002 + -3.39264881965103959E-004 -1.21726767358626420E-003 -6.90045511789277172E-002 + -4.23164932627057219E-002 -5.99996649802401888E-002 -1.32078925642908213E-002 + 9.87499473115223923E-003 1.19076973511338322E-002 5.42021079353118863E-004 + -6.79213491091368651E-005 -2.36050357327317276E-004 -1.41304936039820875E-002 + -1.05238165057809120E-002 -1.20539548689669700E-002 1.15983183688934564E-004 + 4.31242182623335808E-003 4.11787356365975448E-003 -9.43350390301065690E-004 + -2.20689841560805025E-005 -7.66974105229113745E-005 -4.59127569687675478E-003 + -2.31555373513800053E-003 -3.66773920956698762E-003 -1.08177849416859432E-003 + 0.25745109348442474 -1.05479860956769755E-014 -1.03632380454854456E-014 + 7.79931674799172470E-015 -9.82039353108784749E-003 0.12532506723377224 + -0.24944725335581133 9.16974829401340230E-015 1.05332409461311727E-014 + -7.00339849682093674E-002 1.06512021424975956E-015 3.73312492030208887E-015 + -2.85882428840977809E-015 3.19083928411979497E-003 -4.07205827905833678E-002 + 9.46672719570883781E-002 -5.32820315646276299E-015 -3.13638004456606723E-015 + 1.58033667267171336E-002 -3.05501067152103012E-016 -8.17922118923064545E-016 + -3.20923843055709312E-016 -7.02808569980538215E-004 9.24576506543691064E-003 + -1.51932332775242315E-002 3.40493692269072668E-016 8.34401991944844212E-016 + -4.09680410247950221E-003 1.59486139572617702E-016 2.94902990916057206E-016 + 1.02348685082631619E-016 2.28356347438493537E-004 -3.00413118137712399E-003 + 5.97460177149350749E-003 -4.94396190653390022E-017 -2.42861286636752993E-016 + -1.36924776914605097E-003 0.28558801585901250 4.09741685025721836E-015 + 4.45514935706881055E-015 -2.44249065417534439E-015 0.20930386747707047 + 1.36924776914760810E-003 -0.28558801585901250 -1.33573707650214146E-015 + 4.44895569377440326E-004 -9.27931713932656638E-002 3.24740234702858288E-015 + -1.44860252265788247E-015 6.66133814775093924E-016 -6.80069490671225962E-002 + -4.44895569372682630E-004 9.27931713932654972E-002 5.21804821573823574E-015 + -9.88515197648512280E-005 2.06177508778895881E-002 2.79941000935757245E-016 + 5.22416040548562277E-017 -6.07153216591882483E-017 1.65088928407490440E-002 + 9.88515197652019132E-005 -2.06177508778896817E-002 2.79724160501260144E-017 + 3.21188058268702379E-005 -6.69911336311985670E-003 4.34548230732190177E-016 + -1.65205306032478738E-017 1.73472347597680709E-017 -5.36406445566158484E-003 + -3.21188058257895729E-005 6.69911336311956353E-003 5.14345510627123303E-016 + -0.10032742962392399 -0.14439851476441501 -1.21579527475881057E-002 + -0.13306352760119203 6.70197792007354298E-002 0.19198602973578399 + 8.78528157666487591E-002 0.14185526777724500 1.53982591896807998E-002 + 1.13752772521324430E-002 4.25910913602506117E-002 9.46309690148613991E-003 + 4.32349609822370515E-002 -2.17760463068868981E-002 -6.23800424838870937E-002 + -4.97681909375411319E-002 -5.04184007402754958E-002 5.09540886466139376E-004 + -6.95669548698783606E-003 -1.00961820379056079E-002 -8.16306329463770434E-004 + -9.09477845259757181E-003 4.67242230180037275E-003 1.33929305408054880E-002 + 5.90526354743657264E-003 9.87189449521493415E-003 1.10206715927220716E-003 + 4.71564531819949895E-004 2.89886764770599980E-003 7.51399366138332143E-004 + 2.95507265691852868E-003 -1.51816203743622338E-003 -4.35162693004794311E-003 + -3.70753929738638303E-003 -3.58915372431850652E-003 1.28082033905575245E-004 + -0.12595312373213746 -6.69603261727047538E-015 1.78329573330415769E-015 + 3.49720252756924310E-015 -7.05599611137471272E-002 -7.31096210244965988E-002 + 0.10174995154927152 6.98746616123457898E-015 7.63278329429795122E-017 + 0.14791088193959567 9.59649026910369685E-015 -5.82867087928207184E-016 + -4.89885909615850323E-015 9.71174553256971274E-002 0.10062676115436511 + -0.16549551573140930 -9.38138455808257277E-015 1.90819582357448780E-015 + -9.13064674764183307E-003 -8.29197821516913791E-016 6.16260514840760720E-016 + 1.92554305833425587E-016 -5.38578883029163479E-003 -5.62696066360074063E-003 + 7.01899914832559285E-003 5.61183044478497095E-016 3.90746462963775798E-016 + 1.03469397124756370E-002 8.57170237567039806E-016 2.10768902331182062E-016 + -2.64545330086463082E-016 7.41290255342612510E-003 7.74484711257712125E-003 + -1.18811414602988542E-002 -1.05232662861443060E-015 5.18682319317065321E-016 + 1.28873396408269274E-002 0.14438761930909616 1.13797860024078545E-015 + 3.55271367880050093E-015 5.55111512312578270E-017 -0.14937971605056932 + -1.28873396408220701E-002 -0.14438761930909583 8.32667268468867405E-017 + -1.77379013861425697E-002 -0.19873250989457386 -1.10328413072124931E-015 + -4.90059381963448004E-015 -5.55111512312578270E-017 0.20560354168230310 + 1.77379013861461120E-002 0.19873250989457414 1.96370697480574563E-015 + 1.01352428808786435E-003 1.13553582932923638E-002 9.71445146547011973E-017 + 3.66243493865603398E-016 1.90819582357448780E-017 -1.22289414573233668E-002 + -1.01352428808754690E-003 -1.13553582932931444E-002 -2.49800180540660222E-016 + -1.39499653994367518E-003 -1.56293102347389717E-002 -2.94035629178068803E-016 + -5.04587691074753764E-016 -2.94902990916057206E-017 1.68316943369245034E-002 + 1.39499653994390590E-003 1.56293102347384028E-002 1.86482773667506763E-016 + -9.78384040450919201E-016 -1.73472347597680709E-015 -3.37230243729891299E-015 + 0.0000000000000000 0.0000000000000000 2.08166817117216851E-017 + -9.92261828258733658E-016 -1.73472347597680709E-015 -3.37230243729891299E-015 + 0.14977258725760201 -0.11801696649264498 4.72445066732283189E-002 + -0.10627692528922106 -3.29671595585876998E-002 0.25456263062599588 + -0.14977258725760201 0.11801696649264498 -4.72445066732283189E-002 + -4.50160742015981441E-016 -2.00143721040824119E-016 -4.40619762898109002E-016 + -1.73472347597680709E-018 -8.67361737988403547E-019 1.73472347597680709E-018 + -4.50160742015981441E-016 -1.98408997564847311E-016 -4.44089209850062616E-016 + 1.25726996218184766E-002 -9.90696560137710631E-003 3.96595266236452002E-003 + -8.92144472401773699E-003 -2.76743696629797638E-003 2.13693276480291239E-002 + -1.25726996218184783E-002 9.90696560137710458E-003 -3.96595266236452089E-003 + 1.2482676900126699 0.0000000000000000 0.0000000000000000 + 5.55111512312578270E-017 1.2546793328920531 -5.55111512312578270E-017 + 0.0000000000000000 0.0000000000000000 1.2482676900126699 + 1.69940020349077541E-018 5.89190682441513498E-017 -5.37036019193351980E-017 + -5.85868546705368215E-017 0.0000000000000000 -5.85868546705368338E-017 + 5.37036019193351980E-017 5.89190682441513745E-017 -1.69940020349080469E-018 + -2.14306111918916069E-016 1.29889118560790344E-016 3.06151588455594253E-017 + 0.70710678118654757 2.22044604925031308E-016 -0.70710678118654757 + 3.06151588455594253E-017 -1.29889118560790344E-016 -2.14306111918916069E-016 + 0.50000000000000011 -0.70710678118654757 0.49999999999999989 + 1.73185491414387108E-016 0.0000000000000000 1.73185491414387108E-016 + -0.49999999999999989 -0.70710678118654757 -0.50000000000000011 + -1.50795419074140850E-002 -0.13640829624214801 -2.55365402000995133E-002 -2.42589879031426710E-002 -2.41533808958149104E-002 + 4.85984634178143818E-002 8.49000853202113749E-003 -2.72502785192462495E-002 7.68429249915899004E-002 -0.10222689224139500 + -9.52084797431169139E-002 -5.12563176472887461E-002 9.11270423682219860E-002 1.36543429529967821E-002 -2.71018584309838696E-002 + 9.52084797431361485E-002 9.57233921067532530E-003 -0.10411396770641200 -2.22392489885207198E-002 2.06486710545183486E-002 + 6.68900466714981434E-002 1.16854942953190308E-002 -3.75067908331889674E-002 0.10576521347628901 -0.14070324733359801 + -1.50795419075361748E-002 0.12677398338326101 5.64596785875912111E-002 2.99439744889411393E-002 1.65904398551926409E-002 + -5.76766154120704846E-004 -5.47524608870895556E-003 -1.02411926324771376E-003 -2.18311290934133017E-003 -2.17496598129218559E-003 + 2.60052168770015957E-003 4.71109851752039442E-004 -1.51211563863431131E-003 8.00245117028562832E-003 -1.06459470867530884E-002 + -3.64155790716051003E-003 -2.05890375040413028E-003 3.66281239333306457E-003 1.23279186791963938E-003 -2.44449964221066067E-003 + 3.64155790716125163E-003 3.85844097444244718E-004 -4.18406544100883519E-003 -2.00557052825278822E-003 1.86360970875878301E-003 + 3.57931112162610931E-003 6.48427098246959210E-004 -2.08124867719718977E-003 1.10144293775933273E-002 -1.46528894521766959E-002 + -5.76766154125398032E-004 5.08803604016589816E-003 2.26694271018153563E-003 2.69601916334438535E-003 1.49262844190716990E-003 + 4.67727687377428444E-004 -4.32867160218594060E-002 -0.27964380753549600 3.49486817857128235E-002 + -6.57161750847209264E-003 1.10597303328769797E-002 -6.71579126216509295E-014 -4.35948368810047473E-015 + 2.95311636916156719E-003 -0.27330156517026899 -4.42912285422496985E-002 5.53532751638176421E-003 + -2.95311636916046087E-003 0.27330156516973902 -4.42912285455315247E-002 5.53532751639198694E-003 + -9.04505556290319084E-003 1.52224129587035604E-002 -9.24375954339986104E-014 -5.99992455891819387E-015 + 4.67727687370654945E-004 -4.32867160185103142E-002 0.27964380753601598 -3.49486817857144680E-002 + 1.79945995248569212E-005 -2.59307575247800463E-003 -1.68287033270216983E-002 3.14739886416364693E-003 + -3.59231478871621288E-004 8.30895790715511628E-004 -5.56953262770313752E-015 -4.63265152384079569E-016 + 1.13613421518616559E-004 -1.63720347361626210E-002 -2.66540495686490601E-003 4.98499044819294230E-004 + -1.13613421518626073E-004 1.63720347361306882E-002 -2.66540495706033215E-003 4.98499044819903986E-004 + -4.94439724784803301E-004 1.14362997189634006E-003 -7.66443578532712122E-015 -6.38116202116591903E-016 + 1.79945995249208587E-005 -2.59307575227637858E-003 1.68287033270526527E-002 -3.14739886416373930E-003 + 6.00512529280325162E-016 4.83014513826511976E-002 -0.31420171782806899 -4.19205890835067794E-015 + 6.10936521215701793E-003 -2.63057094519514910E-015 -4.43792170088951939E-015 2.50493228164118907E-015 + 3.29588044886067713E-015 0.30496335694996701 -4.97646640291250358E-002 -5.96450777858650638E-015 + -3.27334409626018095E-015 -0.30496335694999099 -4.97646640289804432E-002 4.88993046625007088E-015 + 8.40881985734547033E-003 -3.62568372926905519E-015 -6.11715846071092585E-015 3.45152622868811582E-015 + 4.38164886777023389E-016 4.83014513828051509E-002 0.31420171782804601 2.46629579400662043E-015 + 3.96335830974985890E-016 3.44922957355754114E-003 -2.25986677342188934E-002 -6.23695496984013556E-016 + 3.37139145093812316E-004 -2.37625076780027879E-016 -2.30806864970610415E-016 3.65024098668389593E-017 + -2.07969827579228295E-016 2.17775768176256650E-002 -3.57927760856407463E-003 -1.31138287299384324E-016 + 3.47019668792166565E-016 -2.17775768176274170E-002 -3.57927760855265321E-003 -6.46678495789060771E-017 + 4.64032235253920313E-004 -3.27974205429721047E-016 -3.11306605978022447E-016 5.22750561055965201E-017 + -4.83826429817133529E-016 3.44922957356861258E-003 2.25986677342170823E-002 6.14682556276152213E-016 + 0.17197911247482200 -0.19427983398739401 5.19848181993564501E-002 + 1.90706142246010284E-002 -4.02486435533055097E-003 -1.72123909911998003E-002 + -0.17149931947750000 0.19255835753436601 4.56023539433592154E-002 + 5.50631283980561118E-002 -6.01965939904634262E-002 -0.14913432234896901 + 6.19641818306470703E-003 -1.30775770421586303E-003 -5.59264485456664739E-003 + -5.65397794066978474E-002 6.54947537279569891E-002 -0.15120811069691800 + 1.02150107468288003E-002 -1.20350593691208162E-002 3.45954112739013100E-003 + 1.41199896834820590E-003 -3.18293054222637864E-004 -1.43198236698535123E-003 + -1.01838004901271626E-002 1.19265928509594728E-002 3.03350323172712089E-003 + 3.26596013414648997E-003 -3.72589357824092832E-003 -9.92255379695554905E-003 + 4.58786276621309444E-004 -1.03419682658873054E-004 -4.65279276446727030E-004 + -3.36201542723227852E-003 4.05971919497914550E-003 -1.00609819008226995E-002 + -1.13092219013684804E-014 -0.28810618702164897 -8.56436428999100829E-002 + 1.02782933167652607E-002 3.25512408321239305E-015 2.47917462321814324E-016 + 8.15068903724250446E-015 0.29119866673636402 -5.07555641147239833E-002 + 1.69396850472811028E-015 -9.88726155394779177E-002 0.20422888489774799 + 3.33961994349149483E-003 1.05183812950983999E-015 8.25049996363180725E-017 + 8.00902191591575448E-015 8.93549416357163340E-002 0.21556470886290099 + -7.12022315921056252E-017 -2.07299530819920821E-002 -6.37966165574329214E-003 + 7.68748091380159386E-004 -1.86117225617339309E-016 9.14813481847939072E-017 + -3.00581572607179827E-016 2.09478957552860848E-002 -3.77363027084409415E-003 + 6.07246880192166345E-016 -7.10635629118965429E-003 1.52009342162795786E-002 + 2.49781396736166786E-004 -6.09500115369131805E-017 3.04186748890324537E-017 + 5.32664795834612852E-016 6.43559771463311867E-003 1.60476851436083916E-002 + -0.28558801585901300 -1.36924776915090494E-003 4.80881748531702818E-002 + 6.00779394287980520E-015 1.75020211270886506E-015 6.54870816005769512E-015 + 0.28558801585901300 1.36924776914961409E-003 4.80881748531675202E-002 + 9.27931713932659830E-002 4.44895569374169505E-004 0.14800018402160101 + -1.94804349069185405E-015 -5.63731050215842007E-016 -2.12823270212489800E-015 + -9.27931713932654140E-002 -4.44895569378162188E-004 0.14800018402160200 + -2.06177508778895499E-002 -9.88515197656002898E-005 3.79296635132005512E-003 + 6.12396823600567392E-016 1.32033494470117687E-017 1.77913883040690966E-016 + 2.06177508778897407E-002 9.88515197653758870E-005 3.79296635131991374E-003 + 6.69911336312000328E-003 3.21188058261303444E-005 1.16735500775755185E-002 + -1.98540563895858818E-016 -4.82733065298246439E-018 -5.73517972903385152E-017 + -6.69911336311942822E-003 -3.21188058268280353E-005 1.16735500775755601E-002 + -0.12466185679016900 0.11324725201916699 -6.64056967088707123E-002 + -2.71478896164634095E-002 8.87434026305112221E-003 1.26736860686911795E-003 + 6.35183886004177523E-002 -7.44965129321115971E-002 0.15143105766846399 + -6.35183886005671744E-002 2.91304323014038961E-002 0.16623030283178900 + 8.82088405116335586E-003 -2.88344794377531303E-003 -4.11793022935740308E-004 + -0.12466185679024500 9.01320793997051894E-002 9.54508507471238110E-002 + -8.52053143181878345E-003 7.90161177013297064E-003 -4.63115363095057374E-003 + -2.28817970048057458E-003 7.82623149960785195E-004 1.11768535110055690E-004 + 4.34142760260679793E-003 -5.19740972845290656E-003 1.05616036255323370E-002 + -4.34142760261753500E-003 2.03327399909753511E-003 1.15942371837379869E-002 + 7.43474654412823238E-004 -2.54289676562712203E-004 -3.63157985352822101E-005 + -8.52053143182424956E-003 6.28940409227242078E-003 6.65781110301136292E-003 + 1.79756689860263513E-014 -0.20809014417360799 0.10958647151514002 + -9.28143401042499060E-003 2.59061047644929014E-015 -2.72844718194727288E-015 + -1.39940969384627796E-014 0.10602722421651199 -0.21507556031533800 + 9.21903494137304094E-016 -0.10602722421697601 -0.21507556031511499 + 3.01572072051816418E-003 -8.45172856407111179E-016 8.86619853018173467E-016 + 1.13172540098759310E-014 -0.20809014417384400 -0.10958647151470098 + 6.92324402537856718E-016 -1.59523355059288871E-002 8.47502403109675999E-003 + -7.87540339117633482E-004 5.22514257383202247E-016 -4.05641199356195283E-016 + -2.55755380696690675E-016 8.12812090954843046E-003 -1.66331712174236784E-002 + 5.18776090108323751E-016 -8.12812090958543211E-003 -1.66331712174066816E-002 + 2.55887368172468476E-004 -1.69355139519552566E-016 1.31903961147217203E-016 + 8.26556814828890593E-016 -1.59523355059477435E-002 -8.47502403106339605E-003 + -0.14438761930909799 1.28873396408254112E-002 -0.14538365855953500 + 6.66086226493359972E-016 2.91844622307080418E-015 8.70592432422673456E-016 + 0.14438761930909200 -1.28873396408256576E-002 -0.14538365855953100 + 0.19873250989457100 -1.77379013861458587E-002 -0.10562741019108002 + -9.16457586453385841E-016 -4.04394056326882176E-015 -1.18054310431887391E-015 + -0.19873250989457500 1.77379013861456714E-002 -0.10562741019108499 + -1.13553582932925355E-002 1.01352428808768177E-003 -1.19018052044983537E-002 + 2.48973932497921740E-017 4.48518204211582205E-016 -4.04312430957292107E-018 + 1.13553582932924106E-002 -1.01352428808752738E-003 -1.19018052044983103E-002 + 1.56293102347382570E-002 -1.39499653994359690E-003 -8.64716743120648446E-003 + -3.40567994557545713E-017 -6.16856010767378209E-016 6.80540823116269591E-018 + -1.56293102347383438E-002 1.39499653994370814E-003 -8.64716743120654170E-003 + 7.51491345556577622E-002 2.33113020803429917E-002 -0.18000296235232099 + 3.26486110657078499E-018 -2.57262701321034599E-018 1.02987305728525806E-018 + 7.51491345556577761E-002 2.33113020803429917E-002 -0.18000296235232099 + -0.10253124092908200 -0.15530761249839301 -6.29187239090966549E-002 + -8.07890843330895009E-016 -2.51547589515145494E-015 -2.93762381528901684E-015 + 0.10253124092908200 0.15530761249839301 6.29187239090966827E-002 + 6.30841406233379788E-003 1.95687344537574500E-003 -1.51103964893183878E-002 + 1.08874058558177154E-018 -8.57899723577699479E-019 3.43434087657616159E-019 + 6.30841406233380048E-003 1.95687344537574760E-003 -1.51103964893183895E-002 + -8.60701225543038240E-003 -1.30373387859403344E-002 -5.28172899181251869E-003 + -3.34930091441267792E-016 -4.93822588672297332E-016 1.97136808569230149E-016 + 8.60701225543038066E-003 1.30373387859403327E-002 5.28172899181251869E-003 + 1.2482676900126695 -2.00216001185656475E-017 -3.46944695195361573E-018 + -2.13407127617563436E-017 1.2546793328920545 2.13407127617563436E-017 + -3.46944695195361573E-018 2.00216001185656475E-017 1.2482676900126695 + 2.41827906441238332E-019 1.40946282423115692E-018 -6.64977332457776001E-018 + -3.77663756749117481E-018 0.0000000000000000 -3.77663756749117481E-018 + 6.64977332457776001E-018 1.40946282423115692E-018 -2.41827906441238332E-019 + -6.12303176911188629E-017 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -1.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -6.12303176911188629E-017 + 1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.0000000000000000 diff --git a/test/SrVO3.sympar b/test/SrVO3.sympar new file mode 100644 index 00000000..0597e7e7 --- /dev/null +++ b/test/SrVO3.sympar @@ -0,0 +1,1421 @@ + 48 5 + 1 2 3 4 5 + 1 2 3 4 5 + 1 2 3 5 4 + 1 2 3 5 4 + 1 2 3 5 4 + 1 2 3 5 4 + 1 2 3 4 5 + 1 2 3 4 5 + 1 2 4 3 5 + 1 2 4 3 5 + 1 2 4 5 3 + 1 2 4 5 3 + 1 2 4 5 3 + 1 2 4 5 3 + 1 2 4 3 5 + 1 2 4 3 5 + 1 2 5 3 4 + 1 2 5 3 4 + 1 2 5 4 3 + 1 2 5 4 3 + 1 2 5 4 3 + 1 2 5 4 3 + 1 2 5 3 4 + 1 2 5 3 4 + 1 2 5 3 4 + 1 2 5 3 4 + 1 2 5 4 3 + 1 2 5 4 3 + 1 2 5 4 3 + 1 2 5 4 3 + 1 2 5 3 4 + 1 2 5 3 4 + 1 2 4 3 5 + 1 2 4 3 5 + 1 2 4 5 3 + 1 2 4 5 3 + 1 2 4 5 3 + 1 2 4 5 3 + 1 2 4 3 5 + 1 2 4 3 5 + 1 2 3 4 5 + 1 2 3 4 5 + 1 2 3 5 4 + 1 2 3 5 4 + 1 2 3 5 4 + 1 2 3 5 4 + 1 2 3 4 5 + 1 2 3 4 5 + 1.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 2.79318659328079827E-014 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 2.79318659328079827E-014 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 -1.39659329664039914E-014 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 -1.39659329664039914E-014 0.0000000000000000 + -1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -1.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.0000000000000000 + 1.39659334444375283E-014 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.39659334444375283E-014 + -1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -1.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.0000000000000000 + 1.39659334444375283E-014 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.39659334444375283E-014 + -1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -1.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.0000000000000000 + 1.39659334444375283E-014 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.39659334444375283E-014 + 1.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.39659329664039914E-014 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 1.39659329664039914E-014 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 6.98296648320199568E-015 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 6.98296648320199568E-015 0.0000000000000000 + -1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 1.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.0000000000000000 + 6.98296672221876413E-015 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -6.98296672221876413E-015 + -1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 1.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.0000000000000000 + 6.98296672221876413E-015 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -6.98296672221876413E-015 + -1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 1.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.0000000000000000 + 6.98296672221876413E-015 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -6.98296672221876413E-015 + -0.49999999999999994 -0.86602538896304504 0.0000000000000000 -6.57971226646458218E-029 0.0000000000000000 + -0.86602538896304493 0.49999998288572906 0.0000000000000000 2.09488994496059507E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -3.61121259316941049E-015 0.0000000000000000 -1.04744497248029186E-014 + 6.54614230592139585E-029 -2.09488994496059507E-014 0.0000000000000000 3.68971721476004985E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.04744497248029186E-014 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 0.0000000000000000 -1.81422794151765151E-014 0.0000000000000000 -6.28167800134663320E-015 + 0.0000000000000000 0.0000000000000000 1.04744497248029154E-014 0.0000000000000000 -3.61121259316941049E-015 + -1.81422794151765119E-014 1.04744497248029154E-014 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 -1.04744497248030322E-014 + 6.24962862378874273E-015 3.61121259316941049E-015 0.0000000000000000 -1.04744497248030322E-014 0.0000000000000000 + -0.49999999999999817 -7.40655468312133048E-015 0.50000000000000178 + 7.40655468312133048E-015 -3.60822483003175876E-015 -7.40655468312133048E-015 + 0.50000000000000178 7.40655468312133048E-015 -0.49999999999999817 + 1.04744500833281083E-014 -0.70710678118654757 0.0000000000000000 + 0.70710678118654757 0.0000000000000000 0.70710678118654757 + 0.0000000000000000 -0.70710678118654757 -1.04744500833281083E-014 + -0.49999999999999817 -7.40655468312133048E-015 0.50000000000000178 + 7.40655468312133048E-015 -3.60822483003175876E-015 -7.40655468312133048E-015 + 0.50000000000000178 7.40655468312133048E-015 -0.49999999999999817 + 1.04744500833281083E-014 -0.70710678118654757 0.0000000000000000 + 0.70710678118654757 0.0000000000000000 0.70710678118654757 + 0.0000000000000000 -0.70710678118654757 -1.04744500833281083E-014 + -0.49999999999999817 -7.40655468312133048E-015 0.50000000000000178 + 7.40655468312133048E-015 -3.60822483003175876E-015 -7.40655468312133048E-015 + 0.50000000000000178 7.40655468312133048E-015 -0.49999999999999817 + 1.04744500833281083E-014 -0.70710678118654757 0.0000000000000000 + 0.70710678118654757 0.0000000000000000 0.70710678118654757 + 0.0000000000000000 -0.70710678118654757 -1.04744500833281083E-014 + -0.49999999999999994 -0.86602538896304504 0.0000000000000000 2.19323742215486082E-029 0.0000000000000000 + -0.86602538896304493 0.49999998288572906 0.0000000000000000 -2.09488994496059760E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -3.61121259316941049E-015 0.0000000000000000 3.49148324160092211E-015 + 6.54614230592139585E-029 -6.98296648320195781E-015 0.0000000000000000 -3.68971721476004985E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.04744497248029691E-014 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 0.0000000000000000 -6.04742647172550502E-015 0.0000000000000000 6.28167800134663320E-015 + 0.0000000000000000 0.0000000000000000 3.49148324160092171E-015 0.0000000000000000 3.61121259316941049E-015 + -1.81422794151765119E-014 1.04744497248029675E-014 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 1.04744497248030053E-014 + 6.24962862378874273E-015 3.61121259316941049E-015 0.0000000000000000 3.49148324160103531E-015 0.0000000000000000 + -0.49999999999999817 7.40655468312133048E-015 0.50000000000000178 + 2.46885156104044363E-015 3.60822483003175876E-015 -2.46885156104044363E-015 + 0.50000000000000178 -7.40655468312133048E-015 -0.49999999999999817 + 6.98296672221873889E-015 0.70710678118654757 -3.49148336110939429E-015 + 0.70710678118654757 0.0000000000000000 0.70710678118654757 + 3.49148336110939429E-015 0.70710678118654757 -6.98296672221873889E-015 + -0.49999999999999817 7.40655468312133048E-015 0.50000000000000178 + 2.46885156104044363E-015 3.60822483003175876E-015 -2.46885156104044363E-015 + 0.50000000000000178 -7.40655468312133048E-015 -0.49999999999999817 + 6.98296672221873889E-015 0.70710678118654757 -3.49148336110939429E-015 + 0.70710678118654757 0.0000000000000000 0.70710678118654757 + 3.49148336110939429E-015 0.70710678118654757 -6.98296672221873889E-015 + -0.49999999999999817 7.40655468312133048E-015 0.50000000000000178 + 2.46885156104044363E-015 3.60822483003175876E-015 -2.46885156104044363E-015 + 0.50000000000000178 -7.40655468312133048E-015 -0.49999999999999817 + 6.98296672221873889E-015 0.70710678118654757 -3.49148336110939429E-015 + 0.70710678118654757 0.0000000000000000 0.70710678118654757 + 3.49148336110939429E-015 0.70710678118654757 -6.98296672221873889E-015 + -0.49999999999999994 -0.86602538896304504 0.0000000000000000 -6.57971226646458218E-029 0.0000000000000000 + -0.86602538896304493 0.49999998288572906 0.0000000000000000 6.98296648320195781E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -3.61121259316941049E-015 0.0000000000000000 -1.04744497248029691E-014 + -2.18204743530713214E-029 2.09488994496059760E-014 0.0000000000000000 -3.68971721476004985E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -3.49148324160092211E-015 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 0.0000000000000000 -1.81422794151765151E-014 0.0000000000000000 -6.28167800134663320E-015 + 0.0000000000000000 0.0000000000000000 1.04744497248029675E-014 0.0000000000000000 -3.61121259316941049E-015 + -6.04742647172550423E-015 3.49148324160092171E-015 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 3.49148324160103531E-015 + -6.24962862378874273E-015 -3.61121259316941049E-015 0.0000000000000000 1.04744497248030053E-014 0.0000000000000000 + -0.49999999999999817 -2.46885156104044363E-015 0.50000000000000178 + -7.40655468312133048E-015 3.60822483003175876E-015 7.40655468312133048E-015 + 0.50000000000000178 2.46885156104044363E-015 -0.49999999999999817 + 6.98296672221873889E-015 -0.70710678118654757 3.49148336110939429E-015 + -0.70710678118654757 0.0000000000000000 -0.70710678118654757 + -3.49148336110939429E-015 -0.70710678118654757 -6.98296672221873889E-015 + -0.49999999999999817 -2.46885156104044363E-015 0.50000000000000178 + -7.40655468312133048E-015 3.60822483003175876E-015 7.40655468312133048E-015 + 0.50000000000000178 2.46885156104044363E-015 -0.49999999999999817 + 6.98296672221873889E-015 -0.70710678118654757 3.49148336110939429E-015 + -0.70710678118654757 0.0000000000000000 -0.70710678118654757 + -3.49148336110939429E-015 -0.70710678118654757 -6.98296672221873889E-015 + -0.49999999999999817 -2.46885156104044363E-015 0.50000000000000178 + -7.40655468312133048E-015 3.60822483003175876E-015 7.40655468312133048E-015 + 0.50000000000000178 2.46885156104044363E-015 -0.49999999999999817 + 6.98296672221873889E-015 -0.70710678118654757 3.49148336110939429E-015 + -0.70710678118654757 0.0000000000000000 -0.70710678118654757 + -3.49148336110939429E-015 -0.70710678118654757 -6.98296672221873889E-015 + -0.49999999999999994 -0.86602538896304504 0.0000000000000000 2.19323742215486082E-029 0.0000000000000000 + -0.86602538896304493 0.49999998288572906 0.0000000000000000 -6.98296648320198226E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -3.61121259316941049E-015 0.0000000000000000 3.49148324160097299E-015 + -2.18204743530713214E-029 6.98296648320198226E-015 0.0000000000000000 3.68971721476004985E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -3.49148324160097299E-015 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 0.0000000000000000 -6.04742647172550502E-015 0.0000000000000000 6.28167800134663320E-015 + 0.0000000000000000 0.0000000000000000 3.49148324160097220E-015 0.0000000000000000 3.61121259316941049E-015 + -6.04742647172550423E-015 3.49148324160097220E-015 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 -3.49148324160101006E-015 + -6.24962862378874273E-015 -3.61121259316941049E-015 0.0000000000000000 -3.49148324160101006E-015 0.0000000000000000 + -0.49999999999999817 2.46885156104044363E-015 0.50000000000000178 + -2.46885156104044363E-015 -3.60822483003175876E-015 2.46885156104044363E-015 + 0.50000000000000178 -2.46885156104044363E-015 -0.49999999999999817 + 3.49148336110936944E-015 0.70710678118654757 0.0000000000000000 + -0.70710678118654757 0.0000000000000000 -0.70710678118654757 + 0.0000000000000000 0.70710678118654757 -3.49148336110936944E-015 + -0.49999999999999817 2.46885156104044363E-015 0.50000000000000178 + -2.46885156104044363E-015 -3.60822483003175876E-015 2.46885156104044363E-015 + 0.50000000000000178 -2.46885156104044363E-015 -0.49999999999999817 + 3.49148336110936944E-015 0.70710678118654757 0.0000000000000000 + -0.70710678118654757 0.0000000000000000 -0.70710678118654757 + 0.0000000000000000 0.70710678118654757 -3.49148336110936944E-015 + -0.49999999999999817 2.46885156104044363E-015 0.50000000000000178 + -2.46885156104044363E-015 -3.60822483003175876E-015 2.46885156104044363E-015 + 0.50000000000000178 -2.46885156104044363E-015 -0.49999999999999817 + 3.49148336110936944E-015 0.70710678118654757 0.0000000000000000 + -0.70710678118654757 0.0000000000000000 -0.70710678118654757 + 0.0000000000000000 0.70710678118654757 -3.49148336110936944E-015 + 1.0000000000000000 4.22289288891124235E-029 0.0000000000000000 1.20948459381153518E-014 0.0000000000000000 + 4.22289288891124235E-029 0.99999996577145822 0.0000000000000000 -6.98296243866963709E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 -6.98296243866963709E-015 + -1.20948459381153518E-014 6.98296243866963709E-015 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 6.98296243866963709E-015 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -2.79318659328079827E-014 0.0000000000000000 -1.95047177326934654E-028 + 1.17953282059045875E-042 2.79318659328079827E-014 0.0000000000000000 -1.95047177326934654E-028 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -9.75235886634673268E-029 0.0000000000000000 1.39659329664039914E-014 + 1.68915813392444571E-028 -9.75235886634673268E-029 0.0000000000000000 -1.39659329664039914E-014 0.0000000000000000 + 1.21904419394898395E-029 4.93770026216453148E-015 1.0000000000000000 + -4.93770026216453148E-015 -1.0000000000000000 4.93770026216453148E-015 + 1.0000000000000000 -4.93770026216453148E-015 1.21904419394898395E-029 + -1.70250900785195037E-043 -6.89595932299715765E-029 -1.39659334444375283E-014 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 1.39659334444375283E-014 -6.89595932299715765E-029 1.70250900785195037E-043 + 1.21904419394898395E-029 4.93770026216453148E-015 1.0000000000000000 + -4.93770026216453148E-015 -1.0000000000000000 4.93770026216453148E-015 + 1.0000000000000000 -4.93770026216453148E-015 1.21904419394898395E-029 + -1.70250900785195037E-043 -6.89595932299715765E-029 -1.39659334444375283E-014 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 1.39659334444375283E-014 -6.89595932299715765E-029 1.70250900785195037E-043 + 1.21904419394898395E-029 4.93770026216453148E-015 1.0000000000000000 + -4.93770026216453148E-015 -1.0000000000000000 4.93770026216453148E-015 + 1.0000000000000000 -4.93770026216453148E-015 1.21904419394898395E-029 + -1.70250900785195037E-043 -6.89595932299715765E-029 -1.39659334444375283E-014 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 1.39659334444375283E-014 -6.89595932299715765E-029 1.70250900785195037E-043 + 1.0000000000000000 4.22289288891124235E-029 0.0000000000000000 1.20948459381153518E-014 0.0000000000000000 + 4.22289288891124235E-029 0.99999996577145822 0.0000000000000000 -6.98296243866963709E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 -6.98296243866963709E-015 + 1.20948459381153518E-014 -6.98296243866963709E-015 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -6.98296243866963709E-015 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.39659329664039914E-014 0.0000000000000000 -9.75235886634673268E-029 + 5.89766410295229375E-043 1.39659329664039914E-014 0.0000000000000000 -9.75235886634673268E-029 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 4.87617943317336634E-029 0.0000000000000000 -6.98296648320199568E-015 + -8.44579066962222856E-029 4.87617943317336634E-029 0.0000000000000000 6.98296648320199568E-015 0.0000000000000000 + 1.21904419394898395E-029 4.93770026216453148E-015 1.0000000000000000 + 4.93770026216453148E-015 1.0000000000000000 -4.93770026216453148E-015 + 1.0000000000000000 -4.93770026216453148E-015 1.21904419394898395E-029 + -8.51254503925975183E-044 -3.44797966149857882E-029 -6.98296672221876413E-015 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 6.98296672221876413E-015 -3.44797966149857882E-029 8.51254503925975183E-044 + 1.21904419394898395E-029 4.93770026216453148E-015 1.0000000000000000 + 4.93770026216453148E-015 1.0000000000000000 -4.93770026216453148E-015 + 1.0000000000000000 -4.93770026216453148E-015 1.21904419394898395E-029 + -8.51254503925975183E-044 -3.44797966149857882E-029 -6.98296672221876413E-015 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 6.98296672221876413E-015 -3.44797966149857882E-029 8.51254503925975183E-044 + 1.21904419394898395E-029 4.93770026216453148E-015 1.0000000000000000 + 4.93770026216453148E-015 1.0000000000000000 -4.93770026216453148E-015 + 1.0000000000000000 -4.93770026216453148E-015 1.21904419394898395E-029 + -8.51254503925975183E-044 -3.44797966149857882E-029 -6.98296672221876413E-015 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 6.98296672221876413E-015 -3.44797966149857882E-029 8.51254503925975183E-044 + 1.0000000000000000 4.22289288891124235E-029 0.0000000000000000 1.20948459381153518E-014 0.0000000000000000 + -4.22289288891124235E-029 -0.99999996577145822 0.0000000000000000 6.98296243866963709E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 6.98296243866963709E-015 + -1.26686860044333440E-028 7.31426914976004895E-029 0.0000000000000000 1.04744497248029943E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 7.31426914976004895E-029 0.0000000000000000 -1.04744497248029943E-014 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 2.09488994496059886E-014 0.0000000000000000 1.46285382995200979E-028 + -8.84649615442844023E-043 -2.09488994496059886E-014 0.0000000000000000 1.46285382995200979E-028 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 6.98296243866963709E-015 0.0000000000000000 -0.99999996577145822 + -1.20948459381153518E-014 6.98296243866963709E-015 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 1.27688175588896272E-043 5.17196949224786880E-029 1.04744500833281462E-014 + -4.93770026216453148E-015 -1.0000000000000000 4.93770026216453148E-015 + 1.04744500833281462E-014 -5.17196949224786880E-029 1.27688175588896272E-043 + 1.21904419394898395E-029 4.93770026216453148E-015 1.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -1.0000000000000000 4.93770026216453148E-015 -1.21904419394898395E-029 + 1.27688175588896272E-043 5.17196949224786880E-029 1.04744500833281462E-014 + -4.93770026216453148E-015 -1.0000000000000000 4.93770026216453148E-015 + 1.04744500833281462E-014 -5.17196949224786880E-029 1.27688175588896272E-043 + 1.21904419394898395E-029 4.93770026216453148E-015 1.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -1.0000000000000000 4.93770026216453148E-015 -1.21904419394898395E-029 + 1.27688175588896272E-043 5.17196949224786880E-029 1.04744500833281462E-014 + -4.93770026216453148E-015 -1.0000000000000000 4.93770026216453148E-015 + 1.04744500833281462E-014 -5.17196949224786880E-029 1.27688175588896272E-043 + 1.21904419394898395E-029 4.93770026216453148E-015 1.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -1.0000000000000000 4.93770026216453148E-015 -1.21904419394898395E-029 + 1.0000000000000000 4.22289288891124235E-029 0.0000000000000000 1.20948459381153518E-014 0.0000000000000000 + -4.22289288891124235E-029 -0.99999996577145822 0.0000000000000000 6.98296243866963709E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 6.98296243866963709E-015 + 4.22289533481111428E-029 -2.43808971658668317E-029 0.0000000000000000 -3.49148324160099784E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -2.43808971658668317E-029 0.0000000000000000 3.49148324160099784E-015 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 6.98296648320199568E-015 0.0000000000000000 4.87617943317336634E-029 + -2.94883205147614688E-043 -6.98296648320199568E-015 0.0000000000000000 4.87617943317336634E-029 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -6.98296243866963709E-015 0.0000000000000000 0.99999996577145822 + 1.20948459381153518E-014 -6.98296243866963709E-015 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 4.25627251962987592E-044 1.72398983074928941E-029 3.49148336110938207E-015 + 4.93770026216453148E-015 1.0000000000000000 -4.93770026216453148E-015 + 3.49148336110938207E-015 -1.72398983074928941E-029 4.25627251962987592E-044 + 1.21904419394898395E-029 4.93770026216453148E-015 1.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -1.0000000000000000 4.93770026216453148E-015 -1.21904419394898395E-029 + 4.25627251962987592E-044 1.72398983074928941E-029 3.49148336110938207E-015 + 4.93770026216453148E-015 1.0000000000000000 -4.93770026216453148E-015 + 3.49148336110938207E-015 -1.72398983074928941E-029 4.25627251962987592E-044 + 1.21904419394898395E-029 4.93770026216453148E-015 1.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -1.0000000000000000 4.93770026216453148E-015 -1.21904419394898395E-029 + 4.25627251962987592E-044 1.72398983074928941E-029 3.49148336110938207E-015 + 4.93770026216453148E-015 1.0000000000000000 -4.93770026216453148E-015 + 3.49148336110938207E-015 -1.72398983074928941E-029 4.25627251962987592E-044 + 1.21904419394898395E-029 4.93770026216453148E-015 1.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -1.0000000000000000 4.93770026216453148E-015 -1.21904419394898395E-029 + -0.49999999999999994 -0.86602538896304504 0.0000000000000000 2.19323742215486082E-029 0.0000000000000000 + 0.86602538896304493 -0.49999998288572906 0.0000000000000000 1.39659329664039787E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 3.61121259316941049E-015 0.0000000000000000 -3.49148324160094774E-015 + -6.24962862378874273E-015 -3.61121259316941049E-015 0.0000000000000000 -3.49148324160102348E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 -6.98296648320200830E-015 + 0.0000000000000000 0.0000000000000000 -6.04742647172550502E-015 0.0000000000000000 6.28167800134663320E-015 + 0.0000000000000000 0.0000000000000000 -3.49148324160094656E-015 0.0000000000000000 -3.61121259316941049E-015 + 1.20948529434510085E-014 -6.98296648320196885E-015 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 6.98296648320197043E-015 0.0000000000000000 -0.99999996577145822 + 4.36409487061426427E-029 -6.98296648320197043E-015 0.0000000000000000 -3.68971721476004985E-015 0.0000000000000000 + -5.23722504166405417E-015 -0.70710678118654757 1.74574168055469715E-015 + 2.46885156104044363E-015 3.60822483003175876E-015 -2.46885156104044363E-015 + 1.74574168055469715E-015 0.70710678118654757 -5.23722504166405417E-015 + -0.49999999999999817 4.93770312208088725E-015 0.50000000000000178 + 0.70710678118654757 0.0000000000000000 0.70710678118654757 + -0.50000000000000178 4.93770312208088725E-015 0.49999999999999817 + -5.23722504166405417E-015 -0.70710678118654757 1.74574168055469715E-015 + 2.46885156104044363E-015 3.60822483003175876E-015 -2.46885156104044363E-015 + 1.74574168055469715E-015 0.70710678118654757 -5.23722504166405417E-015 + -0.49999999999999817 4.93770312208088725E-015 0.50000000000000178 + 0.70710678118654757 0.0000000000000000 0.70710678118654757 + -0.50000000000000178 4.93770312208088725E-015 0.49999999999999817 + -5.23722504166405417E-015 -0.70710678118654757 1.74574168055469715E-015 + 2.46885156104044363E-015 3.60822483003175876E-015 -2.46885156104044363E-015 + 1.74574168055469715E-015 0.70710678118654757 -5.23722504166405417E-015 + -0.49999999999999817 4.93770312208088725E-015 0.50000000000000178 + 0.70710678118654757 0.0000000000000000 0.70710678118654757 + -0.50000000000000178 4.93770312208088725E-015 0.49999999999999817 + -0.49999999999999994 -0.86602538896304504 0.0000000000000000 -6.57971226646458218E-029 0.0000000000000000 + 0.86602538896304493 -0.49999998288572906 0.0000000000000000 -1.39659329664039535E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 3.61121259316941049E-015 0.0000000000000000 1.04744497248029422E-014 + -6.24962862378874273E-015 -3.61121259316941049E-015 0.0000000000000000 1.04744497248030180E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 6.98296648320203354E-015 + 0.0000000000000000 0.0000000000000000 -1.81422794151765151E-014 0.0000000000000000 -6.28167800134663320E-015 + 0.0000000000000000 0.0000000000000000 -1.04744497248029422E-014 0.0000000000000000 3.61121259316941049E-015 + 1.20948529434510085E-014 -6.98296648320191916E-015 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 6.98296648320191994E-015 0.0000000000000000 0.99999996577145822 + 4.36409487061426427E-029 -2.09488994496059602E-014 0.0000000000000000 3.68971721476004985E-015 0.0000000000000000 + -8.72870840277342361E-015 0.70710678118654757 -1.74574168055469715E-015 + 7.40655468312133048E-015 -3.60822483003175876E-015 -7.40655468312133048E-015 + -1.74574168055469715E-015 -0.70710678118654757 -8.72870840277342361E-015 + -0.49999999999999817 -4.93770312208088725E-015 0.50000000000000178 + 0.70710678118654757 0.0000000000000000 0.70710678118654757 + -0.50000000000000178 -4.93770312208088725E-015 0.49999999999999817 + -8.72870840277342361E-015 0.70710678118654757 -1.74574168055469715E-015 + 7.40655468312133048E-015 -3.60822483003175876E-015 -7.40655468312133048E-015 + -1.74574168055469715E-015 -0.70710678118654757 -8.72870840277342361E-015 + -0.49999999999999817 -4.93770312208088725E-015 0.50000000000000178 + 0.70710678118654757 0.0000000000000000 0.70710678118654757 + -0.50000000000000178 -4.93770312208088725E-015 0.49999999999999817 + -8.72870840277342361E-015 0.70710678118654757 -1.74574168055469715E-015 + 7.40655468312133048E-015 -3.60822483003175876E-015 -7.40655468312133048E-015 + -1.74574168055469715E-015 -0.70710678118654757 -8.72870840277342361E-015 + -0.49999999999999817 -4.93770312208088725E-015 0.50000000000000178 + 0.70710678118654757 0.0000000000000000 0.70710678118654757 + -0.50000000000000178 -4.93770312208088725E-015 0.49999999999999817 + -0.49999999999999994 -0.86602538896304504 0.0000000000000000 2.19323742215486082E-029 0.0000000000000000 + 0.86602538896304493 -0.49999998288572906 0.0000000000000000 2.79318659328079764E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 3.61121259316941049E-015 0.0000000000000000 -3.49148324160089765E-015 + 6.24962862378874273E-015 3.61121259316941049E-015 0.0000000000000000 3.49148324160104911E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 1.39659329664040024E-014 + 0.0000000000000000 0.0000000000000000 -6.04742647172550502E-015 0.0000000000000000 6.28167800134663320E-015 + 0.0000000000000000 0.0000000000000000 -3.49148324160089647E-015 0.0000000000000000 -3.61121259316941049E-015 + 2.41897058869020169E-014 -1.39659329664039645E-014 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.39659329664039645E-014 0.0000000000000000 0.99999996577145822 + -8.72818974122852854E-029 6.98296648320194598E-015 0.0000000000000000 3.68971721476004985E-015 0.0000000000000000 + -8.72870840277342361E-015 -0.70710678118654757 5.23722504166409203E-015 + -2.46885156104044363E-015 -3.60822483003175876E-015 2.46885156104044363E-015 + 5.23722504166409203E-015 0.70710678118654757 -8.72870840277342361E-015 + -0.49999999999999817 9.87540624416177450E-015 0.50000000000000178 + -0.70710678118654757 0.0000000000000000 -0.70710678118654757 + -0.50000000000000178 9.87540624416177450E-015 0.49999999999999817 + -8.72870840277342361E-015 -0.70710678118654757 5.23722504166409203E-015 + -2.46885156104044363E-015 -3.60822483003175876E-015 2.46885156104044363E-015 + 5.23722504166409203E-015 0.70710678118654757 -8.72870840277342361E-015 + -0.49999999999999817 9.87540624416177450E-015 0.50000000000000178 + -0.70710678118654757 0.0000000000000000 -0.70710678118654757 + -0.50000000000000178 9.87540624416177450E-015 0.49999999999999817 + -8.72870840277342361E-015 -0.70710678118654757 5.23722504166409203E-015 + -2.46885156104044363E-015 -3.60822483003175876E-015 2.46885156104044363E-015 + 5.23722504166409203E-015 0.70710678118654757 -8.72870840277342361E-015 + -0.49999999999999817 9.87540624416177450E-015 0.50000000000000178 + -0.70710678118654757 0.0000000000000000 -0.70710678118654757 + -0.50000000000000178 9.87540624416177450E-015 0.49999999999999817 + -0.49999999999999994 -0.86602538896304504 0.0000000000000000 -6.57971226646458218E-029 0.0000000000000000 + 0.86602538896304493 -0.49999998288572906 0.0000000000000000 -2.79318659328079480E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 3.61121259316941049E-015 0.0000000000000000 1.04744497248028933E-014 + 6.24962862378874273E-015 3.61121259316941049E-015 0.0000000000000000 -1.04744497248030448E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 -1.39659329664040292E-014 + 0.0000000000000000 0.0000000000000000 -1.81422794151765151E-014 0.0000000000000000 -6.28167800134663320E-015 + 0.0000000000000000 0.0000000000000000 -1.04744497248028917E-014 0.0000000000000000 3.61121259316941049E-015 + 2.41897058869020169E-014 -1.39659329664039156E-014 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.39659329664039156E-014 0.0000000000000000 -0.99999996577145822 + -8.72818974122852854E-029 2.09488994496059381E-014 0.0000000000000000 -3.68971721476004985E-015 0.0000000000000000 + -1.22201917638827931E-014 0.70710678118654757 1.74574168055469715E-015 + -7.40655468312133048E-015 3.60822483003175876E-015 7.40655468312133048E-015 + 1.74574168055469715E-015 -0.70710678118654757 -1.22201917638827931E-014 + -0.49999999999999817 -9.87540624416177450E-015 0.50000000000000178 + -0.70710678118654757 0.0000000000000000 -0.70710678118654757 + -0.50000000000000178 -9.87540624416177450E-015 0.49999999999999817 + -1.22201917638827931E-014 0.70710678118654757 1.74574168055469715E-015 + -7.40655468312133048E-015 3.60822483003175876E-015 7.40655468312133048E-015 + 1.74574168055469715E-015 -0.70710678118654757 -1.22201917638827931E-014 + -0.49999999999999817 -9.87540624416177450E-015 0.50000000000000178 + -0.70710678118654757 0.0000000000000000 -0.70710678118654757 + -0.50000000000000178 -9.87540624416177450E-015 0.49999999999999817 + -1.22201917638827931E-014 0.70710678118654757 1.74574168055469715E-015 + -7.40655468312133048E-015 3.60822483003175876E-015 7.40655468312133048E-015 + 1.74574168055469715E-015 -0.70710678118654757 -1.22201917638827931E-014 + -0.49999999999999817 -9.87540624416177450E-015 0.50000000000000178 + -0.70710678118654757 0.0000000000000000 -0.70710678118654757 + -0.50000000000000178 -9.87540624416177450E-015 0.49999999999999817 + 1.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 1.04744497248029943E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 1.04744497248029943E-014 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -2.09488994496059886E-014 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -2.09488994496059886E-014 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 + -1.04744500833281462E-014 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -1.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.04744500833281462E-014 + -1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.0000000000000000 + -1.04744500833281462E-014 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -1.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.04744500833281462E-014 + -1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.0000000000000000 + -1.04744500833281462E-014 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -1.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.04744500833281462E-014 + -1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.0000000000000000 + 1.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 -3.49148324160099784E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 -3.49148324160099784E-015 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -6.98296648320199568E-015 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -6.98296648320199568E-015 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + -3.49148336110938207E-015 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 1.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -3.49148336110938207E-015 + -1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.0000000000000000 + -3.49148336110938207E-015 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 1.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -3.49148336110938207E-015 + -1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.0000000000000000 + -3.49148336110938207E-015 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 1.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -3.49148336110938207E-015 + -1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.0000000000000000 + -0.49999999999999994 0.86602538896304504 0.0000000000000000 -6.28167800134663320E-015 0.0000000000000000 + -0.86602538896304493 -0.49999998288572906 0.0000000000000000 -3.61121259316941049E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 3.61121259316941049E-015 0.0000000000000000 -0.99999996577145822 + -2.18204743530713214E-029 1.25506999338354715E-029 0.0000000000000000 3.49148324160099784E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 3.49148324160099784E-015 0.0000000000000000 1.25506999338354715E-029 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 2.53803043106450645E-029 0.0000000000000000 -6.98296648320199568E-015 + -6.04742647172550423E-015 -3.49148324160099784E-015 0.0000000000000000 -2.51013998676709429E-029 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 3.68971721476004985E-015 + -6.24962862378874273E-015 3.61121259316941049E-015 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 1.74574168055468472E-015 -2.46885156104044363E-015 1.74574168055469715E-015 + -0.70710678118654757 3.60822483003175876E-015 0.70710678118654757 + 1.74574168055469715E-015 2.46885156104044363E-015 1.74574168055468472E-015 + 0.49999999999999817 -0.70710678118654757 0.50000000000000178 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -0.50000000000000178 -0.70710678118654757 -0.49999999999999817 + 1.74574168055468472E-015 -2.46885156104044363E-015 1.74574168055469715E-015 + -0.70710678118654757 3.60822483003175876E-015 0.70710678118654757 + 1.74574168055469715E-015 2.46885156104044363E-015 1.74574168055468472E-015 + 0.49999999999999817 -0.70710678118654757 0.50000000000000178 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -0.50000000000000178 -0.70710678118654757 -0.49999999999999817 + 1.74574168055468472E-015 -2.46885156104044363E-015 1.74574168055469715E-015 + -0.70710678118654757 3.60822483003175876E-015 0.70710678118654757 + 1.74574168055469715E-015 2.46885156104044363E-015 1.74574168055468472E-015 + 0.49999999999999817 -0.70710678118654757 0.50000000000000178 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -0.50000000000000178 -0.70710678118654757 -0.49999999999999817 + -0.49999999999999994 0.86602538896304504 0.0000000000000000 6.28167800134663320E-015 0.0000000000000000 + -0.86602538896304493 -0.49999998288572906 0.0000000000000000 3.61121259316941049E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 3.61121259316941049E-015 0.0000000000000000 0.99999996577145822 + -2.18204743530713214E-029 -1.39659329664039787E-014 0.0000000000000000 -3.49148324160102348E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 3.49148324160094774E-015 0.0000000000000000 -6.98296648320200830E-015 + 0.0000000000000000 0.0000000000000000 1.20948529434510100E-014 0.0000000000000000 -4.38647484430972164E-029 + 0.0000000000000000 0.0000000000000000 -6.98296648320196885E-015 0.0000000000000000 6.98296648320197043E-015 + -6.04742647172550423E-015 -3.49148324160094656E-015 0.0000000000000000 -6.98296648320197043E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 -3.68971721476004985E-015 + -6.24962862378874273E-015 3.61121259316941049E-015 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 5.23722504166405417E-015 2.46885156104044363E-015 -1.74574168055469715E-015 + -0.70710678118654757 -3.60822483003175876E-015 0.70710678118654757 + -1.74574168055469715E-015 -2.46885156104044363E-015 5.23722504166405417E-015 + 0.49999999999999817 0.70710678118654757 0.50000000000000178 + 4.93770312208088725E-015 0.0000000000000000 4.93770312208088725E-015 + -0.50000000000000178 0.70710678118654757 -0.49999999999999817 + 5.23722504166405417E-015 2.46885156104044363E-015 -1.74574168055469715E-015 + -0.70710678118654757 -3.60822483003175876E-015 0.70710678118654757 + -1.74574168055469715E-015 -2.46885156104044363E-015 5.23722504166405417E-015 + 0.49999999999999817 0.70710678118654757 0.50000000000000178 + 4.93770312208088725E-015 0.0000000000000000 4.93770312208088725E-015 + -0.50000000000000178 0.70710678118654757 -0.49999999999999817 + 5.23722504166405417E-015 2.46885156104044363E-015 -1.74574168055469715E-015 + -0.70710678118654757 -3.60822483003175876E-015 0.70710678118654757 + -1.74574168055469715E-015 -2.46885156104044363E-015 5.23722504166405417E-015 + 0.49999999999999817 0.70710678118654757 0.50000000000000178 + 4.93770312208088725E-015 0.0000000000000000 4.93770312208088725E-015 + -0.50000000000000178 0.70710678118654757 -0.49999999999999817 + -0.49999999999999994 0.86602538896304504 0.0000000000000000 6.28167800134663320E-015 0.0000000000000000 + 0.86602538896304493 0.49999998288572906 0.0000000000000000 -3.61121259316941049E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -3.61121259316941049E-015 0.0000000000000000 -0.99999996577145822 + 6.24962862378874273E-015 -3.61121259316941049E-015 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 3.68971721476004985E-015 + 0.0000000000000000 0.0000000000000000 1.20948529434510100E-014 0.0000000000000000 -4.38647484430972164E-029 + 0.0000000000000000 0.0000000000000000 6.98296648320189312E-015 0.0000000000000000 -2.79318659328079575E-014 + 2.41897058869020169E-014 1.39659329664039377E-014 0.0000000000000000 6.98296648320189549E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.39659329664039409E-014 0.0000000000000000 -6.98296648320204695E-015 + -8.72818974122852854E-029 -1.39659329664039409E-014 0.0000000000000000 -1.39659329664040166E-014 0.0000000000000000 + -0.49999999999999817 -0.70710678118654757 -0.50000000000000178 + -0.70710678118654757 -3.60822483003175876E-015 0.70710678118654757 + -0.50000000000000178 0.70710678118654757 -0.49999999999999817 + 1.04744500833281083E-014 9.87540624416177450E-015 3.49148336110939429E-015 + 4.93770312208088725E-015 0.0000000000000000 4.93770312208088725E-015 + -3.49148336110939429E-015 9.87540624416177450E-015 -1.04744500833281083E-014 + -0.49999999999999817 -0.70710678118654757 -0.50000000000000178 + -0.70710678118654757 -3.60822483003175876E-015 0.70710678118654757 + -0.50000000000000178 0.70710678118654757 -0.49999999999999817 + 1.04744500833281083E-014 9.87540624416177450E-015 3.49148336110939429E-015 + 4.93770312208088725E-015 0.0000000000000000 4.93770312208088725E-015 + -3.49148336110939429E-015 9.87540624416177450E-015 -1.04744500833281083E-014 + -0.49999999999999817 -0.70710678118654757 -0.50000000000000178 + -0.70710678118654757 -3.60822483003175876E-015 0.70710678118654757 + -0.50000000000000178 0.70710678118654757 -0.49999999999999817 + 1.04744500833281083E-014 9.87540624416177450E-015 3.49148336110939429E-015 + 4.93770312208088725E-015 0.0000000000000000 4.93770312208088725E-015 + -3.49148336110939429E-015 9.87540624416177450E-015 -1.04744500833281083E-014 + -0.49999999999999994 0.86602538896304504 0.0000000000000000 -6.28167800134663320E-015 0.0000000000000000 + 0.86602538896304493 0.49999998288572906 0.0000000000000000 3.61121259316941049E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -3.61121259316941049E-015 0.0000000000000000 0.99999996577145822 + 6.24962862378874273E-015 -3.61121259316941049E-015 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 -3.68971721476004985E-015 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.01521217242580258E-028 0.0000000000000000 2.79318659328079827E-014 + 2.41897058869020169E-014 1.39659329664039914E-014 0.0000000000000000 1.00405599470683772E-028 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.39659329664039914E-014 0.0000000000000000 5.02027997353418859E-029 + -8.72818974122852854E-029 5.02027997353418859E-029 0.0000000000000000 1.39659329664039914E-014 0.0000000000000000 + -0.49999999999999817 0.70710678118654757 -0.50000000000000178 + -0.70710678118654757 3.60822483003175876E-015 0.70710678118654757 + -0.50000000000000178 -0.70710678118654757 -0.49999999999999817 + 6.98296672221873889E-015 -9.87540624416177450E-015 6.98296672221878859E-015 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -6.98296672221878859E-015 -9.87540624416177450E-015 -6.98296672221873889E-015 + -0.49999999999999817 0.70710678118654757 -0.50000000000000178 + -0.70710678118654757 3.60822483003175876E-015 0.70710678118654757 + -0.50000000000000178 -0.70710678118654757 -0.49999999999999817 + 6.98296672221873889E-015 -9.87540624416177450E-015 6.98296672221878859E-015 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -6.98296672221878859E-015 -9.87540624416177450E-015 -6.98296672221873889E-015 + -0.49999999999999817 0.70710678118654757 -0.50000000000000178 + -0.70710678118654757 3.60822483003175876E-015 0.70710678118654757 + -0.50000000000000178 -0.70710678118654757 -0.49999999999999817 + 6.98296672221873889E-015 -9.87540624416177450E-015 6.98296672221878859E-015 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -6.98296672221878859E-015 -9.87540624416177450E-015 -6.98296672221873889E-015 + -0.49999999999999994 0.86602538896304504 0.0000000000000000 -6.28167800134663320E-015 0.0000000000000000 + 0.86602538896304493 0.49999998288572906 0.0000000000000000 3.61121259316941049E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -3.61121259316941049E-015 0.0000000000000000 0.99999996577145822 + -6.24962862378874273E-015 3.61121259316941049E-015 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 3.68971721476004985E-015 + 0.0000000000000000 0.0000000000000000 2.41897058869020201E-014 0.0000000000000000 8.77294968861944328E-029 + 0.0000000000000000 0.0000000000000000 1.39659329664039377E-014 0.0000000000000000 1.39659329664039409E-014 + 1.20948529434510085E-014 6.98296648320189312E-015 0.0000000000000000 -1.39659329664039409E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -6.98296648320189549E-015 0.0000000000000000 -1.39659329664040166E-014 + 4.36409487061426427E-029 2.79318659328079575E-014 0.0000000000000000 -6.98296648320204695E-015 0.0000000000000000 + 0.49999999999999817 -0.70710678118654757 0.50000000000000178 + -0.70710678118654757 3.60822483003175876E-015 0.70710678118654757 + 0.50000000000000178 0.70710678118654757 0.49999999999999817 + -1.04744500833281083E-014 4.93770312208088725E-015 3.49148336110939429E-015 + 9.87540624416177450E-015 0.0000000000000000 9.87540624416177450E-015 + -3.49148336110939429E-015 4.93770312208088725E-015 1.04744500833281083E-014 + 0.49999999999999817 -0.70710678118654757 0.50000000000000178 + -0.70710678118654757 3.60822483003175876E-015 0.70710678118654757 + 0.50000000000000178 0.70710678118654757 0.49999999999999817 + -1.04744500833281083E-014 4.93770312208088725E-015 3.49148336110939429E-015 + 9.87540624416177450E-015 0.0000000000000000 9.87540624416177450E-015 + -3.49148336110939429E-015 4.93770312208088725E-015 1.04744500833281083E-014 + 0.49999999999999817 -0.70710678118654757 0.50000000000000178 + -0.70710678118654757 3.60822483003175876E-015 0.70710678118654757 + 0.50000000000000178 0.70710678118654757 0.49999999999999817 + -1.04744500833281083E-014 4.93770312208088725E-015 3.49148336110939429E-015 + 9.87540624416177450E-015 0.0000000000000000 9.87540624416177450E-015 + -3.49148336110939429E-015 4.93770312208088725E-015 1.04744500833281083E-014 + -0.49999999999999994 0.86602538896304504 0.0000000000000000 6.28167800134663320E-015 0.0000000000000000 + 0.86602538896304493 0.49999998288572906 0.0000000000000000 -3.61121259316941049E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -3.61121259316941049E-015 0.0000000000000000 -0.99999996577145822 + -6.24962862378874273E-015 3.61121259316941049E-015 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 -3.68971721476004985E-015 + 0.0000000000000000 0.0000000000000000 1.20948529434510100E-014 0.0000000000000000 -4.38647484430972164E-029 + 0.0000000000000000 0.0000000000000000 6.98296648320194440E-015 0.0000000000000000 -1.39659329664039645E-014 + 1.20948529434510085E-014 6.98296648320194440E-015 0.0000000000000000 6.98296648320194598E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -6.98296648320194598E-015 0.0000000000000000 6.98296648320202013E-015 + 4.36409487061426427E-029 1.39659329664039645E-014 0.0000000000000000 6.98296648320202013E-015 0.0000000000000000 + 0.49999999999999817 0.70710678118654757 0.50000000000000178 + -0.70710678118654757 -3.60822483003175876E-015 0.70710678118654757 + 0.50000000000000178 -0.70710678118654757 0.49999999999999817 + -6.98296672221873889E-015 -4.93770312208088725E-015 0.0000000000000000 + 4.93770312208088725E-015 0.0000000000000000 4.93770312208088725E-015 + 0.0000000000000000 -4.93770312208088725E-015 6.98296672221873889E-015 + 0.49999999999999817 0.70710678118654757 0.50000000000000178 + -0.70710678118654757 -3.60822483003175876E-015 0.70710678118654757 + 0.50000000000000178 -0.70710678118654757 0.49999999999999817 + -6.98296672221873889E-015 -4.93770312208088725E-015 0.0000000000000000 + 4.93770312208088725E-015 0.0000000000000000 4.93770312208088725E-015 + 0.0000000000000000 -4.93770312208088725E-015 6.98296672221873889E-015 + 0.49999999999999817 0.70710678118654757 0.50000000000000178 + -0.70710678118654757 -3.60822483003175876E-015 0.70710678118654757 + 0.50000000000000178 -0.70710678118654757 0.49999999999999817 + -6.98296672221873889E-015 -4.93770312208088725E-015 0.0000000000000000 + 4.93770312208088725E-015 0.0000000000000000 4.93770312208088725E-015 + 0.0000000000000000 -4.93770312208088725E-015 6.98296672221873889E-015 + -0.49999999999999994 0.86602538896304504 0.0000000000000000 6.28167800134663320E-015 0.0000000000000000 + -0.86602538896304493 -0.49999998288572906 0.0000000000000000 3.61121259316941049E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 3.61121259316941049E-015 0.0000000000000000 0.99999996577145822 + 6.54614230592139585E-029 1.39659329664039535E-014 0.0000000000000000 1.04744497248030180E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.04744497248029422E-014 0.0000000000000000 6.98296648320203354E-015 + 0.0000000000000000 0.0000000000000000 1.20948529434510100E-014 0.0000000000000000 -4.38647484430972164E-029 + 0.0000000000000000 0.0000000000000000 -6.98296648320191916E-015 0.0000000000000000 2.09488994496059602E-014 + -1.81422794151765119E-014 -1.04744497248029422E-014 0.0000000000000000 -6.98296648320191994E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 3.68971721476004985E-015 + 6.24962862378874273E-015 -3.61121259316941049E-015 0.0000000000000000 0.99999996577145822 0.0000000000000000 + -8.72870840277342361E-015 -7.40655468312133048E-015 -1.74574168055469715E-015 + -0.70710678118654757 -3.60822483003175876E-015 0.70710678118654757 + -1.74574168055469715E-015 7.40655468312133048E-015 -8.72870840277342361E-015 + -0.49999999999999817 -0.70710678118654757 -0.50000000000000178 + 4.93770312208088725E-015 0.0000000000000000 4.93770312208088725E-015 + 0.50000000000000178 -0.70710678118654757 0.49999999999999817 + -8.72870840277342361E-015 -7.40655468312133048E-015 -1.74574168055469715E-015 + -0.70710678118654757 -3.60822483003175876E-015 0.70710678118654757 + -1.74574168055469715E-015 7.40655468312133048E-015 -8.72870840277342361E-015 + -0.49999999999999817 -0.70710678118654757 -0.50000000000000178 + 4.93770312208088725E-015 0.0000000000000000 4.93770312208088725E-015 + 0.50000000000000178 -0.70710678118654757 0.49999999999999817 + -8.72870840277342361E-015 -7.40655468312133048E-015 -1.74574168055469715E-015 + -0.70710678118654757 -3.60822483003175876E-015 0.70710678118654757 + -1.74574168055469715E-015 7.40655468312133048E-015 -8.72870840277342361E-015 + -0.49999999999999817 -0.70710678118654757 -0.50000000000000178 + 4.93770312208088725E-015 0.0000000000000000 4.93770312208088725E-015 + 0.50000000000000178 -0.70710678118654757 0.49999999999999817 + -0.49999999999999994 0.86602538896304504 0.0000000000000000 -6.28167800134663320E-015 0.0000000000000000 + -0.86602538896304493 -0.49999998288572906 0.0000000000000000 -3.61121259316941049E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 3.61121259316941049E-015 0.0000000000000000 -0.99999996577145822 + 6.54614230592139585E-029 2.79318659328079480E-014 0.0000000000000000 -1.04744497248030448E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.04744497248028933E-014 0.0000000000000000 -1.39659329664040292E-014 + 0.0000000000000000 0.0000000000000000 2.41897058869020201E-014 0.0000000000000000 8.77294968861944328E-029 + 0.0000000000000000 0.0000000000000000 -1.39659329664039156E-014 0.0000000000000000 -2.09488994496059381E-014 + -1.81422794151765119E-014 -1.04744497248028917E-014 0.0000000000000000 1.39659329664039156E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 -3.68971721476004985E-015 + 6.24962862378874273E-015 -3.61121259316941049E-015 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + -1.22201917638827931E-014 7.40655468312133048E-015 1.74574168055469715E-015 + -0.70710678118654757 3.60822483003175876E-015 0.70710678118654757 + 1.74574168055469715E-015 -7.40655468312133048E-015 -1.22201917638827931E-014 + -0.49999999999999817 0.70710678118654757 -0.50000000000000178 + 9.87540624416177450E-015 0.0000000000000000 9.87540624416177450E-015 + 0.50000000000000178 0.70710678118654757 0.49999999999999817 + -1.22201917638827931E-014 7.40655468312133048E-015 1.74574168055469715E-015 + -0.70710678118654757 3.60822483003175876E-015 0.70710678118654757 + 1.74574168055469715E-015 -7.40655468312133048E-015 -1.22201917638827931E-014 + -0.49999999999999817 0.70710678118654757 -0.50000000000000178 + 9.87540624416177450E-015 0.0000000000000000 9.87540624416177450E-015 + 0.50000000000000178 0.70710678118654757 0.49999999999999817 + -1.22201917638827931E-014 7.40655468312133048E-015 1.74574168055469715E-015 + -0.70710678118654757 3.60822483003175876E-015 0.70710678118654757 + 1.74574168055469715E-015 -7.40655468312133048E-015 -1.22201917638827931E-014 + -0.49999999999999817 0.70710678118654757 -0.50000000000000178 + 9.87540624416177450E-015 0.0000000000000000 9.87540624416177450E-015 + 0.50000000000000178 0.70710678118654757 0.49999999999999817 + -0.49999999999999994 0.86602538896304504 0.0000000000000000 -6.28167800134663320E-015 0.0000000000000000 + -0.86602538896304493 -0.49999998288572906 0.0000000000000000 -3.61121259316941049E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 3.61121259316941049E-015 0.0000000000000000 -0.99999996577145822 + 6.54614230592139585E-029 2.79318659328079480E-014 0.0000000000000000 -1.04744497248030448E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.04744497248028933E-014 0.0000000000000000 -1.39659329664040292E-014 + 0.0000000000000000 0.0000000000000000 2.41897058869020201E-014 0.0000000000000000 8.77294968861944328E-029 + 0.0000000000000000 0.0000000000000000 -1.39659329664039156E-014 0.0000000000000000 -2.09488994496059381E-014 + -1.81422794151765119E-014 -1.04744497248028917E-014 0.0000000000000000 1.39659329664039156E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 -3.68971721476004985E-015 + 6.24962862378874273E-015 -3.61121259316941049E-015 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 1.22201917638827931E-014 -7.40655468312133048E-015 -1.74574168055469715E-015 + 0.70710678118654757 -3.60822483003175876E-015 -0.70710678118654757 + -1.74574168055469715E-015 7.40655468312133048E-015 1.22201917638827931E-014 + 0.49999999999999817 -0.70710678118654757 0.50000000000000178 + -9.87540624416177450E-015 0.0000000000000000 -9.87540624416177450E-015 + -0.50000000000000178 -0.70710678118654757 -0.49999999999999817 + 1.22201917638827931E-014 -7.40655468312133048E-015 -1.74574168055469715E-015 + 0.70710678118654757 -3.60822483003175876E-015 -0.70710678118654757 + -1.74574168055469715E-015 7.40655468312133048E-015 1.22201917638827931E-014 + 0.49999999999999817 -0.70710678118654757 0.50000000000000178 + -9.87540624416177450E-015 0.0000000000000000 -9.87540624416177450E-015 + -0.50000000000000178 -0.70710678118654757 -0.49999999999999817 + 1.22201917638827931E-014 -7.40655468312133048E-015 -1.74574168055469715E-015 + 0.70710678118654757 -3.60822483003175876E-015 -0.70710678118654757 + -1.74574168055469715E-015 7.40655468312133048E-015 1.22201917638827931E-014 + 0.49999999999999817 -0.70710678118654757 0.50000000000000178 + -9.87540624416177450E-015 0.0000000000000000 -9.87540624416177450E-015 + -0.50000000000000178 -0.70710678118654757 -0.49999999999999817 + -0.49999999999999994 0.86602538896304504 0.0000000000000000 6.28167800134663320E-015 0.0000000000000000 + -0.86602538896304493 -0.49999998288572906 0.0000000000000000 3.61121259316941049E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 3.61121259316941049E-015 0.0000000000000000 0.99999996577145822 + 6.54614230592139585E-029 1.39659329664039535E-014 0.0000000000000000 1.04744497248030180E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.04744497248029422E-014 0.0000000000000000 6.98296648320203354E-015 + 0.0000000000000000 0.0000000000000000 1.20948529434510100E-014 0.0000000000000000 -4.38647484430972164E-029 + 0.0000000000000000 0.0000000000000000 -6.98296648320191916E-015 0.0000000000000000 2.09488994496059602E-014 + -1.81422794151765119E-014 -1.04744497248029422E-014 0.0000000000000000 -6.98296648320191994E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 3.68971721476004985E-015 + 6.24962862378874273E-015 -3.61121259316941049E-015 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 8.72870840277342361E-015 7.40655468312133048E-015 1.74574168055469715E-015 + 0.70710678118654757 3.60822483003175876E-015 -0.70710678118654757 + 1.74574168055469715E-015 -7.40655468312133048E-015 8.72870840277342361E-015 + 0.49999999999999817 0.70710678118654757 0.50000000000000178 + -4.93770312208088725E-015 0.0000000000000000 -4.93770312208088725E-015 + -0.50000000000000178 0.70710678118654757 -0.49999999999999817 + 8.72870840277342361E-015 7.40655468312133048E-015 1.74574168055469715E-015 + 0.70710678118654757 3.60822483003175876E-015 -0.70710678118654757 + 1.74574168055469715E-015 -7.40655468312133048E-015 8.72870840277342361E-015 + 0.49999999999999817 0.70710678118654757 0.50000000000000178 + -4.93770312208088725E-015 0.0000000000000000 -4.93770312208088725E-015 + -0.50000000000000178 0.70710678118654757 -0.49999999999999817 + 8.72870840277342361E-015 7.40655468312133048E-015 1.74574168055469715E-015 + 0.70710678118654757 3.60822483003175876E-015 -0.70710678118654757 + 1.74574168055469715E-015 -7.40655468312133048E-015 8.72870840277342361E-015 + 0.49999999999999817 0.70710678118654757 0.50000000000000178 + -4.93770312208088725E-015 0.0000000000000000 -4.93770312208088725E-015 + -0.50000000000000178 0.70710678118654757 -0.49999999999999817 + -0.49999999999999994 0.86602538896304504 0.0000000000000000 6.28167800134663320E-015 0.0000000000000000 + 0.86602538896304493 0.49999998288572906 0.0000000000000000 -3.61121259316941049E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -3.61121259316941049E-015 0.0000000000000000 -0.99999996577145822 + -6.24962862378874273E-015 3.61121259316941049E-015 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 -3.68971721476004985E-015 + 0.0000000000000000 0.0000000000000000 1.20948529434510100E-014 0.0000000000000000 -4.38647484430972164E-029 + 0.0000000000000000 0.0000000000000000 6.98296648320194440E-015 0.0000000000000000 -1.39659329664039645E-014 + 1.20948529434510085E-014 6.98296648320194440E-015 0.0000000000000000 6.98296648320194598E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -6.98296648320194598E-015 0.0000000000000000 6.98296648320202013E-015 + 4.36409487061426427E-029 1.39659329664039645E-014 0.0000000000000000 6.98296648320202013E-015 0.0000000000000000 + -0.49999999999999817 -0.70710678118654757 -0.50000000000000178 + 0.70710678118654757 3.60822483003175876E-015 -0.70710678118654757 + -0.50000000000000178 0.70710678118654757 -0.49999999999999817 + 6.98296672221873889E-015 4.93770312208088725E-015 0.0000000000000000 + -4.93770312208088725E-015 0.0000000000000000 -4.93770312208088725E-015 + 0.0000000000000000 4.93770312208088725E-015 -6.98296672221873889E-015 + -0.49999999999999817 -0.70710678118654757 -0.50000000000000178 + 0.70710678118654757 3.60822483003175876E-015 -0.70710678118654757 + -0.50000000000000178 0.70710678118654757 -0.49999999999999817 + 6.98296672221873889E-015 4.93770312208088725E-015 0.0000000000000000 + -4.93770312208088725E-015 0.0000000000000000 -4.93770312208088725E-015 + 0.0000000000000000 4.93770312208088725E-015 -6.98296672221873889E-015 + -0.49999999999999817 -0.70710678118654757 -0.50000000000000178 + 0.70710678118654757 3.60822483003175876E-015 -0.70710678118654757 + -0.50000000000000178 0.70710678118654757 -0.49999999999999817 + 6.98296672221873889E-015 4.93770312208088725E-015 0.0000000000000000 + -4.93770312208088725E-015 0.0000000000000000 -4.93770312208088725E-015 + 0.0000000000000000 4.93770312208088725E-015 -6.98296672221873889E-015 + -0.49999999999999994 0.86602538896304504 0.0000000000000000 -6.28167800134663320E-015 0.0000000000000000 + 0.86602538896304493 0.49999998288572906 0.0000000000000000 3.61121259316941049E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -3.61121259316941049E-015 0.0000000000000000 0.99999996577145822 + -6.24962862378874273E-015 3.61121259316941049E-015 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 3.68971721476004985E-015 + 0.0000000000000000 0.0000000000000000 2.41897058869020201E-014 0.0000000000000000 8.77294968861944328E-029 + 0.0000000000000000 0.0000000000000000 1.39659329664039377E-014 0.0000000000000000 1.39659329664039409E-014 + 1.20948529434510085E-014 6.98296648320189312E-015 0.0000000000000000 -1.39659329664039409E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -6.98296648320189549E-015 0.0000000000000000 -1.39659329664040166E-014 + 4.36409487061426427E-029 2.79318659328079575E-014 0.0000000000000000 -6.98296648320204695E-015 0.0000000000000000 + -0.49999999999999817 0.70710678118654757 -0.50000000000000178 + 0.70710678118654757 -3.60822483003175876E-015 -0.70710678118654757 + -0.50000000000000178 -0.70710678118654757 -0.49999999999999817 + 1.04744500833281083E-014 -4.93770312208088725E-015 -3.49148336110939429E-015 + -9.87540624416177450E-015 0.0000000000000000 -9.87540624416177450E-015 + 3.49148336110939429E-015 -4.93770312208088725E-015 -1.04744500833281083E-014 + -0.49999999999999817 0.70710678118654757 -0.50000000000000178 + 0.70710678118654757 -3.60822483003175876E-015 -0.70710678118654757 + -0.50000000000000178 -0.70710678118654757 -0.49999999999999817 + 1.04744500833281083E-014 -4.93770312208088725E-015 -3.49148336110939429E-015 + -9.87540624416177450E-015 0.0000000000000000 -9.87540624416177450E-015 + 3.49148336110939429E-015 -4.93770312208088725E-015 -1.04744500833281083E-014 + -0.49999999999999817 0.70710678118654757 -0.50000000000000178 + 0.70710678118654757 -3.60822483003175876E-015 -0.70710678118654757 + -0.50000000000000178 -0.70710678118654757 -0.49999999999999817 + 1.04744500833281083E-014 -4.93770312208088725E-015 -3.49148336110939429E-015 + -9.87540624416177450E-015 0.0000000000000000 -9.87540624416177450E-015 + 3.49148336110939429E-015 -4.93770312208088725E-015 -1.04744500833281083E-014 + -0.49999999999999994 0.86602538896304504 0.0000000000000000 -6.28167800134663320E-015 0.0000000000000000 + 0.86602538896304493 0.49999998288572906 0.0000000000000000 3.61121259316941049E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -3.61121259316941049E-015 0.0000000000000000 0.99999996577145822 + 6.24962862378874273E-015 -3.61121259316941049E-015 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 -3.68971721476004985E-015 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.01521217242580258E-028 0.0000000000000000 2.79318659328079827E-014 + 2.41897058869020169E-014 1.39659329664039914E-014 0.0000000000000000 1.00405599470683772E-028 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.39659329664039914E-014 0.0000000000000000 5.02027997353418859E-029 + -8.72818974122852854E-029 5.02027997353418859E-029 0.0000000000000000 1.39659329664039914E-014 0.0000000000000000 + 0.49999999999999817 -0.70710678118654757 0.50000000000000178 + 0.70710678118654757 -3.60822483003175876E-015 -0.70710678118654757 + 0.50000000000000178 0.70710678118654757 0.49999999999999817 + -6.98296672221873889E-015 9.87540624416177450E-015 -6.98296672221878859E-015 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 6.98296672221878859E-015 9.87540624416177450E-015 6.98296672221873889E-015 + 0.49999999999999817 -0.70710678118654757 0.50000000000000178 + 0.70710678118654757 -3.60822483003175876E-015 -0.70710678118654757 + 0.50000000000000178 0.70710678118654757 0.49999999999999817 + -6.98296672221873889E-015 9.87540624416177450E-015 -6.98296672221878859E-015 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 6.98296672221878859E-015 9.87540624416177450E-015 6.98296672221873889E-015 + 0.49999999999999817 -0.70710678118654757 0.50000000000000178 + 0.70710678118654757 -3.60822483003175876E-015 -0.70710678118654757 + 0.50000000000000178 0.70710678118654757 0.49999999999999817 + -6.98296672221873889E-015 9.87540624416177450E-015 -6.98296672221878859E-015 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 6.98296672221878859E-015 9.87540624416177450E-015 6.98296672221873889E-015 + -0.49999999999999994 0.86602538896304504 0.0000000000000000 6.28167800134663320E-015 0.0000000000000000 + 0.86602538896304493 0.49999998288572906 0.0000000000000000 -3.61121259316941049E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -3.61121259316941049E-015 0.0000000000000000 -0.99999996577145822 + 6.24962862378874273E-015 -3.61121259316941049E-015 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 3.68971721476004985E-015 + 0.0000000000000000 0.0000000000000000 1.20948529434510100E-014 0.0000000000000000 -4.38647484430972164E-029 + 0.0000000000000000 0.0000000000000000 6.98296648320189312E-015 0.0000000000000000 -2.79318659328079575E-014 + 2.41897058869020169E-014 1.39659329664039377E-014 0.0000000000000000 6.98296648320189549E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.39659329664039409E-014 0.0000000000000000 -6.98296648320204695E-015 + -8.72818974122852854E-029 -1.39659329664039409E-014 0.0000000000000000 -1.39659329664040166E-014 0.0000000000000000 + 0.49999999999999817 0.70710678118654757 0.50000000000000178 + 0.70710678118654757 3.60822483003175876E-015 -0.70710678118654757 + 0.50000000000000178 -0.70710678118654757 0.49999999999999817 + -1.04744500833281083E-014 -9.87540624416177450E-015 -3.49148336110939429E-015 + -4.93770312208088725E-015 0.0000000000000000 -4.93770312208088725E-015 + 3.49148336110939429E-015 -9.87540624416177450E-015 1.04744500833281083E-014 + 0.49999999999999817 0.70710678118654757 0.50000000000000178 + 0.70710678118654757 3.60822483003175876E-015 -0.70710678118654757 + 0.50000000000000178 -0.70710678118654757 0.49999999999999817 + -1.04744500833281083E-014 -9.87540624416177450E-015 -3.49148336110939429E-015 + -4.93770312208088725E-015 0.0000000000000000 -4.93770312208088725E-015 + 3.49148336110939429E-015 -9.87540624416177450E-015 1.04744500833281083E-014 + 0.49999999999999817 0.70710678118654757 0.50000000000000178 + 0.70710678118654757 3.60822483003175876E-015 -0.70710678118654757 + 0.50000000000000178 -0.70710678118654757 0.49999999999999817 + -1.04744500833281083E-014 -9.87540624416177450E-015 -3.49148336110939429E-015 + -4.93770312208088725E-015 0.0000000000000000 -4.93770312208088725E-015 + 3.49148336110939429E-015 -9.87540624416177450E-015 1.04744500833281083E-014 + -0.49999999999999994 0.86602538896304504 0.0000000000000000 6.28167800134663320E-015 0.0000000000000000 + -0.86602538896304493 -0.49999998288572906 0.0000000000000000 3.61121259316941049E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 3.61121259316941049E-015 0.0000000000000000 0.99999996577145822 + -2.18204743530713214E-029 -1.39659329664039787E-014 0.0000000000000000 -3.49148324160102348E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 3.49148324160094774E-015 0.0000000000000000 -6.98296648320200830E-015 + 0.0000000000000000 0.0000000000000000 1.20948529434510100E-014 0.0000000000000000 -4.38647484430972164E-029 + 0.0000000000000000 0.0000000000000000 -6.98296648320196885E-015 0.0000000000000000 6.98296648320197043E-015 + -6.04742647172550423E-015 -3.49148324160094656E-015 0.0000000000000000 -6.98296648320197043E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 -3.68971721476004985E-015 + -6.24962862378874273E-015 3.61121259316941049E-015 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + -5.23722504166405417E-015 -2.46885156104044363E-015 1.74574168055469715E-015 + 0.70710678118654757 3.60822483003175876E-015 -0.70710678118654757 + 1.74574168055469715E-015 2.46885156104044363E-015 -5.23722504166405417E-015 + -0.49999999999999817 -0.70710678118654757 -0.50000000000000178 + -4.93770312208088725E-015 0.0000000000000000 -4.93770312208088725E-015 + 0.50000000000000178 -0.70710678118654757 0.49999999999999817 + -5.23722504166405417E-015 -2.46885156104044363E-015 1.74574168055469715E-015 + 0.70710678118654757 3.60822483003175876E-015 -0.70710678118654757 + 1.74574168055469715E-015 2.46885156104044363E-015 -5.23722504166405417E-015 + -0.49999999999999817 -0.70710678118654757 -0.50000000000000178 + -4.93770312208088725E-015 0.0000000000000000 -4.93770312208088725E-015 + 0.50000000000000178 -0.70710678118654757 0.49999999999999817 + -5.23722504166405417E-015 -2.46885156104044363E-015 1.74574168055469715E-015 + 0.70710678118654757 3.60822483003175876E-015 -0.70710678118654757 + 1.74574168055469715E-015 2.46885156104044363E-015 -5.23722504166405417E-015 + -0.49999999999999817 -0.70710678118654757 -0.50000000000000178 + -4.93770312208088725E-015 0.0000000000000000 -4.93770312208088725E-015 + 0.50000000000000178 -0.70710678118654757 0.49999999999999817 + -0.49999999999999994 0.86602538896304504 0.0000000000000000 -6.28167800134663320E-015 0.0000000000000000 + -0.86602538896304493 -0.49999998288572906 0.0000000000000000 -3.61121259316941049E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 3.61121259316941049E-015 0.0000000000000000 -0.99999996577145822 + -2.18204743530713214E-029 1.25506999338354715E-029 0.0000000000000000 3.49148324160099784E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 3.49148324160099784E-015 0.0000000000000000 1.25506999338354715E-029 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 2.53803043106450645E-029 0.0000000000000000 -6.98296648320199568E-015 + -6.04742647172550423E-015 -3.49148324160099784E-015 0.0000000000000000 -2.51013998676709429E-029 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 3.68971721476004985E-015 + -6.24962862378874273E-015 3.61121259316941049E-015 0.0000000000000000 0.99999996577145822 0.0000000000000000 + -1.74574168055468472E-015 2.46885156104044363E-015 -1.74574168055469715E-015 + 0.70710678118654757 -3.60822483003175876E-015 -0.70710678118654757 + -1.74574168055469715E-015 -2.46885156104044363E-015 -1.74574168055468472E-015 + -0.49999999999999817 0.70710678118654757 -0.50000000000000178 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.50000000000000178 0.70710678118654757 0.49999999999999817 + -1.74574168055468472E-015 2.46885156104044363E-015 -1.74574168055469715E-015 + 0.70710678118654757 -3.60822483003175876E-015 -0.70710678118654757 + -1.74574168055469715E-015 -2.46885156104044363E-015 -1.74574168055468472E-015 + -0.49999999999999817 0.70710678118654757 -0.50000000000000178 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.50000000000000178 0.70710678118654757 0.49999999999999817 + -1.74574168055468472E-015 2.46885156104044363E-015 -1.74574168055469715E-015 + 0.70710678118654757 -3.60822483003175876E-015 -0.70710678118654757 + -1.74574168055469715E-015 -2.46885156104044363E-015 -1.74574168055468472E-015 + -0.49999999999999817 0.70710678118654757 -0.50000000000000178 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.50000000000000178 0.70710678118654757 0.49999999999999817 + 1.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 -3.49148324160099784E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 -3.49148324160099784E-015 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -6.98296648320199568E-015 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -6.98296648320199568E-015 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 3.49148336110938207E-015 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -1.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 3.49148336110938207E-015 + 1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.0000000000000000 + 3.49148336110938207E-015 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -1.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 3.49148336110938207E-015 + 1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.0000000000000000 + 3.49148336110938207E-015 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -1.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 3.49148336110938207E-015 + 1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.0000000000000000 + 1.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 1.04744497248029943E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 1.04744497248029943E-014 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -2.09488994496059886E-014 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -2.09488994496059886E-014 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 1.04744500833281462E-014 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 1.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.04744500833281462E-014 + 1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.0000000000000000 + 1.04744500833281462E-014 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 1.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.04744500833281462E-014 + 1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.0000000000000000 + 1.04744500833281462E-014 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 1.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.04744500833281462E-014 + 1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.0000000000000000 + -0.49999999999999994 -0.86602538896304504 0.0000000000000000 -6.57971226646458218E-029 0.0000000000000000 + 0.86602538896304493 -0.49999998288572906 0.0000000000000000 -2.79318659328079480E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 3.61121259316941049E-015 0.0000000000000000 1.04744497248028933E-014 + 6.24962862378874273E-015 3.61121259316941049E-015 0.0000000000000000 -1.04744497248030448E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 -1.39659329664040292E-014 + 0.0000000000000000 0.0000000000000000 -1.81422794151765151E-014 0.0000000000000000 -6.28167800134663320E-015 + 0.0000000000000000 0.0000000000000000 -1.04744497248028917E-014 0.0000000000000000 3.61121259316941049E-015 + 2.41897058869020169E-014 -1.39659329664039156E-014 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.39659329664039156E-014 0.0000000000000000 -0.99999996577145822 + -8.72818974122852854E-029 2.09488994496059381E-014 0.0000000000000000 -3.68971721476004985E-015 0.0000000000000000 + 1.22201917638827931E-014 -0.70710678118654757 -1.74574168055469715E-015 + 7.40655468312133048E-015 -3.60822483003175876E-015 -7.40655468312133048E-015 + -1.74574168055469715E-015 0.70710678118654757 1.22201917638827931E-014 + 0.49999999999999817 9.87540624416177450E-015 -0.50000000000000178 + 0.70710678118654757 0.0000000000000000 0.70710678118654757 + 0.50000000000000178 9.87540624416177450E-015 -0.49999999999999817 + 1.22201917638827931E-014 -0.70710678118654757 -1.74574168055469715E-015 + 7.40655468312133048E-015 -3.60822483003175876E-015 -7.40655468312133048E-015 + -1.74574168055469715E-015 0.70710678118654757 1.22201917638827931E-014 + 0.49999999999999817 9.87540624416177450E-015 -0.50000000000000178 + 0.70710678118654757 0.0000000000000000 0.70710678118654757 + 0.50000000000000178 9.87540624416177450E-015 -0.49999999999999817 + 1.22201917638827931E-014 -0.70710678118654757 -1.74574168055469715E-015 + 7.40655468312133048E-015 -3.60822483003175876E-015 -7.40655468312133048E-015 + -1.74574168055469715E-015 0.70710678118654757 1.22201917638827931E-014 + 0.49999999999999817 9.87540624416177450E-015 -0.50000000000000178 + 0.70710678118654757 0.0000000000000000 0.70710678118654757 + 0.50000000000000178 9.87540624416177450E-015 -0.49999999999999817 + -0.49999999999999994 -0.86602538896304504 0.0000000000000000 2.19323742215486082E-029 0.0000000000000000 + 0.86602538896304493 -0.49999998288572906 0.0000000000000000 2.79318659328079764E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 3.61121259316941049E-015 0.0000000000000000 -3.49148324160089765E-015 + 6.24962862378874273E-015 3.61121259316941049E-015 0.0000000000000000 3.49148324160104911E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 1.39659329664040024E-014 + 0.0000000000000000 0.0000000000000000 -6.04742647172550502E-015 0.0000000000000000 6.28167800134663320E-015 + 0.0000000000000000 0.0000000000000000 -3.49148324160089647E-015 0.0000000000000000 -3.61121259316941049E-015 + 2.41897058869020169E-014 -1.39659329664039645E-014 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.39659329664039645E-014 0.0000000000000000 0.99999996577145822 + -8.72818974122852854E-029 6.98296648320194598E-015 0.0000000000000000 3.68971721476004985E-015 0.0000000000000000 + 8.72870840277342361E-015 0.70710678118654757 -5.23722504166409203E-015 + 2.46885156104044363E-015 3.60822483003175876E-015 -2.46885156104044363E-015 + -5.23722504166409203E-015 -0.70710678118654757 8.72870840277342361E-015 + 0.49999999999999817 -9.87540624416177450E-015 -0.50000000000000178 + 0.70710678118654757 0.0000000000000000 0.70710678118654757 + 0.50000000000000178 -9.87540624416177450E-015 -0.49999999999999817 + 8.72870840277342361E-015 0.70710678118654757 -5.23722504166409203E-015 + 2.46885156104044363E-015 3.60822483003175876E-015 -2.46885156104044363E-015 + -5.23722504166409203E-015 -0.70710678118654757 8.72870840277342361E-015 + 0.49999999999999817 -9.87540624416177450E-015 -0.50000000000000178 + 0.70710678118654757 0.0000000000000000 0.70710678118654757 + 0.50000000000000178 -9.87540624416177450E-015 -0.49999999999999817 + 8.72870840277342361E-015 0.70710678118654757 -5.23722504166409203E-015 + 2.46885156104044363E-015 3.60822483003175876E-015 -2.46885156104044363E-015 + -5.23722504166409203E-015 -0.70710678118654757 8.72870840277342361E-015 + 0.49999999999999817 -9.87540624416177450E-015 -0.50000000000000178 + 0.70710678118654757 0.0000000000000000 0.70710678118654757 + 0.50000000000000178 -9.87540624416177450E-015 -0.49999999999999817 + -0.49999999999999994 -0.86602538896304504 0.0000000000000000 -6.57971226646458218E-029 0.0000000000000000 + 0.86602538896304493 -0.49999998288572906 0.0000000000000000 -1.39659329664039535E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 3.61121259316941049E-015 0.0000000000000000 1.04744497248029422E-014 + -6.24962862378874273E-015 -3.61121259316941049E-015 0.0000000000000000 1.04744497248030180E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 6.98296648320203354E-015 + 0.0000000000000000 0.0000000000000000 -1.81422794151765151E-014 0.0000000000000000 -6.28167800134663320E-015 + 0.0000000000000000 0.0000000000000000 -1.04744497248029422E-014 0.0000000000000000 3.61121259316941049E-015 + 1.20948529434510085E-014 -6.98296648320191916E-015 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 6.98296648320191994E-015 0.0000000000000000 0.99999996577145822 + 4.36409487061426427E-029 -2.09488994496059602E-014 0.0000000000000000 3.68971721476004985E-015 0.0000000000000000 + 8.72870840277342361E-015 -0.70710678118654757 1.74574168055469715E-015 + -7.40655468312133048E-015 3.60822483003175876E-015 7.40655468312133048E-015 + 1.74574168055469715E-015 0.70710678118654757 8.72870840277342361E-015 + 0.49999999999999817 4.93770312208088725E-015 -0.50000000000000178 + -0.70710678118654757 0.0000000000000000 -0.70710678118654757 + 0.50000000000000178 4.93770312208088725E-015 -0.49999999999999817 + 8.72870840277342361E-015 -0.70710678118654757 1.74574168055469715E-015 + -7.40655468312133048E-015 3.60822483003175876E-015 7.40655468312133048E-015 + 1.74574168055469715E-015 0.70710678118654757 8.72870840277342361E-015 + 0.49999999999999817 4.93770312208088725E-015 -0.50000000000000178 + -0.70710678118654757 0.0000000000000000 -0.70710678118654757 + 0.50000000000000178 4.93770312208088725E-015 -0.49999999999999817 + 8.72870840277342361E-015 -0.70710678118654757 1.74574168055469715E-015 + -7.40655468312133048E-015 3.60822483003175876E-015 7.40655468312133048E-015 + 1.74574168055469715E-015 0.70710678118654757 8.72870840277342361E-015 + 0.49999999999999817 4.93770312208088725E-015 -0.50000000000000178 + -0.70710678118654757 0.0000000000000000 -0.70710678118654757 + 0.50000000000000178 4.93770312208088725E-015 -0.49999999999999817 + -0.49999999999999994 -0.86602538896304504 0.0000000000000000 2.19323742215486082E-029 0.0000000000000000 + 0.86602538896304493 -0.49999998288572906 0.0000000000000000 1.39659329664039787E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 3.61121259316941049E-015 0.0000000000000000 -3.49148324160094774E-015 + -6.24962862378874273E-015 -3.61121259316941049E-015 0.0000000000000000 -3.49148324160102348E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 -6.98296648320200830E-015 + 0.0000000000000000 0.0000000000000000 -6.04742647172550502E-015 0.0000000000000000 6.28167800134663320E-015 + 0.0000000000000000 0.0000000000000000 -3.49148324160094656E-015 0.0000000000000000 -3.61121259316941049E-015 + 1.20948529434510085E-014 -6.98296648320196885E-015 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 6.98296648320197043E-015 0.0000000000000000 -0.99999996577145822 + 4.36409487061426427E-029 -6.98296648320197043E-015 0.0000000000000000 -3.68971721476004985E-015 0.0000000000000000 + 5.23722504166405417E-015 0.70710678118654757 -1.74574168055469715E-015 + -2.46885156104044363E-015 -3.60822483003175876E-015 2.46885156104044363E-015 + -1.74574168055469715E-015 -0.70710678118654757 5.23722504166405417E-015 + 0.49999999999999817 -4.93770312208088725E-015 -0.50000000000000178 + -0.70710678118654757 0.0000000000000000 -0.70710678118654757 + 0.50000000000000178 -4.93770312208088725E-015 -0.49999999999999817 + 5.23722504166405417E-015 0.70710678118654757 -1.74574168055469715E-015 + -2.46885156104044363E-015 -3.60822483003175876E-015 2.46885156104044363E-015 + -1.74574168055469715E-015 -0.70710678118654757 5.23722504166405417E-015 + 0.49999999999999817 -4.93770312208088725E-015 -0.50000000000000178 + -0.70710678118654757 0.0000000000000000 -0.70710678118654757 + 0.50000000000000178 -4.93770312208088725E-015 -0.49999999999999817 + 5.23722504166405417E-015 0.70710678118654757 -1.74574168055469715E-015 + -2.46885156104044363E-015 -3.60822483003175876E-015 2.46885156104044363E-015 + -1.74574168055469715E-015 -0.70710678118654757 5.23722504166405417E-015 + 0.49999999999999817 -4.93770312208088725E-015 -0.50000000000000178 + -0.70710678118654757 0.0000000000000000 -0.70710678118654757 + 0.50000000000000178 -4.93770312208088725E-015 -0.49999999999999817 + 1.0000000000000000 4.22289288891124235E-029 0.0000000000000000 1.20948459381153518E-014 0.0000000000000000 + -4.22289288891124235E-029 -0.99999996577145822 0.0000000000000000 6.98296243866963709E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 6.98296243866963709E-015 + 4.22289533481111428E-029 -2.43808971658668317E-029 0.0000000000000000 -3.49148324160099784E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -2.43808971658668317E-029 0.0000000000000000 3.49148324160099784E-015 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 6.98296648320199568E-015 0.0000000000000000 4.87617943317336634E-029 + -2.94883205147614688E-043 -6.98296648320199568E-015 0.0000000000000000 4.87617943317336634E-029 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -6.98296243866963709E-015 0.0000000000000000 0.99999996577145822 + 1.20948459381153518E-014 -6.98296243866963709E-015 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + -4.25627251962987592E-044 -1.72398983074928941E-029 -3.49148336110938207E-015 + -4.93770026216453148E-015 -1.0000000000000000 4.93770026216453148E-015 + -3.49148336110938207E-015 1.72398983074928941E-029 -4.25627251962987592E-044 + -1.21904419394898395E-029 -4.93770026216453148E-015 -1.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 1.0000000000000000 -4.93770026216453148E-015 1.21904419394898395E-029 + -4.25627251962987592E-044 -1.72398983074928941E-029 -3.49148336110938207E-015 + -4.93770026216453148E-015 -1.0000000000000000 4.93770026216453148E-015 + -3.49148336110938207E-015 1.72398983074928941E-029 -4.25627251962987592E-044 + -1.21904419394898395E-029 -4.93770026216453148E-015 -1.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 1.0000000000000000 -4.93770026216453148E-015 1.21904419394898395E-029 + -4.25627251962987592E-044 -1.72398983074928941E-029 -3.49148336110938207E-015 + -4.93770026216453148E-015 -1.0000000000000000 4.93770026216453148E-015 + -3.49148336110938207E-015 1.72398983074928941E-029 -4.25627251962987592E-044 + -1.21904419394898395E-029 -4.93770026216453148E-015 -1.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 1.0000000000000000 -4.93770026216453148E-015 1.21904419394898395E-029 + 1.0000000000000000 4.22289288891124235E-029 0.0000000000000000 1.20948459381153518E-014 0.0000000000000000 + -4.22289288891124235E-029 -0.99999996577145822 0.0000000000000000 6.98296243866963709E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 6.98296243866963709E-015 + -1.26686860044333440E-028 7.31426914976004895E-029 0.0000000000000000 1.04744497248029943E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 7.31426914976004895E-029 0.0000000000000000 -1.04744497248029943E-014 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 2.09488994496059886E-014 0.0000000000000000 1.46285382995200979E-028 + -8.84649615442844023E-043 -2.09488994496059886E-014 0.0000000000000000 1.46285382995200979E-028 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 6.98296243866963709E-015 0.0000000000000000 -0.99999996577145822 + -1.20948459381153518E-014 6.98296243866963709E-015 0.0000000000000000 0.99999996577145822 0.0000000000000000 + -1.27688175588896272E-043 -5.17196949224786880E-029 -1.04744500833281462E-014 + 4.93770026216453148E-015 1.0000000000000000 -4.93770026216453148E-015 + -1.04744500833281462E-014 5.17196949224786880E-029 -1.27688175588896272E-043 + -1.21904419394898395E-029 -4.93770026216453148E-015 -1.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 1.0000000000000000 -4.93770026216453148E-015 1.21904419394898395E-029 + -1.27688175588896272E-043 -5.17196949224786880E-029 -1.04744500833281462E-014 + 4.93770026216453148E-015 1.0000000000000000 -4.93770026216453148E-015 + -1.04744500833281462E-014 5.17196949224786880E-029 -1.27688175588896272E-043 + -1.21904419394898395E-029 -4.93770026216453148E-015 -1.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 1.0000000000000000 -4.93770026216453148E-015 1.21904419394898395E-029 + -1.27688175588896272E-043 -5.17196949224786880E-029 -1.04744500833281462E-014 + 4.93770026216453148E-015 1.0000000000000000 -4.93770026216453148E-015 + -1.04744500833281462E-014 5.17196949224786880E-029 -1.27688175588896272E-043 + -1.21904419394898395E-029 -4.93770026216453148E-015 -1.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 1.0000000000000000 -4.93770026216453148E-015 1.21904419394898395E-029 + 1.0000000000000000 4.22289288891124235E-029 0.0000000000000000 1.20948459381153518E-014 0.0000000000000000 + 4.22289288891124235E-029 0.99999996577145822 0.0000000000000000 -6.98296243866963709E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 -6.98296243866963709E-015 + 1.20948459381153518E-014 -6.98296243866963709E-015 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -6.98296243866963709E-015 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.39659329664039914E-014 0.0000000000000000 -9.75235886634673268E-029 + 5.89766410295229375E-043 1.39659329664039914E-014 0.0000000000000000 -9.75235886634673268E-029 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 4.87617943317336634E-029 0.0000000000000000 -6.98296648320199568E-015 + -8.44579066962222856E-029 4.87617943317336634E-029 0.0000000000000000 6.98296648320199568E-015 0.0000000000000000 + -1.21904419394898395E-029 -4.93770026216453148E-015 -1.0000000000000000 + -4.93770026216453148E-015 -1.0000000000000000 4.93770026216453148E-015 + -1.0000000000000000 4.93770026216453148E-015 -1.21904419394898395E-029 + 8.51254503925975183E-044 3.44797966149857882E-029 6.98296672221876413E-015 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -6.98296672221876413E-015 3.44797966149857882E-029 -8.51254503925975183E-044 + -1.21904419394898395E-029 -4.93770026216453148E-015 -1.0000000000000000 + -4.93770026216453148E-015 -1.0000000000000000 4.93770026216453148E-015 + -1.0000000000000000 4.93770026216453148E-015 -1.21904419394898395E-029 + 8.51254503925975183E-044 3.44797966149857882E-029 6.98296672221876413E-015 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -6.98296672221876413E-015 3.44797966149857882E-029 -8.51254503925975183E-044 + -1.21904419394898395E-029 -4.93770026216453148E-015 -1.0000000000000000 + -4.93770026216453148E-015 -1.0000000000000000 4.93770026216453148E-015 + -1.0000000000000000 4.93770026216453148E-015 -1.21904419394898395E-029 + 8.51254503925975183E-044 3.44797966149857882E-029 6.98296672221876413E-015 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -6.98296672221876413E-015 3.44797966149857882E-029 -8.51254503925975183E-044 + 1.0000000000000000 4.22289288891124235E-029 0.0000000000000000 1.20948459381153518E-014 0.0000000000000000 + 4.22289288891124235E-029 0.99999996577145822 0.0000000000000000 -6.98296243866963709E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 -6.98296243866963709E-015 + -1.20948459381153518E-014 6.98296243866963709E-015 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 6.98296243866963709E-015 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -2.79318659328079827E-014 0.0000000000000000 -1.95047177326934654E-028 + 1.17953282059045875E-042 2.79318659328079827E-014 0.0000000000000000 -1.95047177326934654E-028 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -9.75235886634673268E-029 0.0000000000000000 1.39659329664039914E-014 + 1.68915813392444571E-028 -9.75235886634673268E-029 0.0000000000000000 -1.39659329664039914E-014 0.0000000000000000 + -1.21904419394898395E-029 -4.93770026216453148E-015 -1.0000000000000000 + 4.93770026216453148E-015 1.0000000000000000 -4.93770026216453148E-015 + -1.0000000000000000 4.93770026216453148E-015 -1.21904419394898395E-029 + 1.70250900785195037E-043 6.89595932299715765E-029 1.39659334444375283E-014 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -1.39659334444375283E-014 6.89595932299715765E-029 -1.70250900785195037E-043 + -1.21904419394898395E-029 -4.93770026216453148E-015 -1.0000000000000000 + 4.93770026216453148E-015 1.0000000000000000 -4.93770026216453148E-015 + -1.0000000000000000 4.93770026216453148E-015 -1.21904419394898395E-029 + 1.70250900785195037E-043 6.89595932299715765E-029 1.39659334444375283E-014 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -1.39659334444375283E-014 6.89595932299715765E-029 -1.70250900785195037E-043 + -1.21904419394898395E-029 -4.93770026216453148E-015 -1.0000000000000000 + 4.93770026216453148E-015 1.0000000000000000 -4.93770026216453148E-015 + -1.0000000000000000 4.93770026216453148E-015 -1.21904419394898395E-029 + 1.70250900785195037E-043 6.89595932299715765E-029 1.39659334444375283E-014 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + -1.39659334444375283E-014 6.89595932299715765E-029 -1.70250900785195037E-043 + -0.49999999999999994 -0.86602538896304504 0.0000000000000000 2.19323742215486082E-029 0.0000000000000000 + -0.86602538896304493 0.49999998288572906 0.0000000000000000 -6.98296648320198226E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -3.61121259316941049E-015 0.0000000000000000 3.49148324160097299E-015 + -2.18204743530713214E-029 6.98296648320198226E-015 0.0000000000000000 3.68971721476004985E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -3.49148324160097299E-015 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 0.0000000000000000 -6.04742647172550502E-015 0.0000000000000000 6.28167800134663320E-015 + 0.0000000000000000 0.0000000000000000 3.49148324160097220E-015 0.0000000000000000 3.61121259316941049E-015 + -6.04742647172550423E-015 3.49148324160097220E-015 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 -3.49148324160101006E-015 + -6.24962862378874273E-015 -3.61121259316941049E-015 0.0000000000000000 -3.49148324160101006E-015 0.0000000000000000 + 0.49999999999999817 -2.46885156104044363E-015 -0.50000000000000178 + 2.46885156104044363E-015 3.60822483003175876E-015 -2.46885156104044363E-015 + -0.50000000000000178 2.46885156104044363E-015 0.49999999999999817 + -3.49148336110936944E-015 -0.70710678118654757 0.0000000000000000 + 0.70710678118654757 0.0000000000000000 0.70710678118654757 + 0.0000000000000000 -0.70710678118654757 3.49148336110936944E-015 + 0.49999999999999817 -2.46885156104044363E-015 -0.50000000000000178 + 2.46885156104044363E-015 3.60822483003175876E-015 -2.46885156104044363E-015 + -0.50000000000000178 2.46885156104044363E-015 0.49999999999999817 + -3.49148336110936944E-015 -0.70710678118654757 0.0000000000000000 + 0.70710678118654757 0.0000000000000000 0.70710678118654757 + 0.0000000000000000 -0.70710678118654757 3.49148336110936944E-015 + 0.49999999999999817 -2.46885156104044363E-015 -0.50000000000000178 + 2.46885156104044363E-015 3.60822483003175876E-015 -2.46885156104044363E-015 + -0.50000000000000178 2.46885156104044363E-015 0.49999999999999817 + -3.49148336110936944E-015 -0.70710678118654757 0.0000000000000000 + 0.70710678118654757 0.0000000000000000 0.70710678118654757 + 0.0000000000000000 -0.70710678118654757 3.49148336110936944E-015 + -0.49999999999999994 -0.86602538896304504 0.0000000000000000 -6.57971226646458218E-029 0.0000000000000000 + -0.86602538896304493 0.49999998288572906 0.0000000000000000 6.98296648320195781E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -3.61121259316941049E-015 0.0000000000000000 -1.04744497248029691E-014 + -2.18204743530713214E-029 2.09488994496059760E-014 0.0000000000000000 -3.68971721476004985E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -3.49148324160092211E-015 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 0.0000000000000000 -1.81422794151765151E-014 0.0000000000000000 -6.28167800134663320E-015 + 0.0000000000000000 0.0000000000000000 1.04744497248029675E-014 0.0000000000000000 -3.61121259316941049E-015 + -6.04742647172550423E-015 3.49148324160092171E-015 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 3.49148324160103531E-015 + -6.24962862378874273E-015 -3.61121259316941049E-015 0.0000000000000000 1.04744497248030053E-014 0.0000000000000000 + 0.49999999999999817 2.46885156104044363E-015 -0.50000000000000178 + 7.40655468312133048E-015 -3.60822483003175876E-015 -7.40655468312133048E-015 + -0.50000000000000178 -2.46885156104044363E-015 0.49999999999999817 + -6.98296672221873889E-015 0.70710678118654757 -3.49148336110939429E-015 + 0.70710678118654757 0.0000000000000000 0.70710678118654757 + 3.49148336110939429E-015 0.70710678118654757 6.98296672221873889E-015 + 0.49999999999999817 2.46885156104044363E-015 -0.50000000000000178 + 7.40655468312133048E-015 -3.60822483003175876E-015 -7.40655468312133048E-015 + -0.50000000000000178 -2.46885156104044363E-015 0.49999999999999817 + -6.98296672221873889E-015 0.70710678118654757 -3.49148336110939429E-015 + 0.70710678118654757 0.0000000000000000 0.70710678118654757 + 3.49148336110939429E-015 0.70710678118654757 6.98296672221873889E-015 + 0.49999999999999817 2.46885156104044363E-015 -0.50000000000000178 + 7.40655468312133048E-015 -3.60822483003175876E-015 -7.40655468312133048E-015 + -0.50000000000000178 -2.46885156104044363E-015 0.49999999999999817 + -6.98296672221873889E-015 0.70710678118654757 -3.49148336110939429E-015 + 0.70710678118654757 0.0000000000000000 0.70710678118654757 + 3.49148336110939429E-015 0.70710678118654757 6.98296672221873889E-015 + -0.49999999999999994 -0.86602538896304504 0.0000000000000000 2.19323742215486082E-029 0.0000000000000000 + -0.86602538896304493 0.49999998288572906 0.0000000000000000 -2.09488994496059760E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -3.61121259316941049E-015 0.0000000000000000 3.49148324160092211E-015 + 6.54614230592139585E-029 -6.98296648320195781E-015 0.0000000000000000 -3.68971721476004985E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.04744497248029691E-014 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 0.0000000000000000 -6.04742647172550502E-015 0.0000000000000000 6.28167800134663320E-015 + 0.0000000000000000 0.0000000000000000 3.49148324160092171E-015 0.0000000000000000 3.61121259316941049E-015 + -1.81422794151765119E-014 1.04744497248029675E-014 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 1.04744497248030053E-014 + 6.24962862378874273E-015 3.61121259316941049E-015 0.0000000000000000 3.49148324160103531E-015 0.0000000000000000 + 0.49999999999999817 -7.40655468312133048E-015 -0.50000000000000178 + -2.46885156104044363E-015 -3.60822483003175876E-015 2.46885156104044363E-015 + -0.50000000000000178 7.40655468312133048E-015 0.49999999999999817 + -6.98296672221873889E-015 -0.70710678118654757 3.49148336110939429E-015 + -0.70710678118654757 0.0000000000000000 -0.70710678118654757 + -3.49148336110939429E-015 -0.70710678118654757 6.98296672221873889E-015 + 0.49999999999999817 -7.40655468312133048E-015 -0.50000000000000178 + -2.46885156104044363E-015 -3.60822483003175876E-015 2.46885156104044363E-015 + -0.50000000000000178 7.40655468312133048E-015 0.49999999999999817 + -6.98296672221873889E-015 -0.70710678118654757 3.49148336110939429E-015 + -0.70710678118654757 0.0000000000000000 -0.70710678118654757 + -3.49148336110939429E-015 -0.70710678118654757 6.98296672221873889E-015 + 0.49999999999999817 -7.40655468312133048E-015 -0.50000000000000178 + -2.46885156104044363E-015 -3.60822483003175876E-015 2.46885156104044363E-015 + -0.50000000000000178 7.40655468312133048E-015 0.49999999999999817 + -6.98296672221873889E-015 -0.70710678118654757 3.49148336110939429E-015 + -0.70710678118654757 0.0000000000000000 -0.70710678118654757 + -3.49148336110939429E-015 -0.70710678118654757 6.98296672221873889E-015 + -0.49999999999999994 -0.86602538896304504 0.0000000000000000 -6.57971226646458218E-029 0.0000000000000000 + -0.86602538896304493 0.49999998288572906 0.0000000000000000 2.09488994496059507E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -3.61121259316941049E-015 0.0000000000000000 -1.04744497248029186E-014 + 6.54614230592139585E-029 -2.09488994496059507E-014 0.0000000000000000 3.68971721476004985E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.04744497248029186E-014 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 0.0000000000000000 -1.81422794151765151E-014 0.0000000000000000 -6.28167800134663320E-015 + 0.0000000000000000 0.0000000000000000 1.04744497248029154E-014 0.0000000000000000 -3.61121259316941049E-015 + -1.81422794151765119E-014 1.04744497248029154E-014 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 -1.04744497248030322E-014 + 6.24962862378874273E-015 3.61121259316941049E-015 0.0000000000000000 -1.04744497248030322E-014 0.0000000000000000 + 0.49999999999999817 7.40655468312133048E-015 -0.50000000000000178 + -7.40655468312133048E-015 3.60822483003175876E-015 7.40655468312133048E-015 + -0.50000000000000178 -7.40655468312133048E-015 0.49999999999999817 + -1.04744500833281083E-014 0.70710678118654757 0.0000000000000000 + -0.70710678118654757 0.0000000000000000 -0.70710678118654757 + 0.0000000000000000 0.70710678118654757 1.04744500833281083E-014 + 0.49999999999999817 7.40655468312133048E-015 -0.50000000000000178 + -7.40655468312133048E-015 3.60822483003175876E-015 7.40655468312133048E-015 + -0.50000000000000178 -7.40655468312133048E-015 0.49999999999999817 + -1.04744500833281083E-014 0.70710678118654757 0.0000000000000000 + -0.70710678118654757 0.0000000000000000 -0.70710678118654757 + 0.0000000000000000 0.70710678118654757 1.04744500833281083E-014 + 0.49999999999999817 7.40655468312133048E-015 -0.50000000000000178 + -7.40655468312133048E-015 3.60822483003175876E-015 7.40655468312133048E-015 + -0.50000000000000178 -7.40655468312133048E-015 0.49999999999999817 + -1.04744500833281083E-014 0.70710678118654757 0.0000000000000000 + -0.70710678118654757 0.0000000000000000 -0.70710678118654757 + 0.0000000000000000 0.70710678118654757 1.04744500833281083E-014 + 1.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.39659329664039914E-014 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 1.39659329664039914E-014 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 6.98296648320199568E-015 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 6.98296648320199568E-015 0.0000000000000000 + 1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -1.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.0000000000000000 + -6.98296672221876413E-015 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 6.98296672221876413E-015 + 1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -1.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.0000000000000000 + -6.98296672221876413E-015 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 6.98296672221876413E-015 + 1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -1.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.0000000000000000 + -6.98296672221876413E-015 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 6.98296672221876413E-015 + 1.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 2.79318659328079827E-014 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 2.79318659328079827E-014 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 -1.39659329664039914E-014 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 -1.39659329664039914E-014 0.0000000000000000 + 1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 1.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.0000000000000000 + -1.39659334444375283E-014 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.39659334444375283E-014 + 1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 1.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.0000000000000000 + -1.39659334444375283E-014 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.39659334444375283E-014 + 1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 1.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.0000000000000000 + -1.39659334444375283E-014 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.39659334444375283E-014 + 1.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.0000000000000000 + 0.0000000000000000 1.0000000000000000 0.0000000000000000 + -1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.0000000000000000 + 0.0000000000000000 1.0000000000000000 0.0000000000000000 + -1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.0000000000000000 + 0.0000000000000000 1.0000000000000000 0.0000000000000000 + -1.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 diff --git a/test/SrVO3.symqmc b/test/SrVO3.symqmc new file mode 100644 index 00000000..e8b982e3 --- /dev/null +++ b/test/SrVO3.symqmc @@ -0,0 +1,343 @@ + 48 5 + 1 2 3 4 5 + 1 2 3 4 5 + 1 2 3 5 4 + 1 2 3 5 4 + 1 2 3 5 4 + 1 2 3 5 4 + 1 2 3 4 5 + 1 2 3 4 5 + 1 2 4 3 5 + 1 2 4 3 5 + 1 2 4 5 3 + 1 2 4 5 3 + 1 2 4 5 3 + 1 2 4 5 3 + 1 2 4 3 5 + 1 2 4 3 5 + 1 2 5 3 4 + 1 2 5 3 4 + 1 2 5 4 3 + 1 2 5 4 3 + 1 2 5 4 3 + 1 2 5 4 3 + 1 2 5 3 4 + 1 2 5 3 4 + 1 2 5 3 4 + 1 2 5 3 4 + 1 2 5 4 3 + 1 2 5 4 3 + 1 2 5 4 3 + 1 2 5 4 3 + 1 2 5 3 4 + 1 2 5 3 4 + 1 2 4 3 5 + 1 2 4 3 5 + 1 2 4 5 3 + 1 2 4 5 3 + 1 2 4 5 3 + 1 2 4 5 3 + 1 2 4 3 5 + 1 2 4 3 5 + 1 2 3 4 5 + 1 2 3 4 5 + 1 2 3 5 4 + 1 2 3 5 4 + 1 2 3 5 4 + 1 2 3 5 4 + 1 2 3 4 5 + 1 2 3 4 5 + 0.99999996577145822 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.39659329664039914E-014 + 0.0000000000000000 -1.39659329664039914E-014 0.0000000000000000 + 0.99999996577145822 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 6.98296648320199568E-015 + 0.0000000000000000 6.98296648320199568E-015 0.0000000000000000 + -3.61121259316941049E-015 0.0000000000000000 -1.04744497248029186E-014 + 0.0000000000000000 3.68971721476004985E-015 0.0000000000000000 + 1.04744497248029186E-014 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 0.99999996577145822 0.0000000000000000 -1.04744497248030322E-014 + 0.0000000000000000 -1.04744497248030322E-014 0.0000000000000000 + -3.61121259316941049E-015 0.0000000000000000 3.49148324160092211E-015 + 0.0000000000000000 -3.68971721476004985E-015 0.0000000000000000 + 1.04744497248029691E-014 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.99999996577145822 0.0000000000000000 1.04744497248030053E-014 + 0.0000000000000000 3.49148324160103531E-015 0.0000000000000000 + -3.61121259316941049E-015 0.0000000000000000 -1.04744497248029691E-014 + 0.0000000000000000 -3.68971721476004985E-015 0.0000000000000000 + -3.49148324160092211E-015 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + -0.99999996577145822 0.0000000000000000 3.49148324160103531E-015 + 0.0000000000000000 1.04744497248030053E-014 0.0000000000000000 + -3.61121259316941049E-015 0.0000000000000000 3.49148324160097299E-015 + 0.0000000000000000 3.68971721476004985E-015 0.0000000000000000 + -3.49148324160097299E-015 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + -0.99999996577145822 0.0000000000000000 -3.49148324160101006E-015 + 0.0000000000000000 -3.49148324160101006E-015 0.0000000000000000 + -0.99999996577145822 0.0000000000000000 -6.98296243866963709E-015 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 6.98296243866963709E-015 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 -1.95047177326934654E-028 0.0000000000000000 + -9.75235886634673268E-029 0.0000000000000000 1.39659329664039914E-014 + 0.0000000000000000 -1.39659329664039914E-014 0.0000000000000000 + -0.99999996577145822 0.0000000000000000 -6.98296243866963709E-015 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + -6.98296243866963709E-015 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 -9.75235886634673268E-029 0.0000000000000000 + 4.87617943317336634E-029 0.0000000000000000 -6.98296648320199568E-015 + 0.0000000000000000 6.98296648320199568E-015 0.0000000000000000 + 0.99999996577145822 0.0000000000000000 6.98296243866963709E-015 + 0.0000000000000000 1.04744497248029943E-014 0.0000000000000000 + 7.31426914976004895E-029 0.0000000000000000 -1.04744497248029943E-014 + 0.0000000000000000 1.46285382995200979E-028 0.0000000000000000 + 6.98296243866963709E-015 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.99999996577145822 0.0000000000000000 6.98296243866963709E-015 + 0.0000000000000000 -3.49148324160099784E-015 0.0000000000000000 + -2.43808971658668317E-029 0.0000000000000000 3.49148324160099784E-015 + 0.0000000000000000 4.87617943317336634E-029 0.0000000000000000 + -6.98296243866963709E-015 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 3.61121259316941049E-015 0.0000000000000000 -3.49148324160094774E-015 + 0.0000000000000000 -3.49148324160102348E-015 0.0000000000000000 + -0.99999996577145822 0.0000000000000000 -6.98296648320200830E-015 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 6.98296648320197043E-015 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 -3.68971721476004985E-015 0.0000000000000000 + 3.61121259316941049E-015 0.0000000000000000 1.04744497248029422E-014 + 0.0000000000000000 1.04744497248030180E-014 0.0000000000000000 + -0.99999996577145822 0.0000000000000000 6.98296648320203354E-015 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 6.98296648320191994E-015 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 3.68971721476004985E-015 0.0000000000000000 + 3.61121259316941049E-015 0.0000000000000000 -3.49148324160089765E-015 + 0.0000000000000000 3.49148324160104911E-015 0.0000000000000000 + 0.99999996577145822 0.0000000000000000 1.39659329664040024E-014 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + -1.39659329664039645E-014 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 3.68971721476004985E-015 0.0000000000000000 + 3.61121259316941049E-015 0.0000000000000000 1.04744497248028933E-014 + 0.0000000000000000 -1.04744497248030448E-014 0.0000000000000000 + 0.99999996577145822 0.0000000000000000 -1.39659329664040292E-014 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + -1.39659329664039156E-014 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 -3.68971721476004985E-015 0.0000000000000000 + -0.99999996577145822 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 1.04744497248029943E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.04744497248029943E-014 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + -0.99999996577145822 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -3.49148324160099784E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -3.49148324160099784E-015 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 3.61121259316941049E-015 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 3.49148324160099784E-015 0.0000000000000000 + 3.49148324160099784E-015 0.0000000000000000 1.25506999338354715E-029 + 0.0000000000000000 -2.51013998676709429E-029 0.0000000000000000 + 0.99999996577145822 0.0000000000000000 3.68971721476004985E-015 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 3.61121259316941049E-015 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 -3.49148324160102348E-015 0.0000000000000000 + 3.49148324160094774E-015 0.0000000000000000 -6.98296648320200830E-015 + 0.0000000000000000 -6.98296648320197043E-015 0.0000000000000000 + 0.99999996577145822 0.0000000000000000 -3.68971721476004985E-015 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + -3.61121259316941049E-015 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + -0.99999996577145822 0.0000000000000000 3.68971721476004985E-015 + 0.0000000000000000 6.98296648320189549E-015 0.0000000000000000 + 1.39659329664039409E-014 0.0000000000000000 -6.98296648320204695E-015 + 0.0000000000000000 -1.39659329664040166E-014 0.0000000000000000 + -3.61121259316941049E-015 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + -0.99999996577145822 0.0000000000000000 -3.68971721476004985E-015 + 0.0000000000000000 1.00405599470683772E-028 0.0000000000000000 + 1.39659329664039914E-014 0.0000000000000000 5.02027997353418859E-029 + 0.0000000000000000 1.39659329664039914E-014 0.0000000000000000 + -3.61121259316941049E-015 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.99999996577145822 0.0000000000000000 3.68971721476004985E-015 + 0.0000000000000000 -1.39659329664039409E-014 0.0000000000000000 + -6.98296648320189549E-015 0.0000000000000000 -1.39659329664040166E-014 + 0.0000000000000000 -6.98296648320204695E-015 0.0000000000000000 + -3.61121259316941049E-015 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 0.99999996577145822 0.0000000000000000 -3.68971721476004985E-015 + 0.0000000000000000 6.98296648320194598E-015 0.0000000000000000 + -6.98296648320194598E-015 0.0000000000000000 6.98296648320202013E-015 + 0.0000000000000000 6.98296648320202013E-015 0.0000000000000000 + 3.61121259316941049E-015 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 1.04744497248030180E-014 0.0000000000000000 + -1.04744497248029422E-014 0.0000000000000000 6.98296648320203354E-015 + 0.0000000000000000 -6.98296648320191994E-015 0.0000000000000000 + -0.99999996577145822 0.0000000000000000 3.68971721476004985E-015 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 3.61121259316941049E-015 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 -1.04744497248030448E-014 0.0000000000000000 + -1.04744497248028933E-014 0.0000000000000000 -1.39659329664040292E-014 + 0.0000000000000000 1.39659329664039156E-014 0.0000000000000000 + -0.99999996577145822 0.0000000000000000 -3.68971721476004985E-015 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 3.61121259316941049E-015 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 -1.04744497248030448E-014 0.0000000000000000 + -1.04744497248028933E-014 0.0000000000000000 -1.39659329664040292E-014 + 0.0000000000000000 1.39659329664039156E-014 0.0000000000000000 + -0.99999996577145822 0.0000000000000000 -3.68971721476004985E-015 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 3.61121259316941049E-015 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 1.04744497248030180E-014 0.0000000000000000 + -1.04744497248029422E-014 0.0000000000000000 6.98296648320203354E-015 + 0.0000000000000000 -6.98296648320191994E-015 0.0000000000000000 + -0.99999996577145822 0.0000000000000000 3.68971721476004985E-015 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + -3.61121259316941049E-015 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 0.99999996577145822 0.0000000000000000 -3.68971721476004985E-015 + 0.0000000000000000 6.98296648320194598E-015 0.0000000000000000 + -6.98296648320194598E-015 0.0000000000000000 6.98296648320202013E-015 + 0.0000000000000000 6.98296648320202013E-015 0.0000000000000000 + -3.61121259316941049E-015 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.99999996577145822 0.0000000000000000 3.68971721476004985E-015 + 0.0000000000000000 -1.39659329664039409E-014 0.0000000000000000 + -6.98296648320189549E-015 0.0000000000000000 -1.39659329664040166E-014 + 0.0000000000000000 -6.98296648320204695E-015 0.0000000000000000 + -3.61121259316941049E-015 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + -0.99999996577145822 0.0000000000000000 -3.68971721476004985E-015 + 0.0000000000000000 1.00405599470683772E-028 0.0000000000000000 + 1.39659329664039914E-014 0.0000000000000000 5.02027997353418859E-029 + 0.0000000000000000 1.39659329664039914E-014 0.0000000000000000 + -3.61121259316941049E-015 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + -0.99999996577145822 0.0000000000000000 3.68971721476004985E-015 + 0.0000000000000000 6.98296648320189549E-015 0.0000000000000000 + 1.39659329664039409E-014 0.0000000000000000 -6.98296648320204695E-015 + 0.0000000000000000 -1.39659329664040166E-014 0.0000000000000000 + 3.61121259316941049E-015 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 -3.49148324160102348E-015 0.0000000000000000 + 3.49148324160094774E-015 0.0000000000000000 -6.98296648320200830E-015 + 0.0000000000000000 -6.98296648320197043E-015 0.0000000000000000 + 0.99999996577145822 0.0000000000000000 -3.68971721476004985E-015 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 3.61121259316941049E-015 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 3.49148324160099784E-015 0.0000000000000000 + 3.49148324160099784E-015 0.0000000000000000 1.25506999338354715E-029 + 0.0000000000000000 -2.51013998676709429E-029 0.0000000000000000 + 0.99999996577145822 0.0000000000000000 3.68971721476004985E-015 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + -0.99999996577145822 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -3.49148324160099784E-015 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -3.49148324160099784E-015 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + -0.99999996577145822 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 1.04744497248029943E-014 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 1.04744497248029943E-014 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 3.61121259316941049E-015 0.0000000000000000 1.04744497248028933E-014 + 0.0000000000000000 -1.04744497248030448E-014 0.0000000000000000 + 0.99999996577145822 0.0000000000000000 -1.39659329664040292E-014 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + -1.39659329664039156E-014 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 -3.68971721476004985E-015 0.0000000000000000 + 3.61121259316941049E-015 0.0000000000000000 -3.49148324160089765E-015 + 0.0000000000000000 3.49148324160104911E-015 0.0000000000000000 + 0.99999996577145822 0.0000000000000000 1.39659329664040024E-014 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + -1.39659329664039645E-014 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 3.68971721476004985E-015 0.0000000000000000 + 3.61121259316941049E-015 0.0000000000000000 1.04744497248029422E-014 + 0.0000000000000000 1.04744497248030180E-014 0.0000000000000000 + -0.99999996577145822 0.0000000000000000 6.98296648320203354E-015 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 6.98296648320191994E-015 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 3.68971721476004985E-015 0.0000000000000000 + 3.61121259316941049E-015 0.0000000000000000 -3.49148324160094774E-015 + 0.0000000000000000 -3.49148324160102348E-015 0.0000000000000000 + -0.99999996577145822 0.0000000000000000 -6.98296648320200830E-015 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 6.98296648320197043E-015 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 -3.68971721476004985E-015 0.0000000000000000 + 0.99999996577145822 0.0000000000000000 6.98296243866963709E-015 + 0.0000000000000000 -3.49148324160099784E-015 0.0000000000000000 + -2.43808971658668317E-029 0.0000000000000000 3.49148324160099784E-015 + 0.0000000000000000 4.87617943317336634E-029 0.0000000000000000 + -6.98296243866963709E-015 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 0.99999996577145822 0.0000000000000000 6.98296243866963709E-015 + 0.0000000000000000 1.04744497248029943E-014 0.0000000000000000 + 7.31426914976004895E-029 0.0000000000000000 -1.04744497248029943E-014 + 0.0000000000000000 1.46285382995200979E-028 0.0000000000000000 + 6.98296243866963709E-015 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + -0.99999996577145822 0.0000000000000000 -6.98296243866963709E-015 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + -6.98296243866963709E-015 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 -9.75235886634673268E-029 0.0000000000000000 + 4.87617943317336634E-029 0.0000000000000000 -6.98296648320199568E-015 + 0.0000000000000000 6.98296648320199568E-015 0.0000000000000000 + -0.99999996577145822 0.0000000000000000 -6.98296243866963709E-015 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 6.98296243866963709E-015 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 -1.95047177326934654E-028 0.0000000000000000 + -9.75235886634673268E-029 0.0000000000000000 1.39659329664039914E-014 + 0.0000000000000000 -1.39659329664039914E-014 0.0000000000000000 + -3.61121259316941049E-015 0.0000000000000000 3.49148324160097299E-015 + 0.0000000000000000 3.68971721476004985E-015 0.0000000000000000 + -3.49148324160097299E-015 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + -0.99999996577145822 0.0000000000000000 -3.49148324160101006E-015 + 0.0000000000000000 -3.49148324160101006E-015 0.0000000000000000 + -3.61121259316941049E-015 0.0000000000000000 -1.04744497248029691E-014 + 0.0000000000000000 -3.68971721476004985E-015 0.0000000000000000 + -3.49148324160092211E-015 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + -0.99999996577145822 0.0000000000000000 3.49148324160103531E-015 + 0.0000000000000000 1.04744497248030053E-014 0.0000000000000000 + -3.61121259316941049E-015 0.0000000000000000 3.49148324160092211E-015 + 0.0000000000000000 -3.68971721476004985E-015 0.0000000000000000 + 1.04744497248029691E-014 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.99999996577145822 0.0000000000000000 1.04744497248030053E-014 + 0.0000000000000000 3.49148324160103531E-015 0.0000000000000000 + -3.61121259316941049E-015 0.0000000000000000 -1.04744497248029186E-014 + 0.0000000000000000 3.68971721476004985E-015 0.0000000000000000 + 1.04744497248029186E-014 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 0.99999996577145822 0.0000000000000000 -1.04744497248030322E-014 + 0.0000000000000000 -1.04744497248030322E-014 0.0000000000000000 + 0.99999996577145822 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 -0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 6.98296648320199568E-015 + 0.0000000000000000 6.98296648320199568E-015 0.0000000000000000 + 0.99999996577145822 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.99999996577145822 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -1.39659329664039914E-014 + 0.0000000000000000 -1.39659329664039914E-014 0.0000000000000000 + -0.99999996577145822 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.99999996577145822 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 -0.99999996577145822 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 + 0.0000000000000000 0.0000000000000000 0.0000000000000000 diff --git a/test/U_mat.output.h5 b/test/U_mat.output.h5 new file mode 100644 index 0000000000000000000000000000000000000000..94c36e52f4b26e075eb1fd3724bb47792516b5c7 GIT binary patch literal 12344 zcmeHNPe_zO6o23Ds+$_9bO@7J)TpBeOQT@7($GsvCRh+FSY0yoQc4&Ib+D_qZgmR+ zi*A+`9TFuXx`>C2j3hb)K~!Xxef!Nk>-&c3?R@VWx1tqx{=7f)-kaZhGqZKMt>xgx z(&|#keUeE?K!w-EuT}YJZV)p#MtZO8IITf$Ox#6wu2Y#xyOi7~1C3?SxEl8cE=?fck#-h|X}~rq<>OAT5QiDb zA(|?wHMhpsH#a%}hJEz)9&{b*XmKDetpZ3%KXrBp?*TeXbR1$H^LiKq^LzHcp1OXx z8Y>pT`m=FW*FIj~KAyB&m^>Fv+&=a!e#IBvRges;RnS)~`yD9p>VfzIH_uJ$MT56pj?4p02VINh?`Iv^ zu|e#2#r9v5Bv?nvK~zEq%H6*tWV3w(X9oLE4rjBTScO}SL_x}UV_E*tEq5;E&FA}d z^Yqn+->!X1Z#uBp@@45m8pjux7MjZDzORi@-`lCJcZ;i6(i2h+`B5I}L4KqoKgtLB zkse$>D3AJae{mdjTl3;rcFV+kI%>VB@7?{Qx6XAvx2E5={XIid^Hn2{wf1A4qQ9nX zwDylqnXbQBK3zYufA)c?9P+>Nr?g@ zn$FE1%72MJEk3#UFLeIe-aov5vEepLIo`NOqe zgc`iPw`h)A_*Q)WS zdhH2eKuwXe|oZ&v?R`_2CSCwlyuX;kf(`KvwuDf|fh&xU^g zn#JGD+Z?x9{+R3MN>K6V>Zjzn_kXJXQ|oizKa_roUg-KG^GBP1e*3lgtIa9=iv@c+O404l%|v;Y7A literal 0 HcmV?d00001 diff --git a/test/U_mat.py b/test/U_mat.py new file mode 100644 index 00000000..7b017dcf --- /dev/null +++ b/test/U_mat.py @@ -0,0 +1,51 @@ + +################################################################################ +# +# TRIQS: a Toolbox for Research in Interacting Quantum Systems +# +# Copyright (C) 2011 by M. Aichhorn, L. Pourovskii, V. Vildosola +# +# TRIQS is free software: you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation, either version 3 of the License, or (at your option) any later +# version. +# +# TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# TRIQS. If not, see . +# +################################################################################ + +from pytriqs.archive import * +import numpy +#from pytriqs.applications.dft.U_matrix import Umatrix +from U_matrix import Umatrix + +U = Umatrix(U_interact = 2.0, J_hund = 0.5, l=2) + +T = numpy.zeros([5,5],numpy.complex_) +sqtwo = 1.0/numpy.sqrt(2.0) +T[0,0] = 1j*sqtwo +T[0,4] = -1j*sqtwo +T[1,1] = -1j*sqtwo +T[1,3] = -1j*sqtwo +T[2,2] = 1.0 +T[3,1] = -sqtwo +T[3,3] = sqtwo +T[4,0] = sqtwo +T[4,4] = sqtwo + +U(T=T) + +U.reduce_matrix() + +ar = HDFArchive('U_mat.output.h5') +ar['U'] = U.U +ar['Up'] = U.Up +ar['Ufull'] = U.Ufull +del ar + diff --git a/test/srvo3_Gloc.output.h5 b/test/srvo3_Gloc.output.h5 new file mode 100644 index 0000000000000000000000000000000000000000..485129da7216135e892d425f703616ba9d69391c GIT binary patch literal 150842 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

QQsMO1ZcChn;j(g?9$n_XJvb82Y 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. +# +################################################################################ + +#from pytriqs.applications.dft.sumk_lda import * +#from pytriqs.applications.dft.converters.wien2k_converter import * +from sumk_lda import * +from converters.wien2k_converter import * +from pytriqs.archive import * + +#===================================================== +#Basic input parameters: +LDAFilename = 'SrVO3' +U = 4.0 +J = 0.6 +Beta = 40 +DC_type = 1 # DC type: 0 FLL, 1 Held, 2 AMF +useBlocs = True # use bloc structure from LDA input +useMatrix = False # True: Slater parameters, False: Kanamori parameters U+2J, U, U-J +use_spinflip = False # use the full rotational invariant interaction? +#===================================================== + +U=U-2*J + +HDFfilename = LDAFilename+'.h5' + +# Init the SumK class +SK=SumkLDA(hdf_file='SrVO3.h5',use_lda_blocks=True) + + +Norb = SK.corr_shells[0][3] +l = SK.corr_shells[0][2] + + +from solver_multiband import * +#from pytriqs.applications.dft.solver_multiband import * + +S=SolverMultiBand(beta=Beta,n_orb=Norb,gf_struct=SK.gf_struct_solver[0],map=SK.map[0]) + +SK.put_Sigma([S.Sigma]) +Gloc=SK.extract_G_loc() + +ar = HDFArchive('srvo3_Gloc.output.h5','w') +ar['Gloc'] = Gloc[0] +del ar diff --git a/test/sumklda_basic.output.h5 b/test/sumklda_basic.output.h5 new file mode 100644 index 0000000000000000000000000000000000000000..9ccc75f9ef723ba3827061419a8c6528870e99bf GIT binary patch literal 11536 zcmeGi4NQ|q^jaWRD5eaRpA0F;5Kv+jahu#|Q80B;s0dlbC2fVOOt5tz;15ZMi>sO_ zrkiV6TrkQ+GAC0}elCjH;&4;xbSjy;p+ngWZaTN%Pr|pay}OcrtPqrGUHdip-o1D4 zy}NtgyLay%Y?i0a_4f_+1=dF(0Ny}kYtk1(9#K4|P@MLwNrOkAk-%C$Zt#Hh2S6~P z2N3;SzO2l&G{ACF{S*>0(CLF)j$#6`c60407Z%5WG5s&eXl2vp8TLW*m@>#dhjU;(1{L z38!qBI~ zzeKcHd44&PxKK#v2ZZcT092}6U7@}}Tc%RkBt-1NfX@b*4Yv)#wkYh++-= z*GkuYEuFvNf-rsOtLRRa^a{g-HSk106m>`4&FHkSs8)50$tZa}xhnoP!_21r zFq+7}LF5lE>bcHLUDwojUend>*N80VP&X54}pUqvbKaXNofw z=v0Cvy`eo0MGE+)8!5|R&9S8qe@=WGMSYfkC%HKd){*&GeMS`bchassKkVP%yabA> zO+T6egdBNv|3NI%cTfort@|se_qN*%4Ba++K%3uz1hu?LG)7Lv*SW5op#; z(NCKM2OvitZEL%9u7K6g`=eo-RewNP3V(B8Bx*EITYq~ef=B11X?m7cK_H*;p=_Bi z0`(1Ft&F+XQo8EE#hE)y_VGuFJ~>+vXhc+g>{z2kx)UMqIm+KQm7JAI6fM!_n;9to zmBkak&tZ~^)+kR#2bH6cE4BWIBQl}6^`U(Eg^reenYzn?{qu*rPc|P-QP{_a9C_$R z^v@#tk7rl*F;jY5+AqJSW%ys%*I%(DH{q(^0sH(H%+naIZ#8kpPonY`EDwE&{+UES z^_O~mPkEkc46>N-o?{-B!kjk~4ujbRP>4D>{$H~3NK%e%!fY+Ht^p^myD@~ z4J!*!4fWUBy1M$SA}DK#KlqJlBa|%;yRof30deG^Ve{VI`i?Rr)0)=SZ=7!TSN&>B zXUxnvJMP&(p8ez5Kf~WY0}kvFCUEbU62HL*p!Xi*xWW0{t=Dz(N{dV6m9$RGy_X1q z%;p+A5X9!K0+5wCZ{Z>pTf|OO{erNT9`YG76)flkzAH43}@iJzl^-dz@0d8UeZoMFeth<#{ zhqIRrC78jEPs2Ff2c&yQ>pAn^+KE_HO*9PUzmjmw=<#1-FgF8S|CN*V8%SKE=CJ$g zbWE}12^@R~{}vI2+`J?>6nD^lAS1Y%6JG^Uj(ie=E24>FHv_Jdm#F=*=_?(+z_YG* zVZZVQG!7dh9Huh>!PP+k%#j1S90=BWiuDmsz|h&7#?dmdGmaO7?mB*T*CqUFD0|R9 z6H-X)#}ucK(!EHXc=&Z?gEehtpGq1kZP>HkXG7V8*3l{KU$41V|eitfv(^mG*98)n@1{7q58T1k2X^J{{avyFw_75 literal 0 HcmV?d00001 diff --git a/test/sumklda_basic.py b/test/sumklda_basic.py new file mode 100644 index 00000000..5bad3371 --- /dev/null +++ b/test/sumklda_basic.py @@ -0,0 +1,36 @@ + +################################################################################ +# +# TRIQS: a Toolbox for Research in Interacting Quantum Systems +# +# Copyright (C) 2011 by M. Aichhorn, L. Pourovskii, V. Vildosola +# +# TRIQS is free software: you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation, either version 3 of the License, or (at your option) any later +# version. +# +# TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# TRIQS. If not, see . +# +################################################################################ + +from pytriqs.archive import * +#from pytriqs.applications.dft.sumk_lda_tools import SumkLDATools +from sumk_lda_tools import SumkLDATools + + +SK = SumkLDATools(hdf_file = 'SrVO3.h5') + +dm = SK.density_gf(40) +dm_pc = SK.partial_charges(40) + +ar = HDFArchive('sumklda_basic.output.h5','w') +ar['dm'] = dm +ar['dm_pc'] = dm_pc +del ar diff --git a/test/wien2k_convert.output.h5 b/test/wien2k_convert.output.h5 new file mode 100644 index 0000000000000000000000000000000000000000..ae195880332740cbd9dec7a4d5d7ed8e92052413 GIT binary patch literal 630112 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


HGyZ(eT>6Fd(W}I@ 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 literal 0 HcmV?d00001 diff --git a/test/wien2k_convert.py b/test/wien2k_convert.py new file mode 100644 index 00000000..fa8cfce3 --- /dev/null +++ b/test/wien2k_convert.py @@ -0,0 +1,36 @@ + +################################################################################ +# +# TRIQS: a Toolbox for Research in Interacting Quantum Systems +# +# Copyright (C) 2011 by M. Aichhorn, L. Pourovskii, V. Vildosola +# +# TRIQS is free software: you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation, either version 3 of the License, or (at your option) any later +# version. +# +# TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +# details. +# +# You should have received a copy of the GNU General Public License along with +# TRIQS. If not, see . +# +################################################################################ + +from pytriqs.archive import * +#from pytriqs.applications.dft.converters import Wien2kConverter +from converters import Wien2kConverter + + + +Converter = Wien2kConverter(filename='SrVO3') +Converter.hdf_file = 'wien2k_convert.output.h5' +Converter.convert_dmft_input() + +Converter.convert_parproj_input() + + +