void FeatureVolumeFraction::finalize() { FeatureFloodCount::finalize(); mooseAssert(!_all_feature_volumes.empty(), "All feature volumes should not be empty()"); calculateBubbleFraction(); // Now calculate the Avrami data if requested if (_pars.isParamValid("Avrami_file")) { // Output the headers during the first timestep if (_fe_problem.timeStep() == 0) { std::vector<std::string> data = {"timestep", "time", "log_time", "Avrami"}; writeCSVFile(getParam<FileName>("Avrami_file"), data); } else { std::vector<Real> data = {Real(_fe_problem.timeStep()), _fe_problem.time(), std::log(_fe_problem.time()), calculateAvramiValue()}; writeCSVFile(getParam<FileName>("Avrami_file"), data); } } }
void FeatureFloodCount::finalize() { communicateAndMerge(); // Populate _feature_maps and _var_index_maps updateFieldInfo(); // Calculate and out output bubble volume data if (_pars.isParamValid("bubble_volume_file")) { calculateBubbleVolumes(); std::vector<Real> data; data.reserve(_all_feature_volumes.size() + _total_volume_intersecting_boundary.size() + 2); // Insert the current timestep and the simulation time into the data vector data.push_back(_fe_problem.timeStep()); data.push_back(_fe_problem.time()); // Insert the (sorted) bubble volumes into the data vector data.insert(data.end(), _all_feature_volumes.begin(), _all_feature_volumes.end()); // If we are computing the boundary-intersecting volumes, insert // those numbers into the normalized boundary-intersecting bubble // volumes into the data vector. if (_compute_boundary_intersecting_volume) data.insert(data.end(), _total_volume_intersecting_boundary.begin(), _total_volume_intersecting_boundary.end()); // Finally, write the file writeCSVFile(getParam<FileName>("bubble_volume_file"), data); } }
void GrainTracker::finalize() { Moose::perf_log.push("finalize()", "GrainTracker"); // Don't track grains if the current simulation step is before the specified tracking step if (_t_step < _tracking_step) return; expandHalos(); FeatureFloodCount::communicateAndMerge(); _console << "Finished inside of FeatureFloodCount" << std::endl; Moose::perf_log.push("trackGrains()","GrainTracker"); trackGrains(); Moose::perf_log.pop("trackGrains()","GrainTracker"); _console << "Finished inside of trackGrains" << std::endl; Moose::perf_log.push("remapGrains()","GrainTracker"); if (_remap) remapGrains(); Moose::perf_log.pop("remapGrains()","GrainTracker"); updateFieldInfo(); _console << "Finished inside of updateFieldInfo" << std::endl; // Calculate and out output bubble volume data if (_pars.isParamValid("bubble_volume_file")) { calculateBubbleVolumes(); std::vector<Real> data; data.reserve(_all_feature_volumes.size() + 2); data.push_back(_fe_problem.timeStep()); data.push_back(_fe_problem.time()); data.insert(data.end(), _all_feature_volumes.begin(), _all_feature_volumes.end()); writeCSVFile(getParam<FileName>("bubble_volume_file"), data); } if (_compute_op_maps) { for (std::map<unsigned int, MooseSharedPointer<FeatureData> >::const_iterator grain_it = _unique_grains.begin(); grain_it != _unique_grains.end(); ++grain_it) { if (grain_it->second->_status != INACTIVE) { std::set<dof_id_type>::const_iterator elem_it_end = grain_it->second->_local_ids.end(); for (std::set<dof_id_type>::const_iterator elem_it = grain_it->second->_local_ids.begin(); elem_it != elem_it_end; ++elem_it) { mooseAssert(!_ebsd_reader || _unique_grain_to_ebsd_num.find(grain_it->first) != _unique_grain_to_ebsd_num.end(), "Bad mapping in unique_grain_to_ebsd_num"); _elemental_data[*elem_it].push_back(std::make_pair(_ebsd_reader ? _unique_grain_to_ebsd_num[grain_it->first] : grain_it->first, grain_it->second->_var_idx)); } } } } Moose::perf_log.pop("finalize()", "GrainTracker"); }
void NodalFloodCount::finalize() { // Exchange data in parallel pack(_packed_data); _communicator.allgather(_packed_data, false); unpack(_packed_data); mergeSets(); // Populate _bubble_maps and _var_index_maps updateFieldInfo(); // Update the region offsets so we can get unique bubble numbers in multimap mode updateRegionOffsets(); // Calculate and out output bubble volume data if (_pars.isParamValid("bubble_volume_file")) { calculateBubbleVolumes(); std::vector<Real> data; data.reserve(_all_bubble_volumes.size() + 2); data.push_back(_fe_problem.timeStep()); data.push_back(_fe_problem.time()); data.insert(data.end(), _all_bubble_volumes.begin(), _all_bubble_volumes.end()); writeCSVFile(getParam<FileName>("bubble_volume_file"), data); } // Calculate memory usage if (_track_memory) { _bytes_used += calculateUsage(); _communicator.sum(_bytes_used); formatBytesUsed(); } }
void FeatureFloodCount::finalize() { // Exchange data in parallel pack(_packed_data); _communicator.allgather(_packed_data, false); unpack(_packed_data); mergeSets(true); // Populate _bubble_maps and _var_index_maps updateFieldInfo(); // Update the region offsets so we can get unique bubble numbers in multimap mode updateRegionOffsets(); // Calculate and out output bubble volume data if (_pars.isParamValid("bubble_volume_file")) { calculateBubbleVolumes(); std::vector<Real> data; data.reserve(_all_bubble_volumes.size() + _total_volume_intersecting_boundary.size() + 2); // Insert the current timestep and the simulation time into the data vector data.push_back(_fe_problem.timeStep()); data.push_back(_fe_problem.time()); // Insert the (sorted) bubble volumes into the data vector data.insert(data.end(), _all_bubble_volumes.begin(), _all_bubble_volumes.end()); // If we are computing the boundary-intersecting volumes, insert // those numbers into the normalized boundary-intersecting bubble // volumes into the data vector. if (_compute_boundary_intersecting_volume) data.insert(data.end(), _total_volume_intersecting_boundary.begin(), _total_volume_intersecting_boundary.end()); // Finally, write the file writeCSVFile(getParam<FileName>("bubble_volume_file"), data); } // Calculate memory usage if (_track_memory) { _bytes_used += calculateUsage(); _communicator.sum(_bytes_used); formatBytesUsed(); } }
void GrainTracker::finalize() { // Don't track grains if the current simulation step is before the specified tracking step if (_t_step < _tracking_step) return; Moose::perf_log.push("finalize()","GrainTracker"); // Exchange data in parallel pack(_packed_data); _communicator.allgather(_packed_data, false); unpack(_packed_data); mergeSets(false); Moose::perf_log.push("buildspheres()","GrainTracker"); buildBoundingSpheres(); // Build bounding sphere information Moose::perf_log.pop("buildspheres()","GrainTracker"); // Now merge sets again but this time we'll add periodic neighbor information mergeSets(true); Moose::perf_log.push("trackGrains()","GrainTracker"); trackGrains(); Moose::perf_log.pop("trackGrains()","GrainTracker"); Moose::perf_log.push("remapGrains()","GrainTracker"); if (_remap) remapGrains(); Moose::perf_log.pop("remapGrains()","GrainTracker"); updateFieldInfo(); Moose::perf_log.pop("finalize()","GrainTracker"); // Calculate and out output bubble volume data if (_pars.isParamValid("bubble_volume_file")) { calculateBubbleVolumes(); std::vector<Real> data; data.reserve(_all_bubble_volumes.size() + 2); data.push_back(_fe_problem.timeStep()); data.push_back(_fe_problem.time()); data.insert(data.end(), _all_bubble_volumes.begin(), _all_bubble_volumes.end()); writeCSVFile(getParam<FileName>("bubble_volume_file"), data); } if (_compute_op_maps) { for (std::map<unsigned int, UniqueGrain *>::const_iterator grain_it = _unique_grains.begin(); grain_it != _unique_grains.end(); ++grain_it) { if (grain_it->second->status != INACTIVE) { std::set<dof_id_type>::const_iterator elem_it_end = grain_it->second->entities_ptr->end(); for (std::set<dof_id_type>::const_iterator elem_it = grain_it->second->entities_ptr->begin(); elem_it != elem_it_end; ++elem_it) _elemental_data[*elem_it].push_back(std::make_pair(grain_it->first, grain_it->second->variable_idx)); } } } // Calculate memory usage if (_track_memory) { _bytes_used += calculateUsage(); _communicator.sum(_bytes_used); formatBytesUsed(); } }