Execute the BMDS model and parse outputs if successful.

async def execute_job(self):
        """
        Execute the BMDS model and parse outputs if successful.
        """
        self.execution_start = datetime.now()

        # exit early if execution is not possible
        if not self.can_be_executed:
            return self._set_job_outputs(RunStatus.DID_NOT_RUN)

        exe = self.get_exe_path()
        dfile = self.write_dfile()
        outfile = self.get_outfile(dfile)
        o2 = outfile.replace(".out", ".002")

        proc = await asyncio.create_subprocess_exec(
            exe, dfile, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE
        )

        try:
            stdout, stderr = await asyncio.wait_for(
                proc.communicate(), timeout=settings.BMDS_MODEL_TIMEOUT_SECONDS
            )

            output = None
            if os.path.exists(outfile):
                with open(outfile, "r") as f:
                    output = f.read()

            self._set_job_outputs(
                RunStatus.SUCCESS,
                stdout=stdout.decode().strip(),
                stderr=stderr.decode().strip(),
                output=output,
            )

        except asyncio.TimeoutError:
            proc.kill()
            stdout, stderr = await proc.communicate()
            self._set_job_outputs(RunStatus.FAILURE)

        finally:
            if os.path.exists(outfile):
                self.tempfiles.append(outfile)
            else:
                with open(dfile, "r") as f:
                    txt = f.read()
                logger.info("Output file not created: \n{}\n\n".format(txt))

            if os.path.exists(o2):
                self.tempfiles.append(o2)

            self.tempfiles.cleanup()