Similar to `from_scf_task`, the difference is that this method requires
        an input for SCF calculation. A new ScfTask is created and added to the Work.
        This API should be used if the DDB of the GS task should be merged.

def from_scf_input(cls, scf_input, qpoints, is_ngqpt=False, tolerance=None,
                       with_becs=False, ddk_tolerance=None, manager=None):
        """
        Similar to `from_scf_task`, the difference is that this method requires
        an input for SCF calculation. A new ScfTask is created and added to the Work.
        This API should be used if the DDB of the GS task should be merged.
        """
        if is_ngqpt:
            qpoints = scf_input.abiget_ibz(ngkpt=qpoints, shiftk=[0, 0, 0], kptopt=1).points

        qpoints = np.reshape(qpoints, (-1, 3))

        new = cls(manager=manager)
        # Create ScfTask
        scf_task = new.register_scf_task(scf_input)

        if with_becs:
            new.add_becs_from_scf_task(scf_task, ddk_tolerance, ph_tolerance=tolerance)

        for qpt in qpoints:
            if with_becs and np.sum(qpt ** 2) < 1e-12: continue
            multi = scf_task.input.make_ph_inputs_qpoint(qpt, tolerance=tolerance)
            for ph_inp in multi:
                new.register_phonon_task(ph_inp, deps={scf_task: "WFK"})

        return new