/// <summary> /// Evolves the wavefunction and saves keyframes to disk. /// </summary> private void CreateAnimationFrames() { // Get a fresh output directory m_outputDir = CreateOutputDir(); // Write the run parameters to a file string paramsFile = Path.Combine(m_outputDir, "Params.txt"); File.WriteAllText(paramsFile, m_params.ToString().Replace("\n", "\r\n")); // Create the initial wavefunction WaveFunction wf = WaveFunctionUtils.CreateGaussianWavePacket( m_params.GridSizeX, m_params.GridSizeY, m_params.LatticeSpacing, m_params.ParticleMass, m_params.InitialWavePacketCenter, m_params.InitialWavePacketSize, m_params.InitialWavePacketMomentum, m_params.MultiThread ); // Save the initial wf as Frame 0 wf.SaveToVtkFile(Path.Combine(m_outputDir, "Frame_0000.vtk"), m_params.SaveFormat); m_lastSavedFrame = 0; // Create an Evolver and run it in the background Evolver.VDelegate V = (x, y, t, m, sx, sy) => { return(m_VBuilder.V(x, y, t, m, sx, sy)); }; m_evolver = new Evolver(wf, m_params.TotalTime, m_params.TimeStep, V, false, m_params.ParticleMass, 1, m_params.DampingBorderWidth, m_params.DampingFactor, m_params.MultiThread); m_evolver.ProgressEvent += Evolver_ProgressEvent; m_evolver.CompletionEvent += Evolver_CompletionEvent; m_evolver.RunInBackground(); }
/// <summary> /// Worker method. /// </summary> protected override void WorkerMethod() { string[] vtkFiles = Directory.GetFiles(m_inputDir, "*.vtk"); if ((vtkFiles == null) || (vtkFiles.Length == 0)) { return; } // Write the color parameters to a file string outputDir = CreateOutputDir(m_inputDir); string colorParamsFile = Path.Combine(outputDir, "ColorParams.txt"); File.WriteAllText(colorParamsFile, m_colorBuilder.GetLastSavedCode().Replace("\n", "\r\n")); string paramsFile = Path.Combine(m_inputDir, "Params.txt"); if (File.Exists(paramsFile)) { File.Copy(paramsFile, Path.Combine(outputDir, Path.GetFileName(paramsFile))); } WaveFunction.ColorDelegate colorFunc = (re, im, maxAmpl) => { return(m_colorBuilder.CalcColor(re, im, maxAmpl)); }; if (colorFunc(1, 1, 1) == Color.Empty) { colorFunc = null; } m_numFilesToProcess = vtkFiles.Length; int chunkSize = Environment.ProcessorCount; for (int iStart = 0; iStart < m_numFilesToProcess; iStart += chunkSize) { int iEnd = Math.Min(iStart + chunkSize, m_numFilesToProcess); Parallel.For(iStart, iEnd, i => { // Re-color one file string inputFile = vtkFiles[i]; WaveFunction wf = WaveFunction.ReadFromVtkFile(inputFile); string outFile = Path.Combine(outputDir, Path.GetFileName(inputFile)); wf.SaveToVtkFile(outFile, WaveFunction.WfSaveFormat.AMPLITUDE_AND_COLOR, colorFunc); }); // Report progress to the caller m_currentFileIndex = iEnd - 1; ReportProgress(); if (IsCancelled) { return; } } }
/// <summary> /// Worker method. /// </summary> protected override void WorkerMethod() { string[] vtkFiles = Directory.GetFiles(m_inputDir, "*.vtk"); if ((vtkFiles == null) || (vtkFiles.Length == 0)) { return; } m_outputDir = CreateOutputDir(m_inputDir); string paramsFile = Path.Combine(m_inputDir, "Params.txt"); if (File.Exists(paramsFile)) { File.Copy(paramsFile, Path.Combine(m_outputDir, Path.GetFileName(paramsFile))); } m_numFilesToProcess = vtkFiles.Length; int chunkSize = Environment.ProcessorCount; for (int iStart = 0; iStart < m_numFilesToProcess; iStart += chunkSize) { int iEnd = Math.Min(iStart + chunkSize, m_numFilesToProcess); Parallel.For(iStart, iEnd, i => { // Upsample one file, and save the result string inputFile = vtkFiles[i]; WaveFunction wf = WaveFunction.ReadFromVtkFile(inputFile); wf = Upsample(wf, m_upsampFactor); string outFile = Path.Combine(m_outputDir, Path.GetFileName(inputFile)); wf.SaveToVtkFile(outFile, WaveFunction.WfSaveFormat.REAL_AND_IMAG); }); // Report progress to the caller m_currentFileIndex = iEnd - 1; ReportProgress(); if (IsCancelled) { return; } } }