Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - zhangguangping

Pages: 1 ... 4 5 [6] 7 8 ... 13
76
General Questions and Answers / Re: Bias loop question
« on: April 20, 2016, 01:59 »
Dear Anders,

Thanks for your reminder. I am not aware of there is a .current() method for TransmissionSpectrum class. If, say for self-consistent, one should use the same electrode bias as that in the self-consistent calculation. Otherwise, the transmission spectrum is calculated in a non self-consistent way. Also, if the bias effect is not important, one can approximately calculate a current-voltage curve using one converged density matrix.

With best.

Guangping

77
General Questions and Answers / Re: Bias loop question
« on: April 19, 2016, 17:29 »
Dear Anders,

Thanks for your reply.

You mean, if there is gate voltage or I have two different electrodes, in order to get a quick convergence, I had better to use electrode_voltages=(0.5*bias,-0.5*bias) than electrode_voltages=(1.0*bias, 0.0*bias)? And If I have the same electrode and there are no gate voltage, electrode_voltages=(0.5*bias,-0.5*bias) and electrode_voltages=(1.0*bias, 0.0*bias) are exactly the same?

Also, another qestion that may related to this thread that if I just want to get the transmission spectrum and current for 1.0 V based on a 0.0 V converged *nc file, I should write in the py file that

Code
device_configuration = nlread("Au-C6H4S2-Au-0.0.nc")[0]

calculator=calculator(
        electrode_voltages=(0.5*Volt, -0.5*Volt))

device_configuration.setCalculator(
      calculator(),
      initial_state=device_configuration)
device_configuration.update()
nlsave("Au-C6H4S2-Au-1.0.nc", device_configuration)

transmission_spectrum = TransmissionSpectrum(
    configuration=device_configuration,
    energies=numpy.linspace(-2,2,400)*eV,
    kpoints=MonkhorstPackGrid(6,6),
    energy_zero_parameter=AverageFermiLevel,
    infinitesimal=1.36057e-05*eV,
    self_energy_calculator=RecursionSelfEnergy(),
    )
nlsave("Au-C6H4S2-Au-1.0.nc", transmission_spectrum)
nlprint(transmission_spectrum)

iv_curve = IVCurve(
configuration=device_configuration,
biases=[1.0, ]*Volt,
energies=numpy.linspace(-2,2,101)*eV,
kpoints=MonkhorstPackGrid(6,6),
self_energy_calculator=RecursionSelfEnergy(),
energy_zero_parameter=AverageFermiLevel,
infinitesimal=1e-06*eV,
selfconsistent_configurations_filename="Au-C6H4S2-Au-1.0.nc",
)
nlsave('Au-C6H4S2-Au-1.0.nc', iv_curve)
nlprint(iv_curve)

For the transmission spectrum calculation, I have no doubt, but for the cuurrent calculation, I think the ATK will calculate again the transmission spectrum and then get the current. How can I calculate the current based on the already calculated transmission spectrum?

Thanks so much.

78
General Questions and Answers / Re: Bias loop question
« on: April 19, 2016, 14:11 »
Dear Anders,

As mads.engelund mentioned above, since if there is gate voltage, this matters how the source/drain bias are set, so I guess electrode_voltages=(0.5*bias,-0.5*bias) and electrode_voltages=(bias,0) are different in the actual dealing with the chemicalpotential of the two electrodes.

For the former specification, the left electrode is shifted down by 0.5*bias and the right electrode is shift up by 0.5*bias, while for the latter specification, only the left electrode is shifted by bias. Altought the relative potential differences is the same for these two cases, this will bring different congence steps for the two calculations if both of them are from converged electrode_voltages=(0,0).

Am I right?

With best regards,

Guangping

79
Dear Anders,

For the 2nd qestion, I read the tutorial here, and get some idea of the difference between device_configuration.update() and device_configuration.update(force_restart=True).
http://www.quantumwise.com/publications/tutorials/item/502-restarting-stopped-calculations

As I understand, device_configuration.update() is used with nlread() which give an initial_state and resulting a calculation with a previous result as an initial guess, this can also a restart of a previous stopped calculation. For example:
Code
old_calculation = nlread('Au-C6H4S2-Au-0.0.nc', DeviceConfiguration)[0]
device_configuration.setCalculator(
    calculator,
    initial_state=old_calculation,
)
device_configuration.update()
nlsave('Au-C6H4S2-Au-1.0.nc', device_configuration)
nlprint(device_configuration)
However, device_configuration.update(force_restart=True) is used with nlread() which read all the calcualtion settings of a previous calculation, and using the SCF information usually the last SCF density matrix to do a restart calculation of the stopped job. For example, the above script if use the restart method to do the continue calculation should be
Code
device_configuration = nlread('Au-C6H4S2-Au-0.0-checkpoint.nc')[0]
device_configuration.update(force_restart=True)
nlsave('Au-C6H4S2-Au-1.0.nc', device_configuration)
nlprint(device_configuration)

Am I right, if any misunderstanding, please correct them !

Can Au-C6H4S2-Au-0.0.nc which generated by nlsave('Au-C6H4S2-Au-0.0.nc', device_configuration) be used as the checkpoint file for Au-C6H4S2-Au-0.0-checkpoint.nc which should be generated by CheckpointHandler? I think they should be different. The former only contains the converged scf density matrix if the NEGF is done, and if the exectuable stops at the SCF iteration, then there is no density matrix in Au-C6H4S2-Au-0.0.nc. Intead, the latter one should be generated by the CheckpointHandler in DeviceLCAOCalculator for a two probe system for example, which would update itself during the self-consistent calculation, and contains the density matrix of the last scf step.

Therefore, Au-C6H4S2-Au-0.0-checkpoint.nc can be used as a restart checkpoint and also as an initial guess for a calculation. If the NEGF is done, Au-C6H4S2-Au-0.0.nc can be used in the same way as Au-C6H4S2-Au-0.0-checkpoint.nc, while if the executable stops during the SCF interation, Au-C6H4S2-Au-0.0.nc either can not used as a restart checkpoint nor as an initial guess for a calculation since there is no density matrix information.

Thanks so much !

With best.

/Guangping

80
General Questions and Answers / Re: parallelization and ATK
« on: April 19, 2016, 09:06 »
Dear Pieter,

Thanks very much for your reply. I now just learn something about ATK before I really use it. So, if possible and needed, I would turn to you for the help.

Also, I find the forum a very good place to find some solutions to my question by using search function. However, I find I can not collect the topics for later usage if I find them useful. The NOTIFY function may can do this, but I can not give a note for each notify, so that I can quick recongnize what this topic I collect it for.

With best regards.

/Guangping

81
Dear Anders,

Thanks for your reply very much.

Quote
With respect to electrode_voltages=( 0.0*Volt, 1.0*Volt), how would ATK do for the shift of chemicalpotentials of the electrodes relative to the equilibrium ones? Will ATK only shift the right electrode down by 1.0 eV? Or instead, ATK would shift down the right electrode by 0.5 eV and shift up the left electrode by 0.5 eV. I think the latter technique would be favorable to the convergence.

(1) So, how about the deal with the voltage applized to the electrodes in ATK?

(2) And I am puzzling about the force_restart=True in device_configuration.update(), that is what is the difference between device_configuration.update() and device_configuration.update(force_restart=True) since they both trigger a calculation?

(3) Can you please give more instructions on what is the idea of giving an initial guess for the configuration with anti-parallel spin polarizaton of the electrodes in a magnetic tunnel junction (MTJ) from the converged state of the parallel electrode calculation.Special example: anti-parallel spin in MTJs?
http://www.quantumwise.com/publications/tutorials/item/503-saving-time-by-initializing-a-calculation-from-the-converged-state-of-another
Because I think the convergence behavior and results of spin polarization calculations depend severly on the initial guess. So, a large deviation of parallel electrode calculation from an anti-parallel spin polarizaton of the electrodes would be good initial guess for the anti-parallel spin polarizaton of the electrodes? I am really hard to image that.

With best regards,

/Guangping

82
It simply depends on whether you read the whole file, or parts of it. The following points should be noted:

Dear Anders,

For saving time by initializing a calculation from the converged state of another, for example, use the converged 0.0V *nc file to initialized the 1.0V calcualtion for the very same system except the bias increased from 0.0 V to 1.0 V, as described in this tutorial
http://www.quantumwise.com/publications/tutorials/item/503-saving-time-by-initializing-a-calculation-from-the-converged-state-of-another
if I suppose the core part of the input file for 0.0 V is as follows
Code
#----------------------------------------
# Device Calculator
#----------------------------------------
calculator = DeviceLCAOCalculator(
    basis_set=basis_set,
    exchange_correlation=exchange_correlation,
    numerical_accuracy_parameters=device_numerical_accuracy_parameters,
    iteration_control_parameters=device_iteration_control_parameters,
    contour_parameters=contour_parameters,
    electrode_calculators=
        [left_electrode_calculator, right_electrode_calculator],
    )

device_configuration.setCalculator(calculator)
nlprint(device_configuration)
device_configuration.update()
nlsave('Au-C6H4S2-Au-0.0.nc', device_configuration)

I need to reivse this part of the input file into

Code
#----------------------------------------
# Device Calculator
#----------------------------------------
calculator = DeviceLCAOCalculator(
    basis_set=basis_set,
    exchange_correlation=exchange_correlation,
    numerical_accuracy_parameters=device_numerical_accuracy_parameters,
    electrode_calculators=
        [left_electrode_calculator, right_electrode_calculator],
    electrode_voltages=( 0.0*Volt, 1.0*Volt)
    )

device_configuration.setCalculator(calculator)

# -------------------------------------------------------------
# Initial State
# -------------------------------------------------------------
old_calculation = nlread('Au-C6H4S2-Au-0.0.nc', DeviceConfiguration)[0]
device_configuration.setCalculator(
    calculator,
    initial_state=old_calculation,
)
device_configuration.update()
nlsave('Au-C6H4S2-Au-1.0.nc', device_configuration)
nlprint(device_configuration)

or even a more simpler one

Code
# -------------------------------------------------------------
# Initial State
# -------------------------------------------------------------
old_calculation = nlread('Au-C6H4S2-Au-0.0.nc', DeviceConfiguration)[0]
device_configuration.setCalculator(
    calculator(electrode_voltages=( 0.0*Volt, 1.0*Volt)),
    initial_state=old_calculation,
)
device_configuration.update()
nlsave('Au-C6H4S2-Au-1.0.nc', device_configuration)
nlprint(device_configuration)

Am I correct?
As I understand, device_configuration.setCalculator() does not trigger a real calculation, but just update the settings for the calculation, while device_configuration.update() indeed would trigger the DFT-NEGF SCFs, right?

For the above script for 1.0 V, the exectuable would do the left and right electrode calculations again?
If so, how to aviod a repeat calculation for the electrodes here, since only shifts of the chemcialpotential are applied to the electrodes?
I do not find a setCalculator method for LCAOCalculator used for electrode calculations as that for DeviceLCAOCalculator, where an initial_state method can be used to give an initial state for the electrode calcualtions.

Also, I did not find the I-V mini-tutorial  mentioned in the above tutorial for stepping up in bias in I-V calculations.

With respect to electrode_voltages=( 0.0*Volt, 1.0*Volt), how would ATK do for the shift of chemicalpotentials of the electrodes relative to the equilibrium ones? Will ATK only shift the right electrode down by 1.0 eV? Or instead, ATK would shift down the right electrode by 0.5 eV and shift up the left electrode by 0.5 eV. I think the latter technique would be favorable to the convergence.

With best regards,

/Guangping

83
Yeh, good to know this.

Thanks so much.

84
Yah, an excellent explaination of this! Indeed, when I post the thread, I realized that the [ 0 ] is for counting the list. I should mean gD000 or gD001, etc.

Thank you very much Anders.

With best regards,

/Guangping

85
Dear all,

I have learning on how to restart/resore or even do the post analysis based on a converged *.nc file in ATK-2015.1.

I found here the tutorial very useful for the psot analysis based on a converged *.nc file
http://www.quantumwise.com/publications/tutorials/item/504-computing-quantities-from-converged-calculations

The trick to use a converged *.nc file doing a post analysis with out any futher SCFs is to use nlread, eg., the following is to do a total energy calculation based on the already converged Au-C6H4S2-Au.nc file.

Code
# -------------------------------------------------------------
# Analysis from File
# -------------------------------------------------------------
configuration = nlread('Au-C6H4S2-Au.nc', object_id='gID000')[0]

# -------------------------------------------------------------
# Total Energy
# -------------------------------------------------------------
total_energy = TotalEnergy(configuration)
nlsave('analysis.nc', total_energy)
nlprint(total_energy)

Code
Next, check that the Object id corresponds to the self-consistent calculation you want to base the analysis on. If your calculation was a "standard run", then most likely the default gID001 is the one you want. However, if you did a geometry optimization, gID000 corresponds to the initial geometry, and the optimized geometry will be gID001. You can inspect the contents of the NetCDF file, and the object ids, in the Result Browser in the main VNL job.

Note: nlread() can in principle read many objects at once from a NetCDF file. Object ids must however be unique, so by using the object_id keyword, you are guaranteed to get only one object back. However, nlread() always returns a list of objects, even if there is only one match, so we need the [0] to pick out the first/only configuration matching the object_id.

However, I think there maybe something worth to emphasize. That is,
Code
configuration = nlread('Au-C6H4S2-Au.nc', object_id='gID000')[0]
we should specify the object_id properly and may not be the gID000 one. It depends on your number of nlsave used in the job generating this *.nc file and also the quantities you want to base for the post analysis, usually the object_id contains the converged electron density not others would be expected to used for the post analysis.

The number of object_id in the *.nc file depends on the nlsave used in the job generating this *.nc. So, usually and most probably the first object_id that is gID000 is not the one contains the converged electron density.

For example, the following *.py input file contains 6 nlsave sentances and the second object_id that is gID001 is what we need to do the total energy post analysis.
Code
# -------------------------------------------------------------
# Two-probe Configuration
# -------------------------------------------------------------

# -------------------------------------------------------------
# Left Electrode
# -------------------------------------------------------------

# Set up lattice
vector_a = [8.65127, 0.0, 0.0]*Angstrom
vector_b = [-4.32564, 7.49222, 0.0]*Angstrom
vector_c = [0.0, 0.0, 7.06373620597]*Angstrom
left_electrode_lattice = UnitCell(vector_a, vector_b, vector_c)

# Define elements
left_electrode_elements = [...
                              ...
                              ...]

# Define coordinates
left_electrode_coordinates = [...
                              ...
                              ...]*Angstrom

# Set up configuration
left_electrode = BulkConfiguration(
    bravais_lattice=left_electrode_lattice,
    elements=left_electrode_elements,
    cartesian_coordinates=left_electrode_coordinates
    )

# -------------------------------------------------------------
# Right Electrode
# -------------------------------------------------------------

# Set up lattice
vector_a = [8.65127, 0.0, 0.0]*Angstrom
vector_b = [-4.32564, 7.49222, 0.0]*Angstrom
vector_c = [0.0, 0.0, 7.06373620597]*Angstrom
right_electrode_lattice = UnitCell(vector_a, vector_b, vector_c)

# Define elements
right_electrode_elements = [...
                              ...
                              ...]

# Define coordinates
right_electrode_coordinates = [...
                              ...
                              ...]*Angstrom

# Set up configuration
right_electrode = BulkConfiguration(
    bravais_lattice=right_electrode_lattice,
    elements=right_electrode_elements,
    cartesian_coordinates=right_electrode_coordinates
    )

# -------------------------------------------------------------
# Central Region
# -------------------------------------------------------------

# Set up lattice
vector_a = [8.65127, 0.0, 0.0]*Angstrom
vector_b = [-4.32564, 7.49222, 0.0]*Angstrom
vector_c = [0.0, 0.0, 26.1041296975]*Angstrom
central_region_lattice = UnitCell(vector_a, vector_b, vector_c)

# Define elements
central_region_elements = [...
                              ...
                              ...]

# Define coordinates
central_region_coordinates = [...
                              ...
                              ...]

# Set up configuration
central_region = BulkConfiguration(
    bravais_lattice=central_region_lattice,
    elements=central_region_elements,
    cartesian_coordinates=central_region_coordinates
    )

device_configuration = DeviceConfiguration(
    central_region,
    [left_electrode, right_electrode]
    )
nlsave('Au-C6H4S2-Au.nc', device_configuration)     # the 1st one  gID000
nlprint(device_configuration)

# -------------------------------------------------------------
# Calculator
# -------------------------------------------------------------
#----------------------------------------
# Basis Set
#----------------------------------------
basis_set = [
    GGABasis.Hydrogen_DoubleZetaPolarized(element=Hydrogen,filter_mesh_cutoff=200*Rydberg),
    GGABasis.Carbon_DoubleZetaPolarized(element=Carbon,filter_mesh_cutoff=200*Rydberg),
    GGABasis.Sulfur_DoubleZetaPolarized(element=Sulfur,filter_mesh_cutoff=200*Rydberg),
    GGABasis.Gold_SingleZetaPolarized(element=Gold,filter_mesh_cutoff=200*Rydberg),
    ]

#----------------------------------------
# Exchange-Correlation
#----------------------------------------
exchange_correlation = GGA.PBE

#----------------------------------------
# Numerical Accuracy Settings
#----------------------------------------
left_electrode_numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=(6, 6, 20),
    density_mesh_cutoff=200.0*Rydberg,
    )

right_electrode_numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=(6, 6, 20),
    density_mesh_cutoff=200.0*Rydberg,
    )

device_numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=(6, 6, 20),
    density_mesh_cutoff=200.0*Rydberg,
    )

#----------------------------------------
# Iteration Control Settings
#----------------------------------------
left_electrode_iteration_control_parameters = IterationControlParameters(
    max_steps=500,
    )

right_electrode_iteration_control_parameters = IterationControlParameters(
    max_steps=500,
    )

device_iteration_control_parameters = IterationControlParameters(
    max_steps=500,
    )

#----------------------------------------
# Poisson Solver Settings
#----------------------------------------
left_electrode_poisson_solver = FastFourier2DSolver(
    boundary_conditions=[[PeriodicBoundaryCondition,PeriodicBoundaryCondition],
                         [PeriodicBoundaryCondition,PeriodicBoundaryCondition],
                         [PeriodicBoundaryCondition,PeriodicBoundaryCondition]]
    )

right_electrode_poisson_solver = FastFourier2DSolver(
    boundary_conditions=[[PeriodicBoundaryCondition,PeriodicBoundaryCondition],
                         [PeriodicBoundaryCondition,PeriodicBoundaryCondition],
                         [PeriodicBoundaryCondition,PeriodicBoundaryCondition]]
    )

#----------------------------------------
# Contour Integral Settings
#----------------------------------------
contour_parameters = DoubleContourIntegralParameters(
    integral_lower_bound=50.0*eV,
    )

#----------------------------------------
# Electrode Calculators
#----------------------------------------
left_electrode_calculator = LCAOCalculator(
    basis_set=basis_set,
    exchange_correlation=exchange_correlation,
    numerical_accuracy_parameters=left_electrode_numerical_accuracy_parameters,
    iteration_control_parameters=left_electrode_iteration_control_parameters,
    poisson_solver=left_electrode_poisson_solver,
    )

right_electrode_calculator = LCAOCalculator(
    basis_set=basis_set,
    exchange_correlation=exchange_correlation,
    numerical_accuracy_parameters=right_electrode_numerical_accuracy_parameters,
    iteration_control_parameters=right_electrode_iteration_control_parameters,
    poisson_solver=right_electrode_poisson_solver,
    )

#----------------------------------------
# Device Calculator
#----------------------------------------
calculator = DeviceLCAOCalculator(
    basis_set=basis_set,
    exchange_correlation=exchange_correlation,
    numerical_accuracy_parameters=device_numerical_accuracy_parameters,
    iteration_control_parameters=device_iteration_control_parameters,
    contour_parameters=contour_parameters,
    electrode_calculators=
        [left_electrode_calculator, right_electrode_calculator],
    )

device_configuration.setCalculator(calculator)
nlprint(device_configuration)
device_configuration.update()
nlsave('Au-C6H4S2-Au.nc', device_configuration)    # the 2nd one  gID001
nlprint( )

# -------------------------------------------------------------
# Transmission Spectrum
# -------------------------------------------------------------
transmission_spectrum = TransmissionSpectrum(
    configuration=device_configuration,
    energies=numpy.linspace(-2,2,400)*eV,
    kpoints=MonkhorstPackGrid(6,6),
    energy_zero_parameter=AverageFermiLevel,
    infinitesimal=1.36057e-05*eV,
    self_energy_calculator=RecursionSelfEnergy(),
    )
nlsave('Au-C6H4S2-Au.nc', transmission_spectrum)    # the 3rd one gID002
nlprint(transmission_spectrum)

# -------------------------------------------------------------
# Molecular Energy Spectrum
# -------------------------------------------------------------
molecular_energy_spectrum = MolecularEnergySpectrum(
    configuration=device_configuration,
    energy_zero_parameter=FermiLevel,
    projection_list=ProjectionList(elements=[Carbon, Hydrogen, Sulfur])
    )
nlsave('Au-C6H4S2-Au.nc', molecular_energy_spectrum)   # the 4th one gID003
nlprint(molecular_energy_spectrum)

# -------------------------------------------------------------
# Eigenstate
# -------------------------------------------------------------
eigenstate = Eigenstate(
    configuration=device_configuration,
    projection_list=ProjectionList(elements=[Carbon, Hydrogen, Sulfur]),
    quantum_number=19,
    )
nlsave('Au-C6H4S2-Au.nc', eigenstate)                             # the 5th one   gID004
nlprint( )

# -------------------------------------------------------------
# Eigenstate
# -------------------------------------------------------------
eigenstate = Eigenstate(
    configuration=device_configuration,
    projection_list=ProjectionList(elements=[Carbon, Hydrogen, Sulfur]),
    quantum_number=20,
    )
nlsave('Au-C6H4S2-Au.nc', eigenstate)                            # the 6th one   gID005
nlprint( )

The first object_id, i.e., gID000 only contain only the configuration (lattice vectors and atom positions) of the two probe system.
The converged electron density is stored in the second object_id, i.e., gID001.
So, the post analysis input file should read
Code
# -------------------------------------------------------------
# Analysis from File
# -------------------------------------------------------------
configuration = nlread('Au-C6H4S2-Au.nc', object_id='gID001')[0]

# -------------------------------------------------------------
# Total Energy
# -------------------------------------------------------------
total_energy = TotalEnergy(configuration)
nlsave('analysis.nc', total_energy)
nlprint(total_energy)

86
General Questions and Answers / Re: parallelization and ATK
« on: April 18, 2016, 16:44 »
Dear Pieter,

As pointed out here http://quantumwise.com/documents/tutorials/latest/ParallelGuide/index.html/chap.strategy.html, the FFT solver can take benifit of the MKL threading. Can the FFT solver take the advantage of MPI parallelization? As I know, MKL can threading as well as paralling over MPI.

Thanks very much.

With best regards,

Guangping

87
Dear all,

Also, I find the ATK-Classical gives a wrong geometry results. For a molecule that is optimzed by ATK-DFT, the ATK-Classical gives a dissociation molecule structure. So, use the ATK-Classical with care.

With best regards,

/Guangping

88
Dear Umberto Martinez,

You mentioned that one does not need the dipole correction in the middle of the vacuum region which can  be applied in VASP for a molecule adsorbed metal surface in the thread http://quantumwise.com/forum/index.php?topic=2666.0.

In ATK, if one use a vacum large enough, then the dipole correction can be ignored? If we use ghost atoms at the metal surface, do the ghost atoms be chosen to move or fix during the geometry optimization? As far as know, the use of ghost atoms will be problmatic in the geomtry optization.

With best regards,

/Guangping

89
Dear all,

In addition, I find one can not use ATK-Classical method to do a geometric relaxation for two probe systems if there are molecules and metal electrodes.

How to solve this problem? Can we define the potentials for different kinds of atoms, respectively? If not, we can only use ATK-SE to speed up the geometry optimization?

With best regards,

/Guangping

90
Dear all,

I have now learning about the geometric opimzation for a two probe systems. I learn from this tutorial http://docs.quantumwise.com/tutorials/device_relaxation.html .

As the tutorial metioned there are two ways to optimize the gometries for two probe systems: BRR method and 1D minimization.

Let me simplify the process of the optimization, we suppose that the geometry of the electrodes are in their equilibrium condition so that we do not need to optimize the geometries for the electrode. All we should do is to optimize the geometry stuctures of the electrode surfaces and the adsorbed molecule between in the two electrodes.

As I understand, in BRR method, we use a two-slab system to do the optimization, and usually electrode extensions and the screening layers are included to account the interaction between the screening layers and the molecule, the electrode extensions here give a bulk electrode environment for the screening layers. Also, the C lattice vector should be large enough to aviod the interaction of the left electrode with the image of the right electrode when using periodic boundary condition. In this term, the whole system can be optimzed in the C direction as well as the A, B directions. During the optimization, we can make a fully opimizaiton for the molecule and the surface screening layers while make the electrode extensions frozen (one electrode fixed and the other a rigid box that move ridgid in the optimization, which can partially optimize the distance between the two electrode extensions). In this way, we can partially optimze the geometry structure of the core region of the two probe system. However, the final "optimized" geometry would not necessarily the energy lowest configure, but usually colse to that. The optimzation stop when each freedom in the optimzation meets the force criteria, not using the total energy of the target. The method can be effective, and this is what I have always used in the SIESTA code.

Meanwhile, the tutorial metioned another opimization method, the so called 1D minimization.

Code
A somewhat more brute-force approach is to explicitly minimize the device total energy wrt. internal coordinates and the central region length, i.e., do the full 2-probe calculations and vary the central region length. This is a 1D minimization problem with relaxation of the atomic positions at each step, so we shall refer to this method as 1DMIN.

As I understand, the 1DMIN method will do a optimization of the two probe system using an energy minization with respect to the internal coordinates and the central region length. In this case, the distance between the two electrode (or lattice vector C) are sampled for some values around the one given as the inital. For each electrode distance( or lattice vector C), the centrol region will be fully opimized with the electrode extensions fixed. One can get the energy lowest configure (also the  intermediate optimized configuration) for this electrode distance, and record its energy with respect to this electrode distance. Do this opimization for all the sampled electrode distance, we can plot the energy of the system wit respect to the electrode distance. Then we can  extrapolate the optimal electrode distance (lattice vector C). At last, we do the gometry optimzation under the optimal electrode distance, and get the optimzed geometry for the two probe system. This can be called a globle optimization.

Is my understanding right, please correct it if there is any misundertanding?

Yet, I have qestions about the 1DMIN method. What is the total energy for?  Is it for the total two-probe system: Left electrode+Central region+Righ electrode? During this optimzation, both the electrodes and electrode extensions will be moved rigid along with the optimzaiton of the C lattice vector?
Can the atoms in the screening layers and molecule suffer constrains set by the user? In this case, it is not a full optimization, the user can set some constrains to the core region of the system, eg. user can fix the anchor atoms of the molecule to the hollow sites of the surface and can set the outmost of the screening layers to move rigid together with the electrode extensions, etc?

With best regards,

Guangping

Pages: 1 ... 4 5 [6] 7 8 ... 13