Пример #1
0
        public override ScalarField LoadFieldSlice(SliceRange slice)
        {
            Index offsets   = new Index(slice.GetOffsets());
            int   spaceDims = 4;

            int[] sizeInFile = slice.GetLengths();
            // Probably has less dimensions.
            int[] sizeField    = new int[spaceDims];
            int   numDimsField = 0;

            // Exclude time dimension. It will be treated differently.
            for (int dim = 0; dim < spaceDims; ++dim)
            {
                if (offsets[dim] != -1 && sizeInFile[dim] > 1)
                {
                    sizeField[numDimsField++] = sizeInFile[dim];
                }
                // Include whole dimension.
                else if (offsets[dim] == -1)
                {
                    // Fill size.
                    sizeInFile[dim] = _dimLengths[dim];

                    // Set offset to one. offset = 0, size = size of dimension.
                    offsets[dim] = 0;

                    // Save size in size-vector for the scalar field.
                    sizeField[numDimsField++] = sizeInFile[dim];
                }
            }
            Index fieldSize = new Index(numDimsField);

            Array.Copy(sizeField, fieldSize.Data, numDimsField);

            Debug.Assert(sizeInFile[3] == 1, "How should I load several members into one data block???");

            // Create a grid descriptor for the field.
            // TODO: Actually load this data.
            RectlinearGrid grid = new RectlinearGrid(fieldSize);

            // Create scalar field instance and fill it with data.
            int sliceSize = grid.Size.Product();

            // For each time and subtime step, run through them.
            ScalarField field = new ScalarField(grid);

            int indexTime = 0;

            Debug.Assert(sizeInFile[spaceDims] == 1 && sizeInFile[spaceDims + 1] == 1, "Define a single timestep, else use the method for ScalarFieldUnsteady.");
            // Now, load one single file.
            string filename = RedSea.Singleton.GetFilename(offsets[spaceDims], offsets[spaceDims + 1], offsets[3], slice.GetVariable());

            using (FileStream fs = File.Open(@filename, FileMode.Open))
            {
                // Read in the data you need.
                using (BinaryReader reader = new BinaryReader(fs))
                {
                    // Read in all floats.
                    Debug.Assert(reader.BaseStream.Length >= sliceSize * sizeof(float));

                    int indexSpace = 0;
                    for (int z = offsets[2]; z < offsets[2] + sizeInFile[2]; ++z)
                    {
                        // Set file reader position to right start point.
                        reader.BaseStream.Seek(z * _dimLengths[0] * _dimLengths[1] + offsets[1] * _dimLengths[0] + offsets[0], SeekOrigin.Begin);
                        for (int y = offsets[1]; y < offsets[1] + sizeInFile[1]; ++y)
                        {
                            for (int x = offsets[0]; x < offsets[0] + sizeInFile[0]; ++x)
                            {
                                field[indexSpace++] = reader.ReadSingle();
                            }
                            // Advance one line.
                            reader.BaseStream.Seek((_dimLengths[0] - sizeInFile[0]) * sizeof(float), SeekOrigin.Current);
                        }
                    }
                    // Change Endian of data.
                    if (!Range.CorrectEndian)
                    {
                        field.ChangeEndian();

                        for (int i = 0; i < field.Data.Length; ++i)
                        {
                            if (field.Data[i] == 0)
                            {
                                field.Data[i] = float.MaxValue;
                            }
                        }
                        field.InvalidValue = float.MaxValue;
                    }
                }
            }

            return(field);
        }
Пример #2
0
        public override ScalarField LoadFieldSlice(SliceRange slice)
        {
            Index offsets = new Index(slice.GetOffsets());
            int spaceDims = 4;

            int[] sizeInFile = slice.GetLengths();
            // Probably has less dimensions.
            int[] sizeField = new int[spaceDims];
            int numDimsField = 0;

            // Exclude time dimension. It will be treated differently.
            for (int dim = 0; dim < spaceDims; ++dim)
            {

                if (offsets[dim] != -1 && sizeInFile[dim] > 1)
                {
                    sizeField[numDimsField++] = sizeInFile[dim];
                }
                // Include whole dimension.
                else if (offsets[dim] == -1)
                {
                    // Fill size.
                    sizeInFile[dim] = _dimLengths[dim];

                    // Set offset to one. offset = 0, size = size of dimension.
                    offsets[dim] = 0;

                    // Save size in size-vector for the scalar field.
                    sizeField[numDimsField++] = sizeInFile[dim];
                }
            }
            Index fieldSize = new Index(numDimsField);
            Array.Copy(sizeField, fieldSize.Data, numDimsField);

            Debug.Assert(sizeInFile[3] == 1, "How should I load several members into one data block???");

            // Create a grid descriptor for the field.
            // TODO: Actually load this data.
            RectlinearGrid grid = new RectlinearGrid(fieldSize);

            // Create scalar field instance and fill it with data.
            int sliceSize = grid.Size.Product();

            // For each time and subtime step, run through them.
            ScalarField field = new ScalarField(grid);

            int indexTime = 0;

            Debug.Assert(sizeInFile[spaceDims] == 1 && sizeInFile[spaceDims + 1] == 1, "Define a single timestep, else use the method for ScalarFieldUnsteady.");
            // Now, load one single file.
            string filename = RedSea.Singleton.GetFilename(offsets[spaceDims], offsets[spaceDims + 1], offsets[3], slice.GetVariable());

            using (FileStream fs = File.Open(@filename, FileMode.Open))
            {
                // Read in the data you need.
                using (BinaryReader reader = new BinaryReader(fs))
                {
                    // Read in all floats.
                    Debug.Assert(reader.BaseStream.Length >= sliceSize * sizeof(float));

                    int indexSpace = 0;
                    for (int z = offsets[2]; z < offsets[2] + sizeInFile[2]; ++z)
                    {
                        // Set file reader position to right start point.
                        reader.BaseStream.Seek(z * _dimLengths[0] * _dimLengths[1] + offsets[1] * _dimLengths[0] + offsets[0], SeekOrigin.Begin);
                        for (int y = offsets[1]; y < offsets[1] + sizeInFile[1]; ++y)
                        {
                            for (int x = offsets[0]; x < offsets[0] + sizeInFile[0]; ++x)
                            {
                                field[indexSpace++] = reader.ReadSingle();
                            }
                            // Advance one line.
                            reader.BaseStream.Seek((_dimLengths[0] - sizeInFile[0]) * sizeof(float), SeekOrigin.Current);
                        }
                    }
                    // Change Endian of data.
                    if (!Range.CorrectEndian)
                    {
                        field.ChangeEndian();

                        for (int i = 0; i < field.Data.Length; ++i)
                        {
                            if (field.Data[i] == 0)
                                field.Data[i] = float.MaxValue;
                        }
                        field.InvalidValue = float.MaxValue;
                    }
                }
            }

            return field;
        }