def METHOD_NAME(filename, ImpliedElems=None):
    Pts = []
    Atoms = []
    BBox = Parallelepiped.fromPOSCAR(filename)
    blnAtomToAdd = False  # Used to track
    Elem = None  # Used to store most recent element in the new format
    with open(filename, "r") as infile:
        CommentLine = infile.readline()
        GSLine = infile.readline().split()
        GS = float(GSLine[0])
        VxLine = infile.readline()
        VyLine = infile.readline()
        VzLine = infile.readline()
        ElementNamesOrCountsLine = infile.readline().split()
        if ElementNamesOrCountsLine[0].isdigit():
            if ImpliedElems is not None:
                Elems = ImpliedElems
                ElemCountsLine = ElementNamesOrCountsLine
            else:
                raise ValueError(
                    "Tried to read a POSCAR without explicit elements provided"
                )
        else:
            assert ElementNamesOrCountsLine[0].isalpha()
            ElemsLine = ElementNamesOrCountsLine
            Elems = [Atom(Elem) for Elem in ElemsLine]
            ElemCountsLine = infile.readline().split()
        ElemCounts = [int(ElemCount) for ElemCount in ElemCountsLine]
        CartesianOrDirectLine = infile.readline().split()
        CorDFlag = CartesianOrDirectLine[0][0].lower()
        blnIsCartesian = CorDFlag == "c" or CorDFlag == "k"
        for t, Elem in enumerate(Elems):
            for i in range(ElemCounts[t]):
                XYZLine = infile.readline().split()
                if blnIsCartesian:
                    P = GS * np.array(
                        [float(XYZLine[0]), float(XYZLine[1]), float(XYZLine[2])],
                        dtype=float,
                    )
                else:
                    # NOTE: The global scaling GS has already been taken in the BBox
                    #       so no need to multiply it here
                    Pfrac = np.array(
                        [float(XYZLine[0]), float(XYZLine[1]), float(XYZLine[2])],
                        dtype=float,
                    )
                    P = np.inner(np.array([BBox.Vx, BBox.Vy, BBox.Vz]).T, Pfrac)
                Pts.append(P)
                Atoms.append(Elem)
    return Pts, Atoms