# Read in the collinear calculation
device_configuration = nlread('mgo_para.nc', DeviceConfiguration)[0]

# Use the special noncollinear mixing scheme
iteration_control_parameters = IterationControlParameters(
    algorithm=PulayMixer(noncollinear_mixing=True)
    )
# Get the calculator 
calculator = device_configuration.calculator()
new_calculator = calculator(
       exchange_correlation=NCGGA.PBE,
       iteration_control_parameters = iteration_control_parameters
       )
# Define the spin rotation
theta = 120*Degrees
left_spins = [(i, 1, 0*Degrees, 0*Degrees) for i in range(3)]
center_spins = [(i+3, 1, theta*i/5, 0*Degrees) for i in range(6)]
right_spins = [(i+9, 1, theta, 0*Degrees) for i in range(3)]
spin_list = left_spins+center_spins+right_spins
initial_spin = InitialSpin(scaled_spins=spin_list)

# Setup the initial state 
device_configuration.setCalculator(
    calculator=new_calculator, 
    initial_spin=initial_spin,
    initial_state=device_configuration)

# Calculate and save
device_configuration.update()
nlsave("mgo_nonco_dc.nc", device_configuration)
