I have a trouble understanding that why ionic relaxation is enabled in the elastic_constant workflow (i.e., {“IBRION”: 2, “NSW”: 99, “ISIF”: 2, “ISTART”: 1, “PREC”: “High”})?

My expectation for elastic constant calculation is that static calculation (fix cell “ISIF”: 2, and fix atoms “NSW”: 0) is performed for each distorted structure. Then, the full stress tensor is obtained from the static calculation.

Here is a brief comments in the Atomate code:

vasp_input_set (VaspInputSet): vasp input set to be used. Defaults to static
set with ionic relaxation parameters set. Take care if replacing this,
default ensures that ionic relaxation is done and that stress is calculated
for each vasp run.

What you’re describing is the clamped-ion elastic constant. Here we compute the full elastic tensor, which has an ionic relaxation portion as well. Typically elastic constants are only valid in the “slow” deformation limit, in which ions have sufficient time to relax in response to an incremental stress or strain.

One more question I have is related to the comments.

As it claimed that ionic relaxation is done and stress is calculated for each vasp run. But when analyzing Stress/Strain data and fit the elastic tensor, only the last step of relaxation is used. Do I understand correctly? or the stress from each ionic step is actually used in analyzing?

Just the stress from the last ionic step from each VASP run. A series of ionic steps as VASP tries to find the local minima is a single VASP run, not each step. The steps during that optimization are higher energy/forces, which means they are not useful for computing the elastic tensor. They can be used to compute other properties such as the internal stress tensor.