public static void ReadAnomalyDataFromPlainText(LinesReader lr, double[,,] sigma, int k) { int nx = sigma.GetLength(0); int ny = sigma.GetLength(1); var lines = lr.ReadNextLines(nx); // nx is from top to bottom // ny is from left to right if (lines.Length != nx) { throw new InvalidDataException($@"model with illegal Nx value"); } for (int i = 0; i < lines.Length; i++) { var lineValues = GetAllDouble(lines[i]); if (lineValues.Length != ny) { throw new InvalidDataException( string.Format($"model with illegal Ny value in line {i}")); } for (int j = 0; j < lineValues.Length; j++) { sigma[i, j, k] = lineValues[j]; } } }
private static unsafe void DistributedLoadModelMaster(Mpi mpi, string fullPath, CartesianModel model, int k) { using (var lr = new LinesReader(fullPath)) { for (int rank = 0; rank < mpi.Size; rank++) { var nxLength = mpi.CalcLocalHalfNxLength(rank, model.LateralDimensions.Nx); var sigma = new double[nxLength, model.Anomaly.LocalSize.Ny, 1]; var sendLength = nxLength * model.Anomaly.LocalSize.Ny; if (nxLength == 0) { continue; } AnomalyLoaderUtils.ReadAnomalyDataFromPlainText(lr, sigma, 0); if (rank == 0) { for (int i = 0; i < nxLength; i++) { for (int j = 0; j < model.Anomaly.LocalSize.Ny; j++) { model.Anomaly.Sigma[i, j, k] = sigma[i, j, 0]; } } } else if (nxLength != 0) { fixed(double *data = &sigma[0, 0, 0]) mpi.Send(data, sendLength, Mpi.Double, rank, 0); } } } }
private static void LoadAnomalyValuesFromFile(XElement xFromFile, double[,,] sigma, int k, string path) { var fileType = xFromFile.Attribute(AnomalyFileType).Value; var fileName = xFromFile.Attribute(AnomalyFileName); if (fileType == "plain-text" && fileName != null) { var fullPath = Path.Combine(Path.GetDirectoryName(path), fileName.Value); using (var lr = new LinesReader(fullPath)) { AnomalyLoaderUtils.ReadAnomalyDataFromPlainText(lr, sigma, k); } } }