# -------------------------------------------------------------
# Bulk Configuration
# -------------------------------------------------------------
# Set up lattice
lattice = FaceCenteredCubic(5.4306*Angstrom)

# Define elements
elements = [Silicon, Silicon]

# Define coordinates
fractional_coordinates = [[ 0.  ,  0.  ,  0.  ],
                          [ 0.25,  0.25,  0.25]]

# Set up configuration
bulk_configuration0 = BulkConfiguration(
    bravais_lattice=lattice,
    elements=elements,
    fractional_coordinates=fractional_coordinates
    )

# -------------------------------------------------------------
# Calculator
# -------------------------------------------------------------

potentialSet = Tersoff_Si_1988b()
calculator = TremoloXCalculator(parameters=potentialSet)
calculator.setVerletListsDelta(0.25*Angstrom)

bulk_configuration0.setCalculator(calculator)
bulk_configuration0.update()

bulk_configuration0 = OptimizeGeometry(
    bulk_configuration0,
    max_forces=0.001*eV/Ang,
    max_stress=0.01*GPa,
    max_steps=200,
    max_step_length=0.2*Ang,
    trajectory_filename=None,
    optimizer_method=LBFGS(),
    constrain_bravais_lattice=True,
)

# Repeat the configuration 3 times in each direction
bulk_configuration = bulk_configuration0.repeat(3, 3, 3)

# -------------------------------------------------------------
# Dynamical Matrix
# -------------------------------------------------------------
dynamical_matrix = DynamicalMatrix(
    configuration=bulk_configuration,
    repetitions=(3, 3, 3),
    atomic_displacement=0.01*Angstrom,
    acoustic_sum_rule=True,
    symmetrize=True,
    finite_difference_method=Central,
    processes_per_displacement=1,
    )

# -------------------------------------------------------------
# Special Thermal Displacement
# -------------------------------------------------------------
new_configuration = SpecialThermalDisplacement(
    bulk_configuration,
    dynamical_matrix,
    temperature=300*Kelvin,
    phonon_energy_interval=[1e-3, 1]*eV,
    )

nlsave('si_special_thermal_displacement.hdf5', new_configuration)
