Added right hand rule check to orientation in mode_create
This commit is contained in:
parent
9702ec85e9
commit
1b82d98a4f
@ -169,6 +169,7 @@ module mode_create
|
|||||||
integer :: ori_pos, i, j, arglen, stat
|
integer :: ori_pos, i, j, arglen, stat
|
||||||
character(len=100) :: textholder
|
character(len=100) :: textholder
|
||||||
character(len=8) :: orient_string
|
character(len=8) :: orient_string
|
||||||
|
logical :: isortho, isrighthanded
|
||||||
|
|
||||||
|
|
||||||
!Pull out all required positional arguments
|
!Pull out all required positional arguments
|
||||||
@ -224,8 +225,6 @@ module mode_create
|
|||||||
! end do
|
! end do
|
||||||
end do
|
end do
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
!If the duplicate command is passed then we extract the information on the new bounds.
|
!If the duplicate command is passed then we extract the information on the new bounds.
|
||||||
case('duplicate')
|
case('duplicate')
|
||||||
if(dim_flag) STOP "Both duplicate and dim options cannot be used in mode_create"
|
if(dim_flag) STOP "Both duplicate and dim options cannot be used in mode_create"
|
||||||
@ -286,6 +285,13 @@ module mode_create
|
|||||||
end select
|
end select
|
||||||
!Now normalize the orientation matrix
|
!Now normalize the orientation matrix
|
||||||
orient = matrix_normal(orient,3)
|
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
|
!Set lattice_num to 1 and add the lattice_parameter to the elements module lattice paramter variable
|
||||||
lattice_types = 1
|
lattice_types = 1
|
||||||
|
@ -21,8 +21,6 @@ module opt_delete
|
|||||||
|
|
||||||
call parse_delete(arg_pos)
|
call parse_delete(arg_pos)
|
||||||
|
|
||||||
print *, atom_num
|
|
||||||
|
|
||||||
if (rc_off > 0.0_dp) call delete_overlap
|
if (rc_off > 0.0_dp) call delete_overlap
|
||||||
end subroutine run_delete
|
end subroutine run_delete
|
||||||
|
|
||||||
@ -66,10 +64,6 @@ module opt_delete
|
|||||||
|
|
||||||
allocate(which_cell(3,atom_num))
|
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
|
!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)
|
call build_cell_list(atom_num, r_atom, rc_off, cell_num, num_in_cell, cell_list, which_cell)
|
||||||
|
|
||||||
|
@ -358,4 +358,48 @@ module subroutines
|
|||||||
return
|
return
|
||||||
end subroutine build_cell_list
|
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
|
end module subroutines
|
Loading…
x
Reference in New Issue
Block a user