Working read from pycac.out file format
This commit is contained in:
parent
dadc1f7a4a
commit
5949f04103
@ -1,7 +1,7 @@
|
|||||||
FC=ifort
|
FC=ifort
|
||||||
FFLAGS=-mcmodel=large -g -O0 -stand f08 -fpe0 -traceback -check bounds,uninit -warn all -implicitnone -no-wrap-margin -heap-arrays
|
FFLAGS=-mcmodel=large -g -O0 -stand f08 -fpe0 -traceback -check bounds,uninit -warn all -implicitnone -no-wrap-margin -heap-arrays
|
||||||
#FFLAGS=-mcmodel=large -Ofast -no-wrap-margin -heap-arrays
|
#FFLAGS=-mcmodel=large -Ofast -no-wrap-margin -heap-arrays
|
||||||
MODES=mode_create.o mode_merge.o mode_convert.o
|
MODES=mode_create.o mode_merge.o mode_convert.o
|
||||||
OPTIONS=opt_disl.o opt_group.o opt_orient.o opt_delete.o opt_deform.o opt_redef_box.o
|
OPTIONS=opt_disl.o opt_group.o opt_orient.o opt_delete.o opt_deform.o opt_redef_box.o
|
||||||
OBJECTS=main.o elements.o io.o subroutines.o functions.o atoms.o call_mode.o box.o $(MODES) $(OPTIONS) call_option.o sorts.o
|
OBJECTS=main.o elements.o io.o subroutines.o functions.o atoms.o call_mode.o box.o $(MODES) $(OPTIONS) call_option.o sorts.o
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
subroutine call_mode(arg_pos,mode)
|
subroutine call_mode(arg_pos)
|
||||||
!This code is used to parse the command line argument for the mode information and calls the required
|
!This code is used to parse the command line argument for the mode information and calls the required
|
||||||
!mode module.
|
!mode module.
|
||||||
|
|
||||||
@ -10,7 +10,6 @@ subroutine call_mode(arg_pos,mode)
|
|||||||
implicit none
|
implicit none
|
||||||
|
|
||||||
integer, intent(out) :: arg_pos
|
integer, intent(out) :: arg_pos
|
||||||
character(len=100), intent(in) :: mode
|
|
||||||
|
|
||||||
select case(mode)
|
select case(mode)
|
||||||
case('--create')
|
case('--create')
|
||||||
|
@ -39,6 +39,8 @@ subroutine call_option(option, arg_pos)
|
|||||||
call run_delete(arg_pos)
|
call run_delete(arg_pos)
|
||||||
case('-set_cac')
|
case('-set_cac')
|
||||||
arg_pos=arg_pos +3
|
arg_pos=arg_pos +3
|
||||||
|
case('-set_types')
|
||||||
|
arg_pos = arg_pos + 3 + atom_types
|
||||||
case('-redef_box')
|
case('-redef_box')
|
||||||
call redef_box(arg_pos)
|
call redef_box(arg_pos)
|
||||||
case default
|
case default
|
||||||
|
@ -13,6 +13,8 @@ module elements
|
|||||||
character(len=100), allocatable :: type_ele(:) !Element type
|
character(len=100), allocatable :: type_ele(:) !Element type
|
||||||
integer, allocatable :: size_ele(:), lat_ele(:), sbox_ele(:), tag_ele(:) !Element size
|
integer, allocatable :: size_ele(:), lat_ele(:), sbox_ele(:), tag_ele(:) !Element size
|
||||||
real(kind=dp), allocatable :: r_node(:,:,:,:) !Nodal position array
|
real(kind=dp), allocatable :: r_node(:,:,:,:) !Nodal position array
|
||||||
|
!Element result data structures
|
||||||
|
real(kind=8), allocatable :: force_node(:,:,:,:), virial_node(:,:,:,:), energy_node(:,:,:)
|
||||||
|
|
||||||
integer, save :: ele_num !Number of elements
|
integer, save :: ele_num !Number of elements
|
||||||
integer, save :: node_num !Total number of nodes
|
integer, save :: node_num !Total number of nodes
|
||||||
@ -22,6 +24,8 @@ module elements
|
|||||||
integer, allocatable :: sbox_atom(:), tag_atom(:)
|
integer, allocatable :: sbox_atom(:), tag_atom(:)
|
||||||
real(kind =dp),allocatable :: r_atom(:,:) !atom position
|
real(kind =dp),allocatable :: r_atom(:,:) !atom position
|
||||||
integer :: atom_num=0 !Number of atoms
|
integer :: atom_num=0 !Number of atoms
|
||||||
|
!Atom result data structures information
|
||||||
|
real(kind=8), allocatable :: force_atom(:,:), virial_atom(:,:), energy_atom(:)
|
||||||
|
|
||||||
!Mapping atom type to provided name
|
!Mapping atom type to provided name
|
||||||
character(len=2), dimension(10) :: type_to_name
|
character(len=2), dimension(10) :: type_to_name
|
||||||
@ -669,17 +673,17 @@ module elements
|
|||||||
esize = size_ele(ie)
|
esize = size_ele(ie)
|
||||||
select case(iface)
|
select case(iface)
|
||||||
case(1)
|
case(1)
|
||||||
pos = (/ real(esize-1,dp)/2.0_dp, real(esize-1,dp)/2.0_dp, -10.0_dp**-2.0_dp /)
|
pos = (/ real(esize-1,dp)/2.0_dp, real(esize-1,dp)/2.0_dp, -10.0_dp**(-2.0_dp) /)
|
||||||
case(2)
|
case(2)
|
||||||
pos = (/ real(esize-1,dp)/2.0_dp, -10.0_dp**-2.0_dp, real(esize-1,dp)/2.0_dp /)
|
pos = (/ real(esize-1,dp)/2.0_dp, -10.0_dp**(-2.0_dp), real(esize-1,dp)/2.0_dp /)
|
||||||
case(3)
|
case(3)
|
||||||
pos = (/ (esize-1)+10.0_dp**-2.0_dp, real(esize-1,dp)/2.0_dp, real(esize-1,dp)/2.0_dp /)
|
pos = (/ (esize-1)+10.0_dp**(-2.0_dp), real(esize-1,dp)/2.0_dp, real(esize-1,dp)/2.0_dp /)
|
||||||
case(4)
|
case(4)
|
||||||
pos = (/ real(esize-1,dp)/2.0_dp, (esize-1)+10.0_dp**-2.0_dp, real(esize-1,dp)/2.0_dp /)
|
pos = (/ real(esize-1,dp)/2.0_dp, (esize-1)+10.0_dp**(-2.0_dp), real(esize-1,dp)/2.0_dp /)
|
||||||
case(5)
|
case(5)
|
||||||
pos = (/ -10.0_dp**-2.0_dp, real(esize-1,dp)/2.0_dp, real(esize-1,dp)/2.0_dp /)
|
pos = (/ -10.0_dp**(-2.0_dp), real(esize-1,dp)/2.0_dp, real(esize-1,dp)/2.0_dp /)
|
||||||
case(6)
|
case(6)
|
||||||
pos = (/ real(esize-1,dp)/2.0_dp, real(esize-1,dp)/2.0_dp, (esize-1)+10.0_dp**-2.0_dp /)
|
pos = (/ real(esize-1,dp)/2.0_dp, real(esize-1,dp)/2.0_dp, (esize-1)+10.0_dp**(-2.0_dp) /)
|
||||||
end select
|
end select
|
||||||
|
|
||||||
!Now transform it to real space and adjust it to the position of the element in the first node.
|
!Now transform it to real space and adjust it to the position of the element in the first node.
|
||||||
@ -736,4 +740,57 @@ module elements
|
|||||||
|
|
||||||
end subroutine lattice_map
|
end subroutine lattice_map
|
||||||
|
|
||||||
|
subroutine alloc_dat_arrays(n,m)
|
||||||
|
!This subroutine used to provide initial allocation for the atom and element data arrays
|
||||||
|
integer, intent(in) :: n,m !n-size of element arrays, m-size of atom arrays
|
||||||
|
integer :: allostat
|
||||||
|
|
||||||
|
!Allocate element arrays
|
||||||
|
if (n > 0) then
|
||||||
|
allocate(force_node(3,max_basisnum, max_ng_node, n), &
|
||||||
|
virial_node(6,max_basisnum, max_ng_node, n), &
|
||||||
|
energy_node(max_basisnum,max_ng_node,n), &
|
||||||
|
stat=allostat)
|
||||||
|
if(allostat > 0) then
|
||||||
|
print *, "Error allocating element data arrays in mode_metric becaus of:", allostat
|
||||||
|
stop
|
||||||
|
end if
|
||||||
|
|
||||||
|
end if
|
||||||
|
|
||||||
|
if (m > 0) then
|
||||||
|
allocate(force_atom(3, m), &
|
||||||
|
virial_atom(6, m), &
|
||||||
|
energy_atom(m), &
|
||||||
|
stat=allostat)
|
||||||
|
if(allostat > 0) then
|
||||||
|
print *, "Error allocating atom data arrays in mode_metric becaus of:", allostat
|
||||||
|
stop
|
||||||
|
end if
|
||||||
|
end if
|
||||||
|
|
||||||
|
end subroutine
|
||||||
|
|
||||||
|
subroutine add_atom_data(ia, eng, force, virial)
|
||||||
|
!Function which sets the atom data arrays
|
||||||
|
integer, intent(in) :: ia
|
||||||
|
real(kind=dp), intent(in) :: eng, force(3), virial(6)
|
||||||
|
|
||||||
|
energy_atom(ia) = eng
|
||||||
|
force_atom(:,ia) = force(:)
|
||||||
|
virial_atom(:,ia) = virial(:)
|
||||||
|
return
|
||||||
|
end subroutine add_atom_data
|
||||||
|
|
||||||
|
subroutine add_element_data(ie, eng, force, virial)
|
||||||
|
!Function which sets the element data arrays
|
||||||
|
integer, intent(in) :: ie
|
||||||
|
real(kind=dp), intent(in) :: eng(max_basisnum, max_ng_node), &
|
||||||
|
force(3,max_basisnum, max_ng_node), &
|
||||||
|
virial(6,max_basisnum,max_ng_node)
|
||||||
|
energy_node(:,:,ie) = eng
|
||||||
|
force_node(:,:,:,ie) = force
|
||||||
|
virial_node(:,:,:,ie) = virial
|
||||||
|
return
|
||||||
|
end subroutine add_element_data
|
||||||
end module elements
|
end module elements
|
||||||
|
144
src/io.f90
144
src/io.f90
@ -106,7 +106,7 @@ module io
|
|||||||
call write_lmpcac(outfiles(i))
|
call write_lmpcac(outfiles(i))
|
||||||
case default
|
case default
|
||||||
print *, "The extension ", trim(adjustl(outfiles(i)(scan(outfiles(i),'.',.true.)+1:))), &
|
print *, "The extension ", trim(adjustl(outfiles(i)(scan(outfiles(i),'.',.true.)+1:))), &
|
||||||
" is not accepted for writing. Please select from: xyz and try again"
|
" is not accepted for writing. Please select from: xyz, lmp, vtk, mb, restart, cac and try again"
|
||||||
stop
|
stop
|
||||||
|
|
||||||
end select
|
end select
|
||||||
@ -599,9 +599,24 @@ module io
|
|||||||
infilenum=infilenum+1
|
infilenum=infilenum+1
|
||||||
infiles(infilenum) = temp_infile
|
infiles(infilenum) = temp_infile
|
||||||
exit
|
exit
|
||||||
|
case('out')
|
||||||
|
if(atom_types == 0) then
|
||||||
|
print *, "Please run -set_types command prior to running code requiring reading in pycac_*.out files"
|
||||||
|
stop 3
|
||||||
|
end if
|
||||||
|
select case(trim(adjustl(mode)))
|
||||||
|
case('--convert','--metric')
|
||||||
|
infilenum = infilenum+1
|
||||||
|
infiles(infilenum) = temp_infile
|
||||||
|
exit
|
||||||
|
case default
|
||||||
|
print *, "Files of type .out cannot be used with mode ", trim(adjustl(mode))
|
||||||
|
stop 3
|
||||||
|
end select
|
||||||
|
|
||||||
case default
|
case default
|
||||||
print *, "File type: ", trim(temp_infile(scan(temp_infile,'.',.true.):)), "not currently accepted. ", &
|
print *, "File type: ", trim(temp_infile(scan(temp_infile,'.',.true.):)), "not currently accepted. ", &
|
||||||
"please input a filename with extension from following list: mb, restart."
|
"please input a filename with extension from following list: mb, restart, cac, or out."
|
||||||
read(*,*) temp_infile
|
read(*,*) temp_infile
|
||||||
|
|
||||||
end select
|
end select
|
||||||
@ -624,9 +639,11 @@ module io
|
|||||||
call read_pycac(infiles(i), displace, temp_box_bd)
|
call read_pycac(infiles(i), displace, temp_box_bd)
|
||||||
case('cac')
|
case('cac')
|
||||||
call read_lmpcac(infiles(i), displace, temp_box_bd)
|
call read_lmpcac(infiles(i), displace, temp_box_bd)
|
||||||
|
case('out')
|
||||||
|
call read_pycac_out(infiles(i), displace, temp_box_bd)
|
||||||
case default
|
case default
|
||||||
print *, "The extension ", trim(adjustl(outfiles(i)(scan(outfiles(i),'.',.true.)+1:))), &
|
print *, "The extension ", trim(adjustl(outfiles(i)(scan(outfiles(i),'.',.true.)+1:))), &
|
||||||
" is not accepted for writing. Please select from: mb and try again"
|
" is not accepted for reading. Please select from: mb,restart,cac,out and try again"
|
||||||
stop
|
stop
|
||||||
|
|
||||||
end select
|
end select
|
||||||
@ -781,7 +798,7 @@ module io
|
|||||||
|
|
||||||
integer :: i, inod, ibasis, j, k, l, in_eles, in_atoms, ele_types, in_lat_num, in_atom_types, &
|
integer :: i, inod, ibasis, j, k, l, in_eles, in_atoms, ele_types, in_lat_num, in_atom_types, &
|
||||||
atom_type_map(100), etype_map(100), etype, lat_type, new_lattice_map(100), &
|
atom_type_map(100), etype_map(100), etype, lat_type, new_lattice_map(100), &
|
||||||
atom_type, stat
|
atom_type, stat
|
||||||
real(kind=dp) :: newdisplace(3), r_in(3,1,8), r_in_atom(3)
|
real(kind=dp) :: newdisplace(3), r_in(3,1,8), r_in_atom(3)
|
||||||
character(len=100) :: textholder, in_lattype_map(10)
|
character(len=100) :: textholder, in_lattype_map(10)
|
||||||
character(len=2) :: atomic_element
|
character(len=2) :: atomic_element
|
||||||
@ -960,6 +977,102 @@ module io
|
|||||||
end if
|
end if
|
||||||
end subroutine read_pycac
|
end subroutine read_pycac
|
||||||
|
|
||||||
|
subroutine read_pycac_out(file, displace, temp_box_bd)
|
||||||
|
!This subroutine reads in the pyCAC dump file
|
||||||
|
|
||||||
|
|
||||||
|
!Arguments
|
||||||
|
character(len=100), intent(in) :: file
|
||||||
|
real(kind=dp), dimension(3), intent(in) :: displace
|
||||||
|
real(kind=dp), dimension(6), intent(out) :: temp_box_bd
|
||||||
|
|
||||||
|
!Internal Variables
|
||||||
|
integer :: i, in_eles, in_atoms, inbtypes(10), lat_type, ia, ie, inod, &
|
||||||
|
id, type_node, ilat, esize, tag, type
|
||||||
|
real(kind=dp) :: newdisplace(3), ra(3), in_lapa, ea, fa(3), va(6), &
|
||||||
|
ee(1,8), fe(3,1,8), ve(3,1,8), re(3,1,8)
|
||||||
|
character(len=100) :: textholder, fcc
|
||||||
|
|
||||||
|
|
||||||
|
open(unit=11, file=trim(adjustl(file)), action='read',position='rewind')
|
||||||
|
|
||||||
|
!Now initialize some important variables if they aren't defined
|
||||||
|
if (max_basisnum==0) max_basisnum = 1
|
||||||
|
if (max_ng_node==0) max_ng_node=8
|
||||||
|
fcc="fcc"
|
||||||
|
|
||||||
|
!Skip header comment lines
|
||||||
|
read(11, *) textholder
|
||||||
|
read(11, *) textholder
|
||||||
|
|
||||||
|
!Read atom number and element number and grow element arrays by needed amount
|
||||||
|
read(11,*) textholder, in_atoms, textholder, in_eles
|
||||||
|
call grow_ele_arrays(in_eles, in_atoms)
|
||||||
|
call alloc_dat_arrays(in_eles, in_atoms)
|
||||||
|
|
||||||
|
!Read boundary information
|
||||||
|
read(11,*) textholder, box_bc(1:1), box_bc(2:2), box_bc(3:3), temp_box_bd(:)
|
||||||
|
do i = 1, 3
|
||||||
|
if (abs(displace(i)) > lim_zero) then
|
||||||
|
newdisplace(i) = displace(i) - temp_box_bd(2*i-1)
|
||||||
|
else
|
||||||
|
newdisplace(i)=displace(i)
|
||||||
|
end if
|
||||||
|
temp_box_bd(2*i-1) = temp_box_bd(2*i-1) + newdisplace(i)
|
||||||
|
temp_box_bd(2*i) = temp_box_bd(2*i) + newdisplace(i)
|
||||||
|
end do
|
||||||
|
|
||||||
|
call grow_box(temp_box_bd)
|
||||||
|
|
||||||
|
!Allocate sub_box boundaries
|
||||||
|
if (sub_box_num == 0) then
|
||||||
|
call alloc_sub_box(1)
|
||||||
|
else
|
||||||
|
call grow_sub_box(1)
|
||||||
|
end if
|
||||||
|
|
||||||
|
!Because orientations and other needed sub_box information isn't really
|
||||||
|
!present within the .cac file we just default a lot of it.
|
||||||
|
sub_box_ori(:,:,sub_box_num+1) = identity_mat(3)
|
||||||
|
sub_box_bd(:, sub_box_num+1) = temp_box_bd
|
||||||
|
sub_box_num = sub_box_num + 1
|
||||||
|
|
||||||
|
if(in_atoms > 0 ) then
|
||||||
|
!Read atom header
|
||||||
|
read(11,*) textholder
|
||||||
|
do ia = 1, in_atoms
|
||||||
|
read(11,*) tag, type, ra(:), ea, fa(:), va(:)
|
||||||
|
call add_atom(tag, type, sub_box_num, ra)
|
||||||
|
call add_atom_data(atom_num, ea, fa, va)
|
||||||
|
end do
|
||||||
|
|
||||||
|
end if
|
||||||
|
|
||||||
|
if(in_eles > 0) then
|
||||||
|
!Add the lattice_types based on the atom types
|
||||||
|
inbtypes=0
|
||||||
|
do i = 1, maxval(type_atom)
|
||||||
|
inbtypes(1) = i
|
||||||
|
call lattice_map(1, inbtypes, 8 , 1.0_dp, ilat) !Please check documentation on pycac.out formats
|
||||||
|
end do
|
||||||
|
!Read element and node headers
|
||||||
|
read(11,*) textholder
|
||||||
|
read(11,*) textholder
|
||||||
|
|
||||||
|
!read element information, currently only 8 node elements with 1 basis
|
||||||
|
do ie =1, in_eles
|
||||||
|
read(11,*) tag, lat_type, textholder, textholder, esize
|
||||||
|
do inod =1, 8
|
||||||
|
read(11,*) textholder, textholder, textholder, re(:,1,inod), ee(1,inod), fe(:,1,inod), ve(:,1,inod)
|
||||||
|
end do
|
||||||
|
call add_element(tag, fcc, esize+1, lat_type, sub_box_num, re)
|
||||||
|
call add_element_data(ele_num, ee, fe, ve)
|
||||||
|
end do
|
||||||
|
end if
|
||||||
|
call set_max_esize
|
||||||
|
return
|
||||||
|
end subroutine
|
||||||
|
|
||||||
subroutine read_lmpcac(file, displace, temp_box_bd)
|
subroutine read_lmpcac(file, displace, temp_box_bd)
|
||||||
!This subroutine is used to read .cac files which are used with the lammpsCAC format
|
!This subroutine is used to read .cac files which are used with the lammpsCAC format
|
||||||
character(len=100), intent(in) :: file
|
character(len=100), intent(in) :: file
|
||||||
@ -980,7 +1093,7 @@ module io
|
|||||||
!Open the file
|
!Open the file
|
||||||
open(unit=11, file=trim(adjustl(file)), action='read',position='rewind')
|
open(unit=11, file=trim(adjustl(file)), action='read',position='rewind')
|
||||||
|
|
||||||
!Now initialiaze some important variables if they aren't defined
|
!Now initialize some important variables if they aren't defined
|
||||||
if (max_basisnum==0) max_basisnum = 10
|
if (max_basisnum==0) max_basisnum = 10
|
||||||
if (max_ng_node==0) max_ng_node=8
|
if (max_ng_node==0) max_ng_node=8
|
||||||
|
|
||||||
@ -1109,4 +1222,25 @@ module io
|
|||||||
print *, in_lattice_type
|
print *, in_lattice_type
|
||||||
|
|
||||||
end subroutine set_cac
|
end subroutine set_cac
|
||||||
|
|
||||||
|
subroutine set_types(apos)
|
||||||
|
!This code
|
||||||
|
integer, intent(in) :: apos
|
||||||
|
integer :: i, j,arglen, arg_pos, ntypes
|
||||||
|
|
||||||
|
character(len=100) :: textholder
|
||||||
|
|
||||||
|
arg_pos = apos + 1
|
||||||
|
call get_command_argument(arg_pos, textholder, arglen)
|
||||||
|
if (arglen==0) stop "Missing numtypes in io"
|
||||||
|
read(textholder,*) ntypes
|
||||||
|
|
||||||
|
do i=1,ntypes
|
||||||
|
arg_pos = arg_pos + 1
|
||||||
|
call get_command_argument(arg_pos, textholder, arglen)
|
||||||
|
call add_atom_type(textholder, j)
|
||||||
|
end do
|
||||||
|
|
||||||
|
return
|
||||||
|
end subroutine set_types
|
||||||
end module io
|
end module io
|
||||||
|
@ -63,6 +63,8 @@ program main
|
|||||||
|
|
||||||
case('-set_cac')
|
case('-set_cac')
|
||||||
call set_cac(i)
|
call set_cac(i)
|
||||||
|
case('-set_types')
|
||||||
|
call set_types(i)
|
||||||
end select
|
end select
|
||||||
end do
|
end do
|
||||||
!Determine if a mode is being used and what it is. The first argument has to be the mode
|
!Determine if a mode is being used and what it is. The first argument has to be the mode
|
||||||
@ -71,7 +73,8 @@ program main
|
|||||||
|
|
||||||
argument = trim(adjustl(argument))
|
argument = trim(adjustl(argument))
|
||||||
if (argument(1:2) == '--') then
|
if (argument(1:2) == '--') then
|
||||||
call call_mode(end_mode_arg, argument)
|
mode = argument
|
||||||
|
call call_mode(end_mode_arg)
|
||||||
end if
|
end if
|
||||||
|
|
||||||
!Check to make sure a mode was called
|
!Check to make sure a mode was called
|
||||||
|
@ -12,5 +12,7 @@ module parameters
|
|||||||
|
|
||||||
!Numeric constants
|
!Numeric constants
|
||||||
real(kind=dp), parameter :: pi = 3.14159265358979323846_dp
|
real(kind=dp), parameter :: pi = 3.14159265358979323846_dp
|
||||||
|
|
||||||
|
!Mode type that is being called
|
||||||
|
character(len=100) :: mode
|
||||||
end module parameters
|
end module parameters
|
||||||
|
Loading…
x
Reference in New Issue
Block a user