w_inpXML.f90 28.8 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 17 18 19 20 21 22
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
!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
CONTAINS
SUBROUTINE w_inpXML(&
&                   atoms,obsolete,vacuum,input,stars,sliceplot,banddos,&
&                   cell,sym,xcpot,noco,jij,oneD,hybrid,kpts,div,l_gamma,&
&                   noel,namex,relcor,a1,a2,a3,scale,dtild_opt,name_opt,&
23
&                   xmlElectronStates,xmlPrintCoreStates,xmlCoreOccs,&
24
&                   atomTypeSpecies,speciesRepAtomType,l_outFile,filename,&
25
&                   l_explicitIn,numSpecies,enpara)
26 27

   USE m_types
Daniel Wortmann's avatar
Daniel Wortmann committed
28
   USE m_juDFT
29
   USE m_constants
30
   USE m_xmlOutput
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49

   IMPLICIT NONE

! 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_Jij),INTENT(IN)      :: Jij
   TYPE(t_cell),INTENT(IN)     :: cell
   TYPE(t_banddos),INTENT(IN)  :: banddos
   TYPE(t_sliceplot),INTENT(IN):: sliceplot
   TYPE(t_xcpot),INTENT(IN)    :: xcpot
50
   TYPE(t_noco),INTENT(IN)     :: noco
51
   TYPE(t_enpara),INTENT(IN)   :: enpara
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 58
   REAL,    INTENT (IN)        :: a1(3),a2(3),a3(3),scale
   REAL, INTENT (IN)     :: xmlCoreOccs(2,29,atoms%ntype)
59
   INTEGER, INTENT (IN)  :: xmlElectronStates(29,atoms%ntype)
60 61
   LOGICAL, INTENT (IN)  :: xmlPrintCoreStates(29,atoms%ntype)
   CHARACTER(len=3),INTENT(IN) :: noel(atoms%ntypd)
62
   CHARACTER(len=4),INTENT(IN) :: namex
63
   CHARACTER(len=12),INTENT(IN):: relcor
64
   CHARACTER(LEN=*),INTENT(IN) :: filename
65 66 67 68
   REAL,INTENT(IN),OPTIONAL    :: dtild_opt
   CHARACTER(len=8),INTENT(IN),OPTIONAL:: name_opt(10)


69
   INTEGER :: iSpecies, fileNum
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
   CHARACTER(len=8) :: name(10)

!+lda+u
   REAL    u,j
   INTEGER l
   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
   REAL     ::dtild ,scpos, zc, sumWeight
   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%ntypd)
   CHARACTER(len=  4) :: chntype
   CHARACTER(len= 41) :: chform
99 100
   CHARACTER(len=100) :: line
   CHARACTER(len=3)   :: sso_optString
101 102 103 104 105 106 107 108 109 110 111 112

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

   CHARACTER(len=20) :: tempNumberString, speciesName
   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
114 115
   INTEGER :: iAtomType, startCoreStates, endCoreStates
   CHARACTER(len=100) :: xPosString, yPosString, zPosString
116
   CHARACTER(len=200) :: coreStatesString, valenceStatesString
117 118 119 120 121 122 123
   REAL :: tempTaual(3,atoms%nat)
   REAL :: a1Temp(3),a2Temp(3),a3Temp(3)
   REAL :: amatTemp(3,3), bmatTemp(3,3)
   CHARACTER(len=7) :: coreStateList(29) !'(1s1/2)'
   CHARACTER(len=4) :: nobleGasConfigList(6) !'[He]'

   DATA coreStateList / '(1s1/2)','(2s1/2)','(2p1/2)','(2p3/2)','(3s1/2)',&
124
&                       '(3p1/2)','(3p3/2)','(3d3/2)','(3d5/2)','(4s1/2)',&
125 126 127 128 129 130 131 132 133 134
&                       '(4p1/2)','(4p3/2)','(5s1/2)','(4d3/2)','(4d5/2)',&
&                       '(5p1/2)','(5p3/2)','(6s1/2)','(4f5/2)','(4f7/2)',&
&                       '(5d3/2)','(5d5/2)','(6p1/2)','(6p3/2)','(7s1/2)',&
&                       '(5f5/2)','(5f7/2)','(6d3/2)','(6d5/2)' /

   DATA nobleGasConfigList / '[He]','[Ne]','[Ar]','[Kr]','[Xe]','[Rn]' /

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

135
   l_explicit = l_explicitIn.OR.l_outFile
136

137 138 139 140
   symFilename = 'sym.out'
   kptGamma = l_gamma
   band = .false.
   nw=1
141 142
   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.
143 144 145 146 147 148 149 150 151 152 153 154 155
   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

156 157 158
   fileNum = -1
   IF(l_outFile) THEN
      fileNum = getXMLOutputUnitNumber()
159
      CALL openXMLElementNoAttributes('inputData')
160 161
   ELSE
      fileNum = 5
162
      OPEN (fileNum,file=TRIM(ADJUSTL(filename)),form='formatted',status='unknown')
163
      REWIND (fileNum)
164

165 166 167
      WRITE (fileNum,'(a)') '<?xml version="1.0" encoding="UTF-8" standalone="no"?>'
      WRITE (fileNum,'(a)') '<fleurInput fleurInputVersion="0.27">'
   END IF
168 169

   IF(PRESENT(name_opt)) THEN
170 171 172
      WRITE (fileNum,'(a)') '   <comment>'
      WRITE (fileNum,'(a6,10a8)') '      ',name
      WRITE (fileNum,'(a)') '   </comment>'
173 174
   END IF

175
   WRITE (fileNum,'(a)') '   <calculationSetup>'
176 177 178

!      <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,'"/>')
179
   WRITE (fileNum,110) input%rkmax,stars%gmax,xcpot%gmaxxc,input%gw_neigd
180 181 182 183 184 185 186 187 188 189 190 191 192 193 194

!      <scfLoop itmax="9" maxIterBroyd="99" imix="Anderson" alpha="0.05" spinf="2.00"/>
   120 FORMAT('      <scfLoop itmax="',i0,'" maxIterBroyd="',i0,'" imix="',a,'" alpha="',f0.8,'" spinf="',f0.8,'"/>')
   SELECT CASE (input%imix)
      CASE (1) 
         mixingScheme='straight'
      CASE (3) 
         mixingScheme='Broyden1'
      CASE (5) 
         mixingScheme='Broyden2'
      CASE (7) 
         mixingScheme='Anderson'
      CASE DEFAULT 
         mixingScheme='errorUnknownMixing'
   END SELECT
195
   WRITE (fileNum,120) input%itmax,input%maxiter,TRIM(mixingScheme),input%alpha,input%spinf
196 197 198

!      <coreElectrons ctail="T" frcor="F" kcrel="0"/>
   130 FORMAT('      <coreElectrons ctail="',l1,'" frcor="',l1,'" kcrel="',i0,'"/>')
199
   WRITE (fileNum,130) input%ctail,input%frcor,input%kcrel
200 201 202

!      <magnetism jspins="1" l_noco="F" l_J="F" swsp="F" lflip="F"/>
   140 FORMAT('      <magnetism jspins="',i0,'" l_noco="',l1,'" l_J="',l1,'" swsp="',l1,'" lflip="',l1,'"/>')
203
   WRITE (fileNum,140) input%jspins,noco%l_noco,jij%l_J,input%swsp,input%lflip
204 205 206

!      <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,'" off="',l1,'" soc66="',l1,'"/>')
207
   WRITE (fileNum,150) noco%theta,noco%phi,noco%l_soc,noco%soc_opt(atoms%ntype+2),noco%soc_opt(atoms%ntype+1),obsolete%eig66(2)
208

209 210 211 212 213 214 215
   IF (noco%l_noco.OR.l_explicit) THEN
      160 FORMAT('      <nocoParams l_ss="',l1,'" l_mperp="',l1,'" l_constr="',l1,'" l_disp="',l1,'" sso_opt="',a3,&
                 '" mix_b="',f0.8,'" thetaJ="',f0.8,'" nsh="',i0,'">')
      sso_optString='FFF'
      IF(input%sso_opt(1)) sso_optString(1:1) = 'T'
      IF(input%sso_opt(2)) sso_optString(2:2) = 'T'
      WRITE (fileNum,160) noco%l_ss, noco%l_mperp, noco%l_constr, Jij%l_disp, sso_optString, noco%mix_b, Jij%thetaJ, Jij%nsh
216
      162 FORMAT('         <qss>',f0.10,' ',f0.10,' ',f0.10,'</qss>')
217 218
      WRITE(fileNum,162) noco%qss(1), noco%qss(2), noco%qss(3)
      WRITE (fileNum,'(a)') '      </nocoParams>'
219 220 221 222
   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,'"/>')
223
      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
224 225 226 227
   END IF

!      <expertModes gw="0" pot8="F" eig66="F" lpr="0" isec1="99" secvar="F" />
   180 FORMAT('      <expertModes gw="',i0,'" pot8="',l1,'" eig66="',l1,'" lpr="',i0,'" isec1="',i0,'" secvar="',l1,'"/>')
228
   WRITE (fileNum,180) input%gw,obsolete%pot8,obsolete%eig66(1),obsolete%lpr,input%isec1,input%secvar
229 230 231

!      <geometryOptimization l_f="F" xa="2.00000" thetad="330.00000" epsdisp="0.00001" epsforce="0.00001"/>
   190 FORMAT('      <geometryOptimization l_f="',l1,'" xa="',f0.8,'" thetad="',f0.8,'" epsdisp="',f0.8,'" epsforce="',f0.8,'"/>')
232
   WRITE (fileNum,190) input%l_f,input%xa,input%thetad,input%epsdisp,input%epsforce
233 234 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
!      <bzIntegration valenceElectrons="8.00000" mode="hist" fermiSmearingEnergy="0.00100">
   200 FORMAT('      <bzIntegration valenceElectrons="',f0.8,'" mode="',a,'" fermiSmearingEnergy="',f0.8,'">')
246
   WRITE (fileNum,200) input%zelec,TRIM(ADJUSTL(bzIntMode)),input%tkb
247

248
   IF(l_explicit) THEN
249
      sumWeight = 0.0
250
      DO i = 1, kpts%nkpt
251 252 253
         sumWeight = sumWeight + kpts%weight(i)
      END DO
      205 FORMAT('         <kPointList posScale="',f0.8,'" weightScale="',f0.8,'" count="',i0,'">')
254
      WRITE (fileNum,205) kpts%posScale, sumWeight, kpts%nkpt
255 256
      DO i = 1, kpts%nkpt
         206 FORMAT('            <kPoint weight="',f12.6,'">',f12.6,' ',f12.6,' ',f12.6,'</kPoint>')
257
         WRITE (fileNum,206) kpts%weight(i), kpts%bk(1,i), kpts%bk(2,i), kpts%bk(3,i)
258
      END DO
259
      WRITE (fileNum,'(a)')('         </kPointList>')
260 261 262
   ELSE IF( (div(1) == 0).OR.(div(2) == 0) ) THEN
!            <kPointCount count="100" gamma="F"/>
      208 FORMAT('         <kPointCount count="',i0,'" gamma="',l1,'"/>')
263
      WRITE (fileNum,208) kpts%nkpt,kptGamma
264 265 266
   ELSE
!            <kPointMesh nx="10" ny="10" nz="10" gamma="F"/>
      210 FORMAT('         <kPointMesh nx="',i0,'" ny="',i0,'" nz="',i0,'" gamma="',l1,'"/>')
267
      WRITE (fileNum,210) div(1),div(2),div(3),kptGamma
268
   END IF
269
   WRITE (fileNum,'(a)') '      </bzIntegration>'
270 271 272

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

275 276
   WRITE (fileNum,'(a)') '   </calculationSetup>'
   WRITE (fileNum,'(a)') '   <cell>'
277

278 279
   IF(l_explicit) THEN
      WRITE(fileNum,'(a)') '      <symmetryOperations>'
280
      DO i = 1, sym%nop
281
      WRITE(fileNum,'(a)') '         <symOp>'
282
      224 FORMAT('            <row-1>',i0,' ',i0,' ',i0,' ',f0.10,'</row-1>')
283
      WRITE(fileNum,224) sym%mrot(1,1,i), sym%mrot(1,2,i), sym%mrot(1,3,i), sym%tau(1,i)
284
      225 FORMAT('            <row-2>',i0,' ',i0,' ',i0,' ',f0.10,'</row-2>')
285
      WRITE(fileNum,225) sym%mrot(2,1,i), sym%mrot(2,2,i), sym%mrot(2,3,i), sym%tau(2,i)
286
      226 FORMAT('            <row-3>',i0,' ',i0,' ',i0,' ',f0.10,'</row-3>')
287 288
      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>'
289
      END DO
290
      WRITE(fileNum,'(a)') '      </symmetryOperations>'
291 292
   ELSE IF(TRIM(ADJUSTL(sym%namgrp)).EQ.'any') THEN
      228 FORMAT('      <symmetryFile filename="',a,'"/>')
293
      WRITE(fileNum,228) TRIM(ADJUSTL(symFilename))
294 295 296
   ELSE
!      <symmetry spgrp="any" invs="T" zrfs="F"/>
      230 FORMAT('      <symmetry spgrp="',a,'" invs="',l1,'" zrfs="',l1,'"/>')
297
      WRITE (fileNum,230) TRIM(ADJUSTL(sym%namgrp)),sym%invs,sym%zrfs
298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319

   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,'">')
320
      WRITE(fileNum,241) scale, TRIM(ADJUSTL(cell%latnam)), vacuum%dvac, dtild
321
      IF (cell%latnam.EQ.'any') THEN
322
         WRITE (fileNum,'(a)') '         <bravaisMatrix>'
323
         255 FORMAT('            <row-1>',f0.10,' ',f0.10,' ',f0.10,'</row-1>')
324
         WRITE (fileNum,255) a1Temp(1),a1Temp(2),a1Temp(3)
325
         265 FORMAT('            <row-2>',f0.10,' ',f0.10,' ',f0.10,'</row-2>')
326
         WRITE (fileNum,265) a2Temp(1),a2Temp(2),a2Temp(3)
327
         275 FORMAT('            <row-3>',f0.10,' ',f0.10,' ',f0.10,'</row-3>')
328 329
         WRITE (fileNum,275) a3Temp(1),a3Temp(2),a3Temp(3)
         WRITE (fileNum,'(a)') '         </bravaisMatrix>'
330 331 332 333
      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
334
            256 FORMAT('         <a1>',f0.10,'</a1>')
335
            WRITE (fileNum,256) a1Temp(1)
336 337
         END IF
         IF ((cell%latnam.EQ.'c-r').OR.(cell%latnam.EQ.'p-r')) THEN
338
            266 FORMAT('         <a2>',f0.10,'</a2>')
339
            WRITE (fileNum,266) a2Temp(2)
340 341 342
         END IF

         IF (cell%latnam.EQ.'obl') THEN
343
            257 FORMAT('         <row-1>',f0.10,' ',f0.10,'</row-1>')
344
            WRITE (fileNum,257) a1Temp(1), a1Temp(2)
345
            267 FORMAT('         <row-2>',f0.10,' ',f0.10,'</row-2>')
346
            WRITE (fileNum,267) a2Temp(1), a2Temp(2)
347 348 349
         END IF
      END IF

350
      268 FORMAT('         <vacuumEnergyParameters vacuum="',i0,'" spinUp="',f0.8,'" spinDown="',f0.8,'"/>')
351 352 353 354
      DO i = 1, vacuum%nvac
         WRITE(fileNum,268) i, enpara%evac0(i,1), enpara%evac0(i,input%jspins)
      END DO

355
      WRITE (fileNum,'(a)') '      </filmLattice>'
356 357
   ELSE

358
      242 FORMAT('      <bulkLattice scale="',f0.10,'" latnam="',a,'">')
359
      WRITE (fileNum,242) scale, TRIM(ADJUSTL(cell%latnam))
360 361 362 363

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

!         <bravaisMatrix scale="1.0000000">
364
         WRITE (fileNum,'(a)') '         <bravaisMatrix>'
365 366

!            <row-1>0.00000 5.13000 5.13000</row-1>
367
         250 FORMAT('            <row-1>',f0.10,' ',f0.10,' ',f0.10,'</row-1>')
368
         WRITE (fileNum,250) a1Temp(1),a1Temp(2),a1Temp(3)
369
!            <row-2>5.13000 0.00000 5.13000</row-2>
370
         260 FORMAT('            <row-2>',f0.10,' ',f0.10,' ',f0.10,'</row-2>')
371
         WRITE (fileNum,260) a2Temp(1),a2Temp(2),a2Temp(3)
372
!            <row-3>5.13000 5.13000 0.00000</row-3>
373
         270 FORMAT('            <row-3>',f0.10,' ',f0.10,' ',f0.10,'</row-3>')
374
         WRITE (fileNum,270) a3Temp(1),a3Temp(2),a3Temp(3)
375

376
         WRITE (fileNum,'(a)') '         </bravaisMatrix>'
377 378 379 380 381
      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
382
         252 FORMAT('         <a1>',f0.10,'</a1>')
383
         WRITE (fileNum,252) a1Temp(1)
384 385

         IF ((cell%latnam.EQ.'c-r').OR.(cell%latnam.EQ.'p-r')) THEN
386
            262 FORMAT('         <a2>',f0.10,'</a2>')
387
            WRITE (fileNum,262) a2Temp(2)
388 389
         END IF

390
         272 FORMAT('         <c>',f0.10,'</c>')
391
         WRITE (fileNum,272) a3Temp(3)
392 393 394
      END IF

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

398
         264 FORMAT('         <row-2>',f0.10,' ',f0.10,'</row-2>')
399
         WRITE (fileNum,264) a2Temp(1), a2Temp(2)
400

401
         274 FORMAT('         <c>',f0.10,'</c>')
402
         WRITE (fileNum,274) a3Temp(3)
403 404
      END IF

405
      WRITE (fileNum,'(a)') '      </bulkLattice>'
406
   END IF
407
   WRITE (fileNum,'(a)') '   </cell>'
408 409 410

!   <xcFunctional name="pbe" relativisticCorrections="F">
   280 FORMAT('   <xcFunctional name="',a,'" relativisticCorrections="',l1,'"/>')
411
   WRITE (fileNum,280) TRIM(namex), l_relcor
412 413 414 415

!      <xcParams igrd="1" lwb="F" ndvgrd="6" idsprs="0" chng="-0.100e-11"/>

!   290 FORMAT('      <xcParams igrd="',i0,'" lwb="',l1,'" ndvgrd="',i0,'" idsprs="',i0,'" chng="',e,'"/>')
416 417
!   WRITE (fileNum,290) xcpot%igrd,obsolete%lwb,obsolete%ndvgrd,0,obsolete%chng
!   WRITE (fileNum,'(a)') '   </xcFunctional>'
418

419 420
   WRITE (fileNum,'(a)') '   <atomSpecies>'
   DO iSpecies=1, numSpecies
421 422 423 424 425 426 427
      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,'">')
      tempNumberString = ''
428
      WRITE(tempNumberString,'(i0)') iSpecies
429
      speciesName = TRIM(ADJUSTL(noel(iAtomType))) // '-' // TRIM(ADJUSTL(tempNumberString))
430
      WRITE (fileNum,300) TRIM(ADJUSTL(speciesName)),TRIM(ADJUSTL(noel(iAtomType))),atoms%nz(iAtomType),atoms%ncst(iAtomType),atoms%bmu(iAtomType),atoms%nflip(iAtomType)
431 432 433

!         <mtSphere radius="2.160000" gridPoints="521" logIncrement="0.022000"/>
      310 FORMAT('         <mtSphere radius="',f0.8,'" gridPoints="',i0,'" logIncrement="',f0.8,'"/>')
434
      WRITE (fileNum,310) atoms%rmt(iAtomType),atoms%jri(iAtomType),atoms%dx(iAtomType)
435 436 437

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

440
      IF (ALL((enpara%el0(0:3,iAtomType,1)-INT(enpara%el0(0:3,iAtomType,1))).LE.0.00000001)) THEN
441
!         <energyParameters s="3" p="3" d="3" f="4"/>
442
         321 FORMAT('         <energyParameters s="',i0,'" p="',i0,'" d="',i0,'" f="',i0,'"/>')
443 444
         WRITE (fileNum,321) INT(enpara%el0(0,iAtomType,1)),INT(enpara%el0(1,iAtomType,1)),&
                             INT(enpara%el0(2,iAtomType,1)),INT(enpara%el0(3,iAtomType,1))
445 446
      END IF

447
      IF(ANY(xmlElectronStates(:,iAtomType).NE.noState_const)) THEN
448 449 450
         endCoreStates = 1
         startCoreStates = 1
         coreStatesString = ''
451
         valenceStatesString = ''
452
         DO i = 1, 29
453
            IF (xmlElectronStates(i,iAtomType).EQ.coreState_const) endCoreStates = i
454 455
         END DO
         IF ((endCoreStates.GE.24).AND.&
456
&            (ALL(xmlPrintCoreStates(1:24,iAtomType).EQV..FALSE.)).AND.&
457
&            (ALL(xmlElectronStates(1:24,iAtomType).EQ.coreState_const)) ) THEN
458 459 460
            coreStatesString = nobleGasConfigList(6)
            startCoreStates = 25
         ELSE IF ((endCoreStates.GE.17).AND.&
461
&                 (ALL(xmlPrintCoreStates(1:17,iAtomType).EQV..FALSE.)).AND.&
462
&                 (ALL(xmlElectronStates(1:17,iAtomType).EQ.coreState_const))) THEN
463 464 465
            coreStatesString = nobleGasConfigList(5)
            startCoreStates = 18
         ELSE IF ((endCoreStates.GE.12).AND.&
466
&                 (ALL(xmlPrintCoreStates(1:12,iAtomType).EQV..FALSE.)).AND.&
467
&                 (ALL(xmlElectronStates(1:12,iAtomType).EQ.coreState_const))) THEN
468 469 470
            coreStatesString = nobleGasConfigList(4)
            startCoreStates = 13
         ELSE IF ((endCoreStates.GE.7).AND.&
471
&                 (ALL(xmlPrintCoreStates(1:7,iAtomType).EQV..FALSE.)).AND.&
472
&                 (ALL(xmlElectronStates(1:7,iAtomType).EQ.coreState_const))) THEN
473 474 475
            coreStatesString = nobleGasConfigList(3)
            startCoreStates = 8
         ELSE IF ((endCoreStates.GE.4).AND.&
476
&                 (ALL(xmlPrintCoreStates(1:4,iAtomType).EQV..FALSE.)).AND.&
477
&                 (ALL(xmlElectronStates(1:4,iAtomType).EQ.coreState_const))) THEN
478 479 480
            coreStatesString = nobleGasConfigList(2)
            startCoreStates = 5
         ELSE IF ((endCoreStates.GE.1).AND.&
481
&                 (ALL(xmlPrintCoreStates(1:1,iAtomType).EQV..FALSE.)).AND.&
482 483
&                 (ALL(xmlElectronStates(1:1,iAtomType).EQ.coreState_const))) THEN
            coreStatesString = nobleGasConfigList(1)
484 485 486
            startCoreStates = 2
         END IF
         DO i = startCoreStates, endCoreStates
487
            IF(xmlElectronStates(i,iAtomType).EQ.coreState_const) THEN
488 489 490
               coreStatesString = TRIM(ADJUSTL(coreStatesString)) // ' ' // coreStateList(i)
            END IF
         END DO
491 492 493 494 495
         DO i = 1, 29
            IF(xmlElectronStates(i,iAtomType).EQ.valenceState_const) THEN
               valenceStatesString = TRIM(ADJUSTL(valenceStatesString)) // ' ' // coreStateList(i)
            END IF
         END DO
496
         WRITE (fileNum,'(a)') '         <electronConfig>'
497
!         <coreConfig>[He] (2s1/2) (2p1/2) (2p3/2)</coreConfig>
498
         322 FORMAT('            <coreConfig>',a,'</coreConfig>')
499
         WRITE(fileNum,322) TRIM(ADJUSTL(coreStatesString))
500
         323 FORMAT('            <valenceConfig>',a,'</valenceConfig>')
501
         WRITE(fileNum,323) TRIM(ADJUSTL(valenceStatesString))
502 503
         DO i = startCoreStates, 29
            IF ((xmlElectronStates(i,iAtomType).NE.noState_const).AND.(xmlPrintCoreStates(i,iAtomType))) THEN
504
!         <coreStateOccupation state="(2s1/2)" spinUp="1.0" spinDown="1.0"/>
505
               325 FORMAT('            <stateOccupation state="',a,'" spinUp="',f0.8,'" spinDown="',f0.8,'"/>')
506
               WRITE(fileNum,325) coreStateList(i), xmlCoreOccs(1,i,iAtomType), xmlCoreOccs(2,i,iAtomType)
507 508
            END IF
         END DO
509
         WRITE (fileNum,'(a)') '         </electronConfig>'
510 511 512 513 514
      END IF

      DO ilo = 1, atoms%nlo(iAtomType)
!         <lo type="HELO" l="0" n="4"/>
         l = atoms%llo(ilo,iAtomType)
515 516 517 518
         n = INT(enpara%ello0(ilo,iAtomType,1))
         loType = 'SCLO'
         IF(n.LT.0) THEN
            loType = 'HELO'
519
         END IF
520 521 522
         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)
523 524
      END DO

525
      WRITE (fileNum,'(a)') '      </species>'
526
   END DO
527 528
   WRITE (fileNum,'(a)') '   </atomSpecies>'
   WRITE (fileNum,'(a)') '   <atomGroups>'
529 530 531 532 533 534
   na = 0
   DO iAtomType=1, atoms%ntype
      iSpecies = atomTypeSpecies(iAtomType)
!      <atomGroup species="Si-1">
      330 FORMAT('      <atomGroup species="',a,'">')
      tempNumberString = ''
535
      WRITE(tempNumberString,'(i0)') iSpecies
536
      speciesName = TRIM(ADJUSTL(noel(iAtomType))) // '-' // TRIM(ADJUSTL(tempNumberString))
537
      WRITE (fileNum,330) TRIM(ADJUSTL(speciesName))
538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557

      DO ieq=1,atoms%neq(iAtomType)
         na = na + 1
         tempTaual(1,na) = atoms%taual(1,na)
         tempTaual(2,na) = atoms%taual(2,na)
         tempTaual(3,na) = atoms%taual(3,na)
         DO i = 2,9
            rest = ABS(i*tempTaual(1,na) - NINT(i*tempTaual(1,na)) ) + ABS(i*tempTaual(2,na) - NINT(i*tempTaual(2,na)))
            IF (.not.input%film) THEN
               rest = rest + ABS(i*tempTaual(3,na) - NINT(i*tempTaual(3,na)) )
            END IF
            IF (rest.LT.(i*0.000001)) EXIT
         END DO
         scpos = 1.0
         IF (i.LT.10) scpos = real(i)  ! common factor found (x,y)
         DO i = 1,2
            tempTaual(i,na) = tempTaual(i,na)*scpos
         ENDDO
         IF (.not.input%film) tempTaual(3,na) = tempTaual(3,na)*scpos
         IF (input%film) THEN
558
            tempTaual(3,na) = dtild*tempTaual(3,na)/scale
559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574
         END IF
!+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
!-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>
            340 FORMAT('         <filmPos>',a,' ',a,' ',a,'</filmPos>')
            xPosString = ''
            yPosString = ''
            zPosString = ''
            IF((scpos.NE.1.0).AND.((tempTaual(1,na).NE.0.0).OR.(tempTaual(2,na).NE.0.0).OR.(tempTaual(3,na).NE.0.0))) THEN
575 576
               WRITE(xPosString,'(f0.10,a1,f0.10)') tempTaual(1,na), '/', scpos
               WRITE(yPosString,'(f0.10,a1,f0.10)') tempTaual(2,na), '/', scpos
577
            ELSE
578 579
               WRITE(xPosString,'(f0.10)') tempTaual(1,na)
               WRITE(yPosString,'(f0.10)') tempTaual(2,na)
580
            END IF
581
            WRITE(zPosString,'(f0.10)') tempTaual(3,na)
582
            WRITE (fileNum,340) TRIM(ADJUSTL(xPosString)),TRIM(ADJUSTL(yPosString)),TRIM(ADJUSTL(zPosString))
583 584 585 586 587 588 589
         ELSE
!         <relPos> x/myConstant  y/myConstant  z/myConstant</relPos>
            350 FORMAT('         <relPos>',a,' ',a,' ',a,'</relPos>')
            xPosString = ''
            yPosString = ''
            zPosString = ''
            IF((scpos.NE.1.0).AND.((tempTaual(1,na).NE.0.0).OR.(tempTaual(2,na).NE.0.0).OR.(tempTaual(3,na).NE.0.0))) THEN
590 591 592
               WRITE(xPosString,'(f0.10,a1,f0.10)') tempTaual(1,na), '/', scpos
               WRITE(yPosString,'(f0.10,a1,f0.10)') tempTaual(2,na), '/', scpos
               WRITE(zPosString,'(f0.10,a1,f0.10)') tempTaual(3,na), '/', scpos
593
            ELSE
594 595 596
               WRITE(xPosString,'(f0.10)') tempTaual(1,na)
               WRITE(yPosString,'(f0.10)') tempTaual(2,na)
               WRITE(zPosString,'(f0.10)') tempTaual(3,na)
597
            END IF
598
            WRITE (fileNum,350) TRIM(ADJUSTL(xPosString)),TRIM(ADJUSTL(yPosString)),TRIM(ADJUSTL(zPosString))
599 600 601 602
         END IF
      END DO
!         <force calculate="F" relaxX="T" relaxY="T" relaxZ="T"/>
      360 FORMAT('         <force calculate="',l1,'" relaxXYZ="',3l1,'"/>')
603
      WRITE (fileNum,360) atoms%l_geo(iAtomType),atoms%relax(1,iAtomType),atoms%relax(2,iAtomType),atoms%relax(3,iAtomType)
604

605 606 607 608 609 610 611 612
      IF(noco%l_noco.OR.l_explicit) THEN
         362 FORMAT('         <nocoParams l_relax="',l1,'" l_magn="',l1,'" M="',f0.10,'" alpha="',f0.10,'" beta="',&
                    f0.10,'" b_cons_x="',f0.10,'" b_cons_y="',f0.10,'"/>')
         WRITE(fileNum,362) noco%l_relax(iAtomType), Jij%l_magn(iAtomType), Jij%M(iAtomType), noco%alphInit(iAtomType),&
                            noco%beta(iAtomType),noco%b_con(1,iAtomType),noco%b_con(2,iAtomType)
      END IF


613
      WRITE (fileNum,'(a)') '      </atomGroup>'
614
   END DO
615
   WRITE (fileNum,'(a)') '   </atomGroups>'
616 617

   368 FORMAT('   <output dos="',l1,'" band="',l1,'" vacdos="',l1,'" slice="',l1,'">')
618
   WRITE (fileNum,368) banddos%dos,band,banddos%vacdos,sliceplot%slice
619 620 621

!      <checks vchk="F" cdinf="F" disp="F"/>
   370 FORMAT('      <checks vchk="',l1,'" cdinf="',l1,'" disp="',l1,'"/>')
622
   WRITE (fileNum,370) input%vchk,input%cdinf,obsolete%disp
623 624 625

!      <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,'"/>')
626
   WRITE (fileNum,380) banddos%ndir,banddos%e2_dos,banddos%e1_dos,banddos%sig_dos
627 628 629

!      <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"/>
   390 FORMAT('      <vacuumDOS layers="',i0,'" integ="',l1,'" star="',l1,'" nstars="',i0,'" locx1="',f0.8,'" locy1="',f0.8,'" locx2="',f0.8,'" locy2="',f0.8,'" nstm="',i0,'" tworkf="',f0.8,'"/>')
630
   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
631 632 633

!      <plotting iplot="F" score="F" plplot="F"/>
   400 FORMAT('      <plotting iplot="',l1,'" score="',l1,'" plplot="',l1,'"/>')
634
   WRITE (fileNum,400) sliceplot%iplot,input%score,sliceplot%plpot
635 636 637

!      <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,'"/>')
638
   WRITE (fileNum,410) sliceplot%kk,sliceplot%e1s,sliceplot%e2s,sliceplot%nnne,input%pallst
639 640 641

!      <specialOutput form66="F" eonly="F" bmt="F"/>
   420 FORMAT('      <specialOutput form66="',l1,'" eonly="',l1,'" bmt="',l1,'"/>')
642
   WRITE (fileNum,420) obsolete%form66,input%eonly,input%l_bmt
643

644
   WRITE (fileNum,'(a)') '   </output>'
645 646 647
   IF(l_outFile) THEN
      CALL closeXMLElement('inputData')
   ELSE
648 649 650
      WRITE (fileNum,'(a)') '</fleurInput>'
      CLOSE (fileNum)
   END IF
651 652 653

END SUBROUTINE w_inpXML
END MODULE m_winpXML