diff --git a/src/mode_create.f90 b/src/mode_create.f90 index 934895a..0b026c2 100644 --- a/src/mode_create.f90 +++ b/src/mode_create.f90 @@ -169,6 +169,7 @@ module mode_create integer :: ori_pos, i, j, arglen, stat character(len=100) :: textholder character(len=8) :: orient_string + logical :: isortho, isrighthanded !Pull out all required positional arguments @@ -224,8 +225,6 @@ module mode_create ! end do end do - - !If the duplicate command is passed then we extract the information on the new bounds. case('duplicate') if(dim_flag) STOP "Both duplicate and dim options cannot be used in mode_create" @@ -286,6 +285,13 @@ module mode_create end select !Now normalize the orientation matrix orient = matrix_normal(orient,3) + !Now check these to make sure they are right handed and orthogonal + call check_right_ortho(orient, isortho, isrighthanded) + if (.not.isortho) then + stop "Directions in orient are not orthogonal" + else if (.not.isrighthanded) then + stop "Directions in orient are not righthanded" + end if !Set lattice_num to 1 and add the lattice_parameter to the elements module lattice paramter variable lattice_types = 1 diff --git a/src/opt_delete.f90 b/src/opt_delete.f90 index 6475c75..09cefb1 100644 --- a/src/opt_delete.f90 +++ b/src/opt_delete.f90 @@ -21,8 +21,6 @@ module opt_delete call parse_delete(arg_pos) - print *, atom_num - if (rc_off > 0.0_dp) call delete_overlap end subroutine run_delete @@ -66,10 +64,6 @@ module opt_delete allocate(which_cell(3,atom_num)) - print *, atom_num - print *, for_delete(atom_num) - print *, which_cell(1,1) - !First pass the atom list and atom num to the algorithm which builds the cell list call build_cell_list(atom_num, r_atom, rc_off, cell_num, num_in_cell, cell_list, which_cell) diff --git a/src/subroutines.f90 b/src/subroutines.f90 index b681a54..4e3d9a9 100644 --- a/src/subroutines.f90 +++ b/src/subroutines.f90 @@ -358,4 +358,48 @@ module subroutines return end subroutine build_cell_list + + subroutine check_right_ortho(ori, isortho, isrighthanded) + !This subroutine checks whether provided orientations in the form: + ! | x1 x2 x3 | + ! | y1 y2 y3 | + ! | z1 z2 z3 | + !are right handed + + real(kind=dp), dimension(3,3), intent(in) :: ori + logical, intent(out) :: isortho, isrighthanded + + integer :: i, j + real(kind=dp) :: v(3), v_k(3) + !Initialize variables + isortho = .true. + isrighthanded=.true. + + do i = 1, 3 + do j = i+1, 3 + + if(abs(dot_product(ori(i,:), ori(j,:))) > lim_zero) then + isortho = .false. + end if + + !Check if they are righthanded + if (j == i+1) then + v(:) = cross_product(ori(i,:), ori(j,:)) + v_k(:) = v(:) - ori(mod(j, 3)+1,:) + else if ((i==1).and.(j==3)) then + v(:) = cross_product(ori(j,:),ori(i,:)) + v_k(:) = v(:) - ori(i+1, :) + end if + + if(norm2(v_k) > 10.0_dp**(-8.0_dp)) then + isrighthanded=.false. + end if + + end do + + end do + + return + end subroutine check_right_ortho + end module subroutines \ No newline at end of file