Monomer-wise lookup tables of partial charges by atom (referred to as "library charges", akin to AmberTools protein residue charges ) are determined from the reduced polymer. First, the reduced polymer is assigned partial charges via an explicit AM1-BCC-ELF10 calculation as implemented in OpenEye; this is tractible explicitly because of the prior reduction step. Monomer residue subgraphs, defined by SMIRKS strings, are then used to generate a cover of the molecular graph via substructure matching, which is further refined to a graph partition to ensure each atom belongs to exactly one monomer. For any given monomer type, the charges for equivalent atoms (up to symmetry considerations) in all occurrences of that monomer are averaged to produce a mean partial charge for a given atomic position. These charges are then mapped to their atomic position in the defining monomer SMIRKS until all positions have been assigned a mean charge. The process is repeated for all distinct monomer types until each monomer has had library charges generated.