From cfc61d9a1b10e77d80b4e20c330c42754a94e872 Mon Sep 17 00:00:00 2001 From: Jason Eu Date: Wed, 14 Jul 2021 11:09:02 +0800 Subject: [PATCH] Replace F77 efermi with pure python efermi Build fortran code bring some unconvinients to package maintainance such as failed in building docs in readthedocs since the docker image of readthedocs contain no fortran compiler, and the problem of wired setup.py setting to build and install the package. I copy and paste the pure python efermi code from Austin to the package. The performence not a big concern in this sssp-workflow, because it only used in calculating the fermi level for metals and fermi level with specific energy level shifts. --- ' | 10 - .gitignore | 1 - .pre-commit-config.yaml | 3 + .../calculations/calculate_bands_distance.py | 21 +- aiida_sssp_workflow/efermi.f | 618 --------- aiida_sssp_workflow/efermi.pyf | 53 - .../efermi_module-f2pywrappers.f | 58 + aiida_sssp_workflow/efermi_modulemodule.c | 1110 +++++++++++++++++ aiida_sssp_workflow/sssp_protocol.yml | 2 +- .../workflows/bands_distance.py | 4 +- .../workflows/legacy_convergence/bands.py | 4 +- .../workflows/legacy_convergence/pressure.py | 2 +- .../sssp_mc_logo.png => _static/logo.png} | Bin docs/source/conf.py | 386 +----- docs/source/images/AiiDA_transparent_logo.png | Bin 76300 -> 0 bytes docs/source/index.rst | 6 +- efermi/__init__.py | 4 + efermi/efermi.py | 136 ++ efermi/efermi_module-f2pywrappers.f | 58 + efermi/efermi_modulemodule.c | 1110 +++++++++++++++++ pyproject.toml | 3 +- setup.json | 8 +- setup.py | 59 +- sssp/efermi.cpython-37m-x86_64-linux-gnu.so | Bin 104176 -> 0 bytes tests/test_efermi.py | 62 +- 25 files changed, 2655 insertions(+), 1063 deletions(-) delete mode 100644 ' delete mode 100644 aiida_sssp_workflow/efermi.f delete mode 100644 aiida_sssp_workflow/efermi.pyf create mode 100644 aiida_sssp_workflow/efermi_module-f2pywrappers.f create mode 100644 aiida_sssp_workflow/efermi_modulemodule.c rename docs/source/{images/sssp_mc_logo.png => _static/logo.png} (100%) delete mode 100644 docs/source/images/AiiDA_transparent_logo.png create mode 100644 efermi/__init__.py create mode 100644 efermi/efermi.py create mode 100644 efermi/efermi_module-f2pywrappers.f create mode 100644 efermi/efermi_modulemodule.c delete mode 100755 sssp/efermi.cpython-37m-x86_64-linux-gnu.so diff --git a/' b/' deleted file mode 100644 index dac81750..00000000 --- a/' +++ /dev/null @@ -1,10 +0,0 @@ -#==========================================================================# -#= PREPEND_TEXT: if there is any bash commands that should be prepended to -#= the executable call in all submit scripts for this code, type that -#= between the equal signs below and save the file. -#==========================================================================# - - -#==========================================================================# -#= All lines that start with `#=` will be ignored. -#==========================================================================# diff --git a/.gitignore b/.gitignore index 208c0238..bf7031e2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ *.pyc *.swo *.swp -efermi_module* ~* *~ *.pdf diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 3ef35de7..158dab3a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -44,6 +44,9 @@ repos: language: system exclude: &exclude_files > (?x)^( + aiida_sssp_workflow/workflows/convergence/.*| + efermi/efermi.py| + aiida_sssp_workflow/helpers.py| setup.py| examples/.*| docs/.*| diff --git a/aiida_sssp_workflow/calculations/calculate_bands_distance.py b/aiida_sssp_workflow/calculations/calculate_bands_distance.py index 34ec2524..8f42f4c6 100644 --- a/aiida_sssp_workflow/calculations/calculate_bands_distance.py +++ b/aiida_sssp_workflow/calculations/calculate_bands_distance.py @@ -10,13 +10,13 @@ @calcfunction def calculate_bands_distance(bands_structure_a: orm.BandsData, - band_parameters_a: orm.Dict, + bands_parameters_a: orm.Dict, bands_structure_b: orm.BandsData, - band_parameters_b: orm.Dict, smearing: orm.Float, + bands_parameters_b: orm.Dict, smearing: orm.Float, is_metal: orm.Bool): """doc""" res = get_bands_distance(bands_structure_a, bands_structure_b, - band_parameters_a, band_parameters_b, + bands_parameters_a, bands_parameters_b, smearing.value, is_metal.value) return orm.Dict( @@ -59,11 +59,9 @@ def fermi_dirac(band_energy, fermi_energy, smearing): def retrieve_bands(bandsdata: orm.BandsData, start_band, num_electrons, efermi, smearing, is_metal): """ - :bandsdata: - ... - TODO docstring + docstring """ - from sssp.efermi_module import efermi as efermi_calc # pylint: disable=no-name-in-module, import-error + from efermi import pyefermi bands = bandsdata.get_bands() bands = bands - efermi # shift all bands to fermi energy 0 @@ -75,14 +73,13 @@ def retrieve_bands(bandsdata: orm.BandsData, start_band, num_electrons, efermi, if is_metal: nelectrons = num_electrons nkpoints = np.shape(bands)[0] - nbands = np.shape(bands)[1] weights = np.ones(nkpoints) / nkpoints bands = np.asfortranarray(bands) + meth = 2 # firmi-dirac smearing + + output_efermi = pyefermi(bands, weights, nelectrons, smearing, + nkpoints, meth) - # 2 for firmi-dirac smearing - res = efermi_calc(nelectrons, nbands, smearing, nkpoints, weights, 0.0, - bands, 2) - output_efermi = res[1] else: homo_energy = get_homo(bands, num_electrons) output_efermi = homo_energy diff --git a/aiida_sssp_workflow/efermi.f b/aiida_sssp_workflow/efermi.f deleted file mode 100644 index 0431f088..00000000 --- a/aiida_sssp_workflow/efermi.f +++ /dev/null @@ -1,618 +0,0 @@ -C----------------------------------------------------------------------- - SUBROUTINE EFERMI (NEL,NBANDS,DEL,NSPPTS,NDIM8,NDIM10, - + WEIGHT,OCC,EF,EIGVAL,SORT,eigmin,eigmax,enocc,ismear) -C----------------------------------------------------------------------- - -C FERMI ENERGY & SMEARING PACKAGE REWRITTEN IN FINAL FORM FOR -C CASTEP/CETEP USE BY A. DE VITA IN JULY 1992, STARTING FROM -C R. NEEDS VERSION -C -C COLD SMEARING, SPLINE OF GAUSSIANS, AND A CORRECTION TO METH-PAX -C INTRODUCED BY N. MARZARI (1995) -C -C FOR A DETAILED EXPLANATION OF THE SMEARING APPROACH, LOOK AT -C N. MARZARI PhD THESIS, CHAPTER 4, AND REFERENCES THEREIN: -C http://theossrv1.epfl.ch/uploads/Group/Bibliography/Nicola%20Marzari_these_04-1996.pdf -C -C Cold smearing reference: N. Marzari, D. Vanderbilt, A. De Vita -C and M. C. Payne, ``Thermal contraction and disordering of the -C Al(110) surface'', Phys. Rev. Lett. 82, 3296 (1999). -C -C GIVEN A SET OF WEIGHTS AND THE EIGENVALUES ASSOCIATED TO THEIR -C ASSOCIATED K-POINTS FOR BZ SAMPLING, THIS SUBROUTINE PERFORMS -C TWO TASKS: -C -C (1) DETERMINES THE FERMI LEVEL AND THE OCCUPANCY OF THE STATES -C ACCORDING TO CHOSEN SMEARING SCHEME - -C (2) DETERMINES THE "ENTROPY CORRECTION" TO BE ADDED TO -C THE TOTAL ENERGY FOR RECOVERING THE ZERO-SMEARING ENERGY -C (I.E. THE TRUE GROUND STATE ENERGY) AND PASSES IT BACK TO -C THE MAIN CODE. NOTE THAT THIS IS NOT NEEDED FOR METH-PAX -C OR THE COLD SMEARING -C -C THE SMEARING SCHEMES (CHOOSE ONE WITH PARAMETER ISMEAR): -C -C (1) GAUSSIAN: -C SEE: C-L FU AND K-M HO, PHYS. REV. B 28, 5480 (1983). -C THEIR IMPLEMENTATION WAS VARIATIONAL BUT *NOT* CORRECTED FOR -C SECOND ORDER DEVIATION IN SIGMA AS ALSO WAS THE SIMILAR SCHEME -C (WITH OPPOSITE SIGN DEVIATION) IN: R.J.NEEDS, R.M.MARTIN AND O.H. -C NIELSEN, PHYS. REV. B 33 , 3778 (1986). -C USING THE CORRECTION CALCULATED HEREAFTER EVERYTHING SHOULD BE OK. -C THE SMEARING FUNCTION IS A GAUSSIAN NORMALISED TO 2. -C THE OCCUPATION FUNCTION IS THE ASSOCIATED COMPLEMENTARY -C ERROR FUNCTION. -C -C (2) FERMI-DIRAC: -C SEE: M.J.GILLAN J. PHYS. CONDENS. MATTER 1, 689 (1989), FOLLOWING -C THE SCHEME OUTLINED IN J.CALLAWAY AND N.H.MARCH, SOLID STATE PHYS. 38, -C 136 (1984), AFTER D.N.MERMIN, PHYS. REV 137, A1441 (1965). -C THE OCCUPATION FUNCTION IS TWICE THE SINGLE ELECTRON -C FERMI-DIRAC DISTRIBUTION. -C -C (3) HERMITE-DELTA_EXPANSION: -C SEE: METHFESSEL AND PAXTON, PHYS. REV.B 40, 3616 (1989). -C THE SMEARING FUNCTION IS A TRUNCATED EXPANSION OF DIRAC'S DELTA -C IN HERMITE POLINOMIALS. -C FOR THE SMEARING FUNCTION IMPLEMENTED HERE THE TRUNCATION IS -C AT THE FIRST NON-TRIVIAL EXPANSION TERM D1(X). -C THE OCCUPATION FUNCTION IS THE ASSOCIATED PRIMITIVE. -C (NOTE: THE OCCUPATION FUNCTION IS NEITHER MONOTONIC NOR LIMITED -C BETWEEN 0. AND 2. : PLEASE CHECK THE COMPATIBILITY OF THIS WITH -C YOUR CODE'S VERSION AND VERIFY IN A TEST CALCULATION THAT THE -C FERMI LEVEL IS *UNIQUELY* DETERMINED). -C -C THE ENTROPY CORRECTION HOLDS UP TO THE THIRD ORDER IN DELTA AT LEAST, -C AND IS NOT NECESSARY (PUT = 0.) FOR THE HERMITE_DELTA EXPANSION, -C SINCE THE LINEAR ENTROPY TERM IN SIGMA IS ZERO BY CONSTRUCTION -C IN THAT CASE. (well, we still need the correct free energy. hence -C delcor is set to its true value, nmar) -C -C (4) GAUSSIAN SPLINES: -C similar to a Gaussian smearing, but does not require the -C function inversion to calculate the gradients on the occupancies. -C It is thus to be preferred in a scheme in which the occ are -C independent variables (not in castep/cetep) (N. Marzari) -C -C (5) POSITIVE HERMITE, or COLD SMEARING I -C similar to Methfessel-Paxton (that is killing the linear order -C in the entropy), but with positive-definite occupations (still -C greater than 1) ! (N. Marzari) -C -C (6) POSITIVE HERMITE, or COLD SMEARING II: the one to use. -C (5) and (6) are practically identical; (6) is more elegant. -C Phys. Rev. Lett. 82, 3296 (1999). - -C------------------ -C **** PLEASE INQUIRE WITH ADV/NMAR FOR REFERENCE & SUGGESTIONS IF -C YOU PLAN TO USE THE PRESENT CORRECTED BZ SAMPLING SCHEME **** -C nicola.marzari@epfl.ch (was marzari@princeton.edu) -C alessandro.de_vita@kcl.ac.uk (was alessandro.devita@epfl.ch) -C------------------ - -C NEL ..... NUMBER OF ELECTRONS PER UNIT CELL -C NBANDS .. NUMBER OF BANDS FOR EACH K-POINT -C DEL ..... WIDTH OF GAUSSIAN SMEARING FUNCTION -C NSPPTS .. NUMBER OF K-POINTS -C NDIM8 ... MAXIMUM NUMBER OF BANDS AT A K-POINT -C WEIGHT .. THE WEIGHT OF EACH K-POINT -C OCC ..... THE OCCUPANCY OF EACH STATE -C EF ...... THE FERMI ENERGY -C SORT .... THE EIGENVALUES ARE WRITTEN INTO SORT WHICH IS -C THEN SORTED INTO ASCENDING NUMERICAL VALUE, FROM -C WHICH BOUNDS ON EF CAN EASILY BE OBTAINED -C EIGVAL .. CONTAINS THE BEST EIGENVALUES AVAILABLE -c -c ISMEAR = 1 GAUSSIAN BROADENING -C = 2 FERMI-DIRAC BROADENING -C = 3 HERMITE EXPANSION (1ST ORD.) (right delcor now, nmar) -C = 4 SPLINE OF GAUSSIANS (nmar) -C = 5 COLD SMEARING I (nmar) -C = 6 COLD SMEARING II (nmar) -C JMAX THE MAX NUMBER OF BISECTIONS TO GET EF -C XACC THE DESIRED ACCURACY ON EF -C -C DELCOR THE CORRECTION. PASSED BACK IN SORT(1) (= SORT(1,1)) -C TO BE COMPATIBLE WITH OLD VERSIONS OF THE CODE. IF -C YOUR CODE DOES NOT DO IT ALREADY, ADD SORT(1) TO -C CORRECT THE TOTAL ENERGY IN YOUR MAIN.FORTRAN , WHICH -C SHOULD CALL ANYWAY THIS ROUTINE CORRECTLY. -C -C CHANGED: -TS goes into enocc (nmar) -C also: the correction is needed for 1,2 and 4 only -C------------------------------------------------------------- -c ANOTHER NOTE: -C Thanks to the possible > 2 or < 0 -c orbital occupancies in the general case of smearing function, -c (e.g. in the M-P case) the algorithm to find EF has been -c chosen to be the robust bisection method (from Numerical -c Recipes) to allow for non monotonic relation between total -c NEL (see above) and EF. One value for EF which solves -c NEL(EF) - Z = 0 is always found. -C--------------------------------------------------------------------- -C - IMPLICIT REAL (A-H,O-Z) - - DIMENSION SORT(NDIM8*NDIM10) - DIMENSION OCC(NDIM8,NDIM10),WEIGHT(NDIM10),EIGVAL(NDIM8,NDIM10) - EXTERNAL ERF_C - EXTERNAL FERMID - EXTERNAL DELTHM - EXTERNAL POSHM - EXTERNAL POSHM2 -C.....WARNINGS - COMMON /WARN/ IWARN - PARAMETER ( JMAX =200, XACC=1.0D-10) -C.....WHICH SMEARING IS USED - - pi=acos(0.0)*2.0 - ee=exp(1.0) - eesh=sqrt(ee)*0.5 - sq2i=sqrt(2.0)*0.5 - piesqq=sqrt(ee*pi)*0.25 - - Z = FLOAT(NEL) - -C COPY EIGVAL INTO SORT ARRAY. - - NEIG = 0 - DO 10 ISPPT = 1,NSPPTS - DO 20 J = 1, NBANDS - NEIG = NEIG + 1 -20 SORT(NEIG) = EIGVAL(J,ISPPT) -10 CONTINUE - -C======================================================================= -C THE ARRAY IS ORDERED INTO ASCENDING ORDER OF EIGENVALUE -C======================================================================= - - DO 26 N=2,NSPPTS*NBANDS - EN=SORT(N) - DO 22 NN=N-1,1,-1 - IF (SORT(NN).LE.EN) GO TO 24 - SORT(NN+1)=SORT(NN) - 22 CONTINUE - NN=0 - 24 SORT(NN+1)=EN - 26 CONTINUE - eigmin=sort(1) - eigmax=sort(nsppts*nbands) - -C=========================== -C THE UPPER BOUND XE2 AND THE LOWER BOUND XE1 -C ARE PUT TO FIRST AND LAST EIGENVALUE, THEN -C THE ACTUAL FERMI ENERGY IS FOUND BY BISECTION -C=========================== - - XE1=ef-del - XE2=ef+0.5*del - xe0=ef - -C -c WRITE(*,*) ' ' - IF(ISMEAR.EQ.1) THEN - WRITE(*,*) 'GAUSSIAN BROADENING' - ELSEIF(ISMEAR.EQ.2) THEN - WRITE(*,*) 'FERMI-DIRAC BROADENING' - ELSEIF(ISMEAR.EQ.3) THEN - WRITE(*,*) 'HERMITE-DIRAC BROADENING' - ELSEIF(ISMEAR.EQ.4) THEN - WRITE(*,*) 'GAUSSIAN SPLINES BROADENING' - ELSEIF(ISMEAR.EQ.5) THEN - WRITE(*,*) 'COLD SMEARING I' - ELSEIF(ISMEAR.EQ.6) THEN - WRITE(*,*) 'COLD SMEARING II' - ENDIF -c WRITE (9,*) ' ' -c WRITE (9,*) 'min & max eigval ',eigmin,eigmax - - nmax=1 -100 continue - -C -C FMID = FUNC(X2) in Numerical Recipes. -C - Z1=0.D0 - DO 40 ISPPT = 1,NSPPTS - DO 50 J = 1,NBANDS - X = (XE2 - EIGVAL(J,ISPPT))/DEL - IF(ISMEAR.EQ.1) THEN - Z1 = Z1 + WEIGHT(ISPPT)*( 2.0 - ERF_C(X) ) - ELSEIF(ISMEAR.EQ.2) THEN - Z1 = Z1 + WEIGHT(ISPPT)*FERMID(-X) - ELSEIF(ISMEAR.EQ.3) THEN - Z1 = Z1 + WEIGHT(ISPPT)*DELTHM(X) - ELSEIF(ISMEAR.EQ.4) THEN - Z1 = Z1 + WEIGHT(ISPPT)*SPLINE(-X) - ELSEIF(ISMEAR.EQ.5) THEN - Z1 = Z1 + WEIGHT(ISPPT)*POSHM(X) - ELSEIF(ISMEAR.EQ.6) THEN - Z1 = Z1 + WEIGHT(ISPPT)*POSHM2(X) - ENDIF -50 CONTINUE -40 CONTINUE - - FMID= Z1-Z - -C F = FUNC(X1) - - Z1=0.D0 - DO 140 ISPPT = 1,NSPPTS - DO 150 J = 1,NBANDS - X = (XE1 - EIGVAL(J,ISPPT))/DEL - IF(ISMEAR.EQ.1) THEN - Z1 = Z1 + WEIGHT(ISPPT)*( 2.0 - ERF_C(X) ) - ELSEIF(ISMEAR.EQ.2) THEN - Z1 = Z1 + WEIGHT(ISPPT)*FERMID(-X) - ELSEIF(ISMEAR.EQ.3) THEN - Z1 = Z1 + WEIGHT(ISPPT)*DELTHM(X) - ELSEIF(ISMEAR.EQ.4) THEN - Z1 = Z1 + WEIGHT(ISPPT)*SPLINE(-X) - ELSEIF(ISMEAR.EQ.5) THEN - Z1 = Z1 + WEIGHT(ISPPT)*POSHM(X) - ELSEIF(ISMEAR.EQ.6) THEN - Z1 = Z1 + WEIGHT(ISPPT)*POSHM2(X) - ENDIF -150 CONTINUE -140 CONTINUE - - F= Z1-Z - - IF(F*FMID .GE. 0.D0) THEN - if (nmax.ge.10000) then - WRITE(*,*) 'ERROR: NO FERMI ENERGY FOUND ', - & xe1,xe2,f,fmid,nmax - WRITE(*,*) ' ' - WRITE(*,*) 'IS THE ELECTRONIC TEMPERATURE TOO SMALL ? ',del - WRITE(*,*) ' ' - stop - else - nmax=nmax+1 - XE1=XE0-float(nmax)*del - XE2=XE0+(float(nmax)-0.5)*del - goto 100 - end if - ENDIF - IF(F .LT. 0.D0) THEN - RTBIS = XE1 - DX = XE2 - XE1 - ELSE - RTBIS = XE2 - DX = XE1 - XE2 - ENDIF - DO 42 J = 1, JMAX - DX = DX * 0.5D0 - XMID = RTBIS + DX - -C FMID=FUNC(XMID) - - Z1=0.D0 - DO 240 ISPPT = 1,NSPPTS - DO 250 J2 = 1,NBANDS - X = (XMID - EIGVAL(J2,ISPPT))/DEL - IF(ISMEAR.EQ.1) THEN - Z1 = Z1 + WEIGHT(ISPPT)*( 2.0 - ERF_C(X) ) - ELSEIF(ISMEAR.EQ.2) THEN - Z1 = Z1 + WEIGHT(ISPPT)*FERMID(-X) - ELSEIF(ISMEAR.EQ.3) THEN - Z1 = Z1 + WEIGHT(ISPPT)*DELTHM(X) - ELSEIF(ISMEAR.EQ.4) THEN - Z1 = Z1 + WEIGHT(ISPPT)*SPLINE(-X) - ELSEIF(ISMEAR.EQ.5) THEN - Z1 = Z1 + WEIGHT(ISPPT)*POSHM(X) - ELSEIF(ISMEAR.EQ.6) THEN - Z1 = Z1 + WEIGHT(ISPPT)*POSHM2(X) - ENDIF -250 CONTINUE -240 CONTINUE - - FMID= Z1-Z - - IF(FMID .LE. 0.D0) RTBIS=XMID - IF(ABS(DX) .LT. XACC .OR. FMID .EQ. 0) THEN - GOTO 1042 - ENDIF - 42 CONTINUE - WRITE(*,*) 'CANNOT BISECT FOREVER, CAN I ?' -c WRITE(9,*) 'CANNOT BISECT FOREVER, CAN I ?' - STOP - -1042 EF = RTBIS - -170 CONTINUE - - WRITE (*,*) EF -c WRITE (9,180) EF -180 FORMAT (' FERMI ENERGY = ',F15.8,' EV') - -C FORM OCCUPATIONS OCC(NBDS,NSPPTS) - DO 190 ISPPT = 1, NSPPTS - DO 200 J = 1,NBANDS - X = ( EF-EIGVAL(J,ISPPT))/DEL - IF(ISMEAR.EQ.1) THEN - OCC(J,ISPPT) = 2.0 - ERF_C(X) - ELSEIF(ISMEAR.EQ.2) THEN - OCC(J,ISPPT) = FERMID(-X) - ELSEIF(ISMEAR.EQ.3) THEN - OCC(J,ISPPT) = DELTHM(X) - ELSEIF(ISMEAR.EQ.4) THEN - OCC(J,ISPPT) = SPLINE(-X) - ELSEIF(ISMEAR.EQ.5) THEN - OCC(J,ISPPT) = POSHM(X) - ELSEIF(ISMEAR.EQ.6) THEN - OCC(J,ISPPT) = POSHM2(X) - ENDIF - OCC(J,ISPPT) = OCC(J,ISPPT)/2.0 -200 CONTINUE -190 CONTINUE - -C------------------------------------------------------------- -C CALCULATES THE CORRECTION TERM TO GET "0 TEMPERATURE" ENERGY -C------------------------------------------------------------- - - DELCOR=0.0D0 - DO 191 ISPPT = 1, NSPPTS - DO 201 J = 1,NBANDS - X = ( EF-EIGVAL(J,ISPPT))/DEL - IF(ISMEAR.EQ.1) THEN - DELCOR=DELCOR - & -DEL*WEIGHT(ISPPT)*EXP(-X*X)/(2.D0*SQRT(pi)) - ELSEIF(ISMEAR.EQ.2) THEN - FI=FERMID(-X)/2.D0 - IF(ABS(FI) .GT. 1.E-06) THEN - IF(ABS(FI-1.D0) .GT. 1.E-06) THEN - DELCOR=DELCOR+DEL*WEIGHT(ISPPT)* - & (FI*LOG(FI)+(1.D0-FI)*LOG(1.D0-FI)) - ENDIF - ENDIF - ELSEIF(ISMEAR.EQ.3) THEN - DELCOR=DELCOR+DEL/2.0*WEIGHT(ISPPT) - & *(2.0*x*x-1)*exp(-x*x)/(2.0*sqrt(pi)) - ELSEIF(ISMEAR.EQ.4) THEN - x=abs(x) - zeta=eesh*abs(x)*exp(-(x+sq2i)**2)+piesqq*ERF_C(x+sq2i) - delcor=delcor-del*WEIGHT(ISPPT)*zeta - ELSEIF(ISMEAR.EQ.5) THEN - a=-0.5634 -c a=-0.8165 - DELCOR=DELCOR-DEL/2.0*WEIGHT(ISPPT) -c NOTE g's are all intended to be normalized to 1 ! -c this following line is -2*int_minf^x [t*g(t)]dt - & *(2.0*a*x**3-2.0*x*x+1 )*exp(-x*x)/(2.0*sqrt(pi)) - ELSEIF(ISMEAR.EQ.6) THEN - DELCOR=DELCOR-DEL/2.0*WEIGHT(ISPPT) -c NOTE g's are all intended to be normalized to 1 ! -c this following line is -2*int_minf^x [t*g(t)]dt - & *(1-sqrt(2.0)*x)*exp(-(x-1/sqrt(2.))**2)/sqrt(pi) - ENDIF -201 CONTINUE -191 CONTINUE - -c-------------------------------------------------------- -C the correction stored in enocc -c-------------------------------------------------------- - - sort(1)=delcor - enocc=2.0*delcor - -c-------------------------------------------------------- -c TEST WHETHER OCCUPANCY ADDS UP TO Z -c-------------------------------------------------------- - - TEST = 0.0 - DO 210 ISPPT = 1,NSPPTS - DO 215 J = 1,NBANDS -215 TEST = TEST + WEIGHT(ISPPT)*OCC(J,ISPPT) -210 CONTINUE - test=test*2.0 - -c-------------------------------------------------------- -c UNCOMMENT IF YOU WISH to see occupation numbers at each kpoint -c-------------------------------------------------------- - - DO 193 ISPPT = 1, NSPPTS - -c WRITE (*,9897) ISPPT -c WRITE (9,9897) ISPPT -9897 FORMAT(' OCCUPATION NUMBERS AT K-POINT',I3,':') -c WRITE(*,9898) (OCC(J,ISPPT),J=1,NBANDS) -c WRITE(9,9898) (OCC(J,ISPPT),J=1,NBANDS) -9898 FORMAT(2X,5F15.6) -193 CONTINUE - - IF ( ABS(TEST-Z) .GT. 1.0D-5) THEN - -C WRITE(*,*) '*** ERROR ***' - WRITE(*,*) '*** Warning ***' - WRITE(*,*) TEST,NEL -220 FORMAT(' SUM OF OCCUPANCIES =',F18.12 ,' BUT NEL =',I5) -C STOP !! Modified by A. Marrazzo and G. Prandini -C !! to do bands convergence tests. -C - - ELSE - -c WRITE(*,230) TEST -c WRITE(*,*) ' ' -230 FORMAT(' TOTAL CHARGE = ',F15.8) - - ENDIF -C -C TEST WHETHER THE MATERIAL IS A SEMICONDUCTOR -C (ASSUMING SPIN DEGENERACY) -C -C this has to be sorted out better -C - IF ( MOD( NEL, 2) .EQ. 1) RETURN - INEL = NEL/2 - if (inel+1.le.ndim8) then - ELOW = EIGVAL(INEL+1,1) - DO 310 ISPPT = 2,NSPPTS - ELOW =MIN( ELOW, EIGVAL(INEL+1,ISPPT)) -310 CONTINUE - DO 320 ISPPT = 1,NSPPTS - IF (ELOW .LT. EIGVAL(INEL,ISPPT)) RETURN -320 CONTINUE - end if - - if (NSPPTS.gt.1) then - WRITE (*,*) 'MATERIAL MAY BE A SEMICONDUCTOR' - end if -C - RETURN - END -C -C ========================================================================= -C - FUNCTION ERF_C(XX) -C -C COMPLEMENTARY ERROR FUNCTION -C FROM THE SANDIA MATHEMATICAL PROGRAM LIBRARY -C -C XMAX IS THE VALUE BEYOND WHICH ERF_C(X) = 0 . -C IT IS COMPUTED AS SQRT(LOG(RMIN)), WHERE RMIN IS THE -C SMALLEST REAL NUMBER REPRESENTABLE ON THE MACHINE. -C IBM VALUE: (THE INTRINSIC ERF_C COULD ALSO BE USED) -C PARAMETER ( XMAX = 13.4 ) -C VAX VALUE: (XMAX = 9.3) -C ----------------------------------- -C 12-Mar-90 Obtained from B. Hammer -C 12-MAR-90 Changed to single precision at the end XW -C also XX1 - PARAMETER ( XMAX = 9.3D0) -C -C IMPLICIT DOUBLE PRECISION (A-H,O-Z) - DIMENSION P1(4),Q1(4),P2(6),Q2(6),P3(4),Q3(4) -C - DATA P1 /242.66 79552 30531 8D0 , 21.979 26161 82941 5D0 , - + 6.9963 83488 61913 6D0 , -3.5609 84370 18153 9D-2/ - DATA Q1 /215.05 88758 69861 2D0 , 91.164 90540 45149 0D0, - + 15.082 79763 04077 9D0 , 1.0D0/ - DATA P2 /22.898 99285 1659D0 , 26.094 74695 6075D0 , - + 14.571 89859 6926D0 , 4.2677 20107 0898D0 , - + 0.56437 16068 6381D0 , -6.0858 15195 9688 D-6/ - DATA Q2 /22.898 98574 9891D0 , 51.933 57068 7552D0 , - + 50.273 20286 3803D0 , 26.288 79575 8761D0 , - + 7.5688 48229 3618D0 , 1.0D0/ - DATA P3 /-1.2130 82763 89978 D-2 , -0.11990 39552 68146 0D0 , - + -0.24391 10294 88626D0 , -3.2431 95192 77746 D-2/ - DATA Q3 /4.3002 66434 52770 D-2 , 0.48955 24419 61437D0 , - + 1.4377 12279 37118D0 , 1.0D0/ -C 1/SQRT(PI) - DATA SQPI /0.56418 95835 47756D0/ -C -C---------------------------------------------------------------------- - IF (XX .GT. XMAX) GOTO 330 - IF (XX .LT. -XMAX) GOTO 320 - X = ABS(XX) - X2 = X*X - IF (X .GT. 4.0D0) GOTO 300 - IF (X .GT. 0.46875D0) GOTO 200 -C -C -46875 < X < 0.46875 - ERF_C = X*(P1(1) + X2*(P1(2) + X2*(P1(3) + X2*P1(4)))) - ERF_C = ERF_C/(Q1(1) + X2*(Q1(2) + X2*(Q1(3) + X2*Q1(4)))) - IF (XX .LT. 0.0) ERF_C = - ERF_C - ERF_C = 1.0D0 - ERF_C - GOTO 9999 -C -200 ERF_C = EXP( -X2)*(P2(1) + X*(P2(2) + X*(P2(3) + X*(P2(4) + - + X*(P2(5) + X*P2(6)))))) - ERF_C = ERF_C/(Q2(1) + X*(Q2(2) + X*(Q2(3) + X*(Q2(4) + X*(Q2(5) + - + X*Q2(6)))))) - IF (XX .LE. 0.0) ERF_C = 2.0D0 - ERF_C - GOTO 9999 -C -300 XI2 = 1.0D0/X2 - ERF_C = XI2*(P3(1) + XI2*(P3(2) + XI2*(P3(3) + XI2*P3(4))))/ - + (Q3(1) + XI2*(Q3(2) + XI2*(Q3(3) + XI2*Q3(4)))) - ERF_C = EXP( -X2)*(SQPI + ERF_C)/X - IF (XX .LT. 0.0) ERF_C = 2.0D0 - ERF_C - GOTO 9999 -C -320 ERF_C = 2.0D0 - GOTO 9999 -330 ERF_C = 0.0D0 -C -9999 RETURN - END -C================================================================ - FUNCTION FERMID(XX) -C - IF(XX .GT. 30.D0) THEN - FERMID=0.D0 - ELSEIF(XX .LT. -30.D0) THEN - FERMID=2.D0 - ELSE - FERMID=2.D0/(1.D0+EXP(XX)) - ENDIF -C - RETURN - END -C================================================================ - FUNCTION DELTHM(XX) -C - pi=3.14159265358979 - IF(XX .GT. 10.D0) THEN - DELTHM=2.D0 - ELSEIF(XX .LT. -10.D0) THEN - DELTHM=0.D0 - ELSE - DELTHM=(2.D0-ERF_C(XX))+XX*EXP(-XX*XX)/SQRT(PI) - ENDIF -C - RETURN - END -C================================================================ - FUNCTION SPLINE(X) - - eesqh=sqrt(exp(1.0))*0.5 - sq2i=sqrt(2.0)*0.5 - if (x.ge.0.0) then - fx=eesqh*exp(-(x+sq2i)**2) - else - fx=1.0-eesqh*exp(-(x-sq2i)**2) - endif - spline=2.0*fx -c - return - end -C================================================================ - FUNCTION POSHM(X) -C -c NOTE g's are all intended to be normalized to 1 ! -C function = 2 * int_minf^x [g(t)] dt -C - pi=3.141592653589793238 - a=-0.5634 -c a=-0.8165 - IF(X .GT. 10.D0) THEN - POSHM=2.D0 - ELSEIF(X .LT. -10.D0) THEN - POSHM=0.D0 - ELSE - POSHM=(2.D0-ERF_C(X))+(-2.0*a*x*x+2*x+a)*EXP(-X*X)/SQRT(PI)/2.0 - ENDIF -C - RETURN - END -C================================================================ - FUNCTION POSHM2(X) -C -c NOTE g's are all intended to be normalized to 1 ! -C function = 2 * int_minf^x [g(t)] dt -C - pi=3.141592653589793238 - IF(X .GT. 10.D0) THEN - POSHM2=2.D0 - ELSEIF(X .LT. -10.D0) THEN - POSHM2=0.D0 - ELSE - POSHM2=(2.D0-ERF_C(X-1./sqrt(2.)))+ - & sqrt(2.)*exp(-x*x+sqrt(2.)*x-0.5)/sqrt(pi) - ENDIF -C - RETURN - END -c===========================WELLWELLWEHAVEFINISHED. diff --git a/aiida_sssp_workflow/efermi.pyf b/aiida_sssp_workflow/efermi.pyf deleted file mode 100644 index efe3a286..00000000 --- a/aiida_sssp_workflow/efermi.pyf +++ /dev/null @@ -1,53 +0,0 @@ -! -*- f90 -*- -! Note: the context of this file is case sensitive. - -python module efermi_module ! in - interface ! in :efermi_module - subroutine efermi(nel,nbands,del,nsppts,ndim8,ndim10,weight,occ,ef,eigval,sort,eigmin,eigmax,enocc,ismear) ! in :efermi:efermi.f - integer intent(in):: nel - integer intent(in):: nbands - real intent(in):: del - integer intent(in):: nsppts - integer intent(hide),depend(nbands) :: ndim8=nbands - integer intent(hide),depend(nsppts) :: ndim10=nsppts - real dimension(nsppts), intent(in), depend(nsppts) :: weight - real dimension(nsppts,nbands),depend(nsppts), intent(out) :: occ - real intent (in,out):: ef - real dimension(nsppts,nbands),depend(nsppts,nbands), intent(in) :: eigval - real dimension(nsppts*nbands),depend(nsppts,nbands), intent(out) :: sort - real intent(out) :: eigmin - real intent(out) :: eigmax - real intent(out) :: enocc - integer intent(in):: ismear - integer :: iwarn - common /warn/ iwarn - end subroutine efermi - function erf_c(xx) ! in :efermi2:efermi.f - real :: xx - real :: erf_c - end function erf_c - function fermid(xx) ! in :efermi2:efermi.f - real :: xx - real :: fermid - end function fermid - function delthm(xx) ! in :efermi2:efermi.f - real :: xx - real :: delthm - end function delthm - function spline(x) ! in :efermi2:efermi.f - real :: x - real :: spline - end function spline - function poshm(x) ! in :efermi2:efermi.f - real :: x - real :: poshm - end function poshm - function poshm2(x) ! in :efermi2:efermi.f - real :: x - real :: poshm2 - end function poshm2 - end interface -end python module efermi_module - -! This file was auto-generated with f2py (version:2). -! See http://cens.ioc.ee/projects/f2py2e/ diff --git a/aiida_sssp_workflow/efermi_module-f2pywrappers.f b/aiida_sssp_workflow/efermi_module-f2pywrappers.f new file mode 100644 index 00000000..3d4a972a --- /dev/null +++ b/aiida_sssp_workflow/efermi_module-f2pywrappers.f @@ -0,0 +1,58 @@ +C -*- fortran -*- +C This file is autogenerated with f2py (version:1.21.1) +C It contains Fortran 77 wrappers to fortran functions. + + subroutine f2pywraperf_c (erf_cf2pywrap, xx) + external erf_c + real xx + real erf_cf2pywrap, erf_c + erf_cf2pywrap = erf_c(xx) + end + + + subroutine f2pywrapfermid (fermidf2pywrap, xx) + external fermid + real xx + real fermidf2pywrap, fermid + fermidf2pywrap = fermid(xx) + end + + + subroutine f2pywrapdelthm (delthmf2pywrap, xx) + external delthm + real xx + real delthmf2pywrap, delthm + delthmf2pywrap = delthm(xx) + end + + + subroutine f2pywrapspline (splinef2pywrap, x) + external spline + real x + real splinef2pywrap, spline + splinef2pywrap = spline(x) + end + + + subroutine f2pywrapposhm (poshmf2pywrap, x) + external poshm + real x + real poshmf2pywrap, poshm + poshmf2pywrap = poshm(x) + end + + + subroutine f2pywrapposhm2 (poshm2f2pywrap, x) + external poshm2 + real x + real poshm2f2pywrap, poshm2 + poshm2f2pywrap = poshm2(x) + end + + + subroutine f2pyinitwarn(setupfunc) + external setupfunc + integer iwarn + common /warn/ iwarn + call setupfunc(iwarn) + end diff --git a/aiida_sssp_workflow/efermi_modulemodule.c b/aiida_sssp_workflow/efermi_modulemodule.c new file mode 100644 index 00000000..fd8e2b81 --- /dev/null +++ b/aiida_sssp_workflow/efermi_modulemodule.c @@ -0,0 +1,1110 @@ +/* File: efermi_modulemodule.c + * This file is auto-generated with f2py (version:1.21.1). + * f2py is a Fortran to Python Interface Generator (FPIG), Second Edition, + * written by Pearu Peterson . + * Generation date: Wed Jul 21 04:01:37 2021 + * Do not edit this file directly unless you know what you are doing!!! + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/*********************** See f2py2e/cfuncs.py: includes ***********************/ +#include "Python.h" +#include +#include "fortranobject.h" +#include + +/**************** See f2py2e/rules.py: mod_rules['modulebody'] ****************/ +static PyObject *efermi_module_error; +static PyObject *efermi_module_module; + +/*********************** See f2py2e/cfuncs.py: typedefs ***********************/ +/*need_typedefs*/ + +/****************** See f2py2e/cfuncs.py: typedefs_generated ******************/ +/*need_typedefs_generated*/ + +/********************** See f2py2e/cfuncs.py: cppmacros **********************/ +#if defined(PREPEND_FORTRAN) +#if defined(NO_APPEND_FORTRAN) +#if defined(UPPERCASE_FORTRAN) +#define F_FUNC(f,F) _##F +#else +#define F_FUNC(f,F) _##f +#endif +#else +#if defined(UPPERCASE_FORTRAN) +#define F_FUNC(f,F) _##F##_ +#else +#define F_FUNC(f,F) _##f##_ +#endif +#endif +#else +#if defined(NO_APPEND_FORTRAN) +#if defined(UPPERCASE_FORTRAN) +#define F_FUNC(f,F) F +#else +#define F_FUNC(f,F) f +#endif +#else +#if defined(UPPERCASE_FORTRAN) +#define F_FUNC(f,F) F##_ +#else +#define F_FUNC(f,F) f##_ +#endif +#endif +#endif +#if defined(UNDERSCORE_G77) +#define F_FUNC_US(f,F) F_FUNC(f##_,F##_) +#else +#define F_FUNC_US(f,F) F_FUNC(f,F) +#endif + +#define rank(var) var ## _Rank +#define shape(var,dim) var ## _Dims[dim] +#define old_rank(var) (PyArray_NDIM((PyArrayObject *)(capi_ ## var ## _tmp))) +#define old_shape(var,dim) PyArray_DIM(((PyArrayObject *)(capi_ ## var ## _tmp)),dim) +#define fshape(var,dim) shape(var,rank(var)-dim-1) +#define len(var) shape(var,0) +#define flen(var) fshape(var,0) +#define old_size(var) PyArray_SIZE((PyArrayObject *)(capi_ ## var ## _tmp)) +/* #define index(i) capi_i ## i */ +#define slen(var) capi_ ## var ## _len +#define size(var, ...) f2py_size((PyArrayObject *)(capi_ ## var ## _tmp), ## __VA_ARGS__, -1) + +#ifdef DEBUGCFUNCS +#define CFUNCSMESS(mess) fprintf(stderr,"debug-capi:"mess); +#define CFUNCSMESSPY(mess,obj) CFUNCSMESS(mess) \ + PyObject_Print((PyObject *)obj,stderr,Py_PRINT_RAW);\ + fprintf(stderr,"\n"); +#else +#define CFUNCSMESS(mess) +#define CFUNCSMESSPY(mess,obj) +#endif + +#ifndef max +#define max(a,b) ((a > b) ? (a) : (b)) +#endif +#ifndef min +#define min(a,b) ((a < b) ? (a) : (b)) +#endif +#ifndef MAX +#define MAX(a,b) ((a > b) ? (a) : (b)) +#endif +#ifndef MIN +#define MIN(a,b) ((a < b) ? (a) : (b)) +#endif + +#if defined(PREPEND_FORTRAN) +#if defined(NO_APPEND_FORTRAN) +#if defined(UPPERCASE_FORTRAN) +#define F_WRAPPEDFUNC(f,F) _F2PYWRAP##F +#else +#define F_WRAPPEDFUNC(f,F) _f2pywrap##f +#endif +#else +#if defined(UPPERCASE_FORTRAN) +#define F_WRAPPEDFUNC(f,F) _F2PYWRAP##F##_ +#else +#define F_WRAPPEDFUNC(f,F) _f2pywrap##f##_ +#endif +#endif +#else +#if defined(NO_APPEND_FORTRAN) +#if defined(UPPERCASE_FORTRAN) +#define F_WRAPPEDFUNC(f,F) F2PYWRAP##F +#else +#define F_WRAPPEDFUNC(f,F) f2pywrap##f +#endif +#else +#if defined(UPPERCASE_FORTRAN) +#define F_WRAPPEDFUNC(f,F) F2PYWRAP##F##_ +#else +#define F_WRAPPEDFUNC(f,F) f2pywrap##f##_ +#endif +#endif +#endif +#if defined(UNDERSCORE_G77) +#define F_WRAPPEDFUNC_US(f,F) F_WRAPPEDFUNC(f##_,F##_) +#else +#define F_WRAPPEDFUNC_US(f,F) F_WRAPPEDFUNC(f,F) +#endif + + +/************************ See f2py2e/cfuncs.py: cfuncs ************************/ +static int +double_from_pyobj(double* v, PyObject *obj, const char *errmess) +{ + PyObject* tmp = NULL; + if (PyFloat_Check(obj)) { + *v = PyFloat_AsDouble(obj); + return !(*v == -1.0 && PyErr_Occurred()); + } + + tmp = PyNumber_Float(obj); + if (tmp) { + *v = PyFloat_AsDouble(tmp); + Py_DECREF(tmp); + return !(*v == -1.0 && PyErr_Occurred()); + } + if (PyComplex_Check(obj)) + tmp = PyObject_GetAttrString(obj,"real"); + else if (PyBytes_Check(obj) || PyUnicode_Check(obj)) + /*pass*/; + else if (PySequence_Check(obj)) + tmp = PySequence_GetItem(obj,0); + if (tmp) { + PyErr_Clear(); + if (double_from_pyobj(v,tmp,errmess)) {Py_DECREF(tmp); return 1;} + Py_DECREF(tmp); + } + { + PyObject* err = PyErr_Occurred(); + if (err==NULL) err = efermi_module_error; + PyErr_SetString(err,errmess); + } + return 0; +} + +static int f2py_size(PyArrayObject* var, ...) +{ + npy_int sz = 0; + npy_int dim; + npy_int rank; + va_list argp; + va_start(argp, var); + dim = va_arg(argp, npy_int); + if (dim==-1) + { + sz = PyArray_SIZE(var); + } + else + { + rank = PyArray_NDIM(var); + if (dim>=1 && dim<=rank) + sz = PyArray_DIM(var, dim-1); + else + fprintf(stderr, "f2py_size: 2nd argument value=%d fails to satisfy 1<=value<=%d. Result will be 0.\n", dim, rank); + } + va_end(argp); + return sz; +} + +static int +int_from_pyobj(int* v, PyObject *obj, const char *errmess) +{ + PyObject* tmp = NULL; + + if (PyLong_Check(obj)) { + *v = Npy__PyLong_AsInt(obj); + return !(*v == -1 && PyErr_Occurred()); + } + + tmp = PyNumber_Long(obj); + if (tmp) { + *v = Npy__PyLong_AsInt(tmp); + Py_DECREF(tmp); + return !(*v == -1 && PyErr_Occurred()); + } + + if (PyComplex_Check(obj)) + tmp = PyObject_GetAttrString(obj,"real"); + else if (PyBytes_Check(obj) || PyUnicode_Check(obj)) + /*pass*/; + else if (PySequence_Check(obj)) + tmp = PySequence_GetItem(obj, 0); + if (tmp) { + PyErr_Clear(); + if (int_from_pyobj(v, tmp, errmess)) { + Py_DECREF(tmp); + return 1; + } + Py_DECREF(tmp); + } + { + PyObject* err = PyErr_Occurred(); + if (err == NULL) { + err = efermi_module_error; + } + PyErr_SetString(err, errmess); + } + return 0; +} + +static int +float_from_pyobj(float* v, PyObject *obj, const char *errmess) +{ + double d=0.0; + if (double_from_pyobj(&d,obj,errmess)) { + *v = (float)d; + return 1; + } + return 0; +} + + +/********************* See f2py2e/cfuncs.py: userincludes *********************/ +/*need_userincludes*/ + +/********************* See f2py2e/capi_rules.py: usercode *********************/ + + +/* See f2py2e/rules.py */ +extern void F_FUNC(efermi,EFERMI)(int*,int*,float*,int*,int*,int*,float*,float*,float*,float*,float*,float*,float*,float*,int*); +extern void F_WRAPPEDFUNC_US(erf_c,ERF_C)(float*,float*); +extern void F_WRAPPEDFUNC(fermid,FERMID)(float*,float*); +extern void F_WRAPPEDFUNC(delthm,DELTHM)(float*,float*); +extern void F_WRAPPEDFUNC(spline,SPLINE)(float*,float*); +extern void F_WRAPPEDFUNC(poshm,POSHM)(float*,float*); +extern void F_WRAPPEDFUNC(poshm2,POSHM2)(float*,float*); +/*eof externroutines*/ + +/******************** See f2py2e/capi_rules.py: usercode1 ********************/ + + +/******************* See f2py2e/cb_rules.py: buildcallback *******************/ +/*need_callbacks*/ + +/*********************** See f2py2e/rules.py: buildapi ***********************/ + +/*********************************** efermi ***********************************/ +static char doc_f2py_rout_efermi_module_efermi[] = "\ +occ,ef,sort,eigmin,eigmax,enocc = efermi(nel,nbands,del,nsppts,weight,ef,eigval,ismear)\n\nWrapper for ``efermi``.\ +\n\nParameters\n----------\n" +"nel : input int\n" +"nbands : input int\n" +"del : input float\n" +"nsppts : input int\n" +"weight : input rank-1 array('f') with bounds (nsppts)\n" +"ef : input float\n" +"eigval : input rank-2 array('f') with bounds (nsppts,nbands)\n" +"ismear : input int\n" +"\nReturns\n-------\n" +"occ : rank-2 array('f') with bounds (nsppts,nbands)\n" +"ef : float\n" +"sort : rank-1 array('f') with bounds (nsppts*nbands)\n" +"eigmin : float\n" +"eigmax : float\n" +"enocc : float"; +/* extern void F_FUNC(efermi,EFERMI)(int*,int*,float*,int*,int*,int*,float*,float*,float*,float*,float*,float*,float*,float*,int*); */ +static PyObject *f2py_rout_efermi_module_efermi(const PyObject *capi_self, + PyObject *capi_args, + PyObject *capi_keywds, + void (*f2py_func)(int*,int*,float*,int*,int*,int*,float*,float*,float*,float*,float*,float*,float*,float*,int*)) { + PyObject * volatile capi_buildvalue = NULL; + volatile int f2py_success = 1; +/*decl*/ + + int nel = 0; + PyObject *nel_capi = Py_None; + int nbands = 0; + PyObject *nbands_capi = Py_None; + float del = 0; + PyObject *del_capi = Py_None; + int nsppts = 0; + PyObject *nsppts_capi = Py_None; + int ndim8 = 0; + int ndim10 = 0; + float *weight = NULL; + npy_intp weight_Dims[1] = {-1}; + const int weight_Rank = 1; + PyArrayObject *capi_weight_tmp = NULL; + int capi_weight_intent = 0; + PyObject *weight_capi = Py_None; + float *occ = NULL; + npy_intp occ_Dims[2] = {-1, -1}; + const int occ_Rank = 2; + PyArrayObject *capi_occ_tmp = NULL; + int capi_occ_intent = 0; + float ef = 0; + PyObject *ef_capi = Py_None; + float *eigval = NULL; + npy_intp eigval_Dims[2] = {-1, -1}; + const int eigval_Rank = 2; + PyArrayObject *capi_eigval_tmp = NULL; + int capi_eigval_intent = 0; + PyObject *eigval_capi = Py_None; + float *sort = NULL; + npy_intp sort_Dims[1] = {-1}; + const int sort_Rank = 1; + PyArrayObject *capi_sort_tmp = NULL; + int capi_sort_intent = 0; + float eigmin = 0; + float eigmax = 0; + float enocc = 0; + int ismear = 0; + PyObject *ismear_capi = Py_None; + static char *capi_kwlist[] = {"nel","nbands","del","nsppts","weight","ef","eigval","ismear",NULL}; + +/*routdebugenter*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_clock(); +#endif + if (!PyArg_ParseTupleAndKeywords(capi_args,capi_keywds,\ + "OOOOOOOO|:efermi_module.efermi",\ + capi_kwlist,&nel_capi,&nbands_capi,&del_capi,&nsppts_capi,&weight_capi,&ef_capi,&eigval_capi,&ismear_capi)) + return NULL; +/*frompyobj*/ + /* Processing variable nel */ + f2py_success = int_from_pyobj(&nel,nel_capi,"efermi_module.efermi() 1st argument (nel) can't be converted to int"); + if (f2py_success) { + /* Processing variable nbands */ + f2py_success = int_from_pyobj(&nbands,nbands_capi,"efermi_module.efermi() 2nd argument (nbands) can't be converted to int"); + if (f2py_success) { + /* Processing variable del */ + f2py_success = float_from_pyobj(&del,del_capi,"efermi_module.efermi() 3rd argument (del) can't be converted to float"); + if (f2py_success) { + /* Processing variable nsppts */ + f2py_success = int_from_pyobj(&nsppts,nsppts_capi,"efermi_module.efermi() 4th argument (nsppts) can't be converted to int"); + if (f2py_success) { + /* Processing variable ef */ + f2py_success = float_from_pyobj(&ef,ef_capi,"efermi_module.efermi() 6th argument (ef) can't be converted to float"); + if (f2py_success) { + /* Processing variable eigmin */ + /* Processing variable eigmax */ + /* Processing variable enocc */ + /* Processing variable ismear */ + f2py_success = int_from_pyobj(&ismear,ismear_capi,"efermi_module.efermi() 8th argument (ismear) can't be converted to int"); + if (f2py_success) { + /* Processing variable ndim8 */ + ndim8 = nbands; + /* Processing variable ndim10 */ + ndim10 = nsppts; + /* Processing variable weight */ + weight_Dims[0]=nsppts; + capi_weight_intent |= F2PY_INTENT_IN; + capi_weight_tmp = array_from_pyobj(NPY_FLOAT,weight_Dims,weight_Rank,capi_weight_intent,weight_capi); + if (capi_weight_tmp == NULL) { + PyObject *exc, *val, *tb; + PyErr_Fetch(&exc, &val, &tb); + PyErr_SetString(exc ? exc : efermi_module_error,"failed in converting 5th argument `weight' of efermi_module.efermi to C/Fortran array" ); + npy_PyErr_ChainExceptionsCause(exc, val, tb); + } else { + weight = (float *)(PyArray_DATA(capi_weight_tmp)); + + /* Processing variable occ */ + occ_Dims[0]=nsppts,occ_Dims[1]=nbands; + capi_occ_intent |= F2PY_INTENT_OUT|F2PY_INTENT_HIDE; + capi_occ_tmp = array_from_pyobj(NPY_FLOAT,occ_Dims,occ_Rank,capi_occ_intent,Py_None); + if (capi_occ_tmp == NULL) { + PyObject *exc, *val, *tb; + PyErr_Fetch(&exc, &val, &tb); + PyErr_SetString(exc ? exc : efermi_module_error,"failed in converting hidden `occ' of efermi_module.efermi to C/Fortran array" ); + npy_PyErr_ChainExceptionsCause(exc, val, tb); + } else { + occ = (float *)(PyArray_DATA(capi_occ_tmp)); + + /* Processing variable eigval */ + eigval_Dims[0]=nsppts,eigval_Dims[1]=nbands; + capi_eigval_intent |= F2PY_INTENT_IN; + capi_eigval_tmp = array_from_pyobj(NPY_FLOAT,eigval_Dims,eigval_Rank,capi_eigval_intent,eigval_capi); + if (capi_eigval_tmp == NULL) { + PyObject *exc, *val, *tb; + PyErr_Fetch(&exc, &val, &tb); + PyErr_SetString(exc ? exc : efermi_module_error,"failed in converting 7th argument `eigval' of efermi_module.efermi to C/Fortran array" ); + npy_PyErr_ChainExceptionsCause(exc, val, tb); + } else { + eigval = (float *)(PyArray_DATA(capi_eigval_tmp)); + + /* Processing variable sort */ + sort_Dims[0]=nsppts*nbands; + capi_sort_intent |= F2PY_INTENT_OUT|F2PY_INTENT_HIDE; + capi_sort_tmp = array_from_pyobj(NPY_FLOAT,sort_Dims,sort_Rank,capi_sort_intent,Py_None); + if (capi_sort_tmp == NULL) { + PyObject *exc, *val, *tb; + PyErr_Fetch(&exc, &val, &tb); + PyErr_SetString(exc ? exc : efermi_module_error,"failed in converting hidden `sort' of efermi_module.efermi to C/Fortran array" ); + npy_PyErr_ChainExceptionsCause(exc, val, tb); + } else { + sort = (float *)(PyArray_DATA(capi_sort_tmp)); + +/*end of frompyobj*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_call_clock(); +#endif +/*callfortranroutine*/ + (*f2py_func)(&nel,&nbands,&del,&nsppts,&ndim8,&ndim10,weight,occ,&ef,eigval,sort,&eigmin,&eigmax,&enocc,&ismear); +if (PyErr_Occurred()) + f2py_success = 0; +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_call_clock(); +#endif +/*end of callfortranroutine*/ + if (f2py_success) { +/*pyobjfrom*/ +/*end of pyobjfrom*/ + CFUNCSMESS("Building return value.\n"); + capi_buildvalue = Py_BuildValue("NfNfff",capi_occ_tmp,ef,capi_sort_tmp,eigmin,eigmax,enocc); +/*closepyobjfrom*/ +/*end of closepyobjfrom*/ + } /*if (f2py_success) after callfortranroutine*/ +/*cleanupfrompyobj*/ + } /*if (capi_sort_tmp == NULL) ... else of sort*/ + /* End of cleaning variable sort */ + if((PyObject *)capi_eigval_tmp!=eigval_capi) { + Py_XDECREF(capi_eigval_tmp); } + } /*if (capi_eigval_tmp == NULL) ... else of eigval*/ + /* End of cleaning variable eigval */ + } /*if (capi_occ_tmp == NULL) ... else of occ*/ + /* End of cleaning variable occ */ + if((PyObject *)capi_weight_tmp!=weight_capi) { + Py_XDECREF(capi_weight_tmp); } + } /*if (capi_weight_tmp == NULL) ... else of weight*/ + /* End of cleaning variable weight */ + /* End of cleaning variable ndim10 */ + /* End of cleaning variable ndim8 */ + } /*if (f2py_success) of ismear*/ + /* End of cleaning variable ismear */ + /* End of cleaning variable enocc */ + /* End of cleaning variable eigmax */ + /* End of cleaning variable eigmin */ + } /*if (f2py_success) of ef*/ + /* End of cleaning variable ef */ + } /*if (f2py_success) of nsppts*/ + /* End of cleaning variable nsppts */ + } /*if (f2py_success) of del*/ + /* End of cleaning variable del */ + } /*if (f2py_success) of nbands*/ + /* End of cleaning variable nbands */ + } /*if (f2py_success) of nel*/ + /* End of cleaning variable nel */ +/*end of cleanupfrompyobj*/ + if (capi_buildvalue == NULL) { +/*routdebugfailure*/ + } else { +/*routdebugleave*/ + } + CFUNCSMESS("Freeing memory.\n"); +/*freemem*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_clock(); +#endif + return capi_buildvalue; +} +/******************************* end of efermi *******************************/ + +/*********************************** erf_c ***********************************/ +static char doc_f2py_rout_efermi_module_erf_c[] = "\ +erf_c = erf_c(xx)\n\nWrapper for ``erf_c``.\ +\n\nParameters\n----------\n" +"xx : input float\n" +"\nReturns\n-------\n" +"erf_c : float"; +/* extern void F_WRAPPEDFUNC_US(erf_c,ERF_C)(float*,float*); */ +static PyObject *f2py_rout_efermi_module_erf_c(const PyObject *capi_self, + PyObject *capi_args, + PyObject *capi_keywds, + void (*f2py_func)(float*,float*)) { + PyObject * volatile capi_buildvalue = NULL; + volatile int f2py_success = 1; +/*decl*/ + + float erf_c = 0; + float xx = 0; + PyObject *xx_capi = Py_None; + static char *capi_kwlist[] = {"xx",NULL}; + +/*routdebugenter*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_clock(); +#endif + if (!PyArg_ParseTupleAndKeywords(capi_args,capi_keywds,\ + "O|:efermi_module.erf_c",\ + capi_kwlist,&xx_capi)) + return NULL; +/*frompyobj*/ + /* Processing variable xx */ + f2py_success = float_from_pyobj(&xx,xx_capi,"efermi_module.erf_c() 1st argument (xx) can't be converted to float"); + if (f2py_success) { + /* Processing variable erf_c */ +/*end of frompyobj*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_call_clock(); +#endif +/*callfortranroutine*/ + (*f2py_func)(&erf_c,&xx); +if (PyErr_Occurred()) + f2py_success = 0; +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_call_clock(); +#endif +/*end of callfortranroutine*/ + if (f2py_success) { +/*pyobjfrom*/ +/*end of pyobjfrom*/ + CFUNCSMESS("Building return value.\n"); + capi_buildvalue = Py_BuildValue("f",erf_c); +/*closepyobjfrom*/ +/*end of closepyobjfrom*/ + } /*if (f2py_success) after callfortranroutine*/ +/*cleanupfrompyobj*/ + /* End of cleaning variable erf_c */ + } /*if (f2py_success) of xx*/ + /* End of cleaning variable xx */ +/*end of cleanupfrompyobj*/ + if (capi_buildvalue == NULL) { +/*routdebugfailure*/ + } else { +/*routdebugleave*/ + } + CFUNCSMESS("Freeing memory.\n"); +/*freemem*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_clock(); +#endif + return capi_buildvalue; +} +/******************************** end of erf_c ********************************/ + +/*********************************** fermid ***********************************/ +static char doc_f2py_rout_efermi_module_fermid[] = "\ +fermid = fermid(xx)\n\nWrapper for ``fermid``.\ +\n\nParameters\n----------\n" +"xx : input float\n" +"\nReturns\n-------\n" +"fermid : float"; +/* extern void F_WRAPPEDFUNC(fermid,FERMID)(float*,float*); */ +static PyObject *f2py_rout_efermi_module_fermid(const PyObject *capi_self, + PyObject *capi_args, + PyObject *capi_keywds, + void (*f2py_func)(float*,float*)) { + PyObject * volatile capi_buildvalue = NULL; + volatile int f2py_success = 1; +/*decl*/ + + float fermid = 0; + float xx = 0; + PyObject *xx_capi = Py_None; + static char *capi_kwlist[] = {"xx",NULL}; + +/*routdebugenter*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_clock(); +#endif + if (!PyArg_ParseTupleAndKeywords(capi_args,capi_keywds,\ + "O|:efermi_module.fermid",\ + capi_kwlist,&xx_capi)) + return NULL; +/*frompyobj*/ + /* Processing variable xx */ + f2py_success = float_from_pyobj(&xx,xx_capi,"efermi_module.fermid() 1st argument (xx) can't be converted to float"); + if (f2py_success) { + /* Processing variable fermid */ +/*end of frompyobj*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_call_clock(); +#endif +/*callfortranroutine*/ + (*f2py_func)(&fermid,&xx); +if (PyErr_Occurred()) + f2py_success = 0; +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_call_clock(); +#endif +/*end of callfortranroutine*/ + if (f2py_success) { +/*pyobjfrom*/ +/*end of pyobjfrom*/ + CFUNCSMESS("Building return value.\n"); + capi_buildvalue = Py_BuildValue("f",fermid); +/*closepyobjfrom*/ +/*end of closepyobjfrom*/ + } /*if (f2py_success) after callfortranroutine*/ +/*cleanupfrompyobj*/ + /* End of cleaning variable fermid */ + } /*if (f2py_success) of xx*/ + /* End of cleaning variable xx */ +/*end of cleanupfrompyobj*/ + if (capi_buildvalue == NULL) { +/*routdebugfailure*/ + } else { +/*routdebugleave*/ + } + CFUNCSMESS("Freeing memory.\n"); +/*freemem*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_clock(); +#endif + return capi_buildvalue; +} +/******************************* end of fermid *******************************/ + +/*********************************** delthm ***********************************/ +static char doc_f2py_rout_efermi_module_delthm[] = "\ +delthm = delthm(xx)\n\nWrapper for ``delthm``.\ +\n\nParameters\n----------\n" +"xx : input float\n" +"\nReturns\n-------\n" +"delthm : float"; +/* extern void F_WRAPPEDFUNC(delthm,DELTHM)(float*,float*); */ +static PyObject *f2py_rout_efermi_module_delthm(const PyObject *capi_self, + PyObject *capi_args, + PyObject *capi_keywds, + void (*f2py_func)(float*,float*)) { + PyObject * volatile capi_buildvalue = NULL; + volatile int f2py_success = 1; +/*decl*/ + + float delthm = 0; + float xx = 0; + PyObject *xx_capi = Py_None; + static char *capi_kwlist[] = {"xx",NULL}; + +/*routdebugenter*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_clock(); +#endif + if (!PyArg_ParseTupleAndKeywords(capi_args,capi_keywds,\ + "O|:efermi_module.delthm",\ + capi_kwlist,&xx_capi)) + return NULL; +/*frompyobj*/ + /* Processing variable xx */ + f2py_success = float_from_pyobj(&xx,xx_capi,"efermi_module.delthm() 1st argument (xx) can't be converted to float"); + if (f2py_success) { + /* Processing variable delthm */ +/*end of frompyobj*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_call_clock(); +#endif +/*callfortranroutine*/ + (*f2py_func)(&delthm,&xx); +if (PyErr_Occurred()) + f2py_success = 0; +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_call_clock(); +#endif +/*end of callfortranroutine*/ + if (f2py_success) { +/*pyobjfrom*/ +/*end of pyobjfrom*/ + CFUNCSMESS("Building return value.\n"); + capi_buildvalue = Py_BuildValue("f",delthm); +/*closepyobjfrom*/ +/*end of closepyobjfrom*/ + } /*if (f2py_success) after callfortranroutine*/ +/*cleanupfrompyobj*/ + /* End of cleaning variable delthm */ + } /*if (f2py_success) of xx*/ + /* End of cleaning variable xx */ +/*end of cleanupfrompyobj*/ + if (capi_buildvalue == NULL) { +/*routdebugfailure*/ + } else { +/*routdebugleave*/ + } + CFUNCSMESS("Freeing memory.\n"); +/*freemem*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_clock(); +#endif + return capi_buildvalue; +} +/******************************* end of delthm *******************************/ + +/*********************************** spline ***********************************/ +static char doc_f2py_rout_efermi_module_spline[] = "\ +spline = spline(x)\n\nWrapper for ``spline``.\ +\n\nParameters\n----------\n" +"x : input float\n" +"\nReturns\n-------\n" +"spline : float"; +/* extern void F_WRAPPEDFUNC(spline,SPLINE)(float*,float*); */ +static PyObject *f2py_rout_efermi_module_spline(const PyObject *capi_self, + PyObject *capi_args, + PyObject *capi_keywds, + void (*f2py_func)(float*,float*)) { + PyObject * volatile capi_buildvalue = NULL; + volatile int f2py_success = 1; +/*decl*/ + + float spline = 0; + float x = 0; + PyObject *x_capi = Py_None; + static char *capi_kwlist[] = {"x",NULL}; + +/*routdebugenter*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_clock(); +#endif + if (!PyArg_ParseTupleAndKeywords(capi_args,capi_keywds,\ + "O|:efermi_module.spline",\ + capi_kwlist,&x_capi)) + return NULL; +/*frompyobj*/ + /* Processing variable x */ + f2py_success = float_from_pyobj(&x,x_capi,"efermi_module.spline() 1st argument (x) can't be converted to float"); + if (f2py_success) { + /* Processing variable spline */ +/*end of frompyobj*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_call_clock(); +#endif +/*callfortranroutine*/ + (*f2py_func)(&spline,&x); +if (PyErr_Occurred()) + f2py_success = 0; +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_call_clock(); +#endif +/*end of callfortranroutine*/ + if (f2py_success) { +/*pyobjfrom*/ +/*end of pyobjfrom*/ + CFUNCSMESS("Building return value.\n"); + capi_buildvalue = Py_BuildValue("f",spline); +/*closepyobjfrom*/ +/*end of closepyobjfrom*/ + } /*if (f2py_success) after callfortranroutine*/ +/*cleanupfrompyobj*/ + /* End of cleaning variable spline */ + } /*if (f2py_success) of x*/ + /* End of cleaning variable x */ +/*end of cleanupfrompyobj*/ + if (capi_buildvalue == NULL) { +/*routdebugfailure*/ + } else { +/*routdebugleave*/ + } + CFUNCSMESS("Freeing memory.\n"); +/*freemem*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_clock(); +#endif + return capi_buildvalue; +} +/******************************* end of spline *******************************/ + +/*********************************** poshm ***********************************/ +static char doc_f2py_rout_efermi_module_poshm[] = "\ +poshm = poshm(x)\n\nWrapper for ``poshm``.\ +\n\nParameters\n----------\n" +"x : input float\n" +"\nReturns\n-------\n" +"poshm : float"; +/* extern void F_WRAPPEDFUNC(poshm,POSHM)(float*,float*); */ +static PyObject *f2py_rout_efermi_module_poshm(const PyObject *capi_self, + PyObject *capi_args, + PyObject *capi_keywds, + void (*f2py_func)(float*,float*)) { + PyObject * volatile capi_buildvalue = NULL; + volatile int f2py_success = 1; +/*decl*/ + + float poshm = 0; + float x = 0; + PyObject *x_capi = Py_None; + static char *capi_kwlist[] = {"x",NULL}; + +/*routdebugenter*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_clock(); +#endif + if (!PyArg_ParseTupleAndKeywords(capi_args,capi_keywds,\ + "O|:efermi_module.poshm",\ + capi_kwlist,&x_capi)) + return NULL; +/*frompyobj*/ + /* Processing variable x */ + f2py_success = float_from_pyobj(&x,x_capi,"efermi_module.poshm() 1st argument (x) can't be converted to float"); + if (f2py_success) { + /* Processing variable poshm */ +/*end of frompyobj*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_call_clock(); +#endif +/*callfortranroutine*/ + (*f2py_func)(&poshm,&x); +if (PyErr_Occurred()) + f2py_success = 0; +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_call_clock(); +#endif +/*end of callfortranroutine*/ + if (f2py_success) { +/*pyobjfrom*/ +/*end of pyobjfrom*/ + CFUNCSMESS("Building return value.\n"); + capi_buildvalue = Py_BuildValue("f",poshm); +/*closepyobjfrom*/ +/*end of closepyobjfrom*/ + } /*if (f2py_success) after callfortranroutine*/ +/*cleanupfrompyobj*/ + /* End of cleaning variable poshm */ + } /*if (f2py_success) of x*/ + /* End of cleaning variable x */ +/*end of cleanupfrompyobj*/ + if (capi_buildvalue == NULL) { +/*routdebugfailure*/ + } else { +/*routdebugleave*/ + } + CFUNCSMESS("Freeing memory.\n"); +/*freemem*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_clock(); +#endif + return capi_buildvalue; +} +/******************************** end of poshm ********************************/ + +/*********************************** poshm2 ***********************************/ +static char doc_f2py_rout_efermi_module_poshm2[] = "\ +poshm2 = poshm2(x)\n\nWrapper for ``poshm2``.\ +\n\nParameters\n----------\n" +"x : input float\n" +"\nReturns\n-------\n" +"poshm2 : float"; +/* extern void F_WRAPPEDFUNC(poshm2,POSHM2)(float*,float*); */ +static PyObject *f2py_rout_efermi_module_poshm2(const PyObject *capi_self, + PyObject *capi_args, + PyObject *capi_keywds, + void (*f2py_func)(float*,float*)) { + PyObject * volatile capi_buildvalue = NULL; + volatile int f2py_success = 1; +/*decl*/ + + float poshm2 = 0; + float x = 0; + PyObject *x_capi = Py_None; + static char *capi_kwlist[] = {"x",NULL}; + +/*routdebugenter*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_clock(); +#endif + if (!PyArg_ParseTupleAndKeywords(capi_args,capi_keywds,\ + "O|:efermi_module.poshm2",\ + capi_kwlist,&x_capi)) + return NULL; +/*frompyobj*/ + /* Processing variable x */ + f2py_success = float_from_pyobj(&x,x_capi,"efermi_module.poshm2() 1st argument (x) can't be converted to float"); + if (f2py_success) { + /* Processing variable poshm2 */ +/*end of frompyobj*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_call_clock(); +#endif +/*callfortranroutine*/ + (*f2py_func)(&poshm2,&x); +if (PyErr_Occurred()) + f2py_success = 0; +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_call_clock(); +#endif +/*end of callfortranroutine*/ + if (f2py_success) { +/*pyobjfrom*/ +/*end of pyobjfrom*/ + CFUNCSMESS("Building return value.\n"); + capi_buildvalue = Py_BuildValue("f",poshm2); +/*closepyobjfrom*/ +/*end of closepyobjfrom*/ + } /*if (f2py_success) after callfortranroutine*/ +/*cleanupfrompyobj*/ + /* End of cleaning variable poshm2 */ + } /*if (f2py_success) of x*/ + /* End of cleaning variable x */ +/*end of cleanupfrompyobj*/ + if (capi_buildvalue == NULL) { +/*routdebugfailure*/ + } else { +/*routdebugleave*/ + } + CFUNCSMESS("Freeing memory.\n"); +/*freemem*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_clock(); +#endif + return capi_buildvalue; +} +/******************************* end of poshm2 *******************************/ +/*eof body*/ + +/******************* See f2py2e/f90mod_rules.py: buildhooks *******************/ +/*need_f90modhooks*/ + +/************** See f2py2e/rules.py: module_rules['modulebody'] **************/ + +/******************* See f2py2e/common_rules.py: buildhooks *******************/ + +static FortranDataDef f2py_warn_def[] = { + {"iwarn",0,{{-1}},NPY_INT}, + {NULL} +}; +static void f2py_setup_warn(char *iwarn) { + int i_f2py=0; + f2py_warn_def[i_f2py++].data = iwarn; +} +extern void F_FUNC(f2pyinitwarn,F2PYINITWARN)(void(*)(char*)); +static void f2py_init_warn(void) { + F_FUNC(f2pyinitwarn,F2PYINITWARN)(f2py_setup_warn); +} + +/*need_commonhooks*/ + +/**************************** See f2py2e/rules.py ****************************/ + +static FortranDataDef f2py_routine_defs[] = { + {"efermi",-1,{{-1}},0,(char *)F_FUNC(efermi,EFERMI),(f2py_init_func)f2py_rout_efermi_module_efermi,doc_f2py_rout_efermi_module_efermi}, + {"erf_c",-1,{{-1}},0,(char *)F_WRAPPEDFUNC_US(erf_c,ERF_C),(f2py_init_func)f2py_rout_efermi_module_erf_c,doc_f2py_rout_efermi_module_erf_c}, + {"fermid",-1,{{-1}},0,(char *)F_WRAPPEDFUNC(fermid,FERMID),(f2py_init_func)f2py_rout_efermi_module_fermid,doc_f2py_rout_efermi_module_fermid}, + {"delthm",-1,{{-1}},0,(char *)F_WRAPPEDFUNC(delthm,DELTHM),(f2py_init_func)f2py_rout_efermi_module_delthm,doc_f2py_rout_efermi_module_delthm}, + {"spline",-1,{{-1}},0,(char *)F_WRAPPEDFUNC(spline,SPLINE),(f2py_init_func)f2py_rout_efermi_module_spline,doc_f2py_rout_efermi_module_spline}, + {"poshm",-1,{{-1}},0,(char *)F_WRAPPEDFUNC(poshm,POSHM),(f2py_init_func)f2py_rout_efermi_module_poshm,doc_f2py_rout_efermi_module_poshm}, + {"poshm2",-1,{{-1}},0,(char *)F_WRAPPEDFUNC(poshm2,POSHM2),(f2py_init_func)f2py_rout_efermi_module_poshm2,doc_f2py_rout_efermi_module_poshm2}, + +/*eof routine_defs*/ + {NULL} +}; + +static PyMethodDef f2py_module_methods[] = { + + {NULL,NULL} +}; + +static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, + "efermi_module", + NULL, + -1, + f2py_module_methods, + NULL, + NULL, + NULL, + NULL +}; + +PyMODINIT_FUNC PyInit_efermi_module(void) { + int i; + PyObject *m,*d, *s, *tmp; + m = efermi_module_module = PyModule_Create(&moduledef); + Py_SET_TYPE(&PyFortran_Type, &PyType_Type); + import_array(); + if (PyErr_Occurred()) + {PyErr_SetString(PyExc_ImportError, "can't initialize module efermi_module (failed to import numpy)"); return m;} + d = PyModule_GetDict(m); + s = PyUnicode_FromString("1.21.1"); + PyDict_SetItemString(d, "__version__", s); + Py_DECREF(s); + s = PyUnicode_FromString( + "This module 'efermi_module' is auto-generated with f2py (version:1.21.1).\nFunctions:\n" +" occ,ef,sort,eigmin,eigmax,enocc = efermi(nel,nbands,del,nsppts,weight,ef,eigval,ismear)\n" +" erf_c = erf_c(xx)\n" +" fermid = fermid(xx)\n" +" delthm = delthm(xx)\n" +" spline = spline(x)\n" +" poshm = poshm(x)\n" +" poshm2 = poshm2(x)\n" +"COMMON blocks:\n"" /warn/ iwarn\n""."); + PyDict_SetItemString(d, "__doc__", s); + Py_DECREF(s); + s = PyUnicode_FromString("1.21.1"); + PyDict_SetItemString(d, "__f2py_numpy_version__", s); + Py_DECREF(s); + efermi_module_error = PyErr_NewException ("efermi_module.error", NULL, NULL); + /* + * Store the error object inside the dict, so that it could get deallocated. + * (in practice, this is a module, so it likely will not and cannot.) + */ + PyDict_SetItemString(d, "_efermi_module_error", efermi_module_error); + Py_DECREF(efermi_module_error); + for(i=0;f2py_routine_defs[i].name!=NULL;i++) { + tmp = PyFortranObject_NewAsAttr(&f2py_routine_defs[i]); + PyDict_SetItemString(d, f2py_routine_defs[i].name, tmp); + Py_DECREF(tmp); + } + + + { + extern float F_FUNC_US(erf_c,ERF_C)(void); + PyObject* o = PyDict_GetItemString(d,"erf_c"); + tmp = F2PyCapsule_FromVoidPtr((void*)F_FUNC_US(erf_c,ERF_C),NULL); + PyObject_SetAttrString(o,"_cpointer", tmp); + Py_DECREF(tmp); + s = PyUnicode_FromString("erf_c"); + PyObject_SetAttrString(o,"__name__", s); + Py_DECREF(s); + } + + + { + extern float F_FUNC(fermid,FERMID)(void); + PyObject* o = PyDict_GetItemString(d,"fermid"); + tmp = F2PyCapsule_FromVoidPtr((void*)F_FUNC(fermid,FERMID),NULL); + PyObject_SetAttrString(o,"_cpointer", tmp); + Py_DECREF(tmp); + s = PyUnicode_FromString("fermid"); + PyObject_SetAttrString(o,"__name__", s); + Py_DECREF(s); + } + + + { + extern float F_FUNC(delthm,DELTHM)(void); + PyObject* o = PyDict_GetItemString(d,"delthm"); + tmp = F2PyCapsule_FromVoidPtr((void*)F_FUNC(delthm,DELTHM),NULL); + PyObject_SetAttrString(o,"_cpointer", tmp); + Py_DECREF(tmp); + s = PyUnicode_FromString("delthm"); + PyObject_SetAttrString(o,"__name__", s); + Py_DECREF(s); + } + + + { + extern float F_FUNC(spline,SPLINE)(void); + PyObject* o = PyDict_GetItemString(d,"spline"); + tmp = F2PyCapsule_FromVoidPtr((void*)F_FUNC(spline,SPLINE),NULL); + PyObject_SetAttrString(o,"_cpointer", tmp); + Py_DECREF(tmp); + s = PyUnicode_FromString("spline"); + PyObject_SetAttrString(o,"__name__", s); + Py_DECREF(s); + } + + + { + extern float F_FUNC(poshm,POSHM)(void); + PyObject* o = PyDict_GetItemString(d,"poshm"); + tmp = F2PyCapsule_FromVoidPtr((void*)F_FUNC(poshm,POSHM),NULL); + PyObject_SetAttrString(o,"_cpointer", tmp); + Py_DECREF(tmp); + s = PyUnicode_FromString("poshm"); + PyObject_SetAttrString(o,"__name__", s); + Py_DECREF(s); + } + + + { + extern float F_FUNC(poshm2,POSHM2)(void); + PyObject* o = PyDict_GetItemString(d,"poshm2"); + tmp = F2PyCapsule_FromVoidPtr((void*)F_FUNC(poshm2,POSHM2),NULL); + PyObject_SetAttrString(o,"_cpointer", tmp); + Py_DECREF(tmp); + s = PyUnicode_FromString("poshm2"); + PyObject_SetAttrString(o,"__name__", s); + Py_DECREF(s); + } + +/*eof initf2pywraphooks*/ +/*eof initf90modhooks*/ + + tmp = PyFortranObject_New(f2py_warn_def,f2py_init_warn); + F2PyDict_SetItemString(d, "warn", tmp); + Py_DECREF(tmp); +/*eof initcommonhooks*/ + + +#ifdef F2PY_REPORT_ATEXIT + if (! PyErr_Occurred()) + on_exit(f2py_report_on_exit,(void*)"efermi_module"); +#endif + return m; +} +#ifdef __cplusplus +} +#endif diff --git a/aiida_sssp_workflow/sssp_protocol.yml b/aiida_sssp_workflow/sssp_protocol.yml index a82da470..a08a9030 100644 --- a/aiida_sssp_workflow/sssp_protocol.yml +++ b/aiida_sssp_workflow/sssp_protocol.yml @@ -203,7 +203,7 @@ test: tr2_ph: 1.0e-16 max_evaluate: 3 # number of evaluation run, not include ref - reference_ecutwfc: 200.0 + reference_ecutwfc: 60.0 tolerance: 0.1 # 0.1(%) convergence_conv_thr: 2.0 # 2.0(%) diff --git a/aiida_sssp_workflow/workflows/bands_distance.py b/aiida_sssp_workflow/workflows/bands_distance.py index 4cd22660..65086140 100644 --- a/aiida_sssp_workflow/workflows/bands_distance.py +++ b/aiida_sssp_workflow/workflows/bands_distance.py @@ -256,9 +256,9 @@ def calculate_bands_distance(self): res = calculate_bands_distance( bands_structure_a=wca_bands_structure, - band_parameters_a=wca_bands_parameters, + bands_parameters_a=wca_bands_parameters, bands_structure_b=wcb_bands_structure, - band_parameters_b=wcb_bands_parameters, + bands_parameters_b=wcb_bands_parameters, smearing=orm.Float(self.ctx.degauss * self._RY_TO_EV), is_metal=orm.Bool(self.ctx.is_metal)) diff --git a/aiida_sssp_workflow/workflows/legacy_convergence/bands.py b/aiida_sssp_workflow/workflows/legacy_convergence/bands.py index e324c467..644f1cfe 100644 --- a/aiida_sssp_workflow/workflows/legacy_convergence/bands.py +++ b/aiida_sssp_workflow/workflows/legacy_convergence/bands.py @@ -314,9 +314,9 @@ def results(self): child_bands_structure = child.outputs.output_bands_structure res = helper_bands_distence_difference( bands_structure_a=child_bands_structure, - band_parameters_a=child_bands_parameters, + bands_parameters_a=child_bands_parameters, bands_structure_b=reference_bands_structure, - band_parameters_b=reference_bands_parameters, + bands_parameters_b=reference_bands_parameters, smearing=orm.Float(self.ctx.degauss * self._RY_TO_EV), is_metal=orm.Bool(self.ctx.is_metal)) diff --git a/aiida_sssp_workflow/workflows/legacy_convergence/pressure.py b/aiida_sssp_workflow/workflows/legacy_convergence/pressure.py index 000e2beb..3b4bfafe 100644 --- a/aiida_sssp_workflow/workflows/legacy_convergence/pressure.py +++ b/aiida_sssp_workflow/workflows/legacy_convergence/pressure.py @@ -328,7 +328,7 @@ def run_extra_reference(self): }, } self.ctx.pw_parameters = update_dict(self.ctx.pw_parameters, - parameters) + parameters) self.report(f'{self.ctx.pw_parameters}') # yapf: disable diff --git a/docs/source/images/sssp_mc_logo.png b/docs/source/_static/logo.png similarity index 100% rename from docs/source/images/sssp_mc_logo.png rename to docs/source/_static/logo.png diff --git a/docs/source/conf.py b/docs/source/conf.py index 53d1779b..882bcfbc 100755 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -1,354 +1,98 @@ # -*- coding: utf-8 -*- +# Configuration file for the Sphinx documentation builder. # -# Sphinx configuration for aiida-sssp-workflow -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. +# This file only contains a selection of the most common options. For a full +# list see the documentation: +# https://www.sphinx-doc.org/en/master/usage/configuration.html +from reentry import manager +manager.scan() + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# import os import sys -import time +sys.path.insert(0, os.path.abspath('../../')) import aiida_sssp_workflow -from aiida.manage.configuration import load_documentation_profile - -# -- AiiDA-related setup -------------------------------------------------- - -# Load the dummy profile even if we are running locally, this way the documentation will succeed even if the current -# default profile of the AiiDA installation does not use a Django backend. -load_documentation_profile() - -# If we are not on READTHEDOCS load the Sphinx theme manually -if not os.environ.get('READTHEDOCS', None): - import sphinx_rtd_theme - html_theme = 'sphinx_rtd_theme' - html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] -# -- General configuration ------------------------------------------------ +# -- Project information ----------------------------------------------------- -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. +project = 'aiida-sssp-workflow' +copyright = '2020-2021, ECOLE POLYTECHNIQUE FEDERALE DE LAUSANNE (Theory and Simulation of Materials (THEOS) and National Centre for Computational Design and Discovery of Novel Materials (NCCR MARVEL)), Switzerland' +release = aiida_sssp_workflow.__version__ -# If your documentation needs a minimal Sphinx version, state it here. -needs_sphinx = '1.5' +# -- General configuration --------------------------------------------------- # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'sphinx.ext.autodoc', - 'sphinx.ext.mathjax', - 'sphinx.ext.intersphinx', - 'sphinx.ext.viewcode', + 'sphinx_copybutton', 'autoapi.extension', 'sphinx_click', + 'sphinx.ext.intersphinx' ] +# Settings for the `sphinx_copybutton` extension +copybutton_selector = 'div:not(.no-copy)>div.highlight pre' +copybutton_prompt_text = r'>>> |\.\.\. |(?:\(.*\) )?\$ |In \[\d*\]: | {2,5}\.\.\.: | {5,8}: ' +copybutton_prompt_is_regexp = True + +# Settings for the `autoapi` extension +autoapi_dirs = ['../../aiida_sssp_workflow'] +autoapi_ignore = ['*cli*'] + +# Settings for the `sphinx.ext.intersphinx` extension intersphinx_mapping = { - 'python': ('https://docs.python.org/3', None), - 'aiida': ('https://aiida-core.readthedocs.io/en/latest', None), + 'aiida': ('http://aiida_core.readthedocs.io/en/latest/', None), } # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] -# The suffix of source filenames. -source_suffix = '.rst' - -# The encoding of source files. -#source_encoding = 'utf-8-sig' - -# The master toctree document. -#~ master_doc = 'index' -master_doc = 'index' - -# General information about the project. -project = u'aiida-sssp-workflow' -copyright_first_year = '2020' -copyright_owners = 'The AiiDA Team' - -current_year = str(time.localtime().tm_year) -copyright_year_string = current_year if current_year == copyright_first_year else f'{copyright_first_year}-{current_year}' -# pylint: disable=redefined-builtin -copyright = f'{copyright_year_string}, {copyright_owners}. All rights reserved' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The full version, including alpha/beta/rc tags. -release = aiida_sssp_workflow.__version__ -# The short X.Y version. -version = '.'.join(release.split('.')[:2]) - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# There are two options for replacing |today|: either, you set today to some -# non-false value, then it is used: -#today = '' -# Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' - # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. -# exclude_patterns = ['doc.rst'] -#~ exclude_patterns = ['index.rst'] - -# The reST default role (used for this markup: `text`) to use for all -# documents. -#default_role = None - -# If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True - -# If true, the current module name will be prepended to all description -# unit titles (such as .. function::). -#add_module_names = True - -# If true, sectionauthor and moduleauthor directives will be shown in the -# output. They are ignored by default. -show_authors = True - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] - -# If true, keep warnings as "system message" paragraphs in the built documents. -#keep_warnings = False +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] -# -- Options for HTML output ---------------------------------------------- +# -- Options for HTML output ------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -#~ html_theme = 'basicstrap' -## SET BELOW - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. +# +html_theme = 'sphinx_book_theme' +html_static_path = ['_static'] +html_css_files = [] html_theme_options = { - 'display_version': True, -} - -# Add any paths that contain custom themes here, relative to this directory. -#~ html_theme_path = ["."] - -# The name for this set of Sphinx documents. If None, it defaults to -# " v documentation". -#html_title = None - -# A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None - -# The name of an image file (relative to this directory) to place at the top -# of the sidebar. -# html_logo = "images/.png" - -# The name of an image file (within the static path) to use as favicon of the -# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 -# pixels large. -# html_favicon = "images/favicon.ico" - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -#html_static_path = ['_static'] - -# Add any extra paths that contain custom files (such as robots.txt or -# .htaccess) here, relative to this directory. These files are copied -# directly to the root of the documentation. -#html_extra_path = [] - -# If not '', a 'Last updated on:' timestamp is inserted at every page bottom, -# using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' - -# If true, SmartyPants will be used to convert quotes and dashes to -# typographically correct entities. -#html_use_smartypants = True - -# Custom sidebar templates, maps document names to template names. -#html_sidebars = {} - -# Additional templates that should be rendered to pages, maps page names to -# template names. -#html_additional_pages = {} - -# If false, no module index is generated. -#html_domain_indices = True - -# If false, no index is generated. -#html_use_index = True - -# If true, the index is split into individual pages for each letter. -#html_split_index = False - -# If true, links to the reST sources are added to the pages. -html_show_sourcelink = False - -# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True - -# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#~ html_show_copyright = False - -# If true, an OpenSearch description file will be output, and all pages will -# contain a tag referring to it. The value of this option must be the -# base URL from which the finished HTML is served. -html_use_opensearch = 'http://aiida-sssp-workflow.readthedocs.io' - -# This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None - -# Language to be used for generating the HTML full-text search index. -# Sphinx supports the following languages: -# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' -# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' -html_search_language = 'en' - -# A dictionary with options for the search language support, empty by default. -# Now only 'ja' uses this config value -#html_search_options = {'type': 'default'} - -# The name of a javascript file (relative to the configuration directory) that -# implements a search results scorer. If empty, the default will be used. -#html_search_scorer = 'scorer.js' - -# Output file base name for HTML help builder. -htmlhelp_basename = 'aiida-sssp-workflow-doc' - -# -- Options for LaTeX output --------------------------------------------- - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - #'papersize': 'letterpaper', - - # The font size ('10pt', '11pt' or '12pt'). - #'pointsize': '10pt', - - # Additional stuff for the LaTeX preamble. - #'preamble': '', - - # Latex figure (float) alignment - #'figure_align': 'htbp', + 'home_page_in_toc': + True, + 'repository_url': + 'https://github.com/aiidateam/aiida-sssp-workflow', + 'repository_branch': + 'master', + 'use_repository_button': + True, + 'use_issues_button': + True, + 'use_fullscreen_button': + False, + 'path_to_docs': + 'docs', + 'use_edit_page_button': + True, + 'extra_navbar': + '', + 'extra_navbar': + '

Made possible by the support of NCCR MARVEL, MaX CoE and the swissuniversities P-5 project.

' } - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -# latex_documents = [ -# ] - -# The name of an image file (relative to this directory) to place at the top of -# the title page. -#latex_logo = None - -# For "manual" documents, if this is true, then toplevel headings are parts, -# not chapters. -#latex_use_parts = False - -# If true, show page references after internal links. -#latex_show_pagerefs = False - -# If true, show URL addresses after external links. -#latex_show_urls = False - -# Documents to append as an appendix to all manuals. -#latex_appendices = [] - -# If false, no module index is generated. -#latex_domain_indices = True - -# autodoc mock -autodoc_mock_imports = ['f90wrap', 'sssp.efermi_module', 'numpy'] - - -def run_apidoc(_): - """Runs sphinx-apidoc when building the documentation. - - Needs to be done in conf.py in order to include the APIdoc in the - build on readthedocs. - - See also https://github.com/rtfd/readthedocs.org/issues/1139 - """ - source_dir = os.path.abspath(os.path.dirname(__file__)) - apidoc_dir = os.path.join(source_dir, 'apidoc') - package_dir = os.path.join(source_dir, os.pardir, os.pardir, - 'aiida_sssp_workflow') - - # In #1139, they suggest the route below, but this ended up - # calling sphinx-build, not sphinx-apidoc - #from sphinx.apidoc import main - #main([None, '-e', '-o', apidoc_dir, package_dir, '--force']) - - import subprocess - cmd_path = 'sphinx-apidoc' - if hasattr(sys, 'real_prefix'): # Check to see if we are in a virtualenv - # If we are, assemble the path manually - cmd_path = os.path.abspath( - os.path.join(sys.prefix, 'bin', 'sphinx-apidoc')) - - options = [ - '-o', - apidoc_dir, - package_dir, - '--private', - '--force', - '--no-toc', - ] - - # See https://stackoverflow.com/a/30144019 - env = os.environ.copy() - env['SPHINX_APIDOC_OPTIONS'] = 'members,special-members,private-members,undoc-members,show-inheritance' - subprocess.check_call([cmd_path] + options, env=env) - - -def setup(app): - app.connect('builder-inited', run_apidoc) - - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -# man_pages = [ -# ] - -# If true, show URL addresses after external links. -#man_show_urls = False - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -# texinfo_documents = [ -# ] - -# Documents to append as an appendix to all manuals. -#texinfo_appendices = [] - -# If false, no module index is generated. -#texinfo_domain_indices = True - -# How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' - -# If true, do not generate a @detailmenu in the "Top" node's menu. -#texinfo_no_detailmenu = False +html_domain_indices = True +html_logo = '_static/logo.png' # Warnings to ignore when using the -n (nitpicky) option -# We should ignore any python built-in exception, for instance -nitpick_ignore = [] +nitpick_ignore = [ + ('py:class', 'logging.Logger'), + ('py:obj', 'aiida_optimize.engines.base.OptimizationEngineWrapper'), +] diff --git a/docs/source/images/AiiDA_transparent_logo.png b/docs/source/images/AiiDA_transparent_logo.png deleted file mode 100644 index 4404785b50fef15b12895532754f96b1db019123..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76300 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 + API documentation If you use this plugin for your research, please cite the following work: @@ -23,7 +23,7 @@ If you use this plugin for your research, please cite the following work: .. highlights:: K. Lejaeghere et al., Science 351 (6280), 1415 (2016). http://molmod.ugent.be/deltacodesdft -http://molmod.ugent.be/deltacodesdft + If you use AiiDA for your research, please cite the following work: .. highlights:: Giovanni Pizzi, Andrea Cepellotti, Riccardo Sabatini, Nicola Marzari, diff --git a/efermi/__init__.py b/efermi/__init__.py new file mode 100644 index 00000000..9c77e77e --- /dev/null +++ b/efermi/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# pylint: disable=wildcard-import,undefined-variable +"""entry point import of efermi""" +from .efermi import pyefermi diff --git a/efermi/efermi.py b/efermi/efermi.py new file mode 100644 index 00000000..6860b4b4 --- /dev/null +++ b/efermi/efermi.py @@ -0,0 +1,136 @@ +# -*- coding: utf-8 -*- +""" +Reuse the pure python translate from Nicola's F77 code +Copy and paste from Austin's repository: +https://github.com/zooks97/bieFermi/tree/main/bieFermi/py +""" + +import numpy as np +from scipy.special import erfc + +FDCUT = 30.0 # Fermi-Dirac cutoff +HMCUT = 10.0 # Hermite cutoff +POSHMA = -0.5634 # Positive Hermite (cold I) `a` + + +def pyefermi(bands, + weights, + nelec: int, + swidth: float, + stype: int, + xacc: float = 1.0e-6, + jmax: int = 10000, + nmax: int = 100000) -> float: + """Find the Fermi energy using bisection.""" + # Get min, max eigenvalue and set as initial bounds + x1 = np.min(bands) + x2 = np.max(bands) + x0 = (x1 + x2) / 2 + + # Calculate initial f, fmid + f = smear(bands, weights, x1, nelec, swidth, stype) + fmid = smear(bands, weights, x2, nelec, swidth, stype) + + # Find bounds which bracket the Fermi energy + for n in range(1, nmax): + if f * fmid >= 0: + x1 = x0 - n * swidth + x2 = x0 + (n - 0.5) * swidth + f = smear(bands, weights, x1, nelec, swidth, stype) + fmid = smear(bands, weights, x2, nelec, swidth, stype) + else: + break + if f * fmid >= 0: + raise Exception('Could not bracket Fermi energy. Smearing too small?') + + # Set initial fermi energy guess + if f < 0.0: + dx = x2 - x1 + rtb = x1 + else: + dx = x1 - x2 + rtb = x2 + + for _ in range(jmax): + if np.abs(dx) <= xacc or fmid == 0: + return rtb + dx = dx * 0.5 + xmid = rtb + dx + fmid = smear(bands, weights, xmid, nelec, swidth, stype) + if fmid <= 0: + rtb = xmid + raise Exception('Reached maximum number of bisections.') + + +def smear(bands, weights, xe: float, nelec: int, swidth: float, + stype: int) -> float: + """Calculate smeared value used for bisection.""" + sfuncs = [gaussian, fermid, delthm, spline, poshm, poshm2] + + nkpt, nbnd = bands.shape + + z = 0.0 + for i in range(nkpt): + for j in range(nbnd): + x = (xe - bands[i, j]) / swidth + z += weights[i] * sfuncs[stype - 1](x) + return z - nelec + + +def gaussian(x: float) -> float: + """Gaussian.""" + return 2.0 - erfc(x) + + +def fermid(x: float) -> float: + """Fermi-Dirac.""" + x = -x + if x > FDCUT: + return 0.0 + elif x < -FDCUT: + return 2.0 + else: + return 2.0 / (1.0 + np.exp(x)) + + +def delthm(x: float) -> float: + """Hermite delta expansion.""" + if x > HMCUT: + return 2.0 + elif x < -HMCUT: + return 0.0 + else: + return (2.0 - erfc(x)) + x * np.exp(-x**2) / np.sqrt(np.pi) + + +def spline(x: float) -> float: + """Gaussian spline.""" + x = -x + if x > 0.0: + fx = np.sqrt(np.e) / 2 * np.exp(-(x + np.sqrt(2.0) / 2.0)**2) + else: + fx = 1.0 - np.sqrt(np.e) / 2 * np.exp(-(x - np.sqrt(2.0 / 2.0))**2) + return 2.0 * fx + + +def poshm(x: float) -> float: + """Positive Hermite (cold I).""" + if x > HMCUT: + return 2.0 + elif x < -HMCUT: + return 0.0 + else: + return (2.0 - + erfc(x)) + (-2.0 * POSHMA * x * x + 2.0 * x + POSHMA) * np.exp( + -x * x) / np.sqrt(np.pi) / 2.0 + + +def poshm2(x: float) -> float: + """Positive Hermite (cold II).""" + if x > HMCUT: + return 2.0 + elif x < -HMCUT: + return 0.0 + else: + return (2.0 - erfc(x - 1.0 / np.sqrt(2.0))) + np.sqrt(2.0) * np.exp( + -x**2 + np.sqrt(2.0) * x - 0.5) / np.sqrt(np.pi) diff --git a/efermi/efermi_module-f2pywrappers.f b/efermi/efermi_module-f2pywrappers.f new file mode 100644 index 00000000..3d4a972a --- /dev/null +++ b/efermi/efermi_module-f2pywrappers.f @@ -0,0 +1,58 @@ +C -*- fortran -*- +C This file is autogenerated with f2py (version:1.21.1) +C It contains Fortran 77 wrappers to fortran functions. + + subroutine f2pywraperf_c (erf_cf2pywrap, xx) + external erf_c + real xx + real erf_cf2pywrap, erf_c + erf_cf2pywrap = erf_c(xx) + end + + + subroutine f2pywrapfermid (fermidf2pywrap, xx) + external fermid + real xx + real fermidf2pywrap, fermid + fermidf2pywrap = fermid(xx) + end + + + subroutine f2pywrapdelthm (delthmf2pywrap, xx) + external delthm + real xx + real delthmf2pywrap, delthm + delthmf2pywrap = delthm(xx) + end + + + subroutine f2pywrapspline (splinef2pywrap, x) + external spline + real x + real splinef2pywrap, spline + splinef2pywrap = spline(x) + end + + + subroutine f2pywrapposhm (poshmf2pywrap, x) + external poshm + real x + real poshmf2pywrap, poshm + poshmf2pywrap = poshm(x) + end + + + subroutine f2pywrapposhm2 (poshm2f2pywrap, x) + external poshm2 + real x + real poshm2f2pywrap, poshm2 + poshm2f2pywrap = poshm2(x) + end + + + subroutine f2pyinitwarn(setupfunc) + external setupfunc + integer iwarn + common /warn/ iwarn + call setupfunc(iwarn) + end diff --git a/efermi/efermi_modulemodule.c b/efermi/efermi_modulemodule.c new file mode 100644 index 00000000..da1ae893 --- /dev/null +++ b/efermi/efermi_modulemodule.c @@ -0,0 +1,1110 @@ +/* File: efermi_modulemodule.c + * This file is auto-generated with f2py (version:1.21.1). + * f2py is a Fortran to Python Interface Generator (FPIG), Second Edition, + * written by Pearu Peterson . + * Generation date: Wed Jul 28 01:30:11 2021 + * Do not edit this file directly unless you know what you are doing!!! + */ + +#ifdef __cplusplus +extern "C" { +#endif + +/*********************** See f2py2e/cfuncs.py: includes ***********************/ +#include "Python.h" +#include +#include "fortranobject.h" +#include + +/**************** See f2py2e/rules.py: mod_rules['modulebody'] ****************/ +static PyObject *efermi_module_error; +static PyObject *efermi_module_module; + +/*********************** See f2py2e/cfuncs.py: typedefs ***********************/ +/*need_typedefs*/ + +/****************** See f2py2e/cfuncs.py: typedefs_generated ******************/ +/*need_typedefs_generated*/ + +/********************** See f2py2e/cfuncs.py: cppmacros **********************/ +#if defined(PREPEND_FORTRAN) +#if defined(NO_APPEND_FORTRAN) +#if defined(UPPERCASE_FORTRAN) +#define F_FUNC(f,F) _##F +#else +#define F_FUNC(f,F) _##f +#endif +#else +#if defined(UPPERCASE_FORTRAN) +#define F_FUNC(f,F) _##F##_ +#else +#define F_FUNC(f,F) _##f##_ +#endif +#endif +#else +#if defined(NO_APPEND_FORTRAN) +#if defined(UPPERCASE_FORTRAN) +#define F_FUNC(f,F) F +#else +#define F_FUNC(f,F) f +#endif +#else +#if defined(UPPERCASE_FORTRAN) +#define F_FUNC(f,F) F##_ +#else +#define F_FUNC(f,F) f##_ +#endif +#endif +#endif +#if defined(UNDERSCORE_G77) +#define F_FUNC_US(f,F) F_FUNC(f##_,F##_) +#else +#define F_FUNC_US(f,F) F_FUNC(f,F) +#endif + +#define rank(var) var ## _Rank +#define shape(var,dim) var ## _Dims[dim] +#define old_rank(var) (PyArray_NDIM((PyArrayObject *)(capi_ ## var ## _tmp))) +#define old_shape(var,dim) PyArray_DIM(((PyArrayObject *)(capi_ ## var ## _tmp)),dim) +#define fshape(var,dim) shape(var,rank(var)-dim-1) +#define len(var) shape(var,0) +#define flen(var) fshape(var,0) +#define old_size(var) PyArray_SIZE((PyArrayObject *)(capi_ ## var ## _tmp)) +/* #define index(i) capi_i ## i */ +#define slen(var) capi_ ## var ## _len +#define size(var, ...) f2py_size((PyArrayObject *)(capi_ ## var ## _tmp), ## __VA_ARGS__, -1) + +#ifdef DEBUGCFUNCS +#define CFUNCSMESS(mess) fprintf(stderr,"debug-capi:"mess); +#define CFUNCSMESSPY(mess,obj) CFUNCSMESS(mess) \ + PyObject_Print((PyObject *)obj,stderr,Py_PRINT_RAW);\ + fprintf(stderr,"\n"); +#else +#define CFUNCSMESS(mess) +#define CFUNCSMESSPY(mess,obj) +#endif + +#ifndef max +#define max(a,b) ((a > b) ? (a) : (b)) +#endif +#ifndef min +#define min(a,b) ((a < b) ? (a) : (b)) +#endif +#ifndef MAX +#define MAX(a,b) ((a > b) ? (a) : (b)) +#endif +#ifndef MIN +#define MIN(a,b) ((a < b) ? (a) : (b)) +#endif + +#if defined(PREPEND_FORTRAN) +#if defined(NO_APPEND_FORTRAN) +#if defined(UPPERCASE_FORTRAN) +#define F_WRAPPEDFUNC(f,F) _F2PYWRAP##F +#else +#define F_WRAPPEDFUNC(f,F) _f2pywrap##f +#endif +#else +#if defined(UPPERCASE_FORTRAN) +#define F_WRAPPEDFUNC(f,F) _F2PYWRAP##F##_ +#else +#define F_WRAPPEDFUNC(f,F) _f2pywrap##f##_ +#endif +#endif +#else +#if defined(NO_APPEND_FORTRAN) +#if defined(UPPERCASE_FORTRAN) +#define F_WRAPPEDFUNC(f,F) F2PYWRAP##F +#else +#define F_WRAPPEDFUNC(f,F) f2pywrap##f +#endif +#else +#if defined(UPPERCASE_FORTRAN) +#define F_WRAPPEDFUNC(f,F) F2PYWRAP##F##_ +#else +#define F_WRAPPEDFUNC(f,F) f2pywrap##f##_ +#endif +#endif +#endif +#if defined(UNDERSCORE_G77) +#define F_WRAPPEDFUNC_US(f,F) F_WRAPPEDFUNC(f##_,F##_) +#else +#define F_WRAPPEDFUNC_US(f,F) F_WRAPPEDFUNC(f,F) +#endif + + +/************************ See f2py2e/cfuncs.py: cfuncs ************************/ +static int +double_from_pyobj(double* v, PyObject *obj, const char *errmess) +{ + PyObject* tmp = NULL; + if (PyFloat_Check(obj)) { + *v = PyFloat_AsDouble(obj); + return !(*v == -1.0 && PyErr_Occurred()); + } + + tmp = PyNumber_Float(obj); + if (tmp) { + *v = PyFloat_AsDouble(tmp); + Py_DECREF(tmp); + return !(*v == -1.0 && PyErr_Occurred()); + } + if (PyComplex_Check(obj)) + tmp = PyObject_GetAttrString(obj,"real"); + else if (PyBytes_Check(obj) || PyUnicode_Check(obj)) + /*pass*/; + else if (PySequence_Check(obj)) + tmp = PySequence_GetItem(obj,0); + if (tmp) { + PyErr_Clear(); + if (double_from_pyobj(v,tmp,errmess)) {Py_DECREF(tmp); return 1;} + Py_DECREF(tmp); + } + { + PyObject* err = PyErr_Occurred(); + if (err==NULL) err = efermi_module_error; + PyErr_SetString(err,errmess); + } + return 0; +} + +static int f2py_size(PyArrayObject* var, ...) +{ + npy_int sz = 0; + npy_int dim; + npy_int rank; + va_list argp; + va_start(argp, var); + dim = va_arg(argp, npy_int); + if (dim==-1) + { + sz = PyArray_SIZE(var); + } + else + { + rank = PyArray_NDIM(var); + if (dim>=1 && dim<=rank) + sz = PyArray_DIM(var, dim-1); + else + fprintf(stderr, "f2py_size: 2nd argument value=%d fails to satisfy 1<=value<=%d. Result will be 0.\n", dim, rank); + } + va_end(argp); + return sz; +} + +static int +int_from_pyobj(int* v, PyObject *obj, const char *errmess) +{ + PyObject* tmp = NULL; + + if (PyLong_Check(obj)) { + *v = Npy__PyLong_AsInt(obj); + return !(*v == -1 && PyErr_Occurred()); + } + + tmp = PyNumber_Long(obj); + if (tmp) { + *v = Npy__PyLong_AsInt(tmp); + Py_DECREF(tmp); + return !(*v == -1 && PyErr_Occurred()); + } + + if (PyComplex_Check(obj)) + tmp = PyObject_GetAttrString(obj,"real"); + else if (PyBytes_Check(obj) || PyUnicode_Check(obj)) + /*pass*/; + else if (PySequence_Check(obj)) + tmp = PySequence_GetItem(obj, 0); + if (tmp) { + PyErr_Clear(); + if (int_from_pyobj(v, tmp, errmess)) { + Py_DECREF(tmp); + return 1; + } + Py_DECREF(tmp); + } + { + PyObject* err = PyErr_Occurred(); + if (err == NULL) { + err = efermi_module_error; + } + PyErr_SetString(err, errmess); + } + return 0; +} + +static int +float_from_pyobj(float* v, PyObject *obj, const char *errmess) +{ + double d=0.0; + if (double_from_pyobj(&d,obj,errmess)) { + *v = (float)d; + return 1; + } + return 0; +} + + +/********************* See f2py2e/cfuncs.py: userincludes *********************/ +/*need_userincludes*/ + +/********************* See f2py2e/capi_rules.py: usercode *********************/ + + +/* See f2py2e/rules.py */ +extern void F_FUNC(efermi,EFERMI)(int*,int*,float*,int*,int*,int*,float*,float*,float*,float*,float*,float*,float*,float*,int*); +extern void F_WRAPPEDFUNC_US(erf_c,ERF_C)(float*,float*); +extern void F_WRAPPEDFUNC(fermid,FERMID)(float*,float*); +extern void F_WRAPPEDFUNC(delthm,DELTHM)(float*,float*); +extern void F_WRAPPEDFUNC(spline,SPLINE)(float*,float*); +extern void F_WRAPPEDFUNC(poshm,POSHM)(float*,float*); +extern void F_WRAPPEDFUNC(poshm2,POSHM2)(float*,float*); +/*eof externroutines*/ + +/******************** See f2py2e/capi_rules.py: usercode1 ********************/ + + +/******************* See f2py2e/cb_rules.py: buildcallback *******************/ +/*need_callbacks*/ + +/*********************** See f2py2e/rules.py: buildapi ***********************/ + +/*********************************** efermi ***********************************/ +static char doc_f2py_rout_efermi_module_efermi[] = "\ +occ,ef,sort,eigmin,eigmax,enocc = efermi(nel,nbands,del,nsppts,weight,ef,eigval,ismear)\n\nWrapper for ``efermi``.\ +\n\nParameters\n----------\n" +"nel : input int\n" +"nbands : input int\n" +"del : input float\n" +"nsppts : input int\n" +"weight : input rank-1 array('f') with bounds (nsppts)\n" +"ef : input float\n" +"eigval : input rank-2 array('f') with bounds (nsppts,nbands)\n" +"ismear : input int\n" +"\nReturns\n-------\n" +"occ : rank-2 array('f') with bounds (nsppts,nbands)\n" +"ef : float\n" +"sort : rank-1 array('f') with bounds (nsppts*nbands)\n" +"eigmin : float\n" +"eigmax : float\n" +"enocc : float"; +/* extern void F_FUNC(efermi,EFERMI)(int*,int*,float*,int*,int*,int*,float*,float*,float*,float*,float*,float*,float*,float*,int*); */ +static PyObject *f2py_rout_efermi_module_efermi(const PyObject *capi_self, + PyObject *capi_args, + PyObject *capi_keywds, + void (*f2py_func)(int*,int*,float*,int*,int*,int*,float*,float*,float*,float*,float*,float*,float*,float*,int*)) { + PyObject * volatile capi_buildvalue = NULL; + volatile int f2py_success = 1; +/*decl*/ + + int nel = 0; + PyObject *nel_capi = Py_None; + int nbands = 0; + PyObject *nbands_capi = Py_None; + float del = 0; + PyObject *del_capi = Py_None; + int nsppts = 0; + PyObject *nsppts_capi = Py_None; + int ndim8 = 0; + int ndim10 = 0; + float *weight = NULL; + npy_intp weight_Dims[1] = {-1}; + const int weight_Rank = 1; + PyArrayObject *capi_weight_tmp = NULL; + int capi_weight_intent = 0; + PyObject *weight_capi = Py_None; + float *occ = NULL; + npy_intp occ_Dims[2] = {-1, -1}; + const int occ_Rank = 2; + PyArrayObject *capi_occ_tmp = NULL; + int capi_occ_intent = 0; + float ef = 0; + PyObject *ef_capi = Py_None; + float *eigval = NULL; + npy_intp eigval_Dims[2] = {-1, -1}; + const int eigval_Rank = 2; + PyArrayObject *capi_eigval_tmp = NULL; + int capi_eigval_intent = 0; + PyObject *eigval_capi = Py_None; + float *sort = NULL; + npy_intp sort_Dims[1] = {-1}; + const int sort_Rank = 1; + PyArrayObject *capi_sort_tmp = NULL; + int capi_sort_intent = 0; + float eigmin = 0; + float eigmax = 0; + float enocc = 0; + int ismear = 0; + PyObject *ismear_capi = Py_None; + static char *capi_kwlist[] = {"nel","nbands","del","nsppts","weight","ef","eigval","ismear",NULL}; + +/*routdebugenter*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_clock(); +#endif + if (!PyArg_ParseTupleAndKeywords(capi_args,capi_keywds,\ + "OOOOOOOO|:efermi_module.efermi",\ + capi_kwlist,&nel_capi,&nbands_capi,&del_capi,&nsppts_capi,&weight_capi,&ef_capi,&eigval_capi,&ismear_capi)) + return NULL; +/*frompyobj*/ + /* Processing variable nel */ + f2py_success = int_from_pyobj(&nel,nel_capi,"efermi_module.efermi() 1st argument (nel) can't be converted to int"); + if (f2py_success) { + /* Processing variable nbands */ + f2py_success = int_from_pyobj(&nbands,nbands_capi,"efermi_module.efermi() 2nd argument (nbands) can't be converted to int"); + if (f2py_success) { + /* Processing variable del */ + f2py_success = float_from_pyobj(&del,del_capi,"efermi_module.efermi() 3rd argument (del) can't be converted to float"); + if (f2py_success) { + /* Processing variable nsppts */ + f2py_success = int_from_pyobj(&nsppts,nsppts_capi,"efermi_module.efermi() 4th argument (nsppts) can't be converted to int"); + if (f2py_success) { + /* Processing variable ef */ + f2py_success = float_from_pyobj(&ef,ef_capi,"efermi_module.efermi() 6th argument (ef) can't be converted to float"); + if (f2py_success) { + /* Processing variable eigmin */ + /* Processing variable eigmax */ + /* Processing variable enocc */ + /* Processing variable ismear */ + f2py_success = int_from_pyobj(&ismear,ismear_capi,"efermi_module.efermi() 8th argument (ismear) can't be converted to int"); + if (f2py_success) { + /* Processing variable ndim8 */ + ndim8 = nbands; + /* Processing variable ndim10 */ + ndim10 = nsppts; + /* Processing variable weight */ + weight_Dims[0]=nsppts; + capi_weight_intent |= F2PY_INTENT_IN; + capi_weight_tmp = array_from_pyobj(NPY_FLOAT,weight_Dims,weight_Rank,capi_weight_intent,weight_capi); + if (capi_weight_tmp == NULL) { + PyObject *exc, *val, *tb; + PyErr_Fetch(&exc, &val, &tb); + PyErr_SetString(exc ? exc : efermi_module_error,"failed in converting 5th argument `weight' of efermi_module.efermi to C/Fortran array" ); + npy_PyErr_ChainExceptionsCause(exc, val, tb); + } else { + weight = (float *)(PyArray_DATA(capi_weight_tmp)); + + /* Processing variable occ */ + occ_Dims[0]=nsppts,occ_Dims[1]=nbands; + capi_occ_intent |= F2PY_INTENT_OUT|F2PY_INTENT_HIDE; + capi_occ_tmp = array_from_pyobj(NPY_FLOAT,occ_Dims,occ_Rank,capi_occ_intent,Py_None); + if (capi_occ_tmp == NULL) { + PyObject *exc, *val, *tb; + PyErr_Fetch(&exc, &val, &tb); + PyErr_SetString(exc ? exc : efermi_module_error,"failed in converting hidden `occ' of efermi_module.efermi to C/Fortran array" ); + npy_PyErr_ChainExceptionsCause(exc, val, tb); + } else { + occ = (float *)(PyArray_DATA(capi_occ_tmp)); + + /* Processing variable eigval */ + eigval_Dims[0]=nsppts,eigval_Dims[1]=nbands; + capi_eigval_intent |= F2PY_INTENT_IN; + capi_eigval_tmp = array_from_pyobj(NPY_FLOAT,eigval_Dims,eigval_Rank,capi_eigval_intent,eigval_capi); + if (capi_eigval_tmp == NULL) { + PyObject *exc, *val, *tb; + PyErr_Fetch(&exc, &val, &tb); + PyErr_SetString(exc ? exc : efermi_module_error,"failed in converting 7th argument `eigval' of efermi_module.efermi to C/Fortran array" ); + npy_PyErr_ChainExceptionsCause(exc, val, tb); + } else { + eigval = (float *)(PyArray_DATA(capi_eigval_tmp)); + + /* Processing variable sort */ + sort_Dims[0]=nsppts*nbands; + capi_sort_intent |= F2PY_INTENT_OUT|F2PY_INTENT_HIDE; + capi_sort_tmp = array_from_pyobj(NPY_FLOAT,sort_Dims,sort_Rank,capi_sort_intent,Py_None); + if (capi_sort_tmp == NULL) { + PyObject *exc, *val, *tb; + PyErr_Fetch(&exc, &val, &tb); + PyErr_SetString(exc ? exc : efermi_module_error,"failed in converting hidden `sort' of efermi_module.efermi to C/Fortran array" ); + npy_PyErr_ChainExceptionsCause(exc, val, tb); + } else { + sort = (float *)(PyArray_DATA(capi_sort_tmp)); + +/*end of frompyobj*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_call_clock(); +#endif +/*callfortranroutine*/ + (*f2py_func)(&nel,&nbands,&del,&nsppts,&ndim8,&ndim10,weight,occ,&ef,eigval,sort,&eigmin,&eigmax,&enocc,&ismear); +if (PyErr_Occurred()) + f2py_success = 0; +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_call_clock(); +#endif +/*end of callfortranroutine*/ + if (f2py_success) { +/*pyobjfrom*/ +/*end of pyobjfrom*/ + CFUNCSMESS("Building return value.\n"); + capi_buildvalue = Py_BuildValue("NfNfff",capi_occ_tmp,ef,capi_sort_tmp,eigmin,eigmax,enocc); +/*closepyobjfrom*/ +/*end of closepyobjfrom*/ + } /*if (f2py_success) after callfortranroutine*/ +/*cleanupfrompyobj*/ + } /*if (capi_sort_tmp == NULL) ... else of sort*/ + /* End of cleaning variable sort */ + if((PyObject *)capi_eigval_tmp!=eigval_capi) { + Py_XDECREF(capi_eigval_tmp); } + } /*if (capi_eigval_tmp == NULL) ... else of eigval*/ + /* End of cleaning variable eigval */ + } /*if (capi_occ_tmp == NULL) ... else of occ*/ + /* End of cleaning variable occ */ + if((PyObject *)capi_weight_tmp!=weight_capi) { + Py_XDECREF(capi_weight_tmp); } + } /*if (capi_weight_tmp == NULL) ... else of weight*/ + /* End of cleaning variable weight */ + /* End of cleaning variable ndim10 */ + /* End of cleaning variable ndim8 */ + } /*if (f2py_success) of ismear*/ + /* End of cleaning variable ismear */ + /* End of cleaning variable enocc */ + /* End of cleaning variable eigmax */ + /* End of cleaning variable eigmin */ + } /*if (f2py_success) of ef*/ + /* End of cleaning variable ef */ + } /*if (f2py_success) of nsppts*/ + /* End of cleaning variable nsppts */ + } /*if (f2py_success) of del*/ + /* End of cleaning variable del */ + } /*if (f2py_success) of nbands*/ + /* End of cleaning variable nbands */ + } /*if (f2py_success) of nel*/ + /* End of cleaning variable nel */ +/*end of cleanupfrompyobj*/ + if (capi_buildvalue == NULL) { +/*routdebugfailure*/ + } else { +/*routdebugleave*/ + } + CFUNCSMESS("Freeing memory.\n"); +/*freemem*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_clock(); +#endif + return capi_buildvalue; +} +/******************************* end of efermi *******************************/ + +/*********************************** erf_c ***********************************/ +static char doc_f2py_rout_efermi_module_erf_c[] = "\ +erf_c = erf_c(xx)\n\nWrapper for ``erf_c``.\ +\n\nParameters\n----------\n" +"xx : input float\n" +"\nReturns\n-------\n" +"erf_c : float"; +/* extern void F_WRAPPEDFUNC_US(erf_c,ERF_C)(float*,float*); */ +static PyObject *f2py_rout_efermi_module_erf_c(const PyObject *capi_self, + PyObject *capi_args, + PyObject *capi_keywds, + void (*f2py_func)(float*,float*)) { + PyObject * volatile capi_buildvalue = NULL; + volatile int f2py_success = 1; +/*decl*/ + + float erf_c = 0; + float xx = 0; + PyObject *xx_capi = Py_None; + static char *capi_kwlist[] = {"xx",NULL}; + +/*routdebugenter*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_clock(); +#endif + if (!PyArg_ParseTupleAndKeywords(capi_args,capi_keywds,\ + "O|:efermi_module.erf_c",\ + capi_kwlist,&xx_capi)) + return NULL; +/*frompyobj*/ + /* Processing variable xx */ + f2py_success = float_from_pyobj(&xx,xx_capi,"efermi_module.erf_c() 1st argument (xx) can't be converted to float"); + if (f2py_success) { + /* Processing variable erf_c */ +/*end of frompyobj*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_call_clock(); +#endif +/*callfortranroutine*/ + (*f2py_func)(&erf_c,&xx); +if (PyErr_Occurred()) + f2py_success = 0; +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_call_clock(); +#endif +/*end of callfortranroutine*/ + if (f2py_success) { +/*pyobjfrom*/ +/*end of pyobjfrom*/ + CFUNCSMESS("Building return value.\n"); + capi_buildvalue = Py_BuildValue("f",erf_c); +/*closepyobjfrom*/ +/*end of closepyobjfrom*/ + } /*if (f2py_success) after callfortranroutine*/ +/*cleanupfrompyobj*/ + /* End of cleaning variable erf_c */ + } /*if (f2py_success) of xx*/ + /* End of cleaning variable xx */ +/*end of cleanupfrompyobj*/ + if (capi_buildvalue == NULL) { +/*routdebugfailure*/ + } else { +/*routdebugleave*/ + } + CFUNCSMESS("Freeing memory.\n"); +/*freemem*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_clock(); +#endif + return capi_buildvalue; +} +/******************************** end of erf_c ********************************/ + +/*********************************** fermid ***********************************/ +static char doc_f2py_rout_efermi_module_fermid[] = "\ +fermid = fermid(xx)\n\nWrapper for ``fermid``.\ +\n\nParameters\n----------\n" +"xx : input float\n" +"\nReturns\n-------\n" +"fermid : float"; +/* extern void F_WRAPPEDFUNC(fermid,FERMID)(float*,float*); */ +static PyObject *f2py_rout_efermi_module_fermid(const PyObject *capi_self, + PyObject *capi_args, + PyObject *capi_keywds, + void (*f2py_func)(float*,float*)) { + PyObject * volatile capi_buildvalue = NULL; + volatile int f2py_success = 1; +/*decl*/ + + float fermid = 0; + float xx = 0; + PyObject *xx_capi = Py_None; + static char *capi_kwlist[] = {"xx",NULL}; + +/*routdebugenter*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_clock(); +#endif + if (!PyArg_ParseTupleAndKeywords(capi_args,capi_keywds,\ + "O|:efermi_module.fermid",\ + capi_kwlist,&xx_capi)) + return NULL; +/*frompyobj*/ + /* Processing variable xx */ + f2py_success = float_from_pyobj(&xx,xx_capi,"efermi_module.fermid() 1st argument (xx) can't be converted to float"); + if (f2py_success) { + /* Processing variable fermid */ +/*end of frompyobj*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_call_clock(); +#endif +/*callfortranroutine*/ + (*f2py_func)(&fermid,&xx); +if (PyErr_Occurred()) + f2py_success = 0; +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_call_clock(); +#endif +/*end of callfortranroutine*/ + if (f2py_success) { +/*pyobjfrom*/ +/*end of pyobjfrom*/ + CFUNCSMESS("Building return value.\n"); + capi_buildvalue = Py_BuildValue("f",fermid); +/*closepyobjfrom*/ +/*end of closepyobjfrom*/ + } /*if (f2py_success) after callfortranroutine*/ +/*cleanupfrompyobj*/ + /* End of cleaning variable fermid */ + } /*if (f2py_success) of xx*/ + /* End of cleaning variable xx */ +/*end of cleanupfrompyobj*/ + if (capi_buildvalue == NULL) { +/*routdebugfailure*/ + } else { +/*routdebugleave*/ + } + CFUNCSMESS("Freeing memory.\n"); +/*freemem*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_clock(); +#endif + return capi_buildvalue; +} +/******************************* end of fermid *******************************/ + +/*********************************** delthm ***********************************/ +static char doc_f2py_rout_efermi_module_delthm[] = "\ +delthm = delthm(xx)\n\nWrapper for ``delthm``.\ +\n\nParameters\n----------\n" +"xx : input float\n" +"\nReturns\n-------\n" +"delthm : float"; +/* extern void F_WRAPPEDFUNC(delthm,DELTHM)(float*,float*); */ +static PyObject *f2py_rout_efermi_module_delthm(const PyObject *capi_self, + PyObject *capi_args, + PyObject *capi_keywds, + void (*f2py_func)(float*,float*)) { + PyObject * volatile capi_buildvalue = NULL; + volatile int f2py_success = 1; +/*decl*/ + + float delthm = 0; + float xx = 0; + PyObject *xx_capi = Py_None; + static char *capi_kwlist[] = {"xx",NULL}; + +/*routdebugenter*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_clock(); +#endif + if (!PyArg_ParseTupleAndKeywords(capi_args,capi_keywds,\ + "O|:efermi_module.delthm",\ + capi_kwlist,&xx_capi)) + return NULL; +/*frompyobj*/ + /* Processing variable xx */ + f2py_success = float_from_pyobj(&xx,xx_capi,"efermi_module.delthm() 1st argument (xx) can't be converted to float"); + if (f2py_success) { + /* Processing variable delthm */ +/*end of frompyobj*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_call_clock(); +#endif +/*callfortranroutine*/ + (*f2py_func)(&delthm,&xx); +if (PyErr_Occurred()) + f2py_success = 0; +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_call_clock(); +#endif +/*end of callfortranroutine*/ + if (f2py_success) { +/*pyobjfrom*/ +/*end of pyobjfrom*/ + CFUNCSMESS("Building return value.\n"); + capi_buildvalue = Py_BuildValue("f",delthm); +/*closepyobjfrom*/ +/*end of closepyobjfrom*/ + } /*if (f2py_success) after callfortranroutine*/ +/*cleanupfrompyobj*/ + /* End of cleaning variable delthm */ + } /*if (f2py_success) of xx*/ + /* End of cleaning variable xx */ +/*end of cleanupfrompyobj*/ + if (capi_buildvalue == NULL) { +/*routdebugfailure*/ + } else { +/*routdebugleave*/ + } + CFUNCSMESS("Freeing memory.\n"); +/*freemem*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_clock(); +#endif + return capi_buildvalue; +} +/******************************* end of delthm *******************************/ + +/*********************************** spline ***********************************/ +static char doc_f2py_rout_efermi_module_spline[] = "\ +spline = spline(x)\n\nWrapper for ``spline``.\ +\n\nParameters\n----------\n" +"x : input float\n" +"\nReturns\n-------\n" +"spline : float"; +/* extern void F_WRAPPEDFUNC(spline,SPLINE)(float*,float*); */ +static PyObject *f2py_rout_efermi_module_spline(const PyObject *capi_self, + PyObject *capi_args, + PyObject *capi_keywds, + void (*f2py_func)(float*,float*)) { + PyObject * volatile capi_buildvalue = NULL; + volatile int f2py_success = 1; +/*decl*/ + + float spline = 0; + float x = 0; + PyObject *x_capi = Py_None; + static char *capi_kwlist[] = {"x",NULL}; + +/*routdebugenter*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_clock(); +#endif + if (!PyArg_ParseTupleAndKeywords(capi_args,capi_keywds,\ + "O|:efermi_module.spline",\ + capi_kwlist,&x_capi)) + return NULL; +/*frompyobj*/ + /* Processing variable x */ + f2py_success = float_from_pyobj(&x,x_capi,"efermi_module.spline() 1st argument (x) can't be converted to float"); + if (f2py_success) { + /* Processing variable spline */ +/*end of frompyobj*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_call_clock(); +#endif +/*callfortranroutine*/ + (*f2py_func)(&spline,&x); +if (PyErr_Occurred()) + f2py_success = 0; +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_call_clock(); +#endif +/*end of callfortranroutine*/ + if (f2py_success) { +/*pyobjfrom*/ +/*end of pyobjfrom*/ + CFUNCSMESS("Building return value.\n"); + capi_buildvalue = Py_BuildValue("f",spline); +/*closepyobjfrom*/ +/*end of closepyobjfrom*/ + } /*if (f2py_success) after callfortranroutine*/ +/*cleanupfrompyobj*/ + /* End of cleaning variable spline */ + } /*if (f2py_success) of x*/ + /* End of cleaning variable x */ +/*end of cleanupfrompyobj*/ + if (capi_buildvalue == NULL) { +/*routdebugfailure*/ + } else { +/*routdebugleave*/ + } + CFUNCSMESS("Freeing memory.\n"); +/*freemem*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_clock(); +#endif + return capi_buildvalue; +} +/******************************* end of spline *******************************/ + +/*********************************** poshm ***********************************/ +static char doc_f2py_rout_efermi_module_poshm[] = "\ +poshm = poshm(x)\n\nWrapper for ``poshm``.\ +\n\nParameters\n----------\n" +"x : input float\n" +"\nReturns\n-------\n" +"poshm : float"; +/* extern void F_WRAPPEDFUNC(poshm,POSHM)(float*,float*); */ +static PyObject *f2py_rout_efermi_module_poshm(const PyObject *capi_self, + PyObject *capi_args, + PyObject *capi_keywds, + void (*f2py_func)(float*,float*)) { + PyObject * volatile capi_buildvalue = NULL; + volatile int f2py_success = 1; +/*decl*/ + + float poshm = 0; + float x = 0; + PyObject *x_capi = Py_None; + static char *capi_kwlist[] = {"x",NULL}; + +/*routdebugenter*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_clock(); +#endif + if (!PyArg_ParseTupleAndKeywords(capi_args,capi_keywds,\ + "O|:efermi_module.poshm",\ + capi_kwlist,&x_capi)) + return NULL; +/*frompyobj*/ + /* Processing variable x */ + f2py_success = float_from_pyobj(&x,x_capi,"efermi_module.poshm() 1st argument (x) can't be converted to float"); + if (f2py_success) { + /* Processing variable poshm */ +/*end of frompyobj*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_call_clock(); +#endif +/*callfortranroutine*/ + (*f2py_func)(&poshm,&x); +if (PyErr_Occurred()) + f2py_success = 0; +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_call_clock(); +#endif +/*end of callfortranroutine*/ + if (f2py_success) { +/*pyobjfrom*/ +/*end of pyobjfrom*/ + CFUNCSMESS("Building return value.\n"); + capi_buildvalue = Py_BuildValue("f",poshm); +/*closepyobjfrom*/ +/*end of closepyobjfrom*/ + } /*if (f2py_success) after callfortranroutine*/ +/*cleanupfrompyobj*/ + /* End of cleaning variable poshm */ + } /*if (f2py_success) of x*/ + /* End of cleaning variable x */ +/*end of cleanupfrompyobj*/ + if (capi_buildvalue == NULL) { +/*routdebugfailure*/ + } else { +/*routdebugleave*/ + } + CFUNCSMESS("Freeing memory.\n"); +/*freemem*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_clock(); +#endif + return capi_buildvalue; +} +/******************************** end of poshm ********************************/ + +/*********************************** poshm2 ***********************************/ +static char doc_f2py_rout_efermi_module_poshm2[] = "\ +poshm2 = poshm2(x)\n\nWrapper for ``poshm2``.\ +\n\nParameters\n----------\n" +"x : input float\n" +"\nReturns\n-------\n" +"poshm2 : float"; +/* extern void F_WRAPPEDFUNC(poshm2,POSHM2)(float*,float*); */ +static PyObject *f2py_rout_efermi_module_poshm2(const PyObject *capi_self, + PyObject *capi_args, + PyObject *capi_keywds, + void (*f2py_func)(float*,float*)) { + PyObject * volatile capi_buildvalue = NULL; + volatile int f2py_success = 1; +/*decl*/ + + float poshm2 = 0; + float x = 0; + PyObject *x_capi = Py_None; + static char *capi_kwlist[] = {"x",NULL}; + +/*routdebugenter*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_clock(); +#endif + if (!PyArg_ParseTupleAndKeywords(capi_args,capi_keywds,\ + "O|:efermi_module.poshm2",\ + capi_kwlist,&x_capi)) + return NULL; +/*frompyobj*/ + /* Processing variable x */ + f2py_success = float_from_pyobj(&x,x_capi,"efermi_module.poshm2() 1st argument (x) can't be converted to float"); + if (f2py_success) { + /* Processing variable poshm2 */ +/*end of frompyobj*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_start_call_clock(); +#endif +/*callfortranroutine*/ + (*f2py_func)(&poshm2,&x); +if (PyErr_Occurred()) + f2py_success = 0; +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_call_clock(); +#endif +/*end of callfortranroutine*/ + if (f2py_success) { +/*pyobjfrom*/ +/*end of pyobjfrom*/ + CFUNCSMESS("Building return value.\n"); + capi_buildvalue = Py_BuildValue("f",poshm2); +/*closepyobjfrom*/ +/*end of closepyobjfrom*/ + } /*if (f2py_success) after callfortranroutine*/ +/*cleanupfrompyobj*/ + /* End of cleaning variable poshm2 */ + } /*if (f2py_success) of x*/ + /* End of cleaning variable x */ +/*end of cleanupfrompyobj*/ + if (capi_buildvalue == NULL) { +/*routdebugfailure*/ + } else { +/*routdebugleave*/ + } + CFUNCSMESS("Freeing memory.\n"); +/*freemem*/ +#ifdef F2PY_REPORT_ATEXIT +f2py_stop_clock(); +#endif + return capi_buildvalue; +} +/******************************* end of poshm2 *******************************/ +/*eof body*/ + +/******************* See f2py2e/f90mod_rules.py: buildhooks *******************/ +/*need_f90modhooks*/ + +/************** See f2py2e/rules.py: module_rules['modulebody'] **************/ + +/******************* See f2py2e/common_rules.py: buildhooks *******************/ + +static FortranDataDef f2py_warn_def[] = { + {"iwarn",0,{{-1}},NPY_INT}, + {NULL} +}; +static void f2py_setup_warn(char *iwarn) { + int i_f2py=0; + f2py_warn_def[i_f2py++].data = iwarn; +} +extern void F_FUNC(f2pyinitwarn,F2PYINITWARN)(void(*)(char*)); +static void f2py_init_warn(void) { + F_FUNC(f2pyinitwarn,F2PYINITWARN)(f2py_setup_warn); +} + +/*need_commonhooks*/ + +/**************************** See f2py2e/rules.py ****************************/ + +static FortranDataDef f2py_routine_defs[] = { + {"efermi",-1,{{-1}},0,(char *)F_FUNC(efermi,EFERMI),(f2py_init_func)f2py_rout_efermi_module_efermi,doc_f2py_rout_efermi_module_efermi}, + {"erf_c",-1,{{-1}},0,(char *)F_WRAPPEDFUNC_US(erf_c,ERF_C),(f2py_init_func)f2py_rout_efermi_module_erf_c,doc_f2py_rout_efermi_module_erf_c}, + {"fermid",-1,{{-1}},0,(char *)F_WRAPPEDFUNC(fermid,FERMID),(f2py_init_func)f2py_rout_efermi_module_fermid,doc_f2py_rout_efermi_module_fermid}, + {"delthm",-1,{{-1}},0,(char *)F_WRAPPEDFUNC(delthm,DELTHM),(f2py_init_func)f2py_rout_efermi_module_delthm,doc_f2py_rout_efermi_module_delthm}, + {"spline",-1,{{-1}},0,(char *)F_WRAPPEDFUNC(spline,SPLINE),(f2py_init_func)f2py_rout_efermi_module_spline,doc_f2py_rout_efermi_module_spline}, + {"poshm",-1,{{-1}},0,(char *)F_WRAPPEDFUNC(poshm,POSHM),(f2py_init_func)f2py_rout_efermi_module_poshm,doc_f2py_rout_efermi_module_poshm}, + {"poshm2",-1,{{-1}},0,(char *)F_WRAPPEDFUNC(poshm2,POSHM2),(f2py_init_func)f2py_rout_efermi_module_poshm2,doc_f2py_rout_efermi_module_poshm2}, + +/*eof routine_defs*/ + {NULL} +}; + +static PyMethodDef f2py_module_methods[] = { + + {NULL,NULL} +}; + +static struct PyModuleDef moduledef = { + PyModuleDef_HEAD_INIT, + "efermi_module", + NULL, + -1, + f2py_module_methods, + NULL, + NULL, + NULL, + NULL +}; + +PyMODINIT_FUNC PyInit_efermi_module(void) { + int i; + PyObject *m,*d, *s, *tmp; + m = efermi_module_module = PyModule_Create(&moduledef); + Py_SET_TYPE(&PyFortran_Type, &PyType_Type); + import_array(); + if (PyErr_Occurred()) + {PyErr_SetString(PyExc_ImportError, "can't initialize module efermi_module (failed to import numpy)"); return m;} + d = PyModule_GetDict(m); + s = PyUnicode_FromString("1.21.1"); + PyDict_SetItemString(d, "__version__", s); + Py_DECREF(s); + s = PyUnicode_FromString( + "This module 'efermi_module' is auto-generated with f2py (version:1.21.1).\nFunctions:\n" +" occ,ef,sort,eigmin,eigmax,enocc = efermi(nel,nbands,del,nsppts,weight,ef,eigval,ismear)\n" +" erf_c = erf_c(xx)\n" +" fermid = fermid(xx)\n" +" delthm = delthm(xx)\n" +" spline = spline(x)\n" +" poshm = poshm(x)\n" +" poshm2 = poshm2(x)\n" +"COMMON blocks:\n"" /warn/ iwarn\n""."); + PyDict_SetItemString(d, "__doc__", s); + Py_DECREF(s); + s = PyUnicode_FromString("1.21.1"); + PyDict_SetItemString(d, "__f2py_numpy_version__", s); + Py_DECREF(s); + efermi_module_error = PyErr_NewException ("efermi_module.error", NULL, NULL); + /* + * Store the error object inside the dict, so that it could get deallocated. + * (in practice, this is a module, so it likely will not and cannot.) + */ + PyDict_SetItemString(d, "_efermi_module_error", efermi_module_error); + Py_DECREF(efermi_module_error); + for(i=0;f2py_routine_defs[i].name!=NULL;i++) { + tmp = PyFortranObject_NewAsAttr(&f2py_routine_defs[i]); + PyDict_SetItemString(d, f2py_routine_defs[i].name, tmp); + Py_DECREF(tmp); + } + + + { + extern float F_FUNC_US(erf_c,ERF_C)(void); + PyObject* o = PyDict_GetItemString(d,"erf_c"); + tmp = F2PyCapsule_FromVoidPtr((void*)F_FUNC_US(erf_c,ERF_C),NULL); + PyObject_SetAttrString(o,"_cpointer", tmp); + Py_DECREF(tmp); + s = PyUnicode_FromString("erf_c"); + PyObject_SetAttrString(o,"__name__", s); + Py_DECREF(s); + } + + + { + extern float F_FUNC(fermid,FERMID)(void); + PyObject* o = PyDict_GetItemString(d,"fermid"); + tmp = F2PyCapsule_FromVoidPtr((void*)F_FUNC(fermid,FERMID),NULL); + PyObject_SetAttrString(o,"_cpointer", tmp); + Py_DECREF(tmp); + s = PyUnicode_FromString("fermid"); + PyObject_SetAttrString(o,"__name__", s); + Py_DECREF(s); + } + + + { + extern float F_FUNC(delthm,DELTHM)(void); + PyObject* o = PyDict_GetItemString(d,"delthm"); + tmp = F2PyCapsule_FromVoidPtr((void*)F_FUNC(delthm,DELTHM),NULL); + PyObject_SetAttrString(o,"_cpointer", tmp); + Py_DECREF(tmp); + s = PyUnicode_FromString("delthm"); + PyObject_SetAttrString(o,"__name__", s); + Py_DECREF(s); + } + + + { + extern float F_FUNC(spline,SPLINE)(void); + PyObject* o = PyDict_GetItemString(d,"spline"); + tmp = F2PyCapsule_FromVoidPtr((void*)F_FUNC(spline,SPLINE),NULL); + PyObject_SetAttrString(o,"_cpointer", tmp); + Py_DECREF(tmp); + s = PyUnicode_FromString("spline"); + PyObject_SetAttrString(o,"__name__", s); + Py_DECREF(s); + } + + + { + extern float F_FUNC(poshm,POSHM)(void); + PyObject* o = PyDict_GetItemString(d,"poshm"); + tmp = F2PyCapsule_FromVoidPtr((void*)F_FUNC(poshm,POSHM),NULL); + PyObject_SetAttrString(o,"_cpointer", tmp); + Py_DECREF(tmp); + s = PyUnicode_FromString("poshm"); + PyObject_SetAttrString(o,"__name__", s); + Py_DECREF(s); + } + + + { + extern float F_FUNC(poshm2,POSHM2)(void); + PyObject* o = PyDict_GetItemString(d,"poshm2"); + tmp = F2PyCapsule_FromVoidPtr((void*)F_FUNC(poshm2,POSHM2),NULL); + PyObject_SetAttrString(o,"_cpointer", tmp); + Py_DECREF(tmp); + s = PyUnicode_FromString("poshm2"); + PyObject_SetAttrString(o,"__name__", s); + Py_DECREF(s); + } + +/*eof initf2pywraphooks*/ +/*eof initf90modhooks*/ + + tmp = PyFortranObject_New(f2py_warn_def,f2py_init_warn); + F2PyDict_SetItemString(d, "warn", tmp); + Py_DECREF(tmp); +/*eof initcommonhooks*/ + + +#ifdef F2PY_REPORT_ATEXIT + if (! PyErr_Occurred()) + on_exit(f2py_report_on_exit,(void*)"efermi_module"); +#endif + return m; +} +#ifdef __cplusplus +} +#endif diff --git a/pyproject.toml b/pyproject.toml index e83870d0..36bbde0d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,5 @@ [build-system] -requires = ['setuptools>=40.8.0', 'wheel', 'reentry~=1.3', 'fastentrypoints~=0.12', 'numpy'] -build-backend = 'setuptools.build_meta:__legacy__' +requires = ['setuptools>=40.8.0', 'wheel', 'reentry~=1.3', 'fastentrypoints~=0.12'] [tool.pylint.format] max-line-length = 140 diff --git a/setup.json b/setup.json index d66ad4f6..9b78ed48 100644 --- a/setup.json +++ b/setup.json @@ -74,9 +74,11 @@ "pylint~=2.7.0" ], "docs": [ - "Sphinx", - "docutils", - "sphinx_rtd_theme" + "sphinx~=3.2.1", + "sphinx-copybutton~=0.3.0", + "sphinx-book-theme~=0.1.0", + "sphinx-autoapi~=1.8.1", + "sphinx-click~=2.7.1" ] } } diff --git a/setup.py b/setup.py index 7c761631..c07e7bc1 100755 --- a/setup.py +++ b/setup.py @@ -1,29 +1,38 @@ # -*- coding: utf-8 -*- -"""setup.py""" -import json -import setuptools # this is the "magic" import -from numpy.distutils.core import setup, Extension +"""Define the setup for the `aiida-pseudo` plugin.""" +try: + import fastentrypoints # pylint: disable=unused-import +except ImportError: + # This should only occur when building the package, i.e. for `python setup.py sdist/bdist_wheel` + pass + + +def setup_package(): + """Install the `aiida-pseudo` package.""" + import json + from setuptools import setup, find_packages + + filename_setup_json = 'setup.json' + filename_description = 'README.md' + + with open(filename_setup_json, 'r') as handle: + setup_json = json.load(handle) + + with open(filename_description, 'r') as handle: + description = handle.read() + + setup(packages=find_packages(), + package_data={ + '': ['*'], + 'aiida_sssp_workflow': [ + 'REF/CIFs/*.cif', 'REF/CIFs_REN/*.cif', 'REF/UPFs/*.UPF', + 'sssp_protocol.yml' + ], + }, + long_description=description, + long_description_content_type='text/markdown', + **setup_json) -flib = Extension( - name='sssp.efermi_module', - sources=['aiida_sssp_workflow/efermi.pyf', 'aiida_sssp_workflow/efermi.f']) if __name__ == '__main__': - # Provide static information in setup.json - # such that it can be discovered automatically - with open('setup.json', 'r') as info: - kwargs = json.load(info) - setup( - packages=setuptools.find_packages(exclude=['tests*']), - # this doesn't work when placed in setup.json (something to do with str type) - package_data={ - '': ['*'], - 'aiida_sssp_workflow': [ - 'REF/CIFs/*.cif', 'REF/CIFs_REN/*.cif', 'REF/UPFs/*.UPF', - 'sssp_protocol.yml' - ], - }, - ext_modules=[flib], - long_description=open('README.md').read(), - long_description_content_type='text/markdown', - **kwargs) + setup_package() diff --git a/sssp/efermi.cpython-37m-x86_64-linux-gnu.so b/sssp/efermi.cpython-37m-x86_64-linux-gnu.so deleted file mode 100755 index feee836575c9308fc42131e1dcb605cde73a2171..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 104176 zcmeFa3wTu3)doC)1S5iHP)4JIPIV}W?f3oP|2+Tm zFq%1Muf6uV?X}lld!K!VTOF=x{gRSQ`lr8XvPqOOB_vO)XjmP^$unh}PBrD3E;Ri> z;3n&h`?$8)Bv8Ma%(6^sDZCvg%kkG-uY~JYV>`jGQ)?G@EgUZ4`qkKO0IK$WD(m+i zi@g>OljUvNRd3f1V7BYg+VyDd^sAW&_~_SESu{~b{$*?R@mI|(CjClWehNSGRPsK3 zmnfca^=RFoU-foZqaEe^Pd{2Wm}Y7G64}KnI>}_xueukI?@;{p$KUiBb4=e3e7NhE zZ#}rC=F0xndp~{dp7zc6{*khb$KOo+5ntG*6|_*yOFH{3^BU8mHLm=tQq@*d-om_$ zetBmCEBax(!e}w!-PNd>g}>SOD@uSh2k>j~Hy3{;_?w46{d28$Q;O?+9T<0AfN~lB z%JFv{{wnatPo=z=+}gDY*G2gI;`3p<9@yP-`z=r0{_G8-PV4WVI?-~q?UFye-eB(i z=c~_Gy)|H1((Jpdir!mq%3XQSpf^LM6Q`+~Z0{+$n)Zz?MJ&2QQ}zjHT?Y=erFthe+_?cvqXGP!~d1=|3RkC8zn%ezfyy@YVa%# z|2>WV+Bo_zYw*@M`0rtdA*QoT9cQD1@X_G9fCQJA*cjD(84Zb&y&S4GSxkTbE zlNZxiLEmCpYmxLj9REbI13Mm_thLzVC)7(e`cpyB5&mF36e#k5F+kJA#yM>P4@Yw#WozjC5% zFi`79ljbLSf9=)a4VpaqGUHT@&UVet^fU1(D_c}sUsu-TDR1L!o7v8Z5bO?{oasQkJbx2)^CrmUi+ysWCauDquDCby|-e8aNpx@ynT^2WL{Q{l2{ zHTC75vZ7@TZWMSab2iOxzRn{7Gn#9!b2pX=B-Br>uWhJtx9I4O#>TRl6&1~mjqXa+ zvN+rAneAz;u3Loi%%yFGS~r!fL1+SD3%c_UC}yKiiE*HyU7rY?3@++YNt zmDA&{HI)@EE1Ll|(Y(3B0}OlPqO!vB#wK@BGi0&XRbJ&@wzR&nvI%u%Q<|%5Dz7Q8 zX@*5;w~8CeDi+^RR#jeIgKBb~=Jr%9*6wH2H`WTPI9e*)4W8=yI#%fS)TOAgyuy7Q z$i!DnEpKk3#Yl3NyUA1E$dYC*SG~}mmoj_Pi6sa0A=zb8=}F~@`fgo(Aq%VvRTb_p6XgRbg5^jP^UtQzl;a(c) z2+-0r(>w~5_9priYDk+dMrYB;P8%Q9lH9JTudXZ<$Xa`JY>Y>qK;1+Vf-+DIl%;Ke zUR$mkhlHxHYxZc?lO0tihS}1_@&@#BSw*xcy0J1^u5{OU7S~40O${~Gb?#`np}xsj zEsEngY&A`$HM;3{Ml(jFn>o9zsZP2Qol3jayo&uQ#);mo1kfd9xyge#gN`k$GWa5f zVzdKv)1xm;weH#`w?~Y)#tK9eI&PDvv7)wtRTT}(bmV+@jlr4~_3)S(`DJ1V07dsK zl8o)xxz(PMKw%+C@4ChTd$3L5Ub= zzNz(f5Fd5mg`fjc^^MDfFX*D#n{;O~I++Y!?v{osQ`w>_Z4fqj%9b`(dk}~sAP&wZ zxBv`Pj=+MUa{`Lqs;m+*&(IVRrU3y>MAkkCA{^9cv})=XRhjT*XdL0o;kqcowWj(y zU9>Sx^*c*% zP#NGkU7~0T#=&zncuyQWUxW9?!Bq`z8juu2f2Iacje|F9aC02|8V#Nn2QSg!);Rb= z4W1qccWdx*aqt=qo*f5o(%^Y<@MRiYjf1yp@WMFw9U6RL96X@G8xp`<6Tmy-;5TY? z)+T_jO8^hX!8DIx?<71Kha3)nkAUG2r(a;QCrzR3Dc}wB?xw{8R&c zr~z&^z!w2Kdd6fz|S$j^9=BF4RF-}uQb354RC$$ zfz`zZ_;3UMLIeDK1AMUoet`krV1Qc<@D>C72L^bn0lv@xztaG>8Q>iTIG@w$pL-4P z`8p8SwFdYI1N>0~{D%hkIs<&90lvWiPdC6j4e$&De47D&u>ro_0RNEzzS{sFZGi7J zz{eQiK?8iO0p4SPGr!b7y#{zBbz@~%V$lD`%UkiCYJh87QUY!^z_m~=;AsZ9zQ@K2 zs{y`PV9Kv_16-S;M8!A*T$=&~Jlg=*rdR>bGr+YeT)1CyugU8^?fPlVRSo23dRRa>W<@{p&;-bgrF@`!+Wcg z3$T#a+tc2yxm(cI)O^Vt)tlQ7tW2u!BhO&fpIZmn!j>L14pu<9?v(q1m^6P=)fnZ1 zHi}`|R298ve~?~i5pZ?+e7Rk333d`6@`i+&9s?ic0+W4?y~yeNcFt_ocUboO3iN$e zE#=KQ>QS7&H^Y_}Q1Weo_&+$Ln5UYbWA7faD?^fPbPQkc+WGcU`+TUB2g&z@Eps(( z#{)gjtYfApH4jw%g{i7=xew6}^eu0oRcL|H4tvl?=Lgti9L4i(QrqA2 zyb!kBjgrgvsp@;*<@+Rf;CMI;QvUv)5vn(sr26`UveG^Sl!O4jJwoVk;kb|qunr?q zeH4lHbVp&1M_8Lx;i&3+S@pf81_ocS3s?b5?J8Wn z2gX&Z{^Swq&|3B7+tM>3WlB4>59Hg@)UEk8vHy)L2ZO*#%j`rkncao!AcDh|n_iOA zJWV9O2TcRZZC0>(5XK=HEAfIKd`Ckx&jqVwKmO4BBh`S%Hi+n{;ay?N5D*eRO&)9` z(V8czxG`&ArMC1+^^##i?B*Hh^l{e;KdDjoB#ui+PQ_WP2|PVm1YfPRnt#=ee50n45{ap~KB zTR`BywBOU+iR{O2irDX>WB<;6SA)?1mHo!u8)v`uWOjo6o&@xJ?6(JV6zsQdB`$s2 zuN?&bOZ(llC6WDnU=y+52fhE!enUX$|H^(n_r%%HLuMz~Zwa8^W52sFwZVS3-GNKr z_H%&1e`&von-kfOZXU7UZ;t*u`|UtR`F~}ysfNsreMuKRp%c z1S`{GAO_->YIHE`F1MwJEl)xg)n5crKs=p5YuNIyjRfY~vN0jcJfb-r6LKE2H_XXx zoWeybBw&=248xYk&}#p-u;nzc5cwi9!kCmXEha5VWm+;V6>gABaz|Pp!*`O>{xE6N z4!bCtZwotqs>swH0>JKLDp_k18KMIj;z4LE=6}`ivZX>`*%?YZ-wT4!XLB9AfS|O+CU>79|LFWNcW;9Cs6g`#u zs#6LpWDAu69LckpUp{|3S!|~;GQYelY#9&A(fsn+zVk~n88E?xi8ReaNr1)Vmsi9f zg~o|`+H^V?GQm8b2);c`Fb_abCYVbB3R`9XL9RROb47xQ?9!6i4qdL{0$`5ndll*C zUQ9-_)!PoV_JhR!tPC_V^lh810dREh)=tvoNN<2e!KKZXog}ZSb}iJd#oBctuE5X3 zh1Yzxb73&GprFdadRr@QPYe0{ed8zrH;AO~7F_&b+ zy|Xb?E@xC&tbN^Y<6=FMvn%a?#6VVW+uQ=E9CY>t_OeL4a0MQ=rPGl9^|o!009e!XxSN%&HP24 z`Ip*?jO30$FOs95OLAw&tMmTBh&mtYkGMW7Mr_#f<7WW%%MzxJt6EWP4`UM}w-?KP z%wr_(Un5(=|2fW8-x^ygHict$+1F?LR>JTxM9l(v`)#$jM#b(-+0-w9(bx4Ga`zT2=(a^Q&33q4oU zpIn+hk&n`LNHmfDB>X0`Q}`3S3GUSfB5fXr&nDj}`X zW*0WVz7!KC?oTCA?DmTV*pB?+bw;oAL{Uz0klhuUFJg_fCQV?a34Hs)mSkaet)e~5 zbThX_Y@1}2v{DBD_w-BfwJ*cr(4P>dRG4!dXo6W`=zcgLOjsBV;$)dkmO$%-Jw#Bq zD^GN(_v-0G*mBMWhV*XH4G#)r)hx^@=#WIAMgoYYrz2fkr7CruVjR1CE?YW_Jyl9g zx02B&T44Y3?_`ZS(02MZDs3NwfEqwNMyij9FEVr{$^qmw2p9P_kN9pWv|nuxH=5Nz zn+=;guvn3;xG?Oo72^+K+hr@}47`?AK)D~+@SB)@3&WN#pCrp7Y^-TJJlUvZK8Xp} zGtA{1YQrwqdc>B@&ama@LOy_CzQwMbH6m5kq|rmQy}8o=vG(GdSN}K?GwZp zr+2Lt0;MU^`f8`(p|! z{V9K1k4w(fR8KJqPmyFG>o1UA^=F4I%LIWRiM5KJv4<_^5$aDFhL(=Z56KXg6!=bo zzZt!tT7fcw)_?Mfvgf;z(=W|*C=3g{=!TS z|77Dp?n_H(7qq%qcvPk2xi+@Rk-wbSBy%Th z6Ubcw%&_H;;6xUItea6*eJTIomIk>!!>0b+S6GgjeZ0AIU%*iFOjiS=XW&k*d$^>u zTtT`0%|@X;eMq3*wxxkX#*3N0xf{H%Y!*_4En`3c()n}eP#v0LvoytiV1NZzeH8BF zzD>~&SYb;ESq8E;#y0tDpG~r!_h_tHFIZp9=49=ZtQ%tK+|VbT+$EqBw!Hsm!FqaZ zlk7g5WR2HZvtF=%frw=N8gBwwUjf6Qbx&Wm4CH>=MAj9O^((PWp6jzo)+1Em_|bOQ*R{I=Kr3>mb_(vaXJ8GNsQZS?B4jSua@cAR@Ki&6_}07#Iev zk5RD`-F{aiwXT({-->Orwa+G5ccF>Un)QP9$Jk;LtmjMCZLxH2?UPRKbiw)%+Xk|( zjcwxUvq{!RA8@M3os7voY{`>C`_R%bygwxrdMfQ>MRpMx;xUmUY<^k0$bk9Sk(01etGITvX7y}hDzOJLrh@$?KsJ|7dMapGTp!Ay}gqm5qQr7-n z)_!}Vs0~}*K{<4Ttou$H;dwC7M7W$S3uNscS^Ku$@&UHYL|rugsou#ZrW+tvze`%-4mggx0?3iD9N)YULHIAAwSTz2PbTn3I=$Vg&ZMnqQjqhxXMAR- z(|@|EJ%mL9zeG@9wv)4xw%-)9_mD?ht@xMfeb#m_dcx!kOi!|RpOWFh4k_lb3~izn zI~7{|_wG+pz27J+9WyCIPssb3mW&74n_03MNQ%t5nW4HimqcyYh z1hzb|$Gg-JX%ylipO|PwqnP zveybY%YO$Hr}9Lv%a^=KLu-CVt=LFR)%$gla@SN)3rtCJ0ame14NQ1>{~6*r{Z{dU zCIm>GsTVcwh9SqVB69RXj^q0+{$L6Dx3*BwtptvK$-cS_q$YObvZ!3<8;uh<+R2-nVma6m-alY)DJ<$HoAhh%Uq>2 z?XaS}uS)syC0ySH;0*x2L{ELWxk`DX3xFN~-q@7W)3^~Bd-1p1*9-7JQt`FR>fK9D zZ{Y70ly|c6HvAEH7p|yy1NV|hSCvy)(Ur5+qrizEf=hW~(91bnZvCPlXNS`ED3)SQ z-$%2soE?Ec`xHW?$v#``-aXHIOd@kKI~|!}yC~Xc;rs(03t*^PUA~|ne$ts7_(}Nq z@#9B#{NSbA_O;^U3Ho--@DKXNdUhg3E3pHDVCTk#>t?Qps=-r?DG^uv_lwYI*g$>= z?tu+t2GN)xj;=(-)?{wDnL=kHslfch0m^aR{$k5e5e+*TO?_RVB5W#fe)4s>e5ZtF ziBdkQ1n1DVn6&eA{;3513^Jh#w9)1pI|d!Rb!+HW*&h43CGeO?Jo6z`ru_U72olKJ z&IC~=Di-J`DgOxALavk>CDy(u)-U7dVW!?l_T4p~tA^a&5 z0LaG#AIN$-iuFVUYYVXKLPHS{Lpj*01se&%oRIUTvZ@h%?DQT>Qra$qObj@7u`{H_ z8w{o2fwUl!**Qm#Jd8GbXlg{8P#E4J8^I4UQ4rXn&p{9CS770J8_zyYPxH2^ugj%{MqF`7oe?tlOh{y$uM`C}3`a>dT-d>Y4Rv{rz{; z?|)zPv)aDXb6R-BXTPDx=99cQdpUv<`@TTP`7N4>Z9}c?H^2;Aeny^K|XAG zg{FiSVZk*zf8x>JcOuusqIDe_;dwQi^66x!=iIR6TMFl!YGv`fty8(Rit-I2k5YZR zky&cyYkd;|0GnEOT9JT}mI|tb* zZDgi;FE?#ix>GL7C-pZqhkONQ@7HMYst|X6nzH&W z+#z!a`A7-l!|!Kr6<}P{sD4WdB=P$T$f_XMV;W6-mB!$g&lpn!KMQ z4>*ttan*{~u7@7^FPnwfPo06w>Jg|$}lliUFcSLlX@738Nz3oMdm3tY;{2K6V;}%n;Y^{q784ygg10&i^rO7Qa3bN@#|^UMfF%UzEA_n;Sddhso0soSsEoH--aZ$J|zcD3Idhg zsf3Ip^KtVdPj7?u5#P@g0%KT* zehnjhtMyx6+h>aJAILp0V0ObgO8e_5h=t=_dpZC5bE|>Rv7EURo)YODm{{u|l|GT6 zi`uUP4ceKZZ#O1U7}s-^lg}CKM_`ctN?QlI3EgYXQLW0VcR6%P555>Qi-+>fo4p?; zds3X*7oKz6@< zSfDWMJ$CBSL8wg)T+RC>mjnvG@*eA_+))6LyuD{DZTYwf6dnRlN96sIfv4p&?gZg} zRK~_xW~8B{#R5!#d!k&i~^;d&dL-#&$kgt7-kos-L@|Y1MRkB{8rj( z0fF58aAE+s!l}@27uJGM1_%}SUWb<)es~12b48Q(*U-e?dh5B9m9|Z|EvT4j&8I{T zq+g>|?@Q=Ow2||(Z^xlOsXnZ+2ag0v_2_mru)IGI!j_rnVXhss{nPrgOQW>Qk`&ma zd5AO^4Yj1i`}NtLqCO0iN2F7`JlPQu@|EYOoum48;OeqnAOzB->7rvAr0M!qoLS$3 zQ|M;>GwyHuh!*usvTvY$A5}c#BW&U|&8d#1?FMa`$M{q1zeF9MW@3%t06bI-&w2`! z5&6`kUm%PsZC45R&DZ*+Jq6r36yW^W2S6{b=@QEyJB*ixs3k`PCcUc@jEA-_F}l#& z<@=aBsU02g8-~#>(oxXuO52~ANBZZOg=;xECE5LRuvz246)QM9AP97GtahIRR|Fm6 zAmq(S2M(?{drwF@AmaeR6=8^wae!n4f-A-!Aqbjt@&LgVj!DXSPEPP3ou{<730WO@ zFvR0-p=K02{CQRcJ+t!UlymOHRHyp3ht5JS99gf3=1TkEXj6=Qwti1w)u&vG-o_-U zYX1F{JHsk|Q&GjU(Y#0ubpT6*PgjL%&A%MsK?yj~7l`8ifvR_7a^N;?J-$s3lU>5` zWuOe{fwD^tT**MWLqy2H;NQ|8yzlnsuy|Vwp74KoLg-WUJ|>q?5C>}+n*VYGP#M_O z1TsDdgh+^gn1vzGi%oxrLibb^fT`J`iHOh9F{9k^64H8%8=S}FQt;RKdI}>KyT#yt z+dgJ?w;kiRr%1+vReWlA~PYRUbtNoEKPBm@$Y2+u*An->dK z1;}r*4?oPY(LNg_L-U~iqo*iset3j^14mbA25!TadB4EeMf`6R6~Y8rxYb3ka%-Yb zB+rXLN{m~5{}by5?0(*MpanxFCO2emm)Yr`jzo=_79M0nl+{}R<#7amS(=upJGr^> zcz@=;`_GNeC(hft3Bs-~W+vYFzI6I86;J10gdon0f7pFnkr2Oa_g|ChJ%&@Z&4>vF z{(Iy)3?XA8V}w81re2=15-nW5tnJu4SK7v7sPp8l6+4sH2Bw6$Pk6^tAoEokfUA@x zozeX?t|&xW@~>q0*kDsm_tFEt?bs8`*^Yy_6+PM(3sHQoFReKnSDeDL3a-soyZ`w@ z2#&S2O&(0}eIB;V|2eJ6R9Zg@?kb6uW^f(7vM1A{o}+whh&K*4{X1hO}vwA;QAZh z`gukH!cG1erbV2-^W(H2goT3~#w$Fw9p)7m}@g9I_ zgc~Wo62kDF6pa-&EG7F&H!Gi6Rv;_vw-CfA7P+kWohhNI6!;nifcs91h3_)*4Lf6lPg1>I`?xVkg{~_I9xmFhbdP}NWf#s{~4Qu9mp?OY-3$=i!0vlH^c^rcDSKa_Gvk5EnlAg% zcO1UgLwtD*QvhundICWwb7!a+#@0cvV5SLMo&wVjFsc42nIF^6CHv7qt(>;G$C3x{ zJAh;Nhj^rU2l2S)f%Qom9(c8aCmO;H!j@O5fUqd*qT!~)5YMm=f_EJ8GzY@E{PotD zu(l1r%ucN0JhwoQux0(-7@jy$0)C~cubWe}WgB7MQMM$UQffX;1alsb;NtIy=TfJ4 z0OH>o8!2Hx3>9w=xO_cI`?&)k95z5vVHgmyKf;!mK$UT${dtVv4!^@pjTlo;1wK`B z`Q2%Vtp&c1wa{7+cs5zY)ibI(BJuRN(zYA+DDZtH;_04(jF0df4JJb{eb?@vk?Q># z1Nv`7@!uhXDPq-?;7ONge{sbRydn5b4|dF7!`p;nU!C#5$L;x4ya?O;B|@$HF$fD^ zc1fqU{Bs|jdAqBBZ5kH*E~M6n(RElVrWW`E97@=LQQEdLGWkE#j`wPs-bfEd_EhLKbWQFw8^w0w6 ztM~gpvhjA}coO=UN13^Efw(UmPo9GNJ2ZrlW^|mK^-^+4eK}qP;e$qoUIdiWXcEph zIQFGHuVNK|ESAfTaX@y#gVGS6oZKoI>h$L!W+DQ+@XiC@DPb_?ldw0y$(i%IvifD* zxO}|@f#lQGjBP5oTVV`Hh@*$7!m|i7^7gx$$(r^{QC6Rc`wjR7e{6l2nkvd`oZij> zRd!$Aacw{b2Vho8QdWP2Zg2(~k|3tN+ceOX!S`TcT$G_c_FwPf{c$nWhC_6o%jQVK z2{`>&w#a@7(357ncQXdYSNWH_k-)kkNI}JyG-UeI93TbNM|g4dZ%)H=q_E{6srm;v z{m%>2K`kWa(_oS1ws9yRFy29rr2U-!JLtYtUCuCEsqmeL)Jmvfe}Ug2X3Y9?28aaR zLMe!REb*i@9M~EldOljwf(mqb@cg|{;8Tm(-{>Qpl}a@{da__`yFCsD+Khp^=>h=?xXE+{qzFb>0(O9Enr z)s_VL9GOQ#UnAK?+`xOrs6fAlGB`#e@2k6LXQTXlQy>kagdY`$>NPcRzL@TS^P;+P zx(@U9M0DUQP6&^rh`dKx)2Td3;i&@Tzk`#|iy@Ct14}gMiDRAgv_%vxXY2BRVZ%>2 zH;2zS(I2m%Kg6(z4uViF2tn%*AM)V6m?1zBU2-~9C2qDp`Z&K?-18U))~^DcdxdFR z&yDPcIMGIqz3f!y?OV~;Rirzz?G zQi?`A1SDnbi2cM#?>elMbSZbd1q?JCeGEYHB1futFJMr7;-ew&~Tj1}d0Q&?TGosRAhf@3%>zCUG9kweaTOikAr8H$T zF&s(>>x#3wSz;}#{uopBgt6+LNWrcw=sv6zr>xN+o6&s1R%K-=hmJRzS3uJgpe(%= zVhs-?!cxss*hnea4FW;@4c{-|CAb%`(Xw1T{A~#*-tgDuJtQnn(e6JutSs0|>nmfs zl$FP%4O5;Jh^3oD&2W>5{b9fy!46=3xfYBe7xg#i3=$KXp9{uxcpho@kplE1LDZ}+d z|4fBD2G>7BqaAz?zZbCk5X^1^QT+Nu3a{wb)I-XGO?VflGyeB7_-xEdrnFqRG-k1j zX&@7QG}r^SONRi#Qm2VUA@I5;5GvIlC5uc?X~)D(R#yJN0rec54{RO}3oN${6Z>g8rXC*Ue&YAUKegiNs&9q74jBeW$tJkz-5?MgErlLsqi5~}v)q~F1aHL8I}p}+2=~KR6R4DY zr=))cclinfdftvh4yE*601v_ffR<*RBav{H|6nIn%u15wtgo(>Llso#b)!}BCj7z( zdRDHJkY9rBDazQCEZ{YcrEfojJ5cU~lm~DdT=^7DTO#0e4&cBsM0=WlRTTX>q8AHv z^I#3Wjop@t3fZ(2u@KF*`C7BDU63%R{1KCZwC^Q=P?JRVy%tQq*S_N^%BvfMQ{ZPf zKr2jJrc9BnY&JkXg9{u7w3LHh_yPi0?K!xx zJY;{{0Zz(%t%Ltkp6Y+xCSIpP_EF45PO$*ur50S7fp9;}Wr-toJ=`!zKpG z_uEnu>5K^M5LMH}bQH+kEM+r!Gmm-$cikAd(mc&x{^kg5645b^mW zDu638Mi(;=HdHJAX&1loqCy|auXcUV59bSA0UK9O$ku$xHt#3cS^F(YI0fb@_lEoN zaNe`FRzOtWYuH7#^B;IL1%LK;_Ualz$M^Y_fk79#D&CTBk-rN>noPFAl*dQMR|O{h zB)AZbkdTP%EH&wKSJJ;+74I7xAt^GEQMA#$!5^K_DF5ZVffU=|^IvGMq6sX}3{sQ$hYAe76I6)#9T^X2k2U{e45L|}({L3fVl=eoESV2Z^ zo0*j-YSn-Gv^<^=@8 zM&P3Rpz-@40=3qQ+FOnTK4j>9tSx;SwZ~Bly|6ikwvO*uJM3xJR^E=w^PUVVek>GL~xu7U6uS7HRn~Oy$6XoS9^s> zJj`QV{)cU?klf|R`8V|N1*#trgH?lU{4RR@TP6JiyMF)(l-iaf(tm^~Ir@<~uqO@! z7tjaJ#9yV&jPHkS!m3K~eiUj%?)A8M2a{{rwlBu<2_`(PV?1x*Xcvo{Wc$Ng0Ar^);wig7$mv6zu;dkWGbEnj!}D{a=T$u=PKxq7;!Qe$gy_-!^CWHI(c zl+{;&nwanGfg)Sj?w<^Mar^}yx9vqs?><<$^yXyPWx*BD|5*XG`*!lsYg;;=G9ctB zZHvSWlz&9rK>6lDtb+3OgLwn(N>9h`0A>!+-`9|AdWfWqzYpAMebwE&~0R5H2@ zjMhs=Jb~QyBxu>aUxUxDK@4|b)C_941E*ifJFuFg2pD+Xf;;Z&+jBN6tHy&%fH8*plsci=QlaQX(EYH;VEYm%}v z;IT2*l)8Q+x&X;(ggm^j{W6RN3gLhwVV}xl%cB6;%?Mil%n>00X3N-FaBXA*+woO` zr;$_zx5Yzk#2;#tY6UVtPPdPjJ_9dI$1_3Kt>+1MQoUP})&8Znar7a&&t2Wz<-jm2 z1|2gpK=3HFEyTl4vcuqNfor;Wd%umFl03|~6QhA+wNK~F_hb6heRB%DC9?hz{^{_a zMMfByMh6Acie#F9Bso2-x#$kNI3oBDcqH!717~385O?T-LV1TCSRwDw18cB3h+6bO z>uE8L%5zN)oF0Rto{wIsVNfW&K{zUM${})`ppVhp+XOZC_Tz%uH{f+IsG%0TE*Eb6 z4S3xo@90->=!m0c7#(%0mPdMzgIpMn;yn&({8vf6$3g5faRXWt;F;dzAmtY>TCTe& zBM1Em=E77;7o8wn^fKB=A6<-KKa!3QE+z5~Z1%`I@W~a9$-&Sc^f4^Jsf2g_OGTtG zJFy8YTy(i~(P)(L9*2kKY93lEJrs|g$-f33+Vm%Ss05gE12d(E_M*B3Pc~hFa^ay^ zX8?ba?x7choXpRqe`13#2Pxa~bA?Am{1a{@+;c136JjP~X;O+G^gw#crHIScf{tsm zy#W&;@NdJCSh@XA=%?G3+bV~QL_lnNaJ1OstmI1NJ7l|7JUFNa@Ey|}7_TJI6kiLYYriC~zTd1;gL3+_r0N^rSf z%r1!McV%N=i77dxN3N;`bBK-~w!rs#F{DDA54p}nN8dstlLQPHJoAr$%Z-3>GbltU zR^cUx4OpenAo$V7&`-Z%+g9j-otL?TcM}hEnz5VwtnC1xB(^GYhl4A@^^c1sQ!JgU zqI5v!CxRWM5fLduDnd!hcSD4bj8g`wpmqoB?T$t@PR7~6;)G2W3QO_aEaex@M$zeK z7eyKw6u&QmPrdgR$ad}odXxA1$NJEFHppo91DRit47n%NoATTcAr!CoFTWPf-Nx=9 zq4`GrOVM;;!lnylQ%!%-kovRHk0OnX`p4kU(ftNfLvYg{`cU-xD86DA=yJAEhOkLT zq)EI=+i-+ITTko#f^m{9`z9?|kB0f!yCuM!>$^&HL#Y-6(f};h$A75nC{3M*eWKh< zSA2H~n#@jgpT#U49H>i`CRs!stQoY(QP@eBrxZ<&{$A7lgeFr2d)ilPh55QDeC(l!n;n=Q0UxJVwyS5^xZr2Qge0)4bz3N0;pjV^$3l=A0aI-qxs zv=7DwSA2O9BC(2R2Zuz6$oLvn{2%DX=>9~3=yq-;W(U7}w2xjtTga~Yqi!$3n;l5? zyCcowS=}gDNxfTzage1%L^kS;P!hZ*LdW2w_e!Ue{HZ_5Kn&O~q5gEoQzOLUh585F zQP&@YgaIP@&4Tza9{W$cH;&%*puww=1_r_R0GEPlX_+?ZQO~LfdOUr* zP9N=J;`k+zCI$|-09zYZni|>=z+;@?IiiJmc#ev&j@bylRJt3E2@eMe?$cqjE_9CY zX!_-dy+DLs(f-lL#KXF8=7a3hk3B@&iVw$KP^6m1e?6Ha1j!JCaFQhuh9 z=p+ePnItefgB_;l98C`4aJoro*|`SMW4mJNS5kE0+IkZ@h0V|;R@+7RsSRcB==Y=~ zVst@Ty(b{`Z+hqD`PI+yruo^~JrC6%!t5cL=%;J1oDm+FkQjw8!h5AG) z7W>Fb`dpzp{1--7sOO5^lUC+y+WPc#_76_c#;s4U66;gr_JD5}wlA>!suW8tZf-mz z@38#ZC-1QQI&Ab7kzL6688FXeoCf27bVF$53JuYrQY(#%T zKx@6Y0jaB!xoYHI4-T^6a8aUFBaQL^IEf9P_r(pwtR-P?_Y5UH8pJPdK=^6gxB`ph z!gqNYSElF#dIT1|!^EQZ0zj~?+6$S*s&qP6rJ9Qh@5~N<_<#UelI?UT?39R&5=;u% zBjFZ_czp`%EV1rnFiFqPf!i!USN^zDbZ6v3vGV+kD^G|arh`)aq#ak1*qXY1u$gUI}$yes|kH{9(5nF z0W@%ftQeD9rI<9C7efIg#`4Sz^ZD{Tfrd~l$Qfpy=!DJWEC~Q^&OAJT7|kb! zn@KQ!8GFB;%P?*G{8u_D!?eEuRFFhO^IarF2K^Apf^S9I#fxy05Ft;*=a~HMH<2a= zR)=xkL*^^UzlJZAc8XhfYXXbz&JIrKi_GI7qv;JhoIlTv+?Y9Vz0ke+#ql05I4vhk|BZj81jZpaf7_! zZrpIQmZ_2%kGV=x9)^kVl0!ecNUxlM5;7W+q^x2-LZ3==;QjBVd~)azyUIAJ;@}Cj z1*b3ywaEm7o9Z8&0ZL4?^2v?Qmukfg1X(L?Ajpg2278B2tR-bI5&%Tx;G_5 z!KvTo=Oo*dRp&zhr|%sXe#rZISdDoIp9>t-^R6Et2NKT(=7}3n|3ut?`Z3%@G~AfY zBy2KXd`~I}T+O7^j0qWPRQ@Xd35rl%Jmx!-T=A92JC*P zvFk@|W`ms?mWyX)5Mn{c$N3hytt@c0>OU6$`ZlhHMY8cnd_Nx;#=Q?Y^nr*9$b0_^2Sp1$xG zEC$0|^6}KU;yETCPd$c*LV&@%8^jY$dhI}YH=uc`l8$}+(v+S{=`_d$k?xBFP3OTT z!6(;D* zs+M0kat$^N^$;i zh&?&fWaQKz#H9{lNvOh;)<|4MDNnOC@{f$3eMU4-e6L6}Om#x&8n7?hmb z2ft@ekgB{7tb24UFb(F#vOmpOci?Vq3`u(&{3c%Kmjwca)4B?V&XyE{TeZeGVJUia z&n0v|^rf(E*D=oP!|$6AH4Hjgrmw*^y{W|g8E|3iU?3K}0$?pqQ%dlQsPED^$k1HA z!`ME_17)Z0EqH$L&7TnQ;7M@MJf{ItM`r793eL$|9a``~tkHUgM9KT(TjQxwEBetifKF)3p~U@;$ULe6Yz03c%; zq{flF1;f{XE>A%2!q>cgBwk55k0Ijn$UJ{ns%<`klsJ9z4m=&xjORv3*~xPP$&XTiOCvyJg=psr)b(Rs4<*X#r%CiVB@#!0 z5Ec4lNV|73K7i>e9A*iQj4}l~*#1Lw6J~ncX}r*6-d=Rji2H$$4*C+EgLAA5JYcbn zIt`*ugAltIq`GJkh^TS-AzA^O_J8KCh-bVfJcC^!y@JkycCax_!ehY;hL4u)c4?MZ z=6wn>u!XX!1ICq1ARD{IXjf^_bvVKhybAnef75g?@{8x#@sF5^)7X62I}f`EddFIL z3Wy#166xhXhS{ARB?*?vx_R%AaVdWB|MS&G;zD@1f#@{ZQRoWcIz3SiStS~W&n1Uc zBZu$C3GR{p3$BWCkQ)=|7SKYJW;fyQMN%nx3}=%Ua0_JK$1o700}Kz*=k+S-8)3)X zk4RT3{RE0^M6cf?it}(X4}Fpv92sE(($EY2!oHviogjh}Rr4?!7oCBPgQ?XbHdQr=dK3nZ|d2>9WYgwv{z zixZ+@uX()}SO*zP2|_hTdiPk^Np>5vDnQXTK-xfIRE zsDWu_y!LQ_8oY_--(i@1g?8V~u`3qdd=_Ta+u&9FmOxU>_;rX*GXfY->lMGPq~rfR zO847y6bmlGaK&`p;$5=d%q>6SZ)SNrrtxi@%JY@(ZFBM!OHk?V6g+ka@&d<|(<_f% zLd0yvT!{B@I`eR!w->U03sP_3x>*PYc|XBl*sgScLYZ+$;ZryhB*!e${V9aPJ*FA3 zMx*ZF9F$-uOOFsvkO1KpfTTVT;v`dR@3-gsCiw!4JP&;pDRlYLTvIHe%<$X*@af0|!_>05;gM8m7T?a34 z1cpwsOXOg!TH~NQG+)H z!Nol6PCL`_)hlqG39AxEU`E&xSdjEQFfpp+pnz_Hp^Mf2Yiyl>Is?Nx?B0K!;<=go z+nx%1_wy9uyT2zF-^ref@txv18{Y$z_P0(GqhkJf@Od$;q4R%TKwHsF5XjGYAAN;! zJWjxHzS!HHs^9*%R}gF7!1LTRi9Ika?A?2cD^PS7Q+e|lIJde>S@{OK(uGJgPOb+E zl8!lYzEbWg2bgp9OoSCNSN{woI9In|Iq138+nel}j6;T=AMi+3`BS^8v`E*_{+-5?0ERafP=m@9zGuM!^+B3 z4bBiaPB0g`P;`33L|}cRtlY=8E5Rea)m0YE2I1>RutH(76=v)Xo zz_~AqGY~kC_s%HJ8Nk`K^d^mlu=Ua!=!o|cU!qW}Z@}23bFR3Cj>wiSf6BCrBbyw1 zpo@5!05u}JZ_`fRu9w>vSFIG8=+hUlK9F@F9dr86B`jFRD@FoeC@{R(a}oLyZ%y)r z2*dl^VnL=Y#JVvD-kkwTqd@^Pm{^FJEmr}A8ItoTR$of`JJ<@uA0h_3_b@C<&M+HHJ!_~8e~_a?+A;xOop+M z+47p;hD6NFlx9~ILhnY>9BK=mNlXMt?(<^{is=LsO&sbo(}%{Q%nbg;Lwqp>i2zo_ z^N{TkrIur0-ch`^^f5!+SD;w(CEigfK8~#Lbx4BgJ=DZ!q3Q3Vgsc@ddml&bVD({A zBBcDmKex+dfVmrF81d>z7#O5%$RUFwt-uVL&a<%Q8o6W`K7}ZVx!WN?2~v}il(kwT zH{m54ISJyXlwasN5&J>%BM@0I;!fGRlo=V5$k6L}ps5sPwE!->qd3J*6z&J$OP;>O zjm%KMjamA&zz7~`lcEC;)Uz%EEYjrwa1I2G;APYh!w)B=OPXhkCmlsO6)W9o+5P&UPyJNyeEM5smgYPS^=+{^v$O2rT!Jvk&PXy6`j7ZnL#=tYMT{!4Ou z85-zTis$w_FZH2+QM-I2w`XIjGFYYU!7@yBP-FQxjxU4b2PxN(4fb2{ic&8s`42et z;2M1VcI>WV(+4tSJ$8}63HAcU9o9}D%u;3EWLi}q0=iUzzn+)o zd&<;S_5G8#)GfM$EH|Zt+iru7XA&upbt)*(%Z3VO2ZR4Wowkdd?!$XPp?$9z8ILFh zWBkI}-+mBb%;UJik`cyggz>}L*0siXCK;b68NUGv``aU)yjkNbySDmM+QV{?_SKYz zta(wU@9Rvpe=uQ?@1N?aVM~X@3uyJ^kz^94aN+HpGdviK-?7={ed;2(Yt8I zch@vK@>Mzd29zXJx{F5q77|ZmWgsgA3ZZpaHt8a}{Fc#zNy;6l(i~#9q@?1dy$Jm_ zt)H}iY)qHjO5$fp;>{#J8^kf&?na-ve6PC#!^cGF?gbuuTK4#>F3_jY!S`+j5i{-} z;VLVLoX&+Eg4ns3``=SmuEG+IISdl0&=)v6=NGK)PiF_(K56@c0UG)rHd}A5O{9v%+4F0Y&@dnyp&%4TQ-jHu!aoqd}H=ZRnHS1x9kiC5kRkFHQ*r zt0gS-&ppuxP^-6x!@;$vKy03W-t+w_0N)r1o%JP>kjUG|RUP7|g29_|GKyXs`$9JV z{q}G013ba}|7HERw|qbSLH~yS`ULIqLq*&l$o&w9Qp5W=xu1WGziGpFfj2?xlb@3o zIB9{C7C32vlNLB>fs+8w8iCbK)){kL zE^9-5b)CoEXtK?6FR5;-uCJSDwVBGwmbe>PC@aH#Wqk#%nhD&EjrEPDGFd9qN)&ojYn@li)sjjJ^!P8_~>aJe2*aK1~+$@1Ovc-4iI8zHMh51a?OUoPU=tG)NvR~3OteH(7{J#65=2~|h z{t1ni3~NPs-AIr1I=8i=z79Hh+?7^Oy|t>QzT6Yv{(sP1=P$ece?UN!UwX-j?fsIFUN%`(zjD1CFJwZ6)#Syf)>FH^@(gQGT<*U5i8AmVosxyIL3 z8pM*0pGYjK7Q+E{xunt99`2B+v8Gde`w2!>(&cDNM4~VLm&LSqS0!qzn>3z(X6(RY zzm)%5=Z%ivh#fOy4Jl&5zmug;KZ!M{j3$W)X};DM9g1^5Ty~bUa zE#KjmrvcFdiQ+m_l@&}AP*EWd2QNF0Wx(+Jar#P+J)My>oGNMKN15KXApru0* zKExDF`os`sNldTse@1Vby~ysGXgxv9CTnxu4R!TP>#T0{O1YRLDM4cVnre>+no9Ih zLZ3>v2ZlhntgNoW%)+TuR@b?knylp>Yh!brr@Gb+x`u2dnvCdvg1}i_+rSy#B&Xr( zx@zPrHPtt{b;+flTGO?DjKYEe7&fQo}L6=s;C91|Z zEVHI-{V;KS#+ZTAn(Hb&$YPo%4zy}PJsoq-C>fteAmWQvZLtl?y6DJrAE=DVWRu7((?`@)nnv-7d6*6H^o(qs2mMXSybn) zG}WU|M=x!J?|_mnZ)1Hk%5J8o)fFCOoFkg7qe0S&Y!&{o1QUMwbv16&$PpDIN1L=( zCQyZ^Ky-H<(_3q8GX^!X!>Z~QnHfSz?H^t9P+J`M5}!ovjOgPqLqMZScNOHSg!`do zbDg`TK@KKiOKTIHf1KpI$0FgdI$$ zjOd66SK}^+W4LRi05L8>bbY>Nyo$y&D6^`P3@nV63F<9b$VSOgY#>MF>)kk zZ=gs2)<#loL%F9KKF={o@P8ubaty_q@(TCzit>uZ`ag~}N*kafM>Jtx71N?_wP*?~ zBu1FRWC8wlqunjlO)(?1+~aAi#y?=lc|y}z(i&4SQSTG3Ehoa-b?FTmxg&0>oQ%I* zIY#J`HT4+r9MGVIyGHko&DD)=bZ~WD1sti#Eyk1XMBp<@m;yapU%`pNgon4{qhF)* z4BJC;tnrfdhV`h`Hma|-PkNmBKxdZTu)tpAnB}y)tOfQG>lBC8Zk_EYa88{$BY)1+qM5TuJdaE$v+s&;CU(5=%|!DR zu2W}U5&rnSG0$CgN7j}-*X2Dv;PNZN;qa}L-|%TQ+?!C(PaIAUY4elUiZ2|*Hkoi_ zMO;m$wY}F4$^&HW(e8DVzgYaioqzj(+WQvxsH$uIedgp0LlOp(@QMgViFP ztF+o{&Hr0_uXWDOWCq*nef)oy^P4k!t#7Zj_S$Pd&Y5%0?DN)3=R3pPX$eOuJczB{ z`VbcC0=;*=d3J99CEeXez(0cYC8URuzJ+vcB_1&gL9VL1dlS;58@ju1Mmn^nyZa#0 zwejw5dJ)UsTF6uW#_sM@@hHVxo4UJc74AniLmufSydj_r&vU$TIbQvSG;&3E_oGOs zB0Y-qDAH^XDV||yq7;t}{toE^JffM6O6^BF3TXt-kS<61$c^3I2aq1Ut-E`AAIRN_ za*%F9+KF^O(k`TH_jPwqjle&oYmq*JvubIuz;DU!eX-*CM?Z>2{=@NcSRr6zL;Kk0L#a^i8C1AsxVT-ay2gHfP652M_ z_9JLZxU4tAny^0&te=6@0;JbsKMZU)%2l(X18xb;iVnTmof9p%KBGK3Znrl-THKNu z9XC5#P#zr$fmzYW+^j7?=0yu;3o^s91(HpVv!M+!JXZSmgV}j7I}2v#!0b|(oddITVD@5|sezkM!{>sn-QBdhtLaBeslKQk_oF${ z;?P%6U-T@$zH_odcO*fJvfMElNmx1lVL{sf?2|EPOuYA-^t<&@ z>i5)kHOO0wyxTeN`p|;t(B0I(Lvu5uL+9weS&>x}9lAi1m5|#Doo_+sb<)xCU(_@H zsLS=?aua{uic=T#3gXY7x;L~m+KGLCXi4;7NTYvrQa0d%EO$l-@=GAU4Dt(E9z{{ywr42y($(GFmx5M^ zKviZmvM4Kt@A52~Q}!Z%^3Lw=HI%<9ihpiIBjZ3G1bzkZ)r6zBUmu#ovBV6)p+xo6 zT4etWvIimiSspVyuLS)8^GfK+=+wEX$hrn zhV7}C|1)-VcMtQ&hmPIcp5sHut^zf8pGY00xmnAikAyCYcAm1Wx4!Z7np){=qb?W0oF^0a3 zzh+7wr*s0aE@1c@Hnmy7Dzw&utW~<7Cjc!*{xRh5=ka$d&Es}|3VcA%$p~#v>B9W1 z(3{b{85c%7Gv-G3W3oAzu>{iYa5uWM&y}RN8wBFDhpI|`eGBCc#o7kq*9zU2j9=83 zUPAs<QFdBcSE2NKULop`4wYR&wiWCyj0X3*)0mx$Dr+%Wl z``3i);|onHOU?0RPL|fCx81)2nHNch?A{rTke~Iy4`Qj5Hp0>8w`xC|bo|IqI!73A zS9kXVluvr~(FnEeeZcnvuQ?Blo(n4cxGwPLVx9|*gx#Eyl!4V#7}fht*gO0aj)$(p za_s}<4Zx)Jbeg;g$UBlIZvpb2OOscFyrXIIb|UX*De|Zf-i^Ft$is>bC%2OkI2nPH z5jYuvlMy%>fs+w98G(}#I2nPH5jYuv|KSL9(Vw8PHE~LpT4<}pZ)@6w-2WaM-HvA-IE{(Vdvek$ti6i#2^e7Sxh`N!YwZX}UP`pu6G zmreAxmkVMyR2Qy|(Z-j_)mxmwmjU%PKgwq@rT#{oQfyWoHLSiKKqP*0>um_9oo5(A z@Cf}c7@PPh{@`-G-srbEZIT*JssF?!AEG7B?=rt>kdeUEJ)JLpV(9|S@1YA0*xqLT z9K(L#->-2yBpW`5E{tNE$LShQYdPJ<>Ghn_ideLLmea3tYS5G4CnNB`H3Bj+Q~Q_V ziL1;Do2#0d;?4AkLqTPwk*KUJ%FJ9|)r^PZ@vwbMW}&}jZZ9~GAGgpC*Jfs}j3-)~ z8+@5eE(6a@$W!ZqFFH>i_@d{%QkDL`3x|g($|f&TJeii{fsuGWE^rwseMt4ZT#^Gu znN2+is9X3UwVKz)$(%oCwLL{FR*mY7F^#*M8V zJKj92w}Jjv)8aoGo{0xYd#aS4P-QCDb9`pJ*4HyGnP*UaP?!Jr8lwkSdupE8^QmW2 z&`XNphJM=B*Y#b&)BMRG{Y@tcGtb5PAcZk=Sz;6B!jw~=nFBL*gWF0I3gi(iJkwfG zFehGHg+Dr-S71MBtF=ms{~k5#VO;96J+^b7FzgIY=Wx1!(`B5ta=M1ob(~gm8t1g0 z(-uzKINizV^_+?mxBP?r)+G7&;vFgIJ<>f%c5&XRw@P~X_WRiGOk?+bnEXGjD!+IB zPY2MqUdI1_a;-XnJ}9mXuLq&6(=q+KxJ$Dq=Mxi#5B{4k zOcrpw3r@!SgO9Ogv1_tnI{Aun|C8~yqVvI%JMmT!+6p+{hCBKF-xUEfi}x<=@b?Wi zE-9;cSx?}|X69>q;+08qJ##H?okgD{)%@AB&np-=f9Yy0#Zp{UT2#zPb#r4&3;xkp zU$}IBK}k{Rq@v=Y$&=45tSX*dQ#`(4N)Z4x0Rc2O;LL5bV_Qu`6J@C*YviBAJw+p5 z`H+$OL27aJI3($zW5_$p&~u`p>p;^j%Ty(WGBTckH=#(zaY(pD_zGosD~K+~SB8Uo za!%+?h`e?gcx?IsU!>06XW{mohbxf~(6Txk|Dd`;>ku>x`}x>CT#SSiS-%$h71+c5 z;hRzXE!dX{qE`zWXgo4UV-KI@OKk*IjlIt(ZJr8u+f_J%3v^JLtJz36f>n1+L2mni za36YkofF!iGlz!z(2YzdbhTy+!uqzR2#*W*p*H{sTO95~@6Zr-YPb)byK+U_yHvPu zCh_;>jX{&J2 zm2;-km#`a9@K)^o;&J8NA0a4X)mw#S(Vv2HKCg{s(Es52pO2ahpsy?7#SZM*uaNDZ zI9a501iuc$ z_8TwHUI;gxA3K@lP@03-m0};bh+KL&hp?;BKSyKF*{qx|4`=~wx^d>l0)Z_{m%?ufaGxg1#L*MU5GiN96jR{ zXSLg25I)6O<+cw+vLe)?RQ`>Y)MZ90x4o(oyXPcZ5emDWm<7Hec&8 zOX~}Nw^sihfk)rgS}Q_V!iR|#{&NdoX5q&zywSq@;rb!fh3q`ZfBL)$VI8gU)f$iQ zGUXCJ!@|G4JHS_4_^H<#yae(M2B+Sj^5a&<4R*#}&bSSItHZMNjD>&A!UtYwN;nMp zBetRSR>rG##$L{-K|gaaV$qtqZqHbFzJ>pd@%tcOV&TQto018yu<$y@DMnQm{vF0C z7CQ`XV(~U-P?c}96wbOK2?To*21_gDEW$CP&ObLWHSolSZQ}C|0@LMc=pM^ipI0f~q7C!jH z#y-X3hXyyE&gTrO+RK*0UdE|vbZVf-GWEz`TN(Lw#wi~$MNrWtCPVj^^%h=X;rB33 zRj#t|=PbO=?@7zj_bmKH3xAh!ip3iiUVMuwneeQ> zLGxe6IK^m`!Hq{llF<4>GHbzW^*8ud|A0^wUMd=2ANgX=8(MhpLxg}=EcXoIg< z`0;jwZ@|p_jD`2T&ES^;|BH`f?(OTI`mD*qROc*J!*Wg!A->e!^&v1GfvU}7{!1`jBl_kEwS(p3%`SLYLiE7 zLqE4Np0zUu-C-(9v47RFw7|lhtf19*GEQxhZ{c6D@DdAum2rv%{*~;{qYFM}%B5Ir zFt~}u<(xrP-eDspOy8hQ7ubRJAuPg;yCT zkFv9aDiq&o3LuY08{AZ317}c7=@dYrN}Z$Ws^Vf=dFdwd){ zEp!EJu5c!+{PS6aI_7>~MCI@Kq%lcB>0*4FQo|12W$;@epMUP%fzYo4q5PW}rwF}k za8t2wSs6q6>57?*W1K-DnrJdYC@$amlqrGm`4)aI;}p6|+t5}kqs`8^lQSr$?UtoS zEc|{8e~xjA^%E9;+`?b5@SJ@?EMB+p#f(!dGNV?Nt2u+JHqvBJm51HMI7N8a*&RW+ zhdpOA6`fYjS8QhVJyy;xn|aA*D((%$@_)78Fw}#-7&w#vHsdtIz2M_|hC61>aLdqA z_Zth;kzV&D)v(!&>ke~(84AXb{#G#ZK5w)?3GGQbqbl5fxb4pwMJj&==Y0lw%Ovk$ z+n*z6t6`6Go(|TI2do<1!whxcU3O8&IfJ^+U3SLc14f;C$ipT>_rX%e$L}ce8(=}2b@7IJ`lgMXjpGUCqMlQreN}@(BNiNOy>;pXs)GjE#uT$>lvr< zzL#-ots8t?x7IYPwPvdPPL`zB>hL91{;w>{U$gMPGEOtei#`s^dI0zY) zW2)DJO5&Hu(H-D!8k=@u8-?zobqfCjS`iAk7aqi zFRAjsWm#^u@S~RHP9N8nmj{+Zkuz2PD=bQZe$o~VT`h;q*I0z=^`bAL^79@Fy2Tq7 zK9+H+*KiDR8unMwxajNltkBwL>Gl>S*r^}lD0OJ;QAxYS)*WOk+$;rQMkm0eRO}iWV9rtFU#o5 zWLdQkS{~9Db#h1J1PS|SeW7Qm0W;`I&zN7qFqPbZ>{{%@UgZ+?%s=!pQ!X*;v~5(z zx=`5T8qtU^Kq>1?g>ca?7Sb1RblooDx^01$sT;j-%c&0?X5h7iG5%|lpl&p?Q{C#d z!T*3eN3oBkNNqLNGU(FQn87eaCNCO;qRUM==&Z8i`?0lW= z%H?Ohk_Bu#cW2{LmbUw{?ryKb#4oUq#s74ix1C(d9zg4k(fVVw4jHXSHns`Z&)#-M zoQlk$wAdIeI!23+(IRBD7#S@}HnwRJ37x4eV70MFvFaGDKK2b-g>39rZGNcEq@~Pg zNi$m7jFvPTyH%SXrOng2Wwd@7tz$;(nbEptMo614))r_1Gg`=u7Br*G(f3l_GDH2T zSu$v8vn)iezv&KjV=>OKXKhC@1588y2K-MoRtIooNM9R#Vw_TsVINb%(Hk)yYhnQy z2RD`TXJ_zqGEXbE4cpKR5}R(?{Vf4w1|wBvJPq&+!%q-Ctj?q%M4k8;cL=>22n;xP zKLx3?+K~Mz)ZOqxY#&M4!d$7fY=j;>#x^*LnEMF}&p zPk4yxr(OC6D7Zw*#V7@HjF$Waq;AJPk-%aSFDA+SE7>@CGaqJsZ$51gc$_idXsQy} zL#p&A==ZdjehxhCrL=OE-nRm#y|fJNMtjL7d|iS)q)Hw|#zWXcYEpgUMpbL9?M5c; zrK^xdyBZHJLuKMyZsA;sFk~Yq`R32Oez0~Q1f8=7L!{tg$Y6__1d;j-DEE(AfM)*R zBLXjD&&Y(s&QyK(;wIppzI!nx?`xo~yBFaiHt4?LtnTBiwz5=&PBr_g%m@{cMNGE2 zaTGd2#T9npTd{gBNZOpc^HHwb2d+AWM9xHOoQu65hKL6CfVmlaG@Dg_gMgr9IIxOJ zFn6oorV>WK3p2;~covj!IhF8DDq%F0@Ix4Tic8QyK?x30*rUH=RXV2mC4?R(&Ec2e zyQ`P!=gIURwE&rp!OA-9z;1g?oUTR zeK0KPPxFvIu8!|d$NWD~e>uHBO#u4*A-_Kzp!BgSr#~H2^x>tia&nx}(Y&l#S#ES# zG{?#9GhhhD#3+@Obv__?H%3+Dp~n|FGxOc(d0Er48njs1&^u@4JIL`o#(eJli1R>V>P+xHa5$e#<_WHNIy8#ot6XXb|>lLd%M@d)B_vRTZ=`mtOV z$(@>sz}dD4=sy`1nvAJxfFamej;+X8E@P$uc#&rtBew?j08I4 zsvr3@v9yoW7_w z>73@bm)8)j$ScSquz=(4QH!3=UTHURfrGp@fjOh6E_DjOwMPXeI7p-I>QZIKh$R*n zYZpWUR)Ghszh3R!er2-QAh-ZvS>IoRu5U5wGQ2XVwSTS z{jZoZap)*gGxMkCH$+Y6!Vw|>a1Dc*h~%aj34Sb+`@L)RY18l-$^F>l(CCIY{WxqI z_G7d1Z>Q$$V>NALkVB2s7qH6gj{!)nlx2orb}%4udoF3bMWwT#a|czVAqh*f5LQ=} z(`?}UXS5%_^;343TAUQ?3d^6hig1G)6Xu52y81+6UBmfM$JRF_C!y}IUB?~cc$o{~ z&4`4T>26p!5#+F4Amh706|8l?e)T?g+(Iw2(^D;8W-Gv)+Q?&DFT2po+~%nT?G;|; zwVtY3hs=vSbzb=J^Si>K(Rp5GQ_ce|})P)}nPX~1!N?GG&F7ed-YoCMYwa-2JTx8pK7Hb7OmEmlmukcIy z+ugcHr-`tezh|J=7u9I>`c`=TiaoX4>vxTZpL4DIR)lwjBirX)@0R>2?1V2_MwDO8v@Ei^w5#kmhS2bP74!fvMHZY!GWJUS8xDPb~@W0W?3H05mfRI*f)6zW@-bmub1bd1_|(5EKZSsiDYL zqKsW#EZp#-Yr_#zo)Jb+W(?fuMW=bH-OE|ysYR{A)VwdI!^^1&qg})8+F;J7JheD} zA~GHbyeD}fWXb*>*dOFY$9rmp7j@g#YQW8P+{^a4eGj|a7hbsWidpWC=^gI2T^m>a z%Ig=I@2NM|czLa1ip)Cro)^yXa@K{P2Yb;pH@ntN z9Ds#&#=>oG0;NaJp9W~Rm(xj`o7fjV9FB})+Ec%#+%Ir0X2?)R$lbP&l4)KJC2<3; z^ZF4N!Px2uN1pd`!jbuCdoSl};Ybnrp)0l#uH>M5Qmx$~&IQlRZJX;2{4_?x8gHPu zJ>44!w{zEpBRJe>zZ1sqR&gU2ZYF!~5g0y91rMh95RYO`YJtVWb|8{3(1}I5ZnG2o#HQ_l4boPB=6%m(cTaYeRE#4^hq;xrcr5c>yQp z?mEFx0NOcWVZ3chH`p{%Q;!6r<0AxTp<2(NG09qf4OW9Tg5>)vvA>}jPQ)t0J9 z<*f_)lT8vg-#UJ^I~flohUEp zMBiKIomT6qT`jM5dZ%sl)HLt32o8m?@6>wzsTj8!-Q7JMO|t?4ayPxCgHKI_#ziBC zkNOSRv&(Qt0mwayyUg>{wdNv@y30_^iE($BRt;BD`+>#ON^NmUzy=MZ+l4fBb8N-= zC7x9ra;RZ*UrTLL!S{=2jQBAOHaDQmkehrQhMP@o%)V4`zd*7nrH`nRIz zsf&WvDWnk|qmv-jNl8Bc8vho*cLpPK(AOH~VGkk~e!fpA4g`hFc?pAQ|~%-H#tL)#%UEAM37u3_`}@x#Tix zKtAA@K9IU{_*VVBmc9|$useR=Z@+-!-ZkrD2)f&bfN!A#d2VP8W=V{kvRpJr=y)iH z`cWY@{*T@uA%N-?PX$& zT{CmOPTRdfk-YHX2-Pigeje-$f;BqDS@)07)W|p?(aLlNWGgf7segtD?}GQ);lbXZ zU*b$F8xwmTkvQmt*ZtkZT1fw^H;5wtOD~&}8PN5zPw@SK&V3-f@DR?Ahj?lu9a7Lk z2fLrXIy4?r@K|*7ak;g%VfQjj7Nc_)hV#5^RQ)NhAM$Yc4L={coQ_EYkX?$S(Z#uI zamswz+Sb?GLuGlN!nr_R9EU-Kd|@pbYCUXDpcZ$ZP>!B0-Ezm>9;qcb?4IxJzNXd7 zZ7?~rbxx=hqXZ?)#pH#tGh?j)Kf&X|Yx3MXuL@lOtBawYdC1NFliL(QhgzKbeAvC! zfeuvPxJnBEk5UfO0i0s$n+zV2bN}i%I@G&fIxt<2<|nUmLg(c~W`wrpg=Xf3mgR** zGf_y5;~sMkxrw#h5!Qw>@tf((`1RxJMYwzYilX00H4|H!tBdef*VgTY+ozrrJ7;p? zq@pPk>6I<=i>i>`Ja(B`^`*u9yrLgea!F_~PT>ovvo8u4gkOH&j8higQv|=wQVr$} zsuMRgZi!FCtKX`dc1&E}+_%r(d8rC#x#1y3EX;_;SEsyVTtt_1})$MJH$M9eG#qv-8X#zDyOJ7Uet zVEGNRzJggbN9~9ws^tB#fh#QuQ#4*b)IjCq8GQU_p$(+u>A!gD4U6mBdiTsA35p|+v1uqBT7Jk=Cpp%AS6 zLoe=y%yPW>rV#H;Yi_KsFRX8DY{JXS@Y*nX%~4BTb)k9VT}vTe=(MR|VrxtD#QM4o z6E{{@PvkDxR9$Gg{9iRPac6QN&S-&#ZFo0{YJX|K5%TAdkRW+J^VxNsZZOxD;; zb)&W^!ux|`Es3h?OVL7?#^}{X3ja=k$Esy(soj$JCr1+`;p|3!L$4opvs8{s#9I*IvaX3y$`r|6R9}fiKLq9;w@XZ@^UjVwY{pkni>DK!4TM_YN^jQ zz?f>Fj%^lkQRbDxzK?PJ#^s`NqiBYWcVAie+=2y!&f)eSC+ckc+(eYU!w2hd)gf$?n6Lm@-lZI5Q zPbbO@mZ9iz7(@5`7VVL~c0vhlX&-4zsZF-T!XlOksjW)rzxh_LRziO|VmyFP__Kg; zQkJXUa8~qm(Qr}>{Tqe0kZM*!i!w~!c;af_?rU#XLR;Ezomjit*KSini#9pF&bVfO zKQ`5HRp**CtoG?!rnb!AL%)kVy|fkKt}kt5htku|q;EVN!D&PtA6j%gr|8rULB?~A zqc;6zf)QR-XwtAco_F?NiaPFL{*3@1MmVl0>un~dkRL(#Ugqx&@F9fv!Hq=PhI1cwax+7^nEo@2 z+?kwe&_MS0t2`K*d5mY%0Fb`~@l&I={NF>5n{1>$%&DX5g}jxaTy^}^qTCjRZZdda z;W$SP&g+o8I|DT#?>>Q=ks)FkgqftrwCJ%O6!eIrm4^2rmZN#6GZH6ed| z0yW8dIZzvZwh8V?PE$ov^1gkJkwpVs&$mkM;S|vQOgPc5anl>2pCP8gYdAt!U} zcWgOfWVVHz%#Jb@06L$i2$?V`whMVWkmI#(7ddFl@w!LAlP3wXBJ-`x7TSt1GAWSY zvNF?z7jsIOObjyRQY#p#|C#SN&k!xvOmPj<`z?(A07=`=Ei8+V2)A-d_4^yoB(2#- zo-mnAs;L4IL5Th$Yf6@;&1X9GhrX+`S7fJDLM z_`kT;%X}?UHR%fN6`J~LU12I1bkzDUF!_T(&gl@QpvWjgPDuHcrf1iCicP-!hv`-y!|cNJZXYY{5c&r`R?;E#3qDrb zA@tdN+Cb%A#I&4B5H`KQ_$6l)gr%zc{)j=J;FM-}p`YaQW>+;kDV1^UppQ`xCgb9c zhZ&Oz7>Bl37&^`=pj6KMeVClq5ASQ_akeMq=?uZ+t2%_4?8~he@;o0}CFJ?OYT~L6 zVOIEZ>xI0~hgJ!Bv8^ghgDpe*F=!CCerZE_t%W+Euxak(*W zf4{#v+m`S?YQ4#?AxG5+Ieogxf)59F2y+92kQ4GNwwy3(hEax`kk)0I13QFi4djHp zfgxS4Fh2_9gnY@C6K3N1ez`)HGoR8~)7CIZsy1Vf3Zn-3&Inn=kak9xNr9Y@8*MpZ>V3Jmke|2Zg!!T`S0&_|wwy3;2XaE5 zG1$1Q{S#&!gJ?`4W44?yHG!Ov_u6v8d@hg^@=aS#n70EtAtw&8{1av}gYZwti)}e! zDg!woZ?)xwxg(Gh@-bUZm~RGhLdx68bo{)b#@R)jYEYQv48mz4udwBWxh9Yk@)=uB zm>&glLJrHff+b7=gD6+XN?R_@%%^Q|KQqtUpfE2o2#Z4YJ;f?nm?(pg6LO_3C(MO` zoRFWe<%HQ6$O-whEho&gft--twwy2-!;I7LPsm9O>6Q~_Y9J?M+?Eq&b08<=0b5R( zF9mW!9=GL$`D-92qwVBWgV!foCpl$O-wBEhmip0z$b$$}b=p$ji!1@Gj<5aD(>z{^7ZX ze~HsPg=b3MEYgdmj=)Jd?!J%gkW9G_7*cx*dYTD1`nNG{5znObl#D?;dc!}D^oDrg*>b(%8CijZ6oc6cb;CcUXCBYRb09{n_jj^wJZ6$Z z&)SUakkZ8Y6r~2j$%R9>cUgiAa1FJHQ;M6=amIAqgxO^Y3jMl|wJ4$gY%5D?LHaw+ z7V$Jrc7}|~i=2{sLeomov}yMY+2fnDMJ!DTJyg^+%u+c*pY9k?mm|z~86-iWZ)PX8 zpfGn^p7$)v=J>LPUnZWNk>XGFOKPu|(ywC-VxMDDoB$-`cE9NMO?F|a=*0|f;}p>n zQXI%u?VB(z_1B0Faiz_7rAkO~30*R`2%ixhf_yCy7E+uIgar}zQEm;DOJ5^8lH(fa zrK;AI3|`|`t6oT{RtV-(slGRsYZG1#b{j@q4!{&myyFd#NRKlLmNyulFKpSk&=8)mt{Ep4FO%AFQ7~GIWAMmdWy?j z`_Gnn{4{Pil$)|7DdAuL8*3+J{esI}$Oj+YMt&&%xyXr4S|*9M|Blv@vSdhN?3Qrx zD>yCYD$;^R)E#MYqmekY5KW662~CS1jXXXG<4iQyv4sM4d>|c+(rbvMOauRTnW8Dv z+jN;g;AKzG&Abx$67WF{Zeq`A8GPC>GYTp55hC>q&V8BFm1dShiL|a0l|XAejWn|! zI9l~7;AkDFfTNY60*=;-(sAt&+b&PYA9NW*&|YGD5SLL#E&fk?O%}yc^M9e&Vq0c) zG>DLQarVj-oaHMg zl+d`<%*jB!(ru zgXfEPIK}@v^d{4S$o&JUiv#LZo}+Cw7k{0pOo_Xyi+_{#l+RFm``L)0UFE4g15@E) zwTbUi*tss6BEokEdg2k)d4`P`+QnLOdcnS=ELUZ!0)D#5&T`Q*T`6%q+b2EHQgBs2 zRs668FzM1_d0naS{%YKhQ{e+t=X0s>9ChrksqkF&N=iIWy_OP3kpGs-4h5OdimYr` z4aOT{QsI2-!;&S^mHQvPaK1;-3+D^*y>PzP-3#Xn&%N;BNr+)xHKG?zwaHMgcPD3{ zWzm~^w=doOCA>JP-A`v6>xuT*rhvmgN&L7;^k!?kcYAFHPWHQ!?9fkgEN0fL-9H9A zmH+p#og-|ApXX9v)^-M|vOdO>V?18J$@0foUWVnfjK9YCZmz&DwVlCgC-(=jzYX@t z|DBT{fQ?qFr0q5A4(@v%3>#p8MzQ=e%gcKfMLq;ElJ88CpULv-9AiM_2eSO0B>6K~ zUfxqG^7@TNu)i}&zK{4nwWs~5Y`-Z<{&&E2d-3H=v9I4?1^bmr@*iS(HO<%`4xTnz zN|NjpOgH=?#*Z+5Y=*)2^Fw$a22Sxg<{81ACR^Rjco&x|mw!IXcmb`(iESqzY#!10 zU{%TOSfF#UMx)5PM*bk;Lfb2hcTxjk+p51Y){#&C6foY(_-TxHI!0dbX(G>f3(H?9 z@~}o*BjfaQLEC3sx>^2e1!qJ`HbOp!Pgo5QkH*L@LB^j^5Hy+<0bhc?^E2*hwTx-Q`L8D z8l0k-N`4099W_8L{y95hC8^}imEqpUDYM*c@8eyKw%_~svP0v8RB_UA7T;>+r&J;{gsqimDUe32{`3#&Q|Q`z}>8ar>K zkt+kEqXQ2I4`EwfZROOxtynuD>?h3XZ5-rvKe^2C^2*BMG#H9FD{jvHy>xb^C4qJYGKc|JTysebdbUgMd>%JeCyCQEBAQX89&Qj<4ZLEKVbT zk(Re>YUrEN$ak{+BW!;)s~$>Y=lL{texC+^hwUdXm!6H|U8;DVrjLWY{hyRZenA?1 zRT{i5js4rx$kX2#QuUwjrIG(-8vOM%cpr?*RB^~lgO37E{U>=j{L(b?v$TBgc&-PY z(;HS>)5zbF#{T_j@UNz^^Hdu7eVBi!Udb;+7|#9Y7@x?$$UgsD8awn7J+iZBvk{be ziC&_o@dXCohVt}Q-JEDiwAR)ZRb#EB=J>|C7FyRTu_abrkENw(0jrwE*v9(C4Om&I z28%7V#Hw1itLnxrP4)3ayasQ*PAL(?Vor6js^;dZwpbj?Lba*d=Bh36SWWAeEp1S- zxEL+>(?c|_m(DS3NWm{!Dkr9w4~qHg5NRq_6R$P7+Jw%mX>8q4ABX+MEwQGy#toZg z&82vAGZuoXu4<}_U3ytPs##Pr>DGC69B)C&5f-Itn@{dZZWks0d9vVAs^WNMq?CGQy{Gh9rHU8wLaSk6 zFSI-wJyuhds8TIe+jPZ60zs&%uWv-(FiU@7m9?g3Vz4Zj?iJOW;#dZ(s-XrQaeJ($ zZc7~Nk|FfILN)Y#2IW*G650T*r4`%Ayon)J#4|+la!|3@yp`ok=EmkOofC_pQ)3CX z*xUsSE|{}Y=~19!^A|6hRlYd3Y~H*J=B|pZDxbA@E{U&NGTT?JX=#jYg1hx`6`Qke zY59_h*-8%#g&wrMI##iz2{lDuLLbJ`b#S<>Z2sbkS+irMcuW1+M#^-r*ah)~>0vDm zO<3YAQJX?Ewx+7SHE!%-G#WWtHZ72yR5Tf8m&CWk<~7IRR&3*z#s*qntvP|(%KBBN zqr@ONyQ&E*-Nj?8+M42ES2xsEH`c_V+_>cev(#F!+?cFihtlRPTe)gw`O?@FssqN# z(nb{7hzY|~oUE~%G@f+-E?>E_d|j-3d4-~N*aD9+nwPiDsjE)J=EoBiiTIWa>k^w- zd3oD1-K%0tk;iauxHekxN3@)p#Zf$Ok*HHDW+MSE?P!{!2t1k0O zgV4{WUawG8eZ0X^ME}svrF3n1TY2-w*z&68miVexOzPzgHH+eHSa=aLiZn8>_|~KH zkXyD58ML}x;DL$my!uAeRd1D9(;&dCQu{x|-#f8LAu6`7q42c^FyJ zSVMgs{fzn>fD7VVTjLGY8ltWTi2BA#tRsjO6Txwl&5t+4o9n8fSWYvJ>EtV08xokJ zxU2SFaI(jud_6+9yp5t9t7y5Pbwk1oJPqjBFK?UGhJ_66A!xi>N}ZZQ=^vBW-Ffju zH5MV1jj ze4D*`e0htGT=G(nL9d``i;clS5@usK8e@8Ch=XlKqxGm}Dbm^S0<_XZqpH96;>#X zZ@^lZK``_*zP!yGO8AIk`Y~61c742xx+Hh**>Ers$5Gi@1X7}e5+tZt+EgE9de3bw z2~3C0J)?(a%V7P>uT#i2&TFV=0#86dq zC}~o%hc#K3fsJ_3>8ClsV^zMEwk?UO4M-EsCfy`dLt`Rdgyl+$^xBbySf^8So2szb zYf(*G12j#FVXbp8JJLBv4-Q9{+0x@!1DXHZ2OT3S>Q&f9S&1k*L~4Xqm?S=F!+ zC;80QHPki=UA19Db9|d{SgSQIG~yv7oq@3~TjF08|8zok9&t$l*P6{H_q`<@#keGL zT~PQU5P$COZWR4WCj6AI58*Pg-thCP$40lI=vIyB%YAf7kK%VMZB#Cq5`F&vmns8B zwnbm=w@dn#{O*DbZS0O=@J&C@x-I|ZzPzMAVoC8|%8`_=U%YGS%l&&vJ6WInCmZ5F z!}v40shil7`}~qhJ*0fmm-;ub{wy{q&jUz$lyTC>-3q^a(ccb?V&aFX7z}NkQva~G z=M_qfV$rUi2Bcg;Z%NXZ z=NcrH`@|xjTz|S>M)jBWQ(Y{{>9{=RIY}=6F5tGlJSQP(f-S^}i2Y>U*Lu&vCrQ`U5zy zQg10&;z-R)^%s5rd5_-%q|MJTtmsSn9N-@MngjTnkuOeq^rOJQ{`XHoku51ko*yaZ z=MOgdl7=Wq;_0bsD!(`h7k$1h?&p#$ZIZrX(K>^_ws85CHV9hu1pZ43jPjmg{nzAz zIx8gW)9v$Qj6@$BWzb_1m^Au1Y4kre&gj3JGys#!qUQ?;OOD@N=NQR;xNl=`qAw{G zBeX5If0{u*G08@I%T7w8U*2f+D|@QVsHWS)?=4`EAuxU9+N^0 hM5%&Zru_bNaJ4pr1^``?O{G8a79&}nq>#j_{|894Dk%T} diff --git a/tests/test_efermi.py b/tests/test_efermi.py index d789db20..2b32cf5d 100644 --- a/tests/test_efermi.py +++ b/tests/test_efermi.py @@ -4,10 +4,11 @@ """ # pylint: disable=import-error,wrong-import-order,no-name-in-module -from sssp.efermi_module import efermi - +import pytest import numpy as np +from efermi import pyefermi + def test_efermi_import(): """test efermi_module working""" @@ -53,12 +54,55 @@ def test_efermi_import(): 18.2509223, 22.09837349, 32.84238068, 35.66056113, 35.66056114 ]]) bands = bands - 18.3253 - bands = np.asfortranarray(bands) - nelectrons = 19 - nbands = 14 nkps = 8 - weight = np.ones(nkps) / nkps - smearing = 0.002721 + nelectrons = 19 + weights = np.ones(nkps) / nkps + swidth = 0.002721 + meth = 2 # fermi-dirac + + got_fl = pyefermi(bands, weights, nelectrons, swidth, meth) + assert got_fl == pytest.approx(-0.071388, 1e-4) + + +def test_pyefermi(): + """test pyefermi""" + #yapf: disable + + # a random metal (magnesium) emulation + # lattice = [-3.0179389205999998 -3.0179389205999998 0.0000000000000000; + # -5.2272235447000002 5.2272235447000002 0.0000000000000000; + # 0.0000000000000000 0.0000000000000000 -9.7736219469000005], + bands = np.array( + [[-0.08063210585291, 0.11227915155236, 0.13057816014162, 0.57672256037074], + [ 0.09509047528102, 0.09538152469111, 0.27197836572013, 0.28750689088845], + [-0.00144586520885, 0.18640677556553, 0.19603060374450, 0.24422060327989], + [ 0.05693643182609, 0.16919740718547, 0.24190245274401, 0.25674283154835], + [-0.06756541677784, 0.03381889875058, 0.23162853469956, 0.50981867707851], + [ 0.10685980948954, 0.10728887405642, 0.20784971952147, 0.20786603845828], + [ 0.01122399002894, 0.11011069317735, 0.24016826005369, 0.30770620467001], + [ 0.06925846412968, 0.16087157153058, 0.19146746736359, 0.27463770659603], + [-0.02937886574534, -0.02937886574483, 0.36206906745747, 0.36206906745749], + [ 0.13314087354890, 0.13314087354890, 0.15834732772541, 0.15834732772541], + [ 0.04869672986772, 0.04869672986772, 0.27749728805752, 0.27749728805768], + [ 0.10585630776222, 0.10585630776223, 0.22191839818805, 0.22191839818822]] + ) + # yapf: enable + + nelectrons = 4 + weights = np.array([ + 1 / 24, 1 / 24, 1 / 12, 1 / 12, 1 / 12, 1 / 12, 1 / 6, 1 / 6, 1 / 24, + 1 / 24, 1 / 12, 1 / 12 + ]) + + # (:method, :swidth, :expected) + fermi_dirac = 2 + parameters = [ + (fermi_dirac, 0.01, 0.17251898225370), + (fermi_dirac, 0.02, 0.17020763046058), + (fermi_dirac, 0.03, 0.16865552281082), + ] + + for meth, swidth, expected_ef in parameters: + got_ef = pyefermi(bands, weights, nelectrons, swidth, meth) - res = efermi(nelectrons, nbands, smearing, nkps, weight, 0.0, bands, 2) - assert res[1] < 0.1 + assert got_ef == pytest.approx(expected_ef, 1e-3)