Read full geometry and monomer template, initialize system_geometry_t
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| character(len=*), | intent(in) | :: | full_geom_file | |||
| character(len=*), | intent(in) | :: | monomer_file | |||
| type(system_geometry_t), | intent(out) | :: | sys_geom | |||
| type(error_t), | intent(out) | :: | error |
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| type(geometry_type), | private | :: | full_geom | ||||
| integer, | private | :: | i | ||||
| type(geometry_type), | private | :: | monomer_geom |
subroutine initialize_system_geometry(full_geom_file, monomer_file, sys_geom, error) !! Read full geometry and monomer template, initialize system_geometry_t character(len=*), intent(in) :: full_geom_file, monomer_file type(system_geometry_t), intent(out) :: sys_geom type(error_t), intent(out) :: error type(geometry_type) :: full_geom, monomer_geom integer :: i call read_xyz_file(full_geom_file, full_geom, error) if (error%has_error()) then call error%add_context("mqc_physical_fragment:initialize_system_geometry") return end if ! Read monomer template ! this will be changed once we have a proper input file parsing call read_xyz_file(monomer_file, monomer_geom, error) if (error%has_error()) then call error%add_context("mqc_physical_fragment:initialize_system_geometry") call full_geom%destroy() return end if ! Validate that full geometry is a multiple of monomer size sys_geom%atoms_per_monomer = monomer_geom%natoms sys_geom%total_atoms = full_geom%natoms if (mod(sys_geom%total_atoms, sys_geom%atoms_per_monomer) /= 0) then call error%set(ERROR_VALIDATION, "Full geometry atoms not a multiple of monomer atoms") call full_geom%destroy() call monomer_geom%destroy() return end if sys_geom%n_monomers = sys_geom%total_atoms/sys_geom%atoms_per_monomer ! TODO JORGE: this can be a sys_geom%allocate() allocate (sys_geom%element_numbers(sys_geom%total_atoms)) allocate (sys_geom%coordinates(3, sys_geom%total_atoms)) do i = 1, sys_geom%total_atoms sys_geom%element_numbers(i) = element_symbol_to_number(full_geom%elements(i)) end do ! Store coordinates in Bohr (convert from Angstroms) ! TODO JORGE: need a way to handle units sys_geom%coordinates = to_bohr(full_geom%coords) call full_geom%destroy() call monomer_geom%destroy() end subroutine initialize_system_geometry