def calculate(self, atoms):
        '''
        Blocking/Non-blocking calculate method

        If we are in blocking mode we just run, wait for
        the job to end and read in the results. Easy ...

        The non-blocking mode is a little tricky.
        We need to start the job and guard against it reading
        back possible old data from the directory - the queuing
        system may not even started the job when we get control
        back from the starting script. Thus anything we read
        after invocation is potentially garbage - even if it
        is a converged calculation data.

        We handle it by custom run function above which
        raises an exception after submitting the job.
        This skips post-run processing in the calculator, preserves
        the state of the data and signals here that we need to wait
        for results.
        '''

        with work_dir(self.working_dir) :
            self.prepare_calc_dir()
            self.calc_running=True
            #print('Run VASP.calculate')
            try :
                Vasp.calculate(self, atoms)
                self.calc_running=False
                #print('VASP.calculate returned')
            except _NonBlockingRunException as e:
                # We have nothing else to docs
                # until the job finishes
                #print('Interrupted ', self.working_dir, os.getcwd())
                pass