code: def launch(self, task, **kwargs):
          
          if task.status == task.S_LOCKED:
              raise ValueError("You shall not submit a locked task!")
  
          # Build the task
          task.build()
  
          # Pass information on the time limit to Abinit (we always assume ndtset == 1)
          if isinstance(task, AbinitTask):
              args = kwargs.get("exec_args", [])
              if args is None: args = []
              args = args[:]
              args.append("--timelimit %s" % qu.time2slurm(self.qadapter.timelimit))
              kwargs["exec_args"] = args
  
          # Write the submission script
          script_file = self.write_jobfile(task, **kwargs)
  
          # Submit the task and save the queue id.
          try:
              qjob, process = self.qadapter.submit_to_queue(script_file)
              task.set_status(task.S_SUB, msg='Submitted to queue')
              task.set_qjob(qjob)
              return process
  
          except self.qadapter.MaxNumLaunchesError as exc:
              # TODO: Here we should try to switch to another qadapter
              # 1) Find a new parallel configuration in those stored in task.pconfs
              # 2) Change the input file.
              # 3) Regenerate the submission script
              # 4) Relaunch
              task.set_status(task.S_ERROR, msg="max_num_launches reached: %s" % str(exc))
              raise
docs: Build the input files and submit the task via the :class:`Qadapter`
  
          Args:
              task: :class:`TaskObject`
  
          Returns:
              Process object.