From 282dcd3c58ab0df7c8d0655b1e6142eaa1562d9a Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Tue, 28 Jan 2020 11:35:14 -0500 Subject: [PATCH 01/29] Add random position --- src/main.f90 | 2 ++ src/subroutines.f90 | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/src/main.f90 b/src/main.f90 index ed34c53..a608f19 100644 --- a/src/main.f90 +++ b/src/main.f90 @@ -23,6 +23,8 @@ program main !Call initialization functions call lattice_init call box_init + call random_seed + end_mode_arg = 0 ! Command line parsing diff --git a/src/subroutines.f90 b/src/subroutines.f90 index 9fd159c..f7a22ad 100644 --- a/src/subroutines.f90 +++ b/src/subroutines.f90 @@ -178,6 +178,7 @@ module subroutines real(kind=dp), intent(out) :: pos !The output parsed position value integer :: iospara + real(kind=dp) :: rand iospara = 0 if(trim(adjustl(pos_string)) == 'inf') then @@ -208,6 +209,10 @@ module subroutines read(pos_string(1:index(pos_string,'*')-1), *, iostat=iospara) pos end if pos = (box_bd(2*i)-box_bd(2*i-1))*pos + box_bd(2*i-1) + + else if (trim(adjustl(pos_string)) == 'rand') then + call random_number(rand) + pos = (box_bd(2*i)-box_bd(2*i-1))*rand + box_bd(2*i-1) else read(pos_string, *, iostat=iospara) pos end if From 64926a4e16ae447f8352edc61ba23ca9fe7cb544 Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 29 Jan 2020 09:30:51 -0500 Subject: [PATCH 02/29] Update to documentation for position specifiers --- README.md | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5d45ef3..821ccc5 100644 --- a/README.md +++ b/README.md @@ -225,4 +225,23 @@ This command remeshes the atoms/elements within the group to the new element siz -ow ``` -If this option is passed then all files are automatically overwritten without asking the user. \ No newline at end of file +If this option is passed then all files are automatically overwritten without asking the user. + +## Position Specification + +Specifying positions in cacmb can be done through a variety of ways. Examples of each format is shown below. + +`val` - Where `val` is a number, then that value in Angstroms is used as the position. As an example, `11.1` would be read in as a position of 11.1 $\AA$. + +`-inf` - This specifies the lower box boundary in the specific dimension. The vector `-inf -inf -inf` specifies the bottom corner of the simulation cell which also acts as the simulation cell origin. The vector `-inf 10 3` instead puts only the x position at the simulation cell origin. + +`inf` - Similar to `-inf` but references the upper boundary of the box in that dimension + +`inf-val` - Using a minus sign reduces the position from the **upper boundary** by `val`. `inf-10` would be at a distance of $10 \AA$ from the upper boundary in that dimension. + +`inf+val` - This increases the position from the **lower boundary**. `inf+10` would be a position $10\AA$ from the lower boundary within the cell. + +`inf*val` - This gives you a fractional position in the simulation cell. As an example `inf*0.5` gives you the center point of the simulation cell. + +`rand` - Returns a random position that lies within the simulation cell. + From dc42b7b925dd3b489f4388896c1e5387b667e7de Mon Sep 17 00:00:00 2001 From: Alex Date: Wed, 29 Jan 2020 10:25:33 -0500 Subject: [PATCH 03/29] Separated wrap option to reduce opy and pasted code. Fixed warnings and added wrapping when inserting a dislocation or loop --- src/call_option.f90 | 7 +++++-- src/elements.f90 | 18 +++++++++++++++--- src/io.f90 | 2 +- src/main.f90 | 16 +++++++++++++--- src/mode_convert.f90 | 2 +- src/mode_create.f90 | 5 ++--- src/mode_merge.f90 | 19 ++++--------------- src/opt_disl.f90 | 11 ++++++++--- src/opt_group.f90 | 18 ++++-------------- src/parameters.f90 | 2 +- src/subroutines.f90 | 1 + 11 files changed, 55 insertions(+), 46 deletions(-) diff --git a/src/call_option.f90 b/src/call_option.f90 index 60551af..f750ca6 100644 --- a/src/call_option.f90 +++ b/src/call_option.f90 @@ -15,8 +15,11 @@ subroutine call_option(option, arg_pos) case('-ow') arg_pos = arg_pos + 1 continue - case default - print *, 'Option ', trim(adjustl(option)), ' is not currently accepted. Skipping to next argument' + case('-wrap') arg_pos = arg_pos + 1 + continue + case default + print *, 'Option ', trim(adjustl(option)), ' is not currently accepted.' + stop 3 end select end subroutine call_option \ No newline at end of file diff --git a/src/elements.f90 b/src/elements.f90 index 9aa5f54..068d188 100644 --- a/src/elements.f90 +++ b/src/elements.f90 @@ -41,6 +41,8 @@ module elements integer :: basis_type(10,10) real(kind=dp) :: lapa(10) + !Additional module level variables we need + logical :: wrap_flag public contains @@ -313,7 +315,7 @@ module elements real(kind=dp), dimension(3, max_basisnum*max_esize**3), intent(out) :: r_interp !Interpolated atomic positions !Internal variables - integer :: i, it, is, ir, ibasis, inod, ia, bnum, lat_type_temp + integer :: it, is, ir, ibasis, inod, ia, bnum, lat_type_temp real(kind=dp), allocatable :: a_shape(:) real(kind=dp) :: t, s, r @@ -390,7 +392,7 @@ module elements integer, intent(in) :: num integer, intent(inout), dimension(num) :: index - integer :: i, j + integer :: i call heapsort(index) @@ -413,7 +415,7 @@ module elements integer, intent(in) :: num integer, intent(inout), dimension(num) :: index - integer :: i, j + integer :: i call heapsort(index) @@ -436,5 +438,15 @@ module elements end if ele_num = ele_num - 1 end do + end subroutine delete_elements + + subroutine wrap_atoms + !This subroutine wraps atoms back into the simulation cell if they have exited for any reason + integer :: i + do i = 1, atom_num + call apply_periodic(r_atom(:,i)) + end do + end subroutine wrap_atoms + end module elements \ No newline at end of file diff --git a/src/io.f90 b/src/io.f90 index 26d4250..cff9587 100644 --- a/src/io.f90 +++ b/src/io.f90 @@ -363,7 +363,7 @@ module io !NOTE: This code doesn't work for arbitrary number of basis atoms per node. It assumes that the !each element has only 1 atom type at the node. character(len=100), intent(in) :: file - integer :: interp_max, i, j, lat_size, inod, ibasis, ip, unique_index(10), unique_num + integer :: interp_max, i, j, inod, ibasis, ip, unique_index(10), unique_num real(kind=dp) :: box_vec(3) 1 format('time' / i16, f23.15) diff --git a/src/main.f90 b/src/main.f90 index f64b50b..85b3b49 100644 --- a/src/main.f90 +++ b/src/main.f90 @@ -39,20 +39,27 @@ program main call box_init call random_seed force_overwrite=.false. + wrap_flag = .false. end_mode_arg = 0 ! Command line parsing arg_num = command_argument_count() - !Check to see if overwrite flag is passed + !First check to see if certain commands are passed, these commands must be known before code + !is executed. do i = 1, arg_num call get_command_argument(i,argument) select case(trim(adjustl(argument))) + !This lets us know if we are overwriting all files case('-ow') force_overwrite = .true. print *, "Overwrite flag passed, output files will be overwritten" + + !This lets us know if we need to wrap atomic positions back into the cell + case('-wrap') + wrap_flag=.true. end select end do !Determine if a mode is being used and what it is. The first argument has to be the mode @@ -86,11 +93,14 @@ program main call call_option(argument, arg_pos) !Otherwise print that the argument is not accepted and move on else - print *, trim(adjustl(argument)), " is not accepted. Skipping to next argument" - arg_pos = arg_pos + 1 + print *, trim(adjustl(argument)), " is not an accepted command." + stop 3 end if end do + !If wrap flag was passed then call the wrap atoms command + if(wrap_flag) call wrap_atoms + !Check to make sure a file was passed to be written out and then write out ! Before building do a check on the file if (outfilenum == 0) then diff --git a/src/mode_convert.f90 b/src/mode_convert.f90 index 32ded60..3bb8a3b 100644 --- a/src/mode_convert.f90 +++ b/src/mode_convert.f90 @@ -11,7 +11,7 @@ module mode_convert subroutine convert(arg_pos) !This subroutine converts a single input file from one format to another integer, intent(out) :: arg_pos - character(len=100) :: infile, outfile + character(len=100) :: infile real(kind = dp) :: temp_box_bd(6) !First read in the file call get_command_argument(2, infile) diff --git a/src/mode_create.f90 b/src/mode_create.f90 index c3e6bcc..607f6d0 100644 --- a/src/mode_create.f90 +++ b/src/mode_create.f90 @@ -24,7 +24,6 @@ module mode_create subroutine create(arg_pos) ! Main subroutine which controls execution - character(len=100) :: textholder integer, intent(out) :: arg_pos integer :: i, ibasis, inod @@ -128,7 +127,8 @@ module mode_create !Now that it is built multiply by the lattice parameter box_bd = box_bd*lattice_parameter - print *, "Using mode create, ", lat_ele_num, " elements are created and ", lat_atom_num*basisnum(1), " atoms are created." + print *, "Using mode create, ", lat_ele_num, " elements are created and ", lat_atom_num*basisnum(1), & + " atoms are created." !Allocate variables call alloc_ele_arrays(lat_ele_num, lat_atom_num*basisnum(1)) @@ -309,7 +309,6 @@ module mode_create integer :: i, inod, bd_in_lat(6), bd_in_array(6), ix, iy, iz, numlatpoints, ele(3,8), rzero(3), & vlat(3), temp_lat(3,8), m, n, o real(kind=dp) :: v(3), temp_nodes(3,1,8) - real(kind=dp), allocatable :: resize_lat_array(:,:) logical, allocatable :: lat_points(:,:,:) logical :: node_in_bd(8) diff --git a/src/mode_merge.f90 b/src/mode_merge.f90 index 14a015d..2118cff 100644 --- a/src/mode_merge.f90 +++ b/src/mode_merge.f90 @@ -10,7 +10,7 @@ module mode_merge character(len=4) :: dim integer :: in_num, new_starts(2) real(kind=dp) :: shift_vec(3) - logical :: wrap, shift_flag + logical :: shift_flag public contains @@ -22,7 +22,6 @@ module mode_merge print *, '-----------------------Mode Merge---------------------------' - wrap = .false. shift_flag = .false. shift_vec(:) = 0.0_dp @@ -115,8 +114,6 @@ module mode_merge if (arglen==0) stop "Missing vector component for shift command" read(textholder, *) shift_vec(i) end do - case('wrap') - wrap = .true. case default !If it isn't an available option to mode merge then we just exit exit @@ -126,13 +123,12 @@ module mode_merge end subroutine parse_command subroutine shift(array_start, filenum) - !This subroutine applies a shift to newly added atoms and elements. It also wraps the atoms - !if the user provides the wrap flag + !This subroutine applies a shift to newly added atoms and elements. integer, dimension(2), intent(in) :: array_start integer, intent(in) :: filenum - integer :: i, j, ibasis, inod + integer :: i, ibasis, inod real(kind=dp), dimension(3) :: current_shift @@ -155,15 +151,8 @@ module mode_merge end do end do - !Now we check if we have to wrap the atoms, nodes are not wrapped. For elements the periodic - !boundary conditions are applied in the actual CAC codes - if(wrap) then - do i = array_start(1), atom_num - call apply_periodic(r_atom(:,i)) - end do - !If we don't include the wrap command then we have to increase the size of the box - else + if(.not.(wrap_flag)) then do i = 1,3 if (current_shift(i) < -lim_zero) then box_bd(2*i-1) = box_bd(2*i-1) - current_shift(i) diff --git a/src/opt_disl.f90 b/src/opt_disl.f90 index 025d680..9450171 100644 --- a/src/opt_disl.f90 +++ b/src/opt_disl.f90 @@ -47,8 +47,8 @@ module opt_disl integer, intent(inout) :: arg_pos integer :: i,arglen - character(len=8) :: ori_string character(len=100) :: textholder + character(len=8) :: ori_string !Parse all of the commands arg_pos = arg_pos + 1 @@ -180,6 +180,9 @@ module opt_disl end do end if + !Now make sure all atoms are wrapped back into the simulation cell + call wrap_atoms + end subroutine dislgen subroutine parse_disloop(arg_pos) @@ -187,8 +190,7 @@ module opt_disl integer, intent(inout) :: arg_pos - integer :: i,arglen, sbox - character(len=8) :: ori_string + integer :: i,arglen character(len=100) :: textholder !Parse all of the commands @@ -392,6 +394,9 @@ module opt_disl end do end do return + + !Now make sure all atoms are wrapped back into the simulation cell + call wrap_atoms end subroutine !******************************************************** diff --git a/src/opt_group.f90 b/src/opt_group.f90 index 6d129f1..08167a6 100644 --- a/src/opt_group.f90 +++ b/src/opt_group.f90 @@ -11,7 +11,7 @@ module opt_group integer :: group_ele_num, group_atom_num, remesh_size character(len=15) :: type, shape !Type indicates what element type is selected and shape is the group shape real(kind=dp) :: block_bd(6), disp_vec(3) - logical :: displace, wrap + logical :: displace integer, allocatable :: element_index(:), atom_index(:) @@ -96,8 +96,6 @@ module opt_group if (arglen==0) stop "Missing vector component for shift command" read(textholder, *) disp_vec(i) end do - case('wrap') - wrap = .true. case('remesh') arg_pos = arg_pos + 1 call get_command_argument(arg_pos, textholder, arglen) @@ -192,16 +190,8 @@ module opt_group end do end do - !Now either apply periodic boundaries if wrap command was passed or adjust box dimensions - !Now we check if we have to wrap the atoms, nodes are not wrapped. For elements the periodic - !boundary conditions are applied in the actual CAC codes - if(wrap) then - do i = 1, atom_num - call apply_periodic(r_atom(:,i)) - end do - !If we don't include the wrap command then we have to increase the size of the box - else + if (.not.(wrap_flag)) then do i = 1,3 if (disp_vec(i) < -lim_zero) then box_bd(2*i-1) = box_bd(2*i-1) - disp_vec(i) @@ -235,8 +225,8 @@ module opt_group !Get the interpolated atom positions call interpolate_atoms(type_ele(ie), size_ele(ie), lat_ele(ie), r_node(:,:,:,ie), type_interp, r_interp) - !Loop over all interpolated atoms and add them to the system, we apply periodic boundaries here as well to make sure - !they are in the box + !Loop over all interpolated atoms and add them to the system, we apply periodic boundaries + !here as well to make sure they are in the box do j = 1, basisnum(lat_ele(ie))*size_ele(ie)**3 call apply_periodic(r_interp(:,j)) call add_atom(type_interp(j), r_interp(:,j)) diff --git a/src/parameters.f90 b/src/parameters.f90 index 6054140..2fa3e37 100644 --- a/src/parameters.f90 +++ b/src/parameters.f90 @@ -7,7 +7,7 @@ module parameters !Parameters for floating point tolerance real(kind=dp), parameter :: lim_zero = epsilon(1.0_dp), & lim_large = huge(1.0_dp) - logical, save :: lmpcac + logical, save :: lmpcac !Numeric constants real(kind=dp), parameter :: pi = 3.14159265358979323846_dp diff --git a/src/subroutines.f90 b/src/subroutines.f90 index f7a22ad..ebb5c3a 100644 --- a/src/subroutines.f90 +++ b/src/subroutines.f90 @@ -5,6 +5,7 @@ module subroutines implicit none integer :: allostat, deallostat + public contains From 4117f31cb67b93dd17aef73d58b36c44d4d15317 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Fri, 31 Jan 2020 11:22:26 -0500 Subject: [PATCH 04/29] Small fix to writing to restart format --- src/io.f90 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/io.f90 b/src/io.f90 index cff9587..c4ced7f 100644 --- a/src/io.f90 +++ b/src/io.f90 @@ -734,7 +734,7 @@ module io !Only increment the lattice types if there are elements, if there are no elements then we !just overwrite the arrays - if(in_eles > 0) lattice_types = maxval(new_lattice_map) + lattice_types = maxval(new_lattice_map) sub_box_num = sub_box_num + n From 58ad74ca9ac2dc5d78b7485fdec439a283b77ff9 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Fri, 31 Jan 2020 11:50:41 -0500 Subject: [PATCH 05/29] Quick add of boundary option and update to readme --- README.md | 10 ++++++++++ src/call_option.f90 | 6 ++++++ 2 files changed, 16 insertions(+) diff --git a/README.md b/README.md index 821ccc5..8d13121 100644 --- a/README.md +++ b/README.md @@ -227,6 +227,16 @@ This command remeshes the atoms/elements within the group to the new element siz If this option is passed then all files are automatically overwritten without asking the user. +### Option boundary + +``` +-boundary box_bc +``` + +This allows the user to specify the boundary conditions for the model being outputted. The format is a 3 character string with `p` indicating periodic and `s` indicating shrink-wrapped. + +**Example:** `-boundary psp` + ## Position Specification Specifying positions in cacmb can be done through a variety of ways. Examples of each format is shown below. diff --git a/src/call_option.f90 b/src/call_option.f90 index f750ca6..0d7f9c7 100644 --- a/src/call_option.f90 +++ b/src/call_option.f90 @@ -2,6 +2,7 @@ subroutine call_option(option, arg_pos) use parameters use opt_disl use opt_group + use box implicit none integer, intent(inout) :: arg_pos @@ -18,6 +19,11 @@ subroutine call_option(option, arg_pos) case('-wrap') arg_pos = arg_pos + 1 continue + case('-boundary') + arg_pos=arg_pos+1 + call get_command_argument(arg_pos, box_bc) + print *, box_bc + arg_pos=arg_pos+1 case default print *, 'Option ', trim(adjustl(option)), ' is not currently accepted.' stop 3 From 44efb4be4a4ce38c09fe4d563661c9987b9ad88a Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Mon, 3 Feb 2020 17:30:41 -0500 Subject: [PATCH 06/29] Added orient and unorient options --- src/Makefile | 4 ++-- src/call_option.f90 | 9 ++++++--- src/elements.f90 | 48 ++++++++++++++++++++++++++++++++++++++++++--- src/io.f90 | 12 ++++++------ src/mode_create.f90 | 32 ++++++++++++++++-------------- src/opt_group.f90 | 2 +- 6 files changed, 77 insertions(+), 30 deletions(-) diff --git a/src/Makefile b/src/Makefile index a3f926f..4a9f60c 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2,7 +2,7 @@ FC=ifort FFLAGS=-mcmodel=large -g -O0 -stand f08 -fpe0 -traceback -check bounds,uninit -warn all -implicitnone -no-wrap-margin #FFLAGS=-mcmodel=large -Ofast -no-wrap-margin MODES=mode_create.o mode_merge.o mode_convert.o -OPTIONS=opt_disl.o opt_group.o +OPTIONS=opt_disl.o opt_group.o opt_orient.o OBJECTS=main.o elements.o io.o subroutines.o functions.o atoms.o call_mode.o box.o $(MODES) $(OPTIONS) call_option.o .SUFFIXES: @@ -40,4 +40,4 @@ call_mode.o : $(MODES) call_option.o : $(OPTIONS) $(MODES) $(OPTIONS) subroutines.o io.o : atoms.o box.o $(MODES) main.o : io.o -testfuncs.o elements.o mode_create.o $(OPTIONS): subroutines.o +testfuncs.o elements.o mode_create.o $(OPTIONS) $(MODES): subroutines.o diff --git a/src/call_option.f90 b/src/call_option.f90 index 0d7f9c7..e67454b 100644 --- a/src/call_option.f90 +++ b/src/call_option.f90 @@ -2,6 +2,7 @@ subroutine call_option(option, arg_pos) use parameters use opt_disl use opt_group + use opt_orient use box implicit none @@ -15,14 +16,16 @@ subroutine call_option(option, arg_pos) call group(arg_pos) case('-ow') arg_pos = arg_pos + 1 - continue case('-wrap') arg_pos = arg_pos + 1 - continue + case('-orient') + call orient(arg_pos) + case('-unorient') + call unorient + arg_pos = arg_pos + 1 case('-boundary') arg_pos=arg_pos+1 call get_command_argument(arg_pos, box_bc) - print *, box_bc arg_pos=arg_pos+1 case default print *, 'Option ', trim(adjustl(option)), ' is not currently accepted.' diff --git a/src/elements.f90 b/src/elements.f90 index 068d188..b4b8814 100644 --- a/src/elements.f90 +++ b/src/elements.f90 @@ -5,6 +5,7 @@ module elements use parameters use functions use subroutines + use box implicit none !Data structures used to represent the CAC elements. Each index represents an element @@ -17,6 +18,7 @@ module elements !Data structure used to represent atoms integer, allocatable :: type_atom(:)!atom type + integer, allocatable :: sbox_atom(:) real(kind =dp),allocatable :: r_atom(:,:) !atom position integer :: atom_num=0 !Number of atoms @@ -153,7 +155,7 @@ module elements if(m > 0) then !Allocate atom arrays - allocate(type_atom(m), r_atom(3,m), stat=allostat) + allocate(type_atom(m), sbox_atom(m), r_atom(3,m), stat=allostat) if(allostat > 0) then print *, "Error allocating atom arrays in elements.f90 because of: ", allostat stop @@ -211,6 +213,11 @@ module elements temp_int(atom_size+1:) = 0 call move_alloc(temp_int, type_atom) + allocate(temp_int(m+atom_num+buffer_size)) + temp_int(1:atom_size) = sbox_atom + temp_int(atom_size+1:) = 0 + call move_alloc(temp_int, sbox_atom) + allocate(temp_real(3,m+atom_num+buffer_size)) temp_real(:,1:atom_size) = r_atom temp_real(:, atom_size+1:) = 0.0_dp @@ -237,9 +244,9 @@ module elements end subroutine add_element - subroutine add_atom(type, r) + subroutine add_atom(type, sbox, r) !Subroutine which adds an atom to the atom arrays - integer, intent(in) :: type + integer, intent(in) :: type, sbox real(kind=dp), intent(in), dimension(3) :: r atom_num = atom_num+1 @@ -247,6 +254,7 @@ module elements call grow_ele_arrays(0,1) type_atom(atom_num) = type r_atom(:,atom_num) = r(:) + sbox_atom(atom_num) = sbox end subroutine add_atom @@ -449,4 +457,38 @@ module elements end do end subroutine wrap_atoms + subroutine def_new_box + !This subroutine calculates new box boundaries based on minimum and maximum nodal/atomic positions + integer :: i, j, inod, ibasis + + real(kind=dp) :: max_bd(3), min_bd(3) + + max_bd(:) = -huge(1.0_dp) + min_bd(:) = huge(1.0_dp) + + do i = 1, atom_num + do j = 1, 3 + if (r_atom(j,i) > max_bd(j)) max_bd(j) = r_atom(j,i) + lim_zero + if (r_atom(j,i) < min_bd(j)) min_bd(j) = r_atom(j,i) - lim_zero + end do + end do + + do i = 1, ele_num + do inod = 1, ng_node(lat_ele(i)) + do ibasis = 1, basisnum(lat_ele(i)) + do j = 1, 3 + if (r_node(j,ibasis,inod,i) > max_bd(j)) max_bd(j) = r_node(j,ibasis,inod,i) + lim_zero + if (r_node(j,ibasis,inod,i) < min_bd(j)) min_bd(j) = r_node(j,ibasis,inod,i) -lim_zero + + end do + end do + end do + end do + + do j = 1, 3 + box_bd(2*j) = max_bd(j) + box_bd(2*j-1) = min_bd(j) + end do + end subroutine + end module elements \ No newline at end of file diff --git a/src/io.f90 b/src/io.f90 index c4ced7f..088459a 100644 --- a/src/io.f90 +++ b/src/io.f90 @@ -8,7 +8,7 @@ module io implicit none integer :: outfilenum = 0, infilenum = 0 - character(len=100) :: outfiles(10), infiles(10) + character(len=100) :: outfiles(100), infiles(100) logical :: force_overwrite public @@ -130,14 +130,14 @@ module io do i = 1, ele_num do inod = 1, ng_node(lat_ele(i)) do ibasis = 1, basisnum(lat_ele(i)) - write(11, '(a, 3f23.15)') basis_type(ibasis,lat_ele(i)), r_node(:,ibasis,inod,i) + write(11, '(i16, 3f23.15)') basis_type(ibasis,lat_ele(i)), r_node(:,ibasis,inod,i) end do end do end do !Write atom positions do i = 1, atom_num - write(11, '(a, 3f23.15)') type_atom(i), r_atom(:,i) + write(11, '(i16, 3f23.15)') type_atom(i), r_atom(:,i) end do !Finish writing @@ -520,7 +520,7 @@ module io !Write out atoms first do i = 1, atom_num - write(11,*) i, type_atom(i), r_atom(:,i) + write(11,*) i, type_atom(i), sbox_atom(i), r_atom(:,i) end do !Write out the elements, this is written in two stages, one line for the element and then 1 line for @@ -713,8 +713,8 @@ module io !Read the atoms do i = 1, in_atoms - read(11,*) j, type, r(:) - call add_atom(new_type_to_type(type), r+newdisplace) + read(11,*) j, type, sbox, r(:) + call add_atom(new_type_to_type(type), sbox, r+newdisplace ) end do !Read the elements diff --git a/src/mode_create.f90 b/src/mode_create.f90 index 607f6d0..934895a 100644 --- a/src/mode_create.f90 +++ b/src/mode_create.f90 @@ -135,7 +135,7 @@ module mode_create if(lat_atom_num > 0) then do i = 1, lat_atom_num do ibasis = 1, basisnum(1) - call add_atom(basis_type(ibasis, 1), (r_atom_lat(:,i)*lattice_parameter)+basis_pos(:,ibasis)) + call add_atom(basis_type(ibasis, 1), 1, (r_atom_lat(:,i)*lattice_parameter)+basis_pos(:,ibasis)) end do end do deallocate(r_atom_lat) @@ -205,21 +205,23 @@ module mode_create do i = 1, 3 call get_command_argument(arg_pos, orient_string, arglen) if (arglen==0) STOP "Missing orientation in orient command of mode create" + call parse_ori_vec(orient_string, orient(i,:)) arg_pos = arg_pos+1 - ori_pos=2 - do j = 1,3 - if (orient_string(ori_pos:ori_pos) == '-') then - ori_pos = ori_pos + 1 - read(orient_string(ori_pos:ori_pos), *, iostat=stat) orient(i,j) - if (stat>0) STOP "Error reading orient value" - orient(i,j) = -orient(i,j) - ori_pos = ori_pos + 1 - else - read(orient_string(ori_pos:ori_pos), *, iostat=stat) orient(i,j) - if(stat>0) STOP "Error reading orient value" - ori_pos=ori_pos + 1 - end if - end do + + ! ori_pos=2 + ! do j = 1,3 + ! if (orient_string(ori_pos:ori_pos) == '-') then + ! ori_pos = ori_pos + 1 + ! read(orient_string(ori_pos:ori_pos), *, iostat=stat) orient(i,j) + ! if (stat>0) STOP "Error reading orient value" + ! orient(i,j) = -orient(i,j) + ! ori_pos = ori_pos + 1 + ! else + ! read(orient_string(ori_pos:ori_pos), *, iostat=stat) orient(i,j) + ! if(stat>0) STOP "Error reading orient value" + ! ori_pos=ori_pos + 1 + ! end if + ! end do end do diff --git a/src/opt_group.f90 b/src/opt_group.f90 index 08167a6..8e0fc08 100644 --- a/src/opt_group.f90 +++ b/src/opt_group.f90 @@ -229,7 +229,7 @@ module opt_group !here as well to make sure they are in the box do j = 1, basisnum(lat_ele(ie))*size_ele(ie)**3 call apply_periodic(r_interp(:,j)) - call add_atom(type_interp(j), r_interp(:,j)) + call add_atom(type_interp(j), sbox_ele(ie), r_interp(:,j)) end do end do From f37f19cbcf427c87b155308fa381c33a138649d0 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Mon, 3 Feb 2020 17:35:22 -0500 Subject: [PATCH 07/29] Forgot to add the option file --- src/opt_orient.f90 | 121 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 src/opt_orient.f90 diff --git a/src/opt_orient.f90 b/src/opt_orient.f90 new file mode 100644 index 0000000..21d9d3f --- /dev/null +++ b/src/opt_orient.f90 @@ -0,0 +1,121 @@ +module opt_orient + !This module contains the orient option which allows for the reorientation + !of simulation cells. This can be used to create arbitrarily oriented dislocation or loops. + use parameters + use subroutines + use elements + use box + implicit none + + + real(kind=dp), save :: new_orient(3,3) + real(kind=dp), dimension(6) :: orig_box_bd + real(kind=dp), allocatable :: orig_sub_box_ori(:,:,:) + + public + contains + + subroutine orient(arg_pos) + + integer, intent(inout) :: arg_pos + + integer :: i, ibasis, inod + real(kind=dp) :: inv_sub_box_ori(3,3,sub_box_num) + + !First parse the orient command + call parse_orient(arg_pos) + + !Now rotate the basis. To do this we transform the basis to [100] [010] [001] and then + !transform to user specified basis. + + !Find all inverse orientation matrices for all sub_boxes + do i = 1, sub_box_num + call matrix_inverse(sub_box_ori, 3, inv_sub_box_ori) + end do + + !Now transform all atoms + do i = 1, atom_num + r_atom(:,i) = matmul(new_orient,matmul(inv_sub_box_ori(:,:,sbox_atom(i)),r_atom(:,i))) + end do + + !Now transform all elements + do i = 1, ele_num + do inod =1, ng_node(lat_ele(i)) + do ibasis = 1, basisnum(lat_ele(i)) + r_node(:,ibasis,inod,i) = matmul(new_orient,matmul(inv_sub_box_ori(:,:,sbox_ele(i)),r_node(:,ibasis,inod,i))) + end do + end do + end do + + !Now save the original sub_box_ori and overwrite them + if(allocated(orig_sub_box_ori)) deallocate(orig_sub_box_ori) + + allocate(orig_sub_box_ori(3,3,sub_box_num)) + orig_sub_box_ori = sub_box_ori + + !Now overwrite the orientations + do i = 1, sub_box_num + sub_box_ori(:,:,i) = new_orient + end do + + !Save original box boundaries + orig_box_bd = box_bd + + !Now find new box boundaries + call def_new_box + end subroutine orient + + subroutine parse_orient(arg_pos) + !This parses the orient option + integer, intent(inout) :: arg_pos + + integer :: i, arg_len + character(len=8) :: ori_string + + !Pull out the new user orientation + do i = 1, 3 + arg_pos = arg_pos + 1 + call get_command_argument(arg_pos, ori_string, arg_len) + if (arg_len == 0) print *, "Missing orientation vector in -orient option" + call parse_ori_vec(ori_string, new_orient(i,:)) + end do + + !Normalize the orientation matrix + new_orient = matrix_normal(new_orient,3) + arg_pos = arg_pos + 1 + + end subroutine parse_orient + + subroutine unorient + + integer :: i, ibasis, inod + real(kind=dp) :: inv_ori(3,3) + + !Now rotate the basis. To do this we transform the basis to [100] [010] [001] and then + !transform to the original sbox_ele + + !Find the inverse for the new orientation matrix + call matrix_inverse(new_orient, 3, inv_ori) + + !Recover original sub_box_ori + sub_box_ori = orig_sub_box_ori + + !Now transform all atoms + do i = 1, atom_num + r_atom(:,i) = matmul(sub_box_ori(:,:,sbox_atom(i)),matmul(inv_ori(:,:),r_atom(:,i))) + end do + + !Now transform all elements + do i = 1, ele_num + do inod =1, ng_node(lat_ele(i)) + do ibasis = 1, basisnum(lat_ele(i)) + r_node(:,ibasis,inod,i) = matmul(sub_box_ori(:,:,sbox_ele(i)),matmul(inv_ori,r_node(:,ibasis,inod,i))) + end do + end do + end do + + !Restore original box boundaries + box_bd = orig_box_bd + end subroutine unorient + +end module opt_orient \ No newline at end of file From 9be65c4510ecf68f9318fedead3b7fb04cf8a7eb Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Tue, 4 Feb 2020 08:57:24 -0500 Subject: [PATCH 08/29] Added delete option and update readme --- README.md | 8 ++++++++ src/opt_group.f90 | 23 ++++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8d13121..ea92157 100644 --- a/README.md +++ b/README.md @@ -219,6 +219,14 @@ remesh esize This command remeshes the atoms/elements within the group to the new element size `esize`. Currently only accepts an `esize` of 2 which refines it to full atomistics. +**Delete** + +``` +delete +``` + +This command deletes all selected atoms and elements within the group. + ### Option overwrite ``` diff --git a/src/opt_group.f90 b/src/opt_group.f90 index 08167a6..65ab778 100644 --- a/src/opt_group.f90 +++ b/src/opt_group.f90 @@ -11,7 +11,7 @@ module opt_group integer :: group_ele_num, group_atom_num, remesh_size character(len=15) :: type, shape !Type indicates what element type is selected and shape is the group shape real(kind=dp) :: block_bd(6), disp_vec(3) - logical :: displace + logical :: displace, delete integer, allocatable :: element_index(:), atom_index(:) @@ -27,6 +27,9 @@ module opt_group group_ele_num = 0 group_atom_num = 0 remesh_size=0 + displace=.false. + delete=.false. + if(allocated(element_index)) deallocate(element_index) if(allocated(atom_index)) deallocate(atom_index) @@ -38,6 +41,8 @@ module opt_group if(displace) call displace_group if(remesh_size > 0) call remesh_group + + if(delete) call delete_group end subroutine group subroutine parse_group(arg_pos) @@ -101,6 +106,9 @@ module opt_group call get_command_argument(arg_pos, textholder, arglen) if (arglen==0) stop "Missing remesh element size in group command" read(textholder, *) remesh_size + case('delete') + arg_pos = arg_pos + 1 + delete=.true. case default !If it isn't an available option to opt_disl then we just exit exit @@ -246,4 +254,17 @@ module opt_group end subroutine remesh_group + + subroutine delete_group + !This subroutine deletes all atoms/elements within a group + + print *, "Deleting group containing ", group_atom_num, " atoms and ", group_ele_num, " elements." + + !Delete atoms + call delete_atoms(group_atom_num, atom_index) + + !Delete elements + call delete_elements(group_ele_num, element_index) + + end subroutine delete_group end module opt_group \ No newline at end of file From 6f15daf1ecc6e92dce95e8897ef11cc2a3f5dfc1 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Wed, 5 Feb 2020 10:57:39 -0500 Subject: [PATCH 09/29] Initial working commit with bug in delete command --- README.md | 18 +++++++ src/Makefile | 2 +- src/call_option.f90 | 3 ++ src/opt_delete.f90 | 117 ++++++++++++++++++++++++++++++++++++++++++++ src/subroutines.f90 | 59 ++++++++++++++++++++++ 5 files changed, 198 insertions(+), 1 deletion(-) create mode 100644 src/opt_delete.f90 diff --git a/README.md b/README.md index ea92157..fce8dd1 100644 --- a/README.md +++ b/README.md @@ -245,6 +245,24 @@ This allows the user to specify the boundary conditions for the model being outp **Example:** `-boundary psp` +### Option Delete + +``` +-delete keywords +``` + +Delete requires the usage of additional keywords to specify which delete action will be taken. These additional keywords are below: + +**overlap** + +``` +-delete overlap rc_off +``` + +This command will delete all overlapping atoms within a specific cutoff radius `rc_off`. This currently does not affect elements. + +**** + ## Position Specification Specifying positions in cacmb can be done through a variety of ways. Examples of each format is shown below. diff --git a/src/Makefile b/src/Makefile index 4a9f60c..a036149 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2,7 +2,7 @@ FC=ifort FFLAGS=-mcmodel=large -g -O0 -stand f08 -fpe0 -traceback -check bounds,uninit -warn all -implicitnone -no-wrap-margin #FFLAGS=-mcmodel=large -Ofast -no-wrap-margin MODES=mode_create.o mode_merge.o mode_convert.o -OPTIONS=opt_disl.o opt_group.o opt_orient.o +OPTIONS=opt_disl.o opt_group.o opt_orient.o opt_delete.o OBJECTS=main.o elements.o io.o subroutines.o functions.o atoms.o call_mode.o box.o $(MODES) $(OPTIONS) call_option.o .SUFFIXES: diff --git a/src/call_option.f90 b/src/call_option.f90 index e67454b..1755d89 100644 --- a/src/call_option.f90 +++ b/src/call_option.f90 @@ -3,6 +3,7 @@ subroutine call_option(option, arg_pos) use opt_disl use opt_group use opt_orient + use opt_delete use box implicit none @@ -27,6 +28,8 @@ subroutine call_option(option, arg_pos) arg_pos=arg_pos+1 call get_command_argument(arg_pos, box_bc) arg_pos=arg_pos+1 + case('-delete') + call run_delete(arg_pos) case default print *, 'Option ', trim(adjustl(option)), ' is not currently accepted.' stop 3 diff --git a/src/opt_delete.f90 b/src/opt_delete.f90 new file mode 100644 index 0000000..c178ab2 --- /dev/null +++ b/src/opt_delete.f90 @@ -0,0 +1,117 @@ +module opt_delete + + use parameters + use subroutines + use elements + + implicit none + + real(kind=dp) :: rc_off + + public + contains + + subroutine run_delete(arg_pos) + + integer, intent(inout) :: arg_pos + + rc_off = -lim_zero + !Main calling function for delete option. + print *, '-----------------------Option Delete------------------------' + + call parse_delete(arg_pos) + + if (rc_off > 0.0_dp) call delete_overlap + end subroutine run_delete + + subroutine parse_delete(arg_pos) + !Parse the delete command + + integer, intent(inout) :: arg_pos + + integer :: arg_len + character(len=100) :: textholder + arg_pos = arg_pos + 1 + + call get_command_argument(arg_pos, textholder, arg_len) + if(arg_len==0) stop "Missing argument to delete command" + + select case(textholder) + case('overlap') + arg_pos=arg_pos + 1 + call get_command_argument(arg_pos, textholder, arg_len) + if(arg_len==0) stop "Missing argument to delete overlap command" + print *, textholder + read(*, textholder) rc_off + + case default + print *, "Command ", trim(adjustl(textholder)), " is not accepted for option delete" + stop 3 + end select + end subroutine parse_delete + + subroutine delete_overlap + !This subroutine deletes all overlapping atoms, which is defined as atoms which are separated by a distance of + !less then rc_off + + integer :: i, c(3), ci, cj, ck, num_nei, nei, delete_num + integer, dimension(atom_num) :: for_delete + integer, dimension(3,atom_num) :: which_cell + + !These are the variables containing the cell list information + integer, dimension(3) :: cell_num + integer, allocatable :: num_in_cell(:,:,:) + integer, allocatable :: 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) + + !Now loop over every atom and figure out if it has neighbors within the rc_off + delete_num = 0 + atom_loop: do i = 1, atom_num + + !c is the position of the cell that the atom belongs to + c = which_cell(:,i) + + !Check to make sure it hasn't already been deleted + if(all(c /= 0)) then + !Now loop over all neighboring cells + do ci = -1, 1, 1 + do cj = -1, 1, 1 + do ck = -1, 1, 1 + do num_nei = 1, num_in_cell(c(1) + ck, c(2) + cj, c(3) + ci) + nei = cell_list(num_nei,c(1) + ck, c(2) + cj, c(3) + ci) + + !Check to make sure the atom isn't the same index as the atom we are checking + !and that the neighbor hasn't already been deleted + if((nei /= i).and.(nei/= 0)) then + + !Now check to see if it is in the cutoff radius, if it is add it to the delete code + if (norm2(r_atom(:,nei)-r_atom(:,i)) < rc_off) then + + delete_num = delete_num + 1 + for_delete(delete_num) = max(i,nei) + + !Now zero out the larger index + if(i > nei) then + which_cell(:,i) = 0 + cycle atom_loop + else + which_cell(:,nei) = 0 + cell_list(num_nei,c(1) + ck, c(2) + cj, c(3) + ci) = 0 + end if + end if + end if + end do + end do + end do + end do + end if + + !Now delete all the atoms + call delete_atoms(delete_num, for_delete(1:delete_num)) + + end do atom_loop + + end subroutine delete_overlap +end module opt_delete \ No newline at end of file diff --git a/src/subroutines.f90 b/src/subroutines.f90 index ebb5c3a..4f2c271 100644 --- a/src/subroutines.f90 +++ b/src/subroutines.f90 @@ -289,4 +289,63 @@ module subroutines end do end subroutine + subroutine build_cell_list(numinlist, r_list, rc_off, cell_num, num_in_cell, cell_list, which_cell) + !This subroutine builds a cell list based on rc_off + + !----------------------------------------Input/output variables------------------------------------------- + + integer, intent(in) :: numinlist !The number of points within r_list + + real(kind=dp), dimension(3,numinlist), intent(in) :: r_list !List of points to be used for the construction of + !the cell list. + + real(kind=dp), intent(in) :: rc_off ! Cutoff radius which dictates the size of the cells + + integer, dimension(3), intent(inout) :: cell_num !Number of cells in each dimension. + + integer, allocatable, intent(inout) :: num_in_cell(:,:,:) !Number of points within each cell + + integer, allocatable, intent(inout) :: cell_list(:,:,:,:) !Index of points from r_list within each cell. + + integer, dimension(3,numinlist), intent(out) :: which_cell !The cell index for each point in r_list + + !----------------------------------------Begin Subroutine ------------------------------------------- + + integer :: i, j, cell_lim, c(3) + real(kind=dp) :: box_len(3) + integer, allocatable :: resize_cell_list(:,:,:,:) + + !First calculate the number of cells that we need in each dimension + do i = 1,3 + box_len(i) = box_bd(2*i) - box_bd(2*i-1) + cell_num(i) = int(box_len(i)/(rc_off/2))+1 + end do + + !Initialize/allocate variables + cell_lim = 10 + allocate(num_in_cell(cell_num(1),cell_num(2),cell_num(3)), cell_list(cell_lim, cell_num(1), cell_num(2), cell_num(3))) + + !Now place points within cell + do i = 1, numinlist + !c is the position of the cell that the point belongs to + do j = 1, 3 + c(j) = int((r_list(j,i)-box_bd(2*j-1))/(rc_off/2)) + 1 + end do + + !Place the index in the correct position, growing if necessary + num_in_cell(c(1),c(2),c(3)) = num_in_cell(c(1),c(2),c(3)) + 1 + if (num_in_cell(c(1),c(2),c(3)) > cell_lim) then + allocate(resize_cell_list(cell_lim+10,cell_num(1),cell_num(2),cell_num(3))) + resize_cell_list(1:cell_lim, :, :, :) = cell_list + resize_cell_list(cell_lim+1:, :, :, :) = 0 + call move_alloc(resize_cell_list, cell_list) + end if + + cell_list(num_in_cell(c(1),c(2),c(3)),c(1),c(2),c(3)) = i + which_cell(:,i) = c + end do + + return + end subroutine build_cell_list + end module subroutines \ No newline at end of file From e9521f43f36fc1e9c7abc1a915cce447ac1369ff Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Wed, 5 Feb 2020 11:33:59 -0500 Subject: [PATCH 10/29] Fix to formatting and cell neighbor loop algorithm --- src/opt_delete.f90 | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/opt_delete.f90 b/src/opt_delete.f90 index c178ab2..89123fc 100644 --- a/src/opt_delete.f90 +++ b/src/opt_delete.f90 @@ -42,12 +42,13 @@ module opt_delete call get_command_argument(arg_pos, textholder, arg_len) if(arg_len==0) stop "Missing argument to delete overlap command" print *, textholder - read(*, textholder) rc_off - + read(textholder, *) rc_off case default print *, "Command ", trim(adjustl(textholder)), " is not accepted for option delete" stop 3 end select + + arg_pos = arg_pos + 1 end subroutine parse_delete subroutine delete_overlap @@ -79,6 +80,13 @@ module opt_delete do ci = -1, 1, 1 do cj = -1, 1, 1 do ck = -1, 1, 1 + + if (any((c + (/ ck, cj, ci /)) == 0)) cycle + + if( (c(1) + ck > cell_num(1)).or.(c(2) + cj > cell_num(2)).or. & + (c(3) + ci > cell_num(3))) cycle + + do num_nei = 1, num_in_cell(c(1) + ck, c(2) + cj, c(3) + ci) nei = cell_list(num_nei,c(1) + ck, c(2) + cj, c(3) + ci) @@ -108,10 +116,10 @@ module opt_delete end do end if - !Now delete all the atoms - call delete_atoms(delete_num, for_delete(1:delete_num)) - end do atom_loop + print *, "Overlap command deletes ", delete_num, " atoms" + !Now delete all the atoms + call delete_atoms(delete_num, for_delete(1:delete_num)) end subroutine delete_overlap end module opt_delete \ No newline at end of file From 92671ea0b288e907a2db8e11f1360b9c6c9948e3 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Wed, 5 Feb 2020 12:04:03 -0500 Subject: [PATCH 11/29] Fix to mode merge box definition --- src/mode_merge.f90 | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/mode_merge.f90 b/src/mode_merge.f90 index 2118cff..afc9bba 100644 --- a/src/mode_merge.f90 +++ b/src/mode_merge.f90 @@ -130,8 +130,9 @@ module mode_merge integer :: i, ibasis, inod real(kind=dp), dimension(3) :: current_shift + character(len=3) :: alldims - + alldims = 'xyz' !Calculate the current shift which is the filenum-1 multiplied by the user specified shift current_shift = (filenum-1)*shift_vec @@ -154,9 +155,13 @@ module mode_merge !If we don't include the wrap command then we have to increase the size of the box if(.not.(wrap_flag)) then do i = 1,3 - if (current_shift(i) < -lim_zero) then - box_bd(2*i-1) = box_bd(2*i-1) - current_shift(i) - else if (current_shift(i) > lim_zero) then + if (alldims(i:i) /= trim(adjustl(dim))) then + if (current_shift(i) < -lim_zero) then + box_bd(2*i-1) = box_bd(2*i-1) - current_shift(i) + else if (current_shift(i) > lim_zero) then + box_bd(2*i) = box_bd(2*i) + current_shift(i) + end if + else if (alldims(i:i) == trim(adjustl(dim))) then box_bd(2*i) = box_bd(2*i) + current_shift(i) end if end do From a1a506e17dcc97f2e3aff68bdff1eff8f871405c Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Thu, 6 Feb 2020 11:18:42 -0500 Subject: [PATCH 12/29] Added delete option with delete overlap command --- src/Makefile | 6 +++--- src/opt_delete.f90 | 14 ++++++++++---- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/Makefile b/src/Makefile index a036149..9a3fced 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,8 +1,8 @@ FC=ifort -FFLAGS=-mcmodel=large -g -O0 -stand f08 -fpe0 -traceback -check bounds,uninit -warn all -implicitnone -no-wrap-margin -#FFLAGS=-mcmodel=large -Ofast -no-wrap-margin +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 MODES=mode_create.o mode_merge.o mode_convert.o -OPTIONS=opt_disl.o opt_group.o opt_orient.o opt_delete.o +OPTIONS=opt_disl.o opt_group.o opt_orient.o opt_delete.o OBJECTS=main.o elements.o io.o subroutines.o functions.o atoms.o call_mode.o box.o $(MODES) $(OPTIONS) call_option.o .SUFFIXES: diff --git a/src/opt_delete.f90 b/src/opt_delete.f90 index 89123fc..6475c75 100644 --- a/src/opt_delete.f90 +++ b/src/opt_delete.f90 @@ -21,6 +21,8 @@ module opt_delete call parse_delete(arg_pos) + print *, atom_num + if (rc_off > 0.0_dp) call delete_overlap end subroutine run_delete @@ -41,7 +43,6 @@ module opt_delete arg_pos=arg_pos + 1 call get_command_argument(arg_pos, textholder, arg_len) if(arg_len==0) stop "Missing argument to delete overlap command" - print *, textholder read(textholder, *) rc_off case default print *, "Command ", trim(adjustl(textholder)), " is not accepted for option delete" @@ -57,12 +58,17 @@ module opt_delete integer :: i, c(3), ci, cj, ck, num_nei, nei, delete_num integer, dimension(atom_num) :: for_delete - integer, dimension(3,atom_num) :: which_cell !These are the variables containing the cell list information integer, dimension(3) :: cell_num - integer, allocatable :: num_in_cell(:,:,:) + integer, allocatable :: num_in_cell(:,:,:), which_cell(:,:) integer, allocatable :: cell_list(:,:,:,:) + + 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) @@ -122,4 +128,4 @@ module opt_delete !Now delete all the atoms call delete_atoms(delete_num, for_delete(1:delete_num)) end subroutine delete_overlap -end module opt_delete \ No newline at end of file +end module opt_delete From 3aed6966da50b4ab3b703f8fde12d679c5c2177c Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Fri, 7 Feb 2020 14:38:12 -0500 Subject: [PATCH 13/29] Added possibility to select random number within range --- README.md | 2 ++ src/subroutines.f90 | 20 +++++++++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index fce8dd1..8ad643f 100644 --- a/README.md +++ b/README.md @@ -281,3 +281,5 @@ Specifying positions in cacmb can be done through a variety of ways. Examples of `rand` - Returns a random position that lies within the simulation cell. +`rand[val1:val2]` - returns a random position that lies within the range + diff --git a/src/subroutines.f90 b/src/subroutines.f90 index 4f2c271..b681a54 100644 --- a/src/subroutines.f90 +++ b/src/subroutines.f90 @@ -172,20 +172,33 @@ module subroutines return end subroutine parse_ori_vec - subroutine parse_pos(i, pos_string, pos) + recursive subroutine parse_pos(i, pos_string, pos) !This subroutine parses the pos command allowing for command which include inf integer, intent(in) :: i !The dimension of the position character(len=100), intent(in) :: pos_string !The position string real(kind=dp), intent(out) :: pos !The output parsed position value integer :: iospara - real(kind=dp) :: rand + real(kind=dp) :: rand, rone, rtwo + character(len=100) :: cone, ctwo iospara = 0 if(trim(adjustl(pos_string)) == 'inf') then pos=box_bd(2*i) else if(trim(adjustl(pos_string)) == '-inf') then pos=box_bd(2*i-1) + + else if (trim(adjustl(pos_string)) == 'rand') then + call random_number(rand) + pos = (box_bd(2*i)-box_bd(2*i-1))*rand + box_bd(2*i-1) + + else if (index(pos_string,'rand')>0) then + call random_number(rand) + cone = pos_string(index(pos_string, '[')+1:index(pos_string,':')-1) + call parse_pos(i, cone, rone) + ctwo = pos_string(index(pos_string, ':')+1:index(pos_string,']')-1) + call parse_pos(i, ctwo, rtwo) + pos = (rtwo - rone)*rand + rone else if ((index(pos_string,'-') > 0).and.(index(pos_string,'inf')>0)) then !Now extract the number we are reducing from infinity if(index(pos_string,'inf') < index(pos_string,'-')) then @@ -211,9 +224,6 @@ module subroutines end if pos = (box_bd(2*i)-box_bd(2*i-1))*pos + box_bd(2*i-1) - else if (trim(adjustl(pos_string)) == 'rand') then - call random_number(rand) - pos = (box_bd(2*i)-box_bd(2*i-1))*rand + box_bd(2*i-1) else read(pos_string, *, iostat=iospara) pos end if From b97986bf04291c24630098cb632b3196e4731ca6 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Mon, 10 Feb 2020 11:38:47 -0500 Subject: [PATCH 14/29] change box definition --- src/mode_create.f90 | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/mode_create.f90 b/src/mode_create.f90 index 934895a..84b0218 100644 --- a/src/mode_create.f90 +++ b/src/mode_create.f90 @@ -27,6 +27,7 @@ module mode_create integer, intent(out) :: arg_pos integer :: i, ibasis, inod + ! real(kind = dp) :: lattice_vec(3), lattice_space( real(kind=dp), allocatable :: r_node_temp(:,:,:) print *, '-----------------------Mode Create---------------------------' @@ -68,8 +69,10 @@ module mode_create !Find the new maxlen maxbd = maxval(matmul(orient,matmul(fcc_mat,box_lat_vert)),2) do i = 1, 3 - box_bd(2*i) = maxval(box_vert(i,:)) - 0.25_dp*lattice_space(i) - box_bd(2*i-1) = origin(i)-0.25_dp*lattice_space(i) + ! box_bd(2*i) = maxval(box_vert(i,:)) - 0.25_dp*lattice_space(i) + ! box_bd(2*i-1) = origin(i)-0.25_dp*lattice_space(i) + box_bd(2*i) = maxval(box_vert(i,:)) + box_bd(2*i-1) = origin(i) end do @@ -124,8 +127,6 @@ module mode_create "element type" stop 3 end select - !Now that it is built multiply by the lattice parameter - box_bd = box_bd*lattice_parameter print *, "Using mode create, ", lat_ele_num, " elements are created and ", lat_atom_num*basisnum(1), & " atoms are created." @@ -153,6 +154,13 @@ module mode_create end if end if + !Now redefine box to ensure periodicity + call def_new_box + + do i = 1, 3 + + end do + !The last thing we do is setup the sub_box_boundaries call alloc_sub_box(1) sub_box_num = 1 From 98d00ea4312ae761a7ed1410a39bdeeac33d5e88 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Mon, 10 Feb 2020 15:44:01 -0500 Subject: [PATCH 15/29] Fix problems with mode_create.f90 --- src/mode_create.f90 | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/mode_create.f90 b/src/mode_create.f90 index 84b0218..934895a 100644 --- a/src/mode_create.f90 +++ b/src/mode_create.f90 @@ -27,7 +27,6 @@ module mode_create integer, intent(out) :: arg_pos integer :: i, ibasis, inod - ! real(kind = dp) :: lattice_vec(3), lattice_space( real(kind=dp), allocatable :: r_node_temp(:,:,:) print *, '-----------------------Mode Create---------------------------' @@ -69,10 +68,8 @@ module mode_create !Find the new maxlen maxbd = maxval(matmul(orient,matmul(fcc_mat,box_lat_vert)),2) do i = 1, 3 - ! box_bd(2*i) = maxval(box_vert(i,:)) - 0.25_dp*lattice_space(i) - ! box_bd(2*i-1) = origin(i)-0.25_dp*lattice_space(i) - box_bd(2*i) = maxval(box_vert(i,:)) - box_bd(2*i-1) = origin(i) + box_bd(2*i) = maxval(box_vert(i,:)) - 0.25_dp*lattice_space(i) + box_bd(2*i-1) = origin(i)-0.25_dp*lattice_space(i) end do @@ -127,6 +124,8 @@ module mode_create "element type" stop 3 end select + !Now that it is built multiply by the lattice parameter + box_bd = box_bd*lattice_parameter print *, "Using mode create, ", lat_ele_num, " elements are created and ", lat_atom_num*basisnum(1), & " atoms are created." @@ -154,13 +153,6 @@ module mode_create end if end if - !Now redefine box to ensure periodicity - call def_new_box - - do i = 1, 3 - - end do - !The last thing we do is setup the sub_box_boundaries call alloc_sub_box(1) sub_box_num = 1 From 9702ec85e9c37114fb0940dcb2577ccd6620e12e Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Fri, 14 Feb 2020 12:19:51 -0500 Subject: [PATCH 16/29] Added set max esize when reading in specific files --- src/io.f90 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/io.f90 b/src/io.f90 index 088459a..cb33508 100644 --- a/src/io.f90 +++ b/src/io.f90 @@ -738,6 +738,7 @@ module io sub_box_num = sub_box_num + n - + + call set_max_esize end subroutine read_mb end module io From 1b82d98a4f3a2bac5d32748adf578b527b2ef00b Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Thu, 20 Feb 2020 17:15:30 -0500 Subject: [PATCH 17/29] Added right hand rule check to orientation in mode_create --- src/mode_create.f90 | 10 ++++++++-- src/opt_delete.f90 | 6 ------ src/subroutines.f90 | 44 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 8 deletions(-) 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 From 6a0d441bd072658e359b1c9c0048bfd3a79c737d Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 21 Feb 2020 17:18:39 -0500 Subject: [PATCH 18/29] Fix to disloop code --- src/opt_disl.f90 | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/opt_disl.f90 b/src/opt_disl.f90 index 9450171..4281d12 100644 --- a/src/opt_disl.f90 +++ b/src/opt_disl.f90 @@ -285,18 +285,18 @@ module opt_disl if(loop_radius < 0.0_dp) then ALLOCATE(xLoop(4,3)) xLoop(:,:) = 0.d0 - xLoop(1,a1) = centroid(1) - loop_radius - xLoop(1,a2) = centroid(2) - loop_radius - xLoop(1,a3) = centroid(3) - xLoop(2,a1) = centroid(1) + loop_radius - xLoop(2,a2) = centroid(2) - loop_radius - xLoop(2,a3) = centroid(3) - xLoop(3,a1) = centroid(1) + loop_radius - xLoop(3,a2) = centroid(2) + loop_radius - xLoop(3,a3) = centroid(3) - xLoop(4,a1) = centroid(1) - loop_radius - xLoop(4,a2) = centroid(2) + loop_radius - xLoop(4,a3) = centroid(3) + xLoop(1,a1) = centroid(a1) + loop_radius + xLoop(1,a2) = centroid(a2) + loop_radius + xLoop(1,a3) = centroid(a3) + xLoop(2,a1) = centroid(a1) - loop_radius + xLoop(2,a2) = centroid(a2) + loop_radius + xLoop(2,a3) = centroid(a3) + xLoop(3,a1) = centroid(a1) - loop_radius + xLoop(3,a2) = centroid(a2) - loop_radius + xLoop(3,a3) = centroid(a3) + xLoop(4,a1) = centroid(a1) + loop_radius + xLoop(4,a2) = centroid(a2) - loop_radius + xLoop(4,a3) = centroid(a3) else !Calculate loop perimeter perimeter = 2.0_dp*pi*loop_radius From d0b6c595f0f0310659a972b7e5421b286d85e4e9 Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 21 Feb 2020 17:19:10 -0500 Subject: [PATCH 19/29] Fix to outputting single element --- src/mode_create.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/mode_create.f90 b/src/mode_create.f90 index 0b026c2..db6fdd0 100644 --- a/src/mode_create.f90 +++ b/src/mode_create.f90 @@ -105,8 +105,8 @@ module mode_create end do end do do i = 1,3 - box_bd(2*i) = maxval(r_node_temp(i,:,:)) - box_bd(2*i-1) = origin(i) + box_bd(2*i) = maxval(r_node_temp(i,:,:))+10.0_dp**-6.0_dp + box_bd(2*i-1) = minval(r_node_temp(i,:,:)) - 10.0_dp**-6.0_dp end do call add_element(element_type, esize, 1, 1, r_node_temp) end if From 20755270a478c755d0b454513695594dc8e8d02b Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 24 Feb 2020 12:58:13 -0500 Subject: [PATCH 20/29] Debugging version of code --- README.md | 10 ++- src/io.f90 | 3 + src/mode_create.f90 | 2 +- src/opt_group.f90 | 190 ++++++++++++++++++++++++++++++++++++-------- 4 files changed, 169 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index 8ad643f..e56e857 100644 --- a/README.md +++ b/README.md @@ -217,7 +217,15 @@ This command wraps atoms back into the simulation cell as though periodic bounda remesh esize ``` -This command remeshes the atoms/elements within the group to the new element size `esize`. Currently only accepts an `esize` of 2 which refines it to full atomistics. +This command remeshes the atoms/elements within the group to the new element size `esize`. Currently only accepts an `esize` of 2 which refines it to full atomistics. When remeshing to atomistics the group can contain any orientations of elements but when remeshing to different finite elements, the group must contain all atoms/elements with the same orientation. + +**Max** + +``` +max +``` + +This command attempts to reduce the degrees of freedom in the model by replacing them with graded elements. This code works by starting at elements with size `esize` and then checks all degrees of freedom to see which ones can be replaced by inserting the element. It then iterates over elements of `esize-2` to `esize=2` which is full atomic resolution. **Delete** diff --git a/src/io.f90 b/src/io.f90 index cb33508..3d03416 100644 --- a/src/io.f90 +++ b/src/io.f90 @@ -87,6 +87,9 @@ module io call set_max_esize do i = 1, outfilenum + + print *, "Writing data out to ", trim(adjustl(outfiles(i))) + !Pull out the extension of the file and call the correct write subroutine select case(trim(adjustl(outfiles(i)(scan(outfiles(i),'.',.true.)+1:)))) case('xyz') diff --git a/src/mode_create.f90 b/src/mode_create.f90 index db6fdd0..3cbafa2 100644 --- a/src/mode_create.f90 +++ b/src/mode_create.f90 @@ -393,7 +393,7 @@ module mode_create outerloop: do iz = 1, bd_in_array(3) do iy = 1, bd_in_array(2) do ix = 1, bd_in_array(1) - node_in_bd(8) = .false. + node_in_bd(:) = .false. do inod = 1, 8 vlat = ele(:,inod) + (/ ix, iy, iz /) diff --git a/src/opt_group.f90 b/src/opt_group.f90 index 48bd2ed..cfd6499 100644 --- a/src/opt_group.f90 +++ b/src/opt_group.f90 @@ -8,10 +8,10 @@ module opt_group use box implicit none - integer :: group_ele_num, group_atom_num, remesh_size + integer :: group_ele_num, group_atom_num, remesh_size, remesh_type character(len=15) :: type, shape !Type indicates what element type is selected and shape is the group shape - real(kind=dp) :: block_bd(6), disp_vec(3) - logical :: displace, delete + real(kind=dp) :: block_bd(6), disp_vec(3), remesh_lat_pam + logical :: displace, delete, max_remesh, refine integer, allocatable :: element_index(:), atom_index(:) @@ -29,6 +29,8 @@ module opt_group remesh_size=0 displace=.false. delete=.false. + ! max_remesh=.false. + refine = .false. if(allocated(element_index)) deallocate(element_index) if(allocated(atom_index)) deallocate(atom_index) @@ -43,6 +45,9 @@ module opt_group if(remesh_size > 0) call remesh_group if(delete) call delete_group + + if(refine) call refine_group + end subroutine group subroutine parse_group(arg_pos) @@ -101,13 +106,24 @@ module opt_group if (arglen==0) stop "Missing vector component for shift command" read(textholder, *) disp_vec(i) end do + case('refine') + refine=.true. case('remesh') arg_pos = arg_pos + 1 call get_command_argument(arg_pos, textholder, arglen) if (arglen==0) stop "Missing remesh element size in group command" read(textholder, *) remesh_size - case('delete') arg_pos = arg_pos + 1 + call get_command_argument(arg_pos, textholder, arglen) + if (arglen==0) stop "Missing remesh lattice parameter in group command" + read(textholder, *) remesh_lat_pam + arg_pos = arg_pos + 1 + call get_command_argument(arg_pos, textholder, arglen) + if (arglen==0) stop "Missing remesh type in group command" + read(textholder, *) remesh_type + case('max') + max_remesh =.true. + case('delete') delete=.true. case default !If it isn't an available option to opt_disl then we just exit @@ -211,46 +227,152 @@ module opt_group end subroutine displace_group - subroutine remesh_group + subroutine refine_group !This command is used to remesh the group to a desired element size integer :: i, j, ie, type_interp(max_basisnum*max_esize**3), add_atom_num, orig_atom_num real(kind=dp) :: r_interp(3, max_basisnum*max_esize**3) - !Refining to atoms and remeshing to elements are different processes so check which code we need to run - select case(remesh_size) - !Refining to atoms - case(2) - if(group_ele_num > 0) then - orig_atom_num = atom_num - !Estimate number of atoms we are adding, this doesn't have to be exact - add_atom_num = group_ele_num*basisnum(lat_ele(element_index(1)))*size_ele(element_index(1))**3 - call grow_ele_arrays(0,add_atom_num) - - do i = 1, group_ele_num - ie = element_index(i) - !Get the interpolated atom positions - call interpolate_atoms(type_ele(ie), size_ele(ie), lat_ele(ie), r_node(:,:,:,ie), type_interp, r_interp) - - !Loop over all interpolated atoms and add them to the system, we apply periodic boundaries - !here as well to make sure they are in the box - do j = 1, basisnum(lat_ele(ie))*size_ele(ie)**3 - call apply_periodic(r_interp(:,j)) - call add_atom(type_interp(j), sbox_ele(ie), r_interp(:,j)) - end do + + if(group_ele_num > 0) then + orig_atom_num = atom_num + !Estimate number of atoms we are adding, this doesn't have to be exact + add_atom_num = group_ele_num*basisnum(lat_ele(element_index(1)))*size_ele(element_index(1))**3 + call grow_ele_arrays(0,add_atom_num) + do i = 1, group_ele_num + ie = element_index(i) + !Get the interpolated atom positions + call interpolate_atoms(type_ele(ie), size_ele(ie), lat_ele(ie), r_node(:,:,:,ie), type_interp, r_interp) + !Loop over all interpolated atoms and add them to the system, we apply periodic boundaries + !here as well to make sure they are in the box + do j = 1, basisnum(lat_ele(ie))*size_ele(ie)**3 + call apply_periodic(r_interp(:,j)) + call add_atom(type_interp(j), sbox_ele(ie), r_interp(:,j)) + end do + end do + !Once all atoms are added we delete all of the elements + call delete_elements(group_ele_num, element_index) + print *, group_ele_num, " elements of group are refined to ", atom_num -orig_atom_num, " atoms." + end if + + end subroutine + + subroutine remesh_group + !This command is used to remesh the group to a desired element size + + integer :: i, j, ix, iy, iz, inod, ibasis, ie, type_interp(max_basisnum*max_esize**3), add_atom_num, orig_atom_num, & + current_esize, dof, max_lat(3), r_lat(3), ele(3,8), vlat(3), bd_in_lat(6), bd_in_array(3) + real(kind=dp) :: r_interp(3, max_basisnum*max_esize**3), ori_inv(3,3), & + r_new_node(3,max_basisnum, max_ng_node), orient(3,3), group_in_lat(3,8) + logical, allocatable :: lat_points(:,:,:) + character(len=100) :: remesh_ele_type + + + !Right now we just hardcode only remeshing to elements + remesh_ele_type = 'fcc' + + !Get the orientations, this assumes that the orientation of the subbox for the first atom is the + !same as the rest of the atoms + !If this assumption is false then the code will break and exit + orient = sub_box_ori(:, :, sbox_atom(atom_index(1))) + call matrix_inverse(orient,3,ori_inv) + + !First calculate max position in lattice space to be able to allocate lat_points array, also sum the total numbers of + !degrees of freedom which are added + dof = 0 + + select case(trim(adjustl(shape))) + case('block') + group_in_lat = reshape((/ block_bd(1),block_bd(3),block_bd(5), & + block_bd(2),block_bd(3),block_bd(5), & + block_bd(2),block_bd(4),block_bd(5), & + block_bd(1),block_bd(4),block_bd(5), & + block_bd(1),block_bd(3),block_bd(6), & + block_bd(2),block_bd(3),block_bd(6), & + block_bd(2),block_bd(4),block_bd(6), & + block_bd(1),block_bd(4),block_bd(6) /), [3,8]) + + group_in_lat = matmul(fcc_inv, matmul(ori_inv, group_in_lat/remesh_lat_pam)) + do i = 1, 3 + bd_in_lat(2*i-1) = minval(group_in_lat(i,:)) + bd_in_lat(2*i) = maxval(group_in_lat(i,:)) end do - !Once all atoms are added we delete all of the elements - call delete_elements(group_ele_num, element_index) + end select - print *, group_ele_num, " elements of group are refined to ", atom_num -orig_atom_num, " atoms." + allocate(lat_points(bd_in_lat(2)-bd_in_lat(1)+10, bd_in_lat(4)-bd_in_lat(3)+10, bd_in_lat(6)-bd_in_lat(5)+10)) + lat_points(:,:,:) = .false. + + !Now place all group atoms and group interpolated atoms into lat_points + do i = 1, group_atom_num + r_lat = r_atom(:,atom_index(i))/remesh_lat_pam + r_lat = matmul(fcc_inv,matmul(ori_inv,r_lat)) + !Do a check to make sure the code is working and that lattice points aren't being written on top of each other. + !This is primarily a debugging statement + if((r_lat(1)==13).and.(r_lat(2)==13).and.(r_lat(3)==-13)) then + print *, i, atom_index(i), r_atom(:,atom_index(i)) + end if + if(lat_points(r_lat(1)-bd_in_lat(1)+5,r_lat(2)-bd_in_lat(3)+5,r_lat(3)-bd_in_lat(5)+5)) then + stop "Multiple atoms share same position in lat point array, this shouldn't happen" + else + lat_points(r_lat(1)-bd_in_lat(1)+5, r_lat(2)-bd_in_lat(3)+5, r_lat(3)-bd_in_lat(5)+5) = .true. + end if + end do + + !Now place interpolated atoms within lat_points array + do i =1, group_ele_num + ie = element_index(i) + call interpolate_atoms(type_ele(ie), size_ele(ie), lat_ele(ie), r_node(:,:,:,ie), type_interp, r_interp) + do j = 1, size_ele(ie)**3 * basisnum(lat_ele(ie)) + r_lat = matmul(fcc_inv,matmul(ori_inv, r_interp(:,atom_index(i))/remesh_lat_pam)) + 1 + !Do a check to make sure the code is working and that lattice points aren't being written on top of each other. + !This is primarily a debugging statement + if(lat_points(r_lat(1)-bd_in_lat(1)+5,r_lat(2)-bd_in_lat(3)+5,r_lat(3)-bd_in_lat(5)+5)) then + stop "Multiple atoms/interpolated atoms share same position in lat point array, this shouldn't happen" + else + lat_points(r_lat(1)-bd_in_lat(1)+5, r_lat(2)-bd_in_lat(3)+5, r_lat(3)-bd_in_lat(5)+5) = .true. + end if + end do + end do + + !Delete all elements and atoms to make space for new elements and atoms + call delete_atoms(group_atom_num, atom_index) + call delete_elements(group_ele_num, element_index) + + !Now run remeshing algorithm, not the most optimized or efficient but gets the job done + + ele = (remesh_size-1)*cubic_cell + + !Figure out new looping boundaries + bd_in_array(1) = bd_in_lat(2) - bd_in_lat(1) + 10 + bd_in_array(2) = bd_in_lat(4) - bd_in_lat(3) + 10 + bd_in_array(3) = bd_in_lat(6) - bd_in_lat(5) + 10 + + do iz = 1, bd_in_array(3) + do iy = 1, bd_in_array(2) + do ix = 1, bd_in_array(1) + if (lat_points(ix, iy,iz)) then + if (all(lat_points(ix:ix+remesh_size-1,iy:iy+remesh_size-1,iz:iz+remesh_size-1))) then + do inod = 1, 8 + vlat = ele(:,inod) + (/ix, iy, iz /) + do i = 1, 3 + vlat = vlat + bd_in_lat(2*i-1)-5 + end do + r_new_node(:,1,inod) = matmul(orient, matmul(fcc_mat, vlat))*remesh_lat_pam + end do + + lat_points(ix:ix+remesh_size-1,iy:iy+remesh_size-1,iz:iz+remesh_size-1) = .false. + !Add the element, for the sbox we just set it to the same sbox that we get the orientation from. + !In this case it is from the sbox of the first atom in the group. + call add_element(remesh_ele_type, remesh_size, remesh_type, sbox_atom(atom_index(1)),r_new_node) + + end if + end if + end do + end do + end do - end if - !Remeshing to elements, currently not available - case default - print *, "Remeshing to elements is currently not available. Please refine to atoms by passing a remsh size of 2" - end select end subroutine remesh_group From c698c31ede5a5d90ce9ccf62665a4c503a1a439e Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Mon, 24 Feb 2020 14:23:32 -0500 Subject: [PATCH 21/29] First version that doesn't crash, incorrectly places elements and atoms --- src/opt_group.f90 | 51 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/src/opt_group.f90 b/src/opt_group.f90 index cfd6499..8ff789a 100644 --- a/src/opt_group.f90 +++ b/src/opt_group.f90 @@ -263,7 +263,7 @@ module opt_group integer :: i, j, ix, iy, iz, inod, ibasis, ie, type_interp(max_basisnum*max_esize**3), add_atom_num, orig_atom_num, & current_esize, dof, max_lat(3), r_lat(3), ele(3,8), vlat(3), bd_in_lat(6), bd_in_array(3) - real(kind=dp) :: r_interp(3, max_basisnum*max_esize**3), ori_inv(3,3), & + real(kind=dp) :: r_interp(3, max_basisnum*max_esize**3), ori_inv(3,3), r(3), & r_new_node(3,max_basisnum, max_ng_node), orient(3,3), group_in_lat(3,8) logical, allocatable :: lat_points(:,:,:) character(len=100) :: remesh_ele_type @@ -295,8 +295,8 @@ module opt_group group_in_lat = matmul(fcc_inv, matmul(ori_inv, group_in_lat/remesh_lat_pam)) do i = 1, 3 - bd_in_lat(2*i-1) = minval(group_in_lat(i,:)) - bd_in_lat(2*i) = maxval(group_in_lat(i,:)) + bd_in_lat(2*i-1) = nint(minval(group_in_lat(i,:))) + bd_in_lat(2*i) = nint(maxval(group_in_lat(i,:))) end do end select @@ -306,8 +306,11 @@ module opt_group !Now place all group atoms and group interpolated atoms into lat_points do i = 1, group_atom_num - r_lat = r_atom(:,atom_index(i))/remesh_lat_pam - r_lat = matmul(fcc_inv,matmul(ori_inv,r_lat)) + r = r_atom(:,atom_index(i))/remesh_lat_pam + r = matmul(fcc_inv,matmul(ori_inv,r)) + do j = 1, 3 + r_lat(j) = nint(r(j)) + end do !Do a check to make sure the code is working and that lattice points aren't being written on top of each other. !This is primarily a debugging statement if((r_lat(1)==13).and.(r_lat(2)==13).and.(r_lat(3)==-13)) then @@ -349,10 +352,20 @@ module opt_group bd_in_array(2) = bd_in_lat(4) - bd_in_lat(3) + 10 bd_in_array(3) = bd_in_lat(6) - bd_in_lat(5) + 10 - do iz = 1, bd_in_array(3) - do iy = 1, bd_in_array(2) - do ix = 1, bd_in_array(1) + zloop: do iz = 1, bd_in_array(3) + yloop: do iy = 1, bd_in_array(2) + xloop: do ix = 1, bd_in_array(1) if (lat_points(ix, iy,iz)) then + + !Check to see if the element overshoots the bound + if (iz+remesh_size-1 > bd_in_array(3)) then + exit zloop + else if (iy+remesh_size-1 > bd_in_array(2)) then + cycle zloop + else if (ix+remesh_size-1 > bd_in_array(1)) then + cycle yloop + end if + if (all(lat_points(ix:ix+remesh_size-1,iy:iy+remesh_size-1,iz:iz+remesh_size-1))) then do inod = 1, 8 vlat = ele(:,inod) + (/ix, iy, iz /) @@ -369,11 +382,25 @@ module opt_group end if end if - end do - end do - end do - + end do xloop + end do yloop + end do zloop + !Now we have to add any leftover lattice points as atoms + do iz = 1, bd_in_array(3) + do iy=1, bd_in_array(2) + do ix = 1, bd_in_array(1) + if(lat_points(ix,iy,iz)) then + vlat = (/ ix, iy, iz /) + do i = 1, 3 + vlat = vlat + bd_in_lat(2*i-1)-5 + end do + r = matmul(orient, matmul(fcc_mat, vlat))*remesh_lat_pam + call add_atom(remesh_type, sbox_atom(atom_index(1)), r) + end if + end do + end do + end do end subroutine remesh_group From 56994393a07c4c58d53354e0f646e9cafcf58b24 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 25 Feb 2020 10:11:12 -0500 Subject: [PATCH 22/29] Fix to bug causing incorrrect positions. Remeshing algorithm works --- src/opt_group.f90 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/opt_group.f90 b/src/opt_group.f90 index 8ff789a..2176a88 100644 --- a/src/opt_group.f90 +++ b/src/opt_group.f90 @@ -370,7 +370,7 @@ module opt_group do inod = 1, 8 vlat = ele(:,inod) + (/ix, iy, iz /) do i = 1, 3 - vlat = vlat + bd_in_lat(2*i-1)-5 + vlat(i) = vlat(i) + bd_in_lat(2*i-1)-5 end do r_new_node(:,1,inod) = matmul(orient, matmul(fcc_mat, vlat))*remesh_lat_pam end do @@ -393,7 +393,7 @@ module opt_group if(lat_points(ix,iy,iz)) then vlat = (/ ix, iy, iz /) do i = 1, 3 - vlat = vlat + bd_in_lat(2*i-1)-5 + vlat(i) = vlat(i) + bd_in_lat(2*i-1)-5 end do r = matmul(orient, matmul(fcc_mat, vlat))*remesh_lat_pam call add_atom(remesh_type, sbox_atom(atom_index(1)), r) From 09c2e6315500256d7b32a21eb9b221590910562f Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 25 Feb 2020 10:34:09 -0500 Subject: [PATCH 23/29] Working element refinement --- src/opt_group.f90 | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/opt_group.f90 b/src/opt_group.f90 index 2176a88..3b40f14 100644 --- a/src/opt_group.f90 +++ b/src/opt_group.f90 @@ -261,7 +261,7 @@ module opt_group subroutine remesh_group !This command is used to remesh the group to a desired element size - integer :: i, j, ix, iy, iz, inod, ibasis, ie, type_interp(max_basisnum*max_esize**3), add_atom_num, orig_atom_num, & + integer :: i, j, k, ix, iy, iz, inod, ibasis, ie, type_interp(max_basisnum*max_esize**3), add_atom_num, orig_atom_num, & current_esize, dof, max_lat(3), r_lat(3), ele(3,8), vlat(3), bd_in_lat(6), bd_in_array(3) real(kind=dp) :: r_interp(3, max_basisnum*max_esize**3), ori_inv(3,3), r(3), & r_new_node(3,max_basisnum, max_ng_node), orient(3,3), group_in_lat(3,8) @@ -313,9 +313,6 @@ module opt_group end do !Do a check to make sure the code is working and that lattice points aren't being written on top of each other. !This is primarily a debugging statement - if((r_lat(1)==13).and.(r_lat(2)==13).and.(r_lat(3)==-13)) then - print *, i, atom_index(i), r_atom(:,atom_index(i)) - end if if(lat_points(r_lat(1)-bd_in_lat(1)+5,r_lat(2)-bd_in_lat(3)+5,r_lat(3)-bd_in_lat(5)+5)) then stop "Multiple atoms share same position in lat point array, this shouldn't happen" else @@ -328,7 +325,11 @@ module opt_group ie = element_index(i) call interpolate_atoms(type_ele(ie), size_ele(ie), lat_ele(ie), r_node(:,:,:,ie), type_interp, r_interp) do j = 1, size_ele(ie)**3 * basisnum(lat_ele(ie)) - r_lat = matmul(fcc_inv,matmul(ori_inv, r_interp(:,atom_index(i))/remesh_lat_pam)) + 1 + r = r_interp(:,j)/remesh_lat_pam + r = matmul(fcc_inv,matmul(ori_inv,r)) + do k = 1, 3 + r_lat(k) = nint(r(k)) + end do !Do a check to make sure the code is working and that lattice points aren't being written on top of each other. !This is primarily a debugging statement if(lat_points(r_lat(1)-bd_in_lat(1)+5,r_lat(2)-bd_in_lat(3)+5,r_lat(3)-bd_in_lat(5)+5)) then @@ -395,6 +396,7 @@ module opt_group do i = 1, 3 vlat(i) = vlat(i) + bd_in_lat(2*i-1)-5 end do + lat_points(ix,iy,iz) = .false. r = matmul(orient, matmul(fcc_mat, vlat))*remesh_lat_pam call add_atom(remesh_type, sbox_atom(atom_index(1)), r) end if From 5b925122df056f81cc89bec839bff845516ad297 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 25 Feb 2020 10:47:07 -0500 Subject: [PATCH 24/29] Added verbosity to remesh command --- src/opt_group.f90 | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/opt_group.f90 b/src/opt_group.f90 index 3b40f14..59270b5 100644 --- a/src/opt_group.f90 +++ b/src/opt_group.f90 @@ -262,7 +262,7 @@ module opt_group !This command is used to remesh the group to a desired element size integer :: i, j, k, ix, iy, iz, inod, ibasis, ie, type_interp(max_basisnum*max_esize**3), add_atom_num, orig_atom_num, & - current_esize, dof, max_lat(3), r_lat(3), ele(3,8), vlat(3), bd_in_lat(6), bd_in_array(3) + current_esize, dof, max_lat(3), r_lat(3), ele(3,8), vlat(3), bd_in_lat(6), bd_in_array(3), old_ele, old_atom real(kind=dp) :: r_interp(3, max_basisnum*max_esize**3), ori_inv(3,3), r(3), & r_new_node(3,max_basisnum, max_ng_node), orient(3,3), group_in_lat(3,8) logical, allocatable :: lat_points(:,:,:) @@ -303,6 +303,7 @@ module opt_group allocate(lat_points(bd_in_lat(2)-bd_in_lat(1)+10, bd_in_lat(4)-bd_in_lat(3)+10, bd_in_lat(6)-bd_in_lat(5)+10)) lat_points(:,:,:) = .false. + dof = 0 !Now place all group atoms and group interpolated atoms into lat_points do i = 1, group_atom_num @@ -317,6 +318,7 @@ module opt_group stop "Multiple atoms share same position in lat point array, this shouldn't happen" else lat_points(r_lat(1)-bd_in_lat(1)+5, r_lat(2)-bd_in_lat(3)+5, r_lat(3)-bd_in_lat(5)+5) = .true. + dof = dof + 1 end if end do @@ -336,14 +338,20 @@ module opt_group stop "Multiple atoms/interpolated atoms share same position in lat point array, this shouldn't happen" else lat_points(r_lat(1)-bd_in_lat(1)+5, r_lat(2)-bd_in_lat(3)+5, r_lat(3)-bd_in_lat(5)+5) = .true. + dof = dof + 1 end if end do end do + print *, "Group has ", dof, " degrees of freedom to remesh" + !Delete all elements and atoms to make space for new elements and atoms call delete_atoms(group_atom_num, atom_index) call delete_elements(group_ele_num, element_index) + old_atom = atom_num + old_ele = ele_num + !Now run remeshing algorithm, not the most optimized or efficient but gets the job done ele = (remesh_size-1)*cubic_cell @@ -404,6 +412,8 @@ module opt_group end do end do + + print *, "Remeshing has created ", ele_num-old_ele, " elements and ", atom_num-old_atom, " atoms." end subroutine remesh_group subroutine delete_group From d670bb50830edd9fe1a296de8a96df2105567773 Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 28 Feb 2020 09:36:33 -0500 Subject: [PATCH 25/29] Working remesh command and remesh max command --- src/io.f90 | 17 +++++++++-- src/opt_group.f90 | 78 +++++++++++++++++++++++++++-------------------- 2 files changed, 60 insertions(+), 35 deletions(-) diff --git a/src/io.f90 b/src/io.f90 index 3d03416..b1bc084 100644 --- a/src/io.f90 +++ b/src/io.f90 @@ -310,6 +310,9 @@ module io 20 format('SCALARS lattice_type float', /& 'LOOKUP_TABLE default') +21 format('SCALARS esize float', /& + 'LOOKUP_TABLE default') + !First we write the vtk file containing the atoms open(unit=11, file='atoms_'//trim(adjustl(file)), action='write', status='replace',position='rewind') @@ -358,6 +361,10 @@ module io do i = 1, ele_num write(11, '(i16)') lat_ele(i) end do + write(11,21) + do i = 1, ele_num + write(11, '(i16)') size_ele(i) + end do close(11) end subroutine @@ -624,8 +631,13 @@ module io !Read in the box boundary and grow the current active box bd read(11, *) temp_box_bd(:) + print *, "displace", displace do i = 1, 3 - newdisplace(i) = displace(i) - temp_box_bd(2*i-1) + if (displace(i) > lim_zero) then + newdisplace(i) = displace(i) - temp_box_bd(2*i-1) + else + newdisplace=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 @@ -717,7 +729,8 @@ module io !Read the atoms do i = 1, in_atoms read(11,*) j, type, sbox, r(:) - call add_atom(new_type_to_type(type), sbox, r+newdisplace ) + r = r+newdisplace + call add_atom(new_type_to_type(type), sbox, r) end do !Read the elements diff --git a/src/opt_group.f90 b/src/opt_group.f90 index 59270b5..03b3063 100644 --- a/src/opt_group.f90 +++ b/src/opt_group.f90 @@ -29,7 +29,7 @@ module opt_group remesh_size=0 displace=.false. delete=.false. - ! max_remesh=.false. + max_remesh=.false. refine = .false. if(allocated(element_index)) deallocate(element_index) @@ -262,7 +262,9 @@ module opt_group !This command is used to remesh the group to a desired element size integer :: i, j, k, ix, iy, iz, inod, ibasis, ie, type_interp(max_basisnum*max_esize**3), add_atom_num, orig_atom_num, & - current_esize, dof, max_lat(3), r_lat(3), ele(3,8), vlat(3), bd_in_lat(6), bd_in_array(3), old_ele, old_atom + current_esize, dof, max_lat(3), r_lat(3), ele(3,8), vlat(3), bd_in_lat(6), bd_in_array(3), old_ele, old_atom, & + max_loops, working_esize + real(kind=dp) :: r_interp(3, max_basisnum*max_esize**3), ori_inv(3,3), r(3), & r_new_node(3,max_basisnum, max_ng_node), orient(3,3), group_in_lat(3,8) logical, allocatable :: lat_points(:,:,:) @@ -352,48 +354,58 @@ module opt_group old_atom = atom_num old_ele = ele_num - !Now run remeshing algorithm, not the most optimized or efficient but gets the job done - ele = (remesh_size-1)*cubic_cell + !Now run remeshing algorithm, not the most optimized or efficient but gets the job done !Figure out new looping boundaries bd_in_array(1) = bd_in_lat(2) - bd_in_lat(1) + 10 bd_in_array(2) = bd_in_lat(4) - bd_in_lat(3) + 10 bd_in_array(3) = bd_in_lat(6) - bd_in_lat(5) + 10 - zloop: do iz = 1, bd_in_array(3) - yloop: do iy = 1, bd_in_array(2) - xloop: do ix = 1, bd_in_array(1) - if (lat_points(ix, iy,iz)) then - - !Check to see if the element overshoots the bound - if (iz+remesh_size-1 > bd_in_array(3)) then - exit zloop - else if (iy+remesh_size-1 > bd_in_array(2)) then - cycle zloop - else if (ix+remesh_size-1 > bd_in_array(1)) then - cycle yloop - end if - - if (all(lat_points(ix:ix+remesh_size-1,iy:iy+remesh_size-1,iz:iz+remesh_size-1))) then - do inod = 1, 8 - vlat = ele(:,inod) + (/ix, iy, iz /) - do i = 1, 3 - vlat(i) = vlat(i) + bd_in_lat(2*i-1)-5 + + if (max_remesh) then + max_loops = (remesh_size-2)/2 + else + max_loops = 1 + end if + do j = 1, max_loops + working_esize = remesh_size - 2*(j-1) + ele = (working_esize-1)*cubic_cell + zloop: do iz = 1, bd_in_array(3) + yloop: do iy = 1, bd_in_array(2) + xloop: do ix = 1, bd_in_array(1) + if (lat_points(ix, iy,iz)) then + r_new_node(:,:,:) = 0.0_dp + + !Check to see if the element overshoots the bound + if (iz+working_esize-1 > bd_in_array(3)) then + exit zloop + else if (iy+working_esize-1 > bd_in_array(2)) then + cycle zloop + else if (ix+working_esize-1 > bd_in_array(1)) then + cycle yloop + end if + + if (all(lat_points(ix:ix+working_esize-1,iy:iy+working_esize-1,iz:iz+working_esize-1))) then + do inod = 1, ng_node(remesh_type) + vlat = ele(:,inod) + (/ix, iy, iz /) + do i = 1, 3 + vlat(i) = vlat(i) + bd_in_lat(2*i-1)-5 + end do + r_new_node(:,1,inod) = matmul(orient, matmul(fcc_mat, vlat))*remesh_lat_pam end do - r_new_node(:,1,inod) = matmul(orient, matmul(fcc_mat, vlat))*remesh_lat_pam - end do - lat_points(ix:ix+remesh_size-1,iy:iy+remesh_size-1,iz:iz+remesh_size-1) = .false. - !Add the element, for the sbox we just set it to the same sbox that we get the orientation from. - !In this case it is from the sbox of the first atom in the group. - call add_element(remesh_ele_type, remesh_size, remesh_type, sbox_atom(atom_index(1)),r_new_node) + lat_points(ix:ix+working_esize-1,iy:iy+working_esize-1,iz:iz+working_esize-1) = .false. + !Add the element, for the sbox we just set it to the same sbox that we get the orientation from. + !In this case it is from the sbox of the first atom in the group. + call add_element(remesh_ele_type, working_esize, remesh_type, sbox_atom(atom_index(1)),r_new_node) + end if end if - end if - end do xloop - end do yloop - end do zloop + end do xloop + end do yloop + end do zloop + end do !Now we have to add any leftover lattice points as atoms do iz = 1, bd_in_array(3) From 27faeee5eadd0f834f22398e66e47cf0d65f62bc Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Mon, 2 Mar 2020 12:24:22 -0500 Subject: [PATCH 26/29] Working code which picks random position slightly outside element bounds --- Numbered_element.png | Bin 0 -> 168036 bytes README.md | 21 ++++++- src/elements.f90 | 136 +++++++++++++++++++++++++++++++++++++++++-- src/io.f90 | 4 +- src/subroutines.f90 | 62 +------------------- 5 files changed, 154 insertions(+), 69 deletions(-) create mode 100644 Numbered_element.png diff --git a/Numbered_element.png b/Numbered_element.png new file mode 100644 index 0000000000000000000000000000000000000000..9930917fa300eb5251af8f10f216666d0bef683b GIT binary patch literal 168036 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ⅈ3<)=9rL8#-R^#? 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%0Aw^^xJpIR^26m&qCKF;(DE1a{k@&rEKcHL_AFB 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

r?8=97sTSS&mlN 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 z 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 literal 0 HcmV?d00001 diff --git a/README.md b/README.md index e56e857..d387a8d 100644 --- a/README.md +++ b/README.md @@ -214,10 +214,10 @@ This command wraps atoms back into the simulation cell as though periodic bounda **Remesh** ``` -remesh esize +remesh esize lattice_parameter lattice_type ``` -This command remeshes the atoms/elements within the group to the new element size `esize`. Currently only accepts an `esize` of 2 which refines it to full atomistics. When remeshing to atomistics the group can contain any orientations of elements but when remeshing to different finite elements, the group must contain all atoms/elements with the same orientation. +This command remeshes the atoms/elements within the group to the new element size `esize`. Currently only accepts an `esize` of 2 which refines it to full atomistics. When remeshing to atomistics the group can contain any orientations of elements but when remeshing to different finite elements, the group must contain all atoms/elements with the same orientation. `lattice_parameter` is the lattice parameter for the elements within the group and `lattice_type` is the lattice type (integer) that these new elements will be assigned to. **Max** @@ -291,3 +291,20 @@ Specifying positions in cacmb can be done through a variety of ways. Examples of `rand[val1:val2]` - returns a random position that lies within the range +`rande[facenum]` - Returns a random position in an interelement boundary which is offset of the element face `facenum`. Face numbers are based on the which vertices comprise the face. Vertex numbers are shown in the figure below for the primitive fcc unit cell which is what the fcc rhombohedral element is based from. The face numbers are: + +Face 1: [1,2,3,4] + +Face 2: [1,2,6,5] + +Face 3: [2,3,7,6] + +Face 4: [3,4,8,7] + +Face 5: [1,4,8,5] + +Face 6: [5,6,7,8] + +Image for vertex numbers is: + +![](/home/alexselimov/Documents/CACmb/Numbered_element.png) \ No newline at end of file diff --git a/src/elements.f90 b/src/elements.f90 index b4b8814..fed369f 100644 --- a/src/elements.f90 +++ b/src/elements.f90 @@ -64,11 +64,11 @@ module elements shape(fcc_cell)) !Now we create a list containing the list of vertices needed to describe the 6 cube faces - cubic_faces(:,1) = (/ 1, 4, 8, 5 /) - cubic_faces(:,2) = (/ 2, 3, 7, 6 /) - cubic_faces(:,3) = (/ 1, 2, 6, 5 /) + cubic_faces(:,1) = (/ 1, 2, 3, 4 /) + cubic_faces(:,2) = (/ 1, 2, 6, 5 /) + cubic_faces(:,3) = (/ 2, 3, 7, 6 /) cubic_faces(:,4) = (/ 3, 4, 8, 7 /) - cubic_faces(:,5) = (/ 1, 2, 3, 4 /) + cubic_faces(:,5) = (/ 1, 4, 8, 5 /) cubic_faces(:,6) = (/ 5, 6, 7, 8 /) !!Now initialize the fcc primitive cell @@ -491,4 +491,132 @@ module elements end do end subroutine + recursive subroutine parse_pos(i, pos_string, pos) + !This subroutine parses the pos command allowing for command which include inf + integer, intent(in) :: i !The dimension of the position + character(len=100), intent(in) :: pos_string !The position string + real(kind=dp), intent(out) :: pos !The output parsed position value + + integer :: iospara, face, ele + real(kind=dp) :: rand, rone, rtwo, rand_ele_pos(3) + character(len=100) :: cone, ctwo + + iospara = 0 + + if(trim(adjustl(pos_string)) == 'inf') then + pos=box_bd(2*i) + + else if(trim(adjustl(pos_string)) == '-inf') then + pos=box_bd(2*i-1) + + else if (trim(adjustl(pos_string)) == 'rand') then + call random_number(rand) + pos = (box_bd(2*i)-box_bd(2*i-1))*rand + box_bd(2*i-1) + + else if (index(pos_string,'rande')>0) then + !First select a random element + call random_number(rand) + ele= 1 + floor(ele_num*rand) + !Now read the rest of the command which specifies the face we need and check + !to make sure it's an accepted face number + cone = pos_string(index(pos_string, '[')+1:index(pos_string, '[')+1) + read(cone, *) face + if ((face < 1).or.(face > 6)) stop "Current face number must be 1,2,3,4,5,6. Please check documentation" + !Now get the position + call offset_pos(ele, face, rand_ele_pos) + pos = rand_ele_pos(i) + + else if (index(pos_string,'rand')>0) then + call random_number(rand) + cone = pos_string(index(pos_string, '[')+1:index(pos_string,':')-1) + call parse_pos(i, cone, rone) + ctwo = pos_string(index(pos_string, ':')+1:index(pos_string,']')-1) + call parse_pos(i, ctwo, rtwo) + pos = (rtwo - rone)*rand + rone + + else if ((index(pos_string,'-') > 0).and.(index(pos_string,'inf')>0)) then + !Now extract the number we are reducing from infinity + if(index(pos_string,'inf') < index(pos_string,'-')) then + read(pos_string(index(pos_string,'-')+1:), *, iostat=iospara) pos + else + read(pos_string(1:index(pos_string,'-')-1), *, iostat=iospara) pos + end if + pos = box_bd(2*i) - pos + + else if ((index(pos_string,'+') > 0).and.(index(pos_string,'inf')>0)) then + !Now extract the number we are reducing from infinity + if(index(pos_string,'inf') < index(pos_string,'+')) then + read(pos_string(index(pos_string,'+')+1:), *, iostat=iospara) pos + else + read(pos_string(1:index(pos_string,'+')-1), *, iostat=iospara) pos + end if + pos = box_bd(2*i-1) + pos + + else if ((index(pos_string,'*') > 0).and.(index(pos_string,'inf')>0)) then + !Now extract the number we are reducing from infinity + if(index(pos_string,'inf') < index(pos_string,'*')) then + read(pos_string(index(pos_string,'*')+1:), *, iostat=iospara) pos + else + read(pos_string(1:index(pos_string,'*')-1), *, iostat=iospara) pos + end if + pos = (box_bd(2*i)-box_bd(2*i-1))*pos + box_bd(2*i-1) + + else + read(pos_string, *, iostat=iospara) pos + + end if + + if (iospara > 0) then + print *, "Error reading position argument ", trim(adjustl(pos_string)), ". Please reformat and try again." + end if + end subroutine parse_pos + + subroutine offset_pos(ie, iface, pos) + !This returns a position slightly offset from the center of an element face + !This is used to return a random position within an element discontinuity + + integer, intent(in) :: ie !Element index + integer, intent(in) :: iface !Face number between 1 and 6 + real(kind=dp), dimension(3), intent(out) :: pos !Position vector + + !Other variables we need + integer :: esize + real(kind=dp) :: orient(3,3), ori_inv(3,3), lp, r_cubic_node(3,8) + + !First find the offset vector for the face in the untransformed cubic cell + esize = size_ele(ie) + select case(iface) + case(1) + pos = (/ real(esize-1,dp)/2.0_dp, real(esize-1,dp)/2.0_dp, -10.0_dp**-2.0_dp /) + case(2) + pos = (/ real(esize-1,dp)/2.0_dp, -10.0_dp**-2.0_dp, real(esize-1,dp)/2.0_dp /) + 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 /) + 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 /) + case(5) + pos = (/ -10.0_dp**-2.0_dp, real(esize-1,dp)/2.0_dp, real(esize-1,dp)/2.0_dp /) + 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 /) + end select + + !Now transform it to real space and adjust it to the position of the element in the first node. + select case (trim(adjustl(type_ele(ie)))) + + case('fcc') + !First we have to extract the element lattice parameter + call matrix_inverse(sub_box_ori(:,:,sbox_ele(ie)),3,ori_inv) + r_cubic_node = r_node(:,1,:,ie) + r_cubic_node = matmul(fcc_inv,matmul(ori_inv,r_cubic_node)) + lp = (maxval(r_cubic_node(1,:))-minval(r_cubic_node(1,:)))/(esize-1) + pos = matmul(sub_box_ori(:,:,sbox_ele(ie)),matmul(fcc_mat,pos))*lp + pos = pos + r_node(:,1, 1, ie) + + case default + print *, trim(adjustl(type_ele(ie))), " is not a currently accepted element type for random element positions" + stop 3 + + end select + end subroutine + end module elements \ No newline at end of file diff --git a/src/io.f90 b/src/io.f90 index b1bc084..f4928e4 100644 --- a/src/io.f90 +++ b/src/io.f90 @@ -730,7 +730,7 @@ module io do i = 1, in_atoms read(11,*) j, type, sbox, r(:) r = r+newdisplace - call add_atom(new_type_to_type(type), sbox, r) + call add_atom(new_type_to_type(type), sbox+sub_box_num, r) end do !Read the elements @@ -742,7 +742,7 @@ module io r_innode(:,ibasis,inod) = r_innode(:, ibasis, inod) + newdisplace end do end do - call add_element(etype, size, new_lattice_map(type), sbox+n, r_innode) + call add_element(etype, size, new_lattice_map(type), sbox+sub_box_num, r_innode) end do !Close the file being read diff --git a/src/subroutines.f90 b/src/subroutines.f90 index 4e3d9a9..0be8d0e 100644 --- a/src/subroutines.f90 +++ b/src/subroutines.f90 @@ -171,67 +171,7 @@ module subroutines return end subroutine parse_ori_vec - - recursive subroutine parse_pos(i, pos_string, pos) - !This subroutine parses the pos command allowing for command which include inf - integer, intent(in) :: i !The dimension of the position - character(len=100), intent(in) :: pos_string !The position string - real(kind=dp), intent(out) :: pos !The output parsed position value - - integer :: iospara - real(kind=dp) :: rand, rone, rtwo - character(len=100) :: cone, ctwo - - iospara = 0 - if(trim(adjustl(pos_string)) == 'inf') then - pos=box_bd(2*i) - else if(trim(adjustl(pos_string)) == '-inf') then - pos=box_bd(2*i-1) - - else if (trim(adjustl(pos_string)) == 'rand') then - call random_number(rand) - pos = (box_bd(2*i)-box_bd(2*i-1))*rand + box_bd(2*i-1) - - else if (index(pos_string,'rand')>0) then - call random_number(rand) - cone = pos_string(index(pos_string, '[')+1:index(pos_string,':')-1) - call parse_pos(i, cone, rone) - ctwo = pos_string(index(pos_string, ':')+1:index(pos_string,']')-1) - call parse_pos(i, ctwo, rtwo) - pos = (rtwo - rone)*rand + rone - else if ((index(pos_string,'-') > 0).and.(index(pos_string,'inf')>0)) then - !Now extract the number we are reducing from infinity - if(index(pos_string,'inf') < index(pos_string,'-')) then - read(pos_string(index(pos_string,'-')+1:), *, iostat=iospara) pos - else - read(pos_string(1:index(pos_string,'-')-1), *, iostat=iospara) pos - end if - pos = box_bd(2*i) - pos - else if ((index(pos_string,'+') > 0).and.(index(pos_string,'inf')>0)) then - !Now extract the number we are reducing from infinity - if(index(pos_string,'inf') < index(pos_string,'+')) then - read(pos_string(index(pos_string,'+')+1:), *, iostat=iospara) pos - else - read(pos_string(1:index(pos_string,'+')-1), *, iostat=iospara) pos - end if - pos = box_bd(2*i-1) + pos - else if ((index(pos_string,'*') > 0).and.(index(pos_string,'inf')>0)) then - !Now extract the number we are reducing from infinity - if(index(pos_string,'inf') < index(pos_string,'*')) then - read(pos_string(index(pos_string,'*')+1:), *, iostat=iospara) pos - else - read(pos_string(1:index(pos_string,'*')-1), *, iostat=iospara) pos - end if - pos = (box_bd(2*i)-box_bd(2*i-1))*pos + box_bd(2*i-1) - - else - read(pos_string, *, iostat=iospara) pos - end if - - if (iospara > 0) then - print *, "Error reading position argument ", trim(adjustl(pos_string)), ". Please reformat and try again." - end if - end subroutine parse_pos + subroutine heapsort(a) From 1a30968dcaa464840aa440b8ecbbd10777c2e921 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Wed, 4 Mar 2020 21:04:39 -0500 Subject: [PATCH 27/29] Added the rand element code --- src/elements.f90 | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/elements.f90 b/src/elements.f90 index fed369f..f63b6b2 100644 --- a/src/elements.f90 +++ b/src/elements.f90 @@ -497,7 +497,7 @@ module elements character(len=100), intent(in) :: pos_string !The position string real(kind=dp), intent(out) :: pos !The output parsed position value - integer :: iospara, face, ele + integer :: iospara, face, ele, randsize real(kind=dp) :: rand, rone, rtwo, rand_ele_pos(3) character(len=100) :: cone, ctwo @@ -520,6 +520,18 @@ module elements !Now read the rest of the command which specifies the face we need and check !to make sure it's an accepted face number cone = pos_string(index(pos_string, '[')+1:index(pos_string, '[')+1) + + !Check to see if we also pass an element size, if it was passed then make sure our + !random element is the right size + if(index(pos_string,':') > 0) then + ctwo = pos_string(index(pos_string, ':')+1:index(pos_string,']')-1) + read(ctwo, *) randsize + do while(randsize /= size_ele(ele)) + call random_number(rand) + ele= 1 + floor(ele_num*rand) + end do + end if + read(cone, *) face if ((face < 1).or.(face > 6)) stop "Current face number must be 1,2,3,4,5,6. Please check documentation" !Now get the position From 9038242b98c849d6de3285e540d7d833464b721f Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Wed, 4 Mar 2020 21:05:49 -0500 Subject: [PATCH 28/29] Changes to how the io works for writing restart and merging --- src/io.f90 | 53 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 20 deletions(-) diff --git a/src/io.f90 b/src/io.f90 index f4928e4..4aab723 100644 --- a/src/io.f90 +++ b/src/io.f90 @@ -373,7 +373,8 @@ module io !NOTE: This code doesn't work for arbitrary number of basis atoms per node. It assumes that the !each element has only 1 atom type at the node. character(len=100), intent(in) :: file - integer :: interp_max, i, j, inod, ibasis, ip, unique_index(10), unique_num + integer :: interp_max, i, j, inod, ibasis, ip, unique_index(50), unique_size(50), unique_num, & + etype real(kind=dp) :: box_vec(3) 1 format('time' / i16, f23.15) @@ -405,6 +406,22 @@ module io !Below writes the header information for the restart file + + !First figure out all of the unique element types + unique_num = 0 + unique_index(:) = 0 + eleloop:do i = 1, ele_num + do j =1 , unique_num + if ( ( size_ele(i) == size_ele( unique_index(j) ) ).and. & + ( lat_ele(i) == lat_ele(unique_index(j)) ) ) then + cycle eleloop + end if + end do + unique_num = unique_num + 1 + unique_index(unique_num) = i + unique_size(unique_num) = size_ele(i) + end do eleloop + !Calculate the max number of atoms per element select case(max_ng_node) case(8) @@ -415,7 +432,7 @@ module io write(11,20) interp_max write(11,3) node_num write(11,19) max_ng_node - write(11,4) lattice_types + write(11,4) unique_num write(11,5) atom_num write(11,6) 1 !Grain_num is ignored write(11,16) lattice_types, atom_types @@ -454,26 +471,21 @@ module io !write the element information if(ele_num > 0) then write(11,12) - !First figure out all of the unique element types - unique_num = 0 - unique_index(:) = 0 - eleloop:do i = 1, ele_num - do j =1 , unique_num - if ( ( size_ele(i) == size_ele( unique_index(j) ) ).and. & - ( lat_ele(i) == lat_ele(unique_index(j)) ) ) then - cycle eleloop - end if - end do - unique_num = unique_num + 1 - unique_index(unique_num) = i - end do eleloop + do i = 1, unique_num - write(11,'(3i16)') i, size_ele(i)-1, basis_type(1,i) + write(11,'(3i16)') i, size_ele(unique_index(i))-1, basis_type(1,lat_ele(unique_index(i))) end do ip = 0 write(11,13) do i = 1, ele_num - write(11, '(4i16)') i, lat_ele(i), 1, basis_type(1,lat_ele(i)) + !Figure out the ele type + do j = 1, unique_num + if ( unique_size(j) == size_ele(i)) then + etype = j + exit + endif + end do + write(11, '(4i16)') i, etype, 1, basis_type(1,lat_ele(i)) do inod = 1, ng_node(lat_ele(i)) do ibasis = 1, basisnum(lat_ele(i)) ip = ip + 1 @@ -633,15 +645,16 @@ module io print *, "displace", displace do i = 1, 3 - if (displace(i) > lim_zero) then + if (abs(displace(i)) > lim_zero) then newdisplace(i) = displace(i) - temp_box_bd(2*i-1) else - newdisplace=displace(i) + 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 - + + print *, "newdisplace", newdisplace call grow_box(temp_box_bd) !Read in the number of sub_boxes and allocate the variables read(11, *) n From d2f3c9e3ecdca19a6999fd1fb1291d4bcf8a2198 Mon Sep 17 00:00:00 2001 From: Alex Selimov Date: Wed, 4 Mar 2020 21:06:12 -0500 Subject: [PATCH 29/29] Add check for orientation to make sure it's right handed and orthogonal --- src/opt_orient.f90 | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/opt_orient.f90 b/src/opt_orient.f90 index 21d9d3f..c1bef1e 100644 --- a/src/opt_orient.f90 +++ b/src/opt_orient.f90 @@ -20,6 +20,7 @@ module opt_orient integer, intent(inout) :: arg_pos integer :: i, ibasis, inod + logical :: isortho, isrighthanded real(kind=dp) :: inv_sub_box_ori(3,3,sub_box_num) !First parse the orient command @@ -70,6 +71,7 @@ module opt_orient integer, intent(inout) :: arg_pos integer :: i, arg_len + logical :: isortho, isrighthanded character(len=8) :: ori_string !Pull out the new user orientation @@ -82,6 +84,15 @@ module opt_orient !Normalize the orientation matrix new_orient = matrix_normal(new_orient,3) + + !Check right hand rule and orthogonality + call check_right_ortho(new_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 + arg_pos = arg_pos + 1 end subroutine parse_orient