w_inpXML.f90 31.1 KB
Newer Older
1 2 3 4 5 6
!--------------------------------------------------------------------------------
! Copyright (c) 2016 Peter Grünberg Institut, Forschungszentrum Jülich, Germany
! This file is part of FLEUR and available as free software under the conditions
! of the MIT license as expressed in the LICENSE file in more detail.
!--------------------------------------------------------------------------------

7 8 9 10 11 12 13 14 15 16
MODULE m_winpXML

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!
!!!   XML input file generator
!!!
!!!   This subroutine is supposed to write out a file inp.xml
!!!   containing all required input data.
!!!                                         GM'16
!!!
17 18 19 20 21
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
CONTAINS
SUBROUTINE w_inpXML(&
&                   atoms,obsolete,vacuum,input,stars,sliceplot,forcetheo,banddos,&
&                   cell,sym,xcpot,noco,oneD,hybrid,kpts,div,l_gamma,&
22
&                   noel,namex,relcor,a1,a2,a3,dtild_opt,name_opt,&
23
&                   xmlElectronStates,xmlPrintCoreStates,xmlCoreOccs,&
24
&                   atomTypeSpecies,speciesRepAtomType,l_outFile,filename,&
25
&                   l_explicitIn,numSpecies,enpara)
26 27

   USE m_types
28
   USE m_juDFT
29
   USE m_constants
30
   USE m_xmlOutput
31 32

   IMPLICIT NONE
33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48

! arguments

   TYPE(t_input),INTENT(IN)   :: input
   TYPE(t_sym),INTENT(IN)     :: sym
   TYPE(t_stars),INTENT(IN)   :: stars 
   TYPE(t_atoms),INTENT(IN)   :: atoms
   TYPE(t_vacuum),INTENT(IN)   :: vacuum
   TYPE(t_obsolete),INTENT(IN) :: obsolete
   TYPE(t_kpts),INTENT(IN)     :: kpts
   TYPE(t_oneD),INTENT(IN)     :: oneD
   TYPE(t_hybrid),INTENT(IN)   :: hybrid
   TYPE(t_cell),INTENT(IN)     :: cell
   TYPE(t_banddos),INTENT(IN)  :: banddos
   TYPE(t_sliceplot),INTENT(IN):: sliceplot
   CLASS(t_xcpot),INTENT(IN)   :: xcpot
49
   TYPE(t_noco),INTENT(IN)     :: noco
50
   TYPE(t_enpara),INTENT(IN)   :: enpara
51
   CLASS(t_forcetheo),INTENT(IN):: forcetheo !nothing is done here so far....
52
   INTEGER, INTENT (IN)        :: numSpecies
53 54
   INTEGER, INTENT (IN)        :: div(3)
   INTEGER, INTENT (IN)        :: atomTypeSpecies(atoms%ntype)
55
   INTEGER, INTENT (IN)        :: speciesRepAtomType(numSpecies)
56
   LOGICAL, INTENT (IN)        :: l_gamma, l_outFile, l_explicitIn
57
   REAL,    INTENT (IN)        :: a1(3),a2(3),a3(3)
58
   REAL, INTENT (IN)     :: xmlCoreOccs(2,29,atoms%ntype)
59
   INTEGER, INTENT (IN)  :: xmlElectronStates(29,atoms%ntype)
60 61 62
   LOGICAL, INTENT (IN)  :: xmlPrintCoreStates(29,atoms%ntype)
   CHARACTER(len=3),INTENT(IN) :: noel(atoms%ntype)
   CHARACTER(len=4),INTENT(IN) :: namex
63
   CHARACTER(len=12),INTENT(IN):: relcor
64
   CHARACTER(LEN=*),INTENT(IN) :: filename
65
   REAL,INTENT(IN),OPTIONAL    :: dtild_opt
66 67 68 69 70 71 72 73
   CHARACTER(len=8),INTENT(IN),OPTIONAL:: name_opt(10)


   INTEGER :: iSpecies, fileNum
   CHARACTER(len=8) :: name(10)

!+lda+u
   REAL    u,j
Daniel Wortmann's avatar
Daniel Wortmann committed
74
   INTEGER l, i_u
75 76 77 78 79 80 81 82 83 84 85 86 87 88
   INTEGER uIndices(2,atoms%ntype)
   LOGICAL l_amf
   CHARACTER(len=3) ch_test
   NAMELIST /ldaU/ l,u,j,l_amf
!-lda+u
!+odim
   INTEGER MM,vM,m_cyl
   LOGICAL invs1,zrfs1
   INTEGER chi,rot
   LOGICAL d1,band
   NAMELIST /odim/ d1,MM,vM,m_cyl,chi,rot,invs1,zrfs1
!-odim
! ..
! ..  Local Variables
89
   REAL     ::dtild, zc, sumWeight
90 91 92 93 94 95 96 97 98 99
   INTEGER  ::nw,idsprs, n1, n2
   INTEGER ieq,i,k,na,n,ilo
   REAL s3,ah,a,hs2,rest
   LOGICAL l_hyb,l_sym,ldum
   INTEGER :: ierr
! ..
!...  Local Arrays
   CHARACTER :: helpchar(atoms%ntype)
   CHARACTER(len=  4) :: chntype
   CHARACTER(len= 41) :: chform
100
   CHARACTER(len=100) :: line
101 102 103 104

!     added for HF and hybrid functionals
   REAL                  ::  aMix,omega
   INTEGER               :: idum
105 106
   CHARACTER (len=1)     ::  check

107
   CHARACTER(len=20) :: speciesName
108 109 110 111 112
   CHARACTER(len=150) :: format
   CHARACTER(len=20) :: mixingScheme
   CHARACTER(len=10) :: loType
   CHARACTER(len=10) :: bzIntMode
   CHARACTER(len=200) :: symFilename
113
   LOGICAL :: kptGamma, l_relcor, l_explicit, l_nocoOpt
114
   INTEGER :: iAtomType, startCoreStates, endCoreStates
115
   CHARACTER(len=100) :: posString(3)
116
   CHARACTER(len=200) :: coreStatesString, valenceStatesString
117
   REAL :: tempTaual(3,atoms%nat), scpos(3)
118 119 120 121 122 123
   REAL :: a1Temp(3),a2Temp(3),a3Temp(3)
   REAL :: amatTemp(3,3), bmatTemp(3,3)

   IF (PRESENT(dtild_opt)) dtild=dtild_opt
   IF (PRESENT(name_opt)) name=name_opt

124
   l_explicit = l_explicitIn.OR.l_outFile
125
   l_nocoOpt = noco%l_noco.OR.juDFT_was_argument("-noco")
126

127 128 129 130
   symFilename = 'sym.out'
   kptGamma = l_gamma
   band = .false.
   nw=1
131 132
   IF (TRIM(ADJUSTL(namex)).EQ.'hf'.OR.TRIM(ADJUSTL(namex)).EQ.'exx'.OR.&
       TRIM(ADJUSTL(namex)).EQ.'hse'.OR.TRIM(ADJUSTL(namex)).EQ.'vhse') l_hyb = .true.
133 134 135 136 137 138 139 140 141 142 143 144 145
   l_relcor=.true.
   IF(relcor.EQ.'relativi') THEN
      l_relcor=.true.
   ELSE 
      l_relcor=.false.
   END IF

   DO i = 1, 3
      a1Temp(i) = a1(i)
      a2Temp(i) = a2(i)
      a3Temp(i) = a3(i)
   END DO

146 147 148
   fileNum = -1
   IF(l_outFile) THEN
      fileNum = getXMLOutputUnitNumber()
149
      CALL openXMLElementNoAttributes('inputData')
150 151
   ELSE
      fileNum = 5
152
      OPEN (fileNum,file=TRIM(ADJUSTL(filename)),form='formatted',status='unknown')
153
      REWIND (fileNum)
154

155
      WRITE (fileNum,'(a)') '<?xml version="1.0" encoding="UTF-8" standalone="no"?>'
156
      WRITE (fileNum,'(a)') '<fleurInput fleurInputVersion="0.30">'
157
   END IF
158 159

   IF(PRESENT(name_opt)) THEN
160 161 162
      WRITE (fileNum,'(a)') '   <comment>'
      WRITE (fileNum,'(a6,10a8)') '      ',name
      WRITE (fileNum,'(a)') '   </comment>'
163 164
   END IF

165
   WRITE (fileNum,'(a)') '   <calculationSetup>'
166 167 168

!      <cutoffs Kmax="3.60000" Gmax="11.000000" GmaxXC="9.200000" numbands="0"/>
   110 FORMAT('      <cutoffs Kmax="',f0.8,'" Gmax="',f0.8,'" GmaxXC="',f0.8,'" numbands="',i0,'"/>')
169
   WRITE (fileNum,110) input%rkmax,stars%gmaxInit,xcpot%gmaxxc,input%gw_neigd
170

171 172
!      <scfLoop itmax="9" maxIterBroyd="99" imix="Anderson" alpha="0.05" precondParam="0.0" spinf="2.00"/>
   120 FORMAT('      <scfLoop itmax="',i0,'" minDistance="',f0.8,'" maxIterBroyd="',i0,'" imix="',a,'" alpha="',f0.8,'" precondParam="',f3.1,'" spinf="',f0.8,'"/>')
173
   SELECT CASE (input%imix)
174
      CASE (1)
175
         mixingScheme='straight'
176
      CASE (3)
177
         mixingScheme='Broyden1'
178
      CASE (5)
179
         mixingScheme='Broyden2'
180
      CASE (7)
181
         mixingScheme='Anderson'
182
      CASE DEFAULT
183 184
         mixingScheme='errorUnknownMixing'
   END SELECT
185
   WRITE (fileNum,120) input%itmax,input%minDistance,input%maxiter,TRIM(mixingScheme),input%alpha,input%preconditioning_param,input%spinf
186 187

!      <coreElectrons ctail="T" frcor="F" kcrel="0"/>
188 189
   130 FORMAT('      <coreElectrons ctail="',l1,'" frcor="',l1,'" kcrel="',i0,'" coretail_lmax="',i0,'"/>')
   WRITE (fileNum,130) input%ctail,input%frcor,input%kcrel,input%coretail_lmax
190 191

!      <magnetism jspins="1" l_noco="F" l_J="F" swsp="F" lflip="F"/>
192 193
   140 FORMAT('      <magnetism jspins="',i0,'" l_noco="',l1,'" swsp="',l1,'" lflip="',l1,'"/>')
   WRITE (fileNum,140) input%jspins,noco%l_noco,input%swsp,input%lflip
194

195 196 197 198
   !      <soc theta="0.00000" phi="0.00000" l_soc="F" spav="F" off="F" soc66="F"/>
   150 FORMAT('      <soc theta="',f0.8,'" phi="',f0.8,'" l_soc="',l1,'" spav="',l1,'"/>')
   WRITE (fileNum,150) noco%theta,noco%phi,noco%l_soc,noco%l_spav

199 200 201 202
   IF (l_explicit.OR.hybrid%l_hybrid) THEN
      155 FORMAT('      <prodBasis gcutm="',f0.8,'" tolerance="',f0.8,'" ewaldlambda="',i0,'" lexp="',i0,'" bands="',i0,'"/>')
      WRITE (fileNum,155) hybrid%gcutm1,hybrid%tolerance1,hybrid%ewaldlambda,hybrid%lexp,hybrid%bands1
   END IF
203

204
   IF (l_nocoOpt.OR.l_explicit) THEN
205 206 207
160   FORMAT('      <nocoParams l_ss="',l1,'" l_mperp="',l1,'" l_constr="',l1,&
           '" mix_b="',f0.8,'">')
      WRITE (fileNum,160) noco%l_ss, noco%l_mperp, noco%l_constr, noco%mix_b
208
      162 FORMAT('         <qss>',f0.10,' ',f0.10,' ',f0.10,'</qss>')
209 210
      WRITE(fileNum,162) noco%qss(1), noco%qss(2), noco%qss(3)
      WRITE (fileNum,'(a)') '      </nocoParams>'
211 212 213 214
   END IF

   IF (oneD%odd%d1) THEN
      170 FORMAT('      <oneDParams d1="',l1,'" MM="',i0,'" vM="',i0,'" m_cyl="',i0,'" chi="',i0,'" rot="',i0,'" invs1="',l1,'" zrfs1="',l1,'"/>')
215
      WRITE (fileNum,170) oneD%odd%d1,oneD%odd%M,oneD%odd%mb,oneD%odd%m_cyl,oneD%odd%chi,oneD%odd%rot,oneD%odd%invs,oneD%odd%zrfs
216 217
   END IF

Gregor Michalicek's avatar
Gregor Michalicek committed
218 219 220
!      <expertModes gw="0"  eig66="F" lpr="0" secvar="F" />
   180 FORMAT('      <expertModes gw="',i0,'" secvar="',l1,'"/>')
   WRITE (fileNum,180) input%gw,input%secvar
221 222

!      <geometryOptimization l_f="F" xa="2.00000" thetad="330.00000" epsdisp="0.00001" epsforce="0.00001"/>
223 224
   190 FORMAT('      <geometryOptimization l_f="',l1,'" forcealpha="',f0.8,'" forcemix="',a,'" epsdisp="',f0.8,'" epsforce="',f0.8,'"/>')
   SELECT CASE (input%forcemix)
225
      CASE (0)
226
         mixingScheme='straight'
227
      CASE (1)
228
         mixingScheme='CG'
229
      CASE (2)
230 231 232 233 234
         mixingScheme='BFGS'
      CASE DEFAULT
         mixingScheme='errorUnknownMixing'
   END SELECT
   WRITE (fileNum,190) input%l_f,input%forcealpha,TRIM(mixingScheme),input%epsdisp,input%epsforce
235 236 237 238 239 240 241 242 243 244 245

   IF(input%gauss.AND.input%tria) THEN
      STOP 'Error: bz integration modes gauss AND tria selected!'
   END IF

   bzIntMode = 'hist'
   IF(input%gauss) THEN
      bzIntMode = 'gauss'
   ELSE IF(input%tria) THEN
      bzIntMode = 'tria'
   END IF
246 247

!      <ldaU l_linMix="F" mixParam="0.05" spinf="1.0" />
248
   195 FORMAT('      <ldaU l_linMix="',l1,'" mixParam="',f0.6,'" spinf="',f0.6,'"/>')
249 250
   WRITE (fileNum,195) input%ldauLinMix,input%ldauMixParam,input%ldauSpinf

251 252
!      <bzIntegration valenceElectrons="8.00000" mode="hist" fermiSmearingEnergy="0.00100">
   200 FORMAT('      <bzIntegration valenceElectrons="',f0.8,'" mode="',a,'" fermiSmearingEnergy="',f0.8,'">')
253
   WRITE (fileNum,200) input%zelec,TRIM(ADJUSTL(bzIntMode)),input%tkb
254

Daniel Wortmann's avatar
Daniel Wortmann committed
255
   IF(kpts%specificationType.EQ.3) THEN
256
      sumWeight = 0.0
257
      DO i = 1, kpts%nkpt
258
         sumWeight = sumWeight + kpts%wtkpt(i)
259 260
      END DO
      205 FORMAT('         <kPointList posScale="',f0.8,'" weightScale="',f0.8,'" count="',i0,'">')
261
      WRITE (fileNum,205) kpts%posScale, sumWeight, kpts%nkpt
262 263
      DO i = 1, kpts%nkpt
         206 FORMAT('            <kPoint weight="',f12.6,'">',f12.6,' ',f12.6,' ',f12.6,'</kPoint>')
264
         WRITE (fileNum,206) kpts%wtkpt(i), kpts%bk(1,i), kpts%bk(2,i), kpts%bk(3,i)
265
      END DO
266
      WRITE (fileNum,'(a)')('         </kPointList>')
Daniel Wortmann's avatar
Daniel Wortmann committed
267
   ELSE IF(kpts%specificationType.EQ.1) THEN
268

269 270 271 272 273 274 275 276 277 278
      IF (kpts%numSpecialPoints.GE.2) THEN
         207 FORMAT('         <kPointCount count="',i0,'" gamma="',l1,'">')
         WRITE (fileNum,207) kpts%nkpt,kptGamma
         209 FORMAT('            <specialPoint name="',a,'">', f10.6,' ',f10.6,' ',f10.6,'</specialPoint>')
         DO i = 1, kpts%numSpecialPoints
            WRITE(fileNum,209) TRIM(ADJUSTL(kpts%specialPointNames(i))),&
                               kpts%specialPoints(1,i),kpts%specialPoints(2,i),kpts%specialPoints(3,i)
         END DO
         WRITE (fileNum,'(a)') '         </kPointCount>'
      ELSE
279
!            <kPointCount count="100" gamma="F"/>
280 281 282
         208 FORMAT('         <kPointCount count="',i0,'" gamma="',l1,'"/>')
         WRITE (fileNum,208) kpts%nkpt,kptGamma
      END IF
283

284
   ELSE IF (kpts%specificationType.EQ.2) THEN
285 286
!            <kPointMesh nx="10" ny="10" nz="10" gamma="F"/>
      210 FORMAT('         <kPointMesh nx="',i0,'" ny="',i0,'" nz="',i0,'" gamma="',l1,'"/>')
287
      WRITE (fileNum,210) div(1),div(2),div(3),kptGamma
288 289 290
   ELSE !(kpts%specificationType.EQ.4)
      212 FORMAT('         <kPointDensity denX="',f0.6,'" denY="',f0.6,'" denZ="',f0.6,'" gamma="',l1,'"/>')
      WRITE (fileNum,212) kpts%kPointDensity(1),kpts%kPointDensity(2),kpts%kPointDensity(3),kptGamma
291
   END IF
292

293 294 295 296 297 298 299
   IF(input%numBandsKPoints.GT.0) THEN
      WRITE(fileNum,'(a)') '         <altKPointSet purpose="bands">'
      WRITE(fileNum,217) input%numBandsKPoints
      WRITE(fileNum,'(a)') '         </altKPointSet>'
      217 FORMAT('            <kPointCount count="',i6,'" gamma="F"/>')
   END IF

300
   IF(juDFT_was_argument("-gw")) THEN
301 302 303 304 305
      WRITE(fileNum,'(a)') '         <altKPointSet purpose="GW">'
      WRITE(fileNum,'(a)') '            <kPointListFile filename="kpts_gw"/>'
      WRITE(fileNum,'(a)') '         </altKPointSet>'
   END IF

306
   WRITE (fileNum,'(a)') '      </bzIntegration>'
307 308 309

!      <energyParameterLimits ellow="-2.00000" elup="2.00000"/>
   220 FORMAT('      <energyParameterLimits ellow="',f0.8,'" elup="',f0.8,'"/>')
310
   WRITE (fileNum,220) input%ellow,input%elup
311

312 313
   WRITE (fileNum,'(a)') '   </calculationSetup>'
   WRITE (fileNum,'(a)') '   <cell>'
314

Daniel Wortmann's avatar
Daniel Wortmann committed
315
   IF(sym%symSpecType.EQ.3) THEN
316
      WRITE(fileNum,'(a)') '      <symmetryOperations>'
317
      DO i = 1, sym%nop
318
      WRITE(fileNum,'(a)') '         <symOp>'
319
      224 FORMAT('            <row-1>',i0,' ',i0,' ',i0,' ',f0.10,'</row-1>')
320
      WRITE(fileNum,224) sym%mrot(1,1,i), sym%mrot(1,2,i), sym%mrot(1,3,i), sym%tau(1,i)
321
      225 FORMAT('            <row-2>',i0,' ',i0,' ',i0,' ',f0.10,'</row-2>')
322
      WRITE(fileNum,225) sym%mrot(2,1,i), sym%mrot(2,2,i), sym%mrot(2,3,i), sym%tau(2,i)
323
      226 FORMAT('            <row-3>',i0,' ',i0,' ',i0,' ',f0.10,'</row-3>')
324 325
      WRITE(fileNum,226) sym%mrot(3,1,i), sym%mrot(3,2,i), sym%mrot(3,3,i), sym%tau(3,i)
      WRITE(fileNum,'(a)') '         </symOp>'
326
      END DO
327
      WRITE(fileNum,'(a)') '      </symmetryOperations>'
Daniel Wortmann's avatar
Daniel Wortmann committed
328
   ELSE IF(sym%symSpecType.EQ.1) THEN
329
      228 FORMAT('      <symmetryFile filename="',a,'"/>')
330
      WRITE(fileNum,228) TRIM(ADJUSTL(symFilename))
Daniel Wortmann's avatar
Daniel Wortmann committed
331
   ELSE !(sym%symSpecType.EQ.2)
332 333
!      <symmetry spgrp="any" invs="T" zrfs="F"/>
      230 FORMAT('      <symmetry spgrp="',a,'" invs="',l1,'" zrfs="',l1,'"/>')
334
      WRITE (fileNum,230) TRIM(ADJUSTL(sym%namgrp)),sym%invs,sym%zrfs
335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356

   END IF
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!! Note: Different options for the cell definition!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

   IF (cell%latnam.EQ.'c-b') THEN
      a1Temp(1) = sqrt(2.)* a1Temp(1)
   END IF
   IF (cell%latnam.EQ.'hex') THEN
      s3 = sqrt(3.)
      a1Temp(1) = 2*a1Temp(1)/sqrt(3.)
   END IF
   IF (cell%latnam.EQ.'hx3') THEN
      a1Temp(1) = 2*a1Temp(1)
   END IF

   IF (input%film) THEN
!      <xsd:attribute name="dVac" type="xsd:double" use="required"/>
!      <xsd:attribute name="dTilda" type="xsd:double" use="required"/>
!      <filmLattice ...>
      241 FORMAT('      <filmLattice scale="',f0.8,'" latnam="',a,'" dVac="',f0.8,'" dTilda="',f0.8,'">')
357
      WRITE(fileNum,241) input%scaleCell, TRIM(ADJUSTL(cell%latnam)), vacuum%dvac, dtild
358
      IF (cell%latnam.EQ.'any') THEN
359
         WRITE (fileNum,'(a)') '         <bravaisMatrix>'
360
         255 FORMAT('            <row-1>',f0.15,' ',f0.15,' ',f0.15,'</row-1>')
361
         WRITE (fileNum,255) a1Temp(1),a1Temp(2),a1Temp(3)
362
         265 FORMAT('            <row-2>',f0.15,' ',f0.15,' ',f0.15,'</row-2>')
363
         WRITE (fileNum,265) a2Temp(1),a2Temp(2),a2Temp(3)
364
         275 FORMAT('            <row-3>',f0.15,' ',f0.15,' ',f0.15,'</row-3>')
365 366
         WRITE (fileNum,275) a3Temp(1),a3Temp(2),a3Temp(3)
         WRITE (fileNum,'(a)') '         </bravaisMatrix>'
367 368 369 370
      ELSE
         IF ((cell%latnam.EQ.'squ').OR.(cell%latnam.EQ.'hex').OR.&
     &       (cell%latnam.EQ.'c-b').OR.(cell%latnam.EQ.'hx3').OR.&
     &       (cell%latnam.EQ.'c-r').OR.(cell%latnam.EQ.'p-r')) THEN
371 372
            256 FORMAT('         <a1 scale="',f0.10,'">',f0.10,'</a1>')
            WRITE (fileNum,256) input%scaleA1, a1Temp(1) / input%scaleA1
373 374
         END IF
         IF ((cell%latnam.EQ.'c-r').OR.(cell%latnam.EQ.'p-r')) THEN
375 376
            266 FORMAT('         <a2 scale="',f0.10,'">',f0.10,'</a2>')
            WRITE (fileNum,266) input%scaleA2, a2Temp(2) / input%scaleA2
377 378 379
         END IF

         IF (cell%latnam.EQ.'obl') THEN
380
            257 FORMAT('         <row-1>',f0.10,' ',f0.10,'</row-1>')
381
            WRITE (fileNum,257) a1Temp(1), a1Temp(2)
382
            267 FORMAT('         <row-2>',f0.10,' ',f0.10,'</row-2>')
383
            WRITE (fileNum,267) a2Temp(1), a2Temp(2)
384 385 386
         END IF
      END IF

387
      268 FORMAT('         <vacuumEnergyParameters vacuum="',i0,'" spinUp="',f0.8,'" spinDown="',f0.8,'"/>')
388 389 390 391
      DO i = 1, vacuum%nvac
         WRITE(fileNum,268) i, enpara%evac0(i,1), enpara%evac0(i,input%jspins)
      END DO

392
      WRITE (fileNum,'(a)') '      </filmLattice>'
393 394
   ELSE

395
      242 FORMAT('      <bulkLattice scale="',f0.10,'" latnam="',a,'">')
396
      WRITE (fileNum,242) input%scaleCell, TRIM(ADJUSTL(cell%latnam))
397 398 399

      IF (cell%latnam.EQ.'any') THEN

400
!         <bravaisMatrix>
401
         WRITE (fileNum,'(a)') '         <bravaisMatrix>'
402 403

!            <row-1>0.00000 5.13000 5.13000</row-1>
404
         250 FORMAT('            <row-1>',f0.15,' ',f0.15,' ',f0.15,'</row-1>')
405
         WRITE (fileNum,250) a1Temp(1),a1Temp(2),a1Temp(3)
406
!            <row-2>5.13000 0.00000 5.13000</row-2>
407
         260 FORMAT('            <row-2>',f0.15,' ',f0.15,' ',f0.15,'</row-2>')
408
         WRITE (fileNum,260) a2Temp(1),a2Temp(2),a2Temp(3)
409
!            <row-3>5.13000 5.13000 0.00000</row-3>
410
         270 FORMAT('            <row-3>',f0.15,' ',f0.15,' ',f0.15,'</row-3>')
411
         WRITE (fileNum,270) a3Temp(1),a3Temp(2),a3Temp(3)
412

413
         WRITE (fileNum,'(a)') '         </bravaisMatrix>'
414 415 416 417 418
      END IF

      IF ((cell%latnam.EQ.'squ').OR.(cell%latnam.EQ.'hex').OR.&
     &    (cell%latnam.EQ.'c-b').OR.(cell%latnam.EQ.'hx3').OR.&
     &    (cell%latnam.EQ.'c-r').OR.(cell%latnam.EQ.'p-r')) THEN
419 420
         252 FORMAT('         <a1 scale="',f0.10,'">',f0.10,'</a1>')
         WRITE (fileNum,252) input%scaleA1, a1Temp(1) / input%scaleA1
421 422

         IF ((cell%latnam.EQ.'c-r').OR.(cell%latnam.EQ.'p-r')) THEN
423 424
            262 FORMAT('         <a2 scale="',f0.10,'">',f0.10,'</a2>')
            WRITE (fileNum,262) input%scaleA2, a2Temp(2) / input%scaleA2
425 426
         END IF

427 428
         272 FORMAT('         <c scale="',f0.10,'">',f0.10,'</c>')
         WRITE (fileNum,272) input%scaleC, a3Temp(3) / input%scaleC
429 430 431
      END IF

      IF (cell%latnam.EQ.'obl') THEN
432
         254 FORMAT('         <row-1>',f0.10,' ',f0.10,'</row-1>')
433
         WRITE (fileNum,254) a1Temp(1), a1Temp(2)
434

435
         264 FORMAT('         <row-2>',f0.10,' ',f0.10,'</row-2>')
436
         WRITE (fileNum,264) a2Temp(1), a2Temp(2)
437

438 439
         274 FORMAT('         <c scale="',f0.10,'">',f0.10,'</c>')
         WRITE (fileNum,274) input%scaleC, a3Temp(3) / input%scaleC
440 441
      END IF

442
      WRITE (fileNum,'(a)') '      </bulkLattice>'
443
   END IF
444
   WRITE (fileNum,'(a)') '   </cell>'
445 446 447

!   <xcFunctional name="pbe" relativisticCorrections="F">
   280 FORMAT('   <xcFunctional name="',a,'" relativisticCorrections="',l1,'"/>')
448
   WRITE (fileNum,280) TRIM(namex), l_relcor
449 450


Daniel Wortmann's avatar
Daniel Wortmann committed
451 452 453 454 455 456
   uIndices = -1
   DO i_u = 1, atoms%n_u
      IF(uIndices(1,atoms%lda_u(i_u)%atomType).EQ.-1) uIndices(1,atoms%lda_u(i_u)%atomType) = i_u
      uIndices(2,atoms%lda_u(i_u)%atomType) = i_u
   END DO

457 458
   WRITE (fileNum,'(a)') '   <atomSpecies>'
   DO iSpecies=1, numSpecies
459 460 461 462 463 464
      iAtomType = speciesRepAtomType(iSpecies)
      IF(iAtomType.EQ.-1) THEN
         EXIT
      END IF
!      <species name="Si-1" element="Si" atomicNumber="14" coreStates="4" magMom="0.0" flipSpin="F">
      300 FORMAT('      <species name="',a,'" element="',a,'" atomicNumber="',i0,'" coreStates="',i0,'" magMom="',f0.8,'" flipSpin="',l1,'">')
465
      speciesName = TRIM(ADJUSTL(atoms%speciesName(iSpecies)))
466
      WRITE (fileNum,300) TRIM(ADJUSTL(speciesName)),TRIM(ADJUSTL(noel(iAtomType))),atoms%nz(iAtomType),atoms%ncst(iAtomType),atoms%bmu(iAtomType),atoms%nflip(iAtomType)
467 468 469

!         <mtSphere radius="2.160000" gridPoints="521" logIncrement="0.022000"/>
      310 FORMAT('         <mtSphere radius="',f0.8,'" gridPoints="',i0,'" logIncrement="',f0.8,'"/>')
470
      WRITE (fileNum,310) atoms%rmt(iAtomType),atoms%jri(iAtomType),atoms%dx(iAtomType)
471 472 473

!         <atomicCutoffs lmax="8" lnonsphr="6"/>
      320 FORMAT('         <atomicCutoffs lmax="',i0,'" lnonsphr="',i0,'"/>')
474
      WRITE (fileNum,320) atoms%lmax(iAtomType),atoms%lnonsph(iAtomType)
475

476
      IF (ALL(enpara%qn_el(0:3,iAtomType,1).ne.0)) THEN
477
!         <energyParameters s="3" p="3" d="3" f="4"/>
478
         321 FORMAT('         <energyParameters s="',i0,'" p="',i0,'" d="',i0,'" f="',i0,'"/>')
479
         WRITE (fileNum,321) enpara%qn_el(0:3,iAtomType,1)
480 481
      END IF

482 483 484 485 486 487 488
      IF(l_explicit.OR.hybrid%l_hybrid) THEN
         315 FORMAT('         <prodBasis lcutm="',i0,'" lcutwf="',i0,'" select="',a,'"/>')
         line = ''
         WRITE(line,'(i0,1x,i0,1x,i0,1x,i0)') hybrid%select1(1:4,iAtomType)
         WRITE (fileNum,315) hybrid%lcutm1(iAtomType), hybrid%lcutwf(iAtomType), TRIM(ADJUSTL(line))
      END IF

489
      IF(ANY(xmlElectronStates(:,iAtomType).NE.noState_const)) THEN
490 491 492
         endCoreStates = 1
         startCoreStates = 1
         coreStatesString = ''
493
         valenceStatesString = ''
494
         DO i = 1, 29
495
            IF (xmlElectronStates(i,iAtomType).EQ.coreState_const) endCoreStates = i
496 497
         END DO
         IF ((endCoreStates.GE.24).AND.&
498
&            (ALL(xmlPrintCoreStates(1:24,iAtomType).EQV..FALSE.)).AND.&
499
&            (ALL(xmlElectronStates(1:24,iAtomType).EQ.coreState_const)) ) THEN
Daniel Wortmann's avatar
Daniel Wortmann committed
500
            coreStatesString = nobleGasConfigList_const(6)
501 502
            startCoreStates = 25
         ELSE IF ((endCoreStates.GE.17).AND.&
503
&                 (ALL(xmlPrintCoreStates(1:17,iAtomType).EQV..FALSE.)).AND.&
504
&                 (ALL(xmlElectronStates(1:17,iAtomType).EQ.coreState_const))) THEN
Daniel Wortmann's avatar
Daniel Wortmann committed
505
            coreStatesString = nobleGasConfigList_const(5)
506 507
            startCoreStates = 18
         ELSE IF ((endCoreStates.GE.12).AND.&
508
&                 (ALL(xmlPrintCoreStates(1:12,iAtomType).EQV..FALSE.)).AND.&
509
&                 (ALL(xmlElectronStates(1:12,iAtomType).EQ.coreState_const))) THEN
Daniel Wortmann's avatar
Daniel Wortmann committed
510
            coreStatesString = nobleGasConfigList_const(4)
511 512
            startCoreStates = 13
         ELSE IF ((endCoreStates.GE.7).AND.&
513
&                 (ALL(xmlPrintCoreStates(1:7,iAtomType).EQV..FALSE.)).AND.&
514
&                 (ALL(xmlElectronStates(1:7,iAtomType).EQ.coreState_const))) THEN
Daniel Wortmann's avatar
Daniel Wortmann committed
515
            coreStatesString = nobleGasConfigList_const(3)
516 517
            startCoreStates = 8
         ELSE IF ((endCoreStates.GE.4).AND.&
518
&                 (ALL(xmlPrintCoreStates(1:4,iAtomType).EQV..FALSE.)).AND.&
519
&                 (ALL(xmlElectronStates(1:4,iAtomType).EQ.coreState_const))) THEN
Daniel Wortmann's avatar
Daniel Wortmann committed
520
            coreStatesString = nobleGasConfigList_const(2)
521 522
            startCoreStates = 5
         ELSE IF ((endCoreStates.GE.1).AND.&
523
&                 (ALL(xmlPrintCoreStates(1:1,iAtomType).EQV..FALSE.)).AND.&
524
&                 (ALL(xmlElectronStates(1:1,iAtomType).EQ.coreState_const))) THEN
Daniel Wortmann's avatar
Daniel Wortmann committed
525
            coreStatesString = nobleGasConfigList_const(1)
526 527 528
            startCoreStates = 2
         END IF
         DO i = startCoreStates, endCoreStates
529
            IF(xmlElectronStates(i,iAtomType).EQ.coreState_const) THEN
Daniel Wortmann's avatar
Daniel Wortmann committed
530
               coreStatesString = TRIM(ADJUSTL(coreStatesString)) // ' ' // coreStateList_const(i)
531 532
            END IF
         END DO
533 534
         DO i = 1, 29
            IF(xmlElectronStates(i,iAtomType).EQ.valenceState_const) THEN
Daniel Wortmann's avatar
Daniel Wortmann committed
535
               valenceStatesString = TRIM(ADJUSTL(valenceStatesString)) // ' ' // coreStateList_const(i)
536 537
            END IF
         END DO
538
         WRITE (fileNum,'(a)') '         <electronConfig>'
539
!         <coreConfig>[He] (2s1/2) (2p1/2) (2p3/2)</coreConfig>
540
         322 FORMAT('            <coreConfig>',a,'</coreConfig>')
541
         WRITE(fileNum,322) TRIM(ADJUSTL(coreStatesString))
542
         323 FORMAT('            <valenceConfig>',a,'</valenceConfig>')
543
         WRITE(fileNum,323) TRIM(ADJUSTL(valenceStatesString))
544 545
         DO i = startCoreStates, 29
            IF ((xmlElectronStates(i,iAtomType).NE.noState_const).AND.(xmlPrintCoreStates(i,iAtomType))) THEN
546
!         <coreStateOccupation state="(2s1/2)" spinUp="1.0" spinDown="1.0"/>
547
               325 FORMAT('            <stateOccupation state="',a,'" spinUp="',f0.8,'" spinDown="',f0.8,'"/>')
Daniel Wortmann's avatar
Daniel Wortmann committed
548
               WRITE(fileNum,325) coreStateList_const(i), xmlCoreOccs(1,i,iAtomType), xmlCoreOccs(2,i,iAtomType)
549 550
            END IF
         END DO
551
         WRITE (fileNum,'(a)') '         </electronConfig>'
552 553
      END IF

Daniel Wortmann's avatar
Daniel Wortmann committed
554 555 556 557 558 559 560 561
      IF (uIndices(1,iAtomType).NE.-1) THEN
!         <ldaU l="2" U="5.5" J="0.9" l_amf="F"/>
         DO i_u = uIndices(1,iAtomType), uIndices(2,iAtomType)
            326 FORMAT('         <ldaU l="',i0,'" U="',f0.5,'" J="',f0.5,'" l_amf="',l1,'"/>')
            WRITE (fileNum,326) atoms%lda_u(i_u)%l, atoms%lda_u(i_u)%u, atoms%lda_u(i_u)%j, atoms%lda_u(i_u)%l_amf
         END DO
      END IF

562 563 564
      DO ilo = 1, atoms%nlo(iAtomType)
!         <lo type="HELO" l="0" n="4"/>
         l = atoms%llo(ilo,iAtomType)
565
         n = enpara%qn_ello(ilo,iAtomType,1)
566 567 568
         loType = 'SCLO'
         IF(n.LT.0) THEN
            loType = 'HELO'
569
         END IF
570 571 572
         n = ABS(n)
         324 FORMAT('         <lo type="',a,'" l="',i0,'" n="',i0,'" eDeriv="',i0,'"/>')
         WRITE (fileNum,324) TRIM(ADJUSTL(loType)), l, n, atoms%ulo_der(ilo,iAtomType)
573 574
      END DO

575
      WRITE (fileNum,'(a)') '      </species>'
576
   END DO
577 578
   WRITE (fileNum,'(a)') '   </atomSpecies>'
   WRITE (fileNum,'(a)') '   <atomGroups>'
579 580 581 582 583
   na = 0
   DO iAtomType=1, atoms%ntype
      iSpecies = atomTypeSpecies(iAtomType)
!      <atomGroup species="Si-1">
      330 FORMAT('      <atomGroup species="',a,'">')
584
      speciesName = TRIM(ADJUSTL(atoms%speciesName(iSpecies)))
585
      WRITE (fileNum,330) TRIM(ADJUSTL(speciesName))
586 587 588 589 590

      DO ieq=1,atoms%neq(iAtomType)
         na = na + 1
         tempTaual(1,na) = atoms%taual(1,na)
         tempTaual(2,na) = atoms%taual(2,na)
591 592
         tempTaual(3,na) = atoms%taual(3,na)
         scpos = 1.0
593
         DO i = 2,40
594 595 596 597
            rest = ABS(i*tempTaual(1,na) - NINT(i*tempTaual(1,na)))
            IF ((scpos(1).EQ.1.0).AND.(rest.LT.(i*0.000001))) scpos(1) = real(i)
            rest = ABS(i*tempTaual(2,na) - NINT(i*tempTaual(2,na)))
            IF ((scpos(2).EQ.1.0).AND.(rest.LT.(i*0.000001))) scpos(2) = real(i)
598
            IF (.not.input%film) THEN
599 600
               rest = ABS(i*tempTaual(3,na) - NINT(i*tempTaual(3,na)) )
               IF ((scpos(3).EQ.1.0).AND.(rest.LT.(i*0.000001))) scpos(3) = real(i)
601
            END IF
602
         END DO
603
         DO i = 1,2
604 605 606
            tempTaual(i,na) = tempTaual(i,na)*scpos(i)
         END DO
         IF (.not.input%film) tempTaual(3,na) = tempTaual(3,na)*scpos(3)
607
         IF (input%film) THEN
608
            tempTaual(3,na) = dtild*tempTaual(3,na)/input%scaleCell
609
         END IF
610 611 612 613 614
!+odim in 1D case all the coordinates are given in cartesian YM
         IF (oneD%odd%d1) THEN
            tempTaual(1,na) = tempTaual(1,na)*a1(1)
            tempTaual(2,na) = tempTaual(2,na)*a2(2)
         END IF
615 616 617 618 619
!-odim
         IF (oneD%odd%d1) THEN
            STOP '1D position output not implemented!'
         ELSE IF (input%film) THEN
!         <filmPos> x/myConstant  y/myConstant  1/myConstant</filmPos>
620
            340 FORMAT('         <filmPos label="',a20,'">',a,' ',a,' ',a,'</filmPos>')
621 622 623 624 625 626 627 628 629
            posString(:) = ''
            DO i = 1, 2
               IF((scpos(i).NE.1.0).AND.(tempTaual(i,na).NE.0.0)) THEN
                  WRITE(posString(i),'(f0.3,a1,f0.3)') tempTaual(i,na), '/', scpos(i)
               ELSE
                  WRITE(posString(i),'(f0.10)') tempTaual(i,na)
               END IF
            END DO
            WRITE(posString(3),'(f0.10)') tempTaual(3,na)
630 631
            WRITE (fileNum,340) TRIM(ADJUSTL(atoms%label(na))), &
                                TRIM(ADJUSTL(posString(1))),TRIM(ADJUSTL(posString(2))),TRIM(ADJUSTL(posString(3)))
632 633
         ELSE
!         <relPos> x/myConstant  y/myConstant  z/myConstant</relPos>
634
            350 FORMAT('         <relPos label="',a20,'">',a,' ',a,' ',a,'</relPos>')
635 636 637 638 639 640 641 642
            posString(:) = ''
            DO i = 1, 3
               IF((scpos(i).NE.1.0).AND.(tempTaual(i,na).NE.0.0)) THEN
                  WRITE(posString(i),'(f0.3,a1,f0.3)') tempTaual(i,na), '/', scpos(i)
               ELSE
                  WRITE(posString(i),'(f0.10)') tempTaual(i,na)
               END IF
            END DO
643 644
            WRITE (fileNum,350) TRIM(ADJUSTL(atoms%label(na))), &
                                TRIM(ADJUSTL(posString(1))),TRIM(ADJUSTL(posString(2))),TRIM(ADJUSTL(posString(3)))
645 646 647 648
         END IF
      END DO
!         <force calculate="F" relaxX="T" relaxY="T" relaxZ="T"/>
      360 FORMAT('         <force calculate="',l1,'" relaxXYZ="',3l1,'"/>')
649
      WRITE (fileNum,360) atoms%l_geo(iAtomType),atoms%relax(1,iAtomType),atoms%relax(2,iAtomType),atoms%relax(3,iAtomType)
650

651
      IF(l_nocoOpt.OR.l_explicit) THEN
652
         362 FORMAT('         <nocoParams l_relax="',l1,'" alpha="',f0.8,'" beta="',&
Daniel Wortmann's avatar
Daniel Wortmann committed
653
                    f0.8,'" b_cons_x="',f0.8,'" b_cons_y="',f0.8,'"/>')
654
         WRITE(fileNum,362) noco%l_relax(iAtomType), noco%alphInit(iAtomType),&
655 656 657 658
                            noco%beta(iAtomType),noco%b_con(1,iAtomType),noco%b_con(2,iAtomType)
      END IF


659
      WRITE (fileNum,'(a)') '      </atomGroup>'
660
   END DO
661
   WRITE (fileNum,'(a)') '   </atomGroups>'
662

663 664
   368 FORMAT('   <output dos="',l1,'" band="',l1,'" vacdos="',l1,'" slice="',l1,'" mcd="',l1,'">')
   WRITE (fileNum,368) banddos%dos,band,banddos%vacdos,sliceplot%slice,banddos%l_mcd
665 666

!      <checks vchk="F" cdinf="F" disp="F"/>
667 668
   370 FORMAT('      <checks vchk="',l1,'" cdinf="',l1,'"/>')
   WRITE (fileNum,370) input%vchk,input%cdinf
669 670 671

!      <densityOfStates ndir="0" minEnergy="-0.50000" maxEnergy="0.50000" sigma="0.01500"/>  
   380 FORMAT('      <densityOfStates ndir="',i0,'" minEnergy="',f0.8,'" maxEnergy="',f0.8,'" sigma="',f0.8,'"/>')
672
   WRITE (fileNum,380) banddos%ndir,banddos%e2_dos,banddos%e1_dos,banddos%sig_dos
673 674

!      <vacuumDOS layers="0" integ="F" star="F" nstars="0" locx1="0.00" locy1="0.00" locx2="0.00" locy2="0.00" nstm="0" tworkf="0.000000"/>
Daniel Wortmann's avatar
Daniel Wortmann committed
675
   390 FORMAT('      <vacuumDOS layers="',i0,'" integ="',l1,'" star="',l1,'" nstars="',i0,'" locx1="',f0.5,'" locy1="',f0.5,'" locx2="',f0.5,'" locy2="',f0.5,'" nstm="',i0,'" tworkf="',f0.5,'"/>')
676
   WRITE (fileNum,390) vacuum%layers,input%integ,vacuum%starcoeff,vacuum%nstars,vacuum%locx(1),vacuum%locy(1),vacuum%locx(2),vacuum%locy(2),vacuum%nstm,vacuum%tworkf
677

678 679
!      <unfoldingBand unfoldBand="F" supercellX="1" supercellY="1" supercellZ="1"/>
   395 FORMAT('      <unfoldingBand unfoldBand="',l1,'" supercellX="',i0,'" supercellY="',i0,'" supercellZ="',i0,'"/>')
680 681
   WRITE (fileNum,395) banddos%unfoldband, banddos%s_cell_x, banddos%s_cell_y, banddos%s_cell_z

682
!      <plotting iplot="0" score="F" plplot="F"/>
683
   400 FORMAT('      <plotting iplot="',i0,'" score="',l1,'" plplot="',l1,'"/>')
684
   WRITE (fileNum,400) sliceplot%iplot,input%score,sliceplot%plpot
685 686 687

!      <chargeDensitySlicing numkpt="0" minEigenval="0.000000" maxEigenval="0.000000" nnne="0" pallst="F"/>
   410 FORMAT('      <chargeDensitySlicing numkpt="',i0,'" minEigenval="',f0.8,'" maxEigenval="',f0.8,'" nnne="',i0,'" pallst="',l1,'"/>')
688
   WRITE (fileNum,410) sliceplot%kk,sliceplot%e1s,sliceplot%e2s,sliceplot%nnne,input%pallst
689 690

!      <specialOutput form66="F" eonly="F" bmt="F"/>
691 692
   420 FORMAT('      <specialOutput eonly="',l1,'" bmt="',l1,'"/>')
   WRITE (fileNum,420) input%eonly,input%l_bmt
693

694 695 696 697
!      <magneticCircularDichroism energyLo="-10.0" energyUp="0.0"/>
   430 FORMAT('      <magneticCircularDichroism energyLo="',f0.8,'" energyUp="',f0.8,'"/>')
   WRITE (fileNum,430) banddos%e_mcd_lo,banddos%e_mcd_up

698
   WRITE (fileNum,'(a)') '   </output>'
699 700 701
   IF(l_outFile) THEN
      CALL closeXMLElement('inputData')
   ELSE
702 703
      WRITE (fileNum,'(a)')' <!-- We include the file relax.inp here to enable relaxations (see documentation) -->'
      WRITE (fileNum,'(a)')'  <xi:include xmlns:xi="http://www.w3.org/2001/XInclude" href="relax.xml"> <xi:fallback/> </xi:include>'
704 705 706
      WRITE (fileNum,'(a)') '</fleurInput>'
      CLOSE (fileNum)
   END IF
707

708
END SUBROUTINE w_inpXML
709
END MODULE m_winpXML