Index in position 3 exceeds array bounds

following is the code where the error is occuring:
function sim_data = frac_and_disp(sim_data)
% Calculate cartesian coordinates and the displacement of the atoms...
disp('Transforming cartesian to fractional coordinates and calculating displacement')
sim_data.frac_pos = zeros(3, sim_data.nr_atoms, sim_data.nr_steps);
sim_data.displacement = zeros(sim_data.nr_atoms, sim_data.nr_steps);
d = zeros(3,1);
for atom = 1:sim_data.nr_atoms
uc = [0 0 0]; % Keep track of the amount of unit cells the atom has moved
%For the first time step:
sim_data.frac_pos(:,atom,1) = sim_data.cart_pos(:,atom,1)/sim_data.lattice;
start = sim_data.cart_pos(:,atom,1); % Starting position
for time = 2:sim_data.nr_steps
sim_data.frac_pos(:,atom,time) = sim_data.cart_pos(:,atom,time)/sim_data.lattice;
for i = 1:3
frac_diff = sim_data.frac_pos(i,atom,time)-sim_data.frac_pos(i,atom,time-1);
% If frac_pos differs by more than 0.5 from the previous time step the atom changed unit cell
if frac_diff > 0.5
uc(i) = uc(i)-1;
elseif frac_diff < -0.5
uc(i) = uc(i)+1;
end
end
% Calculate displacement:
for i = 1:3
d(i) = ( sim_data.cart_pos(i,atom,time) - start(i) + uc*sim_data.lattice(:,i) )^2;
end
sim_data.displacement(atom,time) = sqrt(sum(d));
end
end
end

4 Comments

We don't have the data to run your code, nor do we know where the error is occuring.
Please attach the data (use the paperclip button to do so) and copy-paste the full error message i.e. all of the red text.
index in position 3 exceeds array bounds.
Error in frac_and_disp (line 11)
sim_data.frac_pos(:,atom,1) = sim_data.cart_pos(:,atom,1)/sim_data.lattice;
data is being taken from OUTCAR file of VASP
I'm not familiar with VASP.
Please provide a link to access the data or upload it here.

Sign in to comment.

Answers (1)

Evidently sim_data.cart_pos does not have 3 dimensions. What does this show if you put it just before that line that throws the error?
size(sim_data.cart_pos)
What size is reported to the command window?
Please see this so you can do what all the rest of us do:

2 Comments

"Evidently sim_data.cart_pos does not have 3 dimensions."
The 3rd dimension should be a singleton one but it does exist.
And as OP is trying to acces the 1st page of the 3rd dimension, it should work, even if the 3rd dimension is not defined explicitly.
y = magic(5)
y = 5×5
17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9
y(1,2,1)
ans = 24
z = rand(1,10)
z = 1×10
0.5882 0.3849 0.4663 0.3267 0.1466 0.7569 0.0844 0.6456 0.3476 0.0765
z(1,3,1)
ans = 0.4663
The index in position 3 of
sim_data.frac_pos(:,atom,1) = sim_data.cart_pos(:,atom,1)/sim_data.lattice;
is 1 and it's a constant so I don't know what index they're talking about. But I see another potential problem. What is
size(sim_data.lattice)
? If that is a 2-D array, and the user is thinking that sim_data.cart_pos(:,atom,1) is another 2-D array, that might be a problem. Might try squeeze, and maybe ./ should be used instead of / alone unless you were hoping for some kind of automatic expansion.
tempArray = squeeze(sim_data.cart_pos(:,atom,1)) ./ sim_data.lattice;
size(tempArray)
sim_data.frac_pos(:,atom,1) = tempArray;
If that doesn't work, maybe try a for loop to assign one element at a time.

Sign in to comment.

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!