<?xml version="1.0"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
  xmlns:fpmd="http://www.quantum-simulation.org/ns/fpmd/fpmd-1.0"
  targetNamespace="http://www.quantum-simulation.org/ns/fpmd/fpmd-1.0">

  <annotation>
    <documentation> $Id: sample.xsd,v 1.12 2008-03-07 20:05:01 fgygi Exp $
      http://www.quantum-simulation.org
      FPMD sample XML Schema specification.
      Copyright (c) 2006-2008 The Regents of the University of California.
    </documentation>
  </annotation>

  <include schemaLocation="species.xsd"/>

  <element name="sample" type="fpmd:sampleType"/>
  <complexType name="sampleType">
    <sequence>
      <element name="description" type="string" minOccurs="0" maxOccurs="1"/>
      <element name="atomset" type="fpmd:atomsetType" minOccurs="0"/>
      <element name="wavefunction" type="fpmd:wavefunctionType" minOccurs="0"/>
      <element name="wavefunction_velocity"
         type="fpmd:wavefunctionType" minOccurs="0"/>
    </sequence>
  </complexType>

  <complexType name="atomsetType">
    <sequence minOccurs="0">
      <element name="unit_cell" type="fpmd:domainType"
               minOccurs="0"/>
      <element name="species" type="fpmd:speciesType"
               minOccurs="0" maxOccurs="unbounded"/>
      <element name="atom" type="fpmd:atomType"
               minOccurs="0" maxOccurs="unbounded"/>
    </sequence>
    <attribute name="href" type="anyURI" use="optional"/>
  </complexType>

  <complexType name="atomType">
    <sequence>
      <element name="position" type="fpmd:d3vectorType"/>
      <element name="velocity" minOccurs="0" type="fpmd:d3vectorType"/>
    </sequence>
    <attribute name="name" type="NMTOKEN" use="required"/>
    <attribute name="species" type="NMTOKEN" use="required"/>
  </complexType>

  <complexType name="wavefunctionType">
    <sequence minOccurs="0">
      <element name="domain" type="fpmd:domainType"/>
      <element name="reference_domain" minOccurs="0" type="fpmd:domainType"/>
      <element name="grid" type="fpmd:gridType"/>
      <element name="slater_determinant" type="fpmd:slater_determinantType"
               maxOccurs="unbounded"/>
    </sequence>
    <attribute name="ecut" type="fpmd:nonNegativeDouble" use="optional"/>
    <attribute name="nspin" type="fpmd:nspinType" use="required"/>
    <attribute name="nel" type="nonNegativeInteger" use="required"/>
    <attribute name="nempty" type="nonNegativeInteger" default="0"/>
    <attribute name="href" type="anyURI" use="optional"/>
  </complexType>

  <complexType name="domainType">
    <attribute name="a" type="fpmd:d3vectorType" use="required"/>
    <attribute name="b" type="fpmd:d3vectorType" use="required"/>
    <attribute name="c" type="fpmd:d3vectorType" use="required"/>
  </complexType>

  <complexType name="gridType">
    <attribute name="nx" type="positiveInteger" use="required"/>
    <attribute name="ny" type="positiveInteger" use="required"/>
    <attribute name="nz" type="positiveInteger" use="required"/>
  </complexType>

  <complexType name="slater_determinantType">
    <sequence minOccurs="0">
      <element name="density_matrix" type="fpmd:density_matrixType"/>
      <element name="grid_function" type="fpmd:grid_functionType"
               maxOccurs="unbounded"/>
    </sequence>
    <attribute name="spin" type="fpmd:spinType" use="optional"/>
    <attribute name="kpoint" type="fpmd:d3vectorType" use="required"/>
    <attribute name="weight" type="double" use="required"/>
    <attribute name="size" type="positiveInteger" use="required"/>
    <attribute name="href" type="anyURI" use="optional"/>
  </complexType>

  <simpleType name="nspinType">
    <restriction base="integer">
      <minInclusive value="1"/>
      <maxInclusive value="2"/>
    </restriction>
  </simpleType>

  <simpleType name="spinType">
    <restriction base="string">
    <enumeration value="up"/>
    <enumeration value="down"/>
    </restriction>
  </simpleType>

  <simpleType name="d3vectorType">
    <restriction>
       <simpleType>
         <list itemType="double"/>
       </simpleType>
       <length value="3"/>
    </restriction>
  </simpleType>

  <complexType name="vectorType">
    <simpleContent>
      <extension base="string">
      <attribute name="type" type="fpmd:numericType" use="required"/>
      <attribute name="size" type="positiveInteger" use="required"/>
      <attribute name="encoding" type="fpmd:encodingType" use="required"/>
      </extension>
    </simpleContent>
  </complexType>

  <simpleType name="numericType">
    <restriction base="string">
    <enumeration value="double"/>
    <enumeration value="complex"/>
    </restriction>
  </simpleType>

  <simpleType name="encodingType">
    <restriction base="string">
    <enumeration value="text"/>
    <enumeration value="base64"/>
    </restriction>
  </simpleType>

  <complexType name="grid_functionType">
    <simpleContent>
      <extension base="string">
      <attribute name="type" type="fpmd:numericType" use="required"/>
      <attribute name="nx" type="positiveInteger" use="required"/>
      <attribute name="ny" type="positiveInteger" use="required"/>
      <attribute name="nz" type="positiveInteger" use="required"/>
      <attribute name="x0" type="nonNegativeInteger" default="0"/>
      <attribute name="y0" type="nonNegativeInteger" default="0"/>
      <attribute name="z0" type="nonNegativeInteger" default="0"/>
      <attribute name="encoding" type="fpmd:encodingType" use="required"/>
      <attribute name="href" type="anyURI" use="optional"/>
      </extension>
    </simpleContent>
  </complexType>

  <complexType name="density_matrixType">
    <simpleContent>
      <extension base="fpmd:doubleListType">
        <attribute name="form" type="fpmd:density_matrix_formType" use="required"/>
        <attribute name="size" type="positiveInteger" use="required"/>
        <attribute name="href" type="anyURI" use="optional"/>
      </extension>
    </simpleContent>
  </complexType>

  <simpleType name="density_matrix_formType">
    <restriction base="string">
    <enumeration value="full"/>
    <enumeration value="diagonal"/>
    </restriction>
  </simpleType>

</schema>
