Пример #1
0
    def read_3_markers(self, markers, macro_rewind=True):
        """
        Micro-optimizes ``read_markers`` for 3 markers.

        Parameters
        ----------
        markers : List[int, int, int]
            markers to get; markers = [-10, 1, 0]

        Raises
        ------
        FortranMarkerError
            if the expected table number is not found

        """
        data = self.read_3_blocks()
        imarkers = self.struct_3i.unpack(data)
        for i, marker in enumerate(markers):
            if marker != imarker:
                msg = 'marker=%r imarker=%r; markers=%s; i=%s; table_name=%r' % (
                    marker, imarker, markers, i, self.table_name)
                raise FortranMarkerError(msg)
            if self.is_debug_file:
                self.binary_debug.write('  read_markers -> [4, %i, 4]\n' %
                                        marker)
Пример #2
0
    def read_markers(self, markers, macro_rewind=True):
        """
        Gets specified markers, where a marker has the form of [4, value, 4].
        The "marker" corresponds to the value, so 3 markers takes up 9 integers.
        These are used to indicate position in the file as well as the number
        of bytes to read.

        Because we're checking the markers vs. what we expect, we just throw
        the data away.

        Parameters
        ----------
        markers : List[int]
            markers to get; markers = [-10, 1]

        Raises
        ------
        FortranMarkerError
            if the expected table number is not found

        """
        for i, marker in enumerate(markers):
            data = self.read_block()
            imarker, = self.struct_i.unpack(data)
            if marker != imarker:
                import os
                msg = 'marker=%r imarker=%r; markers=%s; i=%s; table_name=%r; iloc=%s/%s' % (
                    marker, imarker, markers, i, self.table_name,
                    self.f.tell(), os.path.getsize(self.op2_filename))
                raise FortranMarkerError(msg)
            if self.is_debug_file:
                self.binary_debug.write('  read_markers -> [4, %i, 4]\n' %
                                        marker)
Пример #3
0
    def _skip_record_ndata(self, stream=False, debug=True, macro_rewind=False):
        """the skip version of ``_read_record_ndata``"""
        markers0 = self.get_nmarkers(1, rewind=False, macro_rewind=macro_rewind)
        if self.is_debug_file and debug:
            self.binary_debug.write('read_record - marker = [4, %i, 4]; macro_rewind=%s\n' % (
                markers0[0], macro_rewind))
        record, nrecord = self._skip_block_ndata()

        if self.is_debug_file and debug:
            self.binary_debug.write('read_record - record = [%i, recordi, %i]; '
                                    'macro_rewind=%s\n' % (nrecord, nrecord, macro_rewind))
        if markers0[0]*4 != nrecord:
            msg = 'markers0=%s*4 len(record)=%s; table_name=%r' % (
                markers0[0]*4, nrecord, self.table_name)
            raise FortranMarkerError(msg)

        markers1 = self.get_nmarkers(1, rewind=True)

        if markers1[0] > 0:
            while markers1[0] > 0:
                markers1 = self.get_nmarkers(1, rewind=False)
                if self.is_debug_file and debug:
                    self.binary_debug.write('read_record - markers1 = [4, %i, 4]\n' % markers1[0])
                recordi, nrecordi = self._skip_block_ndata()
                nrecord += nrecordi

                markers1 = self.get_nmarkers(1, rewind=True)
                if self.is_debug_file and debug:
                    self.binary_debug.write('read_record - markers1 = [4, %i, 4]\n' % markers1[0])
        return record, nrecord
Пример #4
0
    def _stream_record(self, debug=True):
        """
        Creates a "for" loop that keeps giving us records until we're done.
        """
        self.istream = 0
        markers0 = self.get_nmarkers(1, rewind=False)
        if self.is_debug_file and debug:
            self.binary_debug.write('_stream_record - marker = [4, %i, 4]\n' % markers0[0])
        record, nrecord = self._read_block_ndata()
        if self.is_debug_file and debug:
            self.binary_debug.write('_stream_record - record = [%i, recordi, %i]\n' % (
                nrecord, nrecord))
        if(markers0[0]*4) != len(record):
            raise FortranMarkerError('markers0=%s*4 len(record)=%s; table_name=%r' % (
                markers0[0]*4, len(record), self.table_name))
        yield record
        self.istream += 1

        markers1 = self.get_nmarkers(1, rewind=True)
        if self.is_debug_file and debug:
            self.binary_debug.write('_stream_record - markers1 = [4, %s, 4]\n' % str(markers1))

        # handling continuation blocks
        #nloop = 0
        while markers1[0] > 0:
            markers1 = self.get_nmarkers(1, rewind=False)
            if self.is_debug_file and debug:
                self.binary_debug.write('_stream_record - markers1 = [4, %s, 4]\n' % str(markers1))
            record, nrecordi = self._read_block_ndata()
            yield record
            self.istream += 1
            markers1 = self.get_nmarkers(1, rewind=True)
Пример #5
0
    def _read_record_ndata(self, stream=False, debug=True, macro_rewind=False):
        """reads a record and the length of the record"""
        markers0 = self.get_nmarkers(1,
                                     rewind=False,
                                     macro_rewind=macro_rewind)
        if self.is_debug_file and debug:
            self.binary_debug.write(
                'read_record - marker = [4, %i, 4]; macro_rewind=%s\n' %
                (markers0[0], macro_rewind))
        record, nrecord = self._read_block_ndata()

        if self.is_debug_file and debug:
            msg = 'read_record - record = [%i, recordi, %i]; macro_rewind=%s\n' % (
                nrecord, nrecord, macro_rewind)
            self.binary_debug.write(msg)
        if markers0[0] * 4 != len(record):
            raise FortranMarkerError(
                'markers0=%s*4 len(record)=%s; table_name=%r' %
                (markers0[0] * 4, len(record), self.table_name))

        markers1 = self.get_nmarkers(1, rewind=True)
        if markers1[0] > 0:
            nloop = 0
            records = [record]
            while markers1[0] > 0:
                markers1 = self.get_nmarkers(1, rewind=False)
                if self.is_debug_file and debug:
                    self.binary_debug.write(
                        'read_record - markers1 = [4, %i, 4]\n' % markers1[0])
                recordi, nrecordi = self._read_block_ndata()
                nrecord += nrecordi
                records.append(recordi)
                #record += recordi
                markers1 = self.get_nmarkers(1, rewind=True)
                if self.is_debug_file and debug:
                    self.binary_debug.write(
                        'read_record - markers1 = [4, %i, 4]\n' % markers1[0])
                nloop += 1

            # if nloop == 0:
            # record = records[0]
            # elif nloop == 1:
            # record = records[0] + records[1]
            # else:
            record = b''.join(records)
        return record, nrecord
Пример #6
0
    def read_markers(self, markers, macro_rewind=True):
        """
        Gets specified markers, where a marker has the form of [4, value, 4].
        The "marker" corresponds to the value, so 3 markers takes up 9 integers.
        These are used to indicate position in the file as well as
        the number of bytes to read.

        Parameters
        ----------
        markers : List[int]
            markers to get; markers = [-10, 1]
        """
        for i, marker in enumerate(markers):
            data = self.read_block()
            imarker, = self.struct_i.unpack(data)
            if marker != imarker:
                msg = 'marker=%r imarker=%r; markers=%s; i=%s; table_name=%r' % (
                    marker, imarker, markers, i, self.table_name)
                raise FortranMarkerError(msg)
            if self.is_debug_file:
                self.binary_debug.write('  read_markers -> [4, %i, 4]\n' % marker)