def calc_lo(self, run_type, force=False, dry_run=False):
        if (self.is_finished_LO == True) and (force == False):
            logger.info("LO has done.")
            return

        if self.is_finished_scf != True:
            self.calc_sp(dry_run=dry_run)

        self.cd_work_dir("calc lo")

        # make atom groups for LO
        fragments_atom_ids_path = "fragments_atom_id.mpac"
        fragments_atom_ids = self.fragments_atom_ids
        logger.info("save fragment atom ids as {}".format(fragments_atom_ids_path))
        bridge.save_msgpack(fragments_atom_ids, fragments_atom_ids_path)

        logger.info("start lo calculation.")
        pdf.run_pdf(self._cmds["lo"])

        self.is_finished_LO = True
        self.save()
        self.restore_cwd()