get_monomer_atom_list Subroutine

private subroutine get_monomer_atom_list(sys_geom, monomer_idx, atom_list, n_atoms)

Build 0-indexed atom list for a monomer, handling fixed or variable-sized fragments.

Arguments

Type IntentOptional Attributes Name
type(system_geometry_t), intent(in) :: sys_geom
integer, intent(in) :: monomer_idx
integer, intent(out), allocatable :: atom_list(:)
integer, intent(out) :: n_atoms

Called by

proc~~get_monomer_atom_list~~CalledByGraph proc~get_monomer_atom_list get_monomer_atom_list proc~process_intersection_derivatives process_intersection_derivatives proc~process_intersection_derivatives->proc~get_monomer_atom_list proc~compute_gmbe compute_gmbe proc~compute_gmbe->proc~process_intersection_derivatives

Variables

Type Visibility Attributes Name Initial
integer, private :: base_idx
integer, private :: i

Source Code

   subroutine get_monomer_atom_list(sys_geom, monomer_idx, atom_list, n_atoms)
      !! Build 0-indexed atom list for a monomer, handling fixed or variable-sized fragments.
      type(system_geometry_t), intent(in) :: sys_geom
      integer, intent(in) :: monomer_idx
      integer, allocatable, intent(out) :: atom_list(:)
      integer, intent(out) :: n_atoms

      integer :: i, base_idx

      if (allocated(sys_geom%fragment_atoms)) then
         n_atoms = sys_geom%fragment_sizes(monomer_idx)
         if (n_atoms > 0) then
            allocate (atom_list(n_atoms))
            atom_list = sys_geom%fragment_atoms(1:n_atoms, monomer_idx)
         else
            allocate (atom_list(0))
         end if
      else
         n_atoms = sys_geom%atoms_per_monomer
         if (n_atoms > 0) then
            allocate (atom_list(n_atoms))
            base_idx = (monomer_idx - 1)*sys_geom%atoms_per_monomer
            do i = 1, n_atoms
               atom_list(i) = base_idx + (i - 1)
            end do
         else
            allocate (atom_list(0))
         end if
      end if
   end subroutine get_monomer_atom_list